2015-10-16 433 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