在verilog中为多个块生成语句

在verilog中为多个块生成语句,verilog,system-verilog,Verilog,System Verilog,在代码中您可以看到,我想使用generate语句实例化LSFR\u计数器8次。它模拟得很好,但我想合成FPGA 我有以下问题: 1) 合成时我发现了一个错误 Line 31: Signal Reg[4] in unit Main is connected to following multiple drivers: 2) 我可以为#(.n(random))使用随机参数吗 模块主(输出调节、输入时钟、输入复位); 参数N=5; 导线[N-1:0]Reg; 生成 genvari=0; 对于(i;i

在代码中您可以看到,我想使用
generate
语句实例化
LSFR\u计数器
8次。它模拟得很好,但我想合成FPGA

我有以下问题:

1) 合成时我发现了一个错误

Line 31: Signal Reg[4] in unit Main is connected to following multiple drivers:
2) 我可以为
#(.n(random))
使用随机参数吗

模块主(输出调节、输入时钟、输入复位);
参数N=5;
导线[N-1:0]Reg;
生成
genvari=0;

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

wire[N-1:0]Reg[0:7];//谢谢@Morgan先生……你给了我第一个问题的答案。你能告诉我我在这里用了#(.N(5))吗5作为参数。我想把8个不同的数字作为循环,重复8次。每个循环都必须有自己不同的参数。@fame313你知道你为什么需要不同的长度吗?这可能有助于我引导答案。而且你的LFSR输出的是状态的全宽。我们知道这是坏的,因为它很高hly相关。这会给你一个问题,它们都是不同长度的,因此不会填充内存或数组。如果你只能从每个LFSR中输出2位,那么问题就容易多了。好的。从LSFR中,是否有可能在完成循环后,生成不同的随机序列?实际上我想要不同的序列状态对于2^n的随机数。但这里LSFR为每个周期提供相同的随机序列。使用的多项式定义了序列,在您之前的问题中,使用了以多项式为参数的LFSR。您需要从寄存器中驱动该序列,并检测何时返回序列的开始处并更改多项式。但为什么不这样做呢是否使用更长的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) );
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