systemverilog中有不同的数据类型,可以像下面这样使用:
reg [31:0] data; logic [31:0] data; bit [31:0] data;
他们三个如何不同?
reg和逻辑是完全一样的 . 这些数据类型出现在始终或初始块和存储值内,即始终为@(a)b <= a;,仅当'a'更改时才会评估reg b,否则它只会存储最后分配的值 .
电线只是简单的连接,需要不断驱动 . 我同意它们的行为与@Morgan提到的相同,但它们可以被想象成一条硬线,其值仅改变另一端的值或源的变化 .
reg 和 wire 是原始类型 . 不断分配导线并在特定点评估寄存器,这里的优点是模拟器可以进行优化 .
reg
wire
wire w_data; assign w_data = y; // Same function as above using reg reg r_data; always @* r_data = y ;
学习Verilog时常见的错误是假设reg类型意味着硬件中的寄存器 . 模拟器的早期优化可以通过其使用的上下文来完成 .
这引入了 logic ,可用于代替电线和注册 .
logic
logic w_data; assign w_data = y; // Same function as above using reg logic r_data; always @* r_data = y ;
类型 bit 和 byte 也已创建,只能容纳2个状态0或1没有x或z . byte 暗示 bit [7:0] . 使用这些类型可以提高速度,但我建议不要在RTL中使用它们,因为您的验证可能会错过未初始化的值或严重的重置 .
bit
byte
bit [7:0]
bit 和 byte 的使用在测试平台组件中会更常见,但在必须驱动x以刺激数据损坏和恢复的情况下可能会导致问题 .
Update
在撰写本文时,我的印象是 logic 无法用于三态,我无法找到我所依据的原始论文 . 在进一步更新,评论或编辑之前,我撤销了我的断言,即逻辑不能用于创建三态线 .
添加了 tri 类型,用于显式定义三态线 . 它基于 wire 的属性, logic 基于 reg 的属性 .
tri
tri t_data; assign t_data = (drive) ? y : 1'bz ;
如果您不再需要支持向后兼容性Verilog,那么我建议切换到使用 logic 和 tri . 使用 logic 辅助重新分解,而 tri 反映了三态线的设计意图 .
选择名称 reg turned out to be a mistake,因为根据如何执行赋值来推断寄存器的存在 . 因此, reg 的使用基本上已被弃用,而 logic 实际上是相同的类型 .
logic 是1位,4态数据类型
bit 是1位,2态数据类型,其模拟速度可能比 logic 快
如果 logic 也被声明为 wire ,它还具有支持多个驱动程序的附加功能 . 请注意,默认情况下 wire 等同于 wire logic .
wire logic
通常,“nets”(例如 wire 和 tri )最适合设计通信总线 .
实际上,对于RTL,无论您使用 reg , logic 还是 wire 声明通常都无关紧要 . 但是,如果必须明确声明4状态类型(而不是when you don't),则通常应选择 logic ,因为这是语言的意图 .
相关文章:
What’s the deal with those wire’s and reg’s in Verilog
An analysis of the "logic" data type by Cliff Cummings - 20021209
由于我无法添加评论,我要编写看似新答案的内容,但事实并非如此 . 叹!
@ e19293001,@ Morgan, logic 定义了一个与 bit 不同的4状态变量,因此 logic 变量可用于存储 1'bz ,因此以下代码有效并编译:
1'bz
logic t_data; assign t_data = (drive) ? y : 1'bz ;
但我同意在这些情况下反映设计意图 tri 而不是 logic (虽然我必须说我不会看到人们经常使用 tri 而不是 logic / wire ) .
逻辑数据类型不允许多个驱动程序 . 如果多个赋值,则最后一个赋值获胜 . 如果多个驱动程序尝试使用不同的值驱动它们,则返回/ Wire数据类型 . 逻辑数据类型只是分配最后一个赋值 .
5 Answers
reg和逻辑是完全一样的 . 这些数据类型出现在始终或初始块和存储值内,即始终为@(a)b <= a;,仅当'a'更改时才会评估reg b,否则它只会存储最后分配的值 .
电线只是简单的连接,需要不断驱动 . 我同意它们的行为与@Morgan提到的相同,但它们可以被想象成一条硬线,其值仅改变另一端的值或源的变化 .
reg
和wire
是原始类型 . 不断分配导线并在特定点评估寄存器,这里的优点是模拟器可以进行优化 .学习Verilog时常见的错误是假设reg类型意味着硬件中的寄存器 . 模拟器的早期优化可以通过其使用的上下文来完成 .
这引入了
logic
,可用于代替电线和注册 .类型
bit
和byte
也已创建,只能容纳2个状态0或1没有x或z .byte
暗示bit [7:0]
. 使用这些类型可以提高速度,但我建议不要在RTL中使用它们,因为您的验证可能会错过未初始化的值或严重的重置 .bit
和byte
的使用在测试平台组件中会更常见,但在必须驱动x以刺激数据损坏和恢复的情况下可能会导致问题 .Update
在撰写本文时,我的印象是
logic
无法用于三态,我无法找到我所依据的原始论文 . 在进一步更新,评论或编辑之前,我撤销了我的断言,即逻辑不能用于创建三态线 .添加了
tri
类型,用于显式定义三态线 . 它基于wire
的属性,logic
基于reg
的属性 .如果您不再需要支持向后兼容性Verilog,那么我建议切换到使用
logic
和tri
. 使用logic
辅助重新分解,而tri
反映了三态线的设计意图 .选择名称
reg
turned out to be a mistake,因为根据如何执行赋值来推断寄存器的存在 . 因此,reg
的使用基本上已被弃用,而logic
实际上是相同的类型 .logic
是1位,4态数据类型bit
是1位,2态数据类型,其模拟速度可能比logic
快如果
logic
也被声明为wire
,它还具有支持多个驱动程序的附加功能 . 请注意,默认情况下wire
等同于wire logic
.通常,“nets”(例如
wire
和tri
)最适合设计通信总线 .实际上,对于RTL,无论您使用
reg
,logic
还是wire
声明通常都无关紧要 . 但是,如果必须明确声明4状态类型(而不是when you don't),则通常应选择logic
,因为这是语言的意图 .相关文章:
What’s the deal with those wire’s and reg’s in Verilog
An analysis of the "logic" data type by Cliff Cummings - 20021209
由于我无法添加评论,我要编写看似新答案的内容,但事实并非如此 . 叹!
@ e19293001,@ Morgan,
logic
定义了一个与bit
不同的4状态变量,因此logic
变量可用于存储1'bz
,因此以下代码有效并编译:但我同意在这些情况下反映设计意图
tri
而不是logic
(虽然我必须说我不会看到人们经常使用tri
而不是logic
/wire
) .逻辑数据类型不允许多个驱动程序 . 如果多个赋值,则最后一个赋值获胜 . 如果多个驱动程序尝试使用不同的值驱动它们,则返回/ Wire数据类型 . 逻辑数据类型只是分配最后一个赋值 .