如何做切片网站,微网站分享功能,记事本做的网站链接怎么装饰,论坛做视频网站有哪些正文
记录个在写SystemVerilog随机约束时遇到的一个小坑#xff0c;如果没有认真去查看随机结果是否符合预期#xff0c;还真不容易发现。
为了方便讲述#xff0c;写了如下示例代码。类cl_a里有个随机变量aa#xff0c;初始值为222。在module top里对类cl_a例化并进行约…正文
记录个在写SystemVerilog随机约束时遇到的一个小坑如果没有认真去查看随机结果是否符合预期还真不容易发现。
为了方便讲述写了如下示例代码。类cl_a里有个随机变量aa初始值为222。在module top里对类cl_a例化并进行约束随机。
class cl_a;rand int aa 222;
endclassmodule top;cl_a a;int b 1;initial begina new();$display([initial] aa:%0d, a.aa);assert ( a.randomize() with { aa (b 1) ? 666 : 999;} )else $fatal;$display([random1] aa:%0d, a.aa);assert ( a.randomize() with { aa ((b 1) ? 666 : 999);} )else $fatal;$display([random2] aa:%0d, a.aa);assert ( a.randomize() with { aa (b 1);} )else $fatal;$display([random3] aa:%0d, a.aa);assert ( a.randomize() with { aa 8 ? 666 : 999;} )else $fatal;$display([random4] aa:%0d, a.aa);end
endmodule
先不看仿真结果你们觉得行A和行B的随机结果一致吗
是的它们俩的结果完全不一样如果你知道为什么会不一样那么接下来的内容就不用看了。其实也很简单对SystemVerilog运算符优先级了解的很清楚的同仁应该一眼就看出毛病了。运算符的优先级高于三目运算符(?:)。
在行11中会先算(b1)为X接下来算aX为Y这时候这里的不是作为随机约束符号来使用的它在三目运算符(?:)中判断是否相等来使用的因此a其实是没有加任何约束也就是a会被随机之后再判断aX的值Y。所以我们最终看到[random1]打印的aa为随机数。
在行14中会先算((b 1) ? 666 : 999)里面的内容b1结果为1所以三目运算符结果为666然后计算a666这里的就作为随机约束符号了因此最终看到[random2]打印的aa为666。
在行17中会先算(b 1)结果为1然后再算a1这里的也作为随机约束符号最终看到[random3]打印的aa为1。
行20其实和行11是类似的这里a8的不是作为约束符号而是简单的判断是否相等符。因此最终aa的值是随机的。
使用VSC进行仿真结果如下
[initial] aa:222
[random1] aa:897241389
[random2] aa:666
[random3] aa:1
[random4] aa:-1705158938 总结
其实说白了要么大家认真记住SystemVerilog的符号优先级规则要么在不大确定的地方多用写括号()来确定符号运算的顺序减少意外发生。行11和行14就差个括号但结果完全不一致而且随机也不会报任何warning或error信息。