gpt4 book ai didi

verilog - Quartus 不允许在 Verilog 中使用生成模块

转载 作者:行者123 更新时间:2023-12-02 09:02:39 25 4
gpt4 key购买 nike

很简单的问题。给出以下代码:

module main(
output reg [1:0][DATA_WIDTH-1:0] dOut,
input wire [1:0][DATA_WIDTH-1:0] dIn,
input wire [1:0][ADDR_WIDTH-1:0] addr,
input wire [1:0] wren,
input wire clk
);
parameter DATA_WIDTH = 16;
parameter ADDR_WIDTH = 6;

reg [DATA_WIDTH-1:0] ram [2**ADDR_WIDTH-1:0];

generate
genvar k;
for(k=0; k<2; k=k+1) begin: m
always @(posedge clk) begin
if(wren[k])
ram[addr[k]] <= dIn[k];
dOut[k] <= ram[addr[k]];
end
end
endgenerate
endmodule

quarus 13.0sp1 给出了这个错误(以及它的其他 20 个非兄弟同等的 sibling ):

Error (10028): Can't resolve multiple constant drivers for net "ram[63][14]" at main.v(42)

但是如果我手动展开生成循环:

module main(
output reg [1:0][DATA_WIDTH-1:0] dOut,
input wire [1:0][DATA_WIDTH-1:0] dIn,
input wire [1:0][ADDR_WIDTH-1:0] addr,
input wire [1:0] wren,
input wire clk
);
parameter DATA_WIDTH = 16;
parameter ADDR_WIDTH = 6;

reg [DATA_WIDTH-1:0] ram [2**ADDR_WIDTH-1:0];

always @(posedge clk) begin
if(wren[0])
ram[addr[0]] <= dIn[0];
dOut[0] <= ram[addr[0]];
end

always @(posedge clk) begin
if(wren[1])
ram[addr[1]] <= dIn[1];
dOut[1] <= ram[addr[1]];
end
endmodule

通过分析和综合步骤,一切都会变得顺利。

让生成循环运行的解决方法是什么?

最佳答案

我认为正确的方法是在这个问题中解释的:Using a generate with for loop in verilog

这将被转移到您的代码中,如下所示:

module main(
output reg [1:0][DATA_WIDTH-1:0] dOut,
input wire [1:0][DATA_WIDTH-1:0] dIn,
input wire [1:0][ADDR_WIDTH-1:0] addr,
input wire [1:0] wren,
input wire clk
);
parameter DATA_WIDTH = 16;
parameter ADDR_WIDTH = 6;

reg [DATA_WIDTH-1:0] ram [2**ADDR_WIDTH-1:0];
integer k;

always @(posedge clk) begin
for(k=0; k<2; k=k+1) begin:
if(wren[k])
ram[addr[k]] <= dIn[k];
dOut[k] <= ram[addr[k]];
end
end
endmodule

将对双端口 RAM 的所有访问保留在一个 always block 中非常方便,这样合成器就可以安全地检测到您在寄存器 ram 处有效地使用双端口 RAM。

关于verilog - Quartus 不允许在 Verilog 中使用生成模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62155138/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com