SV数据类型-结构体、枚举类型、字符串

结构体

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

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值