From f2b88c23d44ec9b6bd832e659803bdc3123e6855 Mon Sep 17 00:00:00 2001 From: Krystine Sherwin <93062060+KrystalDelusion@users.noreply.github.com> Date: Sat, 18 Oct 2025 17:31:54 +1300 Subject: [PATCH] analogdevices: Fixing up bram Tested all the accepted configurations in eXpreso, disabling the RBRAM2 configs that fail to place, and increasing the cost for the double site TDP memories. --- techlibs/analogdevices/brams.txt | 129 +++++++++++++++++++++++++---- techlibs/analogdevices/brams_map.v | 30 ++++--- 2 files changed, 130 insertions(+), 29 deletions(-) diff --git a/techlibs/analogdevices/brams.txt b/techlibs/analogdevices/brams.txt index f5c45aacf..10cdadefb 100644 --- a/techlibs/analogdevices/brams.txt +++ b/techlibs/analogdevices/brams.txt @@ -6,8 +6,17 @@ ifdef IS_T16FFC { abits 11; width 32; byte 32; - option "MODE" "TDP" cost 2501; - option "MODE" "SDP" cost 2401; + option "MODE" "TDP" cost 4502; + option "MODE" "SDP" forbid; + option "MODE" "SP" forbid; + } + option "SIZE" "1024x32" { + abits 10; + width 32; + byte 32; + option "MODE" "TDP" forbid; + option "MODE" "SDP" cost 2402; + option "MODE" "SP" forbid; } } option "ERR" "BP" { @@ -16,8 +25,28 @@ ifdef IS_T16FFC { abits 11; width 36; byte 9; - option "MODE" "TDP" cost 2504; + option "MODE" "TDP" cost 4504; + option "MODE" "SDP" forbid; + option "MODE" "SP" forbid; + } + option "SIZE" "1024x36" { + abits 10; + width 36; + byte 9; + option "MODE" "TDP" forbid; option "MODE" "SDP" cost 2404; + option "MODE" "SP" forbid; + } + } + option "ERR" "FP" { + style "FP"; + option "SIZE" "2048x18" { + abits 11; + width 18; + byte 18; + option "MODE" "TDP" cost 2501; + option "MODE" "SDP" cost 2401; + option "MODE" "SP" forbid; } } option "ERR" "NONE" { @@ -26,14 +55,16 @@ ifdef IS_T16FFC { width 5; byte 1; option "MODE" "TDP" cost 2505; - option "MODE" "SDP" cost 2405; + option "MODE" "SDP" forbid; + option "MODE" "SP" forbid; } option "SIZE" "4096x09" { abits 12; width 9; byte 1; option "MODE" "TDP" cost 2509; - option "MODE" "SDP" cost 2409; + option "MODE" "SDP" forbid; + option "MODE" "SP" forbid; } option "SIZE" "4096x10" { abits 12; @@ -41,13 +72,23 @@ ifdef IS_T16FFC { byte 1; option "MODE" "TDP" forbid; option "MODE" "SDP" cost 2410; + option "MODE" "SP" forbid; + } + option "SIZE" "2048x20" { + abits 11; + width 20; + byte 1; + option "MODE" "TDP" forbid; + option "MODE" "SDP" forbid; + option "MODE" "SP" cost 2320; } option "SIZE" "2048x40" { abits 11; width 40; byte 8; - option "MODE" "TDP" cost 2505; - option "MODE" "SDP" cost 2405; + option "MODE" "TDP" cost 4505; + option "MODE" "SDP" forbid; + option "MODE" "SP" forbid; } } @@ -76,6 +117,13 @@ ifdef IS_T16FFC { clken; } } + option "MODE" "SP" { + port srsw "A" { + clock anyedge; + clken; + rdwr no_change; + } + } } } @@ -86,8 +134,17 @@ ram block $__ANALOGDEVICES_BLOCKRAM_HALF_ { abits 10; width 32; byte 32; - option "MODE" "SDP" cost 2401; - option "MODE" "SP" cost 2301; + option "MODE" "SDP" cost 2402; + option "MODE" "SP" forbid; + option "MODE" "SP2" forbid; + } + option "SIZE" "512x32" { + abits 9; + width 32; + byte 32; + option "MODE" "SDP" forbid; + option "MODE" "SP" cost 2302; + option "MODE" "SP2" forbid; } } option "ERR" "BP" { @@ -97,7 +154,27 @@ ram block $__ANALOGDEVICES_BLOCKRAM_HALF_ { width 36; byte 9; option "MODE" "SDP" cost 2404; + option "MODE" "SP" forbid; + option "MODE" "SP2" forbid; + } + option "SIZE" "512x36" { + abits 9; + width 36; + byte 9; + option "MODE" "SDP" forbid; option "MODE" "SP" cost 2304; + option "MODE" "SP2" forbid; + } + } + option "ERR" "FP" { + style "FP"; + option "SIZE" "1024x18" { + abits 10; + width 18; + byte 18; + option "MODE" "SDP" forbid; + option "MODE" "SP" forbid; + option "MODE" "SP2" cost 2301; } } option "ERR" "NONE" { @@ -107,27 +184,39 @@ ram block $__ANALOGDEVICES_BLOCKRAM_HALF_ { byte 1; option "MODE" "SDP" cost 2405; option "MODE" "SP" cost 2305; + option "MODE" "SP2" forbid; } option "SIZE" "2048x09" { abits 11; width 9; byte 1; option "MODE" "SDP" cost 2409; - option "MODE" "SP" cost 2309; + option "MODE" "SP" forbid; + option "MODE" "SP2" cost 2309; } option "SIZE" "2048x10" { abits 11; width 10; byte 1; option "MODE" "SDP" cost 2410; - option "MODE" "SP" cost 2310; + option "MODE" "SP" forbid; + option "MODE" "SP2" forbid; + } + option "SIZE" "1024x20" { + abits 10; + width 20; + byte 1; + option "MODE" "SDP" forbid; + option "MODE" "SP" cost 2320; + option "MODE" "SP2" forbid; } option "SIZE" "1024x40" { abits 10; width 40; byte 8; option "MODE" "SDP" cost 2405; - option "MODE" "SP" cost 2305; + option "MODE" "SP" forbid; + option "MODE" "SP2" forbid; } } @@ -143,6 +232,14 @@ ram block $__ANALOGDEVICES_BLOCKRAM_HALF_ { } } option "MODE" "SP" { + ifdef IS_T16FFC forbid; + port srsw "A" { + clock anyedge; + clken; + rdwr no_change; + } + } + option "MODE" "SP2" { ifdef IS_T40LP forbid; port srsw "A" { clock anyedge; @@ -160,7 +257,7 @@ ifdef IS_T40LP { abits 9; width 18; byte 9; - option "MODE" "SP" cost 2202; + option "MODE" "SP2" cost 2202; } } option "ERR" "NONE" { @@ -168,16 +265,16 @@ ifdef IS_T40LP { abits 11; width 5; byte 1; - option "MODE" "SP" cost 2205; + option "MODE" "SP2" cost 2205; } option "SIZE" "1024x09" { abits 10; width 9; byte 1; - option "MODE" "SP" cost 2209; + option "MODE" "SP2" cost 2209; } } - option "MODE" "SP" { + option "MODE" "SP2" { port srsw "A" { clock anyedge; clken; diff --git a/techlibs/analogdevices/brams_map.v b/techlibs/analogdevices/brams_map.v index c486670e3..f1acaaf78 100644 --- a/techlibs/analogdevices/brams_map.v +++ b/techlibs/analogdevices/brams_map.v @@ -6,7 +6,7 @@ module $__ANALOGDEVICES_BLOCKRAM_FULL_ (...); parameter OPTION_ERR = "NONE"; parameter PORT_A_WR_EN_WIDTH = 1; parameter PORT_A_CLK_POL = 1; - parameter PORT_B_WR_EN_WIDTH = 1; + parameter PORT_B_WR_EN_WIDTH = PORT_A_WR_EN_WIDTH; parameter PORT_B_CLK_POL = 1; // needs -force-params @@ -23,9 +23,7 @@ module $__ANALOGDEVICES_BLOCKRAM_FULL_ (...); // localparam BRAM_MODE = "SDP_2048x36_BP"; localparam BRAM_MODE = (OPTION_ERR!="NONE") ? {OPTION_MODE, "_", OPTION_SIZE, "_", OPTION_ERR} : {OPTION_MODE, "_", OPTION_SIZE}; - localparam PBITS = (OPTION_ERR=="FP") ? 1 : - (OPTION_ERR=="BP") ? PORT_A_WR_EN_WIDTH : - 0; + localparam PBITS = (OPTION_ERR=="BP") ? PORT_A_WR_EN_WIDTH : 1; // libmap ports input PORT_A_CLK; @@ -51,8 +49,8 @@ module $__ANALOGDEVICES_BLOCKRAM_FULL_ (...); #( .TARGET_NODE(NODE), .BRAM_MODE(BRAM_MODE), - .QA_REG(0), - .QB_REG(0), + .QA_REG((OPTION_ERR=="ECC") ? 1 : 0), + .QB_REG((OPTION_ERR=="ECC") ? 1 : 0), .CLKA_INV(!PORT_A_CLK_POL), .CLKB_INV(!PORT_B_CLK_POL), .DATA_WIDTH(WIDTH), @@ -78,6 +76,7 @@ module $__ANALOGDEVICES_BLOCKRAM_FULL_ (...); // check config generate + if (PORT_A_WR_EN_WIDTH == PORT_B_WR_EN_WIDTH) case (BRAM_MODE) `ifdef IS_T40LP "SDP_1024x18_FP", @@ -107,11 +106,12 @@ module $__ANALOGDEVICES_BLOCKRAM_FULL_ (...); "TDP_2048x36_BP", "SDP_2048x18_FP", "SDP_2048x16_BP", - "SDP_4096x09", - "SDP_8192x05", - "SDP_2048x32_ECC", - "SDP_2048x40", - "SDP_2048x36_BP", + // The following are rejected in eXpreso + // "SDP_4096x09", + // "SDP_8192x05", + // "SDP_2048x32_ECC", + // "SDP_2048x40", + // "SDP_2048x36_BP", "SDP_1024x32_ECC", "SDP_1024x36_BP", "SDP_4096x10", @@ -124,6 +124,8 @@ module $__ANALOGDEVICES_BLOCKRAM_FULL_ (...); `endif default: wire _TECHMAP_FAIL_ = 1; endcase + else + wire _TECHMAP_FAIL_ = 1; endgenerate endmodule @@ -136,7 +138,7 @@ module $__ANALOGDEVICES_BLOCKRAM_HALF_ (...); parameter OPTION_ERR = "NONE"; parameter PORT_A_WR_EN_WIDTH = 1; parameter PORT_A_CLK_POL = 1; - parameter PORT_B_WR_EN_WIDTH = 1; + parameter PORT_B_WR_EN_WIDTH = PORT_A_WR_EN_WIDTH; parameter PORT_B_CLK_POL = 1; // needs -force-params @@ -163,6 +165,7 @@ module $__ANALOGDEVICES_BLOCKRAM_HALF_ (...); .INIT(INIT), .OPTION_MODE(OPTION_MODE), .OPTION_SIZE(OPTION_SIZE), + .OPTION_ERR(OPTION_ERR), .PORT_A_WR_EN_WIDTH(PORT_A_WR_EN_WIDTH), .PORT_A_CLK_POL(PORT_A_CLK_POL), .PORT_B_WR_EN_WIDTH(PORT_B_WR_EN_WIDTH), @@ -195,7 +198,7 @@ module $__ANALOGDEVICES_BLOCKRAM_QUARTER_ (...); parameter OPTION_ERR = "NONE"; parameter PORT_A_WR_EN_WIDTH = 1; parameter PORT_A_CLK_POL = 1; - parameter PORT_B_WR_EN_WIDTH = 1; + parameter PORT_B_WR_EN_WIDTH = PORT_A_WR_EN_WIDTH; parameter PORT_B_CLK_POL = 1; // needs -force-params @@ -215,6 +218,7 @@ module $__ANALOGDEVICES_BLOCKRAM_QUARTER_ (...); .INIT(INIT), .OPTION_MODE(OPTION_MODE), .OPTION_SIZE(OPTION_SIZE), + .OPTION_ERR(OPTION_ERR), .PORT_A_WR_EN_WIDTH(PORT_A_WR_EN_WIDTH), .PORT_A_CLK_POL(PORT_A_CLK_POL), .PORT_B_WR_EN_WIDTH(PORT_B_WR_EN_WIDTH),