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程序,我無法修復這些錯誤,請指出我的代碼中是否有其他錯誤。
您爲分隔邏輯提供的代碼將無法像您在循環中使用NBA時那樣工作。這意味着它不會更新每個循環的'quotient',而只會導致'quotient'被設置爲0或者從之前的值增加,這在你的情況下是來自前一次分割的嘗試。另外,在時鐘「always」塊中使用「餘數」的阻塞賦值,這會導致模擬不能正確模擬真實的硬件。 – Unn
@Unn我發現我的錯誤:)。如果我在所有塊中使用所有阻塞分配,是否會成爲硬件層面的問題?因爲如果我將NBA轉換爲阻止分配,它在模擬級別上可以正常工作。 – ssgr
雖然此設置在阻塞賦值時似乎可以正常工作,但只要將其集成到在其他某個模塊或塊中使用'quotient'或'remainder'的設計中,仿真就會出現競爭情況。爲了準確地模擬硬件,你需要在時鐘模塊中使用NBA(並且在組合模塊中使用BA,例如'always @(*)')。如果使用BA,綜合工具通常可以計算出來;但你絕對不應該在鍾控塊中使用BA。 – Unn