2017-03-17 229 views
0

我使用以下邏輯來實現在以Verilog雙峯預測器的2位飽和計數器和我也使用verilator如下:比較是恆定的,由於用Verilog無符號算術誤差verilator

• 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 

有什麼我做錯了嗎?

回答

0

請記住,Verilog中的reg是無符號值,無論您分配給reg,都是正值無符號值。所有與零比較的未排序值都將大於或等於零。如果你想簽署比較,你可以使用$signed()指令。

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

您的編譯器當前設置爲在某些警告時失敗。問題的根源可能是您的min_val參數當前爲0.同時,您只檢查min_val(它總是0,除非您在某處覆蓋該參數)是否大於RHS上的2位值(右手邊)沒有標誌。這意味着它永遠不會是消極的。

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

答案永遠是No,所以每個warnign的結果都是不變的。

是你希望如果這是需要測試

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

,你需要改變你的邏輯類型可能,或者改變你的比較。