在 verilog 中为多个块生成语句

Generate Statement in verilog for multiple Blocks

在代码中你可以看到,我想使用 generate 语句实例化 LSFR_counter 8 次。它模拟得很好,但我想为 FPGA 进行综合。

我遇到的问题是:

1) 合成时发现错误。

Line 31: Signal Reg[4] in unit Main is connected to following multiple drivers:

2) 我可以为 #(.n(random)) 使用随机参数吗?

module Main( output Reg , input clk , input reset );     

 parameter N =5 ;
 wire  [N-1:0] Reg ; 
 generate    
   genvar i =0 ;
   for (i ; i<8 ; i=i+1 )
   begin 
   LSFR_counter   #(.n(5)) F1  ( .Reg (Reg )  , .clk (clk ), .reset(reset) );  
   end 
 endgenerate 
endmodule

    module LSFR_counter  #(parameter n=6)( output Reg, input clk, input reset);
    //parameter n=6; // Change more than n to change LFSR length.

    reg [n:1]Reg; //All procedure outputs must be registered

    always @(posedge clk or posedge reset)
        if
        (reset) Reg <=1;
        else
        Reg <= {Reg[n-1:2], Reg[n]^Reg[1], Reg[n]};
    endmodule 

多个潜水员意味着您有多个模块试图设置 Reg 的值。作为旁注,我真的建议使用 Reg 以外的其他东西作为信号名称,尤其是因为在顶层它是一根电线。

想想你围绕 LFSR 生成的东西,它会展开成类似这样的东西:

LSFR_counter   #(.n(5)) F1_1  ( .Reg (Reg )  , .clk (clk ), .reset(reset) );
LSFR_counter   #(.n(5)) F1_2  ( .Reg (Reg )  , .clk (clk ), .reset(reset) );
LSFR_counter   #(.n(5)) F1_3  ( .Reg (Reg )  , .clk (clk ), .reset(reset) );

clk 和 reset 是输入,它们可以驱动多个模块,但 reg 是它们都试图驱动的输出。

在模拟中,您可能看不到问题,因为您有多个模块都驱动完全相同的值。

您可能想要以下内容:

wire  [N-1:0] Reg [0:7]; //<-- memory
genvar i =0 ;   
generate    
  for (i ; i<8 ; i=i+1 ) begin 
    LSFR_counter #(
     .n(5)
    ) F1  ( 
     .Reg  (Reg[i]  ), //<-- write to part of memory
     .clk  (clk  ),
     .reset(reset) 
    );  
  end 
endgenerate