【SystemVerilog学习笔记】5-数组、结构图和联合体

本文详细介绍了SystemVerilog中的结构体(struct)、联合体(union)和数组的使用,包括它们的声明、赋值、压缩与非压缩形式,以及在端口传递和任务函数中的应用。重点讲解了结构体和联合体中的成员类型、初始化、赋值方法和综合指导,同时也涵盖了数组的多维操作、初始化、赋值和遍历。此外,还提到了$bit位宽系统函数和用于数组查询的系统函数。

SystenVerilog:

  • 加入了结构体类型。
  • 加入了联合体类型。
  • 在数据如何表示以及数组的操作方面,对Verilog的数组结构进行了拓展。

5.1 结构体

  • 用struct关键字声明。结构体内的成员可以是任何数据类型,包括用户自定义类型和结构体类型。
    例子:
    struct{
        int          a,b        ;
        opcode_t     opcode     ;
        logic [23:0] address    ;
        bot          error      ;
    }Instruction_word;
    
  • 与C语言结构体比较:SystemVerilog不允许使用C语言中的“标记(tag)”。
  • 与数组比较:数组是用类型同位数的元素集合,而结构体是不同类型不同位数的变量或者常量的集合。
  • 结构体提供了将相关数据集合在一个相同名称下的机制,数据的每一部分可以通过名称来单独引用,整个组也可以作为整体引用。

5.1.1 结构体的声明

  • 变量(未指定则默认为变量)
    var struct{
        logic [31:0] a,b;
        logic [7:0]  opcode;
        logic [23:0] address;
    } Instruction_word_var;
    
  • 线网
    wire struct{
        logic [31:0] a,b;
        logic [7:0]  opcode;
        logic [23:0] address;
    } Instruction_word_net;
    
  • typedef
    typedef struct{
        logic [31:0] a,b;
        logic [7:0]  opcode;
        logic [23:0] address;
    } Instruction_word_t;
    
  • 匿名结构体
    struct{
        logic [31:0] a,b;
        logic [7:0]  opcode;
        logic [23:0] address;
    } Instruction_word;
    
  • 局部或者共享结构体
    在模块或者接口内定义。

5.1.2 结构体的赋值

  • 初始化
    使用 '{} 内的一组值在实例化结构体时初始化。大括号内值的个数与成员的个数一致。
    Instruction_word_t IW = '{100, 3, 8, 8'hff, 0};
    
  • 成员赋值
    1. 通过成员名称赋值
      nstruction_word_t IW;
      ...
      IW.a = 100;
      IW.b = 3;
      
    2. 将结构体表达式赋值给结构体
      跟初始化格式一样按顺序赋值,或者指定名称赋值,但是不能混用。
      nstruction_word_t IW,IW1;
      ...
      IW  = '{100, 3, 8, 8'hff, 0}                 ; //1. 按照顺序赋值
      IW1 = '{a:100, address:0, b:3, opcode:8'hff}; //2. 按照名称赋值
      
    3. 结构体表达式的默认值
      结构体的部分或者全部成员可以被赋一个默认值,default优先级最低。
      truct{
      real [31:0] a,b     ;
      logic [7:0]  opcode ;
      logic [23:0] address;
      } Instruction_word;
      nstruction_word_t IW,IW1;
      ...
      IW = '{default:0}           ; //设置IW所有成员为0。
      IW1 = '{default:0, real:1.0}; //由于default优先级最低,设置IW所有real类型成员为1.0,其他为0。
      

5.1.3 压缩和非压缩结构体

非压缩结构体 压缩结构体
结构体内成员被当作独立的变量或常量 按照指定的顺序以相邻的为来存储结构体成员
成员可以是不同类型和位宽的变量或常数 只能包含压缩变量,结构体所有成员都可以用向量表示。
  • 压缩结构体的声明
    使用packed关键字。

    struct packed {
        logic        valid;
        logic [ 7:0] tag  ;
        logic [31:0] data ;
    }data_word;
    

    压缩结构体被当作向量存储,所以可以通过读写向量的方式访问结构体成员。
    |valid-----|tag-----|data-----|
    |40--------|39------|31------0|

  • 压缩结构体的操作
    对向量的算术操作,逻辑操作以及任何其他操作都可以用于压缩结构体。

  • 有符号的压缩结构体

    • 压缩结构体可以用关键字signed或unsigned声明成有符号或者无符号的,这只影响到整个结构体在算术或者相关操作。
    • 成员有符号还是无符号依赖于成员的类型声明。
    • 对压缩结构体部分选择相当于对变量的部分操作,始终是无符号的。

5.1.4 通过端口传递结构体

结构体必须首先使用typedef定义为用户自定义数据类型,才允许将模块或接口的端口声明为结构体类型。
至于如何声明typede

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ChipWeaver

觉得有用的话点个赞吧 :)

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值