SV1 数据类型(上)
SV1 数据类型(上)
1.内建数据类型
1.1 逻辑(logic)类型 -- 四状态类型 0、1、x、z
- 除了作为一个变量,还可以被连续赋值、门单元和模块所驱动。
- 任何使用线网的地方均可以使用logic,但要求logic不能有多个结构性的驱动。
- 注:当信号只有一个驱动,把信号声明为logic,而不是reg或wire,有助于检查漏洞,当出现多个驱动时编译报错;当信号需要有多个驱动时,需要声明为线网类型,如wire。
1.2 双状态数据类型 -- 0、1
- bit ---- 双状态、单比特、无符号
- byte ---- 双状态、8比特、有符号
- int ---- 双状态、32比特、有符号
- shortint ---- 双状态、16比特、有符号
- longint ---- 双状态、64比特、有符号
- integer ---- 四状态、32比特、有符号
- time ---- 四状态、64比特、无符号
- real ---- 双状态、双精度浮点数
- 注:指定变量为无符号可在声明时加关键字 unsigned,如 int unsigned
- $isunknown(expression) ---- 表达式的任意位出现 x 或 z 时返回 1
2.定宽数组
2.1 定宽数组的声明和初始化
-
SystemVerilog允许在声明数组时只给出数组宽度
例:
int lo_hi[0:15]; //16个整数
int c_style[16]; //16个整数
-
多维数组
例:
int array2[0:7][0:3]; // 8 行 4 列数组
int array3[8][4]; // 8 行 4 列数组
-
注:当试图从越界的地址中读取数据时,SV将会返回数组元素类型的缺省值。
-
注:SV以32位存储数组元素,即一个字(WORD),在非合并数组中,字的低位用来存放数据,高位不使用。
例:非合并数组的声明
![在这里插入图片描述]()
2.2 常量数组

2.3 基本的数组操作 ---- for 和 foreach
- $size(array) ---- 返回数组宽度
- foreach 中只需指定数组名并给出索引变量,SV便会自动遍历数组元素
initial begin
bit [31:0]src[5];
for (int i = 0; i < $size(src); i++)
src[i] = i;
foreach(src[j])
$display("src[%0d]=%0d", j, src[j]);
end
-
多维数组 foreach
![在这里插入图片描述]()
-
foreach只遍历二维数组的一个维度
![在这里插入图片描述]()
2.4 基本的数组操作 -- 复制和比较
- 聚合操作,对数组整体进行复制和比较
![在这里插入图片描述]()
![在这里插入图片描述]()
2.5 同时使用位下标和数组下标

2.6 合并数组
- 在连续的比特集合中存放
2.7 合并数组的例子
-
合并数组大小定义的格式必须是[ msb : lsb ],而不是[ size ]。
![在这里插入图片描述]()
-
合并和非合并数组混合使用
![在这里插入图片描述]()
![在这里插入图片描述]()
2.8 合并数组和非合并数组的选择
- 当需要和标量进行相互转换时,使用合并数组会非常方便。例如需要以字节或字为单位对存储单元进行操作时。
- 当需要等待数组中的变化,则必须使用合并数组。当测试平台需要通过存储器数据的变化来唤醒时,即使用@操作符时只能用于标量或者合并数组。
3.动态数组 -- 可以在仿真时分配空间或调整宽度
int dyn[], d2[]; //声明动态数组,不指定宽度
initial begin
dyn = new[5]; //分配5个元素
foreach(dyn[i]) dyn[i] = i; //对元素初始化
d2 = dyn; //复制动态数组
d2[0] = 5; //修改元素值
dyn = new[20](dyn); //分配20个元素,并复制dyn到前面5个位置
dyn = new[100]; //分配100个元素,旧值被删除
dyn.delete(); //删除所有元素
end
注:定宽数组和动态数组在类型相同的情况下可以相互赋值。
4.队列
- 可以在队列的任何地方增加或删除元素
- 队列常量只有大括号,没有单引号
- SV会自动分配队列空间,不用使用new
![在这里插入图片描述]()
注:并不是所有SV仿真器都支持insert



5.关联数组
- 用于存储超大容量数据
- SV只为实际写入的元素分配空间
![在这里插入图片描述]()
![在这里插入图片描述]()











浙公网安备 33010602011771号