Verilog 中整数和 reg 变量类型有什么区别?

RMa*_*rms 2 verilog vivado

使用 Verilog 几个月后,我很好奇以下内容之间有什么区别:

reg [31:0] sum; 
integer sum;
Run Code Online (Sandbox Code Playgroud)

既然整数只是一个32位值,为什么不能直接用reg来表示呢?为什么一个在内存使用或访问时间方面可能比另一个更有效?请告诉我您的想法,或者您是否需要我进一步阐述我的问题。

使用整数的示例:

integer t = 0;

always @(posedge clk) begin  
    if (t < 9999) t = t + 1; 
    else t = 0;
end
Run Code Online (Sandbox Code Playgroud)

使用 Reg 的示例:

reg[13:0] t = 14'b0; //Represent up to 16383

always @(posedge clk) begin  
    if (t < 9999) t = t + 14'b00000000000001;
    else t = 14'b0;
end
Run Code Online (Sandbox Code Playgroud)

dav*_*_59 5

integer sum; // is equivalent to 
reg signed [31:0] sum;
Run Code Online (Sandbox Code Playgroud)

Verilog 在 20 世纪 80 年代诞生时,integer是一种有符号、无大小的 4 状态积分类型。其物理尺寸是从模拟主机工具推断出来的。综合工具将根据所使用的上下文推断其大小(即for最终展开为一组常量值的循环)。

但后来的 Verilog 版本和现在的 SystemVerilog 只是用作integer具有预定义 32 位宽度的 4 态签名类型。意识到 4 状态 32 位类型实际上占用 64 位。保持其价值。

另请注意,SystemVerilog 将reg关键字重命名为logic因为此数据类型从来不专门用于描述寄存器。另请参阅: https: //blogs.sw.siemens.com/verificationhorizo​​ns /2013/05/03/wire-vs-reg/