标签:ica direct https alt img desc 代码 注意 esc
作为引子,首先来看一段描述(内容引用自@Dr. Pong P. Chu的书籍之《FPGA Prototyping by SystemVerilog Examples: Xilinx MicroBlaze MCS SoC》的书籍说明部分),该段介绍了SystemVerilog
对比Verilog
在RTL
设计和建模时的新特性之一(logic
数据类型),然后下文我再展开对比介绍Verilog
和SystemVerilog
中的基本数据类型。
《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 thereg
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
andreg
types are misleading. A signal declared with thewire
type can be a connection wire or a component with memory (e.g., a latch). A variable declared with thereg
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. Thelogic
type can replace thewire
andreg
types in most codes. In addition, its name does not imply a specific hardware component and thus is more descriptive.
Verilog
的数据类型Verilog
语言提供两组基本的数据类型:变量数据类型(variable
)和线网数据类型(net
),这两种类型都是四值逻辑。具体参考《IEEE Standard for Verilog》Chapter 4 Data types。
net_type list_of_net_identifiers
,其中net_type
包含我们常用的如wire
、tri
、wand
、wor
等等(参考完整的线网声明:net_declaration);reg | integer | time
+list_of_variable_identifiers
或者real | realtime
+list_of_real_identifiers
(参考完整的变量声明:variable_declaration)。与数据类型相关的即是赋值,Verilog
中将连续赋值(Continuous assignment
)及过程赋值(Procedural assignment
)的左值(LHS
)分别限制在了线网(net
)和变量(variable
)类型:
SystemVerilog
的数据类型在Verilog
中,reg
经常用来表示存储组合逻辑或时序逻辑的变量,不过很多初学者会混淆其综合后的硬件单元。实际上,reg
变量并不一定会被综合为寄存器(register
),之所以需要被定义成reg
类型,实际上是从仿真的语义上来讲需要一个存储单元。而在SystemVerilog
中,我们引入了更具有描述性的logic
数据类型。下面来介绍SystemVerilog
中的数据类型:(细节请参考《IEEE Standard for SystemVerilog》Chapter 6 Data types)
SystemVerilog
添加了很多新的数据类型,但依然可以分为两组类型:变量类型(variable
)和线网类型(net
),来看他们的声明及定义:
net_type data_type list_of_net_decl_assignments;
[const][var] data_type list_of_variable_decl_assignments;
对比上述简化版之后,就可以发现:SystemVerilog
区分为类型和数据类型,且两种类型(net
&variable
)的变量声明方式相同,都是类型
+数据类型
+声明列表
。其中线网类型(net_type
)包含supply0 | supply1 | tri | triand | trior | trireg | tri0 | tri1 | uwire | wire | wand | wor
,与Verilog
相同;而变量类型(variable_type
)只需要关键字var
即可,并且var
可以省略。而Verilog
中的reg
、integer
、time
、real
、realtime
在SystemVerilog
中都是指数据类型,并且SystemVerilog
添加了很多新的数据类型:
其中又可以分为二值逻辑、四值逻辑;新增了枚举(enum
)、结构体(struct
)、字符串(string
)、类(class
)等一些新的数据类型,这里不展开介绍。只要明白,仅有数据类型时,其默认表示的是变量类型,因为关键字var
可以省略。另外,数据类型也可以省略,仅有类型声明时(如wire w;
、var v;
),此时数据类型被隐式声明为logic
:
logic
.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
)做了限制(Certain restrictions apply to the data type of a net):
这说明了线网类型(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
仅仅支持线网类型。
所以,如logic [15:0] data;
,虽然默认表示的是变量类型(等价于var logic [15:0] data;
),但是也支持连续赋值。由于其既支持连续赋值,又支持过程赋值,同时又是四值逻辑,所以logic
数据类型可以代替Verilog
设计代码中的大多数wire
类型和reg
类型,至于被综合成什么硬件,将由综合器根据上下文来进行推断。
对比 Verilog 和 SystemVerilog 中的基本数据类型
标签:ica direct https alt img desc 代码 注意 esc
原文地址:https://www.cnblogs.com/bitlogic/p/14577828.html