在代码中,您可以看到,我想使用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
答案 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