mirror of
https://github.com/YosysHQ/yosys
synced 2025-04-13 04:28:18 +00:00
ecp5: Add support for mapping 36-bit wide PDP BRAMs
Signed-off-by: David Shah <dave@ds0.me>
This commit is contained in:
parent
d963e8c2c6
commit
7a1538cd36
1
techlibs/ecp5/.gitignore
vendored
1
techlibs/ecp5/.gitignore
vendored
|
@ -6,4 +6,5 @@ bram_conn_2.vh
|
||||||
bram_conn_4.vh
|
bram_conn_4.vh
|
||||||
bram_conn_9.vh
|
bram_conn_9.vh
|
||||||
bram_conn_18.vh
|
bram_conn_18.vh
|
||||||
|
bram_conn_36.vh
|
||||||
brams_connect.mk
|
brams_connect.mk
|
||||||
|
|
|
@ -44,6 +44,7 @@ techlibs/ecp5/bram_conn_2.vh: techlibs/ecp5/brams_connect.mk
|
||||||
techlibs/ecp5/bram_conn_4.vh: techlibs/ecp5/brams_connect.mk
|
techlibs/ecp5/bram_conn_4.vh: techlibs/ecp5/brams_connect.mk
|
||||||
techlibs/ecp5/bram_conn_9.vh: techlibs/ecp5/brams_connect.mk
|
techlibs/ecp5/bram_conn_9.vh: techlibs/ecp5/brams_connect.mk
|
||||||
techlibs/ecp5/bram_conn_18.vh: techlibs/ecp5/brams_connect.mk
|
techlibs/ecp5/bram_conn_18.vh: techlibs/ecp5/brams_connect.mk
|
||||||
|
techlibs/ecp5/bram_conn_36.vh: techlibs/ecp5/brams_connect.mk
|
||||||
|
|
||||||
$(eval $(call add_gen_share_file,share/ecp5,techlibs/ecp5/bram_init_1_2_4.vh))
|
$(eval $(call add_gen_share_file,share/ecp5,techlibs/ecp5/bram_init_1_2_4.vh))
|
||||||
$(eval $(call add_gen_share_file,share/ecp5,techlibs/ecp5/bram_init_9_18_36.vh))
|
$(eval $(call add_gen_share_file,share/ecp5,techlibs/ecp5/bram_init_9_18_36.vh))
|
||||||
|
@ -53,3 +54,4 @@ $(eval $(call add_gen_share_file,share/ecp5,techlibs/ecp5/bram_conn_2.vh))
|
||||||
$(eval $(call add_gen_share_file,share/ecp5,techlibs/ecp5/bram_conn_4.vh))
|
$(eval $(call add_gen_share_file,share/ecp5,techlibs/ecp5/bram_conn_4.vh))
|
||||||
$(eval $(call add_gen_share_file,share/ecp5,techlibs/ecp5/bram_conn_9.vh))
|
$(eval $(call add_gen_share_file,share/ecp5,techlibs/ecp5/bram_conn_9.vh))
|
||||||
$(eval $(call add_gen_share_file,share/ecp5,techlibs/ecp5/bram_conn_18.vh))
|
$(eval $(call add_gen_share_file,share/ecp5,techlibs/ecp5/bram_conn_18.vh))
|
||||||
|
$(eval $(call add_gen_share_file,share/ecp5,techlibs/ecp5/bram_conn_36.vh))
|
||||||
|
|
|
@ -1,3 +1,18 @@
|
||||||
|
bram $__ECP5_PDPW16KD
|
||||||
|
init 1
|
||||||
|
|
||||||
|
abits 9
|
||||||
|
dbits 36
|
||||||
|
|
||||||
|
groups 2
|
||||||
|
ports 1 1
|
||||||
|
wrmode 1 0
|
||||||
|
enable 4 1
|
||||||
|
transp 0 0
|
||||||
|
clocks 2 3
|
||||||
|
clkpol 2 3
|
||||||
|
endbram
|
||||||
|
|
||||||
bram $__ECP5_DP16KD
|
bram $__ECP5_DP16KD
|
||||||
init 1
|
init 1
|
||||||
|
|
||||||
|
@ -22,6 +37,14 @@ bram $__ECP5_DP16KD
|
||||||
clkpol 2 3
|
clkpol 2 3
|
||||||
endbram
|
endbram
|
||||||
|
|
||||||
|
match $__ECP5_PDPW16KD
|
||||||
|
min bits 2048
|
||||||
|
min efficiency 5
|
||||||
|
shuffle_enable B
|
||||||
|
make_transp
|
||||||
|
or_next_if_better
|
||||||
|
endmatch
|
||||||
|
|
||||||
match $__ECP5_DP16KD
|
match $__ECP5_DP16KD
|
||||||
min bits 2048
|
min bits 2048
|
||||||
min efficiency 5
|
min efficiency 5
|
||||||
|
|
|
@ -10,6 +10,18 @@ def write_bus_ports(f, ada_bits, adb_bits, dia_bits, dob_bits):
|
||||||
print(" %s," % ", ".join(dia_conn), file=f)
|
print(" %s," % ", ".join(dia_conn), file=f)
|
||||||
print(" %s," % ", ".join(dob_conn), file=f)
|
print(" %s," % ", ".join(dob_conn), file=f)
|
||||||
|
|
||||||
|
def write_bus_ports_pdp(f, adw_bits, adr_bits, di_bits, do_bits, be_bits):
|
||||||
|
adw_conn = [".ADW%d(%s)" % (i, adw_bits[i]) for i in range(len(adw_bits))]
|
||||||
|
adr_conn = [".ADR%d(%s)" % (i, adr_bits[i]) for i in range(len(adr_bits))]
|
||||||
|
di_conn = [".DI%d(%s)" % (i, di_bits[i]) for i in range(len(di_bits))]
|
||||||
|
do_conn = [".DO%d(%s)" % (i, do_bits[i]) for i in range(len(do_bits))]
|
||||||
|
be_conn = [".BE%d(%s)" % (i, be_bits[i]) for i in range(len(be_bits))]
|
||||||
|
print(" %s," % ", ".join(adw_conn), file=f)
|
||||||
|
print(" %s," % ", ".join(adr_conn), file=f)
|
||||||
|
print(" %s," % ", ".join(di_conn), file=f)
|
||||||
|
print(" %s," % ", ".join(do_conn), file=f)
|
||||||
|
print(" %s," % ", ".join(be_conn), file=f)
|
||||||
|
|
||||||
with open("techlibs/ecp5/bram_conn_1.vh", "w") as f:
|
with open("techlibs/ecp5/bram_conn_1.vh", "w") as f:
|
||||||
ada_bits = ["A1ADDR[%d]" % i for i in range(14)]
|
ada_bits = ["A1ADDR[%d]" % i for i in range(14)]
|
||||||
adb_bits = ["B1ADDR[%d]" % i for i in range(14)]
|
adb_bits = ["B1ADDR[%d]" % i for i in range(14)]
|
||||||
|
@ -44,3 +56,11 @@ with open("techlibs/ecp5/bram_conn_18.vh", "w") as f:
|
||||||
dia_bits = ["A1DATA[%d]" % i for i in range(18)]
|
dia_bits = ["A1DATA[%d]" % i for i in range(18)]
|
||||||
dob_bits = ["B1DATA[%d]" % i for i in range(18)]
|
dob_bits = ["B1DATA[%d]" % i for i in range(18)]
|
||||||
write_bus_ports(f, ada_bits, adb_bits, dia_bits, dob_bits)
|
write_bus_ports(f, ada_bits, adb_bits, dia_bits, dob_bits)
|
||||||
|
|
||||||
|
with open("techlibs/ecp5/bram_conn_36.vh", "w") as f:
|
||||||
|
adw_bits = ["A1ADDR[%d]" % i for i in range(9)]
|
||||||
|
adr_bits = ["1'b0", "1'b0", "1'b0", "1'b0", "1'b0"] + ["B1ADDR[%d]" % i for i in range(9)]
|
||||||
|
di_bits = ["A1DATA[%d]" % i for i in range(36)]
|
||||||
|
do_bits = ["B1DATA[%d]" % (i + 18) for i in range(18)] + ["B1DATA[%d]" % i for i in range(18)]
|
||||||
|
be_bits = ["A1EN[%d]" % i for i in range(4)]
|
||||||
|
write_bus_ports_pdp(f, adw_bits, adr_bits, di_bits, do_bits, be_bits)
|
||||||
|
|
|
@ -113,3 +113,45 @@ module \$__ECP5_DP16KD (CLK2, CLK3, A1ADDR, A1DATA, A1EN, B1ADDR, B1DATA, B1EN);
|
||||||
wire TECHMAP_FAIL = 1'b1;
|
wire TECHMAP_FAIL = 1'b1;
|
||||||
end endgenerate
|
end endgenerate
|
||||||
endmodule
|
endmodule
|
||||||
|
|
||||||
|
module \$__ECP5_PDPW16KD (CLK2, CLK3, A1ADDR, A1DATA, A1EN, B1ADDR, B1DATA, B1EN);
|
||||||
|
parameter CFG_ABITS = 9;
|
||||||
|
parameter CFG_DBITS = 36;
|
||||||
|
parameter CFG_ENABLE_A = 4;
|
||||||
|
|
||||||
|
parameter CLKPOL2 = 1;
|
||||||
|
parameter CLKPOL3 = 1;
|
||||||
|
parameter [18431:0] INIT = 18432'bx;
|
||||||
|
|
||||||
|
input CLK2;
|
||||||
|
input CLK3;
|
||||||
|
|
||||||
|
input [CFG_ABITS-1:0] A1ADDR;
|
||||||
|
input [CFG_DBITS-1:0] A1DATA;
|
||||||
|
input [CFG_ENABLE_A-1:0] A1EN;
|
||||||
|
|
||||||
|
input [CFG_ABITS-1:0] B1ADDR;
|
||||||
|
output [CFG_DBITS-1:0] B1DATA;
|
||||||
|
input B1EN;
|
||||||
|
|
||||||
|
localparam CLKWMUX = CLKPOL2 ? "CLKA" : "INV";
|
||||||
|
localparam CLKRMUX = CLKPOL3 ? "CLKB" : "INV";
|
||||||
|
|
||||||
|
localparam WRITEMODE_A = TRANSP2 ? "WRITETHROUGH" : "READBEFOREWRITE";
|
||||||
|
|
||||||
|
PDPW16KD #(
|
||||||
|
`include "bram_init_9_18_36.vh"
|
||||||
|
.DATA_WIDTH_W(36),
|
||||||
|
.DATA_WIDTH_R(36),
|
||||||
|
.CLKWMUX(CLKWMUX),
|
||||||
|
.CLKRMUX(CLKRMUX),
|
||||||
|
.GSR("AUTO")
|
||||||
|
) _TECHMAP_REPLACE_ (
|
||||||
|
`include "bram_conn_36.vh"
|
||||||
|
.CLKW(CLK2), .CLKR(CLK3),
|
||||||
|
.CEW(1'b1),
|
||||||
|
.CER(B1EN), .OCER(1'b1),
|
||||||
|
.RST(1'b0)
|
||||||
|
);
|
||||||
|
|
||||||
|
endmodule
|
||||||
|
|
|
@ -683,4 +683,98 @@ endmodule
|
||||||
module SGSR (
|
module SGSR (
|
||||||
input GSR, CLK
|
input GSR, CLK
|
||||||
);
|
);
|
||||||
endmodule
|
endmodule
|
||||||
|
|
||||||
|
|
||||||
|
(* blackbox *)
|
||||||
|
module PDPW16KD (
|
||||||
|
input DI35, DI34, DI33, DI32, DI31, DI30, DI29, DI28, DI27, DI26, DI25, DI24, DI23, DI22, DI21, DI20, DI19, DI18,
|
||||||
|
input DI17, DI16, DI15, DI14, DI13, DI12, DI11, DI10, DI9, DI8, DI7, DI6, DI5, DI4, DI3, DI2, DI1, DI0,
|
||||||
|
input ADW8, ADW7, ADW6, ADW5, ADW4, ADW3, ADW2, ADW1, ADW0,
|
||||||
|
input BE3, BE2, BE1, BE0, CEW, CLKW, CSW2, CSW1, CSW0,
|
||||||
|
input ADR13, ADR12, ADR11, ADR10, ADR9, ADR8, ADR7, ADR6, ADR5, ADR4, ADR3, ADR2, ADR1, ADR0,
|
||||||
|
input CER, OCER, CLKR, CSR2, CSR1, CSR0, RST,
|
||||||
|
output DO35, DO34, DO33, DO32, DO31, DO30, DO29, DO28, DO27, DO26, DO25, DO24, DO23, DO22, DO21, DO20, DO19, DO18,
|
||||||
|
output DO17, DO16, DO15, DO14, DO13, DO12, DO11, DO10, DO9, DO8, DO7, DO6, DO5, DO4, DO3, DO2, DO1, DO0
|
||||||
|
);
|
||||||
|
parameter DATA_WIDTH_W = 36;
|
||||||
|
parameter DATA_WIDTH_R = 36;
|
||||||
|
parameter GSR = "ENABLED";
|
||||||
|
|
||||||
|
parameter REGMODE = "NOREG";
|
||||||
|
|
||||||
|
parameter RESETMODE = "SYNC";
|
||||||
|
parameter ASYNC_RESET_RELEASE = "SYNC";
|
||||||
|
|
||||||
|
parameter CSDECODE_W = "0b000";
|
||||||
|
parameter CSDECODE_R = "0b000";
|
||||||
|
|
||||||
|
parameter INITVAL_00 = 320'h00000000000000000000000000000000000000000000000000000000000000000000000000000000;
|
||||||
|
parameter INITVAL_01 = 320'h00000000000000000000000000000000000000000000000000000000000000000000000000000000;
|
||||||
|
parameter INITVAL_02 = 320'h00000000000000000000000000000000000000000000000000000000000000000000000000000000;
|
||||||
|
parameter INITVAL_03 = 320'h00000000000000000000000000000000000000000000000000000000000000000000000000000000;
|
||||||
|
parameter INITVAL_04 = 320'h00000000000000000000000000000000000000000000000000000000000000000000000000000000;
|
||||||
|
parameter INITVAL_05 = 320'h00000000000000000000000000000000000000000000000000000000000000000000000000000000;
|
||||||
|
parameter INITVAL_06 = 320'h00000000000000000000000000000000000000000000000000000000000000000000000000000000;
|
||||||
|
parameter INITVAL_07 = 320'h00000000000000000000000000000000000000000000000000000000000000000000000000000000;
|
||||||
|
parameter INITVAL_08 = 320'h00000000000000000000000000000000000000000000000000000000000000000000000000000000;
|
||||||
|
parameter INITVAL_09 = 320'h00000000000000000000000000000000000000000000000000000000000000000000000000000000;
|
||||||
|
parameter INITVAL_0A = 320'h00000000000000000000000000000000000000000000000000000000000000000000000000000000;
|
||||||
|
parameter INITVAL_0B = 320'h00000000000000000000000000000000000000000000000000000000000000000000000000000000;
|
||||||
|
parameter INITVAL_0C = 320'h00000000000000000000000000000000000000000000000000000000000000000000000000000000;
|
||||||
|
parameter INITVAL_0D = 320'h00000000000000000000000000000000000000000000000000000000000000000000000000000000;
|
||||||
|
parameter INITVAL_0E = 320'h00000000000000000000000000000000000000000000000000000000000000000000000000000000;
|
||||||
|
parameter INITVAL_0F = 320'h00000000000000000000000000000000000000000000000000000000000000000000000000000000;
|
||||||
|
parameter INITVAL_10 = 320'h00000000000000000000000000000000000000000000000000000000000000000000000000000000;
|
||||||
|
parameter INITVAL_11 = 320'h00000000000000000000000000000000000000000000000000000000000000000000000000000000;
|
||||||
|
parameter INITVAL_12 = 320'h00000000000000000000000000000000000000000000000000000000000000000000000000000000;
|
||||||
|
parameter INITVAL_13 = 320'h00000000000000000000000000000000000000000000000000000000000000000000000000000000;
|
||||||
|
parameter INITVAL_14 = 320'h00000000000000000000000000000000000000000000000000000000000000000000000000000000;
|
||||||
|
parameter INITVAL_15 = 320'h00000000000000000000000000000000000000000000000000000000000000000000000000000000;
|
||||||
|
parameter INITVAL_16 = 320'h00000000000000000000000000000000000000000000000000000000000000000000000000000000;
|
||||||
|
parameter INITVAL_17 = 320'h00000000000000000000000000000000000000000000000000000000000000000000000000000000;
|
||||||
|
parameter INITVAL_18 = 320'h00000000000000000000000000000000000000000000000000000000000000000000000000000000;
|
||||||
|
parameter INITVAL_19 = 320'h00000000000000000000000000000000000000000000000000000000000000000000000000000000;
|
||||||
|
parameter INITVAL_1A = 320'h00000000000000000000000000000000000000000000000000000000000000000000000000000000;
|
||||||
|
parameter INITVAL_1B = 320'h00000000000000000000000000000000000000000000000000000000000000000000000000000000;
|
||||||
|
parameter INITVAL_1C = 320'h00000000000000000000000000000000000000000000000000000000000000000000000000000000;
|
||||||
|
parameter INITVAL_1D = 320'h00000000000000000000000000000000000000000000000000000000000000000000000000000000;
|
||||||
|
parameter INITVAL_1E = 320'h00000000000000000000000000000000000000000000000000000000000000000000000000000000;
|
||||||
|
parameter INITVAL_1F = 320'h00000000000000000000000000000000000000000000000000000000000000000000000000000000;
|
||||||
|
parameter INITVAL_20 = 320'h00000000000000000000000000000000000000000000000000000000000000000000000000000000;
|
||||||
|
parameter INITVAL_21 = 320'h00000000000000000000000000000000000000000000000000000000000000000000000000000000;
|
||||||
|
parameter INITVAL_22 = 320'h00000000000000000000000000000000000000000000000000000000000000000000000000000000;
|
||||||
|
parameter INITVAL_23 = 320'h00000000000000000000000000000000000000000000000000000000000000000000000000000000;
|
||||||
|
parameter INITVAL_24 = 320'h00000000000000000000000000000000000000000000000000000000000000000000000000000000;
|
||||||
|
parameter INITVAL_25 = 320'h00000000000000000000000000000000000000000000000000000000000000000000000000000000;
|
||||||
|
parameter INITVAL_26 = 320'h00000000000000000000000000000000000000000000000000000000000000000000000000000000;
|
||||||
|
parameter INITVAL_27 = 320'h00000000000000000000000000000000000000000000000000000000000000000000000000000000;
|
||||||
|
parameter INITVAL_28 = 320'h00000000000000000000000000000000000000000000000000000000000000000000000000000000;
|
||||||
|
parameter INITVAL_29 = 320'h00000000000000000000000000000000000000000000000000000000000000000000000000000000;
|
||||||
|
parameter INITVAL_2A = 320'h00000000000000000000000000000000000000000000000000000000000000000000000000000000;
|
||||||
|
parameter INITVAL_2B = 320'h00000000000000000000000000000000000000000000000000000000000000000000000000000000;
|
||||||
|
parameter INITVAL_2C = 320'h00000000000000000000000000000000000000000000000000000000000000000000000000000000;
|
||||||
|
parameter INITVAL_2D = 320'h00000000000000000000000000000000000000000000000000000000000000000000000000000000;
|
||||||
|
parameter INITVAL_2E = 320'h00000000000000000000000000000000000000000000000000000000000000000000000000000000;
|
||||||
|
parameter INITVAL_2F = 320'h00000000000000000000000000000000000000000000000000000000000000000000000000000000;
|
||||||
|
parameter INITVAL_30 = 320'h00000000000000000000000000000000000000000000000000000000000000000000000000000000;
|
||||||
|
parameter INITVAL_31 = 320'h00000000000000000000000000000000000000000000000000000000000000000000000000000000;
|
||||||
|
parameter INITVAL_32 = 320'h00000000000000000000000000000000000000000000000000000000000000000000000000000000;
|
||||||
|
parameter INITVAL_33 = 320'h00000000000000000000000000000000000000000000000000000000000000000000000000000000;
|
||||||
|
parameter INITVAL_34 = 320'h00000000000000000000000000000000000000000000000000000000000000000000000000000000;
|
||||||
|
parameter INITVAL_35 = 320'h00000000000000000000000000000000000000000000000000000000000000000000000000000000;
|
||||||
|
parameter INITVAL_36 = 320'h00000000000000000000000000000000000000000000000000000000000000000000000000000000;
|
||||||
|
parameter INITVAL_37 = 320'h00000000000000000000000000000000000000000000000000000000000000000000000000000000;
|
||||||
|
parameter INITVAL_38 = 320'h00000000000000000000000000000000000000000000000000000000000000000000000000000000;
|
||||||
|
parameter INITVAL_39 = 320'h00000000000000000000000000000000000000000000000000000000000000000000000000000000;
|
||||||
|
parameter INITVAL_3A = 320'h00000000000000000000000000000000000000000000000000000000000000000000000000000000;
|
||||||
|
parameter INITVAL_3B = 320'h00000000000000000000000000000000000000000000000000000000000000000000000000000000;
|
||||||
|
parameter INITVAL_3C = 320'h00000000000000000000000000000000000000000000000000000000000000000000000000000000;
|
||||||
|
parameter INITVAL_3D = 320'h00000000000000000000000000000000000000000000000000000000000000000000000000000000;
|
||||||
|
parameter INITVAL_3E = 320'h00000000000000000000000000000000000000000000000000000000000000000000000000000000;
|
||||||
|
parameter INITVAL_3F = 320'h00000000000000000000000000000000000000000000000000000000000000000000000000000000;
|
||||||
|
parameter INIT_DATA = "STATIC";
|
||||||
|
parameter CLKWMUX = "CLKW";
|
||||||
|
parameter CLKRMUX = "CLKR";
|
||||||
|
|
||||||
|
endmodule
|
||||||
|
|
Loading…
Reference in a new issue