【问题标题】:SystemVerilog constraint for mapping between two 2D arrays用于两个二维数组之间映射的 SystemVerilog 约束
【发布时间】:2018-03-12 00:26:26
【问题描述】:

有两个 MxN 二维数组:

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 时。对于 map 的每个非零元素,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)

【问题讨论】:

  • 如果您提供一组 src、dst 和 map 的示例值会有所帮助
  • 添加了一个例子。谢谢。

标签: mapping constraints system-verilog


【解决方案1】:

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

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

由于您将srcdst 分别随机化,因此计算指针然后随机选择要填充映射的指针可能更容易。

  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

【讨论】:

    猜你喜欢
    • 2016-11-22
    • 1970-01-01
    • 2011-12-04
    • 2022-01-16
    • 1970-01-01
    • 1970-01-01
    • 2018-06-10
    • 2011-01-10
    相关资源
    最近更新 更多