第七课
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