Skip to content

Commit 65ac65e

Browse files
authored
Merge pull request #376 from antmicro/pcza/ql-qlf-k6n10f-asymmetric-ram
ql-qlf: k6n10f: add asymmetric RAM inference
2 parents ebd8fa8 + f680e2a commit 65ac65e

16 files changed

+2014
-34
lines changed

ql-qlf-plugin/Makefile

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,10 +23,13 @@ SOURCES = synth_quicklogic.cc \
2323
ql-dsp-simd.cc \
2424
ql-dsp-macc.cc \
2525
ql-bram-split.cc \
26-
ql-dsp-io-regs.cc
26+
ql-dsp-io-regs.cc \
27+
ql-bram-asymmetric.cc
2728

2829
DEPS = pmgen/ql-dsp-pm.h \
29-
pmgen/ql-dsp-macc.h
30+
pmgen/ql-dsp-macc.h \
31+
pmgen/ql-bram-asymmetric-wider-write.h \
32+
pmgen/ql-bram-asymmetric-wider-read.h
3033

3134
include ../Makefile_plugin.common
3235

@@ -85,6 +88,12 @@ pmgen/ql-dsp-pm.h: ../pmgen.py ql_dsp.pmg | pmgen
8588
pmgen/ql-dsp-macc.h: ../pmgen.py ql-dsp-macc.pmg | pmgen
8689
python3 ../pmgen.py -o $@ -p ql_dsp_macc ql-dsp-macc.pmg
8790

91+
pmgen/ql-bram-asymmetric-wider-write.h: ../pmgen.py ql-bram-asymmetric-wider-write.pmg | pmgen
92+
python3 ../pmgen.py -o $@ -p ql_bram_asymmetric_wider_write ql-bram-asymmetric-wider-write.pmg
93+
94+
pmgen/ql-bram-asymmetric-wider-read.h: ../pmgen.py ql-bram-asymmetric-wider-read.pmg | pmgen
95+
python3 ../pmgen.py -o $@ -p ql_bram_asymmetric_wider_read ql-bram-asymmetric-wider-read.pmg
96+
8897
install_modules: $(VERILOG_MODULES)
8998
$(foreach f,$^,install -D $(f) $(DATA_DIR)/quicklogic/$(f);)
9099

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
pattern ql_bram_asymmetric_wider_read
2+
3+
state <SigSpec> mem_wr_data
4+
state <SigSpec> mem_wr_en
5+
state <SigSpec> mem_wr_addr
6+
state <SigSpec> mem_rd_data
7+
state <SigSpec> mem_rd_addr
8+
state <SigSpec> mux_ab
9+
state <SigSpec> mux_s
10+
state <SigSpec> mux_ba
11+
state <SigSpec> mux_input
12+
state <SigSpec> wr_data_shift_a
13+
state <SigSpec> wr_data_shift_b
14+
state <SigSpec> wr_en_and_a
15+
state <SigSpec> wr_en_and_b
16+
state <SigSpec> wr_en_and_y
17+
state <SigSpec> wr_en_shift_a
18+
state <SigSpec> wr_en_shift_b
19+
state <SigSpec> wr_en_shift_y
20+
21+
match mem
22+
select mem->type == ($mem_v2)
23+
// 2 because it is a primary output connected to one cell (rq port or $shiftx cell)
24+
select nusers(port(mem, \WR_DATA)) == 2
25+
set mem_wr_data port(mem, \WR_DATA)
26+
set mem_wr_en port(mem, \WR_EN)
27+
set mem_wr_addr port(mem, \WR_ADDR)
28+
set mem_rd_data port(mem, \RD_DATA)
29+
set mem_rd_addr port(mem, \RD_ADDR)
30+
endmatch
31+
32+
match wr_en_and
33+
select wr_en_and->type == ($and)
34+
set wr_en_and_a port(wr_en_and, \A)
35+
set wr_en_and_b port(wr_en_and, \B)
36+
set wr_en_and_y port(wr_en_and, \Y)
37+
endmatch
38+
39+
match wr_en_shift
40+
select wr_en_shift->type.in($shl)
41+
set wr_en_shift_a port(wr_en_shift, \A)
42+
set wr_en_shift_b port(wr_en_shift, \B)
43+
set wr_en_shift_y port(wr_en_shift, \Y)
44+
endmatch
45+
46+
match mux
47+
select mux->type == ($mux)
48+
choice <IdString> AB {\A, \B}
49+
define <IdString> BA (AB == \A ? \B : \A)
50+
index <SigSpec> port(mux, \Y) === mem_wr_en
51+
index <SigSpec> port(mux, AB) === wr_en_shift_y
52+
set mux_ab port(mux, AB)
53+
set mux_s port(mux, \S)
54+
set mux_ba port(mux, BA)
55+
endmatch
56+
57+
match wr_data_shift
58+
select wr_data_shift->type.in($shl)
59+
index <SigSpec> port(wr_data_shift, \Y) === mem_wr_data
60+
set wr_data_shift_a port(wr_data_shift, \A)
61+
set wr_data_shift_b port(wr_data_shift, \B)
62+
endmatch
63+
64+
code
65+
accept;
66+
endcode
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
pattern ql_bram_asymmetric_wider_write
2+
3+
state <SigSpec> mem_rd_data
4+
state <SigSpec> mem_rd_addr
5+
state <SigSpec> mem_wr_data
6+
state <SigSpec> mem_wr_addr
7+
state <SigSpec> mem_wr_en
8+
state <SigSpec> rd_data_shift_y
9+
state <SigSpec> rd_data_ff_q
10+
state <SigSpec> rd_data_ff_en
11+
state <SigSpec> rd_data_ff_clk
12+
state <SigSpec> wr_addr_ff_d
13+
state <SigSpec> wr_en_mux_s
14+
state <SigSpec> rd_addr_and_a
15+
state <SigSpec> rd_addr_and_b
16+
17+
match mem
18+
select mem->type == ($mem_v2)
19+
// 2 because it is a primary output connected to one cell (rq port or $shiftx cell)
20+
select nusers(port(mem, \RD_DATA)) == 2
21+
set mem_rd_data port(mem, \RD_DATA)
22+
set mem_rd_addr port(mem, \RD_ADDR)
23+
set mem_wr_data port(mem, \WR_DATA)
24+
set mem_wr_addr port(mem, \WR_ADDR)
25+
set mem_wr_en port(mem, \WR_EN)
26+
endmatch
27+
28+
match rd_data_shift
29+
select rd_data_shift->type.in($shiftx)
30+
index <SigSpec> port(rd_data_shift, \A) === mem_rd_data
31+
set rd_data_shift_y port(rd_data_shift, \Y)
32+
endmatch
33+
34+
match rd_data_ff
35+
select rd_data_ff->type.in($dffe)
36+
select nusers(port(rd_data_ff, \D)) == 2
37+
index <SigSpec> port(rd_data_ff, \D) === rd_data_shift_y
38+
set rd_data_ff_q port(rd_data_ff, \Q)
39+
set rd_data_ff_en port(rd_data_ff, \EN)
40+
set rd_data_ff_clk port(rd_data_ff, \CLK)
41+
endmatch
42+
43+
match wr_addr_ff
44+
select wr_addr_ff->type.in($dff)
45+
select nusers(port(wr_addr_ff, \Q)) == 2
46+
index <SigSpec> port(wr_addr_ff, \Q) === mem_wr_addr
47+
set wr_addr_ff_d port(wr_addr_ff, \D)
48+
optional
49+
endmatch
50+
51+
match wr_en_mux
52+
select wr_en_mux->type.in($mux)
53+
index <SigSpec> port(wr_en_mux, \Y) === mem_wr_en[0]
54+
set wr_en_mux_s port(wr_en_mux, \S)
55+
endmatch
56+
57+
match rd_addr_and
58+
select rd_addr_and->type.in($and)
59+
set rd_addr_and_a port(rd_addr_and, \A)
60+
set rd_addr_and_b port(rd_addr_and, \B)
61+
endmatch
62+
63+
code
64+
accept;
65+
endcode

0 commit comments

Comments
 (0)