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