SystemVerilog m×n矩阵行列和约束修正求助:列约束失效问题
修正后的SystemVerilog矩阵约束解决方案
原代码问题分析
原代码的列约束失效主要有3个核心问题:
- 列索引遍历错误:
foreach (matrix[j])遍历的是矩阵的行索引(范围01),而非列索引(范围03),根本没覆盖所有列。 - sum函数用法错误:列求和时,
matrix.sum with (int'(matrix[item.index][j]))写法冗余且逻辑混乱——item本身就是矩阵的行数组,直接用item[j]就能获取该行第j列的元素。 - 约束值与需求不符:需求要求偶数列和为40,但代码里写的是200,和需求冲突。
修正后的代码
class c1; rand bit[7:0] matrix[2][4]; // 偶数行求和约束(索引从0开始,i%2==0对应第0行;若要自然语言的"第2行",改i%2==1即可) constraint row_constraint { foreach (matrix[i]) if (i % 2 == 0) matrix[i].sum with (int'(item)) == 60; } // 偶数列求和约束(索引从0开始,j%2==0对应第0、2列) constraint col_constraint { foreach (matrix[0][j]) // 遍历列索引,用matrix[0]的长度适配列数,保证通用性 if (j % 2 == 0) matrix.sum with (int'(item[j])) == 40; // item是每一行的数组,item[j]取该行第j列元素 } endclass module m1; c1 obj; initial begin obj = new(); if (!obj.randomize()) $error("Randomization failed!"); $display("matrix is %p", obj.matrix); end endmodule
通用化适配m×n矩阵
如果要适配任意m×n矩阵,只需遵循:
- 行约束:遍历
matrix[i],通过i%2==0判断偶数行(注意SystemVerilog数组索引从0开始,若需求是自然语言的“第2、4...行”,需改为i%2==1)。 - 列约束:遍历
matrix[0][j](需保证矩阵非空),通过j%2==0判断偶数列,求和时用matrix.sum with (int'(item[j]))即可实现列元素求和。
内容的提问来源于stack exchange,提问作者Grace90
相关产品推荐
相关产品推荐

