数组声明

非组合型(unpacked)

特点:消耗更多的存储空间,但是更易于查找元素 

对于Verilog,数组经常会被用来做数据存储,例如

reg [15:0] RAM [0:4095] ;//存储数组

SV将Verilog这种声明数组的方式称之为非组合型声明即数组中的成员之间存储数据都是互相独立的。
Verilog也不会指定软件去如何存储数组中的成员。

wire [7:0] table [3:0];

SV保留了非组合型的数组声明方式,并且扩展了允许的类型,包括event,logic,bit,byte,int,longint,shortreal和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:1023];//指定元素索引值范围

组合型(packed)

优点:与非组合型相比,更节省空间 

SV将Verilog的向量作为组合型数组声明方式

wire [3:0] select; // 4比特的组合型数组
reg [63:0] data; //64比特的组合型数组
//组合型数组,该数组的每一个元素均为1比特

SV也进一步允许多维组合型数组的声明

logic [3:0][7:0] data; //2维组合数组
//索引范围声明在左侧
//数组的维度,从左到右来识别

 定义结构体的存储方式

组合型(packed)除了可以运用的数组声明,也可以用来定义结构体的存储方式

typedef struct packed {
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];//单个比特
wire [3:0] nib = data [0][3:0];//数组片段byte high_byte;
assign high_byte = data[3]; // 8比特的数组片段logic [15:0] word;
assign word = data[1:0];// 2个数组片段

数组操作

初始化

 组合型(packed)数组

组合型(packed)数组初始化时,同向量初始化一致:

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}} ; //复制运算符

非组合型(unpacked)数组

非组合型(unpacked)数组初始化时,则需要通过’{ }来对数组的每一个维度进行赋值。

int d [0:1][0:3]= ’ { ’{7,3,0,5},’{2,0,1,6} };
//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

赋值

 非组合型数组

非组合型数组在初始化时,也可以类似结构体初始化,通过’{ }和default关键词即可以完成

int a1 [0: 7][0:1023]= ’ {default:8’h55} ;

非组合型数组的数据成员或者数组本身均可以为其赋值

byte a [0:3]10:3];
a[1][0] =8’h5;//为单个元素赋值
a[3] = ’{’hF, ’ hA, ’ hC, ’ hE};//给数组片段中的所有元素进行赋值

组合型数组

以下是组合型数组的赋值方法

logic [1:0][1:0][7:0] a; //3维数组
a[1][1][0] = 1’b0; // 为1比特赋值
a = 32’hF1A3C5E7;//给整个数组赋值
a[1][0][3:0] =4’hF; //给一个数组片段赋值
a[0] = 16’hFACE;//给一个数组片段赋值
a = {16’bz,16’b0} ; //通过连接运算符赋值

拷贝

组合型数组

对于组合型数组,由于数组会被视为向量,因此当赋值左右两侧操作数的大小和维度不相同时,也可以做赋值
        如果当尺寸不相同时,则会通过截取或者扩展右侧操作数的方式来对左侧操作数赋值。

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; //非组合型数组赋值于非组合型数组

非组合型数组无法直接赋值给组合型数组,同样地,组合型数组也无法直接赋值给非组合型数组。

foreach循环结构

SV添加foreach循环来对一维或者多维数组进行循环索引,而不需要指定该数组的维度大小。

int sum [1:8] [1:3];
foreach ( sum[i,j] ) sum[i][j] = i +j; //数组初始化

foreach循环结构特点: 

  • foreach循环结构中的变量无需声明
  • foreach循环结构中的变量是只读的,其作用域只在此循环结构中

系统函数

$dimensions(array_name)//用来返回数组的维度。
$left(array_name,dimension)//返回指定维度的最左索引值(msb)
$right(array_name,dimension)
$low(array_name,dimension)
$high(array_name,dimension)$size(array_name,dimension)//可以返回指定维度的尺寸大小。
$increment(array_name,dimension)//如果指定维度的最左索引值大于或等于最右索引值,那么返回1,否则返回-1。
$bits(expression)//可以用来返回数组存储的比特数目。

举例: 

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
wire [3:0][7:0] a [0:15];// $bits(a)返回512
struct packed {[byte tag; logic [31:0] addr;} b;// $bits(b)返回40

【路科V0】systemVerilog基础5——数组声明与数组操作相关推荐

  1. 【路科V0】systemVerilog基础11——随机变量

    概述 随着设计变得越来越大,要产生一个完整的激励来测试设计的功能也变得越来越困难. 定向激励的测试方法早已经无法满足检查功能完整性的要求. SoC的集成度提高带来的模块之间交互的复杂度也是指数攀升,这 ...

  2. java中 数组声明,java数组声明格式

    java 声明动态数组,java对象数组详解,java中声明数组,java数组声明格式 Java 中数组的声明一维数组的声明: 在 Java 中,数组是独立的对象,有自身的方法,不是变量的集合. 数组 ...

  3. java合法的数组声明_Java数组详解

    Java数组详解 数组详解 1.数组概述 数组是相同类型数据的有序集合 每一个数据称作一个数组元素,每个数组元素可以通过一个下标来访问它们 2.数组声明和创建 ①数组声明形式 dataType[] a ...

  4. Go 学习笔记(10)— 数组定义、数组声明、数组初始化、访问数组、数组相等、向函数传递数组

    1. 数组定义 数组是具有相同唯一类型的一组已编号且长度固定的数据项序列,这种类型可以是任意的原始类型例如整形.字符串或者自定义类型. 2. 声明数组 Go 语言数组声明需要指定元素类型及元素个数,语 ...

  5. 【路科V0】systemVerilog基础3——字符串类型

      Verilog语言对于字符串的处理手段非常有限.SV引入了string类型用来容纳可变长度的字符串.  SV中字符串的特点: 字符串类型变量的存储单元为byte类型( 8位二值逻辑). 字符串类型 ...

  6. 【路科V0】验证环境1——验证环境结构

    验证环境结构 测试平台(testbench)是整个验证系统的总称. 它包括验证结构中的各个组件.组件之间的连接关系.测试平台的配置和控制. 从更系统的意义来讲,它还包括编译仿真的流程.结果分析报告和覆 ...

  7. c# 2维数组 取一维_C#| 不同类型的一维数组声明

    c# 2维数组 取一维 In the below example, we are declaring an integer array (one dimensional) with following ...

  8. 数组: 数组的遍历: 二维数组: 二维数组的遍历方式:

    数组:   变量: 存储单个数据 数组: 存储多个数据数组: 相同数据类型的有序集合一段连续的内存空间特点:1.引用数据类型2.长度一旦确定不可改变3.存储的多个数据要求数据类型一致4.数组是有序的索 ...

  9. Golang基础(变量[普通变量、数组、切片、map、list、ring]声明及赋值)

    Go语言和其他语言一样都有基本存储容器.可以存储一个或多个值在程序中,方便程序中多次使用容器中内容,这个容器称为:变量 Go语言虽然是静态类型语言,但是支持动态类型语言语法,因为Go语言希望程序员少声 ...

最新文章

  1. 信号与系统课程向学校教务科需要提交的资料
  2. 通过浏览器navigator判断浏览器版本或者手机类型判断微信访问
  3. vb.net机房收费系统重构——存储过程的使用
  4. Oracle 数据库表空间不足拓展方法实例演示,表空间剩余大小查看,通过新增表空间文件拓展表空间,表空间文件路径查看
  5. 字符串的构造方法和直接创建
  6. dotNet Core 3.1 使用 Aspose (部署 Docker)
  7. 牛客网 【每日一题】4月10日 二分图染色(弱化版)
  8. python3.6sysos_求大佬,这是什么情况啊
  9. 京东金融以支付开启出海之旅,未来或拓展至消费金融
  10. CSDN上传资源时一直提示 请填写资源tag
  11. linux下内存的统计和内存泄露问题的定位-转
  12. 【转载】合理规划您的硬盘分区
  13. Creational.Builder建造者模式:构造流程和具体实现的分离
  14. lzg_ad:下载资料必读
  15. python工程师认证证书报考条件_Python工程师需要具备什么条件
  16. Linux中rar解压软件
  17. 15分钟看完:悉尼科技大学入选 CVPR 2021 的 9 篇论文,都研究什么?
  18. USB 中MTP和UMS 模式
  19. ​LeetCode刷题实战584:寻找用户推荐人
  20. 8139网卡刷MAC

热门文章

  1. 夯实Java基础系列17:一文搞懂Java多线程使用方式、实现原理以及常见面试题
  2. Word公式的对齐和换行
  3. 当前时间转换为yy-mm-dd hh:mm:ss格式
  4. 大神Linus Torvalds语录
  5. Win10提示0xc004f074
  6. js最简单数组去重_js数组去重最常用的5种方法
  7. 梦想十年--《程序员》十年感想
  8. 斯特林公式(Stirling's approximation)—对n!进行估值
  9. 台式计算机配置参数,整机配置参数以及性能测试_台式电脑评测-中关村在线
  10. JavaScript构造函数, 实例和静态成员