System verilog SystemVerilog数据类型的差异(reg、逻辑、位)
systemverilog中有不同的数据类型,可以使用如下方式:System verilog SystemVerilog数据类型的差异(reg、逻辑、位),system-verilog,System Verilog,systemverilog中有不同的数据类型,可以使用如下方式: reg [31:0] data; logic [31:0] data; bit [31:0] data; 这三种类型有何不同?reg和wire是原始类型。导线不断分配,并在特定点对REG进行评估,此处的优势在于模拟器可进行优化 wire w_data; assign w_data = y; // Same function as above using reg reg r_data; always @* r_data =
reg [31:0] data;
logic [31:0] data;
bit [31:0] data;
这三种类型有何不同?
reg
和wire
是原始类型。导线不断分配,并在特定点对REG进行评估,此处的优势在于模拟器可进行优化
wire w_data;
assign w_data = y;
// Same function as above using reg
reg r_data;
always @*
r_data = y ;
学习Verilog时的一个常见错误是假设A reg类型意味着硬件中的寄存器。模拟器的早期优化可以通过其使用环境来完成
这引入了逻辑
,可以用来代替导线和寄存器
logic w_data;
assign w_data = y;
// Same function as above using reg
logic r_data;
always @*
r_data = y ;
还创建了类型位
和字节
,它们只能保存两种状态0或1 no x或z<代码>字节表示位[7:0]
。使用这些类型可以稍微提高速度,但我建议不要在RTL中使用它们,因为您的验证可能会错过未初始化的值或关键重置
在测试台组件中,位
和字节
的使用更为常见,但如果必须驱动x来刺激数据损坏和恢复,则可能会导致问题
更新 在撰写本文时,我的印象是,
logic
不能用于tristate,我无法找到我基于此的原始论文。在进一步更新、注释或编辑之前,我撤销了逻辑不能用于创建三态线的断言
添加了
tri
类型,用于显式定义三态线。它基于导线的属性
,逻辑
基于reg
的属性
tri t_data;
assign t_data = (drive) ? y : 1'bz ;
如果您不再需要支持向后兼容的Verilog,那么我建议您切换到使用
logic
和tri
。使用logic
有助于重新分解,而tri
反映了三态线的设计意图。由于我无法添加注释,我不得不写一个看起来像新答案但不是新答案的东西。唉
@e19293001,@Morgan,logic
定义了一个不同于bit
的4状态变量,因此logic
变量可用于存储1'bz
,因此以下代码有效并可编译:
logic t_data;
assign t_data = (drive) ? y : 1'bz ;
但我同意在这些情况下,为了反映设计意图,应该使用
tri
而不是logic
(尽管我必须说,我没有看到人们经常使用tri
而不是logic
/wire
。逻辑数据类型不允许多个驱动程序。如果有多个分配,则最后一个分配获胜。如果多个驱动程序尝试使用不同的值驱动它们,则Reg/Wire数据类型给出X。逻辑数据类型只分配最后一个赋值。- 选择名称
,因为寄存器的存在是根据赋值的执行方式推断出来的。因此,reg
的使用基本上被弃用,取而代之的是实际上是相同类型的reg
逻辑
是一种1位4状态数据类型逻辑
是一种1位、2状态的数据类型,其模拟速度可能快于位
逻辑
- 如果
也被声明为逻辑
,则它具有支持多个驱动程序的附加功能。请注意,默认情况下,导线
等同于wire
wire logic
- 一般来说,“”(例如
和导线
)最适合设计通信总线tri
reg
、还是logic
、还是wire
进行声明,通常都无关紧要。但是,如果必须对4状态类型进行显式声明(与之相反),则通常应选择logic
,因为这是该语言的目的
相关文章: