system verilog 学习笔记(一)之数据类型

数据类型

内建数据类型
  • 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
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值