在系统verilog中的约束中求和2D数组

时间:2017-06-19 11:57:07

标签: multidimensional-array constraints system-verilog verification

我尝试使用填充了1&0和0的2d数组创建约束。 我希望每一行的总和为0,1,2,4,每列总和为1.此外,我希望矩阵的整数总和等于8(使用求和函数)。 我尝试使用.sum()函数将每行和每列的约束限制为我要求的值,但我不断收到语法错误。我做错了什么?

rand bit MAT[8][8];
constraint range { 
MAT.sum() with (32' (item)) == 8;
  foreach (MAT[j]){
      foreach(MAT[j][i]){
  MAT[j][].sum() with (32' (item)) == 1; 
  MAT[][i].sum() with (32' (item)) inside {0,1,2,4};
     }
 }

2 个答案:

答案 0 :(得分:2)

IEEE 1800-2012标准的 7.12.3数组简化方法部分指出

  

[array]简化方法可以应用于任何未压缩的整数值数组,以将数组减少为a   单一价值。

虽然允许MAT[0].sum()MAT[1].sum()(分别在MAT的第0行和第1行应用和),但MAT.sum()不是。 MAT中的一行是bit的数组,bit是一个整数类型,但MATbit的解包数组的数组,不是积分型。

此外,无法从阵列中选择单个列。你只能按行切片。这实现起来有点棘手,但可行。

让我们看看每个约束。首先,使用 sum()函数可以轻松地约束每行的总和:

  constraint sum_on_row {
    foreach (MAT[i])
      MAT[i].sum() with (32'(item)) inside { 0, 1, 2, 4 };
  }

要限制列上的总和,您需要转置数组(行成为列,列成为行)并约束它。首先,让我们定义MAT

的转置
  rand bit MAT_transp[8][8];

  constraint construct_MAT_transp {
    foreach (MAT[i,j])
      MAT_transp[j][i] == MAT[i][j];
  }

我们分配另一个数组并使其内容与MAT的内容保持同步。对MAT_transp的任何限制都会间接影响MAT。和以前一样,我们可以限制MAT_transp的行,这将有效地约束MAT的列:

  constraint sum_on_col {
    foreach (MAT_transp[i])
      MAT_transp[i].sum() with (32'(item)) == 1;
  }

最后,您希望数组中所有元素的总和为8.这是最棘手的事情。虽然我们不能直接约束数组和,但我们可以将问题分成两部分。首先,我们可以计算MAT中每行的总和,并将它们全部存储在一个数组中:

  rand int unsigned row_sums[8];

  constraint compute_row_sums {
    foreach (row_sums[i])
      row_sums[i] == MAT[i].sum() with (32'(item));
  }

现在我们在每一行上都有总和,通过约束所有行总和的总和很容易约束整个数组的总和:

  constraint sum_of_matrix {
    row_sums.sum() == 8;
  }

很酷的是,有了这个问题,我们已经涵盖了在约束数组时我们可以应用的许多常用“技巧”。您可以在old post I wrote中找到更多数组约束惯用语。

答案 1 :(得分:0)

实际上,array2d.sum()与VCS一起使用。