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
相关产品推荐
相关产品推荐

