1 数据类型
sv 引进了一些新的数据类型,它们具有以下优点
(1)双状态数据类型:更好的性能,更低的内存消耗
(2)队列、动态和关联数组:减少内存消耗,自带搜索和分类功能
(3)类和结构:支持抽象数据结构
(4)联合和合并结构:允许对同一数据有多种视图(view)
(5)字符串:支持内建的字符序列
(6)枚举类型:方便代码编写,增加可读性
1.1 内建数据类型
verilog 有两种基本类型:reg 变量和 线网 wire。
1.1.1 逻辑 logic类型
sv对verilog进行了改进,使得它除了作为一个变量外,还可以被连续赋值、门单元和模块所驱动。为了与寄存器类型reg相区别,这种改进的数据类型被称为logic。
注意:由于logic类型只能有一个驱动,如果存在多个驱动,那么编译的时候就会报错。当然有时候你希望是多个驱动,那么这个信号需要被定义成线网型 wire
1.1.2 双状态数据类型
相比四状态数据类型,sv引入的双状态数据类型有利于提高仿真器的性能并减少内存的使用量。最简单的双状态数据类型是bit,它是无符号的。另四种带符号的双状态数据类型是byte,shortint int和longint。
1.2 定宽数组
1.2.1 定宽数组的声明和初始化
1.2.2 常量数组
1.2.3 基本的数组操作——for 和foreach
操作数组的最常见的方式是使用for或foreach循环。 sv中的$size函数返回数组的宽度。在foreach循环中,只需要指定数组名并在其后面的方括号中给出索引变量,sv便会自动遍历数组中的元素。索引变量将自动声明,并在循环内有效。
intial 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;end
例1:
int md[2][3] = '{'{0,1,2}, '{3,4,5}};initial begin$display("Initial value:");foreach(md[i,j])$display("md[%0d][%0d] = %0d",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:打印一个多维数组
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[,j]) // 遍历第二个维度 $display;end
end