У меня есть одна очень специфическая проблема с проектом, который преследует меня уже несколько дней. У меня есть следующий код Verilog для модуля RAM:
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 вьетнамок! Почему он просто не делает вывод о блочной ОЗУ? Этот модуль ОЗУ настолько огромен (а у меня их два - один для памяти инструкций, один для памяти данных), что он занимает всю доступную область ПЛИС ... раз в 2,4 раза.
Я пробовал все, чтобы заставить его выводить блочную RAM вместо 33k триггеров, но, если я не смогу это выяснить в ближайшее время, мне, возможно, придется значительно уменьшить размер моей памяти, чтобы она поместилась на чипе.