【问题标题】:Difference of SystemVerilog data types (reg, logic, bit)SystemVerilog 数据类型的区别(寄存器、逻辑、位)
【发布时间】:2012-11-08 03:42:10
【问题描述】:

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

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

他们三个有什么不同?

【问题讨论】:

    标签: system-verilog


    【解决方案1】:

    regwire 是原始类型。电线是不断分配的,并在特定点评估 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 中使用它们,因为您的验证可能会错过未初始化的值或严重的重置。

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


    更新

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


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

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

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

    【讨论】:

    • 查看this other answer 以查看逻辑不能与线材在同一个地方使用的一种情况。看看 cmets。
    【解决方案2】:
    • 选择名称regturned out to be a mistake,因为寄存器的存在是根据分配的执行方式来推断的。因此,reg 的使用基本上已被弃用,取而代之的是 logic,这实际上是同一类型。

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

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

    实际上,对于RTL,使用reglogicwire 声明通常并不重要。但是,如果您必须明确声明 4 状态类型(而不是 when you don't),您通常应该选择 logic,因为这是该语言的意图。


    相关文章:

    【讨论】:

    • “相关文章”下的第二个链接已失效:(
    【解决方案3】:

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

    @e19293001、@Morgan、logicbit 不同,定义了一个四态变量,因此logic 变量可用于存储1'bz,因此以下代码有效并可以编译:

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

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

    【讨论】:

    • 我知道逻辑包含 4 个值 (0,1,z,x),但确定将其用于三态时存在问题。我在 LRM 中找不到说明这一点的论文或部分。我想你可能是对的,逻辑可以用来驱动三态。
    【解决方案4】:

    reg 和逻辑是完全一样的。这些数据类型出现在始终或初始块中并存储值,即始终@(a) b

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

    【讨论】:

      【解决方案5】:

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

      【讨论】:

        猜你喜欢
        • 2017-07-15
        • 1970-01-01
        • 2023-03-09
        • 1970-01-01
        • 2014-06-07
        • 1970-01-01
        • 1970-01-01
        • 2012-01-28
        • 1970-01-01
        相关资源
        最近更新 更多