一、let语句
let是看起来与带有参数的宏定义编译指令('define)类似,但是let语句有作用域,而带参数的’define是全局有效的。在定义带参数的表达式时,应尽量使用let语句。
如:
let max(a,b) = a>b?a:b;
logic signed [15:0] a,b,c;
……
c = max(a,b);
二、结构与联合
1.结构
结构是多个变量的集合,可以作为整体引用,也可引用其中的单个成员。结构分为不紧凑的(unpacked)和紧凑的(packed),默认为不紧凑。不紧凑的结构可以包含任意数据类型,成员之间可能会因为要对齐到整字节而出现间隙。具体对齐方式标准中没有定义,取决于编译器,因而不能整体当作简单类型参与相关运算。而对齐的结构的内部成员之间没有位间隙,整体可以理解为一个多位数据,先定义的成员位于高位,可以整体参与算术或逻辑运算,可以指定有无符号。
结构类型 | 所包含数据类型 | 间隙 | 是否能作为整体进行运算 |
---|---|---|---|
不紧凑(unpacked)(默认) | 任意 | 有 | 否 |
紧凑(packed) | 相同 | 无 | 是 |
与C语言相同,也可以使用"typedef"关键字为结构类型命名,如:
//定义一个紧凑有符号型的结构
typedef struct packed signed{
logic signed [15:0] re;
logic signed [15:0] im;
} Cplx;
Cplx c0,c1; //定义了两个Cplx类型的变量c0和c1
wire Cplx c2 = c0; //定义了一个Cplx类型的线网并与c0相连接
结构既可以整体引用或赋值,也可以使用成员运算符“.”选取内部成员引用或赋值。
对结构整体的赋值可以使用结构常数,一般形式为:
'{成员值1,成员值2,……}
示例如下:
logic signed [15:0] a=16'sd3001;
logic signed [15:0] b=-16'sd8778;
wire Cplx c4 = '{
a,b}; //c4 = {3001,-8778}
成员访问示例
c0.re = 16'sd3001; //c0 = {3001,x}
c0.im = b; <