Thanks guys, this is how I instantiate RAMs:
generate
for (i=0; i < memsize; i=i+1) begin : MEM
memory# ( .soft_bits(soft_bits), .z(normalized_address_width), .address_width(address_width)) U ( .clock(sys_clk), .data(data_in
), .rdaddress(address_out), .rden(read
), .wraddress(address_in), .wren(write
), .q(data_out));
end
endgenerate
and then, I use MegaWizard to generate rams, I made some changes to make it parametric, but did not change anything else.
Note that the RAM modules I geenrate are very small, but they are dual port and I didn't see anything about merging small memory blocks in datasheets.
`timescale 1 ps / 1 ps
module memory (
clock,
data,
rdaddress,
rden,
wraddress,
wren,
q);
parameter soft_bits=5;
parameter z=4;
parameter address_width=2;
input clock;
input [soft_bits-1:0] data;
input [address_width-1:0] rdaddress;
input rden;
input [address_width-1:0] wraddress;
input wren;
output [soft_bits-1:0] q;
`ifndef ALTERA_RESERVED_QIS
// synopsys translate_off
`endif
tri1 clock;
tri1 rden;
tri0 wren;
`ifndef ALTERA_RESERVED_QIS
// synopsys translate_on
`endif
wire [soft_bits-1:0] sub_wire0;
wire [soft_bits-1:0] q = sub_wire0[soft_bits-1:0];
altsyncram altsyncram_component (
.address_a (wraddress),
.clock0 (clock),
.data_a (data),
.rden_b (rden),
.wren_a (wren),
.address_b (rdaddress),
.q_b (sub_wire0),
.aclr0 (1'b0),
.aclr1 (1'b0),
.addressstall_a (1'b0),
.addressstall_b (1'b0),
.byteena_a (1'b1),
.byteena_b (1'b1),
.clock1 (1'b1),
.clocken0 (1'b1),
.clocken1 (1'b1),
.clocken2 (1'b1),
.clocken3 (1'b1),
.data_b ({soft_bits{1'b1}}),
.eccstatus (),
.q_a (),
.rden_a (1'b1),
.wren_b (1'b0));
defparam
altsyncram_component.address_aclr_b = "NONE",
altsyncram_component.address_reg_b = "CLOCK0",
altsyncram_component.clock_enable_input_a = "BYPASS",
altsyncram_component.clock_enable_input_b = "BYPASS",
altsyncram_component.clock_enable_output_b = "BYPASS",
altsyncram_component.intended_device_family = "Stratix IV",
altsyncram_component.lpm_type = "altsyncram",
altsyncram_component.numwords_a = z,
altsyncram_component.numwords_b = z,
altsyncram_component.operation_mode = "DUAL_PORT",
altsyncram_component.outdata_aclr_b = "NONE",
altsyncram_component.outdata_reg_b = "CLOCK0",
altsyncram_component.power_up_uninitialized = "FALSE",
altsyncram_component.rdcontrol_reg_b = "CLOCK0",
altsyncram_component.read_during_write_mode_mixed_ports = "OLD_DATA",
altsyncram_component.widthad_a = address_width,
altsyncram_component.widthad_b = address_width,
altsyncram_component.width_a = soft_bits,
altsyncram_component.width_b = soft_bits,
altsyncram_component.width_byteena_a = 1;
endmodule