这是一个例子。在SystemVerilog中,它具有数组赋值模式和结构赋值模式语法。无论这里的union构造是打包还是解包,无论它是否可合成,它是否是赋值模式的有效用法?如果是,联合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
答案 0 :(得分:2)
我稍微修改了你的代码以打印指定的值。
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
来自vcs:
s.a = 2, s.b = 01, s.x.c = 1, s.x.d = 00000001
希望这能回答你的问题。
答案 1 :(得分:1)
我尝试了这个修改过的例子:
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
而VCS提供此输出:
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