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