在SystemVerilog中为结构内部的联合使用赋值模式

在SystemVerilog中为结构内部的联合使用赋值模式,verilog,verification,system-verilog,hdl,Verilog,Verification,System Verilog,Hdl,这是一个例证。在SystemVerilog中,它具有数组分配模式和结构分配模式语法。无论这里的联合构造是打包的还是解包的,无论它是否可合成,它是否是赋值模式的有效用法?如果是,联合x的值应该是多少 typedef struct { int a; byte b; union packed { int c; bit [31:0] d; } x; } S; module top (s); output S s; assign s = '{int:2,

这是一个例证。在SystemVerilog中,它具有数组分配模式和结构分配模式语法。无论这里的联合构造是打包的还是解包的,无论它是否可合成,它是否是赋值模式的有效用法?如果是,联合
x
的值应该是多少

typedef struct {
  int a;
  byte b;
  union packed {
      int c;
      bit [31:0] d;
  } x;
} S;

module top (s);
  output S s;
  assign s = '{int:2, default:1};
endmodule
如果否,是否意味着必须为未打包的结构逐个字段指定初始值

initial begin
  s.a = 2;
  s.b = 1;
  s.x.c = 2;
end

我稍微修改了你的代码以打印指定的值

typedef struct {
  int a;        
  byte b;       
  union packed {
      int c;
      bit [31:0] d;
  } x; 
} S;

module top (s);
  output S s;
  assign s = '{int:2, default:1};

  initial begin
    #10
        $display ("s.a = %d, s.b = %h, s.x.c = %d, s.x.d = %h", s.a, s.b, s.x.c, s.x.d);
  end 
endmodule
以下是ncsim的结果:

s.a =           2, s.b = 01, s.x.c =           1, s.x.d = 00000001
风险投资公司:

s.a =           2, s.b = 01, s.x.c =           1, s.x.d = 00000001

希望这能回答你的问题

我尝试了这个修改后的示例:

typedef bit [31:0] Word;
typedef struct {
  int a;
  byte b;
  union packed {
      int c;
      Word d;
  } x;
  union packed {
      Word d;
      int c;
  } y;
} S;

module top (s);
  output S s;
  assign s = '{ int:2, Word:3, default:1 };

  initial begin
    #10
        $display ("s.a = %d, s.b = %h, s.x.c = %d, s.x.d = %h s.y.d = %h s.y.c = %d",
                  s.a, s.b, s.x.c, s.x.d, s.y.d, s.y.c);
  end 
endmodule
Modelsim提供以下输出:

s.a =           2, s.b = 01, s.x.c =           3, s.x.d = 00000003 s.y.d = 00000002 s.y.c =           2
s.a =           2, s.b = 01, s.x.c =           3, s.x.d = 00000003 s.y.d = 00000003 s.y.c =           3
鉴于VCS提供了这种输出:

s.a =           2, s.b = 01, s.x.c =           3, s.x.d = 00000003 s.y.d = 00000002 s.y.c =           2
s.a =           2, s.b = 01, s.x.c =           3, s.x.d = 00000003 s.y.d = 00000003 s.y.c =           3
这表明模拟器以他们想要的方式处理此类代码,并且没有预期的标准行为

使用以下语法更安全:

assign s = '{ int:2, default:1, x:3, y:4 };
通过此功能,Modelsim和VCS提供:

s.a =           2, s.b = 01, s.x.c =           3, s.x.d = 00000003 s.y.d = 00000004 s.y.c =           4

运行模拟器总是可以看到结果,但它可能会导致依赖于实现,因为我认为LRM没有完全描述某些东西。在LRM中,
类型:
说明符和
默认值:
说明符必须应用于子数组元素或结构的每个字段,类型与
类型:
默认值:
值匹配。但是,对于
联合
类型,它表示
int
位向量
。因此,它可以将2应用于
int
类型,也可以将1应用于
位向量
类型。但是使用赋值模式同时为
c
d
分配不同的值是一种冲突。因此,如果我想为
union x的
int
类型分配2,我仍然使用基于子字段名的赋值来安全地显式地给它们指定值,以便在其他工具可能对此类语法有不同的实现/解释时节省调试时间。因此,如果我想将2赋值给
union x
int
类型,我仍然使用基于子字段名称的赋值来安全地显式地将指定的值赋给它们,以节省调试时间,因为其他工具可能对此类语法有不同的实现/解释。@jclin我尝试了
assign s='{int:2,默认值:1,x:'{c:3},y:'{d:4};
但是VCS说类型为“压缩联合”的变量“s”的
成员“d”没有被赋值
&这是
s.y.c
的类似消息。然而,这两种语法:
赋值s='{int:2,默认值:1,x:'{c:3,d:3},y:'{c:4}
不要使用Modelsim,Modelsim表示将结构文本非法分配给union。
初始值也可以这样指定:
assign s='{int:2,default:1,x:2}
–至少在VCS中,Modelsim&Incisive这种语法有效。