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只为实际写入的元素分配空间
    在这里插入图片描述
    在这里插入图片描述

6.链表 -- 尽量避免使用

posted @ 2021-09-16 15:30  thompsonm  阅读(245)  评论(0)    收藏  举报