逻辑(logic)类型
logic类型:对reg变量进行改进,除了可以作为一个变量之外,还可以被连续赋值语句、门单元和模块所驱动。有四种状态:0 1 x z
任何使用线网类型的地方均可以使用logic,但是要求logic不能有多个结构性驱动,例如对于双向总线的建模必须使用wire
双状态数据类型
无符号双状态数据类型:bit
带符号的双状态数据类型:byte、shortint、int、longint
如果用byte的数据类型代替logic[7:0],需要注意byte是带符号的,因此被定义的范围只能是-128-127,而不是0到255。可以使用byte unsigned来定义,但是这比使用bit[7:0]还要麻烦。
$isunknow操作符
$isunknow操作符,在表达式任意位置出现X或者Z的时候返回1,
if($isunknown(iport) == 1)
$display("@%0t: 4-state value detected on iport %b", $time, iport);
如果iport里面有x或者z,**$isunknown(iport)**会返回1
(用%0t和参数$time可以打印出当前的仿真时间
定宽数组声明和初始化
verilog语言在定义位宽时需要指明上界和下界,而systemverilog允许只给出数组宽度的声明,类似于C语言
可以在变量名后面指定维度的方式创建多维定宽数组。
从越界的地址中读取数据,返回定义数据类型的缺省值
常量数组(初始话数组)
常量数组使用`{}的方式初始化数组,可以一次性的为数组部分或者所有元素赋值。在大括号前标上重复次数可以对多个元素重复赋值,还可以为那些没有显示赋值的元素指定一个缺省值。
for和foreach
foreash循环中,需要指定数组名并在其后给出索引量,System Verilog会自动遍历数组中的元素
initial begin
bit[31:0] src[5],dest[5];
for(ini i = 0;i < $size(src);i++)
src[i] = i;
foreash(dst[j])
dst[j] = src[j] * 2;
end
多维数组使用foreash语法,对于元素的索引为md[i,j]
int md[2][3] = `{`{0,1,2},`[3,4,5]};
initial begin
foreash(md[i,j])
$display("md[%0d][%0d] = %0d",i,j,md[i][j]);
end
如果要忽略某一个维度,可以在foreash中直接忽略
initial begin
byte twoD[4][6];
foreash(twoD[i,j])
twoD[i][j] = i*10 + j;
foreash(twoD[i])begin //省略第一个维度
$write("%2d:",i);
foreash(twoD[,j]) //省略第二个维度
$write("%3d",twoD[i][j]);
$display;
end
end
//$write()与$dispaly()不同在于,$write()输出不会自动空行
数组的复制和比较
System Verilog可以在不使用循环的前提下直接对数组进行复制和比较,其中比较只限于等于和不等于。
bit[31:0]src[5] = `{0,1,2,3,3},
dst[5] = `{5,4,3,2,1};
//复制
src == dst;
//比较
$display("src %s dst",(src == dst) ? "==" : "!=" );