当前位置: 代码迷 >> 综合 >> Systemverilog 第七课 Structure
  详细解决方案

Systemverilog 第七课 Structure

热度:7   发布时间:2023-12-18 22:41:20.0

第七课

Structure

structure是一组变量或者常数的集合,能够更方便地同时访问其中的元素。
语法:

struct{int a,b;logic[7:0] opcode;logic[23:0] address;bit error;
} Instruction_Word

最后一行是这个structure的名字,引用变量时的格式为:

Instruction_Word.address = 24'hF0000;
  • Packed structure
    structure默认状态下在内存当中是unpacked状态,可以使用packed关键字使变量存储在连续的空间当中。
    在这里插入图片描述
    可以看到图中valid,tag,data的bit地址是连续的,越先声明的变量bit数越大。
    经过packed以后可以作为一个数组访问或改写其中的元素:
    在这里插入图片描述
    实际操作当中推荐使用data_word.tag这种形式调用,可读性高,不容易出错。

Enumerated Type(枚举)

可以用于声明拥有固定值的变量,如状态机或者计算常量,增加代码的可读性。
语法:

enum{red,green,blue} RGB

默认状态给第一个元素赋值0,后面元素的值依次递增。
也可以赋特定值:

enum{ONE=1, FIVE=5, TEN=10} RGB

若同时存在赋值和未赋值的元素,未赋值的元素会在前一个元素的基础上加1.
在这里插入图片描述
赋值产生冲突则会报错(error)。

  • 数据类型
    枚举语法可以指定元素的数据类型,但是要注意位宽和元素个数要匹配
    在这里插入图片描述
    四态的情况下,某一元素赋值x或者z是合法的,但是不能在此元素后面添加未赋值的元素,因为x+1和z+1不能产生合法的结果。

Operators

在这里插入图片描述
与C语言较为相似,++和–属于blocking assignment,可能会引起竞争冒险现象。
==在比较x和z时会返回1’bx,===和!==则可以实现完全一致的比较

Procedural Statements

  • inside
    inside用于判断变量是不是在某个值域范围内
logic [2:0] a;
if(a inside {3'b001,3'b010,3'b100})
  • Type Casting(类型转换)
    sv可以进行变量的类型转换/长度转换/有无符号转换,详情可见语法手册。

  • 循环语句
    1.for
    2.do…while

  • case语句
    sv中提供了unique和priority关键字,unique用于唯一确定每个分支语句,priority用于确定某个分支的优先级。

Tasks and Functions

sv的task和function都可以省去begin和end,并增加了关键字return
sv有void函数,可以不返回值

  • Tasks
    可以有多个输入和输出,能够包含时间控制语句和function/task。
  • Functions
    函数不包含任何延时和时间控制语句,不能包含task
    verilog的函数必须返回一个值
  • ref
    在这里插入图片描述
  相关解决方案