我在这里看到了这个描述 link
我不明白使用{$random()}
获得正数时会发生什么?
$ random函数调用每次调用时返回一个32位随机数。随机数是有符号整数;它可以是积极的或消极的。因此,如果需要2位随机变量,则需要进行模运算,如下所示。
reg [1:0] R;
R = $random % 2;
上面的示例将生成-1到1之间的随机值。如果只需要肯定,请使用连接运算符,如下所示。
reg [1:0] R;
R = {$random} % 2;
答案 0 :(得分:1)
我会尝试直接解决您的问题"使用{$random()}
获取正数时会发生什么情况"
Verilog的签名是微妙的。要真正理解这里发生的事情:
$random
系统函数返回签名整数{...}
生成无符号结果%
在第一个参数签名时生成签名结果。
(IEEE 1364-2005第5.1.5节; IEEE 1800-2012第11.4.3节)由于这些规则,
$random % 2
是随机的32位有符号整数,模2 - >签署结果{$random} % 2
是随机的32位无符号整数,模2 - >未签名的结果那么当您将这些表达式分配给2位无符号寄存器R
时会发生什么?
在已签名的案例中,R 实际上有三个可能的值,因为$random % 2
实际上可以返回0,1或-1中的任何一个(例如,当{{1}时产生-1)。将此中间值符号扩展为2位后,$random
的最终结果为0,1或3.(但绝不是2)
在未签名的情况下,一切都有意义,你要么R
为0或1。
答案 1 :(得分:0)
您不需要%2
,您可以直接为R分配一个{$ random}值,因为它将是二进制文件。在左侧(MSB)截断rhs值,以便为多个LSB位尽可能。另一方面,如果LHS上的位数> RHS中的位数,用零填充。