2015-10-16 212 views
0

得到錯誤9: error: genvar is missing for generate "loop" variable 'r'. 1 error(s) during elaboration.genvar缺少產生「循環」變量:VERILOG

整個代碼:

module divider (dividend, divisor, quotient, remainder) ; 
    input [7:0] dividend ; // eight input lines modeled as a bus 
    input [7:0] divisor ; // select lines bundled as a bus 
    output reg [7:0] quotient ; 
    output reg [7:0] remainder ; 
    reg [7:0] r; 
    reg [7:0] q; 
    assign q = 0; 
    for(r = dividend; r >= divisor; r = r - divisor) 
     assign q = q + 1; 
    assign remainder = r; 
    assign quotient = q; 
endmodule 

module main; 
    reg [7:0] dd; 
    assign dd = 12; 
    reg [7:0] dr; 
    assign dr = 5; 
    reg [7:0] q; 
    reg [7:0] r; 
    wire a = divider(dd, dr, q, r); 
    initial begin 
    $display("quotient %d", q); 
    $display("remainder %d",r); 
    end 
endmodule 

我想寫一個模塊通過反覆的減使用行爲來計算商和餘數在verilog中建模。這是我的第一個verilog程序,我無法修復這些錯誤,請指出我的代碼中是否有其他錯誤。

回答

2

問題在於for循環。您可以使用生成塊或總是塊來使用它。一個做的方法如下:

module divider (dividend, divisor,quotient, remainder) ; 
input [7:0] dividend ; // eight input lines modeled as a bus 
input [7:0] divisor ; // select lines bundled as a bus 

output reg [7:0] quotient ; 
output reg[7:0] remainder ; 

always @(*) 
    begin 
     quotient=0; 
     for(remainder = dividend; remainder >= divisor; remainder = remainder - divisor) 
      quotient = quotient + 1;    
    end 

endmodule 



module main; 

reg[7:0] dd; 
reg[7:0] dr; 

wire [7:0] q; 
wire [7:0] r; 

divider d0(.dividend(dd), .divisor(dr), .quotient(q), .remainder(r)) ; 

initial begin 
    dd=12; 
    dr=5; 
end 

initial begin 
#20 $display("quotient %d", q); 
#25 $display("remainder %d",r); 
end 

endmodule 

幾點需要注意:

  1. 如果你婉分配使用分配聲明一個變量,聲明變量作爲
  2. 在測試臺中,您需要將輸入定義爲「reg」並將輸出定義爲「wire」。
  3. 您不能在for循環中使用指定
+0

您爲分隔邏輯提供的代碼將無法像您在循環中使用NBA時那樣工作。這意味着它不會更新每個循環的'quotient',而只會導致'quotient'被設置爲0或者從之前的值增加,這在你的情況下是來自前一次分割的嘗試。另外,在時鐘「always」塊中使用「餘數」的阻塞賦值,這會導致模擬不能正確模擬真實的硬件。 – Unn

+0

@Unn我發現我的錯誤:)。如果我在所有塊中使用所有阻塞分配,是否會成爲硬件層面的問題?因爲如果我將NBA轉換爲阻止分配,它在模擬級別上可以正常工作。 – ssgr

+2

雖然此設置在阻塞賦值時似乎可以正常工作,但只要將其集成到在其他某個模塊或塊中使用'quotient'或'remainder'的設計中,仿真就會出現競爭情況。爲了準確地模擬硬件,你需要在時鐘模塊中使用NBA(並且在組合模塊中使用BA,例如'always @(*)')。如果使用BA,綜合工具通常可以計算出來;但你絕對不應該在鍾控塊中使用BA。 – Unn