SystemVerilog数组操作
时间:2022-07-22
本文章向大家介绍SystemVerilog数组操作,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
1.非组合型数组
2.组合型数组
3.初始化
4.赋值
5.拷贝
6.foreach循环结构
7.系统函数
1.非组合型数组
reg [15:0] RAM [0:4095] //存储数组
- SV将verilog这种声明数组的方式称为非组合型声明,即数组中的成员之间存储数据都是相互独立的;
(优点:易于查找元素; 缺点:消耗更多存储空间)
- SV保留了非组合型的数组声明方式,并扩展了允许的类型:event、logic、bit、byte、int、longint、shortint和real;
- SV保留了verilog索引非组合型数组或者数组片段的能力,这种方式为数组以及数组片段的拷贝带来了方便;
int a1[7:0] [1023:0] //非组合型数组
int a2[1:8] [1:1024] //非组合型数组
a2=a1; //拷贝整个数组;
a2[3]=a1[0]; //拷贝某个元素或者一个数组片段
- 声明数组的方式,以下两种都可:
logic [31:0] data [1024];
logic [31:0] data [0:1024];
可以指定其内部元素个数或者元素索引值的范围;
2.组合型数组
- SV将Verilog的向量作为组合型数组声明方式;
reg [63:0] data;// 64bit组合型数组
- SV允许多维组合型数组的声明;
logic [3:0] [7:0] data;//2维组合数组 32bit字
组合型数组更节省空间
- 组合型还可以用来定义结构体的存储方式:
typedef struct packWire [3:0] select;//4bit组合型数组
ed {
logic [7:0] crc;
logic [63:0] data;
}data_word;
data_word [7:0] darray;//1位组合型数组,元素也为组合型结构体
- 组合型数组中的元素和片段也可以单独拷贝和赋值;
logic [3:0] [7:0] data;//2维组合型数组
wire [31:0] out=data; //整个数组赋值
wire sign=data[3] [7]; //单个bit
wire [3:0] nib=data[0] [3:0]; //数组片段
byte high_byte;
assign high_byte=data[3] ;//8bit数组片段
logic [15:0] word;
assign word=data[1:0]; //2个数组片段、
3.初始化
- 组合型数组初始化,可以对其所有元素统一赋值;
logic [3:0] [7:0] a=32’h0; //向量赋值
logic [3:0] [7:0] b={16’hz,16’h0}; //连接运算符
logic [3:0] [7:0] c={16{2’b01}}; //复制运算符
- 非组合型数组初始化,需要通过‘{}来对每一个维度的元素分别赋值;
Int d [0:1] [0:3] =’{‘{7,3,0,5},’{2,0,1,6}}; //2*4的2维数组
//d[0] [0]=7
//d[0] [1]=3
//d[0] [2]=0
//d[0] [3]=5
//d[1] [0]=2
//d[1] [1]=0
//d[1] [2]=1
//d[1] [3]=6
4.赋值
- 非组合型数组在初始化时,可以通过‘{}和default关键词对所有元素进行默认赋值;
int a1 [0:7] [0:1023] =’{default:8’h55};
- 非组合型数组的数组成员或者数组本身均可以对其赋值;
byte a[0:3] [0:3];
a[1][0] =8’h5; //为单个元素赋值
a[3]=’{‘hF,’hA,’hC,’hE}; //为数组片段中的所有元素赋值
5.拷贝
- 组合型数组,如果两个数组大小不一样,则会通过截取或者扩展右侧操作数来对左侧操作数赋值;
bit [1:0][15;0] a; //32位2值逻辑向量
logic [3:0] [7:0] b;// 32位4值逻辑向量
logic [15:0] c; //16位4值逻辑向量
logic [39:0] d; //40位4值逻辑向量
b=a; //32位数组赋值给32位数组
c=a; //高16位被截断
d=a; //高8位填充0
- 非组合型数组,数组间拷贝时必须要求左右两侧操作数的维度和大小一致;
logic [31:0] a [2:0] [9:0];
logic [0:31] b [1:3] [1:10];
a=b;//非组合型数组赋值于非合型数组
- 非组合型数组无法直接赋值给组合型数组;组合型数组也无法直接赋值给非组合数组;
6.foreach循环结构
- SV添加foreach循环来对一维或者多维数组进行循环索引,不需要指定该数组的维度大小;
int sum [1:8] [1:3] ;
foreach (sum[i,j]) sum[i][j] =i+j; //数组初始化
- Foreach 循环结构中的变量无需声明;
- Foreach 循环结构中的变量是只读的,作用域只在此循环结构中;
7.系统函数
- $dimensions(array_name) 用来返回数组的维度;
- $left(array_name,dimension)返回指定维度的最左索引值;
logic [1:2] [7:0] word [0:3][4:1];
$left(word,1) will return 0
$left(word,2 will return 4
$left(word,3 will return 1
$left(word,4 will return 7
- 与left()类似,还有{right,low,high} (array_name,dimension);
- $size (array_name,dimension)可以返回指定维度的尺寸大小;
- $increment(array_name,dimension),判断指定维度的最左索引值大于或者等于最右索引值,大于返回1,否则返回-1;
- $bits(expression) 用来返回数组存储的bit数目;
wire [3:0] [7:0] a [0:15] ; //$bits(a) 返回512
struct packed {byte tag; logic [31:0] addr;} b; //$bits(b) 返回40
END
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法