From 64700dec65d6217d88b8f869dcf1a36cc365f94d Mon Sep 17 00:00:00 2001 From: YRabbit Date: Tue, 21 Oct 2025 12:36:06 +1000 Subject: [PATCH] Gowin. Disable unsupported BSRAM mode in GW5A All supported (and planned to be supported) GW5A series chips do not support the 2: Read-before-Write write mode. Here, we prohibit the generation of BSRAM with this mode. Signed-off-by: YRabbit --- techlibs/gowin/Makefile.inc | 1 + techlibs/gowin/brams_gw5a.txt | 69 +++++++++++++++++++++++++++++++++++ techlibs/gowin/synth_gowin.cc | 2 +- 3 files changed, 71 insertions(+), 1 deletion(-) create mode 100644 techlibs/gowin/brams_gw5a.txt diff --git a/techlibs/gowin/Makefile.inc b/techlibs/gowin/Makefile.inc index df1b79317..08893e73f 100644 --- a/techlibs/gowin/Makefile.inc +++ b/techlibs/gowin/Makefile.inc @@ -10,5 +10,6 @@ $(eval $(call add_share_file,share/gowin,techlibs/gowin/arith_map.v)) $(eval $(call add_share_file,share/gowin,techlibs/gowin/brams_map.v)) $(eval $(call add_share_file,share/gowin,techlibs/gowin/brams_map_gw5a.v)) $(eval $(call add_share_file,share/gowin,techlibs/gowin/brams.txt)) +$(eval $(call add_share_file,share/gowin,techlibs/gowin/brams_gw5a.txt)) $(eval $(call add_share_file,share/gowin,techlibs/gowin/lutrams_map.v)) $(eval $(call add_share_file,share/gowin,techlibs/gowin/lutrams.txt)) diff --git a/techlibs/gowin/brams_gw5a.txt b/techlibs/gowin/brams_gw5a.txt new file mode 100644 index 000000000..2747ea451 --- /dev/null +++ b/techlibs/gowin/brams_gw5a.txt @@ -0,0 +1,69 @@ +ram block $__GOWIN_SP_ { + abits 14; + widths 1 2 4 9 18 36 per_port; + cost 128; + init no_undef; + port srsw "A" { + clock posedge; + clken; + option "RESET_MODE" "SYNC" { + rdsrst zero ungated; + } + option "RESET_MODE" "ASYNC" { + rdarst zero; + } + rdinit zero; + portoption "WRITE_MODE" 0 { + rdwr no_change; + } + portoption "WRITE_MODE" 1 { + rdwr new; + } + } +} + +ram block $__GOWIN_DP_ { + abits 14; + widths 1 2 4 9 18 per_port; + cost 128; + init no_undef; + port srsw "A" "B" { + clock posedge; + clken; + option "RESET_MODE" "SYNC" { + rdsrst zero ungated; + } + option "RESET_MODE" "ASYNC" { + rdarst zero; + } + rdinit zero; + portoption "WRITE_MODE" 0 { + rdwr no_change; + } + portoption "WRITE_MODE" 1 { + rdwr new; + } + } +} + +ram block $__GOWIN_SDP_ { + abits 14; + widths 1 2 4 9 18 36 per_port; + cost 128; + init no_undef; + port sr "R" { + clock posedge; + clken; + option "RESET_MODE" "SYNC" { + rdsrst zero ungated; + } + option "RESET_MODE" "ASYNC" { + rdarst zero; + } + rdinit zero; + } + port sw "W" { + clock posedge; + clken; + } +} diff --git a/techlibs/gowin/synth_gowin.cc b/techlibs/gowin/synth_gowin.cc index 1a55f9f37..4e925daab 100644 --- a/techlibs/gowin/synth_gowin.cc +++ b/techlibs/gowin/synth_gowin.cc @@ -263,7 +263,7 @@ struct SynthGowinPass : public ScriptPass if (nolutram) args += " -no-auto-distributed"; } - run("memory_libmap -lib +/gowin/lutrams.txt -lib +/gowin/brams.txt" + args, "(-no-auto-block if -nobram, -no-auto-distributed if -nolutram)"); + run(stringf("memory_libmap -lib +/gowin/lutrams.txt -lib +/gowin/brams%s.txt", family == "gw5a" ? "_gw5a" : "") + args, "(-no-auto-block if -nobram, -no-auto-distributed if -nolutram)"); run(stringf("techmap -map +/gowin/lutrams_map.v -map +/gowin/brams_map%s.v", family == "gw5a" ? "_gw5a" : "")); }