22

systemverilog 中有不同的数据类型,可以使用如下:

reg [31:0] data;
logic [31:0] data;
bit [31:0] data;

他们三个有什么不同?

4

5 回答 5

28

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 ;

类型bitbyte也已创建,只能保持 2 个状态 0 或 1 没有 x 或 z。byte暗示bit [7:0]。使用这些类型可以稍微提高速度,但我建议不要在 RTL 中使用它们,因为您的验证可能会错过未初始化的值或关键重置。

bit和的使用byte在测试台组件中更为常见,但在必须驱动 x 以刺激数据损坏和恢复的情况下可能会导致问题。


更新

在撰写本文时,我的印象是logic不能用于三态,我找不到我所依据的原始论文。在进一步更新、评论或编辑之前,我撤销我的断言,即逻辑不能用于创建三态线


tri添加类型,用于明确定义三态线。它是基于 a 的属性wirelogic是基于 a 的属性reg

tri t_data;
assign t_data = (drive) ? y : 1'bz ;

如果您不再需要支持向后兼容性 Verilog,那么我建议您切换到使用logicand tri。使用logic有助于重构并tri 反映三态线的设计意图。

于 2012-11-08T08:32:41.233 回答
5
  • 名称的选择reg 被证明是一个错误,因为寄存器的存在是根据分配的执行方式来推断的。因此,reg基本上不推荐使用 of 来支持logic实际上是同一类型的 。

  • logic是 1 位 4 态数据类型

  • bit是一种 1 位 2 态数据类型,其模拟速度可能比logic
  • 如果 alogic也被声明为 a wire,则它具有支持多个驱动程序的附加功能。请注意,默认情况下wire等效于wire logic.
  • 一般来说,“网络”(例如wiretri)最适合设计通信总线。

实际上,对于RTLreg ,您是否使用、 或logic、 或声明通常并不重要wire。但是,如果您必须显式声明 4-state 类型(与您不需要时相反),您通常应该选择logic,因为这是该语言的意图。


相关文章:

于 2015-09-30T04:30:17.033 回答
3

由于我无法添加评论,因此我必须写出看起来像新答案但实际上并非如此的内容。叹!

@e19293001,@Morgan,logic定义了一个不同于 4 状态的变量bit,因此logic可以使用一个变量来存储1'bz,所以下面的代码是有效的并且可以编译:

logic t_data;
assign t_data = (drive) ? y : 1'bz ;

但是我同意在这些情况下tri应该使用而不是使用来反映设计意图logic(尽管我必须说我没有看到人们经常使用tri而不是logic/ )。wire

于 2013-05-11T12:31:36.440 回答
1

reg 和 logic 完全一样。这些数据类型出现在always 或initial 块中并存储值,即always @(a) b <= a;,reg b 仅在'a' 更改时才被评估,否则它只是存储它最后分配的值。

电线只是简单的连接,需要持续驱动。我同意它们的行为可以与@Morgan 提到的相同,但可以将它们想象成一根硬线,其值仅改变另一端的值或源改变。

于 2017-08-16T14:29:46.880 回答
0

逻辑数据类型不允许多个驱动程序。如果多个驱动程序尝试以不同的值驱动它们,则最后一个分配在多重分配的情况下获胜。Reg/Wire 数据类型给出 X。逻辑数据类型只是分配最后一个赋值值。

于 2014-07-28T06:27:50.410 回答