generate";缺少genvar;“循环”;变量:verilog

generate";缺少genvar;“循环”;变量:verilog,verilog,hdl,Verilog,Hdl,获取错误9:错误:generate“loop”变量“r”缺少genvar。 细化过程中出现1个错误。 整个代码: 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

获取错误
9:错误:generate“loop”变量“r”缺少genvar。
细化过程中出现1个错误。

整个代码:

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程序,我在修复这些错误时遇到问题,请指出我的代码中是否有任何其他错误。

问题在于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
需要注意的几件事:

  • 如果要使用assign语句指定变量,请将该变量声明为wire
  • 在测试台中,您需要将输入定义为“reg”,将输出定义为“wire”
  • 不能在for循环中使用分配

  • 为除法器逻辑提供的代码在循环中使用NBA时无法正常工作。这意味着它不会在每个循环上更新
    ,而只会导致
    被设置为0或从其上一个值递增,在您的情况下,该值是从上一次尝试除法得到的。另外,在一个有时钟的
    始终
    块中,对
    余数
    使用阻塞分配,这会导致模拟不能正确模拟真实硬件。@Unn我发现了错误:)。如果我在always block中使用所有阻塞分配,在硬件级别会有问题吗?因为如果我将NBA转换为分块分配,它在模拟级别可以正常工作。虽然此设置在分块分配中似乎可以正常工作,但只要您将其集成到在其他模块或块中使用商或余数的设计中,模拟就会有竞争条件。为了准确地模拟硬件,您需要在时钟块中使用NBA(在组合块中使用BA,如
    始终@(*)
    )。如果你使用BA,合成工具通常可以解决这个问题;但是你不应该在计时块中使用BA。