System Verilog与功能验证(二)

1、System Verilog数据类型
System Verilog新增的数据类型:
(1)两态(I/O)数据类型;
(2)枚举类型;
(3)用户自定义类型;
(4)静态数组;
(5)压缩数组;
(6)动态数组;
(7)关联数组;
(8)队列;
(9)字符串;
(10)结构体;
(11)联合体;
(12)常量。
1.1、数据类型
verilog中常用的数据类型:变量reg和网线wire,均为四态数据类型(0、1、X、Z)。变量的存储都是静态的,仿真过程中不能使用堆栈来保持参数和当前值;网线wire用来连接两个设计模块。
两态数据类型,减少仿真器对内存的使用和提高仿真的运行效率,System Verilog中常用的两态数据类型:bit,byte,shortint,int,longint。
1.1.1、按照两态和四态数据类型分类
两态数据类型(1、0),默认值为0:bit-单比特,byte-8位整型有符号数,int-32位整型有符号数,shortint-16位整型有符号数,longint-64位整型有符号数。
四态数据类型(0、1、X、Z),默认值为X:reg-无符号数,logic-无符号数,integer-32位整型有符号数。
1.1.2、其他常用的数据类型及方式
time-64位整数,单位s;
real-64位;
shortreal-32位;
string-可变长度的字符数组;
void-空返回,用于函数;
int转换无符号数:int unsigned using_int;
reg转换有符号数:reg signed sig_reg;
注意:System Verilog引入logic用来代替reg;在双向总线和多驱动的情况下,只能使用wire。
1.2、枚举类型
枚举类型用来声明一组整型的命名常量,定义具有强类型的枚举变量。
例子:枚举类型定义一组具有名字的数值,light1、light2定义成int枚举类型,包含三个成员red/green/blue

   enum{
     red,
     green,
     blue
    }light1,light2;

初始化枚举类型,不能被在枚举集合范围以为的数值直接赋值。
比如:

  initial
     begin
      light1 = red;
      light2 = blue;
     end

1.3、用户自定义类型
System Verilog中,通过使用typedef关键字进行用户自定义类型的扩展。
例子:定义LED color enum,logic [2:0] color_t,其中[2]-red,[1]-green,[0]-blue

parameter LED_WIDTH = 3;
typedf enum logic[LED_WIDTH-1:0]{
    LED_OFF      = 3'b111,
    LED_RED      = 3'b011,
    LED_GREEN    = 3'b101,
    LED_BLUE     = 3'b110
}color_t;
color_t user_color_t;
initial
 begin
  //两种初始化方式
  use_color_t = LED_OFF;
  use_color_t = color_t'(1); //通过color_t数据类型标识符做类型转换
 end

1.4、静态数组和压缩数组
静态数组是指其数组的大小在定义时被显性地指定。
System Verilog引入两种类型的数组:压缩数组和非压缩数组。
压缩数组:维数的定义在变量标识符之前;
非压缩数组:维数的定义在变量标识符之后;
例子:
bit [07:00] i; //压缩数组(比特类型)
real j [07:00]; //非压缩数组(实型)
bit [03:00] [07:00] reg_32;//4个字节压缩为32bits的向量
在这里插入图片描述
bit [03:00] [07:00] mix_array [3];//3个非压缩的数组(每个数组由4个字节压缩为32bits的向量)
在这里插入图片描述
1.5、动态数组
System Verilog提供了动态数组,可以在仿真的过程中动态分配大小。
动态数组的声明语法:
data_type array_name[];
[]表示编译时未指定数组的大小,在运行时可以动态分配。使用前必须通过调用new[],并在[]中输入期望的长度数值来分配空间。foreach会自动遍历数值中的元素。
例子:

   int dyn1[],dyn2[];//声明两个动态数组dyn1和dyn2
    initial
     begin
      dyn1 = new[50]; //给动态数组分配50个成员
      foreach(dyn1[i]) //初始化动态数组
       begin

        dyn1[i] = i;
       end
      dyn2 = new[50](dyn1); //复制dyn1数组至dyn2
      dyn2[10] = 1; //修改动态数组[10]数值为1
     end

1.6、关联数组
关联数组是一种通过标号来分配空间和访问的数组,可以精确分配至使用的特定地址。
例子:关联数组只分配0-5、45、1000、4531和200000地址的数值。
在这里插入图片描述
关联数组实现了一个所声明类型成员的查找表,用索引的数据类型作为查找表的查找值,并强制其排列顺序。
关联数组的声明语法:
data_type array_id[index_type];
data_type-数组成员的数据类型;
array_id-关联数组的变量名;
index_type-用做索引的数据类型或者是*
例子:

integer array_a [*]; //整型关联数组,未指定索引类型
bit [20:00] array_b [string]; //21比特向量的关联数组,索引为字符串

1.7、队列
队列是一个大小可变,具有相同数据类型成员额有序集合。队列能够在固定时间内访问它的所有元素,也能够在固定时间内对队列的尾部和头部插入和删除成员。队列中的每一个成员都通过一个序号来标识,0代表第一个成员, 代表最后一个成员。队列是一个一维的非压缩数组,它可以自动地增长和缩减。队列适合于实现 F I F O 和堆栈之类的数据结构。队列的定义: d a t a t y p e q u e u e n a m e [ 代表最后一个成员。队列是一个一维的非压缩数组,它可以自动地增长和缩减。队列适合于实现FIFO和堆栈之类的数据结构。 队列的定义: data_type queue_name[ 代表最后一个成员。队列是一个一维的非压缩数组,它可以自动地增长和缩减。队列适合于实现FIFO和堆栈之类的数据结构。队列的定义:datatypequeuename[];
data_type queue_name[$:maxsize];
例子:

  byte q1[$]; //字节队列
    string names[$] = ["Moonin"]; //字符串队列
    integer q[$] = {3,2,7}; //初始化整型队列
    bit q2[$:255]; //最大长度为256的比特队列

1.8、字符串
System Verilog引入一个字符串类型(string),它是一个大小可变、动态分配的字节数组。
字符串类型变量的声明语法
string varialbe_name[=initial_value];
string my_name = “Moonin”;
1.8、结构体和联合体
System Verilog提供结构体(struct)和联合体(union),结构体中的成员被连续地存储,联合体的所有成员共享同一片存储空间,联合体中最大成员的空间。
通过packed关键字,构成压缩结构体。压缩结构体的所有成员在存储器中被无缝地压缩在一起,一个压缩体结构可以当做一个整体使用,第一个指定的成员为最高位,后续的成员以降序排列。
例子:

   //结构体实例
    typedef struct{
     bit [07:00] my_byte;
     int my_data;
     real p;
    }struct_t;
    initial begin
     struct_t.my_byte = 8'hff;
     struct_t = '{ff,10,3.5};
    end
    //自定义联合体实例
    typedef union{
     int i;
     shortreal f;
    }num;
    //自定义压缩结构体
    typedef struct packed{
     bit [07:00] my_byte;
      int my_data;
      real p;    
    }struct_t;

1.9、常量
System Verilog四种常量参数,parameter,localparam,specparam,const。
specparam延时参数只能在延时说明块中出现,只能定义延时参数。
例子:
parameter depth_array = 8;
localparam width = 8;
specparam delay = 10;
const logic flag = 1;

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小灰灰的FPGA

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值