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

SystemVerilog union类型输出出现'I'的含义及成因咨询

SystemVerilog Union输出中'I'字符的问题解答

相关代码

module union_ex;
typedef union {
  bit [7:0]  a;
  bit [15:0] b;
  bit [1:0]  c;
} u_t;
  u_t A;

  initial begin
    A.a = 16'd25;
    $display("decimal = %p",A); //d
    $display("A.a = %0d",A.a);
    $display("A.b = %0d",A.b);
    $display("A.c = %0d",A.c);
    $displayh("Hex = %p",A); //h 
    $displayb("Binary = %p",A);  //b
    $displayo("octaL = %p",A); //o 
    $displayh("0P = %0p",A); //0p
  end
endmodule

输出结果

decimal = '{a:25, b:25, c:I}
# A.a = 25
# A.b = 25
# A.c = I
# Hex = '{a:19, b:0019, c:9}
# Binary = '{a:00011001, b:0000000000011001, c:01}
# octaL = '{a:031, b:000031, c:9}
# 0P = 19 19 9

1. SystemVerilog输出中的字符'I'表示什么?

'I'是**无效值(Invalid Value)**的标识,当仿真器尝试用指定格式输出一个无法被该格式正确解析的数值时,就会输出这个字符。常见场景包括:位宽与输出格式不匹配、二进制位组合无法对应目标格式的有效数值等。

2. 为何在使用union类型时会出现该字符?

SystemVerilog的union类型所有成员共享同一块内存空间,你给A.a赋值为25(二进制00011001)后,A.c对应的是内存的低2位(2'b01)。出现'I'的核心原因是输出格式与成员位宽的匹配问题:

  • 当用十进制格式(%d或%p默认十进制)输出A.c时,部分仿真器对2位无符号数的十进制解析存在特殊处理逻辑,无法正确将2'b01映射为十进制的1,因此输出'I'表示无效。
  • 而用十六进制(%h)、二进制(%b)格式输出时,仿真器直接解析二进制位,能正确显示对应格式的数值(比如二进制的01),所以不会出现'I'。

注:你的输出中十六进制行的c:9应为笔误,实际2'b01对应的十六进制值是1。


内容的提问来源于stack exchange,提问作者Keyuri Sorathiya

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.11 10:04:55