为何在SystemVerilog约束中使用32'd会导致随机化失败?
SystemVerilog约束
inside {[-32'd10 : 32'd10]}随机化失败的原因 原始可运行代码
program test; class bla; rand int a; constraint cons { a inside {[-10 : 10]}; } function void post_randomize(); $display(this.a); endfunction : post_randomize endclass : bla initial begin static bla obj = new(); repeat (10) void'(obj.randomize()); end endprogram : test
问题现象
将约束语句a inside {[-10 : 10]};修改为a inside {[-32'd10 : 32'd10]};后,多数工具会出现随机化失败,部分工具仅在生成负数时失败。
根本原因
问题出在无符号字面量的负号运算和范围表达式的类型匹配上:
32'd10是32位无符号整数类型,SystemVerilog中对无符号数使用一元负号-时,不会得到预期的负数结果。它会对无符号数的二进制做二补码运算,再转回无符号类型,最终-32'd10的值是十进制4294967286(二进制0xFFFFFFF6)。- 此时范围表达式变成
[4294967286 : 10],左边界远大于右边界。对于无符号数的取值范围(0到2^32-1)来说,这个区间没有任何有效值,因此随机化无法找到满足约束的数值,导致失败。 - 部分工具的异常表现(仅负数时失败)是因为工具对无效范围的处理逻辑存在差异,但本质都是因为约束中的范围本身是无效的。
正确写法
如果需要明确指定有符号的32位字面量,应该使用32'sd10(s表示有符号),此时约束写成:
a inside {[-32'sd10 : 32'sd10]};
这个写法和原始的[-10 : 10]等价,随机化可以正常运行。
内容的提问来源于stack exchange,提问作者Krishna
相关产品推荐
相关产品推荐

