目录
一、内建数据类型
二、定宽数组
三、动态数组
五、关联数组
六、结构体
七、枚举类型
八、字符串类型
相关问题
一、内建数据类型
verilog:reg、wire、tri、interger、time、real、realtime、parameter
systemverilog:logic、bit、byte、shortint、int、longint
systemverilog新的数据类型特点:
1.新增加了logic类型,可以被连续赋值语句、门单位和模块驱动,但要求不能有多个结构性的驱动(如inout 此时只能使用wire变量,可以把变量都设置成logic,查找网单中多驱动错误)
2.新增加了双状态数据类型,具有更好的性能和更低的内存消耗:bit、byte、shortint、int、longint
分类:
按照有无符号分类:
无符号 | 有符号 |
bit、logic、reg、wire、time | byte、shortint、int、longint、interger、real |
按照四值逻辑和二值逻辑分类:
二值逻辑 | 四值逻辑 |
bit、byte、shortint、int、longint、real、realtime | reg、wire、interger、logic、time |
各个数据类型默认位数:
数据类型 | 位数 |
bit、reg、wire、logic | 1 |
byte | 8 |
shortint | 16 |
int、interger | 32 |
longint、time、real、realtime | 64 |
二、定宽数组
声明定宽数组:int array [0:15] 或int array[16]
为数组赋值: array = '{1,2,3} //为前三个元素赋值为1、2、3
数组的基本操作:for和foreach
initial begin
int array[15];
for(i=0;i < $size(array);i++) //$size返回数组宽度
array[i] = i ; //遍历数组赋值
end
initial begin
int array_1[15];
foreach(array_1[i])
array[i] = i+1; //遍历数组赋值,更简短。
end
数组的基本操作:赋值和比较
initial begin
bit [31:0] a_array[5] = '{1,3,5,7,9};
bit [31:0] b_array[5];
b_array = a_array; //赋值:非合并数组的赋值维度需要一样
if(b_array == a_array) //对比
$display("compare success");
end
合并数组和非合并数组:
合并数组格式: bit [3:0][7:0] packed_array ; //声明在变量名左边,格式必须为[msb:lsb] 大小为1word
非合并数组格式:bit [7:0] packed_array [3:0];
合并数组和非合并数组之间不能相互赋值
三、动态数组
声明动态数组:int dyn_array[]
动态数组和定宽数组的区别:
1.定宽数组在编译时其宽度已经确定,定宽数组需要new[]操作符分配空间后才分配空间。
2.定宽数组的实际存储量可能远小于定宽数组造成资源浪费,动态数组可以自由分配空间。
bit [31:0] dyn_array[]; //动态数组声明
initial begin
dyn_array = new[7]; //分配7个元素
foreach(dyn_array[i])
dyn_array[i] = i;
dyn_array = new[8](dyn_array); //分配并进行复制
end
四、队列
队列声明:q[$] = {1,2,3} // 不需要', 不需要new[]
队列优点:
1.可以在任何一个地方增加或删除元素,这类操作在性能上的损失比动态数组小得多,因为动态数组需要分配新的数组并复制所有元素的值。
2.提供一系列关于队列的方法。
队列方法:
int j = 4;
q[$] = {1,2,3};
intial begin
q.insert(1,j); //在2前面插入4 {1,4,2,3}
q.push_back(7); //队尾插入7 {1,4,2,3,7}
j = q.pop_front; //队首弹出 {4,2,3,7}
q.delete(3); //删除第3个元素 {4,2,3}
q.delte(); //删除所有元素
end
五、关联数组
声明关联数组:bit [31:0] assco [int]
关联数组优点:
可以用来保存稀疏矩阵的元素。当对一个非常大的地址空间寻址时,该数组只为写入的元素分配空间,类似python中的字典。
bit [63:0] assoc[int],index = 1;
initial begin
repeat(32) begin
assoc[index] = index; //初始化
index = index << 1;
end
foreach(assoc[i])
$display("assoc[%h] = %h",i,assoc[i]); //遍历数组
if(assoc.first(index)) begin //得到第一个索引
do
$display("assoc[%h] = %h",index,assoc[index]);
while(assoc.next(index)) //得到下一个索引
end
//找到并删除第一个元素
assoc.first(index);
assoc.delete(index);
end
六、结构体
结构体格式:struct {bit[7:0] r, g,b} pixel;
结构体优点:可以自己定义一些数据结构。
一般通过typedef 来创建新类型,并用新类型来声明更多变量:
typedef struct {bit[7:0] r, g,b} pixel;
pixel pixel_a pixel_b; //声明两个结构体变量
pixel_a = '{'d1,'d2,'d3}; //结构体类型的赋值
七、枚举类型
枚举类型定义:typedef enum {INIT,DECODE,IDLE} fsmstate_e;
枚举类型优点:可读性更强,利于代码的维护和编写。
枚举类型默认以int 类型存储,缺省为从0开始递增的整数。
typedef enum {INIT=1,DECODE,IDLE} fsmstate_e;
fsmstate_e error_state ; //默认缺省值为0,这不是一个合法的fsmstate_e 变量
typedef enum {INIT=0,DECODE,IDLE} fsmstate_r;
fsmstate_r right_state ; //把0指定给一个枚举常量可以避免这种错误
八、字符串类型
字符串定义:string s;
与字符串相关的操作:
string s;
initial begin
s = "IEEE " ;
$display(s.getc(0)); //显示:73('I')
$display(s.tolower()); //转化为小写ieee
s.putc(s.len()-1,"-"); //空格变成 -
s = {s,"22-7-13"} ; //拼接到一块 IEEE-22-7-13
$display(s.substr(2,5)); //右端能取到 显示为EE-2
my_log($sformatf("%s %5d",s,42)); // 创建临时字符串并打印
end
//打印函数
function my_log(string message);
$display("%0t : %s",$time,message);
endfucntion
相关问题
- 动态数组和queue的区别
- 动态数组需要声明new()来动态开辟空间,queue一开始就开辟空间。
- Queue有队列相应的操作方法,可以在任意位置添加元素,不像而动态数组添加元素需要先开辟空间然后再复制数组消耗较多性能。
2.动态数组和关联数组的区别
- 动态数组需要声明new()来动态开辟空间,关联数组一开始就开辟空间。
- 相比动态数组,对于大范围的地址寻址,而实际写的空间较小时,用动态数组会占用更多资源,动态数组还可以用字符串索引进行寻址。
3.reg wire logic区别
在设计中wire和reg驱动和被驱动的关系往往不好搞清,sv中添加了logic变量,使得他可以被连 续赋值,门单元和模块驱动。任何使用线网的地方均可以使用logic,但要求logic不能有多个结构性的驱动,例如双向总线建模时,此时需要使用线网类型例如wire。
4. inout能用logic吗,为什么
不能,logic不支持双向驱动。