SystemVerilog数据类型的区别(reg,逻辑,位)

时间:2012-11-08 03:42:10

标签: system-verilog

systemverilog中有不同的数据类型,可以像下面这样使用:

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

这三者有何不同?

5 个答案:

答案 0 :(得分:26)

regwire是原始类型。不断分配导线并在特定点评估寄存器,这里的优点是模拟器可以进行优化。

wire w_data;
assign w_data = y;

// Same function as above using reg
reg r_data;
always @* 
  r_data = y ;

学习Verilog时常见的错误是假设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 no x或z。 byte隐含bit [7:0]。使用这些类型可以提高速度,但我建议不要在RTL中使用它们,因为您的验证可能会错过未初始化的值或严重的重置。

bitbyte的使用在测试平台组件中会更常见,但如果必须驱动x以刺激数据损坏和恢复,则会导致问题。


<强>更新

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


添加了tri类型,用于显式定义三态线。它基于wire的属性,logic基于reg的属性。

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

如果您不再需要支持向后兼容性Verilog,那么我建议您切换到使用logictri。使用logic辅助重新分解和tri反映了三态线的设计意图。

答案 1 :(得分:5)

  • 选择名称.innerContent{ position: relative; top: 50%; transform: translateY(-50%); } turned out to be a mistake,因为寄存器的存在是根据分配的执行方式推断的。因此,reg的使用基本上已被弃用,而reg实际上是同一类型。

  • logic是1位,4状态数据类型

  • logic是1位,2状态数据类型,其模拟速度可能比bit
  • 如果logic也被声明为logic,则它还具有支持多个驱动程序的附加功能。请注意,默认情况下wire相当于wire
  • 通常,“nets”(例如wire logicwire)最适合设计通信总线。

实际上,对于RTL,您使用trireg还是logic声明通常无关紧要。但是,如果您必须明确声明4状态类型(而不是when you don't),则通常应选择wire,因为这是该语言的目的。

相关文章:

答案 2 :(得分:2)

由于我无法添加评论,所以我要编写一个看似新答案的内容,但事实并非如此。感叹!

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

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

但我同意在这些情况下应反映设计意图tri而不是logic(尽管我必须说我看不到有人使用tri代替{经常{1}} / logic

答案 3 :(得分:0)

逻辑数据类型不允许多个驱动程序。如果多个赋值,则最后一个赋值获胜。如果多个驱动程序尝试使用不同的值驱动它们,则返回/ Wire数据类型。逻辑数据类型只是分配最后一个赋值。

答案 4 :(得分:0)

reg和逻辑是完全一样的。这些数据类型出现在始终或初始块和存储值内,即始终为@(a)b <= a;,只有当'a'改变时才会评估reg b,否则它只是存储它最后分配的值。

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