SystemVerilog验证测试平台

2.2定宽数组

        相比于 Verilog1995中的一维定宽数组, System verilog提供了更加多样的数组类型,功能上也大大增强。

2.2.1定宽数组的声明和初始化

        Verilog要求在声明中必须给出数组的上下界。因为几乎所有数组都使用0作为索引下界,所以 System verilog允许只给出数组宽度的便捷声明方式,跟C语言类似。
例2.4定宽数组的声明

int lo_hi[0:15];//16个整数[0] ... [15]
int c_style[16];//16个整数[0] ...[15]

        可以通过在变量名后面指定维度的方式来创建多维定宽数组。例2.5创建了几个ニ维的整数数组,大小都是8行4列,最后一个元素的值被设置为1。多维数组在 Verilog2001中已经引人,但这种紧凑型声明方式却是新的。
例2.5声明并使用多维数组

int array2[0:7][0:3] ;//完整的声明
int array3[8][4]; //紧凑的声明
array2[7][3]=1;  //设置最后一个元素

        如果你的代码试图从一个越界的地址中读取数据,那么 System Verilog将返回数组元素类型的缺省值。也就是说,对于一个元素为四状态类型的数组,例如logic,返回的是X,而对于双状态类型例如int或bit,则返回0。这适用于所有数组类型,包括定宽数组、动态数组、关联数组和队列,也同时适用于地址中含有X或Z的情况。线网在没有驱动的时候输出是Z。
        很多 System Verilog仿真器在存放数组元素时使用32比特的字边界,所以byte,shorting和int都是存放在一个字中,而longint则存放到两个字中。如例2.6所示,在非合并数组中,字的低位用来存放数据,高位则不使用。图2.1所示的字节数组 b_unpack被存放到三个字的空间里。
例2.6非合并数组的声明

bit [7:0] b_unpack[3];//非合并数组


        非合并数组会在2.2.6节中介绍。仿真器通常使用两个或两个以上连续的字来存放logic和 integer等四状态类型,这会比存放双状态变量多占用一倍的空间。

2.2.2常量数组

        例2.7示范了如何使用常量数组,即一个单引号加大括号来初始化数组(注意这里的单引号并不同于编译器指引或宏定义中的单引号)。你可以一次性地为数组的部分或所有元素赋值。在大括号前标上重复次数可以对多个元素重复赋值,还可以为那些没有显式赋值的元素指定一个缺省值。
例2.7初始化一个数组

int ascend[4]='{0,1,2,3};//对4个元素进行初始化
int descend[5];descend='{4,3,2,1,0};//为5个元素赋值
descend[0:2] ='{5,6,7};//为前3个元素赋值
ascend='{4{8}};  //4个值全部为8
descend='{9,8,default:1};//{9,8,1,1,1}

2.2.3基本的数组操作——fox和foreach

        操作数组的最常见的方式是使用for或 foreach循环。在例2.8中,i被声明为for循环内的局部变量。 System Verilog的 ssize函数返回数组的宽度。在 foreach循环中,只需要指定数组名并在其后面的方括号中给出索引变量, System verilog便会自动遍历数组中的元素。索引变量将自动声明,并只在循环内有效。
例2.8在数组操作中使用for和 foreach循环

initial 
beginbit [31:0] src[5],dst[5];for (int i=0;i<$size(src);i++)src[i]=i;foreach (dst[j])dst[j]=src[j]*2;//dst的值是src的两倍end

        注意在例29中,对多维数组使用 foreach的语法可能会与你设想的有所不同。使用时并不是像[i][j]这样把每个下标分别列在不同的方括号里,而是用逗号隔开后放在同一个方括号里,像[i,j]。
例2.9初始化并遍历多维数组

int md[2][3]='{'{0,1,2},'{3,4,5}};
initial begin$display("initial value:");foreach(md[i,j]);//这是正确的语法格式$display("md[%0d][%0d]=%d",i,j,md[i][j]);$display("new value ");//对最后三个元素重复赋值5md='{'{9,8,7},'{3{32'd5}}};foreach (md[i,j])//这是正确的语法格式$display("md[%0d][%0d]=%0d",i,j,md[i][j]);end

例2.9的输出结果如例2.10所示。
例2.10多维数组元素值的打印输出结果

initial value:
md[0][0]=0
md[0][1]=1
md[0][2]=2
md[1][0]=3
md[1][2]=4
md[1][3]=5new value :
md[0][0]=9
md[0][1]=8
md[0][2]=7
md[1][0]=5
md[1][1]=5
md[1][2]=5

        如果你不需要遍历数组中的所有维度,可以在 foreach循环里忽略掉它们。例2.11把一个二维数组打印成一个方形的阵列。它在外层循环中遍历第一个维度,然后在内层循环中遍历第二个维度。例2.11打印一个多维数组。

initial beginbyte twoD[4][6];foreach(twoD[i,j])twoD[i][j]=i*10 +j;foreach (twoD[i])  //遍历第一个维度begin$write("%2d:",i);foreach(twoD[,j])//遍历第二个维度$write("%3d",twoD[i][j]);$display;end
end		

例2.11的输出结果如例2.12所示例2.12打印多维数组的输出结果
0:   0 1 2 3 4 5
1:10 11 12 13 14 15
2: 20 21 22 23 24 25
3: 30 31 32 33 34 35
        最后要补充的是, foreach循环会遍历原始声明中的数组范围。数组f[5]等同于f[0:4],而 foreach(f[i])等同于for(inti=0;i<=4;i++)。对于数组rev[6:2]来说,foreach(rev[i])语句等同于for(inti=6;i>=2;i--)。

2.2.4基本的数组操作ー一复制和比较

        你可以在不使用循环的情况下对数组进行聚合比较和复制(聚合操作适用于整个数组而不是单个元素),其中比较只限于等于比较或不等于比较。例2.13列出了几个比较的例子。操作符?:是一个袖珍型的if语句,在例2.13中用来对两个字符串进行选择。例子最后的比较语句使用了数组的一部分,src[1:4],它实际上产生了一个有四个元素的临时数组。
例2.13数组的复制和比较操作

initial beginbit [31:0] src[5]='{0,1,2,3,4},dst[5]='{5,4,3,2,1};//两个数组的聚合比较if(src==dst)$display("src==dst");else$display("src!=dst");//把src所有元素赋值给dstdst=src;//只改变一个元素的值src[0]=5;//所有元素的值是否相等(否!)$display("src %s dst",(src==dst));//使用数组片段对第1——4个元素进行比较$display("src[1:4] $s dst[1:4]",(src[1:4]==dst[1:4]?"==":"!="));end

        对数组的算术运算不能使用聚合操作,而应该使用循环,例如加法等运算。对于逻辑运算,例如异或等运算,只能使用循环或2.2.6节中描述的合并数组。

2.2.5同时使用位下标和数组下标

        在Verilog1995中一个很不方便的地方就是数组下标和位下标不能同时使用。 Verilog2001对定宽数组取消了这个限制。例2.14打印出数组的第一个元素(二进制101)、它的最低位(1)以及紧接的高两位(二进制10)。
例2.14同时使用数组下标和位下标

initial begin
bit [31:0] src[5]='{5{5}};
$display(src[0], , //'b101或'd5src[0][0], 	//'b1, src[0][2:1]);	//'b10end

        虽然这个变化并不是 Systemverilog新增加的,但可能有很多使用者并不知道Verilog-2001中的这个有用的改进。​​​​​​​

2.2.6合并数组

        对某些数据类型,你可能希望既可以把它作为一个整体来访问,也可以把它分解成更小的单元。例如,有一个32比特的寄存器,有时候希望把它看成四个8比特的数据,有时候则希望把它看成单个的无符号数据。 System Verilog的合并数组就可以实现这个功能,它既可以用作数组,也可以当成单独的数据。与非合并数组不同的是,它的存放方式是连续的比特集合,中间没有任何闲置的空间。

2.2.7合并数组的例子

        声明合并数组时,合并的位和数组大小作为数据类型的一部分必须在变量名前面指定。数组大小定义的格式必须是[msb:lsb],而不是[size]。例2.15中的变量 bytes是一个有4个字节的合并数组,使用单独的32比特的字来存放,如图2.2所示。
例2.15合并数组的声明和用法

bit [3:0] [7:0] bytes;//4个字节组成32比特
bytes=32'hCafe_Dada;$display(bytes , , //显示所有的32比特bytes[3], , //最高的字节"CA"bytes[3][7]);//最高比特位"1"


        合并和非合并数组可以混合使用。你可能会使用数组来表示存储单元,这些单元可以按比特、字节或长字的方式进行存取。在例2.16中, barry是一个具有3个合并元素的非合并数组。​​​​​​​
 例2.16合并/非合并混合数组的声明

bit [3:0][7:0] barray[3];//合并:3*32比特
bit [31:0] lw=32'0123_4567;//字
bit [7:0] [3:0] nibbles;//合并数组
barray[0]=lw;
barray[0][3]=8'h01;
barry[0][1][6]=1'b1;
nibbles=barray[0];//赋值合并数组的元素值

        例2.15中的变量 bytes是一个具有4个字节的合并数组,以单字形式存放。 barray则是一个具有3个类似 bytes元素的数组,其存放形式如图2.3所示。​​​​​​​

        使用一个下标,可以得到一个字的数据 barray[2]。使用两个下标,可以得到一个字节的数据 barray[3]。使用三个下标,可以访问到单个比特位 barray[6]。注意数组声明中在变量名后面指定了数组的大小, barray[3],这个维度是非合并的,所以在使用该数组时至少要有一个下标。
        例2.16中的最后一行在两个合并数组间实现复制。由于操作是以比特为单位进行的,所以即使数组维度不同也可以进行复制。

2.2.8合并数组和非合并数组的选择

        究竟应该选择合并数组还是非合并数组呢?当你需要和标量进行相互转换时,使用合并数组会非常方便。例如,你可能需要以字节或字为单位对存储单元进行操作。图2.3中所示的 barry可以满足这一要求。任何数组类型都可以合并,包括动态数组、队列和关联数组,2.3~2.5节中会有进一步的介绍。
        如果你需要等待数组中的变化,则必须使用合并数组。当测试平台需要通过存储器数据的变化来唤醒时,你会想到使用操作符。但这个操作符只能用于标量或者合并数组。在例2.16中,你可以把lw和 barray[0]用作敏感信号,但却不能用整个的 barra数组除非把它扩展成:@( barray[0] or barray[1] or barray[2])。
 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/632150.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

numpy中数组的操作

目录 一&#xff1a;数组的属性 二&#xff1a;翻转数组 三&#xff1a;数组的计算 一&#xff1a;数组的属性 NumPy 数组&#xff08;通常称为 ndarray&#xff09;有许多有用的属性&#xff0c;这些属性可以帮助你了解数组的各个方面。以下是一些主要的属性&#xff1a; …

数据库MySQL----索引及视图

学生表&#xff1a;Student (Sno, Sname, Ssex , Sage, Sdept) 学号&#xff0c;姓名&#xff0c;性别&#xff0c;年龄&#xff0c;所在系 Sno为主键 课程表&#xff1a;Course (Cno, Cname,) 课程号&#xff0c;课程名 Cno为主键 学生选课表&#xff1a;SC (Sno, Cno, Score)…

使用Portainer创建Nginx容器并部署本地网站结合内网穿透实现公网访问

文章目录 前言1. 安装Portainer1.1 访问Portainer Web界面 2. 使用Portainer创建Nginx容器3. 将Web静态站点实现公网访问4. 配置Web站点公网访问地址4.1公网访问Web站点 5. 固定Web静态站点公网地址6. 固定公网地址访问Web静态站点 前言 Portainer是一个开源的Docker轻量级可视…

postman后端测试时invalid token报错+token失效报错解决方案

报错信息1{“msg”:“invalid token”,“code”:401} 没有添加postman的token信息 报错信息2{“msg”: “token失效&#xff0c;请重新登录”,“code”: 401} 写了token但是token信息写的是错的,会提示token失效 解决方案如下 仅写完后端的查询,但是前端还没写的时候,可…

200SMART作为智能控制器和智能设备使用

200SMART固件版本在V2.5以上的标准型CPU都支持PROFINET IO控制器和IO设备使用。 S7-200SMART作为智能设备仅支持1个IO控制器&#xff0c;可配置的输入输出存储区都为128个字节&#xff0c;地址范围分别为I(Q)1152.0到I(Q)1279.7;每个CPU支持最多8个PROFINET IO设备&#xff0c…

Rust之构建命令行程序(三):重构改进模块化和错误处理

开发环境 Windows 10Rust 1.74.1 VS Code 1.85.1 项目工程 这次创建了新的工程minigrep. 重构改进模块化和错误处理 为了改进我们的程序&#xff0c;我们将修复与程序结构及其处理潜在错误的方式有关的四个问题。首先&#xff0c;我们的main函数现在执行两项任务:解析参数和…

adb、monkey的下载和安装

adb下载 官网网址&#xff1a;Downloads - ADB Shell 尽量不要下载最新的ADB Kits&#xff0c;因为兼容性可能不太好。 点击下载 ADB Kits 作者下载的版本是1.0.36 解压adb 到指定的目录即可。 然后把adb配置 环境变量。 检查adb是否安装成功

Git学习笔记(第1章):Git概述

Git是一个免费的、开源的分布式版本控制系统&#xff0c;可以快速高效地处理从小型到大型的各种项目。 Git易于学习&#xff0c;占地面积小&#xff0c;性能极快。它具有廉价的本地库&#xff0c;方便的暂存区域和多个工作流分支等特性。其性能优于Subversion、CVS、Perforce 和…

常见的系统性能指标:QPS、TPS

&#x1f339;作者主页&#xff1a;青花锁 &#x1f339;简介&#xff1a;Java领域优质创作者&#x1f3c6;、Java微服务架构公号作者&#x1f604; &#x1f339;简历模板、学习资料、面试题库、技术互助 &#x1f339;文末获取联系方式 &#x1f4dd; 系列专栏目录 [Java项目…

华为设备NAT的配置

实现内网外网地址转换 静态转换 AR1&#xff1a; sys int g0/0/0 ip add 192.168.10.254 24 int g0/0/1 ip add 22.33.44.55 24 //静态转换 nat static global 22.33.44.56 inside 192.168.10.1 动态转换 最多有两台主机同时访问外网 AR1&#xff1a; sys int g0/0/0 ip add…

享元模式介绍

目录 一、享元模式介绍 1.1 享元模式定义 1.2 享元模式原理 1.2.1 享元模式类图 1.2.2 模式角色说明 1.2.3 示例代码 二、享元模式的应用 2.1 需求说明 2.2 需求实现 2.2.1 类图 2.2.2 具体实现 2.2.2.1 抽象享元类 2.2.2.2 共享享元类-白色棋子 2.2.2.3 共享享元…

计算机网络——运输层(1)暨小程送书

计算机网络——运输层&#xff08;1&#xff09;暨小程送书 小程一言专栏链接: [link](http://t.csdnimg.cn/ZUTXU) 运输层概述两个主要协议运输层和网络层的关系网络层运输层总结 多路复用与多路分解多路复用多路分解不同的技术实现时分复用&#xff08;TDM&#xff09;频分复…

[STM32F407ZET6] GPIO

GPIO模式 F4的GPIO功能比F1的功能更多一些, 但是整体框架一样. F4的输出配置和F1的不同, F4的配置后, 施密特触发器将会开启, 还会对输入寄存器进行采样读取. F1的配置后, 推挽输出将会关闭施密特触发器, 开漏模式读取会读输入寄存器, 推挽模式会读取输出寄存器的值. 输出(全…

Java毕业设计-基于jsp+servlet的家用电器购物商城管理系统-第87期

获取源码资料&#xff0c;请移步从戎源码网&#xff1a;从戎源码网_专业的计算机毕业设计网站 项目介绍 基于jspservlet的家用电器购物商城管理系统&#xff1a;前端 jsp、jquery、layui&#xff0c;后端 servlet、jdbc&#xff0c;角色分为管理员、用户&#xff1b;集成商品…

分布式Erlang/OTP(学习笔记)(一)

Erlang分布式基础 假设你在机器A和机器B上各跑着一个Simple Cache应用的实例。要是在机器A的缓存上插人一个键/值对之后&#xff0c;从机器B上也可以访问&#xff0c;那可就好了。显然&#xff0c;要达到这个目的&#xff0c;机器A必须以某种方式将相关信息告知给机器B。传递该…

macOS向ntfs格式的移动硬盘写数据

最近想把日常拍摄的照片从SD存储卡中转存到闲置的移动硬盘中&#xff0c;但是转存的时候发现&#xff0c;mac只能读我硬盘里的东西&#xff0c;无法将数据写入到移动硬盘中&#xff0c;也无法删除移动硬盘的数据。后来在网上查了许久资料&#xff0c;终于可实现mac对移动硬盘写…

修改iview的表格table展开的默认icon和样式

修改前 修改后 修改内容 .title_label_list .ivu-icon-ios-add{font-size: 26px;color: #888888; } .title_label_list .ivu-icon-ios-add:hover{color: #11AAAA; } .title_label_list .ivu-icon-ios-add:before {content: "\F341"; } .title_label_list .ivu-icon-…

Vue3/Vue2实现文章内容中多个“关键词“标记高亮显示

一、实现效果 下拉列表高亮展示关键词 二、实现思路 安装 “vue-word-highlighter” &#xff0c;这是一个 支持 Vue3 和 Vue2&#xff0c;不过 Vue2 版本是通过 vue-demi 构建的 三、案例代码 package.json "vue-word-highlighter": "^1.0.4"Vue3 …

银河麒麟服务器操作系统搭建证书服务器并颁发可用于签名的证书步骤说明

银河麒麟服务器操作系统搭建证书服务器并颁发可用于签名的证书的方法与前面Centos7上&#xff08;centos7 使用openssl 配置证书服务器并颁发证书&#xff08;史上最详细版本&#xff09;_centos phpinfo显示的openssl配置项为/etc/pki/tls/openssl.c-CSDN博客&#xff09;是一…

【计算机组成与体系结构Ⅱ】多Cache一致性的模拟分析(实验)

实验八&#xff1a;多Cache一致性的模拟分析 一、实验目的 1&#xff1a;加深对多 Cache 一致性的理解。 2&#xff1a;进一步掌握解决多 Cache一致性的目录协议和监听协议的基本思想。 3&#xff1a;掌握在各种情况下&#xff0c; 目录协议和监听协议是如何工作的&#xf…