用于两个 2D 数组之间映射的 SystemVerilog 约束

问题描述 投票:0回答:2

有两个 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]

在上面的地图中:

  • 3 表示从 src[0,0] 指向 dst[1,0] (3 = 1*M+0)
  • 1 表示从 src[0,2] 指向 dst[0,1] (1 = 0*M+1)
  • 2表示从src[1,1]指向dst[0,2](2 = 0*M+2)
mapping constraints system-verilog
2个回答
2
投票

这很难表达为 SystemVerilog 约束,因为

  1. 无法有条件地选择数组中唯一的元素
  2. 不能将随机变量作为数组元素索引表达式的一部分。

由于您分别随机化

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

0
投票

可能有以下作品吗?

foreach (src[i,j]) {
  foreach (dst[k,l]) {
    if ((k*M+l) == map[i][j]) {
      dst[k][l] == src[i][j];
    }
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.