SystemVerilog如何执行单次热屏蔽

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

我有一个位数组,比方说(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方式可以实现这一目标?

谢谢您的帮助!

arrays vector system-verilog mask bit
1个回答
0
投票

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

module tb;

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

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

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

endmodule
© www.soinside.com 2019 - 2024. All rights reserved.