Verilog中拼接运算符为何可让$random生成0~59范围的正数值
关于Verilog中
{$random}取模得到正随机数的原理说明 - 系统函数
$random默认返回的是32位有符号整数,取值范围为$-2^{31} \sim 2^{31}-1$,如果直接对60取模,结果会包含负数,无法直接得到0~59的正数值。 - Verilog的拼接运算符
{}有一个固定特性:会把内部所有操作数当作无符号值处理,最终拼接得到的结果本身也是无符号类型。 - 代码中
{$random}的作用,就是把$random返回的32位有符号整数直接转换为32位无符号整数,原有的最高位符号位会被当作普通数值位解析,转换后的数值范围为$0 \sim 2^{32}-1$,全部为正整数。 - 这个全正数的无符号值再对60取模,自然就得到了0~59范围内的正随机数。
如果你直接写
rand = $random % 60,当$random返回负数时取模结果也为负,赋值给无符号的23位reg变量rand时,会把负数补码直接当作无符号数解析,得到的数值会远大于59,完全不符合使用预期。
内容的提问来源于stack exchange,提问作者Jiaqi Lee
相关产品推荐
相关产品推荐

