有两个 MxN 2D 数组:
rand bit [M-1:0] src [N-1:0];
rand bit [M-1:0] dst [N-1:0];
它们都会被随机单独,这样它们的 P 数都是 1'b1,其余的都是 1'b0。
名为“map”的第三个 MxN 整数数组在两个数组“src”和“dst”之间建立一对一映射。
rand int [M-1:0] map [N-1:0];
需要对“map”进行约束,以便在随机化后,对于 src[i][j] 的每个元素,其中 src[i][j] == 1'b1,map[i][j] == M*k +l 当 dst[k][l] == 1 时。对于映射的每个非零元素,k 和 l 必须是唯一的。
举个例子: 令 M = 3 且 N = 2。
令 src 为
[1 0 1
0 1 0]
让 dst 成为
[0 1 1
1 0 0]
那么“地图”的一种可能的随机化将是:
[3 0 1
0 2 0]
在上面的地图中:
这很难表达为 SystemVerilog 约束,因为
由于您分别随机化
src
和 dst
,因此计算指针然后随机选择指针来填充地图可能会更容易。
module top;
parameter M=3,N=4,P=4;
bit [M-1:0] src [N];
bit [M-1:0] dst [N];
int map [N][M];
int pointers[$];
initial begin
assert( randomize(src) with {src.sum() with ($countones(item)) == P;} );
assert( randomize(dst) with {dst.sum() with ($countones(item)) == P;} );
foreach(dst[K,L]) if (dst[K][L]) pointers.push_back(K*M+L);
pointers.shuffle();
foreach(map[I,J]) map[I][J] = pointers.pop_back();
$displayb("%p\n%p",src,dst);
$display("%p",map);
end
endmodule
可能有以下作品吗?
foreach (src[i,j]) {
foreach (dst[k,l]) {
if ((k*M+l) == map[i][j]) {
dst[k][l] == src[i][j];
}
}
}