以这种方式使用串联运算符{}时会发生什么

时间:2014-11-28 06:26:45

标签: verilog

我在这里看到了这个描述 link

我不明白使用{$random()}获得正数时会发生什么?

问:我想要一个2位随机变量。我怎么能这样做?

$ random函数调用每次调用时返回一个32位随机数。随机数是有符号整数;它可以是积极的或消极的。因此,如果需要2位随机变量,则需要进行模运算,如下所示。

reg [1:0] R;
R = $random % 2;

上面的示例将生成-1到1之间的随机值。如果只需要肯定,请使用连接运算符,如下所示。

reg [1:0] R;
R = {$random} % 2;

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中的位数,用零填充。