systemverilog中有不同的数据类型,可以像下面这样使用:
reg [31:0] data;
logic [31:0] data;
bit [31:0] data;
这三者有何不同?
答案 0 :(得分:26)
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
,可用于代替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 no x或z。 byte
隐含bit [7:0]
。使用这些类型可以提高速度,但我建议不要在RTL中使用它们,因为您的验证可能会错过未初始化的值或严重的重置。
bit
和byte
的使用在测试平台组件中会更常见,但如果必须驱动x以刺激数据损坏和恢复,则会导致问题。
<强>更新强>
在撰写本文时,我的印象是logic
无法用于三态,我无法找到我所依据的原始论文。在进一步更新,评论或编辑之前,我撤销了我的断言,逻辑不能用于创建三态线。
添加了tri
类型,用于显式定义三态线。它基于wire
的属性,logic
基于reg
的属性。
tri t_data;
assign t_data = (drive) ? y : 1'bz ;
如果您不再需要支持向后兼容性Verilog,那么我建议您切换到使用logic
和tri
。使用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
。wire logic
和wire
)最适合设计通信总线。实际上,对于RTL,您使用tri
,reg
还是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)
电线只是简单的连接,需要不断驱动。我同意它们的行为与@Morgan提到的相同,但它们可以被想象成一条硬线,其值只会改变另一端的值或源的变化。