Systemverilog for design 笔记(四)

数组、结构体和联合体

1. 结构体struct

1.1. 结构体声明

结构体默认是变量,也可以声明为线网

var struct { // 通过var进行结构体变量声明

logic [31:0] a, b;

logic [ 7:0] opcode;} Instruction_Word_var;

wire struct { //结构体线网声明,定义为线网类型时,结构体的所有成员必须都是四态类型的 logic [31:0] a, b;

logic [ 7:0] opcode;} Instruction_Word_net;

Point:结构体内不能使用线网类型。多个线网可以用SV接口打包成一个组。

Eg:自定义结构体

typedef struct { //结构体定义,不分配存储器

logic [31:0] a, b;

logic [ 7:0] opcode;

logic [23:0] address;

} instruction_word_t;

instruction_word_t IW; // 结构体实例化时分配存储区

自定义结构体可以在模块,接口或者包中定义。

1.2. 结构体赋值

使用值列表 初始化

结构体在实例化的时候可以对其成员初始化using ’{<value>}

instruction_word_t IW = ’{100, 3, 8’hFF, 0};   //赋值a=100 b=3 opcode=FF address=0

u 结构体成员赋值

IW.a = 100;   //引用结构体成员的名称对成员进行赋值

u 将结构体表达式赋给结构体

if (!resetN) IW = ’{100, 5, 8’hFF, 0};    //同初始化的时候类似,但这是在过程块中进行的

u 结构体表达式的默认值

IW = ’{ real:1.0, default:0, r1:3.1415 };//r1=3.1415 其他real成员=1.0 其他成员=0 precedence:显性成员名赋值>指定数据类型赋值>default

1.3. 压缩(packed)和非压缩(unpacked)结构体(均可综合)

默认情况下,结构体是非压缩的。结构体成员是独立的变量或常量。

使用packed显示的声明一个压缩结构体。压缩结构体按照指定的顺序以相邻的位来存储结构体成员。压缩结构体被当做一个向量存储,结构体的第一个成员在向量的最左边。向量的最低位是结构体最后一个成员最低位,其位编号为bit 0。如图所示(类似小端模式):

struct packed {

logic valid; logic [ 7:0] tag; logic [31:0] data;

} data_word;

packed structure的成员可以通过成员名引用(<struct_name>.<mem_name>)也可以使用结构体向量的相应位来引用(<struct_name>[M:N])。

压缩结构体只能包含整数。

(题外话:realshortreal分别对应C语言的双精度和单精度,不可被综合,但是在抽象硬件模型和tb中有用,因此不算做整数范畴)

压缩结构体可被看作是向量来操作。(除了’{}赋值操作是当做unpacked以外)

1.4. 通过端口传递结构体

要想使用结构体类型的端口,要先使用typedef定义为用户自定义数据类型的结构体。

Unpacked struct通过模块port传递时,端口两边连接必须是同一种类型的结构体。

在两个不同模块声明的匿名结构体即便成员类型相同也不能看作同一类型结构体。

1.5. 将结构体作为自变量传递至taskfunction

要想传递结构体类型的自变量,要先使用typedef定义为用户自定义数据类型的结构体。

4.1.4,要相同类型结构体才能作为自变量传递给taskfunction

2. 联合体(union

联合体只存储一个元素,但该元素可以有多种表示方法,每种表示方法可以是不同数据类型

Union声明及成员引用方法同struct,关键词为union

Union内的成员公用同一存储空间。所以对其中一个成员赋值,其他成员也会相应变化,只是数据类型不同而已

2.1. 非压缩联合体(unpacked unions (不可综合)

非压缩联合体可以包含任意变量类型,包括real,非压缩结构体和非压缩数组。

2.2. 标签联合体(tagged unions(没懂啥应用价值P130)

相当于在使用时要注意读值和上次存储都是针对同一个union member(有啥用

2.3. 压缩联合体(packed unions(可综合)

压缩联合体中每个成员位数相同,只存储整数值。

(一般用于存signed,unsigned两种类型,比如,当需要存signed类型时,给ele0赋值,需要存unsigned类型时,给ele1赋值)

typedef struct packed {

logic [15:0] source_address;

logic [15:0] destination_address;

logic [23:0] data;

logic [ 7:0] opcode;

} data_packet_t;

union packed {

data_packet_t packet; //压缩结构体

logic [7:0][7:0] bytes; // 压缩数组

} dreg;

该例中,值可以使用byte格式的数组写入,然后以data_packet格式读出相同的值(共享空间)

猜你喜欢

转载自www.cnblogs.com/daisyuer/p/9215585.html