【发布时间】:2012-11-08 03:42:10
【问题描述】:
systemverilog 中有不同的数据类型,可以像下面这样使用:
reg [31:0] data;
logic [31:0] data;
bit [31:0] data;
他们三个有什么不同?
【问题讨论】:
标签: system-verilog
systemverilog 中有不同的数据类型,可以像下面这样使用:
reg [31:0] data;
logic [31:0] data;
bit [31:0] data;
他们三个有什么不同?
【问题讨论】:
标签: system-verilog
reg 和 wire 是原始类型。电线是不断分配的,并在特定点评估 regs,这里的好处是模拟器可以进行优化。
wire w_data;
assign w_data = y;
// Same function as above using reg
reg r_data;
always @*
r_data = y ;
学习 Verilog 时的一个常见错误是假设 a reg 类型意味着硬件中的寄存器。模拟器的早期优化可以通过它的使用上下文来完成。
这里引入了logic,可以用来代替wire和reg。
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 的使用在测试台组件中更为常见,但在必须驱动 x 以刺激数据损坏和恢复的情况下可能会导致问题。
更新
在撰写本文时,我的印象是logic 不能用于三态,我无法找到我基于此的原始论文。在进一步更新、cmets 或编辑之前,我撤销我的断言,即 逻辑不能用于创建三态线。
添加了tri 类型,用于明确定义三态线。它是基于wire的属性,logic是基于reg的属性。
tri t_data;
assign t_data = (drive) ? y : 1'bz ;
如果您不再需要支持向后兼容性 Verilog,那么我建议您改用 logic 和 tri。使用logic 有助于重构,并且tri 反映了三态线的设计意图。
【讨论】:
选择名称regturned out to be a mistake,因为寄存器的存在是根据分配的执行方式来推断的。因此,reg 的使用基本上已被弃用,取而代之的是 logic,这实际上是同一类型。
logic 是 1 位 4 状态数据类型
bit 是一种 1 位、2 状态数据类型,其模拟速度可能比 logic 快
logic 也被声明为wire,则它具有支持多个驱动程序的附加功能。请注意,默认情况下wire 等同于wire logic。wire和tri)最适合设计通信总线。实际上,对于RTL,使用reg、logic 或wire 声明通常并不重要。但是,如果您必须明确声明 4 状态类型(而不是 when you don't),您通常应该选择 logic,因为这是该语言的意图。
相关文章:
【讨论】:
由于我无法添加评论,我必须写出看起来像新答案但实际上并非如此的内容。叹息!
@e19293001、@Morgan、logic 与bit 不同,定义了一个四态变量,因此logic 变量可用于存储1'bz,因此以下代码有效并可以编译:
logic t_data;
assign t_data = (drive) ? y : 1'bz ;
但我同意在这些情况下应该使用tri 而不是logic 来反映设计意图(尽管我必须说我没有看到人们使用tri 而不是logic/wire太频繁了)。
【讨论】:
reg 和逻辑是完全一样的。这些数据类型出现在始终或初始块中并存储值,即始终@(a) b
电线只是简单的连接,需要持续驱动。我同意它们的行为可以与@Morgan 提到的相同,但可以将它们想象成一根硬线,其值仅改变另一端的值或源改变。
【讨论】:
逻辑数据类型不允许多个驱动程序。如果多个驱动程序尝试使用不同的值驱动它们,则最后一个分配在多重分配的情况下获胜。Reg/Wire 数据类型给出 X。逻辑数据类型只是分配最后一个赋值。
【讨论】: