System Verilog基础知识系列-数据类型(1)

逻辑(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) ? "==" : "!=" );


  • 9
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值