unpacked union中各个成员的大小可以是不同的。
举一个例子
typedef Union {
logic [5:0] a;
logic [3:0] b;
logic c;
} myUnionType
myUnionType myUnion;
上面的union成员大小都是不同的,这个union整体的大小取决于其中size最大的成员,如下图示例:
logic [5:0] a
再看一下unpacked union中存在struct成员内存分配的示例:
typedef struct packed {
bit [3:0] s1;
bit s2;
} myStruct;
typedef union {
logic [7:0] u1;
myStruct b2;
} mUnionT;
mUnionT Union1;
对于这个union,最大 size的成员是“logic [7:0]
b1.”所以,这个union整体的大小是
对于一个union,如果你写入成员1,再读取成员2,实际上你读取的就是刚刚写入的成员1,这恰恰也说明了union的本质,即同一个物理存储实体。
module union_example;
logic [31:0] x;
typedef union {
int a;
byte b;
bit [15:0] c;
} data;
data d1;
initial begin
d1.a = 32'h ffff_ffff; //write to d1.a
x = d1.b; //read from d1.b
$display("x = %h",x);
d1.b = 8'h 01; //write to d1.b
x = d1.a; //read from d1.a
$display("x = %h",x);
d1.c = 16'h 1010; //write to d1.c
x = d1.a; //read from d1.a
$display("x = %h",x);
end
endmodule
仿真log:
x = ffffffff
x = 00000001
x = 00001010
V C S S i m u l a t i o n R e p o r t
上面的例子声明了一个unpacked union “data.”,然后例化了一个data 类型的数据"d1"
在initial语句块中,我们首先写入union中的成员“int a”:
d1.a = 32'h ffff_ffff; //write to d1.a
注意,此时我们没有向“d1.b”写入任何内容。但既然union只有一个物理存储实体,所以这些成员具有相同的值。所以,当我们从" d1 "读取数据b
x = d1.b; //read from d1.b
仿真log会打印
x = ffffffff
反之亦然,当我们向b写入数据,数据也会反映到a上。
d1.b = 8'h 01; //write to d1.b
此时a会打印:
x = 00000001
成员c的写入同样也会反映到成员a,如打印log所示。
这再次表明union中的所有成员共享一个物理存储空间,对于RTL的可综合性,要求这些成员的大小相同。