在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