背景
数据类型是学好一门语言的基础,sv的数据类型有时候让人疑惑,在这里进行一个详细的解释
核心内容
1. sv的数据类型有哪些
2. 各个数据类型之间有什么区别
3. wire和logic
我的理解
想要学好一门语言,就得将它的基础学好。如果想学英语,你就先得知道26个英文字母;如果要学中文,你就得学会横竖撇捺点。数据类型就是一门语言基础中的基础。
System Verilog脱胎于Verilog,最初的作用是用来描述电路,所以SV语言保留了一些电路的特性。
比如你想要描述一个1 bit的数据,你其实有这几种选择
bit a;
logic b;
reg c;
wire d;
你甚至用一种看起来不太合理的写法:
int f;
f[0]也能表示1 bit。
那这几种表达方式究竟有什么不同?
根据《SystemVerilog验证测试平台编写指南》(以下简称绿皮书)第2.1.1和2.1.2两节的内容,我进行以下总结:
bit a; //双状态,单比特
bit[31:0] b; //双状态,32比特无符号整数
int unsigned c; //双状态,32比特无符号整数
int d; //双状态,32比特有符号整数
byte e; //双状态,8比特有符号整数
shortint f; //双状态,16比特有符号整数
longint g; //双状态,64比特有符号整数
integer h; //四状态,32比特有符号整数
time i; //四状态,64比特无符号整数
real j; //双状态,双精度浮点数
wire k; //线网的一种,用于逻辑门的驱动或连续赋值的驱动
reg l; //Verilog中的变量,只用于过程赋值的左侧变量
logic m; //SystemVerilog中对于reg的更新,可以使用线网的地方也可以使用logic
logic还有一个限制是不能有多个结构性的驱动,如果有多个驱动,则编译的时候就会出现错误。现在SystemVerilog中基本已经完全抛弃了reg的使用,logic可以覆盖所有使用reg的场景。在和DUT直连的场景中,基本上都可以使用logic来声明接口,只有在多个驱动的场景下使用wire。
而在TB的主体内部,基本可以不使用wire/reg/logic类型,而用bit替代,但当被检查的信号存在不确定态时,要使用logic来替代bit,否则会错失一些信号的变化。
还有就是在logic类型的信号进行比对时,要用`===`而非`==`,否则比对也无法发现错误。
实战要点
- 工作中可以这么用:在interface中都用logic和wire,在scb中用少量logic和wire,其他不和DUT直连的地方都用其他数据类型
- 容易踩的坑:要非常注意不要把从DUT抓来的信号赋值给双状态的数据类型,出现x态和z态不容易debug
一句话总结
integer/time/logic/wire四状态,其余都是双状态;多驱用wire,单驱用logic
1043

被折叠的 条评论
为什么被折叠?



