intel_alm: direct M10K instantiation
authorDan Ravensloft <dan.ravensloft@gmail.com>
Sun, 26 Jul 2020 18:28:10 +0000 (19:28 +0100)
committerMarcelina Koƛcielnicka <mwk@0x04.net>
Mon, 27 Jul 2020 13:39:06 +0000 (15:39 +0200)
This reverts commit a3a90f6377f251d3b6c5898eb1543f8832493bb8.

techlibs/intel_alm/Makefile.inc
techlibs/intel_alm/common/bram_m10k.txt
techlibs/intel_alm/common/bram_m10k_map.v [deleted file]
techlibs/intel_alm/common/megafunction_bb.v
techlibs/intel_alm/common/mem_sim.v
techlibs/intel_alm/common/quartus_rename.v
techlibs/intel_alm/synth_intel_alm.cc
tests/arch/intel_alm/blockram.ys [new file with mode: 0644]

index 552f00c658eaabc001ef556f0dce9e8d3246243a..e36c81c0ec49a489df13ddd80b52e6bf44d3fe57 100644 (file)
@@ -15,9 +15,9 @@ $(eval $(call add_share_file,share/intel_alm/common,techlibs/intel_alm/common/ds
 $(eval $(call add_share_file,share/intel_alm/common,techlibs/intel_alm/common/mem_sim.v))
 
 # RAM
-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/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))
 $(eval $(call add_share_file,share/intel_alm/common,techlibs/intel_alm/common/lutram_mlab.txt))
 
 # Miscellaneous
index 837e3a3303272a0b5f35f0f37069d0ad3478dd7b..e9355fe2cc9e4731ec47f021c6f36dae6616aaf4 100644 (file)
@@ -1,4 +1,4 @@
-bram __MISTRAL_M10K_SDP
+bram MISTRAL_M10K
     init   0   # TODO: Re-enable when I figure out how BRAM init works
     abits 13   @D8192x1
     dbits  1   @D8192x1
@@ -27,7 +27,7 @@ bram __MISTRAL_M10K_SDP
 endbram
 
 
-match __MISTRAL_M10K_SDP
+match MISTRAL_M10K
     min efficiency 5
     make_transp
 endmatch
diff --git a/techlibs/intel_alm/common/bram_m10k_map.v b/techlibs/intel_alm/common/bram_m10k_map.v
deleted file mode 100644 (file)
index 061463c..0000000
+++ /dev/null
@@ -1,31 +0,0 @@
-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
index b5a3d88926160e517da990dd559a27a978bd393d..820b0430e0bf4b183f2726c845c6becff82733c7 100644 (file)
@@ -156,4 +156,39 @@ input [ax_width-1:0] ax;
 input [ay_scan_in_width-1:0] ay;
 output [result_a_width-1:0] resulta;
 
-endmodule
\ No newline at end of file
+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
index b0e1763db4b59e5f437c696cacdbd26f54574d26..e09aafaa2d2278db8ada77cbfc94cd6d3908bcfb 100644 (file)
@@ -73,3 +73,37 @@ always @(posedge CLK1)
 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
index 46ef2aa0dc78309120a59977e82d258c4445a33a..9bc532ca29379ded2eed942f0af75102145acfb1 100644 (file)
@@ -88,6 +88,8 @@ endmodule
 
 module MISTRAL_MLAB(input [4:0] A1ADDR, input A1DATA, A1EN, CLK1, input [4:0] B1ADDR, output B1DATA);
 
+parameter _TECHMAP_CELLNAME_ = "";
+
 // Here we get to an unfortunate situation. The cell has a mem_init0 parameter,
 // which takes in a hexadecimal string that could be used to initialise RAM.
 // In the vendor simulation models, this appears to work fine, but Quartus,
@@ -99,7 +101,7 @@ module MISTRAL_MLAB(input [4:0] A1ADDR, input A1DATA, A1EN, CLK1, input [4:0] B1
 // or an undocumented way to get Quartus to initialise from mem_init0 is found.
 
 `MLAB #(
-    .logical_ram_name("MISTRAL_MLAB"),
+    .logical_ram_name(_TECHMAP_CELLNAME_),
     .logical_ram_depth(32),
     .logical_ram_width(1),
     .mixed_port_feed_through_mode("Dont Care"),
@@ -123,6 +125,53 @@ module MISTRAL_MLAB(input [4:0] A1ADDR, input A1DATA, A1EN, CLK1, input [4:0] B1
 endmodule
 
 
+module MISTRAL_M10K(A1ADDR, A1DATA, A1EN, CLK1, B1ADDR, B1DATA, B1EN);
+
+parameter CFG_ABITS = 10;
+parameter CFG_DBITS = 10;
+
+parameter _TECHMAP_CELLNAME_ = "";
+
+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(_TECHMAP_CELLNAME_),
+    .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_ABITS - 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_ABITS - 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));
index 9c3ae1743d335b8b9eec17e528b8971572143ead..9da91361a63cd11748bcc60b492834a2d44bfffa 100644 (file)
@@ -235,7 +235,8 @@ struct SynthIntelALMPass : public ScriptPass {
 
                if (!nobram && check_label("map_bram", "(skip if -nobram)")) {
                        run(stringf("memory_bram -rules +/intel_alm/common/bram_%s.txt", bram_type.c_str()));
-                       run(stringf("techmap -map +/intel_alm/common/bram_%s_map.v", 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()));
                }
 
                if (!nolutram && check_label("map_lutram", "(skip if -nolutram)")) {
diff --git a/tests/arch/intel_alm/blockram.ys b/tests/arch/intel_alm/blockram.ys
new file mode 100644 (file)
index 0000000..610ae1f
--- /dev/null
@@ -0,0 +1,6 @@
+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