数字验证学习笔记——SystemVerilog芯片验证4 ——数据类型
1.结构体
Verilog 的最大缺陷之一是没有数据结构,在SV中可以使用struct语句创建结构,跟c语言类似。不过struct的功能少,它只是一个数据的集合,其通常的使用的方法是将若干相关的变量组合到一个struct结构定义中。
伴随typedef可以用来创建新的类型,并利用新类型来声明更多变量。
struct {bit [7:0] r ,g ,b ;} pixel; //创建一个pixel结构体
//为了共享该类型,通过typedef 来创建新类型
typedef struct{ bit [7:0] r,g,b; } pixel_s;
pixel_s my_pixel; //声明变量
my_pixel = '{'h10,'h10,'h10}; //结构体类型的赋值 非合并性数组用单引号赋值,就是地址是非连续性的
2.枚举类型
typedef enum{ INIT ,DECODE,IDIE} fsmstats_e; //默认 INIT 0 DECODE 1 IDIE 2
fsmstate_e pstate,nstate; //声明自定义类型变量
case(pstate)
IDIE:nstate =INIT;//数值赋值
INIT:nstate =DECODE;
defalult:nstate =IDIE;
endcase
$dispaly( " Next state is %s" ,nstate.name() ); //显示状态名
如果给nstate 直接用整数赋值 是否正确? 答:该赋值本身不合法
枚举类型可以直接赋值给整型(INT)
整型不可以直接赋值给枚举类型
3.字符串
所有与字符串相关的处理,都使用string来保存和处理。字符串的格式化函数即如何形成一个你想要的字符串句子,使用SV系统方法$sformatf()函数。
string s; // 初始为空“”
initial begin
s=“IEEE ”; //5个字符,末尾加上一个空格
$display(s.getc(0)); //显示 ‘I’ ,getc=getchar,返回byte
$display(s.tolower( ) ); //显示ieee tolower 转化为小写
s.putc( s.len()-1,''-''); //将空格转变为‘-’ IEEE-
s={s,"P1800"}; //"IEEE-P1800"
$dispaly(s.substr(2,5)); //显示EE-P
//创建一个临时字符串并将其打印
my_log($sformatf(" %s %5d" ,s ,42 ) );
end
task my_log(string message); //打印消息
$display( " @%0t: %s", $time , message ); //显示时间是%t
endtask