文章目录
1、Verilog的数据类型
Verilog语言提供两组基本的数据类型:变量数据类型(variable
)和线网数据类型(net
),这两种类型都是四值逻辑。具体请参考《IEEE Standard for Verilog》Chapter 4 Data types。
- 对线网(
net
)的声明进行简化,即:net_type + 声明列表
,其中net_type
包含我们常用的如wire | tri | wand | wor
等; - 对变量(
variable
)的声明进行简化,即:variable_type + 声明列表
,其中variable_type
包含我们常用的如reg | integer | time | real | realtime
等;
可以看到,在Verilog中,线网及变量的声明都很简单,都只有两部分:类型 + 声明列表
即可。
另外,再来看Verilog中的赋值,Verilog中将连续赋值(Continuous assignment)及过程赋值(Procedural assignment)中的左值(LHS)分别限制为了线网(net)和变量(variable)类型。换言之,如我们常用的wire类型(net)只可以被连续赋值,以及我们常用的reg类型(variable)只可以被过程赋值。
在Verilog中,reg经常用来表示存储组合逻辑或时序逻辑的变量,不过很多初学者会混淆其综合后的硬件单元。实际上,reg变量并不一定会被综合为寄存器(register),之所以定义成reg类型,是表示从仿真的语义上来讲需要一个存储单元,而与综合后的硬件电路没有直接的关联,所以对初学者而言有时会具有误导性。
而在SystemVerilog中,引入了更具有描述性的logic
数据类型,下面来介绍SystemVerilog中的数据类型。
2、SystemVerilog的数据类型
SystemVerilog添加了很多新的数据类型,但依然可以分为两组类型:变量类型(variable
)和线网类型(net
)。
- 对线网类型的声明进行简化,即:
net_type + data_type + 声明列表
,其中net_type
包含我们常用的如wire | tri | wand | wor
等,与Verilog
相同。 - 对变量类型的声明进行简化,即:
variable_type + data_type + 声明列表
,而变量类型(variable_type
)只需要关键字var
即可,并且var
可以省略,这一点与Verilog
不同!且Verilog
中的reg | integer | time | real | realtime
在SystemVerilog
中则都是指数据类型(data_type
)。
对比上述简化版之后,就可以发现:SystemVerilog区分为类型和数据类型,且两种类型(net_type
和variable_type
)的变量声明方式相同,都是:类型 + 数据类型 + 声明列表
。
SystemVerilog添加了很多新的数据类型:
- (1)双状态数据类型(2-state);
- (2)队列(queue)、动态数组(dynamic)和关联数组(associate);
- (3)类(class)和结构体(struct);
- (4)联合(union)和填充结构(packed);
- (5)字符串(string);
- (6)枚举类型(enum);
当仅有数据类型时(如reg r;、byte b;、logic c;
),其默认表示的是变量(variable
)类型,因为关键字var
可以省略。另外,数据类型也可以省略,仅有类型声明时(如wire w;、var v;
),此时数据类型被隐式声明为logic
:
reg r ; // equivalent to "var reg r;"
logic [15:0] l ; // equivalent to "var logic [15:0] l;"
var byte my_byte; // equivalent to "byte my_byte;"
wire w ; // equivalent to "wire logic w;"
wire [15:0] ww ; // equivalent to "wire logic [15:0] ww;"
var v ; // equivalent to "var logic v;"
var [15:0] vw ; // equivalent to "var logic [15:0] vw;"
再来看到,像reg、bit、byte、int
等,在SystemVerilog中,都属于数据类型(data_type
),那么既然线网类型的声明也是net_type + data_type
,则有如tri reg t;、inout wire reg p;、wire int i;
等,又是否合法呢?显然是不合法的。
在《IEEE Standard for SystemVerilog》Chapter 6.7.1 Net declarations with built-in net types 中对线网类型(net_type
)的数据类型(data_type
)做了限制:线网类型(net_type)的数据类型(data_type)只能为四值数据类型(4-state data type),并且net_type + reg + 声明列表
是非法的。
最后再来看赋值,主要注意其连续赋值(Continuous assignment)中的左值(LHS)与Verilog的区别:在SystemVerilog中,连续赋值的左值支持变量类型,而Verilog仅仅支持线网类型。
所以,如logic [15:0] data;
,虽然默认表示的是变量类型(等价于var logic [15:0] data;
),但是也支持连续赋值。由于其既支持连续赋值,又支持过程赋值,同时又是四值逻辑,所以logic数据类型可以代替Verilog设计代码中的大多数wire类型和reg类型,至于被综合成什么硬件,依然要由综合器根据上下文来进行推断。