绿皮书笔记:System Verilog 验证 第二章 数据类型 (上半部分)

       Systerm Verilog的数据类型相对verilog的数据类型有所不同,SV中增加了四状态类型的数据类型,四状态类型是(0、1、X、Z),二状态类型是(0、1),SV的数据类型有:bit(单比特)、int(32比特)、byte(8比特)、integer(32比特、四状态)、time(64比特、四状态)等,其中除了bit是无符号数,其余数据类型都是有符号数,这个要注意。除此之外,SV中还增加了logic类型、四状态,logic类型可以代替verilog中的reg类型,并且logic可以被连续赋值、门单元、模块驱动,但是不能在双向总线建模中使用,也不能被多个驱动。

定宽数组

 Verilog中必须给出数组的上下界,SV中则不需要,如下所示:

        int a [0:9] 与 int b [10]的声明都是一样的,并且为多维数组中也相同 int a [0:3][0:2] 与 int b [4][3]相同,并且当想获取超过数据界限的值时,在二状态类型的数据类型中,比如获取上面的a[10]时,该值返回为0,在四状态类型的数据类型中,比如获取上面的a[10]时,该值返回为X。

       对一个定量数组进行赋值常量,即一个单引号加大括号来初始化:

             int a[10] = ‘{0,5,8,9,10,9,5,6,3,10};

       此外还有合并数组,可以实现对某个数值取部分值,比如32bit寄存器,可以看做是4个8bit的寄存器,这个时候可以取第一个或第二个8bit的值,这样比较方便,合并数据的结构如下所示,合并数组中的位和数组大小必须在数据类型的前面(数组大小在前,位数在后)

      bit [3:0][7:0]int_con;        //合并数据

     bit [7:0] int_con_n[3] ;      //非合并数组

     上述合并数组表示4个8比特的数组组成32比特的数组,数组的大小定义为[msb:lsb],即高位在前,低位在后,其中:

       int_con = 32'habcd_1234;

       int_con[1] 值为 8'h12;

       int_con[2][7:3] 值为 5'b1_1001;

动态数组

     动态数组声明时,使用下标[   ],即数组的宽度先不给出为动态数组,使用new[ 数组长度 ]操作符来分配空间,动态数组操作如下:

      int a[];

      begin

        a = new[10];

        foreach(a[i])

            a[i] = i*10;

        a = new[20](a);    //定义数组a长度为20,并且复制a数组为初始的10个值

      end

队列

    队列声明的时候下标为[$],队列元素的下标从0到$,如下面所示:

   int b,a[$] = {5,6,7};

   begin

      a.insert(2,3);       // a = {5,6,1,7}

      a.delete(2);                // a = {5,6,7}

      a.push_front(6);         // a = {6,5,6,7} 其中front为在前面加,back为在队列的尾部加

      b = a.pop_back;        // a = {6,5,6}其中front为弹出队列首个值,back为弹出队列尾部最后一个值

  end

  当队列的下标为[$:数字],即表示取队列[0:数字]长度的值,下标为[数字:$],即表示取队列[数字:最大值]长度的值。

 可以将定宽数组和动态数组复制给队列。

关联数组

     关联数组声明的时候下标为[数据类型],比如[int]或者[bit],如下所示:
         begin

              bit [31:0] a [bit[31:0]];

             bit [31:0] b;

             b = 1;

             repeat(32)begin

                      a[b] = b;

                      b = b<<1;

           end

          a.first(b);           //第一个元素

         a.delete(b);       //删除第一个元素

        a.exists(b);         //是否存在b元素,返回1或0(双状态)X(四状态) 

数组的方法

      数据的循环for和foreach使用:

             int a[10],b[10]; 

             for(int i=0,i<=$size(a),i++)

                    a[i] = i;

            foreach(b[j])

                   b[j] = a[j];

      多维数组使用foreach中foreach(b[i,j])循环。

      $size(数组名)返回的值为数组的长度

     $urandom_range($size(array)-1)  //生成数组长度内的随机数

     a_min = a.min();     //数组a的最小值,返回值为队列 

     a_max = a.max();   //数组a的最大值,返回值为队列 

    a_un = a.unique();  //数组a的唯一值,返回值为队列

    find

    int a []='{5,9,7,9,7,4,1,3,5,6},b[$];

         begin

            b = a.find with(item > 5);                          // b = {9,7,9,7,6} 返回大于5的值

            b = a.find_index with(item > 5);               // b = {1,2,3,4,9} 返回大于5的值索引

            b = a.find _first with(item >5);                  // b = {9} 返回大于5的第一个值

            b = a.find_first_index with(item ==5);      // b = {0} 返回等于5的第一个索引    

           同理 a.find_last with()和a.find_last_index with()

           a.sort();                                                    //a = {1,3,4,5,5,6,7,7,9,9} 从小到大

           a.rsort();                                                  //a = {9,9,7,7,6,5,5,4,3,1} 从大到小

           a.reverse()和a.shuffle()都是随机打乱顺序

以上是绿皮书第二章的部分内容总结笔记。

 

  

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值