对比 Verilog 和 SystemVerilog 中的基本数据类型

Posted @ 2021-03-25 15:55  bitlogic

作为引子,首先来看一段描述,该段介绍了SystemVerilog对比VerilogRTL设计建模时的新特性之一(logic数据类型),然后下文我再详细展开对比介绍VerilogSystemVerilog中的基本数据类型。(该段内容引用自 @Dr. Pong P. Chu书籍列表《FPGA Prototyping by SystemVerilog Examples: Xilinx MicroBlaze MCS SoC》书籍说明部分

《SystemVerilog vs Verilog in RTL Design》By Pong P. Chu, Chapter 3.1 logic DATA TYPE

Verilog‐2001 divides the data types into a "net" group and a "variable" group. The former is used in the output of a continuous assignment and the wire type is the most commonly used type in the group. The latter is used in the output of a procedural assignment and the reg type is the most commonly used type in the group. Verilog‐2001 has a specific set of rules and restrictions regarding the assignment and connection of signals from the different groups.

The names of the wire and reg types are misleading. A signal declared with the wire type can be a connection wire or a component with memory (e.g., a latch). A variable declared with the reg type may or may not infer a register. It can be a connecting wire, a register, a latch, or a "C‐like software variable". Furthermore, the rules and restrictions imposed on assignment and connection of signals from different the groups are confusing and unnecessary.

SystemVerilog introduces the logic data type. It can be used in the variable group or net group, which is inferred automatically from context. The logic type can replace the wire and reg types in most codes. In addition, its name does not imply a specific hardware component and thus is more descriptive.

1. Verilog的数据类型#

Verilog语言提供两组基本的数据类型:变量数据类型(variable)和线网数据类型(net),这两种类型都是四值逻辑。具体请参考《IEEE Standard for Verilog》Chapter 4 Data types。

  • 对线网的声明进行简化,即:net_type + list_of_net_identifiers,其中net_type包含我们常用的如wiretriwandwor等等(参考完整的线网声明:net_declaration);
  • 对变量的声明进行简化,即:reg | integer | time | real | realtime + list_of_variable_identifiers(参考完整的变量声明:variable_declaration)。

可以看到,在Verilog中,线网及变量的声明都很简单,都只有两部分:如net_type | reg | integer + 声明列表即可。另外,再来看Verilog中的赋值,Verilog中将连续赋值(Continuous assignment)及过程赋值(Procedural assignment)中的左值(LHS)分别限制为了线网(net)和变量(variable)类型,换言之,如我们常用的wire类型(net)只可以被连续赋值,以及我们常用的reg类型(variable)只可以被过程赋值:

image-20210324100218290

Verilog中,reg经常用来表示存储组合逻辑或时序逻辑的变量,不过很多初学者会混淆其综合后的硬件单元。实际上,reg变量并不一定会被综合为寄存器(register),之所以定义成reg类型,是表示从仿真的语义上来讲需要一个存储单元,而与综合后的硬件电路没有直接的关联,所以对初学者而言有时会具有误导性。而在SystemVerilog中,我们便引入了更具有描述性的logic数据类型,下面来介绍SystemVerilog中的数据类型。

2. SystemVerilog的数据类型#

SystemVerilog添加了很多新的数据类型,但依然可以分为两组类型:变量类型(variable)和线网类型(net),来看他们的声明及定义如下,具体请参考《IEEE Standard for SystemVerilog》Chapter 6 Data types。

  • 对线网类型的声明进行简化,即(参考完整的线网声明:net_declaration):
    • net_type + data_type + list_of_net_decl_assignments
  • 对变量类型的声明进行简化,即(参考完整的变量声明:variable_declaration):
    • [const][var] + data_type + list_of_variable_decl_assignments

对比上述简化版之后,就可以发现:SystemVerilog区分为类型数据类型,且两种类型netvariable)的变量声明方式相同,都是三部分类型 + 数据类型 + 声明列表。其中线网类型(net_type)包含supply0 | supply1 | tri | triand | trior | trireg | tri0 | tri1 | uwire | wire | wand | wor,与Verilog相同;而变量类型(variable_type)只需要关键字var即可,并且var可以省略。另外注意,原来Verilog中的regintegertimerealrealtimeSystemVerilog中则都属于数据类型,并且SystemVerilog又添加了很多新的数据类型

image-20210324110320132

其中又可以分为二值逻辑、四值逻辑;新增了枚举(enum)、结构体(struct)、字符串(string)、类(class)等一些新的数据类型,这里不展开介绍。只要明白,仅有数据类型时(如reg r;byte b;logic c;),其默认表示的是变量类型,因为关键字var可以省略。另外,数据类型也可以省略,仅有类型声明时(如wire w;var v;),此时数据类型被隐式声明为logic

  • If a data type is not specified in the net declaration or if only a range and/or signing is specified, then the data type of the net is implicitly declared as logic.
  • If a data type is not specified in the variable declaration or if only a range and/or signing is specified, then the data type of the variable is implicitly declared as 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;"

再来看到,既然线网类型的声明也是线网类型 + 数据类型net_type + data_type),而在SystemVerilog中,像regbitbyteint等,又都属于数据类型(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)单独做了限制说明(Certain restrictions apply to the data type of a net):

  • A valid data type for a net shall be one of the following:
    • A 4-state integral type, including a packed array or packed structure.
    • A fixed-size unpacked array or unpacked structure, where each element has a valid data type for a net.
  • A lexical restriction applies to the use of the reg keyword in a net or port declaration. A net type keyword shall not be followed directly by the reg keyword. The reg keyword can be used in a net or port declaration if there are lexical elements between the net type keyword and the reg keyword.

这说明了线网类型(net_type)的数据类型(data_type)只能为四值数据类型(4-state data type),并且net_type + reg + list_of_net_decl是非法的。以下都是合法的线网类型声明(net declarations):

wire logic w;
wire [15:0] ww;
trireg (large) logic #(0,0,0) cap1;
typedef logic [31:0] addressT;
wire addressT w1;
wire struct packed { logic ecc; logic [7:0] data; } memsig;

最后再来看赋值,主要注意其连续赋值(Continuous assignment)中的左值(LHS)与Verilog的区别:在SystemVerilog中,连续赋值的左值支持变量类型,而Verilog仅仅支持线网类型。这意味着,在SystemVerilog中,甚至可以有reg a; assign a = 1'b1;也不会报错(请不要在实际代码中这么书写,建议使用logic数据类型)。

所以,在SystemVerilog中,有如logic [15:0] data;,虽然默认表示的是变量类型(等价于var logic [15:0] data;),但是也支持连续赋值。由于其既支持连续赋值,又支持过程赋值,同时又是四值逻辑,所以logic数据类型可以代替Verilog设计代码中的大多数wire类型和reg类型,至于被综合成什么硬件,依然要由综合器根据上下文来进行推断。

3. 概括对比总结#

作者:bitlogic

出处:https://www.cnblogs.com/bitlogic/p/14577828.html

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。

posted @   bitlogic  阅读(1931)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
点击右上角即可分享
微信分享提示
选择主题