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

e19*_*001 19 system-verilog

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

reg [31:0] data;
logic [31:0] data;
bit [31:0] data;
Run Code Online (Sandbox Code Playgroud)

他们三个如何不同?

Mor*_*gan 26

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

wire w_data;
assign w_data = y;

// Same function as above using reg
reg r_data;
always @* 
  r_data = y ;
Run Code Online (Sandbox Code Playgroud)

学习Verilog时常见的错误是假设reg类型意味着硬件中的寄存器.模拟器的早期优化可以通过其使用的上下文来完成.

这介绍了logic哪些可用于代替电线和注册.

logic  w_data;
assign w_data = y;

// Same function as above using reg
logic r_data;
always @* 
  r_data = y ;
Run Code Online (Sandbox Code Playgroud)

的类型bitbyte也已创建了只能容纳2个状态0或1无X或Z.byte暗示bit [7:0].使用这些类型可以提高速度,但我建议不要在RTL中使用它们,因为您的验证可能会错过未初始化的值或严重的重置.

在testbench组件中使用bitbyte更常见,但在必须驱动x以刺激数据损坏和恢复的情况下可能会导致问题.


更新

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


tri类型已被添加,对于显式定义的三态线.它基于a的属性wire,logic是基于a的属性reg.

tri t_data;
assign t_data = (drive) ? y : 1'bz ;
Run Code Online (Sandbox Code Playgroud)

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


nob*_*bar 5

  • 名称的选择reg 被证明是错误的,因为寄存器的存在是根据如何执行分配来推断的.因此,reg基本上不赞成使用,logic实际上是相同的类型.

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

  • bit 是一个1位,2态数据类型,可以比模拟更快 logic
  • 如果a logic也声明为a wire,则它具有支持多个驱动程序的附加功能.请注意,默认情况下wire相当于wire logic.
  • 通常," "(例如wiretri)最适合于设计通信总线.

实际上,对于RTL,无论你是使用reg,还是logic,或者声明,通常都无关紧要wire.但是,如果你必须明确声明一个4状态类型(而不是你不这样做),你通常应该选择,logic因为这是语言的意图.


相关文章:

  • "相关文章"下的第二个链接已死:( (2认同)