System Verilog软件常用数据类型

System Verilog软件常用数据类型,第1张

目录

一、定宽数组

数组声明

多维数组声明

初始化和赋值  

非合并数组

合并数组

基本数组 *** 作

for和foreach

赋值:=

比较:==,!=   

二、动态数组

数组定位

方法定位

with(指示sv如何搜索)

重复参数声明,意思相同

数组排序

三、队列

利用队列函数

利用队列 *** 作

四、关联数组

五、结构体 struct

六、枚举类型enum

七、字符串

字符串声明string s


一、定宽数组
  • 数组声明

                int A [0:15]; //[0]…[15] verilog中必须给上下界。

                int A [16];  //[0]…[15]。

  • 多维数组声明

                int array [0:7][0:3]; //完整说明

                int array [8][4];    //紧凑说明

                array[7][3] = 1;    //设置最后一个元素值

注意:从越界地址读取数据,那么SV将返回数组元素类型缺省值,例如对于logic返回X,对于int或bit返回0。

  • 初始化和赋值  

                int ascend[4]='{0,1,2,3}; 

                int descend[5];

                descend='{4,3,2,1,0};  //先定义再初始化

                descend [0:2]='{5,6,7}; //为前三个元素赋值

                ascend='{4{8}}       //重复 *** 作

                descend='{9,8,default:-1};  //{9,8,-1,-1,-1},default定义剩下的元素

                int md[2][3]='{'{0,1,2,3},'{3,4,5}}; //定义多维数组

  • 非合并数组

                bit [7:0]barray[3];    //非合并数组,三行,每一行有一个8bit数据

  • 合并数组

声明合并数组时,合并的位和数组大小作为数据类型的一部分必须在变量名前面指定,数组大小定义的格式必须是[msb:lsb],而不是[size].

                bit [3:0][7:0]barray;       //合并数组,一行,3个字节组成的32bit

                bit [3:0][7:0]barray[3];   //合并,3行,3*32bit

                barray[0]=lw

                barray[0][3]=8'h01;

                barray[0][1][6]=1'b1;

                nibbles=barray[0];         //复制合并数组的元素值32bit

  • 基本数组 *** 作
  • for和foreach

                bit[31:0] src[5],dst[5];

                for(int i=0;i<$size(src);i++)  //$size(src)默认同于$size(src,1)为5,$size(src,2)为32。

                       src[i]=i;

                foreach(dst[j])                     //多维数组foreach(md[i,j])

               dst[j]=src[j]*2;

  • 赋值:=
  • 比较:==,!=   

注意:绿皮书知识点$display(“src%sdst”,(src==dst)?“==”:“!=”)


二、动态数组

相较于定宽数组类型的宽度编译时就已经确定,动态数组则是在仿真运行时灵活调节数组的大小,因此需要‘[]’声明,并在运行时使用new[]分配空间。

                int dyn[],d2[];              //声明动态数组

                initial begin

                     dyn=new[5];            //分配空间

                     foreach(dyn[i])

                            dyn[i]=i;           //元素初始化

                 d2=dyn;                      //复制

                d2[0]=5;

                $display(dyn[0],d2[0]);

                dyn=new[20](dyn);       //分配20个空间,并进行复制

                dyn=new[100];            //重新赋值100个,旧值消失

                dyn.delete();               //也可以用new[0]

                end

注意:声明常数数组又不想统计元素个数时,对比定宽数组int dyn[3]='{1,2,3},动态数组

int dyn[]='{1,2,3} SV自动统计元素个数,避免了宽度指定错误的问题。

  • 数组定位
  • 方法定位

                tq=q.min();

                tq=d.max();

                tq=f.unique(); //唯一值的队列

  • with(指示sv如何搜索)

               int d[]='{9,1,8,3,4,4}, tq[$];

               tq=d.find with(item>3);             //找出大于三的元素

               tq=d.find_index with(item>3);  //{0,2,4,5}找出大于三元素的位置

               tq=d.find_index_first with(item>3); //{0}

               int count,d[] = '{9,1,8,3,4,4}

               count=d.sum with(item>7)       //count值为2,有{9,8}大于7。

  • 重复参数声明,意思相同

                tq=d.find_first with(item==4);

                tq=d.finf_first()with(item==4);

                tq=d.finf_first(x)with(x==4);

                tq=d.finf_first(item)with(item==4);

  • 数组排序

                int d[]='{9,1,8,3,4,4};

                d.reverse();                         //'翻转

                d.sort();                              //从小到大

                d.rsort();                             //从大到小

                d.shuffle();                          //随机放


三、队列

结合了链表和数组的优点,可以在任何地方添加和删除元素,并且通过索引对任一元素访问,不像链表去遍历目标元素之前的所有元素,当元素增加到超过原有空间容量时,SV会自动分配更多空间。队列元素编号0到$。

  • 利用队列函数

                   int j=1,q2[$]={3,4},q{$}={0,2,5};   //声明

                   initial begin

                       q.insert(1,j);               //在2之前插入1

                       q.insert(3,q2);           //在q中插入一个队列

                       q.delete(1)                //删除第1个元素

     

                       q.push_front(6);  //在队列最前面插入6

                       q.push_back(8);  //在队列最后面插入8

                       j=q.pop_back();  //取出队列最后面的数并赋值给j

                       j=q.pop_front();  //取出队列最前面的数并赋值给j

                       foreach(q[i])       //打印队列

                              $display(q[i]);

                       q.delete();

                       end

  • 利用队列 *** 作

                    int j=1,q2[$]={3,4},q[$]={0,2,5};

                    initial begin

                    q={q[0],j,q[1:$]}; //利用队列

                    q={q[0],q[2:$]);

                    q={6,q};

                     j = q[$];             //等同于取最后一个

                     q=q[0:$-1]        //从队伍末尾取出所有数据赋值给q

                     q={q,8};            //在队伍末尾插入数据

                     q={};                 //删除整个队列

                     end

注意:$放在范围表达式左边表示最小值,放在右边表示最大值。


四、关联数组

动态数组的限制在于其储存空间在一开始就被固定下来,关联数组可以用来保存稀疏矩阵的元素,该数组只为实际写入的元素分配空间。

initial begin

       bit[63:0] assoc[bit[63:0]], idx=1;       //索引类型

              repeat(64)begin                        //对稀疏分布的元素初始化

              assoc[idx]=idx;

              idx=idx<<1;

              end

              foreach(assoc[i])  //使用foreach遍历数组,i不一定是1,2,4,8 顺序可能会变

五、结构体 struct

Struct功能较少,只是一个数据的集合,通常适用的方式是将若干相关的变量组合到一个struct结构定义中,伴随typedef可以用来创建新的类型,并利用新类型声明更多变量。

        typedef struct {int a;byte b;shortint c;int d;}my_struct_s;  //创建有四个成员变量的结构体

        my_struct_s st;                                                              //声明变量

        st='{32'haaa_aaaad, 8'hbb,16'hcccc, 32'hdddd_dddd};   //结构体赋值

        my_struct_s st='{32'haaa_aaaad, 8'hbb,16'hcccc, 32'hdddd_dddd}; //声明变量并结构体赋值

注意:数据非连续存放用“单引号”

六、枚举类型enum

规范的 *** 作码和指令例如ADD、WRITE等有利于代码的编写和维护,它比直接使用’h01可读性和维护性更好。枚举类型enum经常和typedef搭配使用,便于用户自定义枚举类型的共享使用。枚举类型可以自动为列表中的每个名称分配不同的数值。

        Typedef enum {INIT,DECODE,IDLE} fsmstate_e;  //创建代表0,1,2的数据类型

        fsmstate_e pastate,nstate;                                     //声明自定义类型变量

        initial begin

               case(pastate)

                      IDLE: nstate=INIT;                                    //数据赋值

                      INIT: nstate =DECODE;

                      default:nstate= IDLE;

                endcase

        end

注意: INIT=enum 右侧是枚举类型,可以赋值给整型,enum=T’(INT) 右侧是整型,要先转化成枚举类型,因为例如上面的fsmstate_e,当整数为3,4,5等无法赋值给nstate,编译失败。

七、字符串 字符串声明string s

                string s;                                          //声明

                initial begin

                       s="IEEE ";                               //初始化

                       $display(s.getc(0));                 //I

                       s.putc(s.len()-1,"-"); //将最后一个元素“一个空格”变成“-”  //字符串用len()表示长度

                       s={s,"P1800"};    //链接字符   IEEE-P1800

                       $display(s.substr(2,5));  //显示EE-P

                 end

                task my_log(string message);          //传入一个字符串变量

                              $display("@%0t:%s",$time,message);

                endtask

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/875365.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-13
下一篇 2022-05-13

发表评论

登录后才能评论

评论列表(0条)

保存