3
0
Fork 0
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:
Krystine Sherwin 2025-10-18 12:59:55 +13:00 committed by Lofty
parent f32d6429bd
commit 6e5524ee9c
5 changed files with 527 additions and 246 deletions

View file

@ -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;
}
}
}
}

View file

@ -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

View file

@ -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" {
} }
} }

View file

@ -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

View file

@ -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)