【发布时间】:2013-12-18 05:12:57
【问题描述】:
我在一个项目中遇到了一个非常具体的问题,这几天一直困扰着我。我有以下用于 RAM 模块的 Verilog 代码:
module RAM_param(clk, addr, read_write, clear, data_in, data_out);
parameter n = 4;
parameter w = 8;
input clk, read_write, clear;
input [n-1:0] addr;
input [w-1:0] data_in;
output reg [w-1:0] data_out;
reg [w-1:0] reg_array [2**n-1:0];
integer i;
initial begin
for( i = 0; i < 2**n; i = i + 1 ) begin
reg_array[i] <= 0;
end
end
always @(negedge(clk)) begin
if( read_write == 1 )
reg_array[addr] <= data_in;
if( clear == 1 ) begin
for( i = 0; i < 2**n; i = i + 1 ) begin
reg_array[i] <= 0;
end
end
data_out = reg_array[addr];
end
endmodule
它的行为完全符合预期,但是当我去合成时,我得到以下信息:
Synthesizing Unit <RAM_param_1>.
Related source file is "C:\Users\stevendesu\---\RAM_param.v".
n = 11
w = 16
Found 32768-bit register for signal <n2059[32767:0]>.
Found 16-bit 2048-to-1 multiplexer for signal <data_out> created at line 19.
Summary:
inferred 32768 D-type flip-flop(s).
inferred 2049 Multiplexer(s).
Unit <RAM_param_1> synthesized.
32768 人字拖!为什么它不只是推断块 RAM?这个 RAM 模块非常大(我有两个——一个用于指令存储器,一个用于数据存储器),它占用了 FPGA 的整个可用区域...... 2.4 倍
我一直在尝试一切来强制它推断块 RAM 而不是 33k 触发器,但除非我能很快弄清楚,否则我可能不得不大大减小内存的大小以适应芯片。
【问题讨论】:
-
您是否查看过 FPGA 的数据表以了解它提供的 RAM 类型?可能还有关于从您的 FPGA 供应商处推断 ram 的应用说明。在我的脑海中,我认为大多数公羊可能没有擦除整个公羊的“清晰”功能,所以也许你可以尝试删除它。
-
合成器无法“推断”一个在您的 FPGA 上实际不存在的结构,并且不同的 FPGA 具有不同的 RAM。这不是 Verilog 问题,您需要阅读 FPGA 手册。
-
对不起,我更新了新答案,这是 BRAM ,而不是分布式 RAM。真的很抱歉。
标签: verilog type-inference ram