Mapping 两个二维数组之间映射的SystemVerilog约束

Mapping 两个二维数组之间映射的SystemVerilog约束,mapping,constraints,system-verilog,Mapping,Constraints,System Verilog,有两个MxN 2D阵列: rand bit [M-1:0] src [N-1:0]; rand bit [M-1:0] dst [N-1:0]; 他们两个都将被单独随机分配,这样他们都有1'b1的p数,其余的都是1'b0 第三个名为“map”的整数MxN数组在两个数组“src”和“dst”之间建立一对一的映射 rand int [M-1:0] map [N-1:0]; 需要对“map”进行约束,以便在随机化后,对于src[i][j]的每个元素,其中src[i][j]==1'b1,当dst

有两个MxN 2D阵列:

rand bit [M-1:0] src [N-1:0]; 
rand bit [M-1:0] dst [N-1:0];
他们两个都将被单独随机分配,这样他们都有1'b1的p数,其余的都是1'b0

第三个名为“map”的整数MxN数组在两个数组“src”和“dst”之间建立一对一的映射

rand int [M-1:0] map [N-1:0]; 
需要对“map”进行约束,以便在随机化后,对于src[i][j]的每个元素,其中src[i][j]==1'b1,当dst[k][l]==1时,map[i][j]==M*k+l。对于map的每个非零元素,k和l必须是唯一的

举个例子: 设M=3,N=2

让src

[1   0   1
 0   1   0]
让dst去吧

[0   1   1
 1   0   0]
然后,“map”的一种可能随机化为:

[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)

    • 这很难表示为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
      

      这很难表示为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
      

      如果您为src、dst和MAP提供一组示例值,并添加一个示例,则会有所帮助。谢谢。如果您为src、dst和MAP提供一组示例值,并添加一个示例,将会有所帮助。谢谢。非常感谢,按照我的想法,我不需要解决方案——你的解决方案适合我。关于你的第1点(可能还有第2点),也许是下一轮SV-BC/SV-EC中需要考虑的问题?非常感谢,我不需要按照我的想法来解决——你的解决方案对我有效。关于你的第1点(可能还有第2点),也许在下一轮SV-BC/SV-EC中需要考虑些什么?