在显示联合值时,出现了未预期的字符 'I'

编程语言 2026-07-11

我在SystemVerilog中使用一个 union 数据类型并给它赋值。然而,当我显示输出时,我得到的是大写字母 'I',而不是预期的值。

我不确定这个字符表示什么。

能否请某位解释:

  • SystemVerilog输出中的字符 '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

OUTPUT = 
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

解决方案

SystemVerilog不保证未打包联合(unpacked union)中不同成员之间的位对齐,除非它们具有相同的类型。你定义的是一个 unpacked 联合。

SystemVerilog中的未打包联合在没有通过DPI与 C配合时用途有限。许多工具对它们的支持不足,这很可能解释了你所看到的错误。

供参考,SystemVerilog 1800-2023引入了一个允许 soft packed 联合的特性,它可以包含位宽不同的成员且右对齐。在该版本之前,所有联合成员必须具有相同的位宽。

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章