Имам един много специфичен проблем с проект, който ме преследва от дни. Имам следния 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 джапанки! Защо просто не изведе блок RAM? Този RAM модул е толкова огромен (и имам два от тях - един за памет за инструкции, един за памет за данни), че консумира цялата налична площ на FPGA... пъти 2,4
Опитвах всичко, за да го принудя да изведе блокова RAM вместо 33k джапанки, но освен ако не успея да го разбера скоро, може да се наложи значително да намаля размера на паметта си, само за да се побере в чип.