systemverilog 中有不同的数据类型,可以使用如下:
reg [31:0] data;
logic [31:0] data;
bit [31:0] data;
他们三个有什么不同?
systemverilog 中有不同的数据类型,可以使用如下:
reg [31:0] data;
logic [31:0] data;
bit [31:0] data;
他们三个有什么不同?
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
不能用于三态,我找不到我所依据的原始论文。在进一步更新、评论或编辑之前,我撤销我的断言,即逻辑不能用于创建三态线。
已tri
添加类型,用于明确定义三态线。它是基于 a 的属性wire
,logic
是基于 a 的属性reg
。
tri t_data;
assign t_data = (drive) ? y : 1'bz ;
如果您不再需要支持向后兼容性 Verilog,那么我建议您切换到使用logic
and tri
。使用logic
有助于重构并tri
反映三态线的设计意图。
名称的选择reg
被证明是一个错误,因为寄存器的存在是根据分配的执行方式来推断的。因此,reg
基本上不推荐使用 of 来支持logic
实际上是同一类型的 。
logic
是 1 位 4 态数据类型
bit
是一种 1 位 2 态数据类型,其模拟速度可能比logic
logic
也被声明为 a wire
,则它具有支持多个驱动程序的附加功能。请注意,默认情况下wire
等效于wire logic
.wire
和tri
)最适合设计通信总线。实际上,对于RTLreg
,您是否使用、 或logic
、 或声明通常并不重要wire
。但是,如果您必须显式声明 4-state 类型(与您不需要时相反),您通常应该选择logic
,因为这是该语言的意图。
相关文章:
由于我无法添加评论,因此我必须写出看起来像新答案但实际上并非如此的内容。叹!
@e19293001,@Morgan,logic
定义了一个不同于 4 状态的变量bit
,因此logic
可以使用一个变量来存储1'bz
,所以下面的代码是有效的并且可以编译:
logic t_data;
assign t_data = (drive) ? y : 1'bz ;
但是我同意在这些情况下tri
应该使用而不是使用来反映设计意图logic
(尽管我必须说我没有看到人们经常使用tri
而不是logic
/ )。wire
reg 和 logic 完全一样。这些数据类型出现在always 或initial 块中并存储值,即always @(a) b <= a;,reg b 仅在'a' 更改时才被评估,否则它只是存储它最后分配的值。
电线只是简单的连接,需要持续驱动。我同意它们的行为可以与@Morgan 提到的相同,但可以将它们想象成一根硬线,其值仅改变另一端的值或源改变。
逻辑数据类型不允许多个驱动程序。如果多个驱动程序尝试以不同的值驱动它们,则最后一个分配在多重分配的情况下获胜。Reg/Wire 数据类型给出 X。逻辑数据类型只是分配最后一个赋值值。