在多个块的verilog中生成语句

时间:2015-02-20 07:13:28

标签: verilog system-verilog

在代码中,您可以看到,我想使用LSFR_counter语句将generate实例化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 

1 个答案:

答案 0 :(得分:2)

多个潜水员意味着您有多个模块试图设置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