0%

1 DataType

数据类型

SystemVerilog data types

四态值:0 1 X Z

logic、reg、net(wire)、integer、real、time、realtime

二态值:0 1

  • bit

    • bit[7:0] 无符号
  • byte、shortint、int、longint、shortreal

    • byte、shortint、int、longint 默认有符号

    • unsigned 表示无符号

  • 使用 $isunknown() 可检查二态值是否出现 X 或 Z

转换

1
2
3
4
5
6
// cast
int'(2.0*3.0)
shortint'({8'hab, 8'hef})
// system task
integer $rtoi(real_val)
real $itor(int_val )
  • 当四态值转换为二态值时,X 和 Z 将转换为 0

数组

  • 访问数组越界地址将返回缺省值(四值为 X,二值为 0)。

  • 很多仿真器采用 32 比特的字边界存放数组。

  • 当需要用@等待数组的变化,则必须使用合并数组。

非合并数组

  • 维度声明

    int array [0:3][0:7]; or int array [4][8];

  • 存放格式

    bit[7:0] b_unpack[3];

  • 初始化

    int array [4] = '{0,1,2,3}

    array = '{4{1}}

    array = '{0,1,default:2}

    array [0:2] = '{0,1,2}

合并数组

对某些数据类型,有时候希望作为整体访问,有时候则希望分解为更小单元访问,可使用合并数组。

  • 数组大小声明

    bit [3:0] [7:0] bytes;bit [size] 不可以)

  • 存放格式

    bit [3:0] [7:0] bytes;

    bit [3:0] [7:0] barray[3];

遍历:for & foreach

1
2
3
4
5
6
7
8
9
10
11
12
initial begin
bit [31:0] src[5], dst[4][5];
for(int i = 0; i < $size(src); i++) // for 遍历
...
foreach(dst[i,j]) // foreach 遍历
...
foreach(dst[i]) begin // foreach 遍历第一个维度
foreach(dst[,j]) begin // foreach 遍历第二个维度
...
end
end
end

数组聚合操作

1
2
3
4
5
6
7
8
9
10
initial begin
bit [31:0] src[3] = '{0,1,2},
dst[3] = '{3,4,5};
// 聚合比较(仅支持等于和不等于比较)
if(src == dst)
...
if(src != dst)
...
// 复制
dst = src;

动态数组

  • 定义

    bit [3:0] d_array[];

  • 分配大小、初始化

    d_array = new[3]; d_array = '{0, 1, 2};

  • 方法

    1
    2
    d_array.size()		// return 0 if not created
    d_array.delete() // empties the array resulting in a zero-sized array
  • 追加元素

    1
    d_array = new [d_array.size() + N] (d_array);	// 保留原有元素

关联数组

字符串 string

SystemVerilog String

枚举 enum

  • 定义

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    enum {RED, YELLOW, GREEN} 				 color_1;	// 默认 int, RED = 0, YELLOW = 1, GREEN = 2
    enum bit[1:0] {RED, YELLOW, GREEN} color_2; // 声明 bit, RED = 0, YELLOW = 1, GREEN = 2
    enum {RED = 3, YELLOW = 5, GREEN} color_3; // 根据前者递增, RED = 3, YELLOW = 5, GREEN = 6
    enum {BLACK[3]} color_3; // BLACK0 = 0, BLACK1 = 1, BLACK2 = 2
    enum {BLACK[2] = 3} color_4; // BLACK0 = 3, BLACK1 = 4
    enum {BLACK[3:4]} color_5; // BLACK3 = 0, BLACK4 = 1
    enum {BLACK[4:5] = 4} color_6; // BLACK4 = 4, BLACK5 = 5
    enum {RED = 0, YELLOW, GREEN = 1} color_7; // 错误:值冲突
    enum bit[0:0] {RED, YELLOW, GREEN} color_8; // 错误:位宽不够

    typedef enum {TRUE, FALSE} bool_t; // 自定义数据类型

    enum 命名不能以数字开头

  • 方法

    1
    2
    3
    4
    5
    6
    7
    8
    typedef enum {RED, YELLOW, GREEN} colors;
    colors color = YELLOW;
    $display("%0d", color.first); // 0 (RED)
    $display("%0d", color.last ); // 2 (GREEN)
    $display("%0d", color.next ); // 2 (GREEN)
    $display("%0d", color.prev ); // 0 (RED)
    $display("%0d", color.num ); // 3
    $display("%0d", color.name ); // YELLOW
  • 类型检查

    1
    2
    3
    4
    5
    6
    7
    typedef enum bit[1:0] {RED, YELLOW, GREEN} colors;
    colors color;
    color = RED; // valid
    color = 0; // invalid
    color = colors'(0); // valid
    if(color == RED | color == 0) // valid, autocast
    ...

结构体 structure

1