system verilog 第二章翻译 下载本文

内容发布更新时间 : 2024/5/29 13:53:12星期一 下面是文章的全部内容请认真阅读。

注意在例2.11中,对多维数组使用foreach语法可能与设想不同。使用时并不像[i][j]这样把每个下标分别放在不同的方括号里,而是用逗号隔开后放在同一个方括号里,如[i,j]这种形式。

例2.11的输出结果如例2.12所示

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

例2.13的输出结果如例2.14所示。

最后要补充的是,foreach循环会遍历原始声明中的数组范围。数组f[5]等同于f[0: 4],而foreach(f[i])等同于for循环形式for(inti=0;i<=4i++)。对于数组rev[6:2]来说,foreach(rev[i])语句等同于for(inti=6; i>=2;i--)。

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

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

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

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

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

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

2.2.6 合并数组

对某些数据类型,我们希望可以作为一个整体访问,也可以分解成小单元。如:一个

32bits的寄存器,有时候希望可以看成4个8bits的数据,有时希望可以看成单个的无符号数据。System Verilog的合并数组就可以实现这个功能,既可以作为数组,又可以作为单独数据。与合并数组不同的是,它的存放方式是连续的bit集合,中间没有任何闲置空间。

2.2.7 合并数组的例子

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

合并和非合并数组可以混合使用,可能会使用数组来表示存储单元,这些单元可以按bit,字节或长子的方式进行存取,如例2.18中,barray是一个具有3个合并元素的非合并数组。

其中,变量bytes是一个具有4个字节的合并数组,以单字形式存放。Barray则是一个