数据类型
内建数据类型
-
logic 类型
四值数据类型,基本上可以替换wire 或者 reg ,但是不能用在双向总线的情况。
-
bit
2值类型,只有0和1 。是无符号的
-
int usigned
-
int
-
byte
-
shortint
-
longint…
定宽数组
可以使用 int array[0:15]
也可以使用int array[16] (类似于C语言)
-
常量数组
int array[4]=`{1,2,3,4};
array[0:2]= `{5,6,7};
array=`{4{1}};
array = `{3,default:1} -> {3, 1,1,1 }
自定义类型
typedef int unsigned uint_t;
- 枚举类型
typedef enum {red ,green ,blue} RGB;
枚举类型可以和整型隐式转换,枚举类型可以赋值给整型,但是整型不可以赋值给枚举类型
RGB e_A = red;
int iVal;
iVal = e_A +1;
可以使用$cast来将整型转换成枚举类型,但是如果越界就会失败
e_A = 1+e_A ;(这种是错的)
可以通过e_A.name 获得变量的名称
-
结构体
typedef struct {bit [7:0] r,g,b;}pixel_s;
-
字符串
string s = “1234”;
s={s,“ABCD”};–>1234ABCD
$psprintf("%s %5d ",s,42);格式化输出字符串
-
练习代码
`timescale 1ns / 1ps
module sv_tb();
logic b;
initial begin
if($isunknown(b))
$display("@%0t 4-state value is %b",$time,b);
end
initial begin
int a1[0:15];
int a2[16];
int md[2][3];
bit [31:0] a3 [5];
bit [3:0][7:0] bytes;
int dyn[];
int dyn2[];
a1='{default:1};
a2 = '{16{8}};
md = '{'{7,8,9},'{1,2,3}};
for(int i = 0 ; i < $size(a1);i++)begin
$display("a1 value is %d",a1[i]);
end
foreach(a2[i])
$display("a2 value is %d",a2[i]);
foreach(md[i,j])
$display("md value is %d",md[i][j]);
//数组的复制和比较
//可以不使用循环来复制和比较,也可以做数组片段的复制和比较,但是不能做运算和逻辑运算
if(a1 == a2 )
$display("a1 == a2");
else
$display("a1 != a2");
a1[3:8] = a2[3:8];
if(a1[3:8] == a2[3:8] )
$display("a1 == a2");
else
$display("a1 != a2");
a1 = a2;
if(a1 == a2 )
$display("a1 == a2");
else
$display("a1 != a2");
//同时使用位下标和组下标
a3 = '{5{5}};
$displayb(a3[0],,a3[0][0],,a3[0][2:1]);
//合并数组,既可以分开来使用,也可以单独作为一个整体使用
//bit [3:0][7:0] bytes;
//注意的是定义数组大小必须是[msb , lsb]
//2.数组大小必须在变量名之前定义
//动态数组
//空下标来声明动态数组
//使用new[5] 来申请数组大小
//申请的同时可以复制dyn = new[100](dyn);
dyn = new[5];
dyn = '{default:6};
$display("dyn size is %d",$size(dyn));
$display("dyn[0] = %d",dyn[0]);
dyn2 = new[5](dyn);
$display("dyn2 size is %d",$size(dyn2));
$display("dyn2[0] = %d",dyn2[0]);
$display("dyn2[1] = %d",dyn2[1]);
dyn.delete();
dyn2.delete();
end
//队列
initial begin
string q[$] = {"first","second"};
string cs = "";
#100ns;
q.push_front("zero");
foreach(q[j])
$display("%s",q[j]);
q.push_back("last info");
cs = q.pop_back;
$display("%s",cs);
//可以用$表示队列的最大值
q = {q[0],"half",q[1:$]};
foreach(q[j])
$display("%s",q[j]);
end
//字符串
initial begin
string s_tem;
string s = "abcdef";
#200ns;
$display(s.getc(0));//返回第0个字符
$display(s.toupper());//转化为大写字母
$display(s.tolower());//转化为小写字母
s.putc(s.len()-1,"X");
$display(s);//将最后一个字符替换为X
$display(s.substr(2,3));//截取字符
$display($sformatf("%s %2d",s,42));//创建一个临时字符串
end
endmodule