$(eval $(call add_share_file,share/intel_alm/common,techlibs/intel_alm/common/mem_sim.v))
# RAM
-$(eval $(call add_share_file,share/intel_alm/common,techlibs/intel_alm/common/bram_m10k.txt))
-$(eval $(call add_share_file,share/intel_alm/common,techlibs/intel_alm/common/bram_m20k.txt))
-$(eval $(call add_share_file,share/intel_alm/common,techlibs/intel_alm/common/bram_m20k_map.v))
+bramtypes := m10k m20k
+$(foreach bramtype, $(bramtypes), $(eval $(call add_share_file,share/intel_alm/common,techlibs/intel_alm/common/bram_$(bramtype).txt)))
+$(foreach bramtype, $(bramtypes), $(eval $(call add_share_file,share/intel_alm/common,techlibs/intel_alm/common/bram_$(bramtype)_map.v)))
$(eval $(call add_share_file,share/intel_alm/common,techlibs/intel_alm/common/lutram_mlab.txt))
# Miscellaneous
-bram MISTRAL_M10K
+bram __MISTRAL_M10K_SDP
init 0 # TODO: Re-enable when I figure out how BRAM init works
abits 13 @D8192x1
dbits 1 @D8192x1
endbram
-match MISTRAL_M10K
+match __MISTRAL_M10K_SDP
min efficiency 5
make_transp
endmatch
--- /dev/null
+module __MISTRAL_M10K_SDP(CLK1, A1ADDR, A1DATA, A1EN, B1ADDR, B1DATA, B1EN);\r
+\r
+parameter CFG_ABITS = 10;\r
+parameter CFG_DBITS = 10;\r
+parameter CFG_ENABLE_A = 1;\r
+parameter CFG_ENABLE_B = 1;\r
+\r
+input CLK1;\r
+input [CFG_ABITS-1:0] A1ADDR, B1ADDR;\r
+input [CFG_DBITS-1:0] A1DATA;\r
+output [CFG_DBITS-1:0] B1DATA;\r
+input [CFG_ENABLE_A-1:0] A1EN, B1EN;\r
+\r
+altsyncram #(\r
+ .operation_mode("dual_port"),\r
+ .ram_block_type("m10k"),\r
+ .widthad_a(CFG_ABITS),\r
+ .width_a(CFG_DBITS),\r
+ .widthad_b(CFG_ABITS),\r
+ .width_b(CFG_DBITS),\r
+) _TECHMAP_REPLACE_ (\r
+ .address_a(A1ADDR),\r
+ .data_a(A1DATA),\r
+ .wren_a(A1EN),\r
+ .address_b(B1ADDR),\r
+ .q_b(B1DATA),\r
+ .clock0(CLK1),\r
+ .clock1(CLK1)\r
+);\r
+\r
+endmodule\r
input [ay_scan_in_width-1:0] ay;
output [result_a_width-1:0] resulta;
-endmodule
-
-(* blackbox *)
-module cyclonev_ram_block(portaaddr, portadatain, portawe, portbaddr, portbdataout, portbre, clk0);
-
-parameter operation_mode = "dual_port";
-parameter logical_ram_name = "";
-parameter port_a_address_width = 10;
-parameter port_a_data_width = 10;
-parameter port_a_logical_ram_depth = 1024;
-parameter port_a_logical_ram_width = 10;
-parameter port_a_first_address = 0;
-parameter port_a_last_address = 1023;
-parameter port_a_first_bit_number = 0;
-parameter port_b_address_width = 10;
-parameter port_b_data_width = 10;
-parameter port_b_logical_ram_depth = 1024;
-parameter port_b_logical_ram_width = 10;
-parameter port_b_first_address = 0;
-parameter port_b_last_address = 1023;
-parameter port_b_first_bit_number = 0;
-parameter port_b_address_clock = "clock0";
-parameter port_b_read_enable_clock = "clock0";
-parameter mem_init0 = "";
-parameter mem_init1 = "";
-parameter mem_init2 = "";
-parameter mem_init3 = "";
-parameter mem_init4 = "";
-
-input [port_a_address_width-1:0] portaaddr;
-input [port_b_address_width-1:0] portbaddr;
-input [port_a_data_width-1:0] portadatain;
-output [port_b_data_width-1:0] portbdataout;
-input clk0, portawe, portbre;
-
-endmodule
+endmodule
\ No newline at end of file
assign B1DATA = mem[B1ADDR];
endmodule
-
-// The M10K
-// --------
-// TODO
-
-module MISTRAL_M10K(CLK1, A1ADDR, A1DATA, A1EN, B1ADDR, B1DATA, B1EN);
-
-parameter CFG_ABITS = 10;
-parameter CFG_DBITS = 10;
-
-input CLK1;
-input [CFG_ABITS-1:0] A1ADDR, B1ADDR;
-input [CFG_DBITS-1:0] A1DATA;
-input A1EN, B1EN;
-output reg [CFG_DBITS-1:0] B1DATA;
-
-reg [2**CFG_ABITS * CFG_DBITS - 1 : 0] mem = 0;
-
-specify
- $setup(A1ADDR, posedge CLK1, 0);
- $setup(A1DATA, posedge CLK1, 0);
-
- if (B1EN) (posedge CLK1 => (B1DATA : A1DATA)) = 0;
-endspecify
-
-always @(posedge CLK1) begin
- if (A1EN)
- mem[(A1ADDR + 1) * CFG_DBITS - 1 : A1ADDR * CFG_DBITS] <= A1DATA;
-
- if (B1EN)
- B1DATA <= mem[(B1ADDR + 1) * CFG_DBITS - 1 : B1ADDR * CFG_DBITS];
-end
-
-endmodule
endmodule
-module MISTRAL_M10K(A1ADDR, A1DATA, A1EN, CLK1, B1ADDR, B1DATA, B1EN);
-
-parameter CFG_ABITS = 10;
-parameter CFG_DBITS = 10;
-
-input [CFG_ABITS-1:0] A1ADDR, B1ADDR;
-input [CFG_DBITS-1:0] A1DATA;
-input CLK1, A1EN, B1EN;
-output [CFG_DBITS-1:0] B1DATA;
-
-// Much like the MLAB, the M10K has mem_init[01234] parameters which would let
-// you initialise the RAM cell via hex literals. If they were implemented.
-
-cyclonev_ram_block #(
- .operation_mode("dual_port"),
- .logical_ram_name("MISTRAL_M10K"),
- .port_a_address_width(CFG_ABITS),
- .port_a_data_width(CFG_DBITS),
- .port_a_logical_ram_depth(2**CFG_ABITS),
- .port_a_logical_ram_width(CFG_DBITS),
- .port_a_first_address(0),
- .port_a_last_address(2**CFG_DBITS - 1),
- .port_a_first_bit_number(0),
- .port_b_address_width(CFG_ABITS),
- .port_b_data_width(CFG_DBITS),
- .port_b_logical_ram_depth(2**CFG_ABITS),
- .port_b_logical_ram_width(CFG_DBITS),
- .port_b_first_address(0),
- .port_b_last_address(2**CFG_DBITS - 1),
- .port_b_first_bit_number(0),
- .port_b_address_clock("clock0"),
- .port_b_read_enable_clock("clock0")
-) _TECHMAP_REPLACE_ (
- .portaaddr(A1ADDR),
- .portadatain(A1DATA),
- .portawe(A1EN),
- .portbaddr(B1ADDR),
- .portbdataout(B1DATA),
- .portbre(B1EN),
- .clk0(CLK1)
-);
-
-endmodule
-
-
module MISTRAL_MUL27X27(input [26:0] A, B, output [53:0] Y);
`MAC #(.ax_width(27), .ay_scan_in_width(27), .result_a_width(54), .operation_mode("M27x27")) _TECHMAP_REPLACE_ (.ax(A), .ay(B), .resulta(Y));
if (!nobram && check_label("map_bram", "(skip if -nobram)")) {
run(stringf("memory_bram -rules +/intel_alm/common/bram_%s.txt", bram_type.c_str()));
- if (help_mode || bram_type != "m10k")
- run(stringf("techmap -map +/intel_alm/common/bram_%s_map.v", bram_type.c_str()));
+ run(stringf("techmap -map +/intel_alm/common/bram_%s_map.v", bram_type.c_str()));
}
if (!nolutram && check_label("map_lutram", "(skip if -nolutram)")) {
+++ /dev/null
-read_verilog ../common/blockram.v
-chparam -set ADDRESS_WIDTH 10 -set DATA_WIDTH 10 sync_ram_sdp
-synth_intel_alm -family cyclonev
-cd sync_ram_sdp
-select -assert-count 1 t:MISTRAL_M10K
-select -assert-none t:MISTRAL_M10K %% t:* %D