结构体
1.Verilog的最大缺陷之一是没有数据结构,在SV中可以使用struct语句创建结构,跟c语言类似。
2.不过struct的功能少,它只是一个数据的集合,其通常的使用方式是将若干相关的变量组合到一个struct结构定义中。
3.伴随typedef可以用来创建新的类型,并利用新类型来声明更多变量。
//为了共享该类型,通过typedef来创建新类型
typedef struct {bit [7:0] r,g,b;} pixel_s;
pixel_s my_pixel; //声明变量
my_pixel = `{`h10,`h10,`h10}; //结构体类型的赋值
非合并型赋值需要 “ ` ” ,如动态数组、结构体
合并型不需要,如定宽数组、队列
枚举类型
1.规范的操作码和指令例如ADD、WRITE、IDLE等有利于代码的编写和维护,它比直接使用'h01这样的常量使用起来可读性和可维护性更好。
2.枚举类型enum经常和typedef搭配使用,由此便于用户自定义枚举类型的共享使用。
3.枚举类型的出现保证了一些非期望值的出现,降低设计风险。
typedef enum {INIT,DECODE,IDLE} fsmstate_e;
fsmstate_e pstate,nstate; //声明自定义类型变量
case (pstate)
IDLE : nstate = INIT; //数值赋值
INIT : nstate = DECODE;
default : nstate = IDLE;
endcase
$display ("Next state is %s",nstate.name()); //显示状态名
eg:
就上面的例子中,给nstate如果直接用整数赋值,那么合法的范围是多少?
A.该赋值行为本身不合法 B.[0:2] C.任意整数 D.xxx
答案是 A
解析:因为上面已经定义nstate为枚举类型,而枚举类型不可以直接用整数赋值。
枚举类型enum可以直接给INT赋值,但INT给enum赋值要经过一个类型转化,转化成枚举类型。
避免把3,4,5等整数数值赋给eum,因为INT的范围是0,1,2。
字符串
声明字符串:string + 字符串名
格式化字符串:$sformmatf( )
打印字符串:$display()
string s;
initial begin
s = "IEEE";
$display (s.getc(0));//显示第0个字符:I
$display (s.tolower());//显示小写字符: ieee
s.putc(s.len() - 1,"-");//putc是替换,len() - 1是字符串最后一位,即将最后一位替换成“ -”
s = {s,"P1800"};//字符串拼接 ->IEE-P1800
$display(s.substr(2,5));显示第2-5位字符 ->E-P1
//创建一个临时字符串并将其打印
my_log ($sformatf("%s,%5d",s,42));
end
task my_log (string message); //打印信息
$display ("@%0t:%s",$time,message);
endtask