You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 22:58:20