程序员求职经验分享与学习资料整理平台

网站首页 > 文章精选 正文

System Verilog与功能验证之数据类型

balukai 2025-01-05 15:42:17 文章精选 17 ℃

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 use_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代表第一个成员,$代表最后一个成员。队列是一个一维的非压缩数组,它可以自动地增长和缩减。队列适合于实现FIFO和堆栈之类的数据结构。

队列的定义:

data_type queue_name[$];

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;

最近发表
标签列表