Verilog 和 SystemVerilog 中的基本数据类型深入探讨

文章目录

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 | realtimeSystemVerilog中则都是指数据类型(data_type

对比上述简化版之后,就可以发现:SystemVerilog区分为类型数据类型,且两种类型(net_typevariable_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类型,至于被综合成什么硬件,依然要由综合器根据上下文来进行推断

上一篇:正则表达式的简介


下一篇:《Verilog数字系统设计教程》第三章笔记