0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

网络和变量的未压缩数组

OpenFPGA 来源:OpenFPGA 作者:OpenFPGA 2022-05-20 10:14 次阅读

数字硬件建模SystemVerilog(九)-网络和变量的未压缩数组

SystemVerilog有两种类型的数组:压缩数组和非压缩数组。压缩数组是连续存储的位的集合,通常称为向量。非压缩数组是网络或变量的集合。

集合中的每个网络或变量称为数组元素。未压缩数组的每个元素的类型、数据类型和向量大小都完全相同。每个未压缩的数组元素可以独立于其他元素存储;这些元素不需要连续存储。软件工具,如仿真器和综合编译器,可以以工具认为最佳的任何形式组织未压缩数组的存储。

未压缩数组的基本声明语法为:

2694f634-d7d6-11ec-bce3-dac502259ad0.png

数组的维度定义了数组可以存储的元素总数。未压缩的数组可以用任意数量的维度声明,每个维度存储指定数量的元素。声明数组维度有两种编码样式:显式地址和数组大小。

显式地址样式指定方括号之间数组维度的起始地址和结束地址,格式为:

26a77ee4-d7d6-11ec-bce3-dac502259ad0.png

Start_address 和 end_address可以是任何整数值,数组可以以地址0、地址512或被建模硬件所需的任何地址开始。起始地址和结束地址之间的范围表示数组维度的大小(元素数)。

数组大小样式定义要存储在方括号中的元素数(类似于C语言数组声明样式)。

[size]

使用array_size样式,起始地址始终为0,结束地址始终为size-1

以下是一些未压缩的数组声明示例:

26b89e40-d7d6-11ec-bce3-dac502259ad0.png

前面的mem声明是16位logic变量的一维数组。一维阵列有时被称为内存阵列,因为它通常用于仿真硬件内存设备(如RAMROM)的存储。

访问数组元素

可以使用数组索引引用未压缩数组的每个元素,索引紧跟在数组名称之后,并且位于方括号中,多维数组需要多组方括号才能从数组中选择单个元素:

271d1ea6-d7d6-11ec-bce3-dac502259ad0.png

数组索引也可以是网络或变量的值,如下一个示例所示:

275837fc-d7d6-11ec-bce3-dac502259ad0.png

复制数组(阵列)

如果两个数组(阵列)具有相同的布局,则可以使用赋值语句将一个未压缩的数组(阵列)复制到另一个未压缩的数组(阵列)。也就是说,这两个数组(阵列)必须存储相同向量大小的相同数据类型,必须具有相同的维度数,并且每个维度的大小都相同-

数组(阵列)复制会将源数组(赋值的右侧)的每个元素复制到目标数组(阵列)(赋值的左侧)中相应的元素。两个数组(阵列)的索引编号不需要相同。数组(阵列)的布局和类型必须完全匹配。

27aa9128-d7d6-11ec-bce3-dac502259ad0.png

与复制数组(阵列)的方式类似,如果两个切片的布局相同,则可以将数组(阵列)的一部分(称为数组(阵列)切片)复制到另一个数组(阵列)的切片。切片是数组(阵列)一维内的一个或多个连续编号的元素。

在成为SystemVerilog之前,最初的Verilog语言将对数组(阵列)的访问限制为一次只能访问数组中的一个元素。不允许对数组(阵列)的多个元素进行数组(阵列)复制和读/写操作。

数组列表赋值

可以为未压缩的数组或数组的一个片段分配一个值列表,这些值包含在每个数组维度的’{and}大括号之间。

27e54750-d7d6-11ec-bce3-dac502259ad0.png

列表语法类似于在C中为数组指定值列表,但在大括号前添加了撇号使用’-“作为开头分隔符”表明,所包含的值是表达式列表,而不是SystemVerilog连接运算符(后面会详细介绍)。

还可以使用嵌套列表为多维数组分配值列表。嵌套的列表集必须与数组的维度完全匹配。

284c7cfe-d7d6-11ec-bce3-dac502259ad0.png

此数组分配相当于以下各项的单独分配:

287a0b06-d7d6-11ec-bce3-dac502259ad0.png

通过指定默认值,可以为未压缩数组的所有元素指定相同的值。默认值是使用’{default:}指定的,如以下代码段所示:

28e0bd6a-d7d6-11ec-bce3-dac502259ad0.png

数组元素的位选择和部分选择

可以从数组元素向量中选择一位或一组位。必须首先选择数组的单个元素,然后进行位选择或部分选择。

291f81bc-d7d6-11ec-bce3-dac502259ad0.png

通过端口将数组传递给任务和函数。任何类型和任意数量的未压缩数组都可以通过模块端口传递,也可以传递到任务和函数参数。端口或任务/函数形式参数也必须声明为数组,端口或参数数组必须与要传递的数组具有相同的布局(与数组复制的规则相同)。

294e0ec4-d7d6-11ec-bce3-dac502259ad0.png

最初的Verilog语言只允许简单的向量通过模块端口,或传递到任务或函数参数。要传递上述示例中表数组的值,需要256个端口,数组的每个元素一个端口。

审核编辑 :李倩

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 编译器
    +关注

    关注

    1

    文章

    1577

    浏览量

    48638
  • 变量
    +关注

    关注

    0

    文章

    597

    浏览量

    28114
  • 数组
    +关注

    关注

    1

    文章

    409

    浏览量

    25597

原文标题:SystemVerilog(九)-网络和变量的未压缩数组

文章出处:【微信号:Open_FPGA,微信公众号:OpenFPGA】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    TC277如何指定该全局数组变量的存储地址的对齐方式?

    定义全局数组变量,如何指定该全局数组变量的存储地址的对齐方式
    发表于 02-19 07:37

    PHP中数组的使用方法!

    PHP中数组的使用方法! PHP是一种广泛使用的网络编程语言,它的数组功能非常强大且灵活。数组是一种数据结构,它允许我们在单个变量中存储多个
    的头像 发表于 01-12 15:11 168次阅读

    数组与指针不能混用的情况

    和指针的基本概念。数组是一组相同类型的元素的集合,而指针是一个变量,它存储了一个地址,该地址指向内存中的某个位置。在 C/C++ 中,数组名称可以当作指向数组第一个元素的指针来使用。这
    的头像 发表于 12-07 13:46 318次阅读

    jsp判断数组是否包含某个值

    元素,以及利用条件语句进行有效的值检查。 1.阵列基础知识: 数组是一种数据结构,允许在一个变量名下存储同一类型的多个值。在JSP中,可以通过各种方式声明和初始化数组,例如显式指定大小或直接初始化元素。 2.访问
    的头像 发表于 11-30 16:18 461次阅读

    c语言中数组怎么定义

    : [ ]; 其中, :数组中元素的数据类型,可以是C语言支持的任何数据类型,例如整型、字符型、浮点型等。 :数组的名称,用于引用数组中的元素。 :数组中元素的个数。
    的头像 发表于 11-24 10:11 1122次阅读

    python如何定义二维空数组

    在Python中,可以通过使用列表嵌套的方式来定义二维空数组。具体步骤如下: Step 1: 创建一个空的二维列表 要创建一个空的二维数组,首先需要定义数组的行数和列数。我们可以使用两个变量
    的头像 发表于 11-21 15:12 690次阅读

    什么是数组数组有什么用?数组的使用方法

    数组(Array)是有序的元素序列。
    的头像 发表于 11-08 14:58 710次阅读
    什么是<b class='flag-5'>数组</b>?<b class='flag-5'>数组</b>有什么用?<b class='flag-5'>数组</b>的使用方法

    全局变量数组数据错乱怎么解决?

    不知道是自己定义的全局变量太多了还是怎么了? 在执行数组赋值的时候不同的全局变量会出现共用地址的问题,也就是明明在给A赋值但是B的值也一起变了?导致出现数据错乱,不知有谁遇到过这种情况???
    发表于 11-06 08:19

    数组的定义 什么是数组

    数组 数组是内置类型,是一组同类型数据的集合,它是值类型,通过从0开始的下标索引访问元素值。 在初始化后长度是固定的,无法修改其长度。当作为方法的参数传入时将复制一份数组而不是引用同一指针。
    的头像 发表于 10-09 09:39 1354次阅读

    在定义数组的时候,这个数组长度可以是变量吗?

    在定义数组的时候,这个数组长度可以是变量
    发表于 10-09 08:58

    用二维数组存储最小元素是怎么实现的?

    用二维数组存储最小元素是怎么实现的?  在计算机编程中,数组是一种非常重要的数据结构之一。它用于存储一系列相同类型的变量,这些变量被放入单一的数组
    的头像 发表于 09-13 11:17 315次阅读

    keil5+Env将变量定义到SDRAM中的过程

    其实要把特别大的变量数组)定义到SDRAM中步骤很简单,但这个过程却困扰了我好久,此篇文章就作为个人学习笔记参考参考吧。
    的头像 发表于 08-02 14:39 1337次阅读
    keil5+Env将<b class='flag-5'>变量</b>定义到SDRAM中的过程

    S7-1200使用数组实现间接寻址的方法

    S7-1200 从 固件版本 V2.0 开始就支持数组下标使用变量的方式,这就意味着数组是最方便的间接寻址的方法,通过改变下标变量实现各式各样的功能。
    发表于 07-31 09:04 3430次阅读
    S7-1200使用<b class='flag-5'>数组</b>实现间接寻址的方法

    定义了一个64K字节的数组,如果把数组定义成变量数组运行不了怎么解决?

    我定义了一个64K字节的数组,如果把数组定义成Const常量,编辑之后运行都正常。 但如果把数组定义成变量数组,可以编译(占的空间比较大:P
    发表于 06-13 08:36

    KUKA.ProConOS软件相关变量

    借助Mulitprog库KrcExVarLib的功能块,可以从数组变量中读取单个或多个值,也可以将其写入数组变量
    发表于 05-26 09:27 263次阅读