Home Articles

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

Asked
Viewed 1725 times
18

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

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

他们三个如何不同?

5 Answers

  • 26

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

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

  • 5

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

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

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

    这引入了 logic ,可用于代替电线和注册 .

    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以刺激数据损坏和恢复的情况下可能会导致问题 .


    Update

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


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

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

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

  • 2
    • 选择名称 reg turned out to be a mistake,因为根据如何执行赋值来推断寄存器的存在 . 因此, reg 的使用基本上已被弃用,而 logic 实际上是相同的类型 .

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

    • bit 是1位,2态数据类型,其模拟速度可能比 logic

    • 如果 logic 也被声明为 wire ,它还具有支持多个驱动程序的附加功能 . 请注意,默认情况下 wire 等同于 wire logic .

    • 通常,“nets”(例如 wiretri )最适合设计通信总线 .

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


    相关文章:

  • 0

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

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

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

    但我同意在这些情况下反映设计意图 tri 而不是 logic (虽然我必须说我不会看到人们经常使用 tri 而不是 logic / wire ) .

  • 0

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

Related