我尝试使用填充了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};
}
}
答案 0 :(得分:2)
IEEE 1800-2012标准的 7.12.3数组简化方法部分指出
[array]简化方法可以应用于任何未压缩的整数值数组,以将数组减少为a 单一价值。
虽然允许MAT[0].sum()
或MAT[1].sum()
(分别在MAT
的第0行和第1行应用和),但MAT.sum()
不是。 MAT
中的一行是bit
的数组,bit
是一个整数类型,但MAT
是bit
的解包数组的数组,不是积分型。
此外,无法从阵列中选择单个列。你只能按行切片。这实现起来有点棘手,但可行。
让我们看看每个约束。首先,使用 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一起使用。