0%

SV之数据类型

本节主要介绍了SystemVerilog中的基本数据类型以及自定义数据类型

基本数据类型

  • SystemVerilog中的信号同时具有类型和数据类型

  • 类型表示信号是线网还是变量
    $$
    类型\begin{cases}
    变量(var):可以用连续赋值或者过程赋值\
    线网(wire):只能用于连续赋值语句(assign)\
    \end{cases}\
    $$

  • 数据类型表示变量和线网的值是二值逻辑还是四值逻辑
    $$
    数据类型\begin{cases}
    四值逻辑:1、0、x、z\
    二值逻辑:1、0\
    \end{cases}\
    $$

  • 常见的二值逻辑与四值逻辑如下:
    $$
    \begin{cases}
    四值逻辑类型:logic、integer、reg、net-type(wire、tri)\
    二值逻辑类型:bit、byte、shortint、int、longint\
    \end{cases}\
    $$

  • 有符号类型与无符号类型的划分如下:
    $$
    \begin{cases}
    有符号类型:byte(8bit)、shortint(16bit)、int(32bit)、longint(64bit)、integer\
    无符号类型:bit、logic、reg、net-type(wire、tri)\
    \end{cases}\
    $$

  • 可以在有符号类型后添加unsigned来表示无符号类型,如:

    1
    byte unsigned //等同于bit[7:0],表示的数值范围是[0, 255]
  • 需记住变量最常用的logic、bit都默认为无符号变量var,而所有的线网类型只能是四值逻辑类型

    1
    2
    3
    logic [0: 7] array [0: 255]; //256个8bit数据组成的数组
    (var) logic [63: 0] addr;
    wire logic [63: 0] data;
  • 四值逻辑变量在仿真开始时初值为X,二值逻辑变量在仿真开始时初值为0

  • 如果四值逻辑与二值逻辑的数据类型之间发生默认转换,那么X和Z值将转换为0

  • SV添加void类型来表示空类型,经常用在函数定义时表示不会返回数值

  • SV添加shortreal表示32位单精度浮点类型(同C语言的float)

  • 未指定类型No type specified-未指定数据类型No data type specified时,默认类型端口为wire

  • 指定数据类型时,默认类型为wire(输入和输入输出端口)和var(输出端口)

  • 未指定数据类型No data type specified-所有端口的默认数据类型为logic(4态)


自定义类型

  • 通过typedef来创建用户自定义类型

    1
    2
    typedef int unsigned uint;
    uint a, b;
  • 通过enum来创建枚举类型

    1
    enum {red, green, blue} RGB
    • 默认的枚举类型是int,在未赋值情况下默认第一个数为0

    • 为了能够更准确地描述硬件,SV允许指明枚举类型的数据类型

      1
      enum logic [1: 0] {WAITE, LOAD, READY} state
    • 如果一个枚举类型数据被赋值,那么所附的值必须符合其数据类型

      1
      enmu logic [2: 0] {WAITE = 3'b001, LoAD = 3'b010, READY = 3'b100} state
    • 整形不能直接赋值给枚举类型

    • 枚举类型可以和typedef联合使用,来声明自定义类型,这使得可以用同一个枚举类型来声明多个变量或者线网

      1
      2
      typedef enum {WAITE, LOAD, READY} state_t;
      states_t state, next_state;
  • 通过struct来创建结构体类型

    1
    2
    3
    4
    5
    6
    struct{
    int a, b;
    opcode_t opcode;
    logic [23: 0] address;
    bit error;
    } Instruction_Word;
    • 类似于枚举类型,结构体类型也可以伴随着typedef来实现自定义结构体类型

      1
      2
      3
      4
      5
      6
      7
      typedef struct{
      int a, b;
      opcode_t opcode;
      logic [23: 0] address;
      bit error;
      } instruction_Word_t;
      instruction_Word_t IW;
    • 结构体类型默认也是变量类型,用户也可以显示声明其为var或者wire类型

    • 结构体变量可以通过.索引对成员赋值:

      1
      2
      IW.a = 100;
      IW.opcode = 8'hFF;
    • 也可以通过'{}整体赋初值

      1
      2
      IW = '{100, 3, 8'hFF, 0}; //位置对应赋值
      IW = '{address:0, opcode:8'hFF, a:100, b:5}; //名字索引赋值

字符串类型

  • 字符串类型变量的存储单元为byte类型

  • 字符串结尾没有“空字符”即null字符“\0”

  • 字符串最高位从0开始

    1
    2
    3
    4
    typedef logic [15: 0] r_t;
    r_t r;
    string b = ""; //相当于string b
    r = r_t'(a); //显示转换,将a转化为数据类型r_t并赋值给r
  • 字符串内建方法:

    • str.len() //返回字符串的长度

    • str.putc(i, c) //将第i个字符替换成字符C,等同于stri[i]=c

    • str.getc(i) //返回第i个字符

    • str.substr(i, j) //将从第i个字符到第j个字符的字符串返回

    • str.{atoi(), atohex(), atooct(), atobin()} //将字符串转变为十进制、十六进制、八进制或者二进制数据

      1
      2
      str = "123";
      int i = str.atoi(); //将”123“转化为整数123
欢迎来到ssy的世界