SystemVerilog如何执行单次热屏蔽

我有一个位数组,比方说(src = 0011010)。此数组的(n = 3)位设置为1。

我想获得一个新数组,其中有些位仍设置为1(因此,设置为1的位的数目在0 ... n范围内)。为此,我使用$ urandom:

dest_rnd = $ urandom()&src;

现在,我想创建另一个数组,将其称为dest_onehot,其中src中最初设置为1的位中只有1保持为1,而其他所有位都为零。并选择保持生存的位。

例如:dest_onehot = 0001000(因此,在最初设置为src的src位中,只有第4位保留下来,而所有其他位都将重置)。

是否有SystemVerilog方法可以实现这一目标?

提前感谢您的帮助!

jackykaka 回答:SystemVerilog如何执行单次热屏蔽

从一个随机位置开始循环遍历输入向量,直到看到1位为止:

module tb;

bit [7:0] src = 'b0011_0100;
bit [7:0] dst;

initial begin
    bit [2:0] a;
    a = $urandom;
    while (!src[++a]);
    dst[a] = 1;

    $display("src=%08b",src);
    $display("dst=%08b",dst);
end

endmodule
,

是的,有一个简单的方法:

module top;
class A;
   int N = 3;
   rand bit [7:0] src,dst;
   constraint c { 
      $countones(src) == N;
      $countones(dst) == 1;
      src & dst;
   }
endclass
   A h = new;
   initial repeat (10) begin
      assert(h.randomize());
      $displayb("%p",h);
   end
endmodule
本文链接:https://www.f2er.com/3099182.html

大家都在问