mirror of
https://github.com/YosysHQ/yosys
synced 2025-10-22 15:34:36 +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,56 +1,188 @@
|
||||||
# family: T16FFC T40LP
|
ifdef IS_T16FFC {
|
||||||
# BRAM: RBRAM2 RBRAM
|
ram block $__ANALOGDEVICES_BLOCKRAM_FULL_ {
|
||||||
# Supported: SDP_8192x05 SDP_4096x05
|
option "ERR" "ECC" {
|
||||||
# SDP_4096x10 SDP_2048x10
|
style "ECC";
|
||||||
# SDP_2048x40 SDP_1024x40
|
option "SIZE" "2048x32" {
|
||||||
# Ignored: SDP_4096x09 SDP_2048x09
|
abits 11;
|
||||||
# Unimplemented: SP_2048x20 SP_1024x20
|
width 32;
|
||||||
# TDP_4096x09
|
byte 32;
|
||||||
# TDP_8192x05
|
option "MODE" "TDP" cost 2501;
|
||||||
# TDP_2048x40
|
option "MODE" "SDP" cost 2401;
|
||||||
# SP2_2048x09 SP2_1024x09
|
}
|
||||||
# SP2_4096x05 SP2_2048x05
|
}
|
||||||
|
option "ERR" "BP" {
|
||||||
|
style "BP";
|
||||||
|
option "SIZE" "2048x36" {
|
||||||
|
abits 11;
|
||||||
|
width 36;
|
||||||
|
byte 9;
|
||||||
|
option "MODE" "TDP" cost 2504;
|
||||||
|
option "MODE" "SDP" cost 2404;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
option "ERR" "NONE" {
|
||||||
|
option "SIZE" "8192x05" {
|
||||||
|
abits 13;
|
||||||
|
width 5;
|
||||||
|
byte 1;
|
||||||
|
option "MODE" "TDP" cost 2505;
|
||||||
|
option "MODE" "SDP" cost 2405;
|
||||||
|
}
|
||||||
|
option "SIZE" "4096x09" {
|
||||||
|
abits 12;
|
||||||
|
width 9;
|
||||||
|
byte 1;
|
||||||
|
option "MODE" "TDP" cost 2509;
|
||||||
|
option "MODE" "SDP" cost 2409;
|
||||||
|
}
|
||||||
|
option "SIZE" "4096x10" {
|
||||||
|
abits 12;
|
||||||
|
width 10;
|
||||||
|
byte 1;
|
||||||
|
option "MODE" "TDP" forbid;
|
||||||
|
option "MODE" "SDP" cost 2410;
|
||||||
|
}
|
||||||
|
option "SIZE" "2048x40" {
|
||||||
|
abits 11;
|
||||||
|
width 40;
|
||||||
|
byte 8;
|
||||||
|
option "MODE" "TDP" cost 2505;
|
||||||
|
option "MODE" "SDP" cost 2405;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# supports any initialization value, but need to export memory files
|
||||||
|
init any;
|
||||||
|
|
||||||
# Simple Dual Port
|
option "MODE" "TDP" {
|
||||||
|
port srsw "A" {
|
||||||
ram block $__ANALOGDEVICES_BLOCKRAM_SDP_ {
|
clock anyedge;
|
||||||
option "ENABLE_WIDTH" "BIT" {
|
clken;
|
||||||
ifdef IS_T40LP {
|
rdwr no_change;
|
||||||
abits 12;
|
}
|
||||||
|
port srsw "B" {
|
||||||
|
clock anyedge;
|
||||||
|
clken;
|
||||||
|
rdwr no_change;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
ifdef IS_T16FFC {
|
option "MODE" "SDP" {
|
||||||
abits 13;
|
port sw "A" {
|
||||||
|
clock anyedge;
|
||||||
|
clken;
|
||||||
|
}
|
||||||
|
port sr "B" {
|
||||||
|
clock anyedge;
|
||||||
|
clken;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
widths 5 10 global;
|
|
||||||
byte 1;
|
|
||||||
cost 1;
|
|
||||||
}
|
|
||||||
option "ENABLE_WIDTH" "BYTE" {
|
|
||||||
ifdef IS_T40LP {
|
|
||||||
abits 10;
|
|
||||||
}
|
|
||||||
ifdef IS_T16FFC {
|
|
||||||
abits 11;
|
|
||||||
}
|
|
||||||
width 40;
|
|
||||||
byte 8;
|
|
||||||
cost 4;
|
|
||||||
}
|
|
||||||
# Unclear if/how RBRAM is initialized, default SIM_INIT_BEHAVIOUR is UNINITIALIZED
|
|
||||||
init none;
|
|
||||||
port sr "R" {
|
|
||||||
clock anyedge;
|
|
||||||
clken;
|
|
||||||
}
|
|
||||||
port sw "W" {
|
|
||||||
clock anyedge;
|
|
||||||
clken;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
# Single Port
|
ram block $__ANALOGDEVICES_BLOCKRAM_HALF_ {
|
||||||
|
option "ERR" "ECC" {
|
||||||
|
style "ECC";
|
||||||
|
option "SIZE" "1024x32" {
|
||||||
|
abits 10;
|
||||||
|
width 32;
|
||||||
|
byte 32;
|
||||||
|
option "MODE" "SDP" cost 2401;
|
||||||
|
option "MODE" "SP" cost 2301;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
option "ERR" "BP" {
|
||||||
|
style "BP";
|
||||||
|
option "SIZE" "1024x36" {
|
||||||
|
abits 10;
|
||||||
|
width 36;
|
||||||
|
byte 9;
|
||||||
|
option "MODE" "SDP" cost 2404;
|
||||||
|
option "MODE" "SP" cost 2304;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
option "ERR" "NONE" {
|
||||||
|
option "SIZE" "4096x05" {
|
||||||
|
abits 12;
|
||||||
|
width 5;
|
||||||
|
byte 1;
|
||||||
|
option "MODE" "SDP" cost 2405;
|
||||||
|
option "MODE" "SP" cost 2305;
|
||||||
|
}
|
||||||
|
option "SIZE" "2048x09" {
|
||||||
|
abits 11;
|
||||||
|
width 9;
|
||||||
|
byte 1;
|
||||||
|
option "MODE" "SDP" cost 2409;
|
||||||
|
option "MODE" "SP" cost 2309;
|
||||||
|
}
|
||||||
|
option "SIZE" "2048x10" {
|
||||||
|
abits 11;
|
||||||
|
width 10;
|
||||||
|
byte 1;
|
||||||
|
option "MODE" "SDP" cost 2410;
|
||||||
|
option "MODE" "SP" cost 2310;
|
||||||
|
}
|
||||||
|
option "SIZE" "1024x40" {
|
||||||
|
abits 10;
|
||||||
|
width 40;
|
||||||
|
byte 8;
|
||||||
|
option "MODE" "SDP" cost 2405;
|
||||||
|
option "MODE" "SP" cost 2305;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
# True Dual Port
|
option "MODE" "SDP" {
|
||||||
|
ifdef IS_T16FFC forbid;
|
||||||
|
port sw "A" {
|
||||||
|
clock anyedge;
|
||||||
|
clken;
|
||||||
|
}
|
||||||
|
port sr "B" {
|
||||||
|
clock anyedge;
|
||||||
|
clken;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
option "MODE" "SP" {
|
||||||
|
ifdef IS_T40LP forbid;
|
||||||
|
port srsw "A" {
|
||||||
|
clock anyedge;
|
||||||
|
clken;
|
||||||
|
rdwr no_change;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
# Dual Single Port
|
ifdef IS_T40LP {
|
||||||
|
ram block $__ANALOGDEVICES_BLOCKRAM_QUARTER_ {
|
||||||
|
option "ERR" "BP" {
|
||||||
|
style "BP";
|
||||||
|
option "SIZE" "512x18" {
|
||||||
|
abits 9;
|
||||||
|
width 18;
|
||||||
|
byte 9;
|
||||||
|
option "MODE" "SP" cost 2202;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
option "ERR" "NONE" {
|
||||||
|
option "SIZE" "2048x05" {
|
||||||
|
abits 11;
|
||||||
|
width 5;
|
||||||
|
byte 1;
|
||||||
|
option "MODE" "SP" cost 2205;
|
||||||
|
}
|
||||||
|
option "SIZE" "1024x09" {
|
||||||
|
abits 10;
|
||||||
|
width 9;
|
||||||
|
byte 1;
|
||||||
|
option "MODE" "SP" cost 2209;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
option "MODE" "SP" {
|
||||||
|
port srsw "A" {
|
||||||
|
clock anyedge;
|
||||||
|
clken;
|
||||||
|
rdwr no_change;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -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;
|
// needs -force-params
|
||||||
parameter OPTION_ENABLE_WIDTH = "BIT";
|
parameter WIDTH = 40;
|
||||||
parameter WIDTH = 40;
|
parameter ABITS = 13;
|
||||||
|
|
||||||
|
// non libmap params
|
||||||
`ifdef IS_T40LP
|
`ifdef IS_T40LP
|
||||||
parameter ABITS = 12;
|
localparam NODE = "T40LP_Gen2.4";
|
||||||
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
|
|
||||||
`endif
|
`endif
|
||||||
`ifdef IS_T16FFC
|
`ifdef IS_T16FFC
|
||||||
RBRAM2
|
localparam NODE = "T16FFC_Gen2.4";
|
||||||
`endif
|
`endif
|
||||||
#(
|
// localparam BRAM_MODE = "SDP_2048x36_BP";
|
||||||
.TARGET_NODE(NODE),
|
localparam BRAM_MODE = (OPTION_ERR!="NONE") ? {OPTION_MODE, "_", OPTION_SIZE, "_", OPTION_ERR} :
|
||||||
.BRAM_MODE(BRAM_MODE),
|
{OPTION_MODE, "_", OPTION_SIZE};
|
||||||
.QA_REG(0),
|
localparam PBITS = (OPTION_ERR=="FP") ? 1 :
|
||||||
.QB_REG(0),
|
(OPTION_ERR=="BP") ? PORT_A_WR_EN_WIDTH :
|
||||||
.CLKA_INV(!PORT_W_CLK_POL),
|
0;
|
||||||
.CLKB_INV(!PORT_R_CLK_POL),
|
|
||||||
.DATA_WIDTH(WIDTH),
|
// libmap ports
|
||||||
.ADDR_WIDTH(
|
input PORT_A_CLK;
|
||||||
WIDTH == 5 ? ABITS :
|
input PORT_A_CLK_EN;
|
||||||
WIDTH == 10 ? ABITS-1 : ABITS-2
|
input [ABITS-1:0] PORT_A_ADDR;
|
||||||
),
|
input [WIDTH-1:0] PORT_A_WR_DATA;
|
||||||
.WE_WIDTH(OPTION_ENABLE_WIDTH == "BIT" ? WIDTH : PORT_W_WR_EN_WIDTH),
|
output [WIDTH-1:0] PORT_A_RD_DATA;
|
||||||
.PERR_WIDTH(1),
|
input [PORT_A_WR_EN_WIDTH-1:0] PORT_A_WR_EN;
|
||||||
)
|
|
||||||
_TECHMAP_REPLACE_
|
input PORT_B_CLK;
|
||||||
(
|
input PORT_B_CLK_EN;
|
||||||
// .QA(0),
|
input [ABITS-1:0] PORT_B_ADDR;
|
||||||
.DA(PORT_W_WR_DATA),
|
input [WIDTH-1:0] PORT_B_WR_DATA;
|
||||||
.CEA(PORT_W_CLK_EN),
|
output [WIDTH-1:0] PORT_B_RD_DATA;
|
||||||
.WEA(PORT_W_WR_EN),
|
input [PORT_B_WR_EN_WIDTH-1:0] PORT_B_WR_EN;
|
||||||
.AA(
|
|
||||||
WIDTH == 5 ? PORT_W_ADDR :
|
`ifdef IS_T40LP
|
||||||
WIDTH == 10 ? PORT_W_ADDR[ABITS-1:1] : PORT_W_ADDR[ABITS-1:2]
|
RBRAM
|
||||||
),
|
`endif
|
||||||
.CLKA(PORT_W_CLK),
|
`ifdef IS_T16FFC
|
||||||
.QB(PORT_R_RD_DATA),
|
RBRAM2
|
||||||
// .DB(0),
|
`endif
|
||||||
.CEB(PORT_R_CLK_EN),
|
#(
|
||||||
// .WEB(0),
|
.TARGET_NODE(NODE),
|
||||||
.AB(
|
.BRAM_MODE(BRAM_MODE),
|
||||||
WIDTH == 5 ? PORT_R_ADDR :
|
.QA_REG(0),
|
||||||
WIDTH == 10 ? PORT_R_ADDR[ABITS-1:1] : PORT_R_ADDR[ABITS-1:2]
|
.QB_REG(0),
|
||||||
),
|
.CLKA_INV(!PORT_A_CLK_POL),
|
||||||
.CLKB(PORT_R_CLK),
|
.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
|
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
|
||||||
|
|
|
@ -1,39 +1,20 @@
|
||||||
# Single-port RAMs.
|
ram distributed $__ANALOGDEVICES_LUTRAM_ {
|
||||||
|
option "SIZE" 32 abits 5;
|
||||||
ram distributed $__ANALOGDEVICES_LUTRAM_SP_ {
|
option "SIZE" 64 abits 6;
|
||||||
option "ABITS" 5 {
|
|
||||||
cost 1;
|
|
||||||
abits 5;
|
|
||||||
}
|
|
||||||
option "ABITS" 6 {
|
|
||||||
cost 2;
|
|
||||||
abits 6;
|
|
||||||
}
|
|
||||||
width 1;
|
width 1;
|
||||||
init no_undef;
|
init no_undef;
|
||||||
prune_rom;
|
prune_rom;
|
||||||
port arsw "RW" {
|
port arsw "RW" {
|
||||||
clock posedge;
|
clock posedge;
|
||||||
}
|
}
|
||||||
}
|
option "MODE" "SP" {
|
||||||
|
option "SIZE" 32 cost 1;
|
||||||
# Dual-port RAMs.
|
option "SIZE" 64 cost 2;
|
||||||
|
|
||||||
ram distributed $__ANALOGDEVICES_LUTRAM_DP_ {
|
|
||||||
option "ABITS" 5 {
|
|
||||||
cost 2;
|
|
||||||
abits 5;
|
|
||||||
}
|
}
|
||||||
option "ABITS" 6 {
|
option "MODE" "DP" {
|
||||||
cost 4;
|
option "SIZE" 32 cost 2;
|
||||||
abits 6;
|
option "SIZE" 64 cost 4;
|
||||||
}
|
port ar "R" {
|
||||||
width 1;
|
}
|
||||||
init no_undef;
|
|
||||||
prune_rom;
|
|
||||||
port arsw "RW" {
|
|
||||||
clock posedge;
|
|
||||||
}
|
|
||||||
port ar "R" {
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,54 +1,116 @@
|
||||||
module $__ANALOGDEVICES_LUTRAM_SP_ (...);
|
module $__ANALOGDEVICES_LUTRAM_ (...);
|
||||||
|
|
||||||
parameter INIT = 0;
|
parameter INIT = 0;
|
||||||
parameter OPTION_ABITS = 5;
|
parameter OPTION_SIZE = 32;
|
||||||
|
parameter OPTION_MODE = "SP";
|
||||||
|
parameter ABITS = 5;
|
||||||
|
parameter WIDTH = 1;
|
||||||
|
|
||||||
output PORT_RW_RD_DATA;
|
output PORT_RW_RD_DATA;
|
||||||
input PORT_RW_WR_DATA;
|
input PORT_RW_WR_DATA;
|
||||||
input [OPTION_ABITS-1:0] PORT_RW_ADDR;
|
input [ABITS-1:0] PORT_RW_ADDR;
|
||||||
input PORT_RW_WR_EN;
|
input PORT_RW_WR_EN;
|
||||||
input PORT_RW_CLK;
|
input PORT_RW_CLK;
|
||||||
|
|
||||||
|
output PORT_R_RD_DATA;
|
||||||
|
input [ABITS-1:0] PORT_R_ADDR;
|
||||||
|
|
||||||
generate
|
generate
|
||||||
case(OPTION_ABITS)
|
if (OPTION_MODE=="SP")
|
||||||
5:
|
case(OPTION_SIZE)
|
||||||
RAMS32X1
|
32:
|
||||||
#(
|
RAMS32X1
|
||||||
.INIT(INIT)
|
#(
|
||||||
)
|
.INIT(INIT)
|
||||||
_TECHMAP_REPLACE_
|
)
|
||||||
(
|
_TECHMAP_REPLACE_
|
||||||
.O(PORT_RW_RD_DATA),
|
(
|
||||||
.A0(PORT_RW_ADDR[0]),
|
.O(PORT_RW_RD_DATA),
|
||||||
.A1(PORT_RW_ADDR[1]),
|
.A0(PORT_RW_ADDR[0]),
|
||||||
.A2(PORT_RW_ADDR[2]),
|
.A1(PORT_RW_ADDR[1]),
|
||||||
.A3(PORT_RW_ADDR[3]),
|
.A2(PORT_RW_ADDR[2]),
|
||||||
.A4(PORT_RW_ADDR[4]),
|
.A3(PORT_RW_ADDR[3]),
|
||||||
.D(PORT_RW_WR_DATA),
|
.A4(PORT_RW_ADDR[4]),
|
||||||
.WCLK(PORT_RW_CLK),
|
.D(PORT_RW_WR_DATA),
|
||||||
.WE(PORT_RW_WR_EN)
|
.WCLK(PORT_RW_CLK),
|
||||||
);
|
.WE(PORT_RW_WR_EN)
|
||||||
6:
|
);
|
||||||
RAMS64X1
|
64:
|
||||||
#(
|
RAMS64X1
|
||||||
.INIT(INIT)
|
#(
|
||||||
)
|
.INIT(INIT)
|
||||||
_TECHMAP_REPLACE_
|
)
|
||||||
(
|
_TECHMAP_REPLACE_
|
||||||
.O(PORT_RW_RD_DATA),
|
(
|
||||||
.A0(PORT_RW_ADDR[0]),
|
.O(PORT_RW_RD_DATA),
|
||||||
.A1(PORT_RW_ADDR[1]),
|
.A0(PORT_RW_ADDR[0]),
|
||||||
.A2(PORT_RW_ADDR[2]),
|
.A1(PORT_RW_ADDR[1]),
|
||||||
.A3(PORT_RW_ADDR[3]),
|
.A2(PORT_RW_ADDR[2]),
|
||||||
.A4(PORT_RW_ADDR[4]),
|
.A3(PORT_RW_ADDR[3]),
|
||||||
.A5(PORT_RW_ADDR[5]),
|
.A4(PORT_RW_ADDR[4]),
|
||||||
.D(PORT_RW_WR_DATA),
|
.A5(PORT_RW_ADDR[5]),
|
||||||
.WCLK(PORT_RW_CLK),
|
.D(PORT_RW_WR_DATA),
|
||||||
.WE(PORT_RW_WR_EN)
|
.WCLK(PORT_RW_CLK),
|
||||||
);
|
.WE(PORT_RW_WR_EN)
|
||||||
default:
|
);
|
||||||
$error("invalid OPTION_ABITS");
|
default:
|
||||||
endcase
|
$error("invalid SIZE/MODE combination");
|
||||||
|
endcase
|
||||||
|
else if (OPTION_MODE=="DP")
|
||||||
|
case (OPTION_SIZE)
|
||||||
|
32:
|
||||||
|
RAMD32X1
|
||||||
|
#(
|
||||||
|
.INIT(INIT)
|
||||||
|
)
|
||||||
|
_TECHMAP_REPLACE_
|
||||||
|
(
|
||||||
|
.DPO(PORT_R_RD_DATA),
|
||||||
|
.SPO(PORT_RW_RD_DATA),
|
||||||
|
.A0(PORT_RW_ADDR[0]),
|
||||||
|
.A1(PORT_RW_ADDR[1]),
|
||||||
|
.A2(PORT_RW_ADDR[2]),
|
||||||
|
.A3(PORT_RW_ADDR[3]),
|
||||||
|
.A4(PORT_RW_ADDR[4]),
|
||||||
|
.D(PORT_RW_WR_DATA),
|
||||||
|
.DPRA0(PORT_R_ADDR[0]),
|
||||||
|
.DPRA1(PORT_R_ADDR[1]),
|
||||||
|
.DPRA2(PORT_R_ADDR[2]),
|
||||||
|
.DPRA3(PORT_R_ADDR[3]),
|
||||||
|
.DPRA4(PORT_R_ADDR[4]),
|
||||||
|
.WCLK(PORT_RW_CLK),
|
||||||
|
.WE(PORT_RW_WR_EN)
|
||||||
|
);
|
||||||
|
64:
|
||||||
|
RAMD64X1
|
||||||
|
#(
|
||||||
|
.INIT(INIT)
|
||||||
|
)
|
||||||
|
_TECHMAP_REPLACE_
|
||||||
|
(
|
||||||
|
.DPO(PORT_R_RD_DATA),
|
||||||
|
.SPO(PORT_RW_RD_DATA),
|
||||||
|
.A0(PORT_RW_ADDR[0]),
|
||||||
|
.A1(PORT_RW_ADDR[1]),
|
||||||
|
.A2(PORT_RW_ADDR[2]),
|
||||||
|
.A3(PORT_RW_ADDR[3]),
|
||||||
|
.A4(PORT_RW_ADDR[4]),
|
||||||
|
.A5(PORT_RW_ADDR[5]),
|
||||||
|
.D(PORT_RW_WR_DATA),
|
||||||
|
.DPRA0(PORT_R_ADDR[0]),
|
||||||
|
.DPRA1(PORT_R_ADDR[1]),
|
||||||
|
.DPRA2(PORT_R_ADDR[2]),
|
||||||
|
.DPRA3(PORT_R_ADDR[3]),
|
||||||
|
.DPRA4(PORT_R_ADDR[4]),
|
||||||
|
.DPRA5(PORT_R_ADDR[5]),
|
||||||
|
.WCLK(PORT_RW_CLK),
|
||||||
|
.WE(PORT_RW_WR_EN)
|
||||||
|
);
|
||||||
|
default:
|
||||||
|
$error("invalid SIZE/MODE combination");
|
||||||
|
endcase
|
||||||
|
else
|
||||||
|
wire _TECHMAP_FAIL_ = 1;
|
||||||
endgenerate
|
endgenerate
|
||||||
|
|
||||||
endmodule
|
endmodule
|
||||||
|
@ -57,70 +119,21 @@ endmodule
|
||||||
module $__ANALOGDEVICES_LUTRAM_DP_ (...);
|
module $__ANALOGDEVICES_LUTRAM_DP_ (...);
|
||||||
|
|
||||||
parameter INIT = 0;
|
parameter INIT = 0;
|
||||||
parameter OPTION_ABITS = 5;
|
parameter OPTION_SIZE = 32;
|
||||||
|
parameter ABITS = 5;
|
||||||
|
parameter WIDTH = 1;
|
||||||
|
|
||||||
output PORT_RW_RD_DATA;
|
output PORT_RW_RD_DATA;
|
||||||
input PORT_RW_WR_DATA;
|
input PORT_RW_WR_DATA;
|
||||||
input [OPTION_ABITS-1:0] PORT_RW_ADDR;
|
input [ABITS-1:0] PORT_RW_ADDR;
|
||||||
input PORT_RW_WR_EN;
|
input PORT_RW_WR_EN;
|
||||||
input PORT_RW_CLK;
|
input PORT_RW_CLK;
|
||||||
|
|
||||||
output PORT_R_RD_DATA;
|
output PORT_R_RD_DATA;
|
||||||
input [OPTION_ABITS-1:0] PORT_R_ADDR;
|
input [ABITS-1:0] PORT_R_ADDR;
|
||||||
|
|
||||||
generate
|
generate
|
||||||
case (OPTION_ABITS)
|
|
||||||
5:
|
|
||||||
RAMD32X1
|
|
||||||
#(
|
|
||||||
.INIT(INIT)
|
|
||||||
)
|
|
||||||
_TECHMAP_REPLACE_
|
|
||||||
(
|
|
||||||
.DPO(PORT_R_RD_DATA),
|
|
||||||
.SPO(PORT_RW_RD_DATA),
|
|
||||||
.A0(PORT_RW_ADDR[0]),
|
|
||||||
.A1(PORT_RW_ADDR[1]),
|
|
||||||
.A2(PORT_RW_ADDR[2]),
|
|
||||||
.A3(PORT_RW_ADDR[3]),
|
|
||||||
.A4(PORT_RW_ADDR[4]),
|
|
||||||
.D(PORT_RW_WR_DATA),
|
|
||||||
.DPRA0(PORT_R_ADDR[0]),
|
|
||||||
.DPRA1(PORT_R_ADDR[1]),
|
|
||||||
.DPRA2(PORT_R_ADDR[2]),
|
|
||||||
.DPRA3(PORT_R_ADDR[3]),
|
|
||||||
.DPRA4(PORT_R_ADDR[4]),
|
|
||||||
.WCLK(PORT_RW_CLK),
|
|
||||||
.WE(PORT_RW_WR_EN)
|
|
||||||
);
|
|
||||||
6:
|
|
||||||
RAMD64X1
|
|
||||||
#(
|
|
||||||
.INIT(INIT)
|
|
||||||
)
|
|
||||||
_TECHMAP_REPLACE_
|
|
||||||
(
|
|
||||||
.DPO(PORT_R_RD_DATA),
|
|
||||||
.SPO(PORT_RW_RD_DATA),
|
|
||||||
.A0(PORT_RW_ADDR[0]),
|
|
||||||
.A1(PORT_RW_ADDR[1]),
|
|
||||||
.A2(PORT_RW_ADDR[2]),
|
|
||||||
.A3(PORT_RW_ADDR[3]),
|
|
||||||
.A4(PORT_RW_ADDR[4]),
|
|
||||||
.A5(PORT_RW_ADDR[5]),
|
|
||||||
.D(PORT_RW_WR_DATA),
|
|
||||||
.DPRA0(PORT_R_ADDR[0]),
|
|
||||||
.DPRA1(PORT_R_ADDR[1]),
|
|
||||||
.DPRA2(PORT_R_ADDR[2]),
|
|
||||||
.DPRA3(PORT_R_ADDR[3]),
|
|
||||||
.DPRA4(PORT_R_ADDR[4]),
|
|
||||||
.DPRA5(PORT_R_ADDR[5]),
|
|
||||||
.WCLK(PORT_RW_CLK),
|
|
||||||
.WE(PORT_RW_WR_EN)
|
|
||||||
);
|
|
||||||
default:
|
|
||||||
$error("invalid OPTION_ABITS/WIDTH combination");
|
|
||||||
endcase
|
|
||||||
endgenerate
|
endgenerate
|
||||||
|
|
||||||
endmodule
|
endmodule
|
||||||
|
|
|
@ -355,10 +355,9 @@ struct SynthAnalogDevicesPass : public ScriptPass
|
||||||
params = " [...]";
|
params = " [...]";
|
||||||
} else {
|
} else {
|
||||||
params += " -logic-cost-rom 0.015625";
|
params += " -logic-cost-rom 0.015625";
|
||||||
|
params += " -force-params";
|
||||||
params += " -lib +/analogdevices/lutrams.txt";
|
params += " -lib +/analogdevices/lutrams.txt";
|
||||||
lutrams_map = "+/analogdevices/lutrams_map.v";
|
|
||||||
params += " -lib +/analogdevices/brams.txt";
|
params += " -lib +/analogdevices/brams.txt";
|
||||||
brams_map = "+/analogdevices/brams_map.v";
|
|
||||||
params += tech_param;
|
params += tech_param;
|
||||||
brams_map += tech_param;
|
brams_map += tech_param;
|
||||||
if (nolutram)
|
if (nolutram)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue