mirror of
https://github.com/YosysHQ/yosys
synced 2025-10-21 14:50:33 +00:00
analogdevices: Add BRAM options
Enable `-force-params`, and tidy up lutram mapping too.
This commit is contained in:
parent
f32d6429bd
commit
6e5524ee9c
5 changed files with 527 additions and 246 deletions
|
@ -1,78 +1,234 @@
|
|||
module $__ANALOGDEVICES_BLOCKRAM_SDP_ (...);
|
||||
module $__ANALOGDEVICES_BLOCKRAM_FULL_ (...);
|
||||
// libmap params
|
||||
parameter INIT = 0;
|
||||
parameter OPTION_MODE = "NONE";
|
||||
parameter OPTION_SIZE = "NONE";
|
||||
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_CLK_POL = 1;
|
||||
|
||||
parameter INIT = 0;
|
||||
parameter OPTION_ENABLE_WIDTH = "BIT";
|
||||
parameter WIDTH = 40;
|
||||
// needs -force-params
|
||||
parameter WIDTH = 40;
|
||||
parameter ABITS = 13;
|
||||
|
||||
// non libmap params
|
||||
`ifdef IS_T40LP
|
||||
parameter ABITS = 12;
|
||||
localparam NODE = "T40LP_Gen2.4";
|
||||
localparam BRAM_MODE = WIDTH == 5 ? "SDP_4096x05" :
|
||||
WIDTH == 10 ? "SDP_2048x10" : "SDP_1024x40";
|
||||
`elsif IS_T16FFC
|
||||
parameter ABITS = 13;
|
||||
localparam NODE = "T16FFC_Gen2.4";
|
||||
localparam BRAM_MODE = WIDTH == 5 ? "SDP_8192x05" :
|
||||
WIDTH == 10 ? "SDP_4096x10" : "SDP_2048x40";
|
||||
`endif
|
||||
|
||||
parameter PORT_W_WR_EN_WIDTH = 5;
|
||||
parameter PORT_W_CLK_POL = 1;
|
||||
|
||||
parameter PORT_R_CLK_POL = 1;
|
||||
|
||||
input PORT_W_CLK;
|
||||
input PORT_W_CLK_EN;
|
||||
input [ABITS-1:0] PORT_W_ADDR;
|
||||
input [WIDTH-1:0] PORT_W_WR_DATA;
|
||||
input [PORT_W_WR_EN_WIDTH-1:0] PORT_W_WR_EN;
|
||||
|
||||
input PORT_R_CLK;
|
||||
input PORT_R_CLK_EN;
|
||||
input [ABITS-1:0] PORT_R_ADDR;
|
||||
output [WIDTH-1:0] PORT_R_RD_DATA;
|
||||
|
||||
`ifdef IS_T40LP
|
||||
RBRAM
|
||||
localparam NODE = "T40LP_Gen2.4";
|
||||
`endif
|
||||
`ifdef IS_T16FFC
|
||||
RBRAM2
|
||||
localparam NODE = "T16FFC_Gen2.4";
|
||||
`endif
|
||||
#(
|
||||
.TARGET_NODE(NODE),
|
||||
.BRAM_MODE(BRAM_MODE),
|
||||
.QA_REG(0),
|
||||
.QB_REG(0),
|
||||
.CLKA_INV(!PORT_W_CLK_POL),
|
||||
.CLKB_INV(!PORT_R_CLK_POL),
|
||||
.DATA_WIDTH(WIDTH),
|
||||
.ADDR_WIDTH(
|
||||
WIDTH == 5 ? ABITS :
|
||||
WIDTH == 10 ? ABITS-1 : ABITS-2
|
||||
),
|
||||
.WE_WIDTH(OPTION_ENABLE_WIDTH == "BIT" ? WIDTH : PORT_W_WR_EN_WIDTH),
|
||||
.PERR_WIDTH(1),
|
||||
)
|
||||
_TECHMAP_REPLACE_
|
||||
(
|
||||
// .QA(0),
|
||||
.DA(PORT_W_WR_DATA),
|
||||
.CEA(PORT_W_CLK_EN),
|
||||
.WEA(PORT_W_WR_EN),
|
||||
.AA(
|
||||
WIDTH == 5 ? PORT_W_ADDR :
|
||||
WIDTH == 10 ? PORT_W_ADDR[ABITS-1:1] : PORT_W_ADDR[ABITS-1:2]
|
||||
),
|
||||
.CLKA(PORT_W_CLK),
|
||||
.QB(PORT_R_RD_DATA),
|
||||
// .DB(0),
|
||||
.CEB(PORT_R_CLK_EN),
|
||||
// .WEB(0),
|
||||
.AB(
|
||||
WIDTH == 5 ? PORT_R_ADDR :
|
||||
WIDTH == 10 ? PORT_R_ADDR[ABITS-1:1] : PORT_R_ADDR[ABITS-1:2]
|
||||
),
|
||||
.CLKB(PORT_R_CLK),
|
||||
);
|
||||
// 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;
|
||||
|
||||
// libmap ports
|
||||
input PORT_A_CLK;
|
||||
input PORT_A_CLK_EN;
|
||||
input [ABITS-1:0] PORT_A_ADDR;
|
||||
input [WIDTH-1:0] PORT_A_WR_DATA;
|
||||
output [WIDTH-1:0] PORT_A_RD_DATA;
|
||||
input [PORT_A_WR_EN_WIDTH-1:0] PORT_A_WR_EN;
|
||||
|
||||
input PORT_B_CLK;
|
||||
input PORT_B_CLK_EN;
|
||||
input [ABITS-1:0] PORT_B_ADDR;
|
||||
input [WIDTH-1:0] PORT_B_WR_DATA;
|
||||
output [WIDTH-1:0] PORT_B_RD_DATA;
|
||||
input [PORT_B_WR_EN_WIDTH-1:0] PORT_B_WR_EN;
|
||||
|
||||
`ifdef IS_T40LP
|
||||
RBRAM
|
||||
`endif
|
||||
`ifdef IS_T16FFC
|
||||
RBRAM2
|
||||
`endif
|
||||
#(
|
||||
.TARGET_NODE(NODE),
|
||||
.BRAM_MODE(BRAM_MODE),
|
||||
.QA_REG(0),
|
||||
.QB_REG(0),
|
||||
.CLKA_INV(!PORT_A_CLK_POL),
|
||||
.CLKB_INV(!PORT_B_CLK_POL),
|
||||
.DATA_WIDTH(WIDTH),
|
||||
.ADDR_WIDTH(ABITS),
|
||||
.WE_WIDTH(PORT_A_WR_EN_WIDTH),
|
||||
.PERR_WIDTH(PBITS),
|
||||
)
|
||||
_TECHMAP_REPLACE_
|
||||
(
|
||||
.QA(PORT_A_RD_DATA),
|
||||
.DA(PORT_A_WR_DATA),
|
||||
.CEA(PORT_A_CLK_EN),
|
||||
.WEA(PORT_A_WR_EN),
|
||||
.AA(PORT_A_ADDR),
|
||||
.CLKA(PORT_A_CLK),
|
||||
.QB(PORT_B_RD_DATA),
|
||||
.DB(PORT_B_WR_DATA),
|
||||
.CEB(PORT_B_CLK_EN),
|
||||
.WEB(PORT_B_WR_EN),
|
||||
.AB(PORT_B_ADDR),
|
||||
.CLKB(PORT_B_CLK),
|
||||
);
|
||||
|
||||
// check config
|
||||
generate
|
||||
case (BRAM_MODE)
|
||||
`ifdef IS_T40LP
|
||||
"SDP_1024x18_FP",
|
||||
"SDP_1024x16_BP",
|
||||
"SDP_2048x09",
|
||||
"SDP_4096x05",
|
||||
"SDP_1024x32_ECC",
|
||||
"SDP_1024x40",
|
||||
"SDP_1024x36_BP",
|
||||
"SDP_512x32_ECC",
|
||||
"SDP_512x36_BP",
|
||||
"SDP_2048x10",
|
||||
"SP_512x32_ECC",
|
||||
"SP_512x36_BP",
|
||||
"SP_1024x20",
|
||||
"SP2_512x18_BP",
|
||||
"SP2_1024x09",
|
||||
"SP2_2048x05": wire _TECHMAP_FAIL_ = 0;
|
||||
`endif
|
||||
`ifdef IS_T16FFC
|
||||
"TDP_2048x18_FP",
|
||||
"TDP_2048x16_BP",
|
||||
"TDP_4096x09",
|
||||
"TDP_8192x05",
|
||||
"TDP_2048x32_ECC",
|
||||
"TDP_2048x40",
|
||||
"TDP_2048x36_BP",
|
||||
"SDP_2048x18_FP",
|
||||
"SDP_2048x16_BP",
|
||||
"SDP_4096x09",
|
||||
"SDP_8192x05",
|
||||
"SDP_2048x32_ECC",
|
||||
"SDP_2048x40",
|
||||
"SDP_2048x36_BP",
|
||||
"SDP_1024x32_ECC",
|
||||
"SDP_1024x36_BP",
|
||||
"SDP_4096x10",
|
||||
"SP_1024x32_ECC",
|
||||
"SP_1024x36_BP",
|
||||
"SP_2048x20",
|
||||
"SP2_1024x18_BP",
|
||||
"SP2_2048x09",
|
||||
"SP2_4096x05": wire _TECHMAP_FAIL_ = 0;
|
||||
`endif
|
||||
default: wire _TECHMAP_FAIL_ = 1;
|
||||
endcase
|
||||
endgenerate
|
||||
|
||||
endmodule
|
||||
|
||||
module $__ANALOGDEVICES_BLOCKRAM_HALF_ (...);
|
||||
// libmap params
|
||||
parameter INIT = 0;
|
||||
parameter OPTION_MODE = "NONE";
|
||||
parameter OPTION_SIZE = "NONE";
|
||||
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_CLK_POL = 1;
|
||||
|
||||
// needs -force-params
|
||||
parameter WIDTH = 40;
|
||||
parameter ABITS = 13;
|
||||
|
||||
// libmap ports
|
||||
input PORT_A_CLK;
|
||||
input PORT_A_CLK_EN;
|
||||
input [ABITS-1:0] PORT_A_ADDR;
|
||||
input [WIDTH-1:0] PORT_A_WR_DATA;
|
||||
output [WIDTH-1:0] PORT_A_RD_DATA;
|
||||
input [PORT_A_WR_EN_WIDTH-1:0] PORT_A_WR_EN;
|
||||
|
||||
input PORT_B_CLK;
|
||||
input PORT_B_CLK_EN;
|
||||
input [ABITS-1:0] PORT_B_ADDR;
|
||||
input [WIDTH-1:0] PORT_B_WR_DATA;
|
||||
output [WIDTH-1:0] PORT_B_RD_DATA;
|
||||
input [PORT_B_WR_EN_WIDTH-1:0] PORT_B_WR_EN;
|
||||
|
||||
$__ANALOGDEVICES_BLOCKRAM_FULL_
|
||||
# (
|
||||
.INIT(INIT),
|
||||
.OPTION_MODE(OPTION_MODE),
|
||||
.OPTION_SIZE(OPTION_SIZE),
|
||||
.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),
|
||||
.PORT_B_CLK_POL(PORT_B_CLK_POL),
|
||||
.WIDTH(WIDTH),
|
||||
.ABITS(ABITS)
|
||||
)
|
||||
_TECHMAP_REPLACE_
|
||||
(
|
||||
.PORT_A_CLK(PORT_A_CLK),
|
||||
.PORT_A_CLK_EN(PORT_A_CLK_EN),
|
||||
.PORT_A_ADDR(PORT_A_ADDR),
|
||||
.PORT_A_WR_DATA(PORT_A_WR_DATA),
|
||||
.PORT_A_RD_DATA(PORT_A_RD_DATA),
|
||||
.PORT_A_WR_EN(PORT_A_WR_EN),
|
||||
.PORT_B_CLK(PORT_B_CLK),
|
||||
.PORT_B_CLK_EN(PORT_B_CLK_EN),
|
||||
.PORT_B_ADDR(PORT_B_ADDR),
|
||||
.PORT_B_WR_DATA(PORT_B_WR_DATA),
|
||||
.PORT_B_RD_DATA(PORT_B_RD_DATA),
|
||||
.PORT_B_WR_EN(PORT_B_WR_EN)
|
||||
);
|
||||
endmodule
|
||||
|
||||
module $__ANALOGDEVICES_BLOCKRAM_QUARTER_ (...);
|
||||
// libmap params
|
||||
parameter INIT = 0;
|
||||
parameter OPTION_MODE = "NONE";
|
||||
parameter OPTION_SIZE = "NONE";
|
||||
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_CLK_POL = 1;
|
||||
|
||||
// needs -force-params
|
||||
parameter WIDTH = 40;
|
||||
parameter ABITS = 13;
|
||||
|
||||
// libmap ports
|
||||
input PORT_A_CLK;
|
||||
input PORT_A_CLK_EN;
|
||||
input [ABITS-1:0] PORT_A_ADDR;
|
||||
input [WIDTH-1:0] PORT_A_WR_DATA;
|
||||
output [WIDTH-1:0] PORT_A_RD_DATA;
|
||||
input [PORT_A_WR_EN_WIDTH-1:0] PORT_A_WR_EN;
|
||||
|
||||
$__ANALOGDEVICES_BLOCKRAM_FULL_
|
||||
# (
|
||||
.INIT(INIT),
|
||||
.OPTION_MODE(OPTION_MODE),
|
||||
.OPTION_SIZE(OPTION_SIZE),
|
||||
.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),
|
||||
.PORT_B_CLK_POL(PORT_B_CLK_POL),
|
||||
.WIDTH(WIDTH),
|
||||
.ABITS(ABITS)
|
||||
)
|
||||
_TECHMAP_REPLACE_
|
||||
(
|
||||
.PORT_A_CLK(PORT_A_CLK),
|
||||
.PORT_A_CLK_EN(PORT_A_CLK_EN),
|
||||
.PORT_A_ADDR(PORT_A_ADDR),
|
||||
.PORT_A_WR_DATA(PORT_A_WR_DATA),
|
||||
.PORT_A_RD_DATA(PORT_A_RD_DATA),
|
||||
.PORT_A_WR_EN(PORT_A_WR_EN),
|
||||
);
|
||||
endmodule
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue