由于verilog与verilator中的无符号算术错误,比较是恒定的

Posted

技术标签:

【中文标题】由于verilog与verilator中的无符号算术错误,比较是恒定的【英文标题】:Comparison is constant due to unsigned arithmetic error in verilog with verilator 【发布时间】:2017-03-17 21:29:35 【问题描述】:

我正在使用以下逻辑在 Verilog 的双峰预测器中实现 2 位饱和计数器,并且我还使用如下验证器:

• For each branch, maintain a 2-bit saturating counter:
-if the branch is taken: counter = min(3,counter+1)
-if the branch is not taken: counter = max(0,counter-1)
• If (counter >= 2), predict taken, else predict not taken

module Bimodal(
input clk,
input reset,
input taken, //from ALU unit in execute stage
input branch, //from control unit in decode stage
input [31:0] instrAddr, // current address taken from fetch/decode stage
output reg predicted_taken_or_not);

reg [1:0] saturating_counter [0:1023];


integer i;
parameter max_val = 3 ;
parameter min_val = 0 ;

assign predicted_taken_or_not = saturating_counter[instrAddr[11:2]]>= 2'd2 && branch? 1'd1 : 1'd0;


// write ports to update the 2-bit saturating counter
always @(posedge clk) begin

if(reset) begin
 for(int i=0; i<1024; i++) begin
    saturating_counter[i] = 2'd1;
 end
end

else if (taken) begin
if(max_val>saturating_counter[instrAddr[11:2]]+1)
    saturating_counter[instrAddr[11:2]]<=saturating_counter[instrAddr[11:2]]+1;
else
    saturating_counter[instrAddr[11:2]]<=max_val;
end

else if (~taken) begin
if(min_val>saturating_counter[instrAddr[11:2]]-1)
   saturating_counter[instrAddr[11:2]]<=min_val;
else
    saturating_counter[instrAddr[11:2]]<=saturating_counter[instrAddr[11:2]]-1;
end

end

endmodule

但我收到以下错误

%Warning-UNSIGNED: Bimodal.v:36: Comparison is constant due to unsigned arithmetic
%Warning-UNSIGNED: Use "/* verilator lint_off UNSIGNED */" and lint_on around source to disable this message.
%Error: Exiting due to 1 warning(s)
%Error: Command Failed /home/verilator-3.884/verilator_bin -O4 --cc MIPS.v --exe sim_main.cpp

是不是我做错了什么?

【问题讨论】:

【参考方案1】:

请记住,verilog 中的regs 是无符号值,而您分配给 reg 的任何值都是正的无符号值。并且您与零比较的所有未正弦值都将大于或等于零。如果你想要一个有符号的比较,你可以使用$signed() 指令。

if(min_val>$signed(saturating_counter[instrAddr[11:2]]-1))

【讨论】:

【参考方案2】:

您的编译器当前设置为因某些警告而失败。问题的根源可能是您的 min_val 参数当前为 0。同时,您只检查 min_val(除非您在某处覆盖该参数,否则始终为 0)是否大于 RHS 上的 2 位值(对手边)没有任何迹象。这意味着它永远不会是负数。

Is 0 > 0 ?  No
Is 0 > 1 ?  No
is 0 > 2 ?  No
Is 0 > 3 ?  No

答案总是“否”,因此根据警告结果是不变的。

您是否希望测试

Is 0 > 0 ? No
Is 0 > 1 ? No
Is 0 > -2 ? Yes
Is 0 > -1 ? Yes

如果需要,您可能需要更改逻辑类型,或更改比较。

【讨论】:

以上是关于由于verilog与verilator中的无符号算术错误,比较是恒定的的主要内容,如果未能解决你的问题,请参考以下文章

Verilator 可以创建类层次结构吗?

脚本推荐-verilog自动对齐

C中的无符号字符未按预期工作

verilog中符号位的扩展问题

如何将字节数据从套接字写入 C 中的无符号字符向量? [关闭]

verilog中为啥非阻塞赋值要用绝对时延