Merge branch 'chipsalliance:main' into clock_gating
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index a98124e..4ab1814 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -21,7 +21,7 @@
 jobs:
 
   Run-tests:
-    runs-on: ubuntu-latest
+    runs-on: ubuntu-20.04
 
     steps:
 
diff --git a/.gitignore b/.gitignore
index 56d3484..a299974 100644
--- a/.gitignore
+++ b/.gitignore
@@ -3,4 +3,4 @@
 *.so
 *.swp
 *.log
-ql-qlf-plugin/pmgen/*
+/*/build
diff --git a/Makefile b/Makefile
index 044fe00..70433f7 100644
--- a/Makefile
+++ b/Makefile
@@ -20,6 +20,7 @@
 PLUGINS_CLEAN := $(foreach plugin,$(PLUGIN_LIST),clean_$(plugin))
 PLUGINS_TEST := $(foreach plugin,$(PLUGIN_LIST),test_$(plugin))
 
+.PHONY: all
 all: plugins
 
 TOP_DIR := $(realpath $(dir $(lastword $(MAKEFILE_LIST))))
@@ -29,15 +30,19 @@
 -include third_party/make-env/conda.mk
 
 define install_plugin =
+.PHONY: $(1).so
 $(1).so:
 	$$(MAKE) -C $(1)-plugin $$@
 
+.PHONY: install_$(1)
 install_$(1):
 	$$(MAKE) -C $(1)-plugin install
 
+.PHONY: clean_$(1)
 clean_$(1):
 	$$(MAKE) -C $(1)-plugin clean
 
+.PHONY: test_$(1)
 test_$(1):
 	@$$(MAKE) --no-print-directory -C $(1)-plugin test
 endef
@@ -47,21 +52,28 @@
 pmgen.py:
 	wget -nc -O $@ https://raw.githubusercontent.com/YosysHQ/yosys/master/passes/pmgen/pmgen.py
 
+.PHONY: plugins
 plugins: $(PLUGINS)
 
+.PHONY: install
 install: $(PLUGINS_INSTALL)
 
+.PHONY: test
 test: $(PLUGINS_TEST)
 
+.PHONY: plugins_clean
 plugins_clean: $(PLUGINS_CLEAN)
 
+.PHONY: clean
 clean:: plugins_clean
 	rm -rf pmgen.py
 
 CLANG_FORMAT ?= clang-format-8
+.PHONY: format
 format:
-	find . \( -name "*.h" -o -name "*.cc" \) -and -not -path './third_party/*' -print0 | xargs -0 -P $$(nproc) ${CLANG_FORMAT} -style=file -i
+	find . \( -name "*.h" -o -name "*.cc" \) -and -not -path '*/third_party/*' -print0 | xargs -0 -P $$(nproc) ${CLANG_FORMAT} -style=file -i
 
 VERIBLE_FORMAT ?= verible-verilog-format
+.PHONY: format-verilog
 format-verilog:
-	find */tests \( -name "*.v" -o -name "*.sv" \) -and -not -path './third_party/*' -print0 | xargs -0 $(VERIBLE_FORMAT) --inplace
+	find */tests \( -name "*.v" -o -name "*.sv" \) -and -not -path '*/third_party/*' -print0 | xargs -0 $(VERIBLE_FORMAT) --inplace
diff --git a/Makefile_plugin.common b/Makefile_plugin.common
index b26a7e0..45c2640 100644
--- a/Makefile_plugin.common
+++ b/Makefile_plugin.common
@@ -5,6 +5,7 @@
 # This shared object can be imported to Yosys with `plugin -i` command.
 #
 # Below is an example of a plugin Makefile that uses this template:
+# PLUGIN_DIR := $(abspath $(dir $(lastword $(MAKEFILE_LIST))))
 # NAME = plugin_name
 # SOURCES = source1.cc source2.cc
 # include ../Makefile_plugin.common
@@ -38,8 +39,15 @@
 # |-- example2-plugin
 # |-- ...
 
+SHELL := /usr/bin/env bash
+
+# Directory containing this Makefile
+TOP_DIR := $(abspath $(dir $(lastword $(MAKEFILE_LIST))))
+
+_MAKEFILES := $(abspath $(filter-out %.d,$(MAKEFILE_LIST)))
+
 # Either find yosys in system and use its path or use the given path
-YOSYS_PATH ?= $(realpath $(dir $(shell which yosys))/..)
+YOSYS_PATH ?= $(realpath $(dir $(shell command -v yosys))/..)
 
 # Find yosys-config, throw an error if not found
 YOSYS_CONFIG = $(YOSYS_PATH)/bin/yosys-config
@@ -53,35 +61,94 @@
 LDLIBS := $(shell $(YOSYS_CONFIG) --ldlibs) $(LDLIBS)
 EXTRA_FLAGS ?=
 
-DATA_DIR = $(DESTDIR)$(shell $(YOSYS_CONFIG) --datdir)
-PLUGINS_DIR = $(DATA_DIR)/plugins
+YOSYS_DATA_DIR = $(DESTDIR)$(shell $(YOSYS_CONFIG) --datdir)
+YOSYS_PLUGINS_DIR = $(YOSYS_DATA_DIR)/plugins
 
-OBJS := $(patsubst %.cc,%.o,$(SOURCES))
-DEPS ?=
+BUILD_DIR := $(PLUGIN_DIR)/build
 
-$(PLUGINS_DIR):
-	@mkdir -p $@
+# Filled below with all object file paths
+_ALL_OBJECTS :=
+# Filled below with all build directory paths
+_ALL_BUILD_SUBDIRS :=
 
+# Default rule
+
+.PHONY: all
 all: $(NAME).so
 
-$(OBJS): %.o: %.cc $(DEPS)
-	$(CXX) $(CXXFLAGS) $(CPPFLAGS) $(EXTRA_FLAGS) -c -o $@ $(filter %.cc, $^)
+# Object files
 
-$(NAME).so: $(OBJS)
-	$(CXX) $(CXXFLAGS) $(LDFLAGS) -shared -o $@ $^ $(LDLIBS)
+define _process-single-source-file
+_source_abs := $(abspath $(addprefix $(PLUGIN_DIR)/,$(source)))
+_object_abs := $(abspath $(addprefix $(BUILD_DIR)/,$(source).o))
+_object_dir := $(abspath $(dir $(_object_abs)))
+_ALL_OBJECTS += $(_object_abs)
+_ALL_BUILD_SUBDIRS += $(_object_dir)
 
-../pmgen.py:
-	@$(MAKE) -C .. pmgen.py
+-include $(abspath $(addprefix $(BUILD_DIR)/,$(source).d))
 
-install_plugin: $(NAME).so | $(PLUGINS_DIR)
-	install -D $< $(PLUGINS_DIR)/$<
+$(_object_abs): TARGET_SOURCES := $(_source_abs)
+$(_object_abs): $(_source_abs) | $(_object_dir)
+endef
+$(foreach source,$(SOURCES),$(eval $(value _process-single-source-file)))
 
+$(_ALL_OBJECTS): $(_MAKEFILES)
+	$(CXX) $(CXXFLAGS) $(CPPFLAGS) $(EXTRA_FLAGS) -MMD -c -o $@ $(TARGET_SOURCES)
+
+# Objects list for the purpose of adding extra dependencies after inclusion.
+# Example use: `$(OBJECTS): $(BUILD_DIR)/some-file.h`
+OBJECTS := $(_ALL_OBJECTS)
+
+# Shared library
+
+_SO_LIB := $(BUILD_DIR)/$(NAME).so
+_ALL_BUILD_SUBDIRS += $(abspath $(dir $(_SO_LIB)))
+
+$(_SO_LIB): $(_ALL_OBJECTS) $(_MAKEFILES) | $(abspath $(dir $(_SO_LIB)))
+	$(CXX) $(CXXFLAGS) $(LDFLAGS) -shared -o $@ $(_ALL_OBJECTS) $(LDLIBS)
+
+.PHONY: $(NAME).so
+$(NAME).so: $(_SO_LIB)
+
+# Tests
+
+.PHONY: test test_clean
+ifneq ($(wildcard $(PLUGIN_DIR)/tests/Makefile),)
 test:
 	@$(MAKE) -C tests all
+test_clean:
+	$(MAKE) -C tests clean
+else
+test:
+test_clean:
+endif
+
+# Installation
+
+$(YOSYS_PLUGINS_DIR)/$(NAME).so: $(_SO_LIB) | $(YOSYS_PLUGINS_DIR)
+	install -D $(_SO_LIB) $@
+
+.PHONY: install_plugin
+install_plugin: $(YOSYS_PLUGINS_DIR)/$(NAME).so
 
 .PHONY: install
 install: install_plugin
 
-clean:
-	rm -f *.d *.o *.so
-	$(MAKE) -C tests clean
+# Cleanup
+
+clean: test_clean
+	rm -rf $(BUILD_DIR)
+
+# Other
+
+$(sort $(_ALL_BUILD_SUBDIRS)):
+	mkdir -p $@
+
+$(YOSYS_PLUGINS_DIR):
+	@mkdir -p $@
+
+PMGEN_PY := $(TOP_DIR)/pmgen.py
+
+$(PMGEN_PY):
+	@$(MAKE) -C $(TOP_DIR) pmgen.py
+
diff --git a/Makefile_test.common b/Makefile_test.common
index ca6ec18..5d72327 100644
--- a/Makefile_test.common
+++ b/Makefile_test.common
@@ -14,8 +14,10 @@
 # test2_verify = $(call diff_test,test2,ext)
 #
 
+SHELL := /usr/bin/env bash
+
 # Either find yosys in system and use its path or use the given path
-YOSYS_PATH ?= $(realpath $(dir $(shell which yosys))/..)
+YOSYS_PATH ?= $(realpath $(dir $(shell command -v yosys))/..)
 
 # Find yosys-config, throw an error if not found
 YOSYS_CONFIG = $(YOSYS_PATH)/bin/yosys-config
diff --git a/design_introspection-plugin/Makefile b/design_introspection-plugin/Makefile
index 604254e..178d5f3 100644
--- a/design_introspection-plugin/Makefile
+++ b/design_introspection-plugin/Makefile
@@ -14,6 +14,8 @@
 #
 # SPDX-License-Identifier: Apache-2.0
 
+PLUGIN_DIR := $(abspath $(dir $(lastword $(MAKEFILE_LIST))))
+
 NAME = design_introspection
 SOURCES = design_introspection.cc \
 	  get_cmd.cc \
diff --git a/dsp-ff-plugin/Makefile b/dsp-ff-plugin/Makefile
index 9cd9800..0466d85 100644
--- a/dsp-ff-plugin/Makefile
+++ b/dsp-ff-plugin/Makefile
@@ -14,11 +14,13 @@
 #
 # SPDX-License-Identifier: Apache-2.0
 
+PLUGIN_DIR := $(abspath $(dir $(lastword $(MAKEFILE_LIST))))
+
 NAME = dsp-ff
 SOURCES = dsp_ff.cc 
 
 include ../Makefile_plugin.common
 
 install:
-	install -D nexus-dsp_rules.txt $(DATA_DIR)/nexus/dsp_rules.txt
+	install -D nexus-dsp_rules.txt $(YOSYS_DATA_DIR)/nexus/dsp_rules.txt
 
diff --git a/environment.yml b/environment.yml
index a4cf46c..dc51454 100644
--- a/environment.yml
+++ b/environment.yml
@@ -20,5 +20,5 @@
   - litex-hub
 dependencies:
   - litex-hub::yosys=0.17_7_g990c9b8e1=20220512_085338_py37
-  - litex-hub::surelog
+  - litex-hub::surelog=0.0_5519_g900fb2499=20221223_060448_py37
   - litex-hub::iverilog
diff --git a/fasm-plugin/Makefile b/fasm-plugin/Makefile
index b149198..3ce41d5 100644
--- a/fasm-plugin/Makefile
+++ b/fasm-plugin/Makefile
@@ -14,6 +14,8 @@
 #
 # SPDX-License-Identifier: Apache-2.0
 
+PLUGIN_DIR := $(abspath $(dir $(lastword $(MAKEFILE_LIST))))
+
 NAME = fasm
 SOURCES = fasm.cc
 include ../Makefile_plugin.common
diff --git a/integrateinv-plugin/Makefile b/integrateinv-plugin/Makefile
index f93225a..21b75ca 100644
--- a/integrateinv-plugin/Makefile
+++ b/integrateinv-plugin/Makefile
@@ -14,6 +14,8 @@
 #
 # SPDX-License-Identifier: Apache-2.0
 
+PLUGIN_DIR := $(abspath $(dir $(lastword $(MAKEFILE_LIST))))
+
 NAME = integrateinv
 SOURCES = integrateinv.cc
 include ../Makefile_plugin.common
diff --git a/params-plugin/Makefile b/params-plugin/Makefile
index 9740c7b..b4e2d29 100644
--- a/params-plugin/Makefile
+++ b/params-plugin/Makefile
@@ -14,6 +14,8 @@
 #
 # SPDX-License-Identifier: Apache-2.0
 
+PLUGIN_DIR := $(abspath $(dir $(lastword $(MAKEFILE_LIST))))
+
 NAME = params
 SOURCES = params.cc
 include ../Makefile_plugin.common
diff --git a/ql-iob-plugin/Makefile b/ql-iob-plugin/Makefile
index dc89757..4091a6a 100644
--- a/ql-iob-plugin/Makefile
+++ b/ql-iob-plugin/Makefile
@@ -14,6 +14,8 @@
 #
 # SPDX-License-Identifier: Apache-2.0
 
+PLUGIN_DIR := $(abspath $(dir $(lastword $(MAKEFILE_LIST))))
+
 NAME = ql-iob
 SOURCES = ql-iob.cc pcf_parser.cc pinmap_parser.cc
 include ../Makefile_plugin.common
diff --git a/ql-qlf-plugin/Makefile b/ql-qlf-plugin/Makefile
index b0411b8..d546b16 100644
--- a/ql-qlf-plugin/Makefile
+++ b/ql-qlf-plugin/Makefile
@@ -14,6 +14,8 @@
 #
 # SPDX-License-Identifier: Apache-2.0
 
+PLUGIN_DIR := $(abspath $(dir $(lastword $(MAKEFILE_LIST))))
+
 NAME = ql-qlf
 SOURCES = synth_quicklogic.cc \
           ql-dsp.cc \
@@ -26,13 +28,11 @@
           ql-dsp-io-regs.cc \
           ql-bram-asymmetric.cc
 
-DEPS = pmgen/ql-dsp-pm.h \
-       pmgen/ql-dsp-macc.h \
-       pmgen/ql-bram-asymmetric-wider-write.h \
-       pmgen/ql-bram-asymmetric-wider-read.h
-
 include ../Makefile_plugin.common
 
+# For pmgen/*.h
+CXXFLAGS += -I$(BUILD_DIR)
+
 COMMON          = common
 QLF_K4N8_DIR    = qlf_k4n8
 QLF_K6N10_DIR   = qlf_k6n10
@@ -55,6 +55,8 @@
                   $(QLF_K6N10F_DIR)/brams.txt   \
                   $(QLF_K6N10F_DIR)/cells_sim.v \
                   $(QLF_K6N10F_DIR)/dsp_sim.v \
+                  $(QLF_K6N10F_DIR)/primitives_sim.v \
+                  $(QLF_K6N10F_DIR)/brams_sim.v \
                   $(QLF_K6N10F_DIR)/sram1024x18.v \
                   $(QLF_K6N10F_DIR)/TDP18K_FIFO.v \
                   $(QLF_K6N10F_DIR)/ufifo_ctl.v \
@@ -77,28 +79,35 @@
                   $(PP3_DIR)/bram_init_32.vh   \
                   $(PP3_DIR)/qlal4s3b_sim.v    \
                   $(PP3_DIR)/mult_sim.v        \
-                  $(PP3_DIR)/qlal3_sim.v       \
+                  $(PP3_DIR)/qlal3_sim.v
 
-pmgen:
-	mkdir -p pmgen
+PMGEN_OUT_DIR := $(BUILD_DIR)/pmgen
 
-pmgen/ql-dsp-pm.h: ../pmgen.py ql_dsp.pmg | pmgen
-	python3 ../pmgen.py -o $@ -p ql_dsp ql_dsp.pmg
+$(PMGEN_OUT_DIR):
+	mkdir -p $@
 
-pmgen/ql-dsp-macc.h: ../pmgen.py ql-dsp-macc.pmg | pmgen
-	python3 ../pmgen.py -o $@ -p ql_dsp_macc ql-dsp-macc.pmg
+DEPS := $(PMGEN_OUT_DIR)/ql-dsp-pm.h \
+        $(PMGEN_OUT_DIR)/ql-dsp-macc.h \
+        $(PMGEN_OUT_DIR)/ql-bram-asymmetric-wider-write.h \
+        $(PMGEN_OUT_DIR)/ql-bram-asymmetric-wider-read.h
 
-pmgen/ql-bram-asymmetric-wider-write.h: ../pmgen.py ql-bram-asymmetric-wider-write.pmg | pmgen
-	python3 ../pmgen.py -o $@ -p ql_bram_asymmetric_wider_write ql-bram-asymmetric-wider-write.pmg
+$(DEPS): $(PMGEN_PY) | $(PMGEN_OUT_DIR)
 
-pmgen/ql-bram-asymmetric-wider-read.h: ../pmgen.py ql-bram-asymmetric-wider-read.pmg | pmgen
-	python3 ../pmgen.py -o $@ -p ql_bram_asymmetric_wider_read ql-bram-asymmetric-wider-read.pmg
+$(OBJECTS): $(DEPS)
+
+$(PMGEN_OUT_DIR)/ql-dsp-pm.h: ql_dsp.pmg
+	python3 $(PMGEN_PY) -o $@ -p ql_dsp ql_dsp.pmg
+
+$(PMGEN_OUT_DIR)/ql-dsp-macc.h: ql-dsp-macc.pmg
+	python3 $(PMGEN_PY) -o $@ -p ql_dsp_macc ql-dsp-macc.pmg
+
+$(PMGEN_OUT_DIR)/ql-bram-asymmetric-wider-write.h: ql-bram-asymmetric-wider-write.pmg
+	python3 $(PMGEN_PY) -o $@ -p ql_bram_asymmetric_wider_write ql-bram-asymmetric-wider-write.pmg
+
+$(PMGEN_OUT_DIR)/ql-bram-asymmetric-wider-read.h: ql-bram-asymmetric-wider-read.pmg
+	python3 $(PMGEN_PY) -o $@ -p ql_bram_asymmetric_wider_read ql-bram-asymmetric-wider-read.pmg
 
 install_modules: $(VERILOG_MODULES)
-	$(foreach f,$^,install -D $(f) $(DATA_DIR)/quicklogic/$(f);)
+	$(foreach f,$^,install -D $(f) $(YOSYS_DATA_DIR)/quicklogic/$(f);)
 
 install: install_modules
-
-clean:
-	$(MAKE) -f ../Makefile_plugin.common $@
-	rm -rf pmgen
diff --git a/ql-qlf-plugin/ql-bram-split.cc b/ql-qlf-plugin/ql-bram-split.cc
index f699ee5..6a7d2f9 100644
--- a/ql-qlf-plugin/ql-bram-split.cc
+++ b/ql-qlf-plugin/ql-bram-split.cc
@@ -129,6 +129,97 @@
         }
     }
 
+    void map_pairs(std::vector<RTLIL::Cell *> group, BramConfig config, std::vector<const RTLIL::Cell *> *cellsToRemove, RTLIL::Module *module)
+    {
+        // Ensure an even number
+        size_t count = group.size();
+        if (count & 1)
+            count--;
+
+        // Map SIMD pairs
+        for (size_t i = 0; i < count; i += 2) {
+            const RTLIL::Cell *bram_0 = group[i];
+            const RTLIL::Cell *bram_1 = group[i + 1];
+
+            if (bram_0->type != bram_1->type)
+                log_error("Unsupported BRAM configuration: one half of TDP36K is TDP, second SDP");
+
+            std::vector<std::pair<std::string, std::string>> m_BramDataPorts_0;
+            std::vector<std::pair<std::string, std::string>> m_BramDataPorts_1;
+            std::string m_Bram1x18Type;
+            std::string m_Bram2x18Type;
+            // Distinguish between TDP and SDP
+            if (bram_0->type == RTLIL::escape_id(m_Bram1x18TDPType)) {
+                m_BramDataPorts_0 = m_BramTDPDataPorts_0;
+                m_BramDataPorts_1 = m_BramTDPDataPorts_1;
+                m_Bram1x18Type = m_Bram1x18TDPType;
+                m_Bram2x18Type = m_Bram2x18TDPType;
+            } else {
+                m_BramDataPorts_0 = m_BramSDPDataPorts_0;
+                m_BramDataPorts_1 = m_BramSDPDataPorts_1;
+                m_Bram1x18Type = m_Bram1x18SDPType;
+                m_Bram2x18Type = m_Bram2x18SDPType;
+            }
+
+            std::string name = stringf("bram_%s_%s", RTLIL::unescape_id(bram_0->name).c_str(), RTLIL::unescape_id(bram_1->name).c_str());
+
+            log(" BRAM: %s (%s) + %s (%s) => %s (%s)\n", RTLIL::unescape_id(bram_0->name).c_str(), RTLIL::unescape_id(bram_0->type).c_str(),
+                RTLIL::unescape_id(bram_1->name).c_str(), RTLIL::unescape_id(bram_1->type).c_str(), RTLIL::unescape_id(name).c_str(),
+                m_Bram2x18Type.c_str());
+
+            // Create the new cell
+            RTLIL::Cell *bram_2x18 = module->addCell(RTLIL::escape_id(name), RTLIL::escape_id(m_Bram2x18Type));
+
+            // Check if the target cell is known (important to know
+            // its port widths)
+            if (!bram_2x18->known()) {
+                log_error(" The target cell type '%s' is not known!", m_Bram2x18Type.c_str());
+            }
+
+            // Connect shared ports
+            for (const auto &it : m_BramSharedPorts) {
+                auto src = RTLIL::escape_id(it.first);
+                auto dst = RTLIL::escape_id(it.second);
+
+                bram_2x18->setPort(dst, config.connections.at(src));
+            }
+
+            // Connect data ports
+            // Connect first bram
+            map_ports(m_BramDataPorts_0, bram_0, bram_2x18);
+            // Connect second bram
+            map_ports(m_BramDataPorts_1, bram_1, bram_2x18);
+
+            // Set bram parameters
+            for (const auto &it : m_BramParams) {
+                auto val = bram_0->getParam(RTLIL::escape_id(it));
+                bram_2x18->setParam(RTLIL::escape_id(it), val);
+            }
+
+            // Setting manual parameters
+            if (bram_0->type == RTLIL::escape_id(m_Bram1x18TDPType)) {
+                bram_2x18->setParam(RTLIL::escape_id("CFG_ENABLE_B"), bram_0->getParam(RTLIL::escape_id("CFG_ENABLE_B")));
+                bram_2x18->setParam(RTLIL::escape_id("CFG_ENABLE_D"), bram_0->getParam(RTLIL::escape_id("CFG_ENABLE_D")));
+                bram_2x18->setParam(RTLIL::escape_id("CFG_ENABLE_F"), bram_1->getParam(RTLIL::escape_id("CFG_ENABLE_B")));
+                bram_2x18->setParam(RTLIL::escape_id("CFG_ENABLE_H"), bram_1->getParam(RTLIL::escape_id("CFG_ENABLE_D")));
+            } else {
+                bram_2x18->setParam(RTLIL::escape_id("CFG_ENABLE_B"), bram_0->getParam(RTLIL::escape_id("CFG_ENABLE_B")));
+                bram_2x18->setParam(RTLIL::escape_id("CFG_ENABLE_D"), bram_1->getParam(RTLIL::escape_id("CFG_ENABLE_B")));
+            }
+            if (bram_0->hasParam(RTLIL::escape_id("INIT")))
+                bram_2x18->setParam(RTLIL::escape_id("INIT0"), bram_0->getParam(RTLIL::escape_id("INIT")));
+            if (bram_1->hasParam(RTLIL::escape_id("INIT")))
+                bram_2x18->setParam(RTLIL::escape_id("INIT1"), bram_1->getParam(RTLIL::escape_id("INIT")));
+
+            // Since in this pass we are mapping the inferred cell directly then mark it as inferred
+            bram_2x18->set_bool_attribute(RTLIL::escape_id("is_inferred"), true);
+
+            // Mark BRAM parts for removal
+            cellsToRemove->push_back(bram_0);
+            cellsToRemove->push_back(bram_1);
+        }
+    }
+
     void execute(std::vector<std::string> a_Args, RTLIL::Design *a_Design) override
     {
         log_header(a_Design, "Executing QL_BRAM_Split pass.\n");
@@ -144,115 +235,37 @@
             m_SigMap.set(module);
 
             // Assemble BRAM cell groups
-            dict<BramConfig, std::vector<RTLIL::Cell *>> groups;
+            dict<BramConfig, std::vector<RTLIL::Cell *>> sdp_groups, tdp_groups;
             for (auto cell : module->selected_cells()) {
 
-                // Check if this is a BRAM cell
-                if (cell->type != RTLIL::escape_id(m_Bram1x18TDPType) && cell->type != RTLIL::escape_id(m_Bram1x18SDPType)) {
-                    continue;
-                }
-
                 // Skip if it has the (* keep *) attribute set
                 if (cell->has_keep_attr()) {
                     continue;
                 }
 
-                // Add to a group
+                // Check if this is a BRAM cell and add to a group
                 const auto key = getBramConfig(cell);
-                groups[key].push_back(cell);
+                if (cell->type == RTLIL::escape_id(m_Bram1x18TDPType)) {
+                    tdp_groups[key].push_back(cell);
+                } else if (cell->type == RTLIL::escape_id(m_Bram1x18SDPType)) {
+                    sdp_groups[key].push_back(cell);
+                } else {
+                    continue;
+                }
             }
 
             std::vector<const RTLIL::Cell *> cellsToRemove;
 
             // Map cell pairs to the target BRAM 2x18 cell
-            for (const auto &it : groups) {
+            for (const auto &it : sdp_groups) {
                 const auto &group = it.second;
                 const auto &config = it.first;
-
-                // Ensure an even number
-                size_t count = group.size();
-                if (count & 1)
-                    count--;
-
-                // Map SIMD pairs
-                for (size_t i = 0; i < count; i += 2) {
-                    const RTLIL::Cell *bram_0 = group[i];
-                    const RTLIL::Cell *bram_1 = group[i + 1];
-
-                    if (bram_0->type != bram_1->type)
-                        log_error("Unsupported BRAM configuration: one half of TDP36K is TDP, second SDP");
-
-                    std::vector<std::pair<std::string, std::string>> m_BramDataPorts_0;
-                    std::vector<std::pair<std::string, std::string>> m_BramDataPorts_1;
-                    std::string m_Bram1x18Type;
-                    std::string m_Bram2x18Type;
-                    // Distinguish between TDP and SDP
-                    if (bram_0->type == RTLIL::escape_id(m_Bram1x18TDPType)) {
-                        m_BramDataPorts_0 = m_BramTDPDataPorts_0;
-                        m_BramDataPorts_1 = m_BramTDPDataPorts_1;
-                        m_Bram1x18Type = m_Bram1x18TDPType;
-                        m_Bram2x18Type = m_Bram2x18TDPType;
-                    } else {
-                        m_BramDataPorts_0 = m_BramSDPDataPorts_0;
-                        m_BramDataPorts_1 = m_BramSDPDataPorts_1;
-                        m_Bram1x18Type = m_Bram1x18SDPType;
-                        m_Bram2x18Type = m_Bram2x18SDPType;
-                    }
-
-                    std::string name = stringf("bram_%s_%s", RTLIL::unescape_id(bram_0->name).c_str(), RTLIL::unescape_id(bram_1->name).c_str());
-
-                    log(" BRAM: %s (%s) + %s (%s) => %s (%s)\n", RTLIL::unescape_id(bram_0->name).c_str(), RTLIL::unescape_id(bram_0->type).c_str(),
-                        RTLIL::unescape_id(bram_1->name).c_str(), RTLIL::unescape_id(bram_1->type).c_str(), RTLIL::unescape_id(name).c_str(),
-                        m_Bram2x18Type.c_str());
-
-                    // Create the new cell
-                    RTLIL::Cell *bram_2x18 = module->addCell(RTLIL::escape_id(name), RTLIL::escape_id(m_Bram2x18Type));
-
-                    // Check if the target cell is known (important to know
-                    // its port widths)
-                    if (!bram_2x18->known()) {
-                        log_error(" The target cell type '%s' is not known!", m_Bram2x18Type.c_str());
-                    }
-
-                    // Connect shared ports
-                    for (const auto &it : m_BramSharedPorts) {
-                        auto src = RTLIL::escape_id(it.first);
-                        auto dst = RTLIL::escape_id(it.second);
-
-                        bram_2x18->setPort(dst, config.connections.at(src));
-                    }
-
-                    // Connect data ports
-                    // Connect first bram
-                    map_ports(m_BramDataPorts_0, bram_0, bram_2x18);
-                    // Connect second bram
-                    map_ports(m_BramDataPorts_1, bram_1, bram_2x18);
-
-                    // Set bram parameters
-                    for (const auto &it : m_BramParams) {
-                        auto val = bram_0->getParam(RTLIL::escape_id(it));
-                        bram_2x18->setParam(RTLIL::escape_id(it), val);
-                    }
-
-                    // Setting manual parameters
-                    if (bram_0->type == RTLIL::escape_id(m_Bram1x18TDPType)) {
-                        bram_2x18->setParam(RTLIL::escape_id("CFG_ENABLE_B"), bram_0->getParam(RTLIL::escape_id("CFG_ENABLE_B")));
-                        bram_2x18->setParam(RTLIL::escape_id("CFG_ENABLE_D"), bram_0->getParam(RTLIL::escape_id("CFG_ENABLE_D")));
-                        bram_2x18->setParam(RTLIL::escape_id("CFG_ENABLE_F"), bram_1->getParam(RTLIL::escape_id("CFG_ENABLE_B")));
-                        bram_2x18->setParam(RTLIL::escape_id("CFG_ENABLE_H"), bram_1->getParam(RTLIL::escape_id("CFG_ENABLE_D")));
-                    } else {
-                        bram_2x18->setParam(RTLIL::escape_id("CFG_ENABLE_B"), bram_0->getParam(RTLIL::escape_id("CFG_ENABLE_B")));
-                        bram_2x18->setParam(RTLIL::escape_id("CFG_ENABLE_D"), bram_1->getParam(RTLIL::escape_id("CFG_ENABLE_B")));
-                    }
-                    if (bram_0->hasParam(RTLIL::escape_id("INIT")))
-                        bram_2x18->setParam(RTLIL::escape_id("INIT0"), bram_0->getParam(RTLIL::escape_id("INIT")));
-                    if (bram_1->hasParam(RTLIL::escape_id("INIT")))
-                        bram_2x18->setParam(RTLIL::escape_id("INIT1"), bram_1->getParam(RTLIL::escape_id("INIT")));
-
-                    // Mark BRAM parts for removal
-                    cellsToRemove.push_back(bram_0);
-                    cellsToRemove.push_back(bram_1);
-                }
+                map_pairs(group, config, &cellsToRemove, module);
+            }
+            for (const auto &it : tdp_groups) {
+                const auto &group = it.second;
+                const auto &config = it.first;
+                map_pairs(group, config, &cellsToRemove, module);
             }
 
             // Remove old cells
diff --git a/ql-qlf-plugin/ql-dsp-simd.cc b/ql-qlf-plugin/ql-dsp-simd.cc
index 7893eb4..2528879 100644
--- a/ql-qlf-plugin/ql-dsp-simd.cc
+++ b/ql-qlf-plugin/ql-dsp-simd.cc
@@ -162,7 +162,7 @@
                     const RTLIL::Cell *dsp_a = group[i];
                     const RTLIL::Cell *dsp_b = group[i + 1];
 
-                    std::string name = stringf("simd_%s_%s", RTLIL::unescape_id(dsp_a->name).c_str(), RTLIL::unescape_id(dsp_b->name).c_str());
+                    std::string name = stringf("simd%ld", i / 2);
                     std::string SimdDspType;
 
                     if (use_cfg_params)
diff --git a/ql-qlf-plugin/qlf_k6n10f/brams_final_map.v b/ql-qlf-plugin/qlf_k6n10f/brams_final_map.v
index aa4bb5d..cc0e272 100644
--- a/ql-qlf-plugin/qlf_k6n10f/brams_final_map.v
+++ b/ql-qlf-plugin/qlf_k6n10f/brams_final_map.v
@@ -227,6 +227,9 @@
 	wire PORT_B2_WEN = H1EN[0];
 	wire [CFG_ENABLE_H-1:0] PORT_B2_BE = {H1EN[1],H1EN[0]};
 
+    (* is_split = 1 *)
+    (* rd_data_width = CFG_DBITS *)
+    (* wr_data_width = CFG_DBITS *)
 	TDP36K  _TECHMAP_REPLACE_ (
 		.WDATA_A1_i(PORT_A1_WDATA),
 		.RDATA_A1_o(PORT_A1_RDATA),
@@ -443,6 +446,1280 @@
 	wire PORT_B2_WEN = D1EN[0];
 	wire [CFG_ENABLE_D-1:0] PORT_B2_BE = {D1EN[1],D1EN[0]};
 
+    (* is_split = 1 *)
+    (* rd_data_width = CFG_DBITS *)
+    (* wr_data_width = CFG_DBITS *)
+	TDP36K  _TECHMAP_REPLACE_ (
+		.WDATA_A1_i(PORT_A1_WDATA),
+		.RDATA_A1_o(PORT_A1_RDATA),
+		.ADDR_A1_i(PORT_A1_ADDR),
+		.CLK_A1_i(PORT_A1_CLK),
+		.REN_A1_i(PORT_A1_REN),
+		.WEN_A1_i(PORT_A1_WEN),
+		.BE_A1_i(PORT_A1_BE),
+
+		.WDATA_A2_i(PORT_A2_WDATA),
+		.RDATA_A2_o(PORT_A2_RDATA),
+		.ADDR_A2_i(PORT_A2_ADDR),
+		.CLK_A2_i(PORT_A2_CLK),
+		.REN_A2_i(PORT_A2_REN),
+		.WEN_A2_i(PORT_A2_WEN),
+		.BE_A2_i(PORT_A2_BE),
+
+		.WDATA_B1_i(PORT_B1_WDATA),
+		.RDATA_B1_o(PORT_B1_RDATA),
+		.ADDR_B1_i(PORT_B1_ADDR),
+		.CLK_B1_i(PORT_B1_CLK),
+		.REN_B1_i(PORT_B1_REN),
+		.WEN_B1_i(PORT_B1_WEN),
+		.BE_B1_i(PORT_B1_BE),
+
+		.WDATA_B2_i(PORT_B2_WDATA),
+		.RDATA_B2_o(PORT_B2_RDATA),
+		.ADDR_B2_i(PORT_B2_ADDR),
+		.CLK_B2_i(PORT_B2_CLK),
+		.REN_B2_i(PORT_B2_REN),
+		.WEN_B2_i(PORT_B2_WEN),
+		.BE_B2_i(PORT_B2_BE),
+
+		.FLUSH1_i(FLUSH1),
+		.FLUSH2_i(FLUSH2)
+	);
+endmodule
+
+module BRAM2x18_SFIFO (
+    DIN1,
+    PUSH1,
+    POP1,
+    CLK1,
+    Async_Flush1,
+    Overrun_Error1,
+    Full_Watermark1,
+    Almost_Full1,
+    Full1,
+    Underrun_Error1,
+    Empty_Watermark1,
+    Almost_Empty1,
+    Empty1,
+    DOUT1,
+    
+    DIN2,
+    PUSH2,
+    POP2,
+    CLK2,
+    Async_Flush2,
+    Overrun_Error2,
+    Full_Watermark2,
+    Almost_Full2,
+    Full2,
+    Underrun_Error2,
+    Empty_Watermark2,
+    Almost_Empty2,
+    Empty2,
+    DOUT2
+);
+
+  parameter WR_DATA_WIDTH = 18;
+  parameter RD_DATA_WIDTH = 18;
+
+  
+  parameter UPAE_DBITS1 = 11'd10;
+  parameter UPAF_DBITS1 = 11'd10;
+  
+  parameter UPAE_DBITS2 = 11'd10;
+  parameter UPAF_DBITS2 = 11'd10;
+
+  input CLK1;
+  input PUSH1, POP1;
+  input [WR_DATA_WIDTH-1:0] DIN1;
+  input Async_Flush1;
+  output [RD_DATA_WIDTH-1:0] DOUT1;
+  output Almost_Full1, Almost_Empty1;
+  output Full1, Empty1;
+  output Full_Watermark1, Empty_Watermark1;
+  output Overrun_Error1, Underrun_Error1;
+  
+  input CLK2;
+  input PUSH2, POP2;
+  input [WR_DATA_WIDTH-1:0] DIN2;
+  input Async_Flush2;
+  output [RD_DATA_WIDTH-1:0] DOUT2;
+  output Almost_Full2, Almost_Empty2;
+  output Full2, Empty2;
+  output Full_Watermark2, Empty_Watermark2;
+  output Overrun_Error2, Underrun_Error2;
+  
+  wire [17:0] in_reg1;
+  wire [17:0] out_reg1;
+  wire [17:0] fifo1_flags;
+  
+  wire [17:0] in_reg2;
+  wire [17:0] out_reg2;
+  wire [17:0] fifo2_flags;
+  
+  wire Push_Clk1, Pop_Clk1;
+  wire Push_Clk2, Pop_Clk2;
+  assign Push_Clk1 = CLK1;
+  assign Pop_Clk1 = CLK1;
+  assign Push_Clk2 = CLK2;
+  assign Pop_Clk2 = CLK2;
+  
+  assign Overrun_Error1 = fifo1_flags[0];
+  assign Full_Watermark1 = fifo1_flags[1];
+  assign Almost_Full1 = fifo1_flags[2];
+  assign Full1 = fifo1_flags[3];
+  assign Underrun_Error1 = fifo1_flags[4];
+  assign Empty_Watermark1 = fifo1_flags[5];
+  assign Almost_Empty1 = fifo1_flags[6];
+  assign Empty1 = fifo1_flags[7];
+  
+  assign Overrun_Error2 = fifo2_flags[0];
+  assign Full_Watermark2 = fifo2_flags[1];
+  assign Almost_Full2 = fifo2_flags[2];
+  assign Full2 = fifo2_flags[3];
+  assign Underrun_Error2 = fifo2_flags[4];
+  assign Empty_Watermark2 = fifo2_flags[5];
+  assign Almost_Empty2 = fifo2_flags[6];
+  assign Empty2 = fifo2_flags[7];
+  
+  generate
+    if (WR_DATA_WIDTH == 18) begin
+      assign in_reg1[17:0] = DIN1[17:0];
+      assign in_reg2[17:0] = DIN2[17:0];
+    end else if (WR_DATA_WIDTH == 9) begin
+      assign in_reg1[17:0] = {1'b0, DIN1[8], 8'h0, DIN1[7:0]};
+      assign in_reg2[17:0] = {1'b0, DIN2[8], 8'h0, DIN2[7:0]};
+    end else begin
+      assign in_reg1[17:WR_DATA_WIDTH]  = 0;
+      assign in_reg1[WR_DATA_WIDTH-1:0] = DIN1[WR_DATA_WIDTH-1:0];
+      assign in_reg2[17:WR_DATA_WIDTH]  = 0;
+      assign in_reg2[WR_DATA_WIDTH-1:0] = DIN2[WR_DATA_WIDTH-1:0];
+    end
+  endgenerate     
+  
+ case (RD_DATA_WIDTH)
+	8, 9: begin
+		case (WR_DATA_WIDTH)
+			8, 9: begin
+				defparam U1.MODE_BITS = { 1'b1,
+					UPAF_DBITS2, UPAE_DBITS2, 4'h1, `MODE_9, `MODE_9, `MODE_9, `MODE_9, 1'b1,
+					1'b0, UPAF_DBITS1, 1'b0, UPAE_DBITS1, 4'h1, `MODE_9, `MODE_9, `MODE_9, `MODE_9, 1'b1
+				};
+			end
+			16, 18: begin
+				defparam U1.MODE_BITS = { 1'b1,
+					UPAF_DBITS2, UPAE_DBITS2, 4'h1, `MODE_9, `MODE_18, `MODE_9, `MODE_18, 1'b1,
+					1'b0, UPAF_DBITS1, 1'b0, UPAE_DBITS1, 4'h1, `MODE_9, `MODE_18, `MODE_9, `MODE_18, 1'b1
+				};
+			end
+			default: begin
+				defparam U1.MODE_BITS = { 1'b1,
+					UPAF_DBITS2, UPAE_DBITS2, 4'h1, `MODE_9, `MODE_9, `MODE_9, `MODE_9, 1'b1,
+					1'b0, UPAF_DBITS1, 1'b0, UPAE_DBITS1, 4'h1, `MODE_9, `MODE_9, `MODE_9, `MODE_9, 1'b1
+				};
+			end
+		endcase
+	end
+	16, 18: begin
+		case (WR_DATA_WIDTH)
+			8, 9: begin
+				defparam U1.MODE_BITS = { 1'b1,
+					UPAF_DBITS2, UPAE_DBITS2, 4'h1, `MODE_18, `MODE_9, `MODE_18, `MODE_9, 1'b1,
+					1'b0, UPAF_DBITS1, 1'b0, UPAE_DBITS1, 4'h1, `MODE_18, `MODE_9, `MODE_18, `MODE_9, 1'b1
+				};
+			end
+			16, 18: begin
+				defparam U1.MODE_BITS = { 1'b1,
+					UPAF_DBITS2, UPAE_DBITS2, 4'h1, `MODE_18, `MODE_18, `MODE_18, `MODE_18, 1'b1,
+					1'b0, UPAF_DBITS1, 1'b0, UPAE_DBITS1, 4'h1, `MODE_18, `MODE_18, `MODE_18, `MODE_18, 1'b1
+				};
+			end
+			default: begin
+				defparam U1.MODE_BITS = { 1'b1,
+					UPAF_DBITS2, UPAE_DBITS2, 4'h1, `MODE_18, `MODE_18, `MODE_18, `MODE_18, 1'b1,
+					1'b0, UPAF_DBITS1, 1'b0, UPAE_DBITS1, 4'h1, `MODE_18, `MODE_18, `MODE_18, `MODE_18, 1'b1
+				};
+			end
+		endcase
+	end
+	default: begin
+		case (WR_DATA_WIDTH)
+			8, 9: begin
+				defparam U1.MODE_BITS = { 1'b1,
+					UPAF_DBITS2, UPAE_DBITS2, 4'h1, `MODE_9, `MODE_9, `MODE_9, `MODE_9, 1'b1,
+					1'b0, UPAF_DBITS1, 1'b0, UPAE_DBITS1, 4'h1, `MODE_9, `MODE_9, `MODE_9, `MODE_9, 1'b1
+				};
+			end
+			16, 18: begin
+				defparam U1.MODE_BITS = { 1'b1,
+					UPAF_DBITS2, UPAE_DBITS2, 4'h1, `MODE_18, `MODE_18, `MODE_18, `MODE_18, 1'b1,
+					1'b0, UPAF_DBITS1, 1'b0, UPAE_DBITS1, 4'h1, `MODE_18, `MODE_18, `MODE_18, `MODE_18, 1'b1
+				};
+			end
+			default: begin
+				defparam U1.MODE_BITS = { 1'b1,
+					UPAF_DBITS2, UPAE_DBITS2, 4'h1, `MODE_18, `MODE_18, `MODE_18, `MODE_18, 1'b1,
+					1'b0, UPAF_DBITS1, 1'b0, UPAE_DBITS1, 4'h1, `MODE_18, `MODE_18, `MODE_18, `MODE_18, 1'b1
+				};
+			end
+		endcase
+	end
+  endcase
+
+  (* is_fifo = 1 *) 
+  (* sync_fifo = 1 *) 
+  (* is_split = 1 *)
+  (* rd_data_width = RD_DATA_WIDTH *)
+  (* wr_data_width = WR_DATA_WIDTH *) 
+ 	TDP36K U1 (
+		.RESET_ni(1'b1),
+		.WDATA_A1_i(in_reg1[17:0]),
+		.WDATA_A2_i(in_reg2[17:0]),
+		.RDATA_A1_o(fifo1_flags),
+		.RDATA_A2_o(fifo2_flags),
+		.ADDR_A1_i(14'h0),
+		.ADDR_A2_i(14'h0),
+		.CLK_A1_i(Push_Clk1),
+		.CLK_A2_i(Push_Clk2),
+		.REN_A1_i(1'b1),
+		.REN_A2_i(1'b1),
+		.WEN_A1_i(PUSH1),
+		.WEN_A2_i(PUSH2),
+		.BE_A1_i(2'b11),
+		.BE_A2_i(2'b11),
+
+		.WDATA_B1_i(18'h0),
+		.WDATA_B2_i(18'h0),
+		.RDATA_B1_o(out_reg1[17:0]),
+		.RDATA_B2_o(out_reg2[17:0]),
+		.ADDR_B1_i(14'h0),
+		.ADDR_B2_i(14'h0),
+		.CLK_B1_i(Pop_Clk1),
+		.CLK_B2_i(Pop_Clk2),
+		.REN_B1_i(POP1),
+		.REN_B2_i(POP2),
+		.WEN_B1_i(1'b0),
+		.WEN_B2_i(1'b0),
+		.BE_B1_i(2'b11),
+		.BE_B2_i(2'b11),
+
+		.FLUSH1_i(Async_Flush1),
+		.FLUSH2_i(Async_Flush2)
+	);
+
+  generate
+    if (RD_DATA_WIDTH == 9) begin
+      assign DOUT1[RD_DATA_WIDTH-1:0] = {out_reg1[16], out_reg1[7:0]};
+      assign DOUT2[RD_DATA_WIDTH-1:0] = {out_reg2[16], out_reg2[7:0]};
+    end else begin
+      assign DOUT1[RD_DATA_WIDTH-1:0] = out_reg1[RD_DATA_WIDTH-1:0];
+      assign DOUT2[RD_DATA_WIDTH-1:0] = out_reg2[RD_DATA_WIDTH-1:0];
+    end
+  endgenerate 
+
+endmodule
+
+module BRAM2x18_AFIFO (
+    DIN1,
+    PUSH1,
+    POP1,
+    Push_Clk1,
+    Pop_Clk1,
+    Async_Flush1,
+    Overrun_Error1,
+    Full_Watermark1,
+    Almost_Full1,
+    Full1,
+    Underrun_Error1,
+    Empty_Watermark1,
+    Almost_Empty1,
+    Empty1,
+    DOUT1,
+    
+    DIN2,
+    PUSH2,
+    POP2,
+    Push_Clk2,
+    Pop_Clk2,
+    Async_Flush2,
+    Overrun_Error2,
+    Full_Watermark2,
+    Almost_Full2,
+    Full2,
+    Underrun_Error2,
+    Empty_Watermark2,
+    Almost_Empty2,
+    Empty2,
+    DOUT2
+);
+
+  parameter WR_DATA_WIDTH = 18;
+  parameter RD_DATA_WIDTH = 18;
+
+  
+  parameter UPAE_DBITS1 = 11'd10;
+  parameter UPAF_DBITS1 = 11'd10;
+  
+  parameter UPAE_DBITS2 = 11'd10;
+  parameter UPAF_DBITS2 = 11'd10;
+
+  input Push_Clk1, Pop_Clk1;
+  input PUSH1, POP1;
+  input [WR_DATA_WIDTH-1:0] DIN1;
+  input Async_Flush1;
+  output [RD_DATA_WIDTH-1:0] DOUT1;
+  output Almost_Full1, Almost_Empty1;
+  output Full1, Empty1;
+  output Full_Watermark1, Empty_Watermark1;
+  output Overrun_Error1, Underrun_Error1;
+  
+  input Push_Clk2, Pop_Clk2;
+  input PUSH2, POP2;
+  input [WR_DATA_WIDTH-1:0] DIN2;
+  input Async_Flush2;
+  output [RD_DATA_WIDTH-1:0] DOUT2;
+  output Almost_Full2, Almost_Empty2;
+  output Full2, Empty2;
+  output Full_Watermark2, Empty_Watermark2;
+  output Overrun_Error2, Underrun_Error2;
+  
+  wire [17:0] in_reg1;
+  wire [17:0] out_reg1;
+  wire [17:0] fifo1_flags;
+  
+  wire [17:0] in_reg2;
+  wire [17:0] out_reg2;
+  wire [17:0] fifo2_flags;
+  
+  assign Overrun_Error1 = fifo1_flags[0];
+  assign Full_Watermark1 = fifo1_flags[1];
+  assign Almost_Full1 = fifo1_flags[2];
+  assign Full1 = fifo1_flags[3];
+  assign Underrun_Error1 = fifo1_flags[4];
+  assign Empty_Watermark1 = fifo1_flags[5];
+  assign Almost_Empty1 = fifo1_flags[6];
+  assign Empty1 = fifo1_flags[7];
+  
+  assign Overrun_Error2 = fifo2_flags[0];
+  assign Full_Watermark2 = fifo2_flags[1];
+  assign Almost_Full2 = fifo2_flags[2];
+  assign Full2 = fifo2_flags[3];
+  assign Underrun_Error2 = fifo2_flags[4];
+  assign Empty_Watermark2 = fifo2_flags[5];
+  assign Almost_Empty2 = fifo2_flags[6];
+  assign Empty2 = fifo2_flags[7];
+  
+  generate
+    if (WR_DATA_WIDTH == 18) begin
+      assign in_reg1[17:0] = DIN1[17:0];
+      assign in_reg2[17:0] = DIN2[17:0];
+    end else if (WR_DATA_WIDTH == 9) begin
+      assign in_reg1[17:0] = {1'b0, DIN1[8], 8'h0, DIN1[7:0]};
+      assign in_reg2[17:0] = {1'b0, DIN2[8], 8'h0, DIN2[7:0]};
+    end else begin
+      assign in_reg1[17:WR_DATA_WIDTH]  = 0;
+      assign in_reg1[WR_DATA_WIDTH-1:0] = DIN1[WR_DATA_WIDTH-1:0];
+      assign in_reg2[17:WR_DATA_WIDTH]  = 0;
+      assign in_reg2[WR_DATA_WIDTH-1:0] = DIN2[WR_DATA_WIDTH-1:0];
+    end
+  endgenerate     
+  
+ case (RD_DATA_WIDTH)
+	8, 9: begin
+		case (WR_DATA_WIDTH)
+			8, 9: begin
+				defparam U1.MODE_BITS = { 1'b1,
+					UPAF_DBITS2, UPAE_DBITS2, 4'h1, `MODE_9, `MODE_9, `MODE_9, `MODE_9, 1'b0,
+					1'b0, UPAF_DBITS1, 1'b0, UPAE_DBITS1, 4'h1, `MODE_9, `MODE_9, `MODE_9, `MODE_9, 1'b0
+				};
+			end
+			16, 18: begin
+				defparam U1.MODE_BITS = { 1'b1,
+					UPAF_DBITS2, UPAE_DBITS2, 4'h1, `MODE_9, `MODE_18, `MODE_9, `MODE_18, 1'b0,
+					1'b0, UPAF_DBITS1, 1'b0, UPAE_DBITS1, 4'h1, `MODE_9, `MODE_18, `MODE_9, `MODE_18, 1'b0
+				};
+			end
+			default: begin
+				defparam U1.MODE_BITS = { 1'b1,
+					UPAF_DBITS2, UPAE_DBITS2, 4'h1, `MODE_9, `MODE_9, `MODE_9, `MODE_9, 1'b0,
+					1'b0, UPAF_DBITS1, 1'b0, UPAE_DBITS1, 4'h1, `MODE_9, `MODE_9, `MODE_9, `MODE_9, 1'b0
+				};
+			end
+		endcase
+	end
+	16, 18: begin
+		case (WR_DATA_WIDTH)
+			8, 9: begin
+				defparam U1.MODE_BITS = { 1'b1,
+					UPAF_DBITS2, UPAE_DBITS2, 4'h1, `MODE_18, `MODE_9, `MODE_18, `MODE_9, 1'b0,
+					1'b0, UPAF_DBITS1, 1'b0, UPAE_DBITS1, 4'h1, `MODE_18, `MODE_9, `MODE_18, `MODE_9, 1'b0
+				};
+			end
+			16, 18: begin
+				defparam U1.MODE_BITS = { 1'b1,
+					UPAF_DBITS2, UPAE_DBITS2, 4'h1, `MODE_18, `MODE_18, `MODE_18, `MODE_18, 1'b0,
+					1'b0, UPAF_DBITS1, 1'b0, UPAE_DBITS1, 4'h1, `MODE_18, `MODE_18, `MODE_18, `MODE_18, 1'b0
+				};
+			end
+			default: begin
+				defparam U1.MODE_BITS = { 1'b1,
+					UPAF_DBITS2, UPAE_DBITS2, 4'h1, `MODE_18, `MODE_18, `MODE_18, `MODE_18, 1'b0,
+					1'b0, UPAF_DBITS1, 1'b0, UPAE_DBITS1, 4'h1, `MODE_18, `MODE_18, `MODE_18, `MODE_18, 1'b0
+				};
+			end
+		endcase
+	end
+	default: begin
+		case (WR_DATA_WIDTH)
+			8, 9: begin
+				defparam U1.MODE_BITS = { 1'b1,
+					UPAF_DBITS2, UPAE_DBITS2, 4'h1, `MODE_9, `MODE_9, `MODE_9, `MODE_9, 1'b0,
+					1'b0, UPAF_DBITS1, 1'b0, UPAE_DBITS1, 4'h1, `MODE_9, `MODE_9, `MODE_9, `MODE_9, 1'b0
+				};
+			end
+			16, 18: begin
+				defparam U1.MODE_BITS = { 1'b1,
+					UPAF_DBITS2, UPAE_DBITS2, 4'h1, `MODE_18, `MODE_18, `MODE_18, `MODE_18, 1'b0,
+					1'b0, UPAF_DBITS1, 1'b0, UPAE_DBITS1, 4'h1, `MODE_18, `MODE_18, `MODE_18, `MODE_18, 1'b0
+				};
+			end
+			default: begin
+				defparam U1.MODE_BITS = { 1'b1,
+					UPAF_DBITS2, UPAE_DBITS2, 4'h1, `MODE_18, `MODE_18, `MODE_18, `MODE_18, 1'b0,
+					1'b0, UPAF_DBITS1, 1'b0, UPAE_DBITS1, 4'h1, `MODE_18, `MODE_18, `MODE_18, `MODE_18, 1'b0
+				};
+			end
+		endcase
+	end
+  endcase
+
+  (* is_fifo = 1 *) 
+  (* sync_fifo = 0 *) 
+  (* is_split = 1 *)
+  (* rd_data_width = RD_DATA_WIDTH *)
+  (* wr_data_width = WR_DATA_WIDTH *) 
+ 	TDP36K U1 (
+		.RESET_ni(1'b1),
+		.WDATA_A1_i(in_reg1[17:0]),
+		.WDATA_A2_i(in_reg2[17:0]),
+		.RDATA_A1_o(fifo1_flags),
+		.RDATA_A2_o(fifo2_flags),
+		.ADDR_A1_i(14'h0),
+		.ADDR_A2_i(14'h0),
+		.CLK_A1_i(Push_Clk1),
+		.CLK_A2_i(Push_Clk2),
+		.REN_A1_i(1'b1),
+		.REN_A2_i(1'b1),
+		.WEN_A1_i(PUSH1),
+		.WEN_A2_i(PUSH2),
+		.BE_A1_i(2'b11),
+		.BE_A2_i(2'b11),
+
+		.WDATA_B1_i(18'h0),
+		.WDATA_B2_i(18'h0),
+		.RDATA_B1_o(out_reg1[17:0]),
+		.RDATA_B2_o(out_reg2[17:0]),
+		.ADDR_B1_i(14'h0),
+		.ADDR_B2_i(14'h0),
+		.CLK_B1_i(Pop_Clk1),
+		.CLK_B2_i(Pop_Clk2),
+		.REN_B1_i(POP1),
+		.REN_B2_i(POP2),
+		.WEN_B1_i(1'b0),
+		.WEN_B2_i(1'b0),
+		.BE_B1_i(2'b11),
+		.BE_B2_i(2'b11),
+
+		.FLUSH1_i(Async_Flush1),
+		.FLUSH2_i(Async_Flush2)
+	);
+
+  generate
+    if (RD_DATA_WIDTH == 9) begin
+      assign DOUT1[RD_DATA_WIDTH-1:0] = {out_reg1[16], out_reg1[7:0]};
+      assign DOUT2[RD_DATA_WIDTH-1:0] = {out_reg2[16], out_reg2[7:0]};
+    end else begin
+      assign DOUT1[RD_DATA_WIDTH-1:0] = out_reg1[RD_DATA_WIDTH-1:0];
+      assign DOUT2[RD_DATA_WIDTH-1:0] = out_reg2[RD_DATA_WIDTH-1:0];
+    end
+  endgenerate  
+
+endmodule
+
+module BRAM2x18_SP (
+    RESET_ni,
+    
+    WEN1_i,
+    REN1_i,
+    WR1_CLK_i,
+    RD1_CLK_i,
+    WR1_BE_i,
+    WR1_ADDR_i,
+    RD1_ADDR_i,
+    WDATA1_i,
+    RDATA1_o,
+    
+    WEN2_i,
+    REN2_i,
+    WR2_CLK_i,
+    RD2_CLK_i,
+    WR2_BE_i,
+    WR2_ADDR_i,
+    RD2_ADDR_i,
+    WDATA2_i,
+    RDATA2_o
+);
+
+parameter WR_ADDR_WIDTH = 10;
+parameter RD_ADDR_WIDTH = 10;
+parameter WR_DATA_WIDTH = 18;
+parameter RD_DATA_WIDTH = 18;
+parameter BE1_WIDTH = 2;
+parameter BE2_WIDTH = 2;
+
+input wire RESET_ni;
+
+input wire WEN1_i;
+input wire REN1_i;
+input wire WR1_CLK_i;
+input wire RD1_CLK_i;
+input wire [BE1_WIDTH-1:0] WR1_BE_i;
+input wire [WR_ADDR_WIDTH-1 :0] WR1_ADDR_i;
+input wire [RD_ADDR_WIDTH-1 :0] RD1_ADDR_i;
+input wire [WR_DATA_WIDTH-1 :0] WDATA1_i;
+output wire [RD_DATA_WIDTH-1 :0] RDATA1_o;
+
+input wire WEN2_i;
+input wire REN2_i;
+input wire WR2_CLK_i;
+input wire RD2_CLK_i;
+input wire [BE2_WIDTH-1:0] WR2_BE_i;
+input wire [WR_ADDR_WIDTH-1 :0] WR2_ADDR_i;
+input wire [RD_ADDR_WIDTH-1 :0] RD2_ADDR_i;
+input wire [WR_DATA_WIDTH-1 :0] WDATA2_i;
+output wire [RD_DATA_WIDTH-1 :0] RDATA2_o;
+
+//localparam READ_DATA_BITS_TO_SKIP = 18 - RD_DATA_WIDTH;
+
+wire [14:RD_ADDR_WIDTH] RD1_ADDR_CMPL;
+wire [14:WR_ADDR_WIDTH] WR1_ADDR_CMPL;
+wire [17:RD_DATA_WIDTH] RD1_DATA_CMPL;
+wire [17:WR_DATA_WIDTH] WR1_DATA_CMPL;
+           
+wire [14:RD_ADDR_WIDTH] RD2_ADDR_CMPL;
+wire [14:WR_ADDR_WIDTH] WR2_ADDR_CMPL;
+wire [17:RD_DATA_WIDTH] RD2_DATA_CMPL;
+wire [17:WR_DATA_WIDTH] WR2_DATA_CMPL;
+
+wire [14:0] RD1_ADDR_TOTAL;
+wire [14:0] WR1_ADDR_TOTAL;
+
+wire [14:0] RD2_ADDR_TOTAL;
+wire [14:0] WR2_ADDR_TOTAL;
+
+wire [14:0] RD1_ADDR_SHIFTED;
+wire [14:0] WR1_ADDR_SHIFTED;
+
+wire [14:0] RD2_ADDR_SHIFTED;
+wire [14:0] WR2_ADDR_SHIFTED;
+
+wire [1:0] WR1_BE;
+wire [1:0] WR2_BE;
+
+wire FLUSH1;
+wire FLUSH2;
+
+generate
+  if (WR_ADDR_WIDTH == 15) begin
+    assign WR1_ADDR_TOTAL = WR1_ADDR_i;
+    assign WR2_ADDR_TOTAL = WR2_ADDR_i;
+  end else begin
+    assign WR1_ADDR_TOTAL[14:WR_ADDR_WIDTH] = 0;
+    assign WR1_ADDR_TOTAL[WR_ADDR_WIDTH-1:0] = WR1_ADDR_i;
+    assign WR2_ADDR_TOTAL[14:WR_ADDR_WIDTH] = 0;
+    assign WR2_ADDR_TOTAL[WR_ADDR_WIDTH-1:0] = WR2_ADDR_i;
+  end
+endgenerate
+
+generate
+  if (RD_ADDR_WIDTH == 15) begin
+    assign RD1_ADDR_TOTAL = RD1_ADDR_i;
+    assign RD2_ADDR_TOTAL = RD2_ADDR_i;
+  end else begin
+    assign RD1_ADDR_TOTAL[14:RD_ADDR_WIDTH] = 0;
+    assign RD1_ADDR_TOTAL[RD_ADDR_WIDTH-1:0] = RD1_ADDR_i;
+    assign RD2_ADDR_TOTAL[14:RD_ADDR_WIDTH] = 0;
+    assign RD2_ADDR_TOTAL[RD_ADDR_WIDTH-1:0] = RD2_ADDR_i;
+  end
+endgenerate
+
+// Assign parameters
+case (RD_DATA_WIDTH)
+	1: begin
+		case (WR_DATA_WIDTH)
+			1: begin
+				defparam BRAM_BLK.MODE_BITS = { 1'b1,
+					11'd10, 11'd10, 4'd0, `MODE_1, `MODE_1, `MODE_1, `MODE_1, 1'd0,
+					12'd10, 12'd10, 4'd0, `MODE_1, `MODE_1, `MODE_1, `MODE_1, 1'd0
+				};
+			end
+			2: begin
+				defparam BRAM_BLK.MODE_BITS = { 1'b1,
+					11'd10, 11'd10, 4'd0, `MODE_1, `MODE_2, `MODE_1, `MODE_2, 1'd0,
+					12'd10, 12'd10, 4'd0, `MODE_1, `MODE_2, `MODE_1, `MODE_2, 1'd0
+				};
+			end
+			4: begin
+				defparam BRAM_BLK.MODE_BITS = { 1'b1,
+					11'd10, 11'd10, 4'd0, `MODE_1, `MODE_4, `MODE_1, `MODE_4, 1'd0,
+					12'd10, 12'd10, 4'd0, `MODE_1, `MODE_4, `MODE_1, `MODE_4, 1'd0
+				};
+			end
+			8, 9: begin
+				defparam BRAM_BLK.MODE_BITS = { 1'b1,
+					11'd10, 11'd10, 4'd0, `MODE_1, `MODE_9, `MODE_1, `MODE_9, 1'd0,
+					12'd10, 12'd10, 4'd0, `MODE_1, `MODE_9, `MODE_1, `MODE_9, 1'd0
+				};
+			end
+			16, 18: begin
+				defparam BRAM_BLK.MODE_BITS = { 1'b1,
+					11'd10, 11'd10, 4'd0, `MODE_1, `MODE_18, `MODE_1, `MODE_18, 1'd0,
+					12'd10, 12'd10, 4'd0, `MODE_1, `MODE_18, `MODE_1, `MODE_18, 1'd0
+				};
+			end
+			default: begin
+				defparam BRAM_BLK.MODE_BITS = { 1'b1,
+					11'd10, 11'd10, 4'd0, `MODE_1, `MODE_1, `MODE_1, `MODE_1, 1'd0,
+					12'd10, 12'd10, 4'd0, `MODE_1, `MODE_1, `MODE_1, `MODE_1, 1'd0
+				};
+			end
+		endcase
+	end
+	2: begin
+		case (WR_DATA_WIDTH)
+			1: begin
+				defparam BRAM_BLK.MODE_BITS = { 1'b1,
+					11'd10, 11'd10, 4'd0, `MODE_2, `MODE_1, `MODE_2, `MODE_1, 1'd0,
+					12'd10, 12'd10, 4'd0, `MODE_2, `MODE_1, `MODE_2, `MODE_1, 1'd0
+				};
+			end
+			2: begin
+				defparam BRAM_BLK.MODE_BITS = { 1'b1,
+					11'd10, 11'd10, 4'd0, `MODE_2, `MODE_2, `MODE_2, `MODE_2, 1'd0,
+					12'd10, 12'd10, 4'd0, `MODE_2, `MODE_2, `MODE_2, `MODE_2, 1'd0
+				};
+			end
+			4: begin
+				defparam BRAM_BLK.MODE_BITS = { 1'b1,
+					11'd10, 11'd10, 4'd0, `MODE_2, `MODE_4, `MODE_2, `MODE_4, 1'd0,
+					12'd10, 12'd10, 4'd0, `MODE_2, `MODE_4, `MODE_2, `MODE_4, 1'd0
+				};
+			end
+			8, 9: begin
+				defparam BRAM_BLK.MODE_BITS = { 1'b1,
+					11'd10, 11'd10, 4'd0, `MODE_2, `MODE_9, `MODE_2, `MODE_9, 1'd0,
+					12'd10, 12'd10, 4'd0, `MODE_2, `MODE_9, `MODE_2, `MODE_9, 1'd0
+				};
+			end
+			16, 18: begin
+				defparam BRAM_BLK.MODE_BITS = { 1'b1,
+					11'd10, 11'd10, 4'd0, `MODE_2, `MODE_18, `MODE_2, `MODE_18, 1'd0,
+					12'd10, 12'd10, 4'd0, `MODE_2, `MODE_18, `MODE_2, `MODE_18, 1'd0
+				};
+			end
+			default: begin
+				defparam BRAM_BLK.MODE_BITS = { 1'b1,
+					11'd10, 11'd10, 4'd0, `MODE_2, `MODE_1, `MODE_2, `MODE_1, 1'd0,
+					12'd10, 12'd10, 4'd0, `MODE_2, `MODE_1, `MODE_2, `MODE_1, 1'd0
+				};
+			end
+		endcase
+	end
+	4: begin
+		case (WR_DATA_WIDTH)
+			1: begin
+				defparam BRAM_BLK.MODE_BITS = { 1'b1,
+					11'd10, 11'd10, 4'd0, `MODE_4, `MODE_1, `MODE_4, `MODE_1, 1'd0,
+					12'd10, 12'd10, 4'd0, `MODE_4, `MODE_1, `MODE_4, `MODE_1, 1'd0
+				};
+			end
+			2: begin
+				defparam BRAM_BLK.MODE_BITS = { 1'b1,
+					11'd10, 11'd10, 4'd0, `MODE_4, `MODE_2, `MODE_4, `MODE_2, 1'd0,
+					12'd10, 12'd10, 4'd0, `MODE_4, `MODE_2, `MODE_4, `MODE_2, 1'd0
+				};
+			end
+			4: begin
+				defparam BRAM_BLK.MODE_BITS = { 1'b1,
+					11'd10, 11'd10, 4'd0, `MODE_4, `MODE_4, `MODE_4, `MODE_4, 1'd0,
+					12'd10, 12'd10, 4'd0, `MODE_4, `MODE_4, `MODE_4, `MODE_4, 1'd0
+				};
+			end
+			8, 9: begin
+				defparam BRAM_BLK.MODE_BITS = { 1'b1,
+					11'd10, 11'd10, 4'd0, `MODE_4, `MODE_9, `MODE_4, `MODE_9, 1'd0,
+					12'd10, 12'd10, 4'd0, `MODE_4, `MODE_9, `MODE_4, `MODE_9, 1'd0
+				};
+			end
+			16, 18: begin
+				defparam BRAM_BLK.MODE_BITS = { 1'b1,
+					11'd10, 11'd10, 4'd0, `MODE_4, `MODE_18, `MODE_4, `MODE_18, 1'd0,
+					12'd10, 12'd10, 4'd0, `MODE_4, `MODE_18, `MODE_4, `MODE_18, 1'd0
+				};
+			end
+			default: begin
+				defparam BRAM_BLK.MODE_BITS = { 1'b1,
+					11'd10, 11'd10, 4'd0, `MODE_4, `MODE_1, `MODE_4, `MODE_1, 1'd0,
+					12'd10, 12'd10, 4'd0, `MODE_4, `MODE_1, `MODE_4, `MODE_1, 1'd0
+				};
+			end
+		endcase
+	end
+	8, 9: begin
+		case (WR_DATA_WIDTH)
+			1: begin
+				defparam BRAM_BLK.MODE_BITS = { 1'b1,
+					11'd10, 11'd10, 4'd0, `MODE_9, `MODE_1, `MODE_9, `MODE_1, 1'd0,
+					12'd10, 12'd10, 4'd0, `MODE_9, `MODE_1, `MODE_9, `MODE_1, 1'd0
+				};
+			end
+			2: begin
+				defparam BRAM_BLK.MODE_BITS = { 1'b1,
+					11'd10, 11'd10, 4'd0, `MODE_9, `MODE_2, `MODE_9, `MODE_2, 1'd0,
+					12'd10, 12'd10, 4'd0, `MODE_9, `MODE_2, `MODE_9, `MODE_2, 1'd0
+				};
+			end
+			4: begin
+				defparam BRAM_BLK.MODE_BITS = { 1'b1,
+					11'd10, 11'd10, 4'd0, `MODE_9, `MODE_4, `MODE_9, `MODE_4, 1'd0,
+					12'd10, 12'd10, 4'd0, `MODE_9, `MODE_4, `MODE_9, `MODE_4, 1'd0
+				};
+			end
+			8, 9: begin
+				defparam BRAM_BLK.MODE_BITS = { 1'b1,
+					11'd10, 11'd10, 4'd0, `MODE_9, `MODE_9, `MODE_9, `MODE_9, 1'd0,
+					12'd10, 12'd10, 4'd0, `MODE_9, `MODE_9, `MODE_9, `MODE_9, 1'd0
+				};
+			end
+			16, 18: begin
+				defparam BRAM_BLK.MODE_BITS = { 1'b1,
+					11'd10, 11'd10, 4'd0, `MODE_9, `MODE_18, `MODE_9, `MODE_18, 1'd0,
+					12'd10, 12'd10, 4'd0, `MODE_9, `MODE_18, `MODE_9, `MODE_18, 1'd0
+				};
+			end
+			default: begin
+				defparam BRAM_BLK.MODE_BITS = { 1'b1,
+					11'd10, 11'd10, 4'd0, `MODE_9, `MODE_1, `MODE_9, `MODE_1, 1'd0,
+					12'd10, 12'd10, 4'd0, `MODE_9, `MODE_1, `MODE_9, `MODE_1, 1'd0
+				};
+			end
+		endcase
+	end
+	16, 18: begin
+		case (WR_DATA_WIDTH)
+			1: begin
+				defparam BRAM_BLK.MODE_BITS = { 1'b1,
+					11'd10, 11'd10, 4'd0, `MODE_18, `MODE_1, `MODE_18, `MODE_1, 1'd0,
+					12'd10, 12'd10, 4'd0, `MODE_18, `MODE_1, `MODE_18, `MODE_1, 1'd0
+				};
+			end
+			2: begin
+				defparam BRAM_BLK.MODE_BITS = { 1'b1,
+					11'd10, 11'd10, 4'd0, `MODE_18, `MODE_2, `MODE_18, `MODE_2, 1'd0,
+					12'd10, 12'd10, 4'd0, `MODE_18, `MODE_2, `MODE_18, `MODE_2, 1'd0
+				};
+			end
+			4: begin
+				defparam BRAM_BLK.MODE_BITS = { 1'b1,
+					11'd10, 11'd10, 4'd0, `MODE_18, `MODE_4, `MODE_18, `MODE_4, 1'd0,
+					12'd10, 12'd10, 4'd0, `MODE_18, `MODE_4, `MODE_18, `MODE_4, 1'd0
+				};
+			end
+			8, 9: begin
+				defparam BRAM_BLK.MODE_BITS = { 1'b1,
+					11'd10, 11'd10, 4'd0, `MODE_18, `MODE_9, `MODE_18, `MODE_9, 1'd0,
+					12'd10, 12'd10, 4'd0, `MODE_18, `MODE_9, `MODE_18, `MODE_9, 1'd0
+				};
+			end
+			16, 18: begin
+				defparam BRAM_BLK.MODE_BITS = { 1'b1,
+					11'd10, 11'd10, 4'd0, `MODE_18, `MODE_18, `MODE_18, `MODE_18, 1'd0,
+					12'd10, 12'd10, 4'd0, `MODE_18, `MODE_18, `MODE_18, `MODE_18, 1'd0
+				};
+			end
+			default: begin
+				defparam BRAM_BLK.MODE_BITS = { 1'b1,
+					11'd10, 11'd10, 4'd0, `MODE_18, `MODE_1, `MODE_18, `MODE_1, 1'd0,
+					12'd10, 12'd10, 4'd0, `MODE_18, `MODE_1, `MODE_18, `MODE_1, 1'd0
+				};
+			end
+		endcase
+	end
+	default: begin
+		case (WR_DATA_WIDTH)
+			1: begin
+				defparam BRAM_BLK.MODE_BITS = { 1'b1,
+					11'd10, 11'd10, 4'd0, `MODE_1, `MODE_1, `MODE_1, `MODE_1, 1'd0,
+					12'd10, 12'd10, 4'd0, `MODE_1, `MODE_1, `MODE_1, `MODE_1, 1'd0
+				};
+			end
+			2: begin
+				defparam BRAM_BLK.MODE_BITS = { 1'b1,
+					11'd10, 11'd10, 4'd0, `MODE_1, `MODE_2, `MODE_1, `MODE_2, 1'd0,
+					12'd10, 12'd10, 4'd0, `MODE_1, `MODE_2, `MODE_1, `MODE_2, 1'd0
+				};
+			end
+			4: begin
+				defparam BRAM_BLK.MODE_BITS = { 1'b1,
+					11'd10, 11'd10, 4'd0, `MODE_1, `MODE_4, `MODE_1, `MODE_4, 1'd0,
+					12'd10, 12'd10, 4'd0, `MODE_1, `MODE_4, `MODE_1, `MODE_4, 1'd0
+				};
+			end
+			8, 9: begin
+				defparam BRAM_BLK.MODE_BITS = { 1'b1,
+					11'd10, 11'd10, 4'd0, `MODE_1, `MODE_9, `MODE_1, `MODE_9, 1'd0,
+					12'd10, 12'd10, 4'd0, `MODE_1, `MODE_9, `MODE_1, `MODE_9, 1'd0
+				};
+			end
+			16, 18: begin
+				defparam BRAM_BLK.MODE_BITS = { 1'b1,
+					11'd10, 11'd10, 4'd0, `MODE_1, `MODE_18, `MODE_1, `MODE_18, 1'd0,
+					12'd10, 12'd10, 4'd0, `MODE_1, `MODE_18, `MODE_1, `MODE_18, 1'd0
+				};
+			end
+			default: begin
+				defparam BRAM_BLK.MODE_BITS = { 1'b1,
+					11'd10, 11'd10, 4'd0, `MODE_1, `MODE_1, `MODE_1, `MODE_1, 1'd0,
+					12'd10, 12'd10, 4'd0, `MODE_1, `MODE_1, `MODE_1, `MODE_1, 1'd0
+				};
+			end
+		endcase
+	end
+endcase
+
+// Apply shift
+case (RD_DATA_WIDTH)
+	1: begin
+		assign RD1_ADDR_SHIFTED = RD1_ADDR_TOTAL;
+	end
+	2: begin
+		assign RD1_ADDR_SHIFTED = RD1_ADDR_TOTAL << 1;
+	end
+	4: begin
+		assign RD1_ADDR_SHIFTED = RD1_ADDR_TOTAL << 2;
+	end
+	8, 9: begin
+		assign RD1_ADDR_SHIFTED = RD1_ADDR_TOTAL << 3;
+	end
+	16, 18: begin
+		assign RD1_ADDR_SHIFTED = RD1_ADDR_TOTAL << 4;
+	end
+	default: begin
+		assign RD1_ADDR_SHIFTED = RD1_ADDR_TOTAL;
+	end
+endcase
+
+case (WR_DATA_WIDTH)
+	1: begin
+		assign WR1_ADDR_SHIFTED = WR1_ADDR_TOTAL;
+	end
+	2: begin
+		assign WR1_ADDR_SHIFTED = WR1_ADDR_TOTAL << 1;
+	end
+	4: begin
+		assign WR1_ADDR_SHIFTED = WR1_ADDR_TOTAL << 2;
+	end
+	8, 9: begin
+		assign WR1_ADDR_SHIFTED = WR1_ADDR_TOTAL << 3;
+	end
+	16, 18: begin
+		assign WR1_ADDR_SHIFTED = WR1_ADDR_TOTAL << 4;
+	end
+	default: begin
+		assign WR1_ADDR_SHIFTED = WR1_ADDR_TOTAL;
+	end
+endcase
+
+case (RD_DATA_WIDTH)
+	1: begin
+		assign RD2_ADDR_SHIFTED = RD2_ADDR_TOTAL;
+	end
+	2: begin
+		assign RD2_ADDR_SHIFTED = RD2_ADDR_TOTAL << 1;
+	end
+	4: begin
+		assign RD2_ADDR_SHIFTED = RD2_ADDR_TOTAL << 2;
+	end
+	8, 9: begin
+		assign RD2_ADDR_SHIFTED = RD2_ADDR_TOTAL << 3;
+	end
+	16, 18: begin
+		assign RD2_ADDR_SHIFTED = RD2_ADDR_TOTAL << 4;
+	end
+	default: begin
+		assign RD2_ADDR_SHIFTED = RD2_ADDR_TOTAL;
+	end
+endcase
+
+case (WR_DATA_WIDTH)
+	1: begin
+		assign WR2_ADDR_SHIFTED = WR2_ADDR_TOTAL;
+	end
+	2: begin
+		assign WR2_ADDR_SHIFTED = WR2_ADDR_TOTAL << 1;
+	end
+	4: begin
+		assign WR2_ADDR_SHIFTED = WR2_ADDR_TOTAL << 2;
+	end
+	8, 9: begin
+		assign WR2_ADDR_SHIFTED = WR2_ADDR_TOTAL << 3;
+	end
+	16, 18: begin
+		assign WR2_ADDR_SHIFTED = WR2_ADDR_TOTAL << 4;
+	end
+	default: begin
+		assign WR2_ADDR_SHIFTED = WR2_ADDR_TOTAL;
+	end
+endcase
+
+case (BE1_WIDTH)
+	2: begin
+		assign WR1_BE = WR1_BE_i[BE1_WIDTH-1 :0];
+	end
+	default: begin
+		assign WR1_BE[1:BE1_WIDTH] = 0;
+    assign WR1_BE[BE1_WIDTH-1 :0] = WR1_BE_i[BE1_WIDTH-1 :0];
+	end
+endcase
+
+case (BE2_WIDTH)
+	2: begin
+		assign WR2_BE = WR2_BE_i[BE2_WIDTH-1 :0];
+	end
+	default: begin
+		assign WR2_BE[1:BE2_WIDTH] = 0;
+    assign WR2_BE[BE2_WIDTH-1 :0] = WR2_BE_i[BE2_WIDTH-1 :0];
+	end
+endcase
+
+assign FLUSH1 = 1'b0;
+assign FLUSH2 = 1'b0;
+
+// TODO configure per width
+wire [17:0] PORT_B1_RDATA;
+wire [17:0] PORT_B2_RDATA;
+wire [17:0] PORT_A1_WDATA;
+wire [17:0] PORT_A2_WDATA;
+
+generate
+  if (WR_DATA_WIDTH == 18) begin
+    assign PORT_A1_WDATA[WR_DATA_WIDTH-1:0] = WDATA1_i[WR_DATA_WIDTH-1:0];
+    assign PORT_A2_WDATA[WR_DATA_WIDTH-1:0] = WDATA2_i[WR_DATA_WIDTH-1:0];
+  end else if (WR_DATA_WIDTH == 9) begin
+    assign PORT_A1_WDATA = {19'h0, WDATA1_i[8], 8'h0, WDATA1_i[7:0]};
+    assign PORT_A2_WDATA = {19'h0, WDATA2_i[8], 8'h0, WDATA2_i[7:0]};
+  end else begin
+    assign PORT_A1_WDATA[17:WR_DATA_WIDTH] = 0;
+    assign PORT_A1_WDATA[WR_DATA_WIDTH-1:0] = WDATA1_i[WR_DATA_WIDTH-1:0];
+    assign PORT_A2_WDATA[17:WR_DATA_WIDTH] = 0;
+    assign PORT_A2_WDATA[WR_DATA_WIDTH-1:0] = WDATA2_i[WR_DATA_WIDTH-1:0];
+  end
+endgenerate
+
+case (RD_DATA_WIDTH)
+	9: begin
+		assign RDATA1_o = {PORT_B1_RDATA[16], PORT_B1_RDATA[7:0]};
+    assign RDATA2_o = {PORT_B2_RDATA[16], PORT_B2_RDATA[7:0]};
+	end
+	default: begin
+		assign RDATA1_o = PORT_B1_RDATA[RD_DATA_WIDTH-1:0];
+    assign RDATA2_o = PORT_B2_RDATA[RD_DATA_WIDTH-1:0];
+	end
+endcase
+
+(* is_inferred = 1 *)
+(* is_split = 1 *)
+(* rd_data_width = RD_DATA_WIDTH *)
+(* wr_data_width = WR_DATA_WIDTH *)
+TDP36K BRAM_BLK (
+	.RESET_ni(RESET_ni),
+
+  .WDATA_A1_i(PORT_A1_WDATA),
+  .RDATA_A1_o(),
+  .ADDR_A1_i(WR1_ADDR_SHIFTED),
+  .CLK_A1_i(WR1_CLK_i),
+  .REN_A1_i(),
+  .WEN_A1_i(WEN1_i),
+  .BE_A1_i(WR1_BE[1:0]),
+  
+  .WDATA_B1_i(18'h0),
+  .RDATA_B1_o(PORT_B1_RDATA),
+  .ADDR_B1_i(RD1_ADDR_SHIFTED),
+  .CLK_B1_i(RD1_CLK_i),
+  .REN_B1_i(REN1_i),
+  .WEN_B1_i(1'b0),
+  .BE_B1_i({REN1_i,REN1_i}),
+  
+  .WDATA_A2_i(PORT_A2_WDATA),
+  .RDATA_A2_o(),
+  .ADDR_A2_i(WR2_ADDR_SHIFTED),
+  .CLK_A2_i(WR2_CLK_i),
+  .REN_A2_i(1'b0),
+  .WEN_A2_i(WEN2_i),
+  .BE_A2_i(WR2_BE[1:0]),
+  
+  .WDATA_B2_i(18'h0),
+  .RDATA_B2_o(PORT_B2_RDATA),
+  .ADDR_B2_i(RD2_ADDR_SHIFTED),
+  .CLK_B2_i(RD2_CLK_i),
+  .REN_B2_i(REN2_i),
+  .WEN_B2_i(1'b0),
+  .BE_B2_i({REN2_i,REN2_i}),
+
+	.FLUSH1_i(FLUSH1),
+	.FLUSH2_i(FLUSH2)
+);
+
+endmodule
+
+module BRAM2x18_DP (A1ADDR, A1DATA, A1EN, B1ADDR, B1DATA, B1EN, C1ADDR, C1DATA, C1EN, CLK1, CLK2, CLK3, CLK4, D1ADDR, D1DATA, D1EN, E1ADDR, E1DATA, E1EN, F1ADDR, F1DATA, F1EN, G1ADDR, G1DATA, G1EN, H1ADDR, H1DATA, H1EN);
+	parameter CFG_ABITS = 11;
+	parameter CFG_DBITS = 18;
+	parameter CFG_ENABLE_B = 4;
+	parameter CFG_ENABLE_D = 4;
+	parameter CFG_ENABLE_F = 4;
+	parameter CFG_ENABLE_H = 4;
+
+	parameter CLKPOL2 = 1;
+	parameter CLKPOL3 = 1;
+	parameter [18431:0] INIT0 = 18432'bx;
+	parameter [18431:0] INIT1 = 18432'bx;
+
+	input CLK1;
+	input CLK2;
+	input CLK3;
+	input CLK4;
+
+	input [CFG_ABITS-1:0] A1ADDR;
+	output [CFG_DBITS-1:0] A1DATA;
+	input A1EN;
+
+	input [CFG_ABITS-1:0] B1ADDR;
+	input [CFG_DBITS-1:0] B1DATA;
+	input [CFG_ENABLE_B-1:0] B1EN;
+
+	input [CFG_ABITS-1:0] C1ADDR;
+	output [CFG_DBITS-1:0] C1DATA;
+	input C1EN;
+
+	input [CFG_ABITS-1:0] D1ADDR;
+	input [CFG_DBITS-1:0] D1DATA;
+	input [CFG_ENABLE_D-1:0] D1EN;
+
+	input [CFG_ABITS-1:0] E1ADDR;
+	output [CFG_DBITS-1:0] E1DATA;
+	input E1EN;
+
+	input [CFG_ABITS-1:0] F1ADDR;
+	input [CFG_DBITS-1:0] F1DATA;
+	input [CFG_ENABLE_F-1:0] F1EN;
+
+	input [CFG_ABITS-1:0] G1ADDR;
+	output [CFG_DBITS-1:0] G1DATA;
+	input G1EN;
+
+	input [CFG_ABITS-1:0] H1ADDR;
+	input [CFG_DBITS-1:0] H1DATA;
+	input [CFG_ENABLE_H-1:0] H1EN;
+
+	wire FLUSH1;
+	wire FLUSH2;
+
+	wire [14:0] A1ADDR_TOTAL;
+	wire [14:0] B1ADDR_TOTAL;
+	wire [14:0] C1ADDR_TOTAL;
+	wire [14:0] D1ADDR_TOTAL;
+	wire [14:0] E1ADDR_TOTAL;
+	wire [14:0] F1ADDR_TOTAL;
+	wire [14:0] G1ADDR_TOTAL;
+	wire [14:0] H1ADDR_TOTAL;
+  
+  generate
+    if (CFG_ABITS == 15) begin
+      assign A1ADDR_TOTAL = A1ADDR;
+      assign B1ADDR_TOTAL = B1ADDR;
+      assign C1ADDR_TOTAL = C1ADDR;
+      assign D1ADDR_TOTAL = D1ADDR;
+      assign E1ADDR_TOTAL = E1ADDR;
+      assign F1ADDR_TOTAL = F1ADDR;
+      assign G1ADDR_TOTAL = G1ADDR;
+      assign H1ADDR_TOTAL = H1ADDR;
+    end else begin
+      assign A1ADDR_TOTAL[14:CFG_ABITS] = 0;
+      assign A1ADDR_TOTAL[CFG_ABITS-1:0] = A1ADDR;
+      assign B1ADDR_TOTAL[14:CFG_ABITS] = 0;
+      assign B1ADDR_TOTAL[CFG_ABITS-1:0] = B1ADDR;
+      assign C1ADDR_TOTAL[14:CFG_ABITS] = 0;
+      assign C1ADDR_TOTAL[CFG_ABITS-1:0] = C1ADDR;
+      assign D1ADDR_TOTAL[14:CFG_ABITS] = 0;
+      assign D1ADDR_TOTAL[CFG_ABITS-1:0] = D1ADDR;
+      assign E1ADDR_TOTAL[14:CFG_ABITS] = 0;
+      assign E1ADDR_TOTAL[CFG_ABITS-1:0] = E1ADDR;
+      assign F1ADDR_TOTAL[14:CFG_ABITS] = 0;
+      assign F1ADDR_TOTAL[CFG_ABITS-1:0] = F1ADDR;
+      assign G1ADDR_TOTAL[14:CFG_ABITS] = 0;
+      assign G1ADDR_TOTAL[CFG_ABITS-1:0] = G1ADDR;
+      assign H1ADDR_TOTAL[14:CFG_ABITS] = 0;
+      assign H1ADDR_TOTAL[CFG_ABITS-1:0] = H1ADDR;
+    end
+  endgenerate
+
+	wire [17:CFG_DBITS] A1_RDATA_CMPL;
+	wire [17:CFG_DBITS] C1_RDATA_CMPL;
+	wire [17:CFG_DBITS] E1_RDATA_CMPL;
+	wire [17:CFG_DBITS] G1_RDATA_CMPL;
+
+	wire [17:CFG_DBITS] B1_WDATA_CMPL = {17-CFG_DBITS{1'b0}};
+	wire [17:CFG_DBITS] D1_WDATA_CMPL = {17-CFG_DBITS{1'b0}};
+	wire [17:CFG_DBITS] F1_WDATA_CMPL = {17-CFG_DBITS{1'b0}};
+	wire [17:CFG_DBITS] H1_WDATA_CMPL = {17-CFG_DBITS{1'b0}};
+
+	wire [14:0] PORT_A1_ADDR;
+	wire [14:0] PORT_A2_ADDR;
+	wire [14:0] PORT_B1_ADDR;
+	wire [14:0] PORT_B2_ADDR;
+
+	case (CFG_DBITS)
+		1: begin
+			assign PORT_A1_ADDR = A1EN ? A1ADDR_TOTAL : (B1EN ? B1ADDR_TOTAL : 14'd0);
+			assign PORT_B1_ADDR = C1EN ? C1ADDR_TOTAL : (D1EN ? D1ADDR_TOTAL : 14'd0);
+			assign PORT_A2_ADDR = E1EN ? E1ADDR_TOTAL : (F1EN ? F1ADDR_TOTAL : 14'd0);
+			assign PORT_B2_ADDR = G1EN ? G1ADDR_TOTAL : (H1EN ? H1ADDR_TOTAL : 14'd0);
+			defparam _TECHMAP_REPLACE_.MODE_BITS = { 1'b1,
+				11'd10, 11'd10, 4'd0, `MODE_1, `MODE_1, `MODE_1, `MODE_1, 1'd0,
+				12'd10, 12'd10, 4'd0, `MODE_1, `MODE_1, `MODE_1, `MODE_1, 1'd0
+			};
+		end
+
+		2: begin
+			assign PORT_A1_ADDR = A1EN ? (A1ADDR_TOTAL << 1) : (B1EN ? (B1ADDR_TOTAL << 1) : 14'd0);
+			assign PORT_B1_ADDR = C1EN ? (C1ADDR_TOTAL << 1) : (D1EN ? (D1ADDR_TOTAL << 1) : 14'd0);
+			assign PORT_A2_ADDR = E1EN ? (E1ADDR_TOTAL << 1) : (F1EN ? (F1ADDR_TOTAL << 1) : 14'd0);
+			assign PORT_B2_ADDR = G1EN ? (G1ADDR_TOTAL << 1) : (H1EN ? (H1ADDR_TOTAL << 1) : 14'd0);
+			defparam _TECHMAP_REPLACE_.MODE_BITS = { 1'b1,
+				11'd10, 11'd10, 4'd0, `MODE_2, `MODE_2, `MODE_2, `MODE_2, 1'd0,
+				12'd10, 12'd10, 4'd0, `MODE_2, `MODE_2, `MODE_2, `MODE_2, 1'd0
+			};
+		end
+
+		4: begin
+			assign PORT_A1_ADDR = A1EN ? (A1ADDR_TOTAL << 2) : (B1EN ? (B1ADDR_TOTAL << 2) : 14'd0);
+			assign PORT_B1_ADDR = C1EN ? (C1ADDR_TOTAL << 2) : (D1EN ? (D1ADDR_TOTAL << 2) : 14'd0);
+			assign PORT_A2_ADDR = E1EN ? (E1ADDR_TOTAL << 2) : (F1EN ? (F1ADDR_TOTAL << 2) : 14'd0);
+			assign PORT_B2_ADDR = G1EN ? (G1ADDR_TOTAL << 2) : (H1EN ? (H1ADDR_TOTAL << 2) : 14'd0);
+			defparam _TECHMAP_REPLACE_.MODE_BITS = { 1'b1,
+				11'd10, 11'd10, 4'd0, `MODE_4, `MODE_4, `MODE_4, `MODE_4, 1'd0,
+				12'd10, 12'd10, 4'd0, `MODE_4, `MODE_4, `MODE_4, `MODE_4, 1'd0
+			};
+		end
+
+		8, 9: begin
+			assign PORT_A1_ADDR = A1EN ? (A1ADDR_TOTAL << 3) : (B1EN ? (B1ADDR_TOTAL << 3) : 14'd0);
+			assign PORT_B1_ADDR = C1EN ? (C1ADDR_TOTAL << 3) : (D1EN ? (D1ADDR_TOTAL << 3) : 14'd0);
+			assign PORT_A2_ADDR = E1EN ? (E1ADDR_TOTAL << 3) : (F1EN ? (F1ADDR_TOTAL << 3) : 14'd0);
+			assign PORT_B2_ADDR = G1EN ? (G1ADDR_TOTAL << 3) : (H1EN ? (H1ADDR_TOTAL << 3) : 14'd0);
+			defparam _TECHMAP_REPLACE_.MODE_BITS = { 1'b1,
+				11'd10, 11'd10, 4'd0, `MODE_9, `MODE_9, `MODE_9, `MODE_9, 1'd0,
+				12'd10, 12'd10, 4'd0, `MODE_9, `MODE_9, `MODE_9, `MODE_9, 1'd0
+			};
+		end
+
+		16, 18: begin
+			assign PORT_A1_ADDR = A1EN ? (A1ADDR_TOTAL << 4) : (B1EN ? (B1ADDR_TOTAL << 4) : 14'd0);
+			assign PORT_B1_ADDR = C1EN ? (C1ADDR_TOTAL << 4) : (D1EN ? (D1ADDR_TOTAL << 4) : 14'd0);
+			assign PORT_A2_ADDR = E1EN ? (E1ADDR_TOTAL << 4) : (F1EN ? (F1ADDR_TOTAL << 4) : 14'd0);
+			assign PORT_B2_ADDR = G1EN ? (G1ADDR_TOTAL << 4) : (H1EN ? (H1ADDR_TOTAL << 4) : 14'd0);
+			defparam _TECHMAP_REPLACE_.MODE_BITS = { 1'b1,
+				11'd10, 11'd10, 4'd0, `MODE_18, `MODE_18, `MODE_18, `MODE_18, 1'd0,
+				12'd10, 12'd10, 4'd0, `MODE_18, `MODE_18, `MODE_18, `MODE_18, 1'd0
+			};
+		end
+
+		default: begin
+			assign PORT_A1_ADDR = A1EN ? A1ADDR_TOTAL : (B1EN ? B1ADDR_TOTAL : 14'd0);
+			assign PORT_B1_ADDR = C1EN ? C1ADDR_TOTAL : (D1EN ? D1ADDR_TOTAL : 14'd0);
+			assign PORT_A2_ADDR = E1EN ? E1ADDR_TOTAL : (F1EN ? F1ADDR_TOTAL : 14'd0);
+			assign PORT_B2_ADDR = G1EN ? G1ADDR_TOTAL : (H1EN ? H1ADDR_TOTAL : 14'd0);
+			defparam _TECHMAP_REPLACE_.MODE_BITS = { 1'b1,
+				11'd10, 11'd10, 4'd0, `MODE_36, `MODE_36, `MODE_36, `MODE_36, 1'd0,
+				12'd10, 12'd10, 4'd0, `MODE_36, `MODE_36, `MODE_36, `MODE_36, 1'd0
+			};
+		end
+	endcase
+
+	assign FLUSH1 = 1'b0;
+	assign FLUSH2 = 1'b0;
+
+	wire [17:0] PORT_A1_RDATA;
+	wire [17:0] PORT_B1_RDATA;
+	wire [17:0] PORT_A2_RDATA;
+	wire [17:0] PORT_B2_RDATA;
+
+	wire [17:0] PORT_A1_WDATA;
+	wire [17:0] PORT_B1_WDATA;
+	wire [17:0] PORT_A2_WDATA;
+	wire [17:0] PORT_B2_WDATA;
+
+	// Assign read/write data - handle special case for 9bit mode
+	// parity bit for 9bit mode is placed in R/W port on bit #16
+	case (CFG_DBITS)
+		9: begin
+			assign A1DATA = {PORT_A1_RDATA[16], PORT_A1_RDATA[7:0]};
+			assign C1DATA = {PORT_B1_RDATA[16], PORT_B1_RDATA[7:0]};
+			assign E1DATA = {PORT_A2_RDATA[16], PORT_A2_RDATA[7:0]};
+			assign G1DATA = {PORT_B2_RDATA[16], PORT_B2_RDATA[7:0]};
+			assign PORT_A1_WDATA = {B1_WDATA_CMPL[17], B1DATA[8], B1_WDATA_CMPL[16:9], B1DATA[7:0]};
+			assign PORT_B1_WDATA = {D1_WDATA_CMPL[17], D1DATA[8], D1_WDATA_CMPL[16:9], D1DATA[7:0]};
+			assign PORT_A2_WDATA = {F1_WDATA_CMPL[17], F1DATA[8], F1_WDATA_CMPL[16:9], F1DATA[7:0]};
+			assign PORT_B2_WDATA = {H1_WDATA_CMPL[17], H1DATA[8], H1_WDATA_CMPL[16:9], H1DATA[7:0]};
+		end
+		default: begin
+			assign A1DATA = PORT_A1_RDATA[CFG_DBITS-1:0];
+			assign C1DATA = PORT_B1_RDATA[CFG_DBITS-1:0];
+			assign E1DATA = PORT_A2_RDATA[CFG_DBITS-1:0];
+			assign G1DATA = PORT_B2_RDATA[CFG_DBITS-1:0];
+			assign PORT_A1_WDATA = {B1_WDATA_CMPL, B1DATA};
+			assign PORT_B1_WDATA = {D1_WDATA_CMPL, D1DATA};
+			assign PORT_A2_WDATA = {F1_WDATA_CMPL, F1DATA};
+			assign PORT_B2_WDATA = {H1_WDATA_CMPL, H1DATA};
+
+		end
+	endcase
+
+	wire PORT_A1_CLK = CLK1;
+	wire PORT_A2_CLK = CLK3;
+	wire PORT_B1_CLK = CLK2;
+	wire PORT_B2_CLK = CLK4;
+
+	wire PORT_A1_REN = A1EN;
+	wire PORT_A1_WEN = B1EN[0];
+	wire [CFG_ENABLE_B-1:0] PORT_A1_BE = {B1EN[1],B1EN[0]};
+
+	wire PORT_A2_REN = E1EN;
+	wire PORT_A2_WEN = F1EN[0];
+	wire [CFG_ENABLE_F-1:0] PORT_A2_BE = {F1EN[1],F1EN[0]};
+
+	wire PORT_B1_REN = C1EN;
+	wire PORT_B1_WEN = D1EN[0];
+	wire [CFG_ENABLE_D-1:0] PORT_B1_BE = {D1EN[1],D1EN[0]};
+
+	wire PORT_B2_REN = G1EN;
+	wire PORT_B2_WEN = H1EN[0];
+	wire [CFG_ENABLE_H-1:0] PORT_B2_BE = {H1EN[1],H1EN[0]};
+
+    (* is_split = 1 *)
+    (* rd_data_width = CFG_DBITS *)
+    (* wr_data_width = CFG_DBITS *)
 	TDP36K  _TECHMAP_REPLACE_ (
 		.WDATA_A1_i(PORT_A1_WDATA),
 		.RDATA_A1_o(PORT_A1_RDATA),
diff --git a/ql-qlf-plugin/qlf_k6n10f/brams_map.v b/ql-qlf-plugin/qlf_k6n10f/brams_map.v
index 873a5d7..1c97e8f 100644
--- a/ql-qlf-plugin/qlf_k6n10f/brams_map.v
+++ b/ql-qlf-plugin/qlf_k6n10f/brams_map.v
@@ -163,6 +163,9 @@
 	assign FLUSH1 = 1'b0;
 	assign FLUSH2 = 1'b0;
 
+    (* is_inferred = 1 *)
+    (* rd_data_width = CFG_DBITS *)
+    (* wr_data_width = CFG_DBITS *)
 	TDP36K _TECHMAP_REPLACE_ (
 		.RESET_ni(1'b1),
 		.WDATA_A1_i(B1DATA_TOTAL[17:0]),
@@ -233,6 +236,7 @@
 	input [CFG_DBITS-1:0] D1DATA;
 	input [CFG_ENABLE_D-1:0] D1EN;
 
+    (* is_inferred = 1 *)
 	BRAM2x18_TDP #(
 		.CFG_ABITS(CFG_ABITS),
 		.CFG_DBITS(CFG_DBITS),
@@ -240,7 +244,7 @@
 		.CFG_ENABLE_D(CFG_ENABLE_D),
 		.CLKPOL2(CLKPOL2),
 		.CLKPOL3(CLKPOL3),
-		.INIT0(INIT),
+		.INIT0(INIT)
 	) _TECHMAP_REPLACE_ (
 		.A1ADDR(A1ADDR),
 		.A1DATA(A1DATA),
@@ -296,13 +300,14 @@
 	input [CFG_DBITS-1:0] B1DATA;
 	input [CFG_ENABLE_B-1:0] B1EN;
 
+    (* is_inferred = 1 *)
 	BRAM2x18_SDP #(
 		.CFG_ABITS(CFG_ABITS),
 		.CFG_DBITS(CFG_DBITS),
 		.CFG_ENABLE_B(CFG_ENABLE_B),
 		.CLKPOL2(CLKPOL2),
 		.CLKPOL3(CLKPOL3),
-		.INIT0(INIT),
+		.INIT0(INIT)
 	) _TECHMAP_REPLACE_ (
 		.A1ADDR(A1ADDR),
 		.A1DATA(A1DATA),
@@ -446,6 +451,9 @@
 	assign FLUSH1 = 1'b0;
 	assign FLUSH2 = 1'b0;
 
+    (* is_inferred = 1 *)
+    (* rd_data_width = CFG_DBITS *)
+    (* wr_data_width = CFG_DBITS *)
 	TDP36K _TECHMAP_REPLACE_ (
 		.RESET_ni(1'b1),
 		.WDATA_A1_i(18'h3FFFF),
@@ -534,7 +542,7 @@
 	input RD_SRST;
 
 	input [RD_ADDR_WIDTH-1:0] RD_ADDR;
-	output [RD_DATA_WIDTH-1:0] RD_DATA;
+	output reg [RD_DATA_WIDTH-1:0] RD_DATA;
 	input RD_EN;
 
 	input [WR_ADDR_WIDTH-1:0] WR_ADDR;
@@ -543,7 +551,7 @@
 
 	wire [14:RD_ADDR_WIDTH] RD_ADDR_CMPL;
 	wire [14:WR_ADDR_WIDTH] WR_ADDR_CMPL;
-	wire [35:RD_DATA_WIDTH] RD_DATA_CMPL;
+	reg [35:RD_DATA_WIDTH] RD_DATA_CMPL;
 	wire [35:WR_DATA_WIDTH] WR_DATA_CMPL;
 
 	wire [14:0] RD_ADDR_TOTAL;
@@ -968,6 +976,9 @@
 	wire PORT_A2_WEN = WR_EN;
 	wire [1:0] PORT_A2_BE = {PORT_A2_WEN, PORT_A2_WEN};
 
+    (* is_inferred = 1 *)
+    (* rd_data_width = RD_DATA_WIDTH *)
+    (* wr_data_width = WR_DATA_WIDTH *)
 	TDP36K _TECHMAP_REPLACE_ (
 		.RESET_ni(1'b1),
 
@@ -1008,3 +1019,1522 @@
 	);
 endmodule
 
+module SFIFO_36K_BLK (
+    DIN,
+    PUSH,
+    POP,
+    CLK,
+    Async_Flush,
+    Overrun_Error,
+    Full_Watermark,
+    Almost_Full,
+    Full,
+    Underrun_Error,
+    Empty_Watermark,
+    Almost_Empty,
+    Empty,
+    DOUT
+);
+
+  parameter WR_DATA_WIDTH = 36;
+  parameter RD_DATA_WIDTH = 36;
+  parameter UPAE_DBITS = 12'd10;
+  parameter UPAF_DBITS = 12'd10;
+
+  input wire CLK;
+  input wire PUSH, POP;
+  input wire [WR_DATA_WIDTH-1:0] DIN;
+  input wire Async_Flush;
+  output wire [RD_DATA_WIDTH-1:0] DOUT;
+  output wire Almost_Full, Almost_Empty;
+  output wire Full, Empty;
+  output wire Full_Watermark, Empty_Watermark;
+  output wire Overrun_Error, Underrun_Error;
+  
+  wire [35:0] in_reg;
+  wire [35:0] out_reg;
+  wire [17:0] fifo_flags;
+  
+  wire [35:0] RD_DATA_CMPL;
+  wire [35:WR_DATA_WIDTH] WR_DATA_CMPL;
+  
+  wire Push_Clk, Pop_Clk;
+  
+  assign Push_Clk = CLK;
+  assign Pop_Clk = CLK;
+  
+  assign Overrun_Error = fifo_flags[0];
+  assign Full_Watermark = fifo_flags[1];
+  assign Almost_Full = fifo_flags[2];
+  assign Full = fifo_flags[3];
+  assign Underrun_Error = fifo_flags[4];
+  assign Empty_Watermark = fifo_flags[5];
+  assign Almost_Empty = fifo_flags[6];
+  assign Empty = fifo_flags[7];
+   
+  generate
+    if (WR_DATA_WIDTH == 36) begin
+      assign in_reg[WR_DATA_WIDTH-1:0] = DIN[WR_DATA_WIDTH-1:0];
+    end else if (WR_DATA_WIDTH > 18 && WR_DATA_WIDTH < 36) begin
+      assign in_reg[WR_DATA_WIDTH+1:18] = DIN[WR_DATA_WIDTH-1:16];
+      assign in_reg[17:0] = {2'b00,DIN[15:0]};
+    end else if (WR_DATA_WIDTH == 9) begin
+      assign in_reg[35:0] = {19'h0, DIN[8], 8'h0, DIN[7:0]};
+    end else begin
+      assign in_reg[35:WR_DATA_WIDTH]  = 0;
+      assign in_reg[WR_DATA_WIDTH-1:0] = DIN[WR_DATA_WIDTH-1:0];
+    end
+  endgenerate
+  
+  generate
+    if (RD_DATA_WIDTH == 36) begin
+      assign RD_DATA_CMPL = out_reg;
+    end else if (RD_DATA_WIDTH > 18 && RD_DATA_WIDTH < 36) begin
+      assign RD_DATA_CMPL  = {2'b00,out_reg[35:18],out_reg[15:0]};
+    end else if (RD_DATA_WIDTH == 9) begin
+      assign RD_DATA_CMPL = { 27'h0, out_reg[16], out_reg[7:0]};
+    end else begin
+      assign RD_DATA_CMPL = {18'h0, out_reg[17:0]};
+    end
+  endgenerate
+  
+  case (RD_DATA_WIDTH)
+	8, 9: begin
+		case (WR_DATA_WIDTH)
+			8, 9: begin
+				defparam U1.MODE_BITS = { 1'b0,
+					11'd10, 11'd10, 4'd0, `MODE_9, `MODE_9, `MODE_9, `MODE_9, 1'd0,
+					UPAF_DBITS, UPAE_DBITS, 4'h1, `MODE_9, `MODE_9, `MODE_9, `MODE_9, 1'b1
+				};
+			end
+			16, 18: begin
+				defparam U1.MODE_BITS = { 1'b0,
+					11'd10, 11'd10, 4'd0, `MODE_9, `MODE_18, `MODE_9, `MODE_18, 1'd0,
+					UPAF_DBITS, UPAE_DBITS, 4'h1, `MODE_9, `MODE_18, `MODE_9, `MODE_18, 1'b1
+				};
+			end
+			32, 36: begin
+				defparam U1.MODE_BITS = { 1'b0,
+					11'd10, 11'd10, 4'd0, `MODE_9, `MODE_36, `MODE_9, `MODE_36, 1'd0,
+					UPAF_DBITS, UPAE_DBITS, 4'h1, `MODE_9, `MODE_36, `MODE_9, `MODE_36, 1'b1
+				};
+			end
+			default: begin
+				defparam U1.MODE_BITS = { 1'b0,
+					11'd10, 11'd10, 4'd0, `MODE_9, `MODE_9, `MODE_9, `MODE_9, 1'd0,
+					UPAF_DBITS, UPAE_DBITS, 4'h1, `MODE_9, `MODE_9, `MODE_9, `MODE_9, 1'b1
+				};
+			end
+		endcase
+	end
+	16, 18: begin
+		case (WR_DATA_WIDTH)
+			8, 9: begin
+				defparam U1.MODE_BITS = { 1'b0,
+					11'd10, 11'd10, 4'd0, `MODE_18, `MODE_9, `MODE_18, `MODE_9, 1'd0,
+					UPAF_DBITS, UPAE_DBITS, 4'h1, `MODE_18, `MODE_9, `MODE_18, `MODE_9, 1'b1
+				};
+			end
+			16, 18: begin
+				defparam U1.MODE_BITS = { 1'b0,
+					11'd10, 11'd10, 4'd0, `MODE_18, `MODE_18, `MODE_18, `MODE_18, 1'd0,
+					UPAF_DBITS, UPAE_DBITS, 4'h1, `MODE_18, `MODE_18, `MODE_18, `MODE_18, 1'b1
+				};
+			end
+			32, 36: begin
+				defparam U1.MODE_BITS = { 1'b0,
+					11'd10, 11'd10, 4'd0, `MODE_18, `MODE_36, `MODE_18, `MODE_36, 1'd0,
+					UPAF_DBITS, UPAE_DBITS, 4'h1, `MODE_18, `MODE_36, `MODE_18, `MODE_36, 1'b1
+				};
+			end
+			default: begin
+				defparam U1.MODE_BITS = { 1'b0,
+					11'd10, 11'd10, 4'd0, `MODE_18, `MODE_18, `MODE_18, `MODE_18, 1'd0,
+					UPAF_DBITS, UPAE_DBITS, 4'h1, `MODE_18, `MODE_18, `MODE_18, `MODE_18, 1'b1
+				};
+			end
+		endcase
+	end
+	32, 36: begin
+		case (WR_DATA_WIDTH)
+			8, 9: begin
+				defparam U1.MODE_BITS = { 1'b0,
+					11'd10, 11'd10, 4'd0, `MODE_36, `MODE_9, `MODE_36, `MODE_9, 1'd0,
+					UPAF_DBITS, UPAE_DBITS, 4'h1, `MODE_36, `MODE_9, `MODE_36, `MODE_9, 1'b1
+				};
+			end
+			16, 18: begin
+				defparam U1.MODE_BITS = { 1'b0,
+					11'd10, 11'd10, 4'd0, `MODE_36, `MODE_18, `MODE_36, `MODE_18, 1'd0,
+					UPAF_DBITS, UPAE_DBITS, 4'h1, `MODE_36, `MODE_18, `MODE_36, `MODE_18, 1'b1
+				};
+			end
+			32, 36: begin
+				defparam U1.MODE_BITS = { 1'b0,
+					11'd10, 11'd10, 4'd0, `MODE_36, `MODE_36, `MODE_36, `MODE_36, 1'd0,
+					UPAF_DBITS, UPAE_DBITS, 4'h1, `MODE_36, `MODE_36, `MODE_36, `MODE_36, 1'b1
+				};
+			end
+			default: begin
+				defparam U1.MODE_BITS = { 1'b0,
+					11'd10, 11'd10, 4'd0, `MODE_36, `MODE_36, `MODE_36, `MODE_36, 1'd0,
+					UPAF_DBITS, UPAE_DBITS, 4'h1, `MODE_36, `MODE_36, `MODE_36, `MODE_36, 1'b1
+				};
+			end
+		endcase
+	end
+	default: begin
+		case (WR_DATA_WIDTH)
+			8, 9: begin
+				defparam U1.MODE_BITS = { 1'b0,
+					11'd10, 11'd10, 4'd0, `MODE_9, `MODE_9, `MODE_9, `MODE_9, 1'd0,
+					UPAF_DBITS, UPAE_DBITS, 4'h1, `MODE_9, `MODE_9, `MODE_9, `MODE_9, 1'b1
+				};
+			end
+			16, 18: begin
+				defparam U1.MODE_BITS = { 1'b0,
+					11'd10, 11'd10, 4'd0, `MODE_18, `MODE_18, `MODE_18, `MODE_18, 1'd0,
+					UPAF_DBITS, UPAE_DBITS, 4'h1, `MODE_18, `MODE_18, `MODE_18, `MODE_18, 1'b1
+				};
+			end
+			32, 36: begin
+				defparam U1.MODE_BITS = { 1'b0,
+					11'd10, 11'd10, 4'd0, `MODE_36, `MODE_36, `MODE_36, `MODE_36, 1'd0,
+					UPAF_DBITS, UPAE_DBITS, 4'h1, `MODE_36, `MODE_36, `MODE_36, `MODE_36, 1'b1
+				};
+			end
+			default: begin
+				defparam U1.MODE_BITS = { 1'b0,
+					11'd10, 11'd10, 4'd0, `MODE_36, `MODE_36, `MODE_36, `MODE_36, 1'd0,
+					UPAF_DBITS, UPAE_DBITS, 4'h1, `MODE_36, `MODE_36, `MODE_36, `MODE_36, 1'b1
+				};
+			end
+		endcase
+	end
+ endcase
+ 
+  (* is_fifo = 1 *)
+  (* sync_fifo = 1 *)
+  (* rd_data_width = RD_DATA_WIDTH *) 
+  (* wr_data_width = WR_DATA_WIDTH *)
+ 	TDP36K U1 (
+		.RESET_ni(1'b1),
+		.WDATA_A1_i(in_reg[17:0]),
+		.WDATA_A2_i(in_reg[35:18]),
+		.RDATA_A1_o(fifo_flags),
+		.RDATA_A2_o(),
+		.ADDR_A1_i(14'h0),
+		.ADDR_A2_i(14'h0),
+		.CLK_A1_i(Push_Clk),
+		.CLK_A2_i(1'b0),
+		.REN_A1_i(1'b1),
+		.REN_A2_i(1'b0),
+		.WEN_A1_i(PUSH),
+		.WEN_A2_i(1'b0),
+		.BE_A1_i(2'b11),
+		.BE_A2_i(2'b11),
+
+		.WDATA_B1_i(18'h0),
+		.WDATA_B2_i(18'h0),
+		.RDATA_B1_o(out_reg[17:0]),
+		.RDATA_B2_o(out_reg[35:18]),
+		.ADDR_B1_i(14'h0),
+		.ADDR_B2_i(14'h0),
+		.CLK_B1_i(Pop_Clk),
+		.CLK_B2_i(1'b0),
+		.REN_B1_i(POP),
+		.REN_B2_i(1'b0),
+		.WEN_B1_i(1'b0),
+		.WEN_B2_i(1'b0),
+		.BE_B1_i(2'b11),
+		.BE_B2_i(2'b11),
+
+		.FLUSH1_i(Async_Flush),
+		.FLUSH2_i(1'b0)
+	);
+
+  assign DOUT[RD_DATA_WIDTH-1 : 0] = RD_DATA_CMPL[RD_DATA_WIDTH-1 : 0];
+
+endmodule 
+
+module AFIFO_36K_BLK (
+    DIN,
+    PUSH,
+    POP,
+    Push_Clk,
+    Pop_Clk,
+    Async_Flush,
+    Overrun_Error,
+    Full_Watermark,
+    Almost_Full,
+    Full,
+    Underrun_Error,
+    Empty_Watermark,
+    Almost_Empty,
+    Empty,
+    DOUT
+);
+
+  parameter WR_DATA_WIDTH = 36;
+  parameter RD_DATA_WIDTH = 36;
+  parameter UPAE_DBITS = 12'd10;
+  parameter UPAF_DBITS = 12'd10;
+
+  input wire Push_Clk, Pop_Clk;
+  input wire PUSH, POP;
+  input wire [WR_DATA_WIDTH-1:0] DIN;
+  input wire Async_Flush;
+  output wire [RD_DATA_WIDTH-1:0] DOUT;
+  output wire Almost_Full, Almost_Empty;
+  output wire Full, Empty;
+  output wire Full_Watermark, Empty_Watermark;
+  output wire Overrun_Error, Underrun_Error;
+  
+  wire [35:0] in_reg;
+  wire [35:0] out_reg;
+  wire [17:0] fifo_flags;
+  
+  wire [35:0] RD_DATA_CMPL;
+  wire [35:WR_DATA_WIDTH] WR_DATA_CMPL;
+  
+  assign Overrun_Error = fifo_flags[0];
+  assign Full_Watermark = fifo_flags[1];
+  assign Almost_Full = fifo_flags[2];
+  assign Full = fifo_flags[3];
+  assign Underrun_Error = fifo_flags[4];
+  assign Empty_Watermark = fifo_flags[5];
+  assign Almost_Empty = fifo_flags[6];
+  assign Empty = fifo_flags[7];
+   
+  generate
+    if (WR_DATA_WIDTH == 36) begin
+      assign in_reg[WR_DATA_WIDTH-1:0] = DIN[WR_DATA_WIDTH-1:0];
+    end else if (WR_DATA_WIDTH > 18 && WR_DATA_WIDTH < 36) begin
+      assign in_reg[WR_DATA_WIDTH+1:18] = DIN[WR_DATA_WIDTH-1:16];
+      assign in_reg[17:0] = {2'b00,DIN[15:0]};
+    end else if (WR_DATA_WIDTH == 9) begin
+      assign in_reg[35:0] = {19'h0, DIN[8], 8'h0, DIN[7:0]};
+    end else begin
+      assign in_reg[35:WR_DATA_WIDTH]  = 0;
+      assign in_reg[WR_DATA_WIDTH-1:0] = DIN[WR_DATA_WIDTH-1:0];
+    end
+  endgenerate
+  
+  generate
+    if (RD_DATA_WIDTH == 36) begin
+      assign RD_DATA_CMPL = out_reg;
+    end else if (RD_DATA_WIDTH > 18 && RD_DATA_WIDTH < 36) begin
+      assign RD_DATA_CMPL  = {2'b00,out_reg[35:18],out_reg[15:0]};
+    end else if (RD_DATA_WIDTH == 9) begin
+      assign RD_DATA_CMPL = { 27'h0, out_reg[16], out_reg[7:0]};
+    end else begin
+      assign RD_DATA_CMPL = {18'h0, out_reg[17:0]};
+    end
+  endgenerate
+  
+  case (RD_DATA_WIDTH)
+	8, 9: begin
+		case (WR_DATA_WIDTH)
+			8, 9: begin
+				defparam U1.MODE_BITS = { 1'b0,
+					11'd10, 11'd10, 4'd0, `MODE_9, `MODE_9, `MODE_9, `MODE_9, 1'd0,
+					UPAF_DBITS, UPAE_DBITS, 4'h1, `MODE_9, `MODE_9, `MODE_9, `MODE_9, 1'b0
+				};
+			end
+			16, 18: begin
+				defparam U1.MODE_BITS = { 1'b0,
+					11'd10, 11'd10, 4'd0, `MODE_9, `MODE_18, `MODE_9, `MODE_18, 1'd0,
+					UPAF_DBITS, UPAE_DBITS, 4'h1, `MODE_9, `MODE_18, `MODE_9, `MODE_18, 1'b0
+				};
+			end
+			32, 36: begin
+				defparam U1.MODE_BITS = { 1'b0,
+					11'd10, 11'd10, 4'd0, `MODE_9, `MODE_36, `MODE_9, `MODE_36, 1'd0,
+					UPAF_DBITS, UPAE_DBITS, 4'h1, `MODE_9, `MODE_36, `MODE_9, `MODE_36, 1'b0
+				};
+			end
+			default: begin
+				defparam U1.MODE_BITS = { 1'b0,
+					11'd10, 11'd10, 4'd0, `MODE_9, `MODE_9, `MODE_9, `MODE_9, 1'd0,
+					UPAF_DBITS, UPAE_DBITS, 4'h1, `MODE_9, `MODE_9, `MODE_9, `MODE_9, 1'b0
+				};
+			end
+		endcase
+	end
+	16, 18: begin
+		case (WR_DATA_WIDTH)
+			8, 9: begin
+				defparam U1.MODE_BITS = { 1'b0,
+					11'd10, 11'd10, 4'd0, `MODE_18, `MODE_9, `MODE_18, `MODE_9, 1'd0,
+					UPAF_DBITS, UPAE_DBITS, 4'h1, `MODE_18, `MODE_9, `MODE_18, `MODE_9, 1'b0
+				};
+			end
+			16, 18: begin
+				defparam U1.MODE_BITS = { 1'b0,
+					11'd10, 11'd10, 4'd0, `MODE_18, `MODE_18, `MODE_18, `MODE_18, 1'd0,
+					UPAF_DBITS, UPAE_DBITS, 4'h1, `MODE_18, `MODE_18, `MODE_18, `MODE_18, 1'b0
+				};
+			end
+			32, 36: begin
+				defparam U1.MODE_BITS = { 1'b0,
+					11'd10, 11'd10, 4'd0, `MODE_18, `MODE_36, `MODE_18, `MODE_36, 1'd0,
+					UPAF_DBITS, UPAE_DBITS, 4'h1, `MODE_18, `MODE_36, `MODE_18, `MODE_36, 1'b0
+				};
+			end
+			default: begin
+				defparam U1.MODE_BITS = { 1'b0,
+					11'd10, 11'd10, 4'd0, `MODE_18, `MODE_18, `MODE_18, `MODE_18, 1'd0,
+					UPAF_DBITS, UPAE_DBITS, 4'h1, `MODE_18, `MODE_18, `MODE_18, `MODE_18, 1'b0
+				};
+			end
+		endcase
+	end
+	32, 36: begin
+		case (WR_DATA_WIDTH)
+			8, 9: begin
+				defparam U1.MODE_BITS = { 1'b0,
+					11'd10, 11'd10, 4'd0, `MODE_36, `MODE_9, `MODE_36, `MODE_9, 1'd0,
+					UPAF_DBITS, UPAE_DBITS, 4'h1, `MODE_36, `MODE_9, `MODE_36, `MODE_9, 1'b0
+				};
+			end
+			16, 18: begin
+				defparam U1.MODE_BITS = { 1'b0,
+					11'd10, 11'd10, 4'd0, `MODE_36, `MODE_18, `MODE_36, `MODE_18, 1'd0,
+					UPAF_DBITS, UPAE_DBITS, 4'h1, `MODE_36, `MODE_18, `MODE_36, `MODE_18, 1'b0
+				};
+			end
+			32, 36: begin
+				defparam U1.MODE_BITS = { 1'b0,
+					11'd10, 11'd10, 4'd0, `MODE_36, `MODE_36, `MODE_36, `MODE_36, 1'd0,
+					UPAF_DBITS, UPAE_DBITS, 4'h1, `MODE_36, `MODE_36, `MODE_36, `MODE_36, 1'b0
+				};
+			end
+			default: begin
+				defparam U1.MODE_BITS = { 1'b0,
+					11'd10, 11'd10, 4'd0, `MODE_36, `MODE_36, `MODE_36, `MODE_36, 1'd0,
+					UPAF_DBITS, UPAE_DBITS, 4'h1, `MODE_36, `MODE_36, `MODE_36, `MODE_36, 1'b0
+				};
+			end
+		endcase
+	end
+	default: begin
+		case (WR_DATA_WIDTH)
+			8, 9: begin
+				defparam U1.MODE_BITS = { 1'b0,
+					11'd10, 11'd10, 4'd0, `MODE_9, `MODE_9, `MODE_9, `MODE_9, 1'd0,
+					UPAF_DBITS, UPAE_DBITS, 4'h1, `MODE_9, `MODE_9, `MODE_9, `MODE_9, 1'b0
+				};
+			end
+			16, 18: begin
+				defparam U1.MODE_BITS = { 1'b0,
+					11'd10, 11'd10, 4'd0, `MODE_18, `MODE_18, `MODE_18, `MODE_18, 1'd0,
+					UPAF_DBITS, UPAE_DBITS, 4'h1, `MODE_18, `MODE_18, `MODE_18, `MODE_18, 1'b0
+				};
+			end
+			32, 36: begin
+				defparam U1.MODE_BITS = { 1'b0,
+					11'd10, 11'd10, 4'd0, `MODE_36, `MODE_36, `MODE_36, `MODE_36, 1'd0,
+					UPAF_DBITS, UPAE_DBITS, 4'h1, `MODE_36, `MODE_36, `MODE_36, `MODE_36, 1'b0
+				};
+			end
+			default: begin
+				defparam U1.MODE_BITS = { 1'b0,
+					11'd10, 11'd10, 4'd0, `MODE_36, `MODE_36, `MODE_36, `MODE_36, 1'd0,
+					UPAF_DBITS, UPAE_DBITS, 4'h1, `MODE_36, `MODE_36, `MODE_36, `MODE_36, 1'b0
+				};
+			end
+		endcase
+	end
+ endcase
+ 
+  (* is_fifo = 1 *)
+  (* sync_fifo = 0 *)
+  (* rd_data_width = RD_DATA_WIDTH *) 
+  (* wr_data_width = WR_DATA_WIDTH *)
+ 	TDP36K U1 (
+		.RESET_ni(1'b1),
+		.WDATA_A1_i(in_reg[17:0]),
+		.WDATA_A2_i(in_reg[35:18]),
+		.RDATA_A1_o(fifo_flags),
+		.RDATA_A2_o(),
+		.ADDR_A1_i(14'h0),
+		.ADDR_A2_i(14'h0),
+		.CLK_A1_i(Push_Clk),
+		.CLK_A2_i(1'b0),
+		.REN_A1_i(1'b1),
+		.REN_A2_i(1'b0),
+		.WEN_A1_i(PUSH),
+		.WEN_A2_i(1'b0),
+		.BE_A1_i(2'b11),
+		.BE_A2_i(2'b11),
+
+		.WDATA_B1_i(18'h0),
+		.WDATA_B2_i(18'h0),
+		.RDATA_B1_o(out_reg[17:0]),
+		.RDATA_B2_o(out_reg[35:18]),
+		.ADDR_B1_i(14'h0),
+		.ADDR_B2_i(14'h0),
+		.CLK_B1_i(Pop_Clk),
+		.CLK_B2_i(1'b0),
+		.REN_B1_i(POP),
+		.REN_B2_i(1'b0),
+		.WEN_B1_i(1'b0),
+		.WEN_B2_i(1'b0),
+		.BE_B1_i(2'b11),
+		.BE_B2_i(2'b11),
+
+		.FLUSH1_i(Async_Flush),
+		.FLUSH2_i(1'b0)
+	);
+
+  assign DOUT[RD_DATA_WIDTH-1 : 0] = RD_DATA_CMPL[RD_DATA_WIDTH-1 : 0];
+
+endmodule 
+
+module SFIFO_18K_BLK (
+    DIN,
+    PUSH,
+    POP,
+    CLK,
+    Async_Flush,
+    Overrun_Error,
+    Full_Watermark,
+    Almost_Full,
+    Full,
+    Underrun_Error,
+    Empty_Watermark,
+    Almost_Empty,
+    Empty,
+    DOUT
+);
+  
+  parameter WR_DATA_WIDTH = 18;
+  parameter RD_DATA_WIDTH = 18;
+  parameter UPAE_DBITS = 11'd10;
+  parameter UPAF_DBITS = 11'd10;
+
+  input wire CLK;
+  input wire PUSH, POP;
+  input wire [WR_DATA_WIDTH-1:0] DIN;
+  input wire Async_Flush;
+  output wire [RD_DATA_WIDTH-1:0] DOUT;
+  output wire Almost_Full, Almost_Empty;
+  output wire Full, Empty;
+  output wire Full_Watermark, Empty_Watermark;
+  output wire Overrun_Error, Underrun_Error;
+ 
+ 	BRAM2x18_SFIFO  #(
+      .WR_DATA_WIDTH(WR_DATA_WIDTH), 
+      .RD_DATA_WIDTH(RD_DATA_WIDTH),
+      .UPAE_DBITS1(UPAE_DBITS),
+      .UPAF_DBITS1(UPAF_DBITS),
+      .UPAE_DBITS2(),
+      .UPAF_DBITS2()   
+       ) U1
+      (
+      .DIN1(DIN),
+      .PUSH1(PUSH),
+      .POP1(POP),
+      .CLK1(CLK),
+      .Async_Flush1(Async_Flush),
+      .Overrun_Error1(Overrun_Error),
+      .Full_Watermark1(Full_Watermark),
+      .Almost_Full1(Almost_Full),
+      .Full1(Full),
+      .Underrun_Error1(Underrun_Error),
+      .Empty_Watermark1(Empty_Watermark),
+      .Almost_Empty1(Almost_Empty),
+      .Empty1(Empty),
+      .DOUT1(DOUT),
+      
+      .DIN2(),
+      .PUSH2(),
+      .POP2(),
+      .CLK2(),
+      .Async_Flush2(),
+      .Overrun_Error2(),
+      .Full_Watermark2(),
+      .Almost_Full2(),
+      .Full2(),
+      .Underrun_Error2(),
+      .Empty_Watermark2(),
+      .Almost_Empty2(),
+      .Empty2(),
+      .DOUT2()
+	);
+
+endmodule
+
+module AFIFO_18K_BLK (
+    DIN,
+    PUSH,
+    POP,
+    Push_Clk,
+    Pop_Clk,
+    Async_Flush,
+    Overrun_Error,
+    Full_Watermark,
+    Almost_Full,
+    Full,
+    Underrun_Error,
+    Empty_Watermark,
+    Almost_Empty,
+    Empty,
+    DOUT
+);
+  
+  parameter WR_DATA_WIDTH = 18;
+  parameter RD_DATA_WIDTH = 18;
+  parameter UPAE_DBITS = 11'd10;
+  parameter UPAF_DBITS = 11'd10;
+
+  input wire Push_Clk, Pop_Clk;
+  input wire PUSH, POP;
+  input wire [WR_DATA_WIDTH-1:0] DIN;
+  input wire Async_Flush;
+  output wire [RD_DATA_WIDTH-1:0] DOUT;
+  output wire Almost_Full, Almost_Empty;
+  output wire Full, Empty;
+  output wire Full_Watermark, Empty_Watermark;
+  output wire Overrun_Error, Underrun_Error;
+ 
+ 	BRAM2x18_AFIFO  #(
+      .WR_DATA_WIDTH(WR_DATA_WIDTH), 
+      .RD_DATA_WIDTH(RD_DATA_WIDTH),
+      .UPAE_DBITS1(UPAE_DBITS),
+      .UPAF_DBITS1(UPAF_DBITS),
+      .UPAE_DBITS2(),
+      .UPAF_DBITS2()
+       ) U1
+      (
+      .DIN1(DIN),
+      .PUSH1(PUSH),
+      .POP1(POP),
+      .Push_Clk1(Push_Clk),
+      .Pop_Clk1(Pop_Clk),
+      .Async_Flush1(Async_Flush),
+      .Overrun_Error1(Overrun_Error),
+      .Full_Watermark1(Full_Watermark),
+      .Almost_Full1(Almost_Full),
+      .Full1(Full),
+      .Underrun_Error1(Underrun_Error),
+      .Empty_Watermark1(Empty_Watermark),
+      .Almost_Empty1(Almost_Empty),
+      .Empty1(Empty),
+      .DOUT1(DOUT),
+      
+      .DIN2(),
+      .PUSH2(),
+      .POP2(),
+      .Push_Clk2(),
+      .Pop_Clk2(),
+      .Async_Flush2(),
+      .Overrun_Error2(),
+      .Full_Watermark2(),
+      .Almost_Full2(),
+      .Full2(),
+      .Underrun_Error2(),
+      .Empty_Watermark2(),
+      .Almost_Empty2(),
+      .Empty2(),
+      .DOUT2()
+	);
+
+endmodule
+
+module RAM_36K_BLK (
+    WEN_i,
+    REN_i,
+    WR_CLK_i,
+    RD_CLK_i,
+    WR_BE_i,
+    WR_ADDR_i,
+    RD_ADDR_i,
+    WDATA_i,
+    RDATA_o
+);
+
+parameter WR_ADDR_WIDTH = 10;
+parameter RD_ADDR_WIDTH = 10;
+parameter WR_DATA_WIDTH = 36;
+parameter RD_DATA_WIDTH = 36;
+parameter BE_WIDTH = 4;
+
+input wire WEN_i;
+input wire REN_i;
+input wire WR_CLK_i;
+input wire RD_CLK_i;
+input wire [BE_WIDTH-1:0] WR_BE_i;
+input wire [WR_ADDR_WIDTH-1 :0] WR_ADDR_i;
+input wire [RD_ADDR_WIDTH-1 :0] RD_ADDR_i;
+input wire [WR_DATA_WIDTH-1 :0] WDATA_i;
+output wire [RD_DATA_WIDTH-1 :0] RDATA_o;
+
+wire [14:RD_ADDR_WIDTH] RD_ADDR_CMPL;
+wire [14:WR_ADDR_WIDTH] WR_ADDR_CMPL;
+wire [35:0] RD_DATA_CMPL;
+wire [35:WR_DATA_WIDTH] WR_DATA_CMPL;
+
+wire [14:0] RD_ADDR_TOTAL;
+wire [14:0] WR_ADDR_TOTAL;
+
+wire [14:0] RD_ADDR_SHIFTED;
+wire [14:0] WR_ADDR_SHIFTED;
+
+wire [3:0] WR_BE;
+
+wire FLUSH1;
+wire FLUSH2;
+
+generate
+  if (WR_ADDR_WIDTH == 15) begin
+    assign WR_ADDR_TOTAL = WR_ADDR_i;
+  end else begin
+    assign WR_ADDR_TOTAL[14:WR_ADDR_WIDTH] = 0;
+    assign WR_ADDR_TOTAL[WR_ADDR_WIDTH-1:0] = WR_ADDR_i;
+  end
+endgenerate
+
+generate
+  if (RD_ADDR_WIDTH == 15) begin
+    assign RD_ADDR_TOTAL = RD_ADDR_i;
+  end else begin
+    assign RD_ADDR_TOTAL[14:RD_ADDR_WIDTH] = 0;
+    assign RD_ADDR_TOTAL[RD_ADDR_WIDTH-1:0] = RD_ADDR_i;
+  end
+endgenerate
+
+// Assign parameters
+case (RD_DATA_WIDTH)
+	1: begin
+		case (WR_DATA_WIDTH)
+			1: begin
+				defparam BRAM_BLK.MODE_BITS = { 1'b0,
+					11'd10, 11'd10, 4'd0, `MODE_1, `MODE_1, `MODE_1, `MODE_1, 1'd0,
+					12'd10, 12'd10, 4'd0, `MODE_1, `MODE_1, `MODE_1, `MODE_1, 1'd0
+				};
+			end
+			2: begin
+				defparam BRAM_BLK.MODE_BITS = { 1'b0,
+					11'd10, 11'd10, 4'd0, `MODE_1, `MODE_2, `MODE_1, `MODE_2, 1'd0,
+					12'd10, 12'd10, 4'd0, `MODE_1, `MODE_2, `MODE_1, `MODE_2, 1'd0
+				};
+			end
+			4: begin
+				defparam BRAM_BLK.MODE_BITS = { 1'b0,
+					11'd10, 11'd10, 4'd0, `MODE_1, `MODE_4, `MODE_1, `MODE_4, 1'd0,
+					12'd10, 12'd10, 4'd0, `MODE_1, `MODE_4, `MODE_1, `MODE_4, 1'd0
+				};
+			end
+			8, 9: begin
+				defparam BRAM_BLK.MODE_BITS = { 1'b0,
+					11'd10, 11'd10, 4'd0, `MODE_1, `MODE_9, `MODE_1, `MODE_9, 1'd0,
+					12'd10, 12'd10, 4'd0, `MODE_1, `MODE_9, `MODE_1, `MODE_9, 1'd0
+				};
+			end
+			16, 18: begin
+				defparam BRAM_BLK.MODE_BITS = { 1'b0,
+					11'd10, 11'd10, 4'd0, `MODE_1, `MODE_18, `MODE_1, `MODE_18, 1'd0,
+					12'd10, 12'd10, 4'd0, `MODE_1, `MODE_18, `MODE_1, `MODE_18, 1'd0
+				};
+			end
+			32, 36: begin
+				defparam BRAM_BLK.MODE_BITS = { 1'b0,
+					11'd10, 11'd10, 4'd0, `MODE_1, `MODE_36, `MODE_1, `MODE_36, 1'd0,
+					12'd10, 12'd10, 4'd0, `MODE_1, `MODE_36, `MODE_1, `MODE_36, 1'd0
+				};
+			end
+			default: begin
+				defparam BRAM_BLK.MODE_BITS = { 1'b0,
+					11'd10, 11'd10, 4'd0, `MODE_1, `MODE_1, `MODE_1, `MODE_1, 1'd0,
+					12'd10, 12'd10, 4'd0, `MODE_1, `MODE_1, `MODE_1, `MODE_1, 1'd0
+				};
+			end
+		endcase
+	end
+	2: begin
+		case (WR_DATA_WIDTH)
+			1: begin
+				defparam BRAM_BLK.MODE_BITS = { 1'b0,
+					11'd10, 11'd10, 4'd0, `MODE_2, `MODE_1, `MODE_2, `MODE_1, 1'd0,
+					12'd10, 12'd10, 4'd0, `MODE_2, `MODE_1, `MODE_2, `MODE_1, 1'd0
+				};
+			end
+			2: begin
+				defparam BRAM_BLK.MODE_BITS = { 1'b0,
+					11'd10, 11'd10, 4'd0, `MODE_2, `MODE_2, `MODE_2, `MODE_2, 1'd0,
+					12'd10, 12'd10, 4'd0, `MODE_2, `MODE_2, `MODE_2, `MODE_2, 1'd0
+				};
+			end
+			4: begin
+				defparam BRAM_BLK.MODE_BITS = { 1'b0,
+					11'd10, 11'd10, 4'd0, `MODE_2, `MODE_4, `MODE_2, `MODE_4, 1'd0,
+					12'd10, 12'd10, 4'd0, `MODE_2, `MODE_4, `MODE_2, `MODE_4, 1'd0
+				};
+			end
+			8, 9: begin
+				defparam BRAM_BLK.MODE_BITS = { 1'b0,
+					11'd10, 11'd10, 4'd0, `MODE_2, `MODE_9, `MODE_2, `MODE_9, 1'd0,
+					12'd10, 12'd10, 4'd0, `MODE_2, `MODE_9, `MODE_2, `MODE_9, 1'd0
+				};
+			end
+			16, 18: begin
+				defparam BRAM_BLK.MODE_BITS = { 1'b0,
+					11'd10, 11'd10, 4'd0, `MODE_2, `MODE_18, `MODE_2, `MODE_18, 1'd0,
+					12'd10, 12'd10, 4'd0, `MODE_2, `MODE_18, `MODE_2, `MODE_18, 1'd0
+				};
+			end
+			32, 36: begin
+				defparam BRAM_BLK.MODE_BITS = { 1'b0,
+					11'd10, 11'd10, 4'd0, `MODE_2, `MODE_36, `MODE_2, `MODE_36, 1'd0,
+					12'd10, 12'd10, 4'd0, `MODE_2, `MODE_36, `MODE_2, `MODE_36, 1'd0
+				};
+			end
+			default: begin
+				defparam BRAM_BLK.MODE_BITS = { 1'b0,
+					11'd10, 11'd10, 4'd0, `MODE_2, `MODE_1, `MODE_2, `MODE_1, 1'd0,
+					12'd10, 12'd10, 4'd0, `MODE_2, `MODE_1, `MODE_2, `MODE_1, 1'd0
+				};
+			end
+		endcase
+	end
+	4: begin
+		case (WR_DATA_WIDTH)
+			1: begin
+				defparam BRAM_BLK.MODE_BITS = { 1'b0,
+					11'd10, 11'd10, 4'd0, `MODE_4, `MODE_1, `MODE_4, `MODE_1, 1'd0,
+					12'd10, 12'd10, 4'd0, `MODE_4, `MODE_1, `MODE_4, `MODE_1, 1'd0
+				};
+			end
+			2: begin
+				defparam BRAM_BLK.MODE_BITS = { 1'b0,
+					11'd10, 11'd10, 4'd0, `MODE_4, `MODE_2, `MODE_4, `MODE_2, 1'd0,
+					12'd10, 12'd10, 4'd0, `MODE_4, `MODE_2, `MODE_4, `MODE_2, 1'd0
+				};
+			end
+			4: begin
+				defparam BRAM_BLK.MODE_BITS = { 1'b0,
+					11'd10, 11'd10, 4'd0, `MODE_4, `MODE_4, `MODE_4, `MODE_4, 1'd0,
+					12'd10, 12'd10, 4'd0, `MODE_4, `MODE_4, `MODE_4, `MODE_4, 1'd0
+				};
+			end
+			8, 9: begin
+				defparam BRAM_BLK.MODE_BITS = { 1'b0,
+					11'd10, 11'd10, 4'd0, `MODE_4, `MODE_9, `MODE_4, `MODE_9, 1'd0,
+					12'd10, 12'd10, 4'd0, `MODE_4, `MODE_9, `MODE_4, `MODE_9, 1'd0
+				};
+			end
+			16, 18: begin
+				defparam BRAM_BLK.MODE_BITS = { 1'b0,
+					11'd10, 11'd10, 4'd0, `MODE_4, `MODE_18, `MODE_4, `MODE_18, 1'd0,
+					12'd10, 12'd10, 4'd0, `MODE_4, `MODE_18, `MODE_4, `MODE_18, 1'd0
+				};
+			end
+			32, 36: begin
+				defparam BRAM_BLK.MODE_BITS = { 1'b0,
+					11'd10, 11'd10, 4'd0, `MODE_4, `MODE_36, `MODE_4, `MODE_36, 1'd0,
+					12'd10, 12'd10, 4'd0, `MODE_4, `MODE_36, `MODE_4, `MODE_36, 1'd0
+				};
+			end
+			default: begin
+				defparam BRAM_BLK.MODE_BITS = { 1'b0,
+					11'd10, 11'd10, 4'd0, `MODE_4, `MODE_1, `MODE_4, `MODE_1, 1'd0,
+					12'd10, 12'd10, 4'd0, `MODE_4, `MODE_1, `MODE_4, `MODE_1, 1'd0
+				};
+			end
+		endcase
+	end
+	8, 9: begin
+		case (WR_DATA_WIDTH)
+			1: begin
+				defparam BRAM_BLK.MODE_BITS = { 1'b0,
+					11'd10, 11'd10, 4'd0, `MODE_9, `MODE_1, `MODE_9, `MODE_1, 1'd0,
+					12'd10, 12'd10, 4'd0, `MODE_9, `MODE_1, `MODE_9, `MODE_1, 1'd0
+				};
+			end
+			2: begin
+				defparam BRAM_BLK.MODE_BITS = { 1'b0,
+					11'd10, 11'd10, 4'd0, `MODE_9, `MODE_2, `MODE_9, `MODE_2, 1'd0,
+					12'd10, 12'd10, 4'd0, `MODE_9, `MODE_2, `MODE_9, `MODE_2, 1'd0
+				};
+			end
+			4: begin
+				defparam BRAM_BLK.MODE_BITS = { 1'b0,
+					11'd10, 11'd10, 4'd0, `MODE_9, `MODE_4, `MODE_9, `MODE_4, 1'd0,
+					12'd10, 12'd10, 4'd0, `MODE_9, `MODE_4, `MODE_9, `MODE_4, 1'd0
+				};
+			end
+			8, 9: begin
+				defparam BRAM_BLK.MODE_BITS = { 1'b0,
+					11'd10, 11'd10, 4'd0, `MODE_9, `MODE_9, `MODE_9, `MODE_9, 1'd0,
+					12'd10, 12'd10, 4'd0, `MODE_9, `MODE_9, `MODE_9, `MODE_9, 1'd0
+				};
+			end
+			16, 18: begin
+				defparam BRAM_BLK.MODE_BITS = { 1'b0,
+					11'd10, 11'd10, 4'd0, `MODE_9, `MODE_18, `MODE_9, `MODE_18, 1'd0,
+					12'd10, 12'd10, 4'd0, `MODE_9, `MODE_18, `MODE_9, `MODE_18, 1'd0
+				};
+			end
+			32, 36: begin
+				defparam BRAM_BLK.MODE_BITS = { 1'b0,
+					11'd10, 11'd10, 4'd0, `MODE_9, `MODE_36, `MODE_9, `MODE_36, 1'd0,
+					12'd10, 12'd10, 4'd0, `MODE_9, `MODE_36, `MODE_9, `MODE_36, 1'd0
+				};
+			end
+			default: begin
+				defparam BRAM_BLK.MODE_BITS = { 1'b0,
+					11'd10, 11'd10, 4'd0, `MODE_9, `MODE_1, `MODE_9, `MODE_1, 1'd0,
+					12'd10, 12'd10, 4'd0, `MODE_9, `MODE_1, `MODE_9, `MODE_1, 1'd0
+				};
+			end
+		endcase
+	end
+	16, 18: begin
+		case (WR_DATA_WIDTH)
+			1: begin
+				defparam BRAM_BLK.MODE_BITS = { 1'b0,
+					11'd10, 11'd10, 4'd0, `MODE_18, `MODE_1, `MODE_18, `MODE_1, 1'd0,
+					12'd10, 12'd10, 4'd0, `MODE_18, `MODE_1, `MODE_18, `MODE_1, 1'd0
+				};
+			end
+			2: begin
+				defparam BRAM_BLK.MODE_BITS = { 1'b0,
+					11'd10, 11'd10, 4'd0, `MODE_18, `MODE_2, `MODE_18, `MODE_2, 1'd0,
+					12'd10, 12'd10, 4'd0, `MODE_18, `MODE_2, `MODE_18, `MODE_2, 1'd0
+				};
+			end
+			4: begin
+				defparam BRAM_BLK.MODE_BITS = { 1'b0,
+					11'd10, 11'd10, 4'd0, `MODE_18, `MODE_4, `MODE_18, `MODE_4, 1'd0,
+					12'd10, 12'd10, 4'd0, `MODE_18, `MODE_4, `MODE_18, `MODE_4, 1'd0
+				};
+			end
+			8, 9: begin
+				defparam BRAM_BLK.MODE_BITS = { 1'b0,
+					11'd10, 11'd10, 4'd0, `MODE_18, `MODE_9, `MODE_18, `MODE_9, 1'd0,
+					12'd10, 12'd10, 4'd0, `MODE_18, `MODE_9, `MODE_18, `MODE_9, 1'd0
+				};
+			end
+			16, 18: begin
+				defparam BRAM_BLK.MODE_BITS = { 1'b0,
+					11'd10, 11'd10, 4'd0, `MODE_18, `MODE_18, `MODE_18, `MODE_18, 1'd0,
+					12'd10, 12'd10, 4'd0, `MODE_18, `MODE_18, `MODE_18, `MODE_18, 1'd0
+				};
+			end
+			32, 36: begin
+				defparam BRAM_BLK.MODE_BITS = { 1'b0,
+					11'd10, 11'd10, 4'd0, `MODE_18, `MODE_36, `MODE_18, `MODE_36, 1'd0,
+					12'd10, 12'd10, 4'd0, `MODE_18, `MODE_36, `MODE_18, `MODE_36, 1'd0
+				};
+			end
+			default: begin
+				defparam BRAM_BLK.MODE_BITS = { 1'b0,
+					11'd10, 11'd10, 4'd0, `MODE_18, `MODE_1, `MODE_18, `MODE_1, 1'd0,
+					12'd10, 12'd10, 4'd0, `MODE_18, `MODE_1, `MODE_18, `MODE_1, 1'd0
+				};
+			end
+		endcase
+	end
+	32, 36: begin
+		case (WR_DATA_WIDTH)
+			1: begin
+				defparam BRAM_BLK.MODE_BITS = { 1'b0,
+					11'd10, 11'd10, 4'd0, `MODE_36, `MODE_1, `MODE_36, `MODE_1, 1'd0,
+					12'd10, 12'd10, 4'd0, `MODE_36, `MODE_1, `MODE_36, `MODE_1, 1'd0
+				};
+			end
+			2: begin
+				defparam BRAM_BLK.MODE_BITS = { 1'b0,
+					11'd10, 11'd10, 4'd0, `MODE_36, `MODE_2, `MODE_36, `MODE_2, 1'd0,
+					12'd10, 12'd10, 4'd0, `MODE_36, `MODE_2, `MODE_36, `MODE_2, 1'd0
+				};
+			end
+			4: begin
+				defparam BRAM_BLK.MODE_BITS = { 1'b0,
+					11'd10, 11'd10, 4'd0, `MODE_36, `MODE_4, `MODE_36, `MODE_4, 1'd0,
+					12'd10, 12'd10, 4'd0, `MODE_36, `MODE_4, `MODE_36, `MODE_4, 1'd0
+				};
+			end
+			8, 9: begin
+				defparam BRAM_BLK.MODE_BITS = { 1'b0,
+					11'd10, 11'd10, 4'd0, `MODE_36, `MODE_9, `MODE_36, `MODE_9, 1'd0,
+					12'd10, 12'd10, 4'd0, `MODE_36, `MODE_9, `MODE_36, `MODE_9, 1'd0
+				};
+			end
+			16, 18: begin
+				defparam BRAM_BLK.MODE_BITS = { 1'b0,
+					11'd10, 11'd10, 4'd0, `MODE_36, `MODE_18, `MODE_36, `MODE_18, 1'd0,
+					12'd10, 12'd10, 4'd0, `MODE_36, `MODE_18, `MODE_36, `MODE_18, 1'd0
+				};
+			end
+			32, 36: begin
+				defparam BRAM_BLK.MODE_BITS = { 1'b0,
+					11'd10, 11'd10, 4'd0, `MODE_36, `MODE_36, `MODE_36, `MODE_36, 1'd0,
+					12'd10, 12'd10, 4'd0, `MODE_36, `MODE_36, `MODE_36, `MODE_36, 1'd0
+				};
+			end
+			default: begin
+				defparam BRAM_BLK.MODE_BITS = { 1'b0,
+					11'd10, 11'd10, 4'd0, `MODE_36, `MODE_1, `MODE_36, `MODE_1, 1'd0,
+					12'd10, 12'd10, 4'd0, `MODE_36, `MODE_1, `MODE_36, `MODE_1, 1'd0
+				};
+			end
+		endcase
+	end
+	default: begin
+		case (WR_DATA_WIDTH)
+			1: begin
+				defparam BRAM_BLK.MODE_BITS = { 1'b0,
+					11'd10, 11'd10, 4'd0, `MODE_1, `MODE_1, `MODE_1, `MODE_1, 1'd0,
+					12'd10, 12'd10, 4'd0, `MODE_1, `MODE_1, `MODE_1, `MODE_1, 1'd0
+				};
+			end
+			2: begin
+				defparam BRAM_BLK.MODE_BITS = { 1'b0,
+					11'd10, 11'd10, 4'd0, `MODE_1, `MODE_2, `MODE_1, `MODE_2, 1'd0,
+					12'd10, 12'd10, 4'd0, `MODE_1, `MODE_2, `MODE_1, `MODE_2, 1'd0
+				};
+			end
+			4: begin
+				defparam BRAM_BLK.MODE_BITS = { 1'b0,
+					11'd10, 11'd10, 4'd0, `MODE_1, `MODE_4, `MODE_1, `MODE_4, 1'd0,
+					12'd10, 12'd10, 4'd0, `MODE_1, `MODE_4, `MODE_1, `MODE_4, 1'd0
+				};
+			end
+			8, 9: begin
+				defparam BRAM_BLK.MODE_BITS = { 1'b0,
+					11'd10, 11'd10, 4'd0, `MODE_1, `MODE_9, `MODE_1, `MODE_9, 1'd0,
+					12'd10, 12'd10, 4'd0, `MODE_1, `MODE_9, `MODE_1, `MODE_9, 1'd0
+				};
+			end
+			16, 18: begin
+				defparam BRAM_BLK.MODE_BITS = { 1'b0,
+					11'd10, 11'd10, 4'd0, `MODE_1, `MODE_18, `MODE_1, `MODE_18, 1'd0,
+					12'd10, 12'd10, 4'd0, `MODE_1, `MODE_18, `MODE_1, `MODE_18, 1'd0
+				};
+			end
+			32, 36: begin
+				defparam BRAM_BLK.MODE_BITS = { 1'b0,
+					11'd10, 11'd10, 4'd0, `MODE_1, `MODE_36, `MODE_1, `MODE_36, 1'd0,
+					12'd10, 12'd10, 4'd0, `MODE_1, `MODE_36, `MODE_1, `MODE_36, 1'd0
+				};
+			end
+			default: begin
+				defparam BRAM_BLK.MODE_BITS = { 1'b0,
+					11'd10, 11'd10, 4'd0, `MODE_1, `MODE_1, `MODE_1, `MODE_1, 1'd0,
+					12'd10, 12'd10, 4'd0, `MODE_1, `MODE_1, `MODE_1, `MODE_1, 1'd0
+				};
+			end
+		endcase
+	end
+endcase
+
+// Apply shift
+case (RD_DATA_WIDTH)
+	1: begin
+		assign RD_ADDR_SHIFTED = RD_ADDR_TOTAL;
+	end
+	2: begin
+		assign RD_ADDR_SHIFTED = RD_ADDR_TOTAL << 1;
+	end
+	4: begin
+		assign RD_ADDR_SHIFTED = RD_ADDR_TOTAL << 2;
+	end
+	8, 9: begin
+		assign RD_ADDR_SHIFTED = RD_ADDR_TOTAL << 3;
+	end
+	16, 18: begin
+		assign RD_ADDR_SHIFTED = RD_ADDR_TOTAL << 4;
+	end
+	32, 36: begin
+		assign RD_ADDR_SHIFTED = RD_ADDR_TOTAL << 5;
+	end
+	default: begin
+		assign RD_ADDR_SHIFTED = RD_ADDR_TOTAL;
+	end
+endcase
+
+case (WR_DATA_WIDTH)
+	1: begin
+		assign WR_ADDR_SHIFTED = WR_ADDR_TOTAL;
+	end
+	2: begin
+		assign WR_ADDR_SHIFTED = WR_ADDR_TOTAL << 1;
+	end
+	4: begin
+		assign WR_ADDR_SHIFTED = WR_ADDR_TOTAL << 2;
+	end
+	8, 9: begin
+		assign WR_ADDR_SHIFTED = WR_ADDR_TOTAL << 3;
+	end
+	16, 18: begin
+		assign WR_ADDR_SHIFTED = WR_ADDR_TOTAL << 4;
+	end
+	32, 36: begin
+		assign WR_ADDR_SHIFTED = WR_ADDR_TOTAL << 5;
+	end
+	default: begin
+		assign WR_ADDR_SHIFTED = WR_ADDR_TOTAL;
+	end
+endcase
+
+case (BE_WIDTH)
+	4: begin
+		assign WR_BE = WR_BE_i[BE_WIDTH-1 :0];
+	end
+	default: begin
+		assign WR_BE[3:BE_WIDTH] = 0;
+    assign WR_BE[BE_WIDTH-1 :0] = WR_BE_i[BE_WIDTH-1 :0];
+	end
+endcase
+
+assign FLUSH1 = 1'b0;
+assign FLUSH2 = 1'b0;
+
+// TODO configure per width
+wire [17:0] PORT_B1_RDATA;
+wire [17:0] PORT_B2_RDATA;
+wire [35:0] PORT_A_WDATA;
+
+generate
+  if (WR_DATA_WIDTH == 36) begin
+    assign PORT_A_WDATA[WR_DATA_WIDTH-1:0] = WDATA_i[WR_DATA_WIDTH-1:0];
+  end else if (WR_DATA_WIDTH > 18 && WR_DATA_WIDTH < 36) begin
+    assign PORT_A_WDATA[WR_DATA_WIDTH+1:18]  = WDATA_i[WR_DATA_WIDTH-1:16];
+    assign PORT_A_WDATA[17:0] = {2'b00,WDATA_i[15:0]};
+  end else if (WR_DATA_WIDTH == 9) begin
+    assign PORT_A_WDATA = {19'h0, WDATA_i[8], 8'h0, WDATA_i[7:0]};
+  end else begin
+    assign PORT_A_WDATA[35:WR_DATA_WIDTH] = 0;
+    assign PORT_A_WDATA[WR_DATA_WIDTH-1:0] = WDATA_i[WR_DATA_WIDTH-1:0];
+  end
+endgenerate
+
+generate
+  if (RD_DATA_WIDTH == 36) begin
+    assign RD_DATA_CMPL = {PORT_B2_RDATA, PORT_B1_RDATA};
+  end else if (RD_DATA_WIDTH > 18 && RD_DATA_WIDTH < 36) begin
+    assign RD_DATA_CMPL  = {2'b00,PORT_B2_RDATA[17:0],PORT_B1_RDATA[15:0]};
+  end else if (RD_DATA_WIDTH == 9) begin
+    assign RD_DATA_CMPL = { 27'h0, PORT_B1_RDATA[16], PORT_B1_RDATA[7:0]};
+  end else begin
+    assign RD_DATA_CMPL = {18'h0, PORT_B1_RDATA};
+  end
+endgenerate
+
+assign RDATA_o = RD_DATA_CMPL[RD_DATA_WIDTH-1:0];
+
+(* is_inferred = 1 *)
+(* rd_data_width = RD_DATA_WIDTH *)
+(* wr_data_width = WR_DATA_WIDTH *)
+TDP36K BRAM_BLK (
+	.RESET_ni(1'b1),
+
+	.WDATA_A1_i(PORT_A_WDATA[17:0]),
+	.RDATA_A1_o(),
+	.ADDR_A1_i(WR_ADDR_SHIFTED),
+	.CLK_A1_i(WR_CLK_i),
+	.REN_A1_i(1'b0),
+	.WEN_A1_i(WEN_i),
+	.BE_A1_i(WR_BE[1:0]),
+
+	.WDATA_B1_i(18'h0),
+	.RDATA_B1_o(PORT_B1_RDATA[17:0]),
+	.ADDR_B1_i(RD_ADDR_SHIFTED),
+	.CLK_B1_i(RD_CLK_i),
+	.REN_B1_i(REN_i),
+	.WEN_B1_i(1'b0),
+	.BE_B1_i({REN_i,REN_i}),
+
+	.WDATA_A2_i(PORT_A_WDATA[35:18]),
+	.RDATA_A2_o(),
+	.ADDR_A2_i(WR_ADDR_SHIFTED),
+	.CLK_A2_i(WR_CLK_i),
+	.REN_A2_i(1'b0),
+	.WEN_A2_i(WEN_i),
+	.BE_A2_i(WR_BE[3:2]),
+
+	.WDATA_B2_i(18'h0),
+	.RDATA_B2_o(PORT_B2_RDATA[17:0]),
+	.ADDR_B2_i(RD_ADDR_SHIFTED),
+	.CLK_B2_i(RD_CLK_i),
+	.REN_B2_i(REN_i),
+	.WEN_B2_i(1'b0),
+	.BE_B2_i({REN_i,REN_i}),
+
+	.FLUSH1_i(FLUSH1),
+	.FLUSH2_i(FLUSH2)
+);
+
+endmodule
+
+module RAM_18K_BLK (
+    WEN_i,
+    REN_i,
+    WR_CLK_i,
+    RD_CLK_i,
+    WR_BE_i,
+    WR_ADDR_i,
+    RD_ADDR_i,
+    WDATA_i,
+    RDATA_o
+);
+
+parameter WR_ADDR_WIDTH = 10;
+parameter RD_ADDR_WIDTH = 10;
+parameter WR_DATA_WIDTH = 18;
+parameter RD_DATA_WIDTH = 18;
+parameter BE_WIDTH = 2;
+
+input wire WEN_i;
+input wire REN_i;
+input wire WR_CLK_i;
+input wire RD_CLK_i;
+input wire [BE_WIDTH-1:0] WR_BE_i;
+input wire [WR_ADDR_WIDTH-1 :0] WR_ADDR_i;
+input wire [RD_ADDR_WIDTH-1 :0] RD_ADDR_i;
+input wire [WR_DATA_WIDTH-1 :0] WDATA_i;
+output wire [RD_DATA_WIDTH-1 :0] RDATA_o;
+
+  BRAM2x18_SP  #(
+      .WR_ADDR_WIDTH(WR_ADDR_WIDTH), 
+      .RD_ADDR_WIDTH(RD_ADDR_WIDTH),
+      .WR_DATA_WIDTH(WR_DATA_WIDTH), 
+      .RD_DATA_WIDTH(RD_DATA_WIDTH),
+      .BE1_WIDTH(BE_WIDTH),
+      .BE2_WIDTH()      
+       ) U1
+      (
+      .RESET_ni(1'b1),
+      
+      .WEN1_i(WEN_i),
+      .REN1_i(REN_i),
+      .WR1_CLK_i(WR_CLK_i),
+      .RD1_CLK_i(RD_CLK_i),
+      .WR1_BE_i(WR_BE_i),
+      .WR1_ADDR_i(WR_ADDR_i),
+      .RD1_ADDR_i(RD_ADDR_i),
+      .WDATA1_i(WDATA_i),
+      .RDATA1_o(RDATA_o),
+      
+      .WEN2_i(),
+      .REN2_i(),
+      .WR2_CLK_i(),
+      .RD2_CLK_i(),
+      .WR2_BE_i(),
+      .WR2_ADDR_i(),
+      .RD2_ADDR_i(),
+      .WDATA2_i(),
+      .RDATA2_o()
+      );
+    
+endmodule
+
+module DPRAM_36K_BLK (   
+    CLK1_i,
+    WEN1_i,
+    WR1_BE_i,
+    REN1_i,
+    WR1_ADDR_i,
+    RD1_ADDR_i,
+    WDATA1_i,
+    RDATA1_o,
+    
+    CLK2_i,
+    WEN2_i,
+    WR2_BE_i,
+    REN2_i,
+    WR2_ADDR_i,
+    RD2_ADDR_i,
+    WDATA2_i,
+    RDATA2_o
+);
+
+parameter ADDR_WIDTH = 10;
+parameter DATA_WIDTH = 36;
+parameter BE1_WIDTH = 4;
+parameter BE2_WIDTH = 4;
+
+input wire CLK1_i;
+input wire WEN1_i;
+input wire [BE1_WIDTH-1 :0] WR1_BE_i;
+input wire REN1_i;
+input wire [ADDR_WIDTH-1 :0] WR1_ADDR_i;
+input wire [ADDR_WIDTH-1 :0] RD1_ADDR_i;
+input wire [DATA_WIDTH-1 :0] WDATA1_i;
+output wire [DATA_WIDTH-1 :0] RDATA1_o;
+
+input wire CLK2_i;
+input wire WEN2_i;
+input wire [BE2_WIDTH-1 :0] WR2_BE_i;
+input wire REN2_i;
+input wire [ADDR_WIDTH-1 :0] WR2_ADDR_i;
+input wire [ADDR_WIDTH-1 :0] RD2_ADDR_i;
+input wire [DATA_WIDTH-1 :0] WDATA2_i;
+output wire [DATA_WIDTH-1 :0] RDATA2_o;
+
+wire FLUSH1;
+wire FLUSH2;
+
+wire [14:0] A1ADDR_TOTAL;
+wire [14:0] B1ADDR_TOTAL;
+wire [14:0] C1ADDR_TOTAL;
+wire [14:0] D1ADDR_TOTAL;
+
+generate
+  if (ADDR_WIDTH == 15) begin
+    assign A1ADDR_TOTAL = RD1_ADDR_i;
+    assign B1ADDR_TOTAL = WR1_ADDR_i;
+    assign C1ADDR_TOTAL = RD2_ADDR_i;
+    assign D1ADDR_TOTAL = WR2_ADDR_i;
+  end else begin
+    assign A1ADDR_TOTAL[14:ADDR_WIDTH] = 0;
+    assign A1ADDR_TOTAL[ADDR_WIDTH-1:0] = RD1_ADDR_i;
+    assign B1ADDR_TOTAL[14:ADDR_WIDTH] = 0;
+    assign B1ADDR_TOTAL[ADDR_WIDTH-1:0] = WR1_ADDR_i;
+    assign C1ADDR_TOTAL[14:ADDR_WIDTH] = 0;
+    assign C1ADDR_TOTAL[ADDR_WIDTH-1:0] = RD2_ADDR_i;
+    assign D1ADDR_TOTAL[14:ADDR_WIDTH] = 0;
+    assign D1ADDR_TOTAL[ADDR_WIDTH-1:0] = WR2_ADDR_i;
+  end
+endgenerate
+
+wire [35:DATA_WIDTH] A1DATA_CMPL;
+wire [35:DATA_WIDTH] B1DATA_CMPL;
+wire [35:DATA_WIDTH] C1DATA_CMPL;
+wire [35:DATA_WIDTH] D1DATA_CMPL;
+
+wire [35:0] A1DATA_TOTAL;
+wire [35:0] B1DATA_TOTAL;
+wire [35:0] C1DATA_TOTAL;
+wire [35:0] D1DATA_TOTAL;
+
+wire [14:0] PORT_A_ADDR;
+wire [14:0] PORT_B_ADDR;
+
+wire [3:0] WR1_BE;
+wire [3:0] WR2_BE;
+
+generate
+  if (BE1_WIDTH == 4) begin
+    assign WR1_BE = WR1_BE_i;
+  end else begin
+    assign WR1_BE[3:BE1_WIDTH] = 0;
+    assign WR1_BE[BE1_WIDTH-1:0] = WR1_BE_i[BE1_WIDTH-1:0];
+  end
+endgenerate
+
+generate
+  if (BE2_WIDTH == 4) begin
+    assign WR2_BE = WR2_BE_i;
+  end else begin
+    assign WR2_BE[3:BE2_WIDTH] = 0;
+    assign WR2_BE[BE2_WIDTH-1:0] = WR2_BE_i[BE2_WIDTH-1:0];
+  end
+endgenerate
+
+// Assign read/write data - handle special case for 9bit mode
+// parity bit for 9bit mode is placed in R/W port on bit #16
+case (DATA_WIDTH)
+	9: begin
+		assign RDATA1_o = {A1DATA_TOTAL[16], A1DATA_TOTAL[7:0]};
+		assign RDATA2_o = {C1DATA_TOTAL[16], C1DATA_TOTAL[7:0]};
+		assign B1DATA_TOTAL = {B1DATA_CMPL[35:17], WDATA1_i[8], B1DATA_CMPL[16:9], WDATA1_i[7:0]};
+		assign D1DATA_TOTAL = {D1DATA_CMPL[35:17], WDATA2_i[8], D1DATA_CMPL[16:9], WDATA2_i[7:0]};
+	end
+	default: begin
+		assign RDATA1_o = A1DATA_TOTAL[DATA_WIDTH-1:0];
+		assign RDATA2_o = C1DATA_TOTAL[DATA_WIDTH-1:0];
+		assign B1DATA_TOTAL = {B1DATA_CMPL, WDATA1_i};
+		assign D1DATA_TOTAL = {D1DATA_CMPL, WDATA2_i};
+	end
+endcase
+
+case (DATA_WIDTH)
+	1: begin
+		assign PORT_A_ADDR = REN1_i ? A1ADDR_TOTAL : (WEN1_i ? B1ADDR_TOTAL : 15'd0);
+		assign PORT_B_ADDR = REN2_i ? C1ADDR_TOTAL : (WEN2_i ? D1ADDR_TOTAL : 15'd0);
+          defparam U1.MODE_BITS = { 1'b0,
+              11'd10, 11'd10, 4'd0, `MODE_1, `MODE_1, `MODE_1, `MODE_1, 1'd0,
+              12'd10, 12'd10, 4'd0, `MODE_1, `MODE_1, `MODE_1, `MODE_1, 1'd0
+          };
+	end
+
+	2: begin
+		assign PORT_A_ADDR = REN1_i ? (A1ADDR_TOTAL << 1) : (WEN1_i ? (B1ADDR_TOTAL << 1) : 15'd0);
+		assign PORT_B_ADDR = REN2_i ? (C1ADDR_TOTAL << 1) : (WEN2_i ? (D1ADDR_TOTAL << 1) : 15'd0);
+          defparam U1.MODE_BITS = { 1'b0,
+              11'd10, 11'd10, 4'd0, `MODE_2, `MODE_2, `MODE_2, `MODE_2, 1'd0,
+              12'd10, 12'd10, 4'd0, `MODE_2, `MODE_2, `MODE_2, `MODE_2, 1'd0
+          };
+	end
+
+	4: begin
+		assign PORT_A_ADDR = REN1_i ? (A1ADDR_TOTAL << 2) : (WEN1_i ? (B1ADDR_TOTAL << 2) : 15'd0);
+		assign PORT_B_ADDR = REN2_i ? (C1ADDR_TOTAL << 2) : (WEN2_i ? (D1ADDR_TOTAL << 2) : 15'd0);
+          defparam U1.MODE_BITS = { 1'b0,
+              11'd10, 11'd10, 4'd0, `MODE_4, `MODE_4, `MODE_4, `MODE_4, 1'd0,
+              12'd10, 12'd10, 4'd0, `MODE_4, `MODE_4, `MODE_4, `MODE_4, 1'd0
+          };
+	end
+
+	8, 9: begin
+		assign PORT_A_ADDR = REN1_i ? (A1ADDR_TOTAL << 3) : (WEN1_i ? (B1ADDR_TOTAL << 3) : 15'd0);
+		assign PORT_B_ADDR = REN2_i ? (C1ADDR_TOTAL << 3) : (WEN2_i ? (D1ADDR_TOTAL << 3) : 15'd0);
+          defparam U1.MODE_BITS = { 1'b0,
+              11'd10, 11'd10, 4'd0, `MODE_9, `MODE_9, `MODE_9, `MODE_9, 1'd0,
+              12'd10, 12'd10, 4'd0, `MODE_9, `MODE_9, `MODE_9, `MODE_9, 1'd0
+          };
+	end
+
+	16, 18: begin
+		assign PORT_A_ADDR = REN1_i ? (A1ADDR_TOTAL << 4) : (WEN1_i ? (B1ADDR_TOTAL << 4) : 15'd0);
+		assign PORT_B_ADDR = REN2_i ? (C1ADDR_TOTAL << 4) : (WEN2_i ? (D1ADDR_TOTAL << 4) : 15'd0);
+          defparam U1.MODE_BITS = { 1'b0,
+              11'd10, 11'd10, 4'd0, `MODE_18, `MODE_18, `MODE_18, `MODE_18, 1'd0,
+              12'd10, 12'd10, 4'd0, `MODE_18, `MODE_18, `MODE_18, `MODE_18, 1'd0
+          };
+	end
+
+	32, 36: begin
+		assign PORT_A_ADDR = REN1_i ? (A1ADDR_TOTAL << 5) : (WEN1_i ? (B1ADDR_TOTAL << 5) : 15'd0);
+		assign PORT_B_ADDR = REN2_i ? (C1ADDR_TOTAL << 5) : (WEN2_i ? (D1ADDR_TOTAL << 5) : 15'd0);
+          defparam U1.MODE_BITS = { 1'b0,
+              11'd10, 11'd10, 4'd0, `MODE_36, `MODE_36, `MODE_36, `MODE_36, 1'd0,
+              12'd10, 12'd10, 4'd0, `MODE_36, `MODE_36, `MODE_36, `MODE_36, 1'd0
+          };
+	end
+	default: begin
+		assign PORT_A_ADDR = REN1_i ? (A1ADDR_TOTAL << 5) : (WEN1_i ? (B1ADDR_TOTAL << 5) : 15'd0);
+		assign PORT_B_ADDR = REN2_i ? (C1ADDR_TOTAL << 5) : (WEN2_i ? (D1ADDR_TOTAL << 5) : 15'd0);
+          defparam U1.MODE_BITS = { 1'b0,
+              11'd10, 11'd10, 4'd0, `MODE_36, `MODE_36, `MODE_36, `MODE_36, 1'd0,
+              12'd10, 12'd10, 4'd0, `MODE_36, `MODE_36, `MODE_36, `MODE_36, 1'd0
+          };
+	end
+endcase
+
+assign FLUSH1 = 1'b0;
+assign FLUSH2 = 1'b0;
+
+(* is_inferred = 1 *)
+(* rd_data_width = DATA_WIDTH *)
+(* wr_data_width = DATA_WIDTH *)
+TDP36K U1 (
+	.RESET_ni(1'b1),
+	.WDATA_A1_i(B1DATA_TOTAL[17:0]),
+	.WDATA_A2_i(B1DATA_TOTAL[35:18]),
+	.RDATA_A1_o(A1DATA_TOTAL[17:0]),
+	.RDATA_A2_o(A1DATA_TOTAL[35:18]),
+	.ADDR_A1_i(PORT_A_ADDR),
+	.ADDR_A2_i(PORT_A_ADDR),
+	.CLK_A1_i(CLK1_i),
+	.CLK_A2_i(CLK1_i),
+	.REN_A1_i(REN1_i),
+	.REN_A2_i(REN1_i),
+	.WEN_A1_i(WEN1_i),
+	.WEN_A2_i(WEN1_i),
+	.BE_A1_i(WR1_BE[1:0]),
+	.BE_A2_i(WR1_BE[3:0]),
+
+	.WDATA_B1_i(D1DATA_TOTAL[17:0]),
+	.WDATA_B2_i(D1DATA_TOTAL[35:18]),
+	.RDATA_B1_o(C1DATA_TOTAL[17:0]),
+	.RDATA_B2_o(C1DATA_TOTAL[35:18]),
+	.ADDR_B1_i(PORT_B_ADDR),
+	.ADDR_B2_i(PORT_B_ADDR),
+	.CLK_B1_i(CLK2_i),
+	.CLK_B2_i(CLK2_i),
+	.REN_B1_i(REN2_i),
+	.REN_B2_i(REN2_i),
+	.WEN_B1_i(WEN2_i),
+	.WEN_B2_i(WEN2_i),
+	.BE_B1_i(WR2_BE[1:0]),
+	.BE_B2_i(WR2_BE[3:0]),
+
+	.FLUSH1_i(FLUSH1),
+	.FLUSH2_i(FLUSH2)
+);
+endmodule
+
+module DPRAM_18K_BLK (   
+    CLK1_i,
+    WEN1_i,
+    REN1_i,
+    WR1_ADDR_i,
+    RD1_ADDR_i,
+    WDATA1_i,
+    RDATA1_o,
+    
+    CLK2_i,
+    WEN2_i,
+    REN2_i,
+    WR2_ADDR_i,
+    RD2_ADDR_i,
+    WDATA2_i,
+    RDATA2_o
+);
+
+parameter ADDR_WIDTH = 10;
+parameter DATA_WIDTH = 18;
+parameter BE1_WIDTH = 2;
+parameter BE2_WIDTH = 2;
+
+input wire CLK1_i;
+input wire WEN1_i;
+input wire REN1_i;
+input wire [ADDR_WIDTH-1 :0] WR1_ADDR_i;
+input wire [ADDR_WIDTH-1 :0] RD1_ADDR_i;
+input wire [DATA_WIDTH-1 :0] WDATA1_i;
+output wire [DATA_WIDTH-1 :0] RDATA1_o;
+
+input wire CLK2_i;
+input wire WEN2_i;
+input wire REN2_i;
+input wire [ADDR_WIDTH-1 :0] WR2_ADDR_i;
+input wire [ADDR_WIDTH-1 :0] RD2_ADDR_i;
+input wire [DATA_WIDTH-1 :0] WDATA2_i;
+output wire [DATA_WIDTH-1 :0] RDATA2_o;
+
+(* is_inferred = 1 *)
+BRAM2x18_DP #(
+	.CFG_ABITS(ADDR_WIDTH),
+	.CFG_DBITS(DATA_WIDTH),
+	.CFG_ENABLE_B(BE1_WIDTH),
+	.CFG_ENABLE_D(BE2_WIDTH)
+) bram2x18_inst (
+	.A1ADDR(RD1_ADDR_i),
+	.A1DATA(RDATA1_o),
+	.A1EN(REN1_i),
+	.B1ADDR(WR1_ADDR_i),
+	.B1DATA(WDATA1_i),
+	.B1EN({WEN1_i,WEN1_i}),
+	.CLK1(CLK1_i),
+
+	.C1ADDR(RD2_ADDR_i),
+	.C1DATA(RDATA2_o),
+	.C1EN(REN2_i),
+	.D1ADDR(WR2_ADDR_i),
+	.D1DATA(WDATA2_i),
+	.D1EN({WEN2_i,WEN2_i}),
+	.CLK2(CLK2_i),
+
+	.E1ADDR(),
+	.E1DATA(),
+	.E1EN(),
+	.F1ADDR(),
+	.F1DATA(),
+	.F1EN(),
+	.CLK3(),
+
+	.G1ADDR(),
+	.G1DATA(),
+	.G1EN(),
+	.H1ADDR(),
+	.H1DATA(),
+	.H1EN(),
+	.CLK4()
+);
+endmodule
+
diff --git a/ql-qlf-plugin/qlf_k6n10f/brams_sim.v b/ql-qlf-plugin/qlf_k6n10f/brams_sim.v
new file mode 100644
index 0000000..c4ad3a7
--- /dev/null
+++ b/ql-qlf-plugin/qlf_k6n10f/brams_sim.v
@@ -0,0 +1,20075 @@
+// Copyright 2020-2022 F4PGA Authors
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+// SPDX-License-Identifier: Apache-2.0
+`timescale 1ns /10ps
+
+`default_nettype none
+
+module TDP_BRAM18 (
+    (* clkbuf_sink *)
+    input wire CLOCKA,
+    (* clkbuf_sink *)
+    input wire CLOCKB,
+    input wire READENABLEA,
+    input wire READENABLEB,
+    input wire [13:0] ADDRA,
+    input wire [13:0] ADDRB,
+    input wire [15:0] WRITEDATAA,
+    input wire [15:0] WRITEDATAB,
+    input wire [1:0] WRITEDATAAP,
+    input wire [1:0] WRITEDATABP,
+    input wire WRITEENABLEA,
+    input wire WRITEENABLEB,
+    input wire [1:0] BYTEENABLEA,
+    input wire [1:0] BYTEENABLEB,
+    //input wire [2:0] WRITEDATAWIDTHA,
+    //input wire [2:0] WRITEDATAWIDTHB,
+    //input wire [2:0] READDATAWIDTHA,
+    //input wire [2:0] READDATAWIDTHB,
+    output wire [15:0] READDATAA,
+    output wire [15:0] READDATAB,
+    output wire [1:0] READDATAAP,
+    output wire [1:0] READDATABP
+);
+    parameter INITP_00 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INITP_01 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INITP_02 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INITP_03 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INITP_04 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INITP_05 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INITP_06 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INITP_07 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_00 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_01 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_02 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_03 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_04 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_05 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_06 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_07 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_08 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_09 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_0A = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_0B = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_0C = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_0D = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_0E = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_0F = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_10 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_11 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_12 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_13 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_14 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_15 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_16 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_17 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_18 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_19 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_1A = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_1B = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_1C = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_1D = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_1E = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_1F = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_20 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_21 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_22 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_23 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_24 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_25 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_26 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_27 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_28 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_29 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_2A = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_2B = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_2C = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_2D = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_2E = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_2F = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_30 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_31 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_32 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_33 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_34 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_35 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_36 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_37 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_38 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_39 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_3A = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_3B = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_3C = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_3D = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_3E = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_3F = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter integer READ_WIDTH_A = 0;
+    parameter integer READ_WIDTH_B = 0;
+    parameter integer WRITE_WIDTH_A = 0;
+    parameter integer WRITE_WIDTH_B = 0;
+
+endmodule
+
+module TDP36K (
+    RESET_ni,
+    WEN_A1_i,
+    WEN_B1_i,
+    REN_A1_i,
+    REN_B1_i,
+    CLK_A1_i,
+    CLK_B1_i,
+    BE_A1_i,
+    BE_B1_i,
+    ADDR_A1_i,
+    ADDR_B1_i,
+    WDATA_A1_i,
+    WDATA_B1_i,
+    RDATA_A1_o,
+    RDATA_B1_o,
+    FLUSH1_i,
+    WEN_A2_i,
+    WEN_B2_i,
+    REN_A2_i,
+    REN_B2_i,
+    CLK_A2_i,
+    CLK_B2_i,
+    BE_A2_i,
+    BE_B2_i,
+    ADDR_A2_i,
+    ADDR_B2_i,
+    WDATA_A2_i,
+    WDATA_B2_i,
+    RDATA_A2_o,
+    RDATA_B2_o,
+    FLUSH2_i
+);
+    parameter [80:0] MODE_BITS = 81'd0;
+
+    // First 18K RAMFIFO (41 bits)
+    localparam [ 0:0] SYNC_FIFO1_i  = MODE_BITS[0];
+    localparam [ 2:0] RMODE_A1_i    = MODE_BITS[3 : 1];
+    localparam [ 2:0] RMODE_B1_i    = MODE_BITS[6 : 4];
+    localparam [ 2:0] WMODE_A1_i    = MODE_BITS[9 : 7];
+    localparam [ 2:0] WMODE_B1_i    = MODE_BITS[12:10];
+    localparam [ 0:0] FMODE1_i      = MODE_BITS[13];
+    localparam [ 0:0] POWERDN1_i    = MODE_BITS[14];
+    localparam [ 0:0] SLEEP1_i      = MODE_BITS[15];
+    localparam [ 0:0] PROTECT1_i    = MODE_BITS[16];
+    localparam [11:0] UPAE1_i       = MODE_BITS[28:17];
+    localparam [11:0] UPAF1_i       = MODE_BITS[40:29];
+
+    // Second 18K RAMFIFO (39 bits)
+    localparam [ 0:0] SYNC_FIFO2_i  = MODE_BITS[41];
+    localparam [ 2:0] RMODE_A2_i    = MODE_BITS[44:42];
+    localparam [ 2:0] RMODE_B2_i    = MODE_BITS[47:45];
+    localparam [ 2:0] WMODE_A2_i    = MODE_BITS[50:48];
+    localparam [ 2:0] WMODE_B2_i    = MODE_BITS[53:51];
+    localparam [ 0:0] FMODE2_i      = MODE_BITS[54];
+    localparam [ 0:0] POWERDN2_i    = MODE_BITS[55];
+    localparam [ 0:0] SLEEP2_i      = MODE_BITS[56];
+    localparam [ 0:0] PROTECT2_i    = MODE_BITS[57];
+    localparam [10:0] UPAE2_i       = MODE_BITS[68:58];
+    localparam [10:0] UPAF2_i       = MODE_BITS[79:69];
+
+    // Split (1 bit)
+    localparam [ 0:0] SPLIT_i       = MODE_BITS[80];
+
+    parameter INITP_00 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INITP_01 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INITP_02 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INITP_03 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INITP_04 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INITP_05 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INITP_06 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INITP_07 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INITP_08 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INITP_09 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INITP_0A = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INITP_0B = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INITP_0C = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INITP_0D = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INITP_0E = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INITP_0F = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_00 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_01 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_02 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_03 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_04 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_05 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_06 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_07 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_08 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_09 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_0A = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_0B = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_0C = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_0D = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_0E = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_0F = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_10 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_11 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_12 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_13 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_14 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_15 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_16 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_17 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_18 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_19 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_1A = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_1B = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_1C = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_1D = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_1E = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_1F = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_20 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_21 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_22 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_23 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_24 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_25 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_26 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_27 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_28 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_29 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_2A = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_2B = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_2C = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_2D = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_2E = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_2F = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_30 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_31 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_32 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_33 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_34 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_35 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_36 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_37 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_38 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_39 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_3A = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_3B = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_3C = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_3D = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_3E = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_3F = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_40 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_41 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_42 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_43 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_44 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_45 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_46 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_47 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_48 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_49 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_4A = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_4B = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_4C = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_4D = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_4E = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_4F = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_50 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_51 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_52 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_53 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_54 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_55 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_56 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_57 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_58 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_59 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_5A = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_5B = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_5C = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_5D = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_5E = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_5F = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_60 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_61 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_62 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_63 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_64 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_65 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_66 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_67 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_68 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_69 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_6A = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_6B = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_6C = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_6D = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_6E = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_6F = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_70 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_71 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_72 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_73 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_74 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_75 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_76 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_77 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_78 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_79 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_7A = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_7B = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_7C = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_7D = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_7E = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+    parameter INIT_7F = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+
+    input wire RESET_ni;
+    input wire WEN_A1_i;
+    input wire WEN_B1_i;
+    input wire REN_A1_i;
+    input wire REN_B1_i;
+    (* clkbuf_sink *)
+    input wire CLK_A1_i;
+    (* clkbuf_sink *)
+    input wire CLK_B1_i;
+    input wire [1:0] BE_A1_i;
+    input wire [1:0] BE_B1_i;
+    input wire [14:0] ADDR_A1_i;
+    input wire [14:0] ADDR_B1_i;
+    input wire [17:0] WDATA_A1_i;
+    input wire [17:0] WDATA_B1_i;
+    output reg [17:0] RDATA_A1_o;
+    output reg [17:0] RDATA_B1_o;
+    input wire FLUSH1_i;
+    input wire WEN_A2_i;
+    input wire WEN_B2_i;
+    input wire REN_A2_i;
+    input wire REN_B2_i;
+    (* clkbuf_sink *)
+    input wire CLK_A2_i;
+    (* clkbuf_sink *)
+    input wire CLK_B2_i;
+    input wire [1:0] BE_A2_i;
+    input wire [1:0] BE_B2_i;
+    input wire [13:0] ADDR_A2_i;
+    input wire [13:0] ADDR_B2_i;
+    input wire [17:0] WDATA_A2_i;
+    input wire [17:0] WDATA_B2_i;
+    output reg [17:0] RDATA_A2_o;
+    output reg [17:0] RDATA_B2_o;
+    input wire FLUSH2_i;
+    wire EMPTY2;
+    wire EPO2;
+    wire EWM2;
+    wire FULL2;
+    wire FMO2;
+    wire FWM2;
+    wire EMPTY1;
+    wire EPO1;
+    wire EWM1;
+    wire FULL1;
+    wire FMO1;
+    wire FWM1;
+    wire UNDERRUN1;
+    wire OVERRUN1;
+    wire UNDERRUN2;
+    wire OVERRUN2;
+    wire UNDERRUN3;
+    wire OVERRUN3;
+    wire EMPTY3;
+    wire EPO3;
+    wire EWM3;
+    wire FULL3;
+    wire FMO3;
+    wire FWM3;
+    wire ram_fmode1;
+    wire ram_fmode2;
+    wire [17:0] ram_rdata_a1;
+    wire [17:0] ram_rdata_b1;
+    wire [17:0] ram_rdata_a2;
+    wire [17:0] ram_rdata_b2;
+    reg [17:0] ram_wdata_a1;
+    reg [17:0] ram_wdata_b1;
+    reg [17:0] ram_wdata_a2;
+    reg [17:0] ram_wdata_b2;
+    reg [14:0] laddr_a1;
+    reg [14:0] laddr_b1;
+    wire [13:0] ram_addr_a1;
+    wire [13:0] ram_addr_b1;
+    wire [13:0] ram_addr_a2;
+    wire [13:0] ram_addr_b2;
+    wire smux_clk_a1;
+    wire smux_clk_b1;
+    wire smux_clk_a2;
+    wire smux_clk_b2;
+    reg [1:0] ram_be_a1;
+    reg [1:0] ram_be_a2;
+    reg [1:0] ram_be_b1;
+    reg [1:0] ram_be_b2;
+    wire [2:0] ram_rmode_a1;
+    wire [2:0] ram_wmode_a1;
+    wire [2:0] ram_rmode_b1;
+    wire [2:0] ram_wmode_b1;
+    wire [2:0] ram_rmode_a2;
+    wire [2:0] ram_wmode_a2;
+    wire [2:0] ram_rmode_b2;
+    wire [2:0] ram_wmode_b2;
+    wire ram_ren_a1;
+    wire ram_ren_b1;
+    wire ram_ren_a2;
+    wire ram_ren_b2;
+    wire ram_wen_a1;
+    wire ram_wen_b1;
+    wire ram_wen_a2;
+    wire ram_wen_b2;
+    wire ren_o;
+    wire [11:0] ff_raddr;
+    wire [11:0] ff_waddr;
+    reg [35:0] fifo_rdata;
+    wire [1:0] fifo_rmode;
+    wire [1:0] fifo_wmode;
+    wire [1:0] bwl;
+    wire [17:0] pl_dout0;
+    wire [17:0] pl_dout1;
+    wire sclk_a1;
+    wire sclk_b1;
+    wire sclk_a2;
+    wire sclk_b2;
+    wire sreset;
+    wire flush1;
+    wire flush2;
+    assign sreset = RESET_ni;
+    assign flush1 = ~FLUSH1_i;
+    assign flush2 = ~FLUSH2_i;
+    assign ram_fmode1 = FMODE1_i & SPLIT_i;
+    assign ram_fmode2 = FMODE2_i & SPLIT_i;
+    assign smux_clk_a1 = CLK_A1_i;
+    assign smux_clk_b1 = (FMODE1_i ? (SYNC_FIFO1_i ? CLK_A1_i : CLK_B1_i) : CLK_B1_i);
+    assign smux_clk_a2 = (SPLIT_i ? CLK_A2_i : CLK_A1_i);
+    assign smux_clk_b2 = (SPLIT_i ? (FMODE2_i ? (SYNC_FIFO2_i ? CLK_A2_i : CLK_B2_i) : CLK_B2_i) : (FMODE1_i ? (SYNC_FIFO1_i ? CLK_A1_i : CLK_B1_i) : CLK_B1_i));
+    assign sclk_a1 = smux_clk_a1;
+    assign sclk_a2 = smux_clk_a2;
+    assign sclk_b1 = smux_clk_b1;
+    assign sclk_b2 = smux_clk_b2;
+    assign ram_ren_a1 = (SPLIT_i ? REN_A1_i : (FMODE1_i ? 0 : REN_A1_i));
+    assign ram_ren_a2 = (SPLIT_i ? REN_A2_i : (FMODE1_i ? 0 : REN_A1_i));
+    assign ram_ren_b1 = (SPLIT_i ? REN_B1_i : (FMODE1_i ? ren_o : REN_B1_i));
+    assign ram_ren_b2 = (SPLIT_i ? REN_B2_i : (FMODE1_i ? ren_o : REN_B1_i));
+    localparam MODE_36 = 3'b011;
+    assign ram_wen_a1 = (SPLIT_i ? WEN_A1_i : (FMODE1_i ? ~FULL3 & WEN_A1_i : (WMODE_A1_i == MODE_36 ? WEN_A1_i : WEN_A1_i & ~ADDR_A1_i[4])));
+    assign ram_wen_a2 = (SPLIT_i ? WEN_A2_i : (FMODE1_i ? ~FULL3 & WEN_A1_i : (WMODE_A1_i == MODE_36 ? WEN_A1_i : WEN_A1_i & ADDR_A1_i[4])));
+    assign ram_wen_b1 = (SPLIT_i ? WEN_B1_i : (WMODE_B1_i == MODE_36 ? WEN_B1_i : WEN_B1_i & ~ADDR_B1_i[4]));
+    assign ram_wen_b2 = (SPLIT_i ? WEN_B2_i : (WMODE_B1_i == MODE_36 ? WEN_B1_i : WEN_B1_i & ADDR_B1_i[4]));
+    assign ram_addr_a1 = (SPLIT_i ? ADDR_A1_i[13:0] : (FMODE1_i ? {ff_waddr[11:2], ff_waddr[0], 3'b000} : {ADDR_A1_i[14:5], ADDR_A1_i[3:0]}));
+    assign ram_addr_b1 = (SPLIT_i ? ADDR_B1_i[13:0] : (FMODE1_i ? {ff_raddr[11:2], ff_raddr[0], 3'b000} : {ADDR_B1_i[14:5], ADDR_B1_i[3:0]}));
+    assign ram_addr_a2 = (SPLIT_i ? ADDR_A2_i[13:0] : (FMODE1_i ? {ff_waddr[11:2], ff_waddr[0], 3'b000} : {ADDR_A1_i[14:5], ADDR_A1_i[3:0]}));
+    assign ram_addr_b2 = (SPLIT_i ? ADDR_B2_i[13:0] : (FMODE1_i ? {ff_raddr[11:2], ff_raddr[0], 3'b000} : {ADDR_B1_i[14:5], ADDR_B1_i[3:0]}));
+    assign bwl = (SPLIT_i ? ADDR_A1_i[4:3] : (FMODE1_i ? ff_waddr[1:0] : ADDR_A1_i[4:3]));
+    localparam MODE_18 = 3'b010;
+    localparam MODE_9 = 3'b001;
+    always @(*) begin : WDATA_SEL
+        case (SPLIT_i)
+            1: begin
+                ram_wdata_a1 = WDATA_A1_i;
+                ram_wdata_a2 = WDATA_A2_i;
+                ram_wdata_b1 = WDATA_B1_i;
+                ram_wdata_b2 = WDATA_B2_i;
+                ram_be_a2 = BE_A2_i;
+                ram_be_b2 = BE_B2_i;
+                ram_be_a1 = BE_A1_i;
+                ram_be_b1 = BE_B1_i;
+            end
+            0: begin
+                case (WMODE_A1_i)
+                    MODE_36: begin
+                        ram_wdata_a1 = WDATA_A1_i;
+                        ram_wdata_a2 = WDATA_A2_i;
+                        ram_be_a2 = (FMODE1_i ? 2'b11 : BE_A2_i);
+                        ram_be_a1 = (FMODE1_i ? 2'b11 : BE_A1_i);
+                    end
+                    MODE_18: begin
+                        ram_wdata_a1 = WDATA_A1_i;
+                        ram_wdata_a2 = WDATA_A1_i;
+                        ram_be_a1 = (FMODE1_i ? (ff_waddr[1] ? 2'b00 : 2'b11) : BE_A1_i);
+                        ram_be_a2 = (FMODE1_i ? (ff_waddr[1] ? 2'b11 : 2'b00) : BE_A1_i);
+                    end
+                    MODE_9: begin
+                        ram_wdata_a1[7:0] = WDATA_A1_i[7:0];
+                        ram_wdata_a1[16] = WDATA_A1_i[16];
+                        ram_wdata_a1[15:8] = WDATA_A1_i[7:0];
+                        ram_wdata_a1[17] = WDATA_A1_i[16];
+                        ram_wdata_a2[7:0] = WDATA_A1_i[7:0];
+                        ram_wdata_a2[16] = WDATA_A1_i[16];
+                        ram_wdata_a2[15:8] = WDATA_A1_i[7:0];
+                        ram_wdata_a2[17] = WDATA_A1_i[16];
+                        case (bwl)
+                            0: {ram_be_a2, ram_be_a1} = 4'b0001;
+                            1: {ram_be_a2, ram_be_a1} = 4'b0010;
+                            2: {ram_be_a2, ram_be_a1} = 4'b0100;
+                            3: {ram_be_a2, ram_be_a1} = 4'b1000;
+                        endcase
+                    end
+                    default: begin
+                        ram_wdata_a1 = WDATA_A1_i;
+                        ram_wdata_a2 = WDATA_A1_i;
+                        ram_be_a2 = (FMODE1_i ? 2'b11 : BE_A1_i);
+                        ram_be_a1 = (FMODE1_i ? 2'b11 : BE_A1_i);
+                    end
+                endcase
+                case (WMODE_B1_i)
+                    MODE_36: begin
+                        ram_wdata_b1 = (FMODE1_i ? 18'b000000000000000000 : WDATA_B1_i);
+                        ram_wdata_b2 = (FMODE1_i ? 18'b000000000000000000 : WDATA_B2_i);
+                        ram_be_b2 = BE_B2_i;
+                        ram_be_b1 = BE_B1_i;
+                    end
+                    MODE_18: begin
+                        ram_wdata_b1 = (FMODE1_i ? 18'b000000000000000000 : WDATA_B1_i);
+                        ram_wdata_b2 = (FMODE1_i ? 18'b000000000000000000 : WDATA_B1_i);
+                        ram_be_b1 = BE_B1_i;
+                        ram_be_b2 = BE_B1_i;
+                    end
+                    MODE_9: begin
+                        ram_wdata_b1[7:0] = WDATA_B1_i[7:0];
+                        ram_wdata_b1[16] = WDATA_B1_i[16];
+                        ram_wdata_b1[15:8] = WDATA_B1_i[7:0];
+                        ram_wdata_b1[17] = WDATA_B1_i[16];
+                        ram_wdata_b2[7:0] = WDATA_B1_i[7:0];
+                        ram_wdata_b2[16] = WDATA_B1_i[16];
+                        ram_wdata_b2[15:8] = WDATA_B1_i[7:0];
+                        ram_wdata_b2[17] = WDATA_B1_i[16];
+                        case (ADDR_B1_i[4:3])
+                            0: {ram_be_b2, ram_be_b1} = 4'b0001;
+                            1: {ram_be_b2, ram_be_b1} = 4'b0010;
+                            2: {ram_be_b2, ram_be_b1} = 4'b0100;
+                            3: {ram_be_b2, ram_be_b1} = 4'b1000;
+                        endcase
+                    end
+                    default: begin
+                        ram_wdata_b1 = (FMODE1_i ? 18'b000000000000000000 : WDATA_B1_i);
+                        ram_wdata_b2 = (FMODE1_i ? 18'b000000000000000000 : WDATA_B1_i);
+                        ram_be_b2 = BE_B1_i;
+                        ram_be_b1 = BE_B1_i;
+                    end
+                endcase
+            end
+        endcase
+    end
+    assign ram_rmode_a1 = (SPLIT_i ? (RMODE_A1_i == MODE_36 ? MODE_18 : RMODE_A1_i) : (RMODE_A1_i == MODE_36 ? MODE_18 : RMODE_A1_i));
+    assign ram_rmode_a2 = (SPLIT_i ? (RMODE_A2_i == MODE_36 ? MODE_18 : RMODE_A2_i) : (RMODE_A1_i == MODE_36 ? MODE_18 : RMODE_A1_i));
+    assign ram_wmode_a1 = (SPLIT_i ? (WMODE_A1_i == MODE_36 ? MODE_18 : WMODE_A1_i) : (WMODE_A1_i == MODE_36 ? MODE_18 : (FMODE1_i ? MODE_18 : WMODE_A1_i)));
+    assign ram_wmode_a2 = (SPLIT_i ? (WMODE_A2_i == MODE_36 ? MODE_18 : WMODE_A2_i) : (WMODE_A1_i == MODE_36 ? MODE_18 : (FMODE1_i ? MODE_18 : WMODE_A1_i)));
+    assign ram_rmode_b1 = (SPLIT_i ? (RMODE_B1_i == MODE_36 ? MODE_18 : RMODE_B1_i) : (RMODE_B1_i == MODE_36 ? MODE_18 : (FMODE1_i ? MODE_18 : RMODE_B1_i)));
+    assign ram_rmode_b2 = (SPLIT_i ? (RMODE_B2_i == MODE_36 ? MODE_18 : RMODE_B2_i) : (RMODE_B1_i == MODE_36 ? MODE_18 : (FMODE1_i ? MODE_18 : RMODE_B1_i)));
+    assign ram_wmode_b1 = (SPLIT_i ? (WMODE_B1_i == MODE_36 ? MODE_18 : WMODE_B1_i) : (WMODE_B1_i == MODE_36 ? MODE_18 : WMODE_B1_i));
+    assign ram_wmode_b2 = (SPLIT_i ? (WMODE_B2_i == MODE_36 ? MODE_18 : WMODE_B2_i) : (WMODE_B1_i == MODE_36 ? MODE_18 : WMODE_B1_i));
+    always @(*) begin : FIFO_READ_SEL
+        case (RMODE_B1_i)
+            MODE_36: fifo_rdata = {ram_rdata_b2[17:16], ram_rdata_b1[17:16], ram_rdata_b2[15:0], ram_rdata_b1[15:0]};
+            MODE_18: fifo_rdata = (ff_raddr[1] ? {18'b000000000000000000, ram_rdata_b2} : {18'b000000000000000000, ram_rdata_b1});
+            MODE_9:
+                case (ff_raddr[1:0])
+                    0: fifo_rdata = {19'b0000000000000000000, ram_rdata_b1[16], 8'b00000000, ram_rdata_b1[7:0]};
+                    1: fifo_rdata = {19'b0000000000000000000, ram_rdata_b1[17], 8'b00000000, ram_rdata_b1[15:8]};
+                    2: fifo_rdata = {19'b0000000000000000000, ram_rdata_b2[16], 8'b00000000, ram_rdata_b2[7:0]};
+                    3: fifo_rdata = {19'b0000000000000000000, ram_rdata_b2[17], 8'b00000000, ram_rdata_b2[15:8]};
+                endcase
+            default: fifo_rdata = {ram_rdata_b2, ram_rdata_b1};
+        endcase
+    end
+    localparam MODE_1 = 3'b101;
+    localparam MODE_2 = 3'b110;
+    localparam MODE_4 = 3'b100;
+    always @(*) begin : RDATA_SEL
+        case (SPLIT_i)
+            1: begin
+                RDATA_A1_o = (FMODE1_i ? {10'b0000000000, EMPTY1, EPO1, EWM1, UNDERRUN1, FULL1, FMO1, FWM1, OVERRUN1} : ram_rdata_a1);
+                RDATA_B1_o = ram_rdata_b1;
+                RDATA_A2_o = (FMODE2_i ? {10'b0000000000, EMPTY2, EPO2, EWM2, UNDERRUN2, FULL2, FMO2, FWM2, OVERRUN2} : ram_rdata_a2);
+                RDATA_B2_o = ram_rdata_b2;
+            end
+            0: begin
+                if (FMODE1_i) begin
+                    RDATA_A1_o = {10'b0000000000, EMPTY3, EPO3, EWM3, UNDERRUN3, FULL3, FMO3, FWM3, OVERRUN3};
+                    RDATA_A2_o = 18'b000000000000000000;
+                end
+                else
+                    case (RMODE_A1_i)
+                        MODE_36: begin
+                            RDATA_A1_o = {ram_rdata_a1[17:0]};
+                            RDATA_A2_o = {ram_rdata_a2[17:0]};
+                        end
+                        MODE_18: begin
+                            RDATA_A1_o = (laddr_a1[4] ? ram_rdata_a2 : ram_rdata_a1);
+                            RDATA_A2_o = 18'b000000000000000000;
+                        end
+                        MODE_9: begin
+                            RDATA_A1_o = (laddr_a1[4] ? {{2 {ram_rdata_a2[16]}}, {2 {ram_rdata_a2[7:0]}}} : {{2 {ram_rdata_a1[16]}}, {2 {ram_rdata_a1[7:0]}}});
+                            RDATA_A2_o = 18'b000000000000000000;
+                        end
+                        MODE_4: begin
+                            RDATA_A2_o = 18'b000000000000000000;
+                            RDATA_A1_o[17:4] = 14'b00000000000000;
+                            RDATA_A1_o[3:0] = (laddr_a1[4] ? ram_rdata_a2[3:0] : ram_rdata_a1[3:0]);
+                        end
+                        MODE_2: begin
+                            RDATA_A2_o = 18'b000000000000000000;
+                            RDATA_A1_o[17:2] = 16'b0000000000000000;
+                            RDATA_A1_o[1:0] = (laddr_a1[4] ? ram_rdata_a2[1:0] : ram_rdata_a1[1:0]);
+                        end
+                        MODE_1: begin
+                            RDATA_A2_o = 18'b000000000000000000;
+                            RDATA_A1_o[17:1] = 17'b00000000000000000;
+                            RDATA_A1_o[0] = (laddr_a1[4] ? ram_rdata_a2[0] : ram_rdata_a1[0]);
+                        end
+                        default: begin
+                            RDATA_A1_o = {ram_rdata_a2[1:0], ram_rdata_a1[15:0]};
+                            RDATA_A2_o = {ram_rdata_a2[17:16], ram_rdata_a1[17:16], ram_rdata_a2[15:2]};
+                        end
+                    endcase
+                case (RMODE_B1_i)
+                    MODE_36: begin
+                        RDATA_B1_o = {ram_rdata_b1};
+                        RDATA_B2_o = {ram_rdata_b2};
+                    end
+                    MODE_18: begin
+                        RDATA_B1_o = (FMODE1_i ? fifo_rdata[17:0] : (laddr_b1[4] ? ram_rdata_b2 : ram_rdata_b1));
+                        RDATA_B2_o = 18'b000000000000000000;
+                    end
+                    MODE_9: begin
+                        RDATA_B1_o = (FMODE1_i ? {fifo_rdata[17:0]} : (laddr_b1[4] ? {1'b0, ram_rdata_b2[16], 8'b00000000, ram_rdata_b2[7:0]} : {1'b0, ram_rdata_b1[16], 8'b00000000, ram_rdata_b1[7:0]}));
+                        RDATA_B2_o = 18'b000000000000000000;
+                    end
+                    MODE_4: begin
+                        RDATA_B2_o = 18'b000000000000000000;
+                        RDATA_B1_o[17:4] = 14'b00000000000000;
+                        RDATA_B1_o[3:0] = (laddr_b1[4] ? ram_rdata_b2[3:0] : ram_rdata_b1[3:0]);
+                    end
+                    MODE_2: begin
+                        RDATA_B2_o = 18'b000000000000000000;
+                        RDATA_B1_o[17:2] = 16'b0000000000000000;
+                        RDATA_B1_o[1:0] = (laddr_b1[4] ? ram_rdata_b2[1:0] : ram_rdata_b1[1:0]);
+                    end
+                    MODE_1: begin
+                        RDATA_B2_o = 18'b000000000000000000;
+                        RDATA_B1_o[17:1] = 17'b00000000000000000;
+                        RDATA_B1_o[0] = (laddr_b1[4] ? ram_rdata_b2[0] : ram_rdata_b1[0]);
+                    end
+                    default: begin
+                        RDATA_B1_o = ram_rdata_b1;
+                        RDATA_B2_o = ram_rdata_b2;
+                    end
+                endcase
+            end
+        endcase
+    end
+    always @(posedge sclk_a1 or negedge sreset)
+        if (sreset == 0)
+            laddr_a1 <= 1'sb0;
+        else
+            laddr_a1 <= ADDR_A1_i;
+    always @(posedge sclk_b1 or negedge sreset)
+        if (sreset == 0)
+            laddr_b1 <= 1'sb0;
+        else
+            laddr_b1 <= ADDR_B1_i;
+    assign fifo_wmode = ((WMODE_A1_i == MODE_36) ? 2'b00 : ((WMODE_A1_i == MODE_18) ? 2'b01 : ((WMODE_A1_i == MODE_9) ? 2'b10 : 2'b00)));
+    assign fifo_rmode = ((RMODE_B1_i == MODE_36) ? 2'b00 : ((RMODE_B1_i == MODE_18) ? 2'b01 : ((RMODE_B1_i == MODE_9) ? 2'b10 : 2'b00)));
+    fifo_ctl #(
+        .ADDR_WIDTH(12),
+        .FIFO_WIDTH(3'd4),
+        .DEPTH(7)
+    ) fifo36_ctl(
+        .rclk(sclk_b1),
+        .rst_R_n(flush1),
+        .wclk(sclk_a1),
+        .rst_W_n(flush1),
+        .ren(REN_B1_i),
+        .wen(ram_wen_a1),
+        .sync(SYNC_FIFO1_i),
+        .rmode(fifo_rmode),
+        .wmode(fifo_wmode),
+        .ren_o(ren_o),
+        .fflags({FULL3, FMO3, FWM3, OVERRUN3, EMPTY3, EPO3, EWM3, UNDERRUN3}),
+        .raddr(ff_raddr),
+        .waddr(ff_waddr),
+        .upaf(UPAF1_i),
+        .upae(UPAE1_i)
+    );
+    TDP18K_FIFO #(
+        .UPAF_i(UPAF1_i[10:0]),
+        .UPAE_i(UPAE1_i[10:0]),
+        .SYNC_FIFO_i(SYNC_FIFO1_i),
+        .POWERDN_i(POWERDN1_i),
+        .SLEEP_i(SLEEP1_i),
+        .PROTECT_i(PROTECT1_i)
+    )u1(
+        .RMODE_A_i(ram_rmode_a1),
+        .RMODE_B_i(ram_rmode_b1),
+        .WMODE_A_i(ram_wmode_a1),
+        .WMODE_B_i(ram_wmode_b1),
+        .WEN_A_i(ram_wen_a1),
+        .WEN_B_i(ram_wen_b1),
+        .REN_A_i(ram_ren_a1),
+        .REN_B_i(ram_ren_b1),
+        .CLK_A_i(sclk_a1),
+        .CLK_B_i(sclk_b1),
+        .BE_A_i(ram_be_a1),
+        .BE_B_i(ram_be_b1),
+        .ADDR_A_i(ram_addr_a1),
+        .ADDR_B_i(ram_addr_b1),
+        .WDATA_A_i(ram_wdata_a1),
+        .WDATA_B_i(ram_wdata_b1),
+        .RDATA_A_o(ram_rdata_a1),
+        .RDATA_B_o(ram_rdata_b1),
+        .EMPTY_o(EMPTY1),
+        .EPO_o(EPO1),
+        .EWM_o(EWM1),
+        .UNDERRUN_o(UNDERRUN1),
+        .FULL_o(FULL1),
+        .FMO_o(FMO1),
+        .FWM_o(FWM1),
+        .OVERRUN_o(OVERRUN1),
+        .FLUSH_ni(flush1),
+        .FMODE_i(ram_fmode1)
+    );
+    TDP18K_FIFO #(
+        .UPAF_i(UPAF2_i),
+        .UPAE_i(UPAE2_i),
+        .SYNC_FIFO_i(SYNC_FIFO2_i),
+        .POWERDN_i(POWERDN2_i),
+        .SLEEP_i(SLEEP2_i),
+        .PROTECT_i(PROTECT2_i)
+    )u2(
+        .RMODE_A_i(ram_rmode_a2),
+        .RMODE_B_i(ram_rmode_b2),
+        .WMODE_A_i(ram_wmode_a2),
+        .WMODE_B_i(ram_wmode_b2),
+        .WEN_A_i(ram_wen_a2),
+        .WEN_B_i(ram_wen_b2),
+        .REN_A_i(ram_ren_a2),
+        .REN_B_i(ram_ren_b2),
+        .CLK_A_i(sclk_a2),
+        .CLK_B_i(sclk_b2),
+        .BE_A_i(ram_be_a2),
+        .BE_B_i(ram_be_b2),
+        .ADDR_A_i(ram_addr_a2),
+        .ADDR_B_i(ram_addr_b2),
+        .WDATA_A_i(ram_wdata_a2),
+        .WDATA_B_i(ram_wdata_b2),
+        .RDATA_A_o(ram_rdata_a2),
+        .RDATA_B_o(ram_rdata_b2),
+        .EMPTY_o(EMPTY2),
+        .EPO_o(EPO2),
+        .EWM_o(EWM2),
+        .UNDERRUN_o(UNDERRUN2),
+        .FULL_o(FULL2),
+        .FMO_o(FMO2),
+        .FWM_o(FWM2),
+        .OVERRUN_o(OVERRUN2),
+        .FLUSH_ni(flush2),
+        .FMODE_i(ram_fmode2)
+    );
+endmodule
+
+module BRAM2x18_TDP (A1ADDR, A1DATA, A1EN, B1ADDR, B1DATA, B1EN, C1ADDR, C1DATA, C1EN, CLK1, CLK2, CLK3, CLK4, D1ADDR, D1DATA, D1EN, E1ADDR, E1DATA, E1EN, F1ADDR, F1DATA, F1EN, G1ADDR, G1DATA, G1EN, H1ADDR, H1DATA, H1EN);
+    parameter CFG_ABITS = 11;
+    parameter CFG_DBITS = 18;
+    parameter CFG_ENABLE_B = 4;
+    parameter CFG_ENABLE_D = 4;
+    parameter CFG_ENABLE_F = 4;
+    parameter CFG_ENABLE_H = 4;
+
+    parameter CLKPOL2 = 1;
+    parameter CLKPOL3 = 1;
+    parameter [18431:0] INIT0 = 18432'bx;
+    parameter [18431:0] INIT1 = 18432'bx;
+
+    localparam MODE_36 = 3'b011; // 36- or 32-bit
+    localparam MODE_18 = 3'b010; // 18- or 16-bit
+    localparam MODE_9 = 3'b001; // 9- or 8-bit
+    localparam MODE_4 = 3'b100; // 4-bit
+    localparam MODE_2 = 3'b110; // 2-bit
+    localparam MODE_1 = 3'b101; // 1-bit
+
+    input wire CLK1;
+    input wire CLK2;
+    input wire CLK3;
+    input wire CLK4;
+
+    input  wire [CFG_ABITS-1:0] A1ADDR;
+    output wire [CFG_DBITS-1:0] A1DATA;
+    input  wire A1EN;
+
+    input  wire [CFG_ABITS-1:0] B1ADDR;
+    input  wire [CFG_DBITS-1:0] B1DATA;
+    input  wire [CFG_ENABLE_B-1:0] B1EN;
+
+    input  wire [CFG_ABITS-1:0] C1ADDR;
+    output wire [CFG_DBITS-1:0] C1DATA;
+    input  wire C1EN;
+
+    input  wire [CFG_ABITS-1:0] D1ADDR;
+    input  wire [CFG_DBITS-1:0] D1DATA;
+    input  wire [CFG_ENABLE_D-1:0] D1EN;
+
+    input  wire [CFG_ABITS-1:0] E1ADDR;
+    output wire [CFG_DBITS-1:0] E1DATA;
+    input  wire E1EN;
+
+    input  wire [CFG_ABITS-1:0] F1ADDR;
+    input  wire [CFG_DBITS-1:0] F1DATA;
+    input  wire [CFG_ENABLE_F-1:0] F1EN;
+
+    input  wire [CFG_ABITS-1:0] G1ADDR;
+    output wire [CFG_DBITS-1:0] G1DATA;
+    input  wire G1EN;
+
+    input  wire [CFG_ABITS-1:0] H1ADDR;
+    input  wire [CFG_DBITS-1:0] H1DATA;
+    input  wire [CFG_ENABLE_H-1:0] H1EN;
+
+    wire FLUSH1;
+    wire FLUSH2;
+    wire SPLIT;
+
+    wire [13:CFG_ABITS] A1ADDR_CMPL = {14-CFG_ABITS{1'b0}};
+    wire [13:CFG_ABITS] B1ADDR_CMPL = {14-CFG_ABITS{1'b0}};
+    wire [13:CFG_ABITS] C1ADDR_CMPL = {14-CFG_ABITS{1'b0}};
+    wire [13:CFG_ABITS] D1ADDR_CMPL = {14-CFG_ABITS{1'b0}};
+    wire [13:CFG_ABITS] E1ADDR_CMPL = {14-CFG_ABITS{1'b0}};
+    wire [13:CFG_ABITS] F1ADDR_CMPL = {14-CFG_ABITS{1'b0}};
+    wire [13:CFG_ABITS] G1ADDR_CMPL = {14-CFG_ABITS{1'b0}};
+    wire [13:CFG_ABITS] H1ADDR_CMPL = {14-CFG_ABITS{1'b0}};
+
+    wire [13:0] A1ADDR_TOTAL = {A1ADDR_CMPL, A1ADDR};
+    wire [13:0] B1ADDR_TOTAL = {B1ADDR_CMPL, B1ADDR};
+    wire [13:0] C1ADDR_TOTAL = {C1ADDR_CMPL, C1ADDR};
+    wire [13:0] D1ADDR_TOTAL = {D1ADDR_CMPL, D1ADDR};
+    wire [13:0] E1ADDR_TOTAL = {E1ADDR_CMPL, E1ADDR};
+    wire [13:0] F1ADDR_TOTAL = {F1ADDR_CMPL, F1ADDR};
+    wire [13:0] G1ADDR_TOTAL = {G1ADDR_CMPL, G1ADDR};
+    wire [13:0] H1ADDR_TOTAL = {H1ADDR_CMPL, H1ADDR};
+
+    wire [17:CFG_DBITS] A1_RDATA_CMPL;
+    wire [17:CFG_DBITS] C1_RDATA_CMPL;
+    wire [17:CFG_DBITS] E1_RDATA_CMPL;
+    wire [17:CFG_DBITS] G1_RDATA_CMPL;
+
+    wire [17:CFG_DBITS] B1_WDATA_CMPL;
+    wire [17:CFG_DBITS] D1_WDATA_CMPL;
+    wire [17:CFG_DBITS] F1_WDATA_CMPL;
+    wire [17:CFG_DBITS] H1_WDATA_CMPL;
+
+    wire [13:0] PORT_A1_ADDR;
+    wire [13:0] PORT_A2_ADDR;
+    wire [13:0] PORT_B1_ADDR;
+    wire [13:0] PORT_B2_ADDR;
+
+    case (CFG_DBITS)
+        1: begin
+            assign PORT_A1_ADDR = A1EN ? A1ADDR_TOTAL : (B1EN ? B1ADDR_TOTAL : 14'd0);
+            assign PORT_B1_ADDR = C1EN ? C1ADDR_TOTAL : (D1EN ? D1ADDR_TOTAL : 14'd0);
+            assign PORT_A2_ADDR = E1EN ? E1ADDR_TOTAL : (F1EN ? F1ADDR_TOTAL : 14'd0);
+            assign PORT_B2_ADDR = G1EN ? G1ADDR_TOTAL : (H1EN ? H1ADDR_TOTAL : 14'd0);
+            defparam bram_2x18k.MODE_BITS = { 1'b1,
+                11'd10, 11'd10, 4'd0, MODE_1, MODE_1, MODE_1, MODE_1, 1'd0,
+                12'd10, 12'd10, 4'd0, MODE_1, MODE_1, MODE_1, MODE_1, 1'd0
+            };
+        end
+
+        2: begin
+            assign PORT_A1_ADDR = A1EN ? (A1ADDR_TOTAL << 1) : (B1EN ? (B1ADDR_TOTAL << 1) : 14'd0);
+            assign PORT_B1_ADDR = C1EN ? (C1ADDR_TOTAL << 1) : (D1EN ? (D1ADDR_TOTAL << 1) : 14'd0);
+            assign PORT_A2_ADDR = E1EN ? (E1ADDR_TOTAL << 1) : (F1EN ? (F1ADDR_TOTAL << 1) : 14'd0);
+            assign PORT_B2_ADDR = G1EN ? (G1ADDR_TOTAL << 1) : (H1EN ? (H1ADDR_TOTAL << 1) : 14'd0);
+            defparam bram_2x18k.MODE_BITS = { 1'b1,
+                11'd10, 11'd10, 4'd0, MODE_2, MODE_2, MODE_2, MODE_2, 1'd0,
+                12'd10, 12'd10, 4'd0, MODE_2, MODE_2, MODE_2, MODE_2, 1'd0
+            };
+        end
+
+        4: begin
+            assign PORT_A1_ADDR = A1EN ? (A1ADDR_TOTAL << 2) : (B1EN ? (B1ADDR_TOTAL << 2) : 14'd0);
+            assign PORT_B1_ADDR = C1EN ? (C1ADDR_TOTAL << 2) : (D1EN ? (D1ADDR_TOTAL << 2) : 14'd0);
+            assign PORT_A2_ADDR = E1EN ? (E1ADDR_TOTAL << 2) : (F1EN ? (F1ADDR_TOTAL << 2) : 14'd0);
+            assign PORT_B2_ADDR = G1EN ? (G1ADDR_TOTAL << 2) : (H1EN ? (H1ADDR_TOTAL << 2) : 14'd0);
+            defparam bram_2x18k.MODE_BITS = { 1'b1,
+                11'd10, 11'd10, 4'd0, MODE_4, MODE_4, MODE_4, MODE_4, 1'd0,
+                12'd10, 12'd10, 4'd0, MODE_4, MODE_4, MODE_4, MODE_4, 1'd0
+            };
+        end
+
+        8, 9: begin
+            assign PORT_A1_ADDR = A1EN ? (A1ADDR_TOTAL << 3) : (B1EN ? (B1ADDR_TOTAL << 3) : 14'd0);
+            assign PORT_B1_ADDR = C1EN ? (C1ADDR_TOTAL << 3) : (D1EN ? (D1ADDR_TOTAL << 3) : 14'd0);
+            assign PORT_A2_ADDR = E1EN ? (E1ADDR_TOTAL << 3) : (F1EN ? (F1ADDR_TOTAL << 3) : 14'd0);
+            assign PORT_B2_ADDR = G1EN ? (G1ADDR_TOTAL << 3) : (H1EN ? (H1ADDR_TOTAL << 3) : 14'd0);
+            defparam bram_2x18k.MODE_BITS = { 1'b1,
+                11'd10, 11'd10, 4'd0, MODE_9, MODE_9, MODE_9, MODE_9, 1'd0,
+                12'd10, 12'd10, 4'd0, MODE_9, MODE_9, MODE_9, MODE_9, 1'd0
+            };
+        end
+
+        16, 18: begin
+            assign PORT_A1_ADDR = A1EN ? (A1ADDR_TOTAL << 4) : (B1EN ? (B1ADDR_TOTAL << 4) : 14'd0);
+            assign PORT_B1_ADDR = C1EN ? (C1ADDR_TOTAL << 4) : (D1EN ? (D1ADDR_TOTAL << 4) : 14'd0);
+            assign PORT_A2_ADDR = E1EN ? (E1ADDR_TOTAL << 4) : (F1EN ? (F1ADDR_TOTAL << 4) : 14'd0);
+            assign PORT_B2_ADDR = G1EN ? (G1ADDR_TOTAL << 4) : (H1EN ? (H1ADDR_TOTAL << 4) : 14'd0);
+            defparam bram_2x18k.MODE_BITS = { 1'b1,
+                11'd10, 11'd10, 4'd0, MODE_18, MODE_18, MODE_18, MODE_18, 1'd0,
+                12'd10, 12'd10, 4'd0, MODE_18, MODE_18, MODE_18, MODE_18, 1'd0
+            };
+        end
+
+        default: begin
+            assign PORT_A1_ADDR = A1EN ? A1ADDR_TOTAL : (B1EN ? B1ADDR_TOTAL : 14'd0);
+            assign PORT_B1_ADDR = C1EN ? C1ADDR_TOTAL : (D1EN ? D1ADDR_TOTAL : 14'd0);
+            assign PORT_A2_ADDR = E1EN ? E1ADDR_TOTAL : (F1EN ? F1ADDR_TOTAL : 14'd0);
+            assign PORT_B2_ADDR = G1EN ? G1ADDR_TOTAL : (H1EN ? H1ADDR_TOTAL : 14'd0);
+            defparam bram_2x18k.MODE_BITS = { 1'b1,
+                11'd10, 11'd10, 4'd0, MODE_36, MODE_36, MODE_36, MODE_36, 1'd0,
+                12'd10, 12'd10, 4'd0, MODE_36, MODE_36, MODE_36, MODE_36, 1'd0
+            };
+        end
+    endcase
+
+    assign FLUSH1 = 1'b0;
+    assign FLUSH2 = 1'b0;
+
+    wire [17:0] PORT_A1_RDATA = {A1_RDATA_CMPL, A1DATA};
+    wire [17:0] PORT_B1_RDATA = {C1_RDATA_CMPL, C1DATA};
+    wire [17:0] PORT_A2_RDATA = {E1_RDATA_CMPL, E1DATA};
+    wire [17:0] PORT_B2_RDATA = {G1_RDATA_CMPL, G1DATA};
+
+    wire [17:0] PORT_A1_WDATA = {B1_WDATA_CMPL, B1DATA};
+    wire [17:0] PORT_B1_WDATA = {D1_WDATA_CMPL, D1DATA};
+    wire [17:0] PORT_A2_WDATA = {F1_WDATA_CMPL, F1DATA};
+    wire [17:0] PORT_B2_WDATA = {H1_WDATA_CMPL, H1DATA};
+
+    wire PORT_A1_CLK = CLK1;
+    wire PORT_A2_CLK = CLK3;
+    wire PORT_B1_CLK = CLK2;
+    wire PORT_B2_CLK = CLK4;
+
+    wire PORT_A1_REN = A1EN;
+    wire PORT_A1_WEN = B1EN[0];
+    wire [CFG_ENABLE_B-1:0] PORT_A1_BE = {B1EN[1],B1EN[0]};
+
+    wire PORT_A2_REN = E1EN;
+    wire PORT_A2_WEN = F1EN[0];
+    wire [CFG_ENABLE_F-1:0] PORT_A2_BE = {F1EN[1],F1EN[0]};
+
+    wire PORT_B1_REN = C1EN;
+    wire PORT_B1_WEN = D1EN[0];
+    wire [CFG_ENABLE_D-1:0] PORT_B1_BE = {D1EN[1],D1EN[0]};
+
+    wire PORT_B2_REN = G1EN;
+    wire PORT_B2_WEN = H1EN[0];
+    wire [CFG_ENABLE_H-1:0] PORT_B2_BE = {H1EN[1],H1EN[0]};
+
+    TDP36K bram_2x18k (
+        .WDATA_A1_i(PORT_A1_WDATA),
+        .RDATA_A1_o(PORT_A1_RDATA),
+        .ADDR_A1_i(PORT_A1_ADDR),
+        .CLK_A1_i(PORT_A1_CLK),
+        .REN_A1_i(PORT_A1_REN),
+        .WEN_A1_i(PORT_A1_WEN),
+        .BE_A1_i(PORT_A1_BE),
+
+        .WDATA_A2_i(PORT_A2_WDATA),
+        .RDATA_A2_o(PORT_A2_RDATA),
+        .ADDR_A2_i(PORT_A2_ADDR),
+        .CLK_A2_i(PORT_A2_CLK),
+        .REN_A2_i(PORT_A2_REN),
+        .WEN_A2_i(PORT_A2_WEN),
+        .BE_A2_i(PORT_A2_BE),
+
+        .WDATA_B1_i(PORT_B1_WDATA),
+        .RDATA_B1_o(PORT_B1_RDATA),
+        .ADDR_B1_i(PORT_B1_ADDR),
+        .CLK_B1_i(PORT_B1_CLK),
+        .REN_B1_i(PORT_B1_REN),
+        .WEN_B1_i(PORT_B1_WEN),
+        .BE_B1_i(PORT_B1_BE),
+
+        .WDATA_B2_i(PORT_B2_WDATA),
+        .RDATA_B2_o(PORT_B2_RDATA),
+        .ADDR_B2_i(PORT_B2_ADDR),
+        .CLK_B2_i(PORT_B2_CLK),
+        .REN_B2_i(PORT_B2_REN),
+        .WEN_B2_i(PORT_B2_WEN),
+        .BE_B2_i(PORT_B2_BE),
+
+        .FLUSH1_i(FLUSH1),
+        .FLUSH2_i(FLUSH2)
+    );
+endmodule
+
+module BRAM2x18_SDP (A1ADDR, A1DATA, A1EN, B1ADDR, B1DATA, B1EN, C1ADDR, C1DATA, C1EN, CLK1, CLK2, D1ADDR, D1DATA, D1EN);
+    parameter CFG_ABITS = 11;
+    parameter CFG_DBITS = 18;
+    parameter CFG_ENABLE_B = 4;
+    parameter CFG_ENABLE_D = 4;
+
+    parameter CLKPOL2 = 1;
+    parameter CLKPOL3 = 1;
+    parameter [18431:0] INIT0 = 18432'bx;
+    parameter [18431:0] INIT1 = 18432'bx;
+
+    localparam MODE_36 = 3'b011; // 36- or 32-bit
+    localparam MODE_18 = 3'b010; // 18- or 16-bit
+    localparam MODE_9 = 3'b001; // 9- or 8-bit
+    localparam MODE_4 = 3'b100; // 4-bit
+    localparam MODE_2 = 3'b110; // 2-bit
+    localparam MODE_1 = 3'b101; // 1-bit
+
+    input  wire CLK1;
+    input  wire CLK2;
+
+    input  wire [CFG_ABITS-1:0] A1ADDR;
+    output wire [CFG_DBITS-1:0] A1DATA;
+    input  wire A1EN;
+
+    input  wire [CFG_ABITS-1:0] B1ADDR;
+    input  wire [CFG_DBITS-1:0] B1DATA;
+    input  wire [CFG_ENABLE_B-1:0] B1EN;
+
+    input  wire [CFG_ABITS-1:0] C1ADDR;
+    output wire [CFG_DBITS-1:0] C1DATA;
+    input  wire C1EN;
+
+    input  wire [CFG_ABITS-1:0] D1ADDR;
+    input  wire [CFG_DBITS-1:0] D1DATA;
+    input  wire [CFG_ENABLE_D-1:0] D1EN;
+
+    wire FLUSH1;
+    wire FLUSH2;
+
+    wire [13:CFG_ABITS] A1ADDR_CMPL = {14-CFG_ABITS{1'b0}};
+    wire [13:CFG_ABITS] B1ADDR_CMPL = {14-CFG_ABITS{1'b0}};
+    wire [13:CFG_ABITS] C1ADDR_CMPL = {14-CFG_ABITS{1'b0}};
+    wire [13:CFG_ABITS] D1ADDR_CMPL = {14-CFG_ABITS{1'b0}};
+
+    wire [13:0] A1ADDR_TOTAL = {A1ADDR_CMPL, A1ADDR};
+    wire [13:0] B1ADDR_TOTAL = {B1ADDR_CMPL, B1ADDR};
+    wire [13:0] C1ADDR_TOTAL = {C1ADDR_CMPL, C1ADDR};
+    wire [13:0] D1ADDR_TOTAL = {D1ADDR_CMPL, D1ADDR};
+
+    wire [17:CFG_DBITS] A1_RDATA_CMPL;
+    wire [17:CFG_DBITS] C1_RDATA_CMPL;
+
+    wire [17:CFG_DBITS] B1_WDATA_CMPL;
+    wire [17:CFG_DBITS] D1_WDATA_CMPL;
+
+    wire [13:0] PORT_A1_ADDR;
+    wire [13:0] PORT_A2_ADDR;
+    wire [13:0] PORT_B1_ADDR;
+    wire [13:0] PORT_B2_ADDR;
+
+    case (CFG_DBITS)
+        1: begin
+            assign PORT_A1_ADDR = A1ADDR_TOTAL;
+            assign PORT_B1_ADDR = B1ADDR_TOTAL;
+            assign PORT_A2_ADDR = C1ADDR_TOTAL;
+            assign PORT_B2_ADDR = D1ADDR_TOTAL;
+            defparam bram_2x18k.MODE_BITS = { 1'b1,
+                11'd10, 11'd10, 4'd0, MODE_1, MODE_1, MODE_1, MODE_1, 1'd0,
+                12'd10, 12'd10, 4'd0, MODE_1, MODE_1, MODE_1, MODE_1, 1'd0
+            };
+        end
+
+        2: begin
+            assign PORT_A1_ADDR = A1ADDR_TOTAL << 1;
+            assign PORT_B1_ADDR = B1ADDR_TOTAL << 1;
+            assign PORT_A2_ADDR = C1ADDR_TOTAL << 1;
+            assign PORT_B2_ADDR = D1ADDR_TOTAL << 1;
+            defparam bram_2x18k.MODE_BITS = { 1'b1,
+                11'd10, 11'd10, 4'd0, MODE_2, MODE_2, MODE_2, MODE_2, 1'd0,
+                12'd10, 12'd10, 4'd0, MODE_2, MODE_2, MODE_2, MODE_2, 1'd0
+            };
+        end
+
+        4: begin
+            assign PORT_A1_ADDR = A1ADDR_TOTAL << 2;
+            assign PORT_B1_ADDR = B1ADDR_TOTAL << 2;
+            assign PORT_A2_ADDR = C1ADDR_TOTAL << 2;
+            assign PORT_B2_ADDR = D1ADDR_TOTAL << 2;
+            defparam bram_2x18k.MODE_BITS = { 1'b1,
+                11'd10, 11'd10, 4'd0, MODE_4, MODE_4, MODE_4, MODE_4, 1'd0,
+                12'd10, 12'd10, 4'd0, MODE_4, MODE_4, MODE_4, MODE_4, 1'd0
+            };
+        end
+
+        8, 9: begin
+            assign PORT_A1_ADDR = A1ADDR_TOTAL << 3;
+            assign PORT_B1_ADDR = B1ADDR_TOTAL << 3;
+            assign PORT_A2_ADDR = C1ADDR_TOTAL << 3;
+            assign PORT_B2_ADDR = D1ADDR_TOTAL << 3;
+            defparam bram_2x18k.MODE_BITS = { 1'b1,
+                11'd10, 11'd10, 4'd0, MODE_9, MODE_9, MODE_9, MODE_9, 1'd0,
+                12'd10, 12'd10, 4'd0, MODE_9, MODE_9, MODE_9, MODE_9, 1'd0
+            };
+        end
+
+        16, 18: begin
+            assign PORT_A1_ADDR = A1ADDR_TOTAL << 4;
+            assign PORT_B1_ADDR = B1ADDR_TOTAL << 4;
+            assign PORT_A2_ADDR = C1ADDR_TOTAL << 4;
+            assign PORT_B2_ADDR = D1ADDR_TOTAL << 4;
+            defparam bram_2x18k.MODE_BITS = { 1'b1,
+                11'd10, 11'd10, 4'd0, MODE_18, MODE_18, MODE_18, MODE_18, 1'd0,
+                12'd10, 12'd10, 4'd0, MODE_18, MODE_18, MODE_18, MODE_18, 1'd0
+            };
+        end
+
+        default: begin
+            assign PORT_A1_ADDR = A1ADDR_TOTAL;
+            assign PORT_B1_ADDR = B1ADDR_TOTAL;
+            assign PORT_A2_ADDR = D1ADDR_TOTAL;
+            assign PORT_B2_ADDR = C1ADDR_TOTAL;
+            defparam bram_2x18k.MODE_BITS = { 1'b1,
+                11'd10, 11'd10, 4'd0, MODE_36, MODE_36, MODE_36, MODE_36, 1'd0,
+                12'd10, 12'd10, 4'd0, MODE_36, MODE_36, MODE_36, MODE_36, 1'd0
+            };
+        end
+    endcase
+
+    assign FLUSH1 = 1'b0;
+    assign FLUSH2 = 1'b0;
+
+    wire [17:0] PORT_A1_RDATA;
+    wire [17:0] PORT_B1_RDATA;
+    wire [17:0] PORT_A2_RDATA;
+    wire [17:0] PORT_B2_RDATA;
+
+    wire [17:0] PORT_A1_WDATA;
+    wire [17:0] PORT_B1_WDATA;
+    wire [17:0] PORT_A2_WDATA;
+    wire [17:0] PORT_B2_WDATA;
+
+    // Assign read/write data - handle special case for 9bit mode
+    // parity bit for 9bit mode is placed in R/W port on bit #16
+    case (CFG_DBITS)
+        9: begin
+            assign A1DATA = {PORT_A1_RDATA[16], PORT_A1_RDATA[7:0]};
+            assign C1DATA = {PORT_A2_RDATA[16], PORT_A2_RDATA[7:0]};
+            assign PORT_A1_WDATA = {18{1'b0}};
+            assign PORT_B1_WDATA = {B1_WDATA_CMPL[17], B1DATA[8], B1_WDATA_CMPL[16:9], B1DATA[7:0]};
+            assign PORT_A2_WDATA = {18{1'b0}};
+            assign PORT_B2_WDATA = {D1_WDATA_CMPL[17], D1DATA[8], D1_WDATA_CMPL[16:9], D1DATA[7:0]};
+        end
+        default: begin
+            assign A1DATA = PORT_A1_RDATA[CFG_DBITS-1:0];
+            assign C1DATA = PORT_A2_RDATA[CFG_DBITS-1:0];
+            assign PORT_A1_WDATA = {18{1'b1}};
+            assign PORT_B1_WDATA = {B1_WDATA_CMPL, B1DATA};
+            assign PORT_A2_WDATA = {18{1'b1}};
+            assign PORT_B2_WDATA = {D1_WDATA_CMPL, D1DATA};
+
+        end
+    endcase
+
+    wire PORT_A1_CLK = CLK1;
+    wire PORT_A2_CLK = CLK2;
+    wire PORT_B1_CLK = CLK1;
+    wire PORT_B2_CLK = CLK2;
+
+    wire PORT_A1_REN = A1EN;
+    wire PORT_A1_WEN = 1'b0;
+    wire [CFG_ENABLE_B-1:0] PORT_A1_BE = {PORT_A1_WEN,PORT_A1_WEN};
+
+    wire PORT_A2_REN = C1EN;
+    wire PORT_A2_WEN = 1'b0;
+    wire [CFG_ENABLE_D-1:0] PORT_A2_BE = {PORT_A2_WEN,PORT_A2_WEN};
+
+    wire PORT_B1_REN = 1'b0;
+    wire PORT_B1_WEN = B1EN[0];
+    wire [CFG_ENABLE_B-1:0] PORT_B1_BE = {B1EN[1],B1EN[0]};
+
+    wire PORT_B2_REN = 1'b0;
+    wire PORT_B2_WEN = D1EN[0];
+    wire [CFG_ENABLE_D-1:0] PORT_B2_BE = {D1EN[1],D1EN[0]};
+
+    TDP36K  bram_2x18k (
+        .WDATA_A1_i(PORT_A1_WDATA),
+        .RDATA_A1_o(PORT_A1_RDATA),
+        .ADDR_A1_i(PORT_A1_ADDR),
+        .CLK_A1_i(PORT_A1_CLK),
+        .REN_A1_i(PORT_A1_REN),
+        .WEN_A1_i(PORT_A1_WEN),
+        .BE_A1_i(PORT_A1_BE),
+
+        .WDATA_A2_i(PORT_A2_WDATA),
+        .RDATA_A2_o(PORT_A2_RDATA),
+        .ADDR_A2_i(PORT_A2_ADDR),
+        .CLK_A2_i(PORT_A2_CLK),
+        .REN_A2_i(PORT_A2_REN),
+        .WEN_A2_i(PORT_A2_WEN),
+        .BE_A2_i(PORT_A2_BE),
+
+        .WDATA_B1_i(PORT_B1_WDATA),
+        .RDATA_B1_o(PORT_B1_RDATA),
+        .ADDR_B1_i(PORT_B1_ADDR),
+        .CLK_B1_i(PORT_B1_CLK),
+        .REN_B1_i(PORT_B1_REN),
+        .WEN_B1_i(PORT_B1_WEN),
+        .BE_B1_i(PORT_B1_BE),
+
+        .WDATA_B2_i(PORT_B2_WDATA),
+        .RDATA_B2_o(PORT_B2_RDATA),
+        .ADDR_B2_i(PORT_B2_ADDR),
+        .CLK_B2_i(PORT_B2_CLK),
+        .REN_B2_i(PORT_B2_REN),
+        .WEN_B2_i(PORT_B2_WEN),
+        .BE_B2_i(PORT_B2_BE),
+
+        .FLUSH1_i(FLUSH1),
+        .FLUSH2_i(FLUSH2)
+    );
+endmodule
+
+module \_$_mem_v2_asymmetric (RD_ADDR, RD_ARST, RD_CLK, RD_DATA, RD_EN, RD_SRST, WR_ADDR, WR_CLK, WR_DATA, WR_EN);
+    localparam CFG_ABITS = 10;
+    localparam CFG_DBITS = 36;
+    localparam CFG_ENABLE_B = 4;
+
+    localparam CLKPOL2 = 1;
+    localparam CLKPOL3 = 1;
+
+    parameter READ_ADDR_WIDTH = 11;
+    parameter READ_DATA_WIDTH = 16;
+    parameter WRITE_ADDR_WIDTH = 10;
+    parameter WRITE_DATA_WIDTH = 32;
+    parameter ABITS = 0;
+    parameter MEMID = 0;
+    parameter [36863:0] INIT = 36864'bx;
+    parameter OFFSET = 0;
+    parameter RD_ARST_VALUE = 0;
+    parameter RD_CE_OVER_SRST = 0;
+    parameter RD_CLK_ENABLE = 0;
+    parameter RD_CLK_POLARITY = 0;
+    parameter RD_COLLISION_X_MASK = 0;
+    parameter RD_INIT_VALUE = 0;
+    parameter RD_PORTS = 0;
+    parameter RD_SRST_VALUE = 0;
+    parameter RD_TRANSPARENCY_MASK = 0;
+    parameter RD_WIDE_CONTINUATION = 0;
+    parameter SIZE = 0;
+    parameter WIDTH = 0;
+    parameter WR_CLK_ENABLE = 0;
+    parameter WR_CLK_POLARITY = 0;
+    parameter WR_PORTS = 0;
+    parameter WR_PRIORITY_MASK = 0;
+    parameter WR_WIDE_CONTINUATION = 0;
+
+    localparam MODE_36 = 3'b011; // 36- or 32-bit
+    localparam MODE_18 = 3'b010; // 18- or 16-bit
+    localparam MODE_9 = 3'b001; // 9- or 8-bit
+    localparam MODE_4 = 3'b100; // 4-bit
+    localparam MODE_2 = 3'b110; // 2-bit
+    localparam MODE_1 = 3'b101; // 1-bit
+
+    input  wire RD_CLK;
+    input  wire WR_CLK;
+    input  wire RD_ARST;
+    input  wire RD_SRST;
+
+    input  wire [CFG_ABITS-1:0] RD_ADDR;
+    output wire [CFG_DBITS-1:0] RD_DATA;
+    input  wire RD_EN;
+
+    input  wire [CFG_ABITS-1:0] WR_ADDR;
+    input  wire [CFG_DBITS-1:0] WR_DATA;
+    input  wire [CFG_ENABLE_B-1:0] WR_EN;
+
+    wire [14:0] RD_ADDR_15;
+    wire [14:0] WR_ADDR_15;
+
+    wire [35:0] DOBDO;
+
+    wire [14:CFG_ABITS] RD_ADDR_CMPL;
+    wire [14:CFG_ABITS] WR_ADDR_CMPL;
+    wire [35:CFG_DBITS] RD_DATA_CMPL;
+    wire [35:CFG_DBITS] WR_DATA_CMPL;
+
+    wire [14:0] RD_ADDR_TOTAL;
+    wire [14:0] WR_ADDR_TOTAL;
+    wire [35:0] RD_DATA_TOTAL;
+    wire [35:0] WR_DATA_TOTAL;
+
+    wire FLUSH1;
+    wire FLUSH2;
+
+    assign RD_ADDR_CMPL = {15-CFG_ABITS{1'b0}};
+    assign WR_ADDR_CMPL = {15-CFG_ABITS{1'b0}};
+
+    assign RD_ADDR_TOTAL = {RD_ADDR_CMPL, RD_ADDR};
+    assign WR_ADDR_TOTAL = {WR_ADDR_CMPL, WR_ADDR};
+
+    assign RD_DATA_TOTAL = {RD_DATA_CMPL, RD_DATA};
+    assign WR_DATA_TOTAL = {WR_DATA_CMPL, WR_DATA};
+
+    case (CFG_DBITS)
+        1: begin
+            assign RD_ADDR_15 = RD_ADDR_TOTAL;
+            assign WR_ADDR_15 = WR_ADDR_TOTAL;
+            defparam bram_asymmetric.MODE_BITS = { 1'b0,
+                11'd10, 11'd10, 4'd0, MODE_1, MODE_1, MODE_1, MODE_1, 1'd0,
+                12'd10, 12'd10, 4'd0, MODE_1, MODE_1, MODE_1, MODE_1, 1'd0
+            };
+        end
+
+        2: begin
+            assign RD_ADDR_15 = RD_ADDR_TOTAL << 1;
+            assign WR_ADDR_15 = WR_ADDR_TOTAL << 1;
+            defparam bram_asymmetric.MODE_BITS = { 1'b0,
+                11'd10, 11'd10, 4'd0, MODE_2, MODE_2, MODE_2, MODE_2, 1'd0,
+                12'd10, 12'd10, 4'd0, MODE_2, MODE_2, MODE_2, MODE_2, 1'd0
+            };
+        end
+
+        4: begin
+            assign RD_ADDR_15 = RD_ADDR_TOTAL << 2;
+            assign WR_ADDR_15 = WR_ADDR_TOTAL << 2;
+            defparam bram_asymmetric.MODE_BITS = { 1'b0,
+                11'd10, 11'd10, 4'd0, MODE_4, MODE_4, MODE_4, MODE_4, 1'd0,
+                12'd10, 12'd10, 4'd0, MODE_4, MODE_4, MODE_4, MODE_4, 1'd0
+            };
+        end
+        8, 9: begin
+            assign RD_ADDR_15 = RD_ADDR_TOTAL << 3;
+            assign WR_ADDR_15 = WR_ADDR_TOTAL << 3;
+            defparam bram_asymmetric.MODE_BITS = { 1'b0,
+                11'd10, 11'd10, 4'd0, MODE_9, MODE_9, MODE_9, MODE_9, 1'd0,
+                12'd10, 12'd10, 4'd0, MODE_9, MODE_9, MODE_9, MODE_9, 1'd0
+            };
+        end
+
+        16, 18: begin
+            assign RD_ADDR_15 = RD_ADDR_TOTAL << 4;
+            assign WR_ADDR_15 = WR_ADDR_TOTAL << 4;
+            defparam bram_asymmetric.MODE_BITS = { 1'b0,
+                11'd10, 11'd10, 4'd0, MODE_18, MODE_18, MODE_18, MODE_18, 1'd0,
+                12'd10, 12'd10, 4'd0, MODE_18, MODE_18, MODE_18, MODE_18, 1'd0
+            };
+        end
+        32, 36: begin
+            assign RD_ADDR_15 = RD_ADDR_TOTAL << 5;
+            assign WR_ADDR_15 = WR_ADDR_TOTAL << 5;
+            defparam bram_asymmetric.MODE_BITS = { 1'b0,
+                11'd10, 11'd10, 4'd0, MODE_36, MODE_36, MODE_36, MODE_36, 1'd0,
+                12'd10, 12'd10, 4'd0, MODE_36, MODE_36, MODE_36, MODE_36, 1'd0
+            };
+        end
+        default: begin
+            assign RD_ADDR_15 = RD_ADDR_TOTAL;
+            assign WR_ADDR_15 = WR_ADDR_TOTAL;
+            defparam bram_asymmetric.MODE_BITS = { 1'b0,
+                11'd10, 11'd10, 4'd0, MODE_36, MODE_36, MODE_36, MODE_36, 1'd0,
+                12'd10, 12'd10, 4'd0, MODE_36, MODE_36, MODE_36, MODE_36, 1'd0
+            };
+        end
+    endcase
+
+    assign FLUSH1 = 1'b0;
+    assign FLUSH2 = 1'b0;
+
+    TDP36K bram_asymmetric (
+        .RESET_ni(1'b1),
+        .WDATA_A1_i(18'h3FFFF),
+        .WDATA_A2_i(18'h3FFFF),
+        .RDATA_A1_o(RD_DATA_TOTAL[17:0]),
+        .RDATA_A2_o(RD_DATA_TOTAL[35:18]),
+        .ADDR_A1_i(RD_ADDR_15),
+        .ADDR_A2_i(RD_ADDR_15),
+        .CLK_A1_i(RD_CLK),
+        .CLK_A2_i(RD_CLK),
+        .REN_A1_i(RD_EN),
+        .REN_A2_i(RD_EN),
+        .WEN_A1_i(1'b0),
+        .WEN_A2_i(1'b0),
+        .BE_A1_i({RD_EN, RD_EN}),
+        .BE_A2_i({RD_EN, RD_EN}),
+
+        .WDATA_B1_i(WR_DATA[17:0]),
+        .WDATA_B2_i(WR_DATA[35:18]),
+        .RDATA_B1_o(DOBDO[17:0]),
+        .RDATA_B2_o(DOBDO[35:18]),
+        .ADDR_B1_i(WR_ADDR_15),
+        .ADDR_B2_i(WR_ADDR_15),
+        .CLK_B1_i(WR_CLK),
+        .CLK_B2_i(WR_CLK),
+        .REN_B1_i(1'b0),
+        .REN_B2_i(1'b0),
+        .WEN_B1_i(WR_EN[0]),
+        .WEN_B2_i(WR_EN[0]),
+        .BE_B1_i(WR_EN[1:0]),
+        .BE_B2_i(WR_EN[3:2]),
+
+        .FLUSH1_i(FLUSH1),
+        .FLUSH2_i(FLUSH2)
+    );
+endmodule
+
+module BRAM2x18_SP (
+    RESET_ni,
+    
+    WEN1_i,
+    REN1_i,
+    WR1_CLK_i,
+    RD1_CLK_i,
+    WR1_BE_i,
+    WR1_ADDR_i,
+    RD1_ADDR_i,
+    WDATA1_i,
+    RDATA1_o,
+    
+    WEN2_i,
+    REN2_i,
+    WR2_CLK_i,
+    RD2_CLK_i,
+    WR2_BE_i,
+    WR2_ADDR_i,
+    RD2_ADDR_i,
+    WDATA2_i,
+    RDATA2_o
+);
+
+parameter WR_ADDR_WIDTH = 10;
+parameter RD_ADDR_WIDTH = 10;
+parameter WR_DATA_WIDTH = 18;
+parameter RD_DATA_WIDTH = 18;
+parameter BE1_WIDTH = 2;
+parameter BE2_WIDTH = 2;
+
+localparam MODE_36 = 3'b011; // 36- or 32-bit
+localparam MODE_18 = 3'b010; // 18- or 16-bit
+localparam MODE_9 = 3'b001; // 9- or 8-bit
+localparam MODE_4 = 3'b100; // 4-bit
+localparam MODE_2 = 3'b110; // 2-bit
+localparam MODE_1 = 3'b101; // 1-bit
+
+input wire RESET_ni;
+
+input wire WEN1_i;
+input wire REN1_i;
+input wire WR1_CLK_i;
+input wire RD1_CLK_i;
+input wire [BE1_WIDTH-1:0] WR1_BE_i;
+input wire [WR_ADDR_WIDTH-1 :0] WR1_ADDR_i;
+input wire [RD_ADDR_WIDTH-1 :0] RD1_ADDR_i;
+input wire [WR_DATA_WIDTH-1 :0] WDATA1_i;
+output wire [RD_DATA_WIDTH-1 :0] RDATA1_o;
+
+input wire WEN2_i;
+input wire REN2_i;
+input wire WR2_CLK_i;
+input wire RD2_CLK_i;
+input wire [BE2_WIDTH-1:0] WR2_BE_i;
+input wire [WR_ADDR_WIDTH-1 :0] WR2_ADDR_i;
+input wire [RD_ADDR_WIDTH-1 :0] RD2_ADDR_i;
+input wire [WR_DATA_WIDTH-1 :0] WDATA2_i;
+output wire [RD_DATA_WIDTH-1 :0] RDATA2_o;
+
+//localparam READ_DATA_BITS_TO_SKIP = 18 - RD_DATA_WIDTH;
+
+wire [14:RD_ADDR_WIDTH] RD1_ADDR_CMPL;
+wire [14:WR_ADDR_WIDTH] WR1_ADDR_CMPL;
+wire [17:RD_DATA_WIDTH] RD1_DATA_CMPL;
+wire [17:WR_DATA_WIDTH] WR1_DATA_CMPL;
+           
+wire [14:RD_ADDR_WIDTH] RD2_ADDR_CMPL;
+wire [14:WR_ADDR_WIDTH] WR2_ADDR_CMPL;
+wire [17:RD_DATA_WIDTH] RD2_DATA_CMPL;
+wire [17:WR_DATA_WIDTH] WR2_DATA_CMPL;
+
+wire [14:0] RD1_ADDR_TOTAL;
+wire [14:0] WR1_ADDR_TOTAL;
+
+wire [14:0] RD2_ADDR_TOTAL;
+wire [14:0] WR2_ADDR_TOTAL;
+
+wire [14:0] RD1_ADDR_SHIFTED;
+wire [14:0] WR1_ADDR_SHIFTED;
+
+wire [14:0] RD2_ADDR_SHIFTED;
+wire [14:0] WR2_ADDR_SHIFTED;
+
+wire [1:0] WR1_BE;
+wire [1:0] WR2_BE;
+
+wire FLUSH1;
+wire FLUSH2;
+
+generate
+  if (WR_ADDR_WIDTH == 15) begin
+    assign WR1_ADDR_TOTAL = WR1_ADDR_i;
+    assign WR2_ADDR_TOTAL = WR2_ADDR_i;
+  end else begin
+    assign WR1_ADDR_TOTAL[14:WR_ADDR_WIDTH] = 0;
+    assign WR1_ADDR_TOTAL[WR_ADDR_WIDTH-1:0] = WR1_ADDR_i;
+    assign WR2_ADDR_TOTAL[14:WR_ADDR_WIDTH] = 0;
+    assign WR2_ADDR_TOTAL[WR_ADDR_WIDTH-1:0] = WR2_ADDR_i;
+  end
+endgenerate
+
+generate
+  if (RD_ADDR_WIDTH == 15) begin
+    assign RD1_ADDR_TOTAL = RD1_ADDR_i;
+    assign RD2_ADDR_TOTAL = RD2_ADDR_i;
+  end else begin
+    assign RD1_ADDR_TOTAL[14:RD_ADDR_WIDTH] = 0;
+    assign RD1_ADDR_TOTAL[RD_ADDR_WIDTH-1:0] = RD1_ADDR_i;
+    assign RD2_ADDR_TOTAL[14:RD_ADDR_WIDTH] = 0;
+    assign RD2_ADDR_TOTAL[RD_ADDR_WIDTH-1:0] = RD2_ADDR_i;
+  end
+endgenerate
+
+// Apply shift
+case (RD_DATA_WIDTH)
+	1: begin
+		assign RD1_ADDR_SHIFTED = RD1_ADDR_TOTAL;
+	end
+	2: begin
+		assign RD1_ADDR_SHIFTED = RD1_ADDR_TOTAL << 1;
+	end
+	4: begin
+		assign RD1_ADDR_SHIFTED = RD1_ADDR_TOTAL << 2;
+	end
+	8, 9: begin
+		assign RD1_ADDR_SHIFTED = RD1_ADDR_TOTAL << 3;
+	end
+	16, 18: begin
+		assign RD1_ADDR_SHIFTED = RD1_ADDR_TOTAL << 4;
+	end
+	default: begin
+		assign RD1_ADDR_SHIFTED = RD1_ADDR_TOTAL;
+	end
+endcase
+
+case (WR_DATA_WIDTH)
+	1: begin
+		assign WR1_ADDR_SHIFTED = WR1_ADDR_TOTAL;
+	end
+	2: begin
+		assign WR1_ADDR_SHIFTED = WR1_ADDR_TOTAL << 1;
+	end
+	4: begin
+		assign WR1_ADDR_SHIFTED = WR1_ADDR_TOTAL << 2;
+	end
+	8, 9: begin
+		assign WR1_ADDR_SHIFTED = WR1_ADDR_TOTAL << 3;
+	end
+	16, 18: begin
+		assign WR1_ADDR_SHIFTED = WR1_ADDR_TOTAL << 4;
+	end
+	default: begin
+		assign WR1_ADDR_SHIFTED = WR1_ADDR_TOTAL;
+	end
+endcase
+
+case (RD_DATA_WIDTH)
+	1: begin
+		assign RD2_ADDR_SHIFTED = RD2_ADDR_TOTAL;
+	end
+	2: begin
+		assign RD2_ADDR_SHIFTED = RD2_ADDR_TOTAL << 1;
+	end
+	4: begin
+		assign RD2_ADDR_SHIFTED = RD2_ADDR_TOTAL << 2;
+	end
+	8, 9: begin
+		assign RD2_ADDR_SHIFTED = RD2_ADDR_TOTAL << 3;
+	end
+	16, 18: begin
+		assign RD2_ADDR_SHIFTED = RD2_ADDR_TOTAL << 4;
+	end
+	default: begin
+		assign RD2_ADDR_SHIFTED = RD2_ADDR_TOTAL;
+	end
+endcase
+
+case (WR_DATA_WIDTH)
+	1: begin
+		assign WR2_ADDR_SHIFTED = WR2_ADDR_TOTAL;
+	end
+	2: begin
+		assign WR2_ADDR_SHIFTED = WR2_ADDR_TOTAL << 1;
+	end
+	4: begin
+		assign WR2_ADDR_SHIFTED = WR2_ADDR_TOTAL << 2;
+	end
+	8, 9: begin
+		assign WR2_ADDR_SHIFTED = WR2_ADDR_TOTAL << 3;
+	end
+	16, 18: begin
+		assign WR2_ADDR_SHIFTED = WR2_ADDR_TOTAL << 4;
+	end
+	default: begin
+		assign WR2_ADDR_SHIFTED = WR2_ADDR_TOTAL;
+	end
+endcase
+
+case (BE1_WIDTH)
+	2: begin
+		assign WR1_BE = WR1_BE_i[BE1_WIDTH-1 :0];
+	end
+	default: begin
+		assign WR1_BE[1:BE1_WIDTH] = 0;
+    assign WR1_BE[BE1_WIDTH-1 :0] = WR1_BE_i[BE1_WIDTH-1 :0];
+	end
+endcase
+
+case (BE2_WIDTH)
+	2: begin
+		assign WR2_BE = WR2_BE_i[BE2_WIDTH-1 :0];
+	end
+	default: begin
+		assign WR2_BE[1:BE2_WIDTH] = 0;
+    assign WR2_BE[BE2_WIDTH-1 :0] = WR2_BE_i[BE2_WIDTH-1 :0];
+	end
+endcase
+
+assign FLUSH1 = 1'b0;
+assign FLUSH2 = 1'b0;
+
+// TODO configure per width
+wire [17:0] PORT_B1_RDATA;
+wire [17:0] PORT_B2_RDATA;
+wire [17:0] PORT_A1_WDATA;
+wire [17:0] PORT_A2_WDATA;
+
+generate
+  if (WR_DATA_WIDTH == 18) begin
+    assign PORT_A1_WDATA[WR_DATA_WIDTH-1:0] = WDATA1_i[WR_DATA_WIDTH-1:0];
+    assign PORT_A2_WDATA[WR_DATA_WIDTH-1:0] = WDATA2_i[WR_DATA_WIDTH-1:0];
+  end else if (WR_DATA_WIDTH == 9) begin
+    assign PORT_A1_WDATA = {19'h0, WDATA1_i[8], 8'h0, WDATA1_i[7:0]};
+    assign PORT_A2_WDATA = {19'h0, WDATA2_i[8], 8'h0, WDATA2_i[7:0]};
+  end else begin
+    assign PORT_A1_WDATA[17:WR_DATA_WIDTH] = 0;
+    assign PORT_A1_WDATA[WR_DATA_WIDTH-1:0] = WDATA1_i[WR_DATA_WIDTH-1:0];
+    assign PORT_A2_WDATA[17:WR_DATA_WIDTH] = 0;
+    assign PORT_A2_WDATA[WR_DATA_WIDTH-1:0] = WDATA2_i[WR_DATA_WIDTH-1:0];
+  end
+endgenerate
+
+case (RD_DATA_WIDTH)
+	9: begin
+		assign RDATA1_o = {PORT_B1_RDATA[16], PORT_B1_RDATA[7:0]};
+    assign RDATA2_o = {PORT_B2_RDATA[16], PORT_B2_RDATA[7:0]};
+	end
+	default: begin
+		assign RDATA1_o = PORT_B1_RDATA[RD_DATA_WIDTH-1:0];
+    assign RDATA2_o = PORT_B2_RDATA[RD_DATA_WIDTH-1:0];
+	end
+endcase
+
+// Assign parameters
+case (RD_DATA_WIDTH)
+	1: begin
+		case (WR_DATA_WIDTH)
+			1: begin
+				defparam BRAM_BLK.MODE_BITS = { 1'b1,
+					11'd10, 11'd10, 4'd0, MODE_1, MODE_1, MODE_1, MODE_1, 1'd0,
+					12'd10, 12'd10, 4'd0, MODE_1, MODE_1, MODE_1, MODE_1, 1'd0
+				};
+        (* is_inferred = 1 *)
+        (* is_split = 1 *)
+        (* rd_data_width = RD_DATA_WIDTH *)
+        (* wr_data_width = WR_DATA_WIDTH *)
+        TDP36K BRAM_BLK (
+          .RESET_ni(RESET_ni),
+        
+          .WDATA_A1_i(PORT_A1_WDATA),
+          .RDATA_A1_o(),
+          .ADDR_A1_i(WR1_ADDR_SHIFTED),
+          .CLK_A1_i(WR1_CLK_i),
+          .REN_A1_i(),
+          .WEN_A1_i(WEN1_i),
+          .BE_A1_i(WR1_BE[1:0]),
+        
+          .WDATA_B1_i(18'h0),
+          .RDATA_B1_o(PORT_B1_RDATA),
+          .ADDR_B1_i(RD1_ADDR_SHIFTED),
+          .CLK_B1_i(RD1_CLK_i),
+          .REN_B1_i(REN1_i),
+          .WEN_B1_i(1'b0),
+          .BE_B1_i({REN1_i,REN1_i}),
+        
+          .WDATA_A2_i(PORT_A2_WDATA),
+          .RDATA_A2_o(),
+          .ADDR_A2_i(WR2_ADDR_SHIFTED),
+          .CLK_A2_i(WR2_CLK_i),
+          .REN_A2_i(1'b0),
+          .WEN_A2_i(WEN2_i),
+          .BE_A2_i(WR2_BE[1:0]),
+        
+          .WDATA_B2_i(18'h0),
+          .RDATA_B2_o(PORT_B2_RDATA),
+          .ADDR_B2_i(RD2_ADDR_SHIFTED),
+          .CLK_B2_i(RD2_CLK_i),
+          .REN_B2_i(REN2_i),
+          .WEN_B2_i(1'b0),
+          .BE_B2_i({REN2_i,REN2_i}),
+        
+          .FLUSH1_i(FLUSH1),
+          .FLUSH2_i(FLUSH2)
+        );        
+			end
+			2: begin
+				defparam BRAM_BLK.MODE_BITS = { 1'b1,
+					11'd10, 11'd10, 4'd0, MODE_1, MODE_2, MODE_1, MODE_2, 1'd0,
+					12'd10, 12'd10, 4'd0, MODE_1, MODE_2, MODE_1, MODE_2, 1'd0
+				};
+        (* is_inferred = 1 *)
+        (* is_split = 1 *)
+        (* rd_data_width = RD_DATA_WIDTH *)
+        (* wr_data_width = WR_DATA_WIDTH *)
+        TDP36K BRAM_BLK (
+          .RESET_ni(RESET_ni),
+        
+          .WDATA_A1_i(PORT_A1_WDATA),
+          .RDATA_A1_o(),
+          .ADDR_A1_i(WR1_ADDR_SHIFTED),
+          .CLK_A1_i(WR1_CLK_i),
+          .REN_A1_i(),
+          .WEN_A1_i(WEN1_i),
+          .BE_A1_i(WR1_BE[1:0]),
+        
+          .WDATA_B1_i(18'h0),
+          .RDATA_B1_o(PORT_B1_RDATA),
+          .ADDR_B1_i(RD1_ADDR_SHIFTED),
+          .CLK_B1_i(RD1_CLK_i),
+          .REN_B1_i(REN1_i),
+          .WEN_B1_i(1'b0),
+          .BE_B1_i({REN1_i,REN1_i}),
+        
+          .WDATA_A2_i(PORT_A2_WDATA),
+          .RDATA_A2_o(),
+          .ADDR_A2_i(WR2_ADDR_SHIFTED),
+          .CLK_A2_i(WR2_CLK_i),
+          .REN_A2_i(1'b0),
+          .WEN_A2_i(WEN2_i),
+          .BE_A2_i(WR2_BE[1:0]),
+        
+          .WDATA_B2_i(18'h0),
+          .RDATA_B2_o(PORT_B2_RDATA),
+          .ADDR_B2_i(RD2_ADDR_SHIFTED),
+          .CLK_B2_i(RD2_CLK_i),
+          .REN_B2_i(REN2_i),
+          .WEN_B2_i(1'b0),
+          .BE_B2_i({REN2_i,REN2_i}),
+        
+          .FLUSH1_i(FLUSH1),
+          .FLUSH2_i(FLUSH2)
+        );        
+			end
+			4: begin
+				defparam BRAM_BLK.MODE_BITS = { 1'b1,
+					11'd10, 11'd10, 4'd0, MODE_1, MODE_4, MODE_1, MODE_4, 1'd0,
+					12'd10, 12'd10, 4'd0, MODE_1, MODE_4, MODE_1, MODE_4, 1'd0
+				};
+        (* is_inferred = 1 *)
+        (* is_split = 1 *)
+        (* rd_data_width = RD_DATA_WIDTH *)
+        (* wr_data_width = WR_DATA_WIDTH *)
+        TDP36K BRAM_BLK (
+          .RESET_ni(RESET_ni),
+        
+          .WDATA_A1_i(PORT_A1_WDATA),
+          .RDATA_A1_o(),
+          .ADDR_A1_i(WR1_ADDR_SHIFTED),
+          .CLK_A1_i(WR1_CLK_i),
+          .REN_A1_i(),
+          .WEN_A1_i(WEN1_i),
+          .BE_A1_i(WR1_BE[1:0]),
+        
+          .WDATA_B1_i(18'h0),
+          .RDATA_B1_o(PORT_B1_RDATA),
+          .ADDR_B1_i(RD1_ADDR_SHIFTED),
+          .CLK_B1_i(RD1_CLK_i),
+          .REN_B1_i(REN1_i),
+          .WEN_B1_i(1'b0),
+          .BE_B1_i({REN1_i,REN1_i}),
+        
+          .WDATA_A2_i(PORT_A2_WDATA),
+          .RDATA_A2_o(),
+          .ADDR_A2_i(WR2_ADDR_SHIFTED),
+          .CLK_A2_i(WR2_CLK_i),
+          .REN_A2_i(1'b0),
+          .WEN_A2_i(WEN2_i),
+          .BE_A2_i(WR2_BE[1:0]),
+        
+          .WDATA_B2_i(18'h0),
+          .RDATA_B2_o(PORT_B2_RDATA),
+          .ADDR_B2_i(RD2_ADDR_SHIFTED),
+          .CLK_B2_i(RD2_CLK_i),
+          .REN_B2_i(REN2_i),
+          .WEN_B2_i(1'b0),
+          .BE_B2_i({REN2_i,REN2_i}),
+        
+          .FLUSH1_i(FLUSH1),
+          .FLUSH2_i(FLUSH2)
+        );        
+			end
+			8, 9: begin
+				defparam BRAM_BLK.MODE_BITS = { 1'b1,
+					11'd10, 11'd10, 4'd0, MODE_1, MODE_9, MODE_1, MODE_9, 1'd0,
+					12'd10, 12'd10, 4'd0, MODE_1, MODE_9, MODE_1, MODE_9, 1'd0
+				};
+        (* is_inferred = 1 *)
+        (* is_split = 1 *)
+        (* rd_data_width = RD_DATA_WIDTH *)
+        (* wr_data_width = WR_DATA_WIDTH *)
+        TDP36K BRAM_BLK (
+          .RESET_ni(RESET_ni),
+        
+          .WDATA_A1_i(PORT_A1_WDATA),
+          .RDATA_A1_o(),
+          .ADDR_A1_i(WR1_ADDR_SHIFTED),
+          .CLK_A1_i(WR1_CLK_i),
+          .REN_A1_i(),
+          .WEN_A1_i(WEN1_i),
+          .BE_A1_i(WR1_BE[1:0]),
+        
+          .WDATA_B1_i(18'h0),
+          .RDATA_B1_o(PORT_B1_RDATA),
+          .ADDR_B1_i(RD1_ADDR_SHIFTED),
+          .CLK_B1_i(RD1_CLK_i),
+          .REN_B1_i(REN1_i),
+          .WEN_B1_i(1'b0),
+          .BE_B1_i({REN1_i,REN1_i}),
+        
+          .WDATA_A2_i(PORT_A2_WDATA),
+          .RDATA_A2_o(),
+          .ADDR_A2_i(WR2_ADDR_SHIFTED),
+          .CLK_A2_i(WR2_CLK_i),
+          .REN_A2_i(1'b0),
+          .WEN_A2_i(WEN2_i),
+          .BE_A2_i(WR2_BE[1:0]),
+        
+          .WDATA_B2_i(18'h0),
+          .RDATA_B2_o(PORT_B2_RDATA),
+          .ADDR_B2_i(RD2_ADDR_SHIFTED),
+          .CLK_B2_i(RD2_CLK_i),
+          .REN_B2_i(REN2_i),
+          .WEN_B2_i(1'b0),
+          .BE_B2_i({REN2_i,REN2_i}),
+        
+          .FLUSH1_i(FLUSH1),
+          .FLUSH2_i(FLUSH2)
+        );        
+			end
+			16, 18: begin
+				defparam BRAM_BLK.MODE_BITS = { 1'b1,
+					11'd10, 11'd10, 4'd0, MODE_1, MODE_18, MODE_1, MODE_18, 1'd0,
+					12'd10, 12'd10, 4'd0, MODE_1, MODE_18, MODE_1, MODE_18, 1'd0
+				};
+        (* is_inferred = 1 *)
+        (* is_split = 1 *)
+        (* rd_data_width = RD_DATA_WIDTH *)
+        (* wr_data_width = WR_DATA_WIDTH *)
+        TDP36K BRAM_BLK (
+          .RESET_ni(RESET_ni),
+        
+          .WDATA_A1_i(PORT_A1_WDATA),
+          .RDATA_A1_o(),
+          .ADDR_A1_i(WR1_ADDR_SHIFTED),
+          .CLK_A1_i(WR1_CLK_i),
+          .REN_A1_i(),
+          .WEN_A1_i(WEN1_i),
+          .BE_A1_i(WR1_BE[1:0]),
+        
+          .WDATA_B1_i(18'h0),
+          .RDATA_B1_o(PORT_B1_RDATA),
+          .ADDR_B1_i(RD1_ADDR_SHIFTED),
+          .CLK_B1_i(RD1_CLK_i),
+          .REN_B1_i(REN1_i),
+          .WEN_B1_i(1'b0),
+          .BE_B1_i({REN1_i,REN1_i}),
+        
+          .WDATA_A2_i(PORT_A2_WDATA),
+          .RDATA_A2_o(),
+          .ADDR_A2_i(WR2_ADDR_SHIFTED),
+          .CLK_A2_i(WR2_CLK_i),
+          .REN_A2_i(1'b0),
+          .WEN_A2_i(WEN2_i),
+          .BE_A2_i(WR2_BE[1:0]),
+        
+          .WDATA_B2_i(18'h0),
+          .RDATA_B2_o(PORT_B2_RDATA),
+          .ADDR_B2_i(RD2_ADDR_SHIFTED),
+          .CLK_B2_i(RD2_CLK_i),
+          .REN_B2_i(REN2_i),
+          .WEN_B2_i(1'b0),
+          .BE_B2_i({REN2_i,REN2_i}),
+        
+          .FLUSH1_i(FLUSH1),
+          .FLUSH2_i(FLUSH2)
+        );        
+			end
+			default: begin
+				defparam BRAM_BLK.MODE_BITS = { 1'b1,
+					11'd10, 11'd10, 4'd0, MODE_1, MODE_1, MODE_1, MODE_1, 1'd0,
+					12'd10, 12'd10, 4'd0, MODE_1, MODE_1, MODE_1, MODE_1, 1'd0
+				};
+        (* is_inferred = 1 *)
+        (* is_split = 1 *)
+        (* rd_data_width = RD_DATA_WIDTH *)
+        (* wr_data_width = WR_DATA_WIDTH *)
+        TDP36K BRAM_BLK (
+          .RESET_ni(RESET_ni),
+        
+          .WDATA_A1_i(PORT_A1_WDATA),
+          .RDATA_A1_o(),
+          .ADDR_A1_i(WR1_ADDR_SHIFTED),
+          .CLK_A1_i(WR1_CLK_i),
+          .REN_A1_i(),
+          .WEN_A1_i(WEN1_i),
+          .BE_A1_i(WR1_BE[1:0]),
+        
+          .WDATA_B1_i(18'h0),
+          .RDATA_B1_o(PORT_B1_RDATA),
+          .ADDR_B1_i(RD1_ADDR_SHIFTED),
+          .CLK_B1_i(RD1_CLK_i),
+          .REN_B1_i(REN1_i),
+          .WEN_B1_i(1'b0),
+          .BE_B1_i({REN1_i,REN1_i}),
+        
+          .WDATA_A2_i(PORT_A2_WDATA),
+          .RDATA_A2_o(),
+          .ADDR_A2_i(WR2_ADDR_SHIFTED),
+          .CLK_A2_i(WR2_CLK_i),
+          .REN_A2_i(1'b0),
+          .WEN_A2_i(WEN2_i),
+          .BE_A2_i(WR2_BE[1:0]),
+        
+          .WDATA_B2_i(18'h0),
+          .RDATA_B2_o(PORT_B2_RDATA),
+          .ADDR_B2_i(RD2_ADDR_SHIFTED),
+          .CLK_B2_i(RD2_CLK_i),
+          .REN_B2_i(REN2_i),
+          .WEN_B2_i(1'b0),
+          .BE_B2_i({REN2_i,REN2_i}),
+        
+          .FLUSH1_i(FLUSH1),
+          .FLUSH2_i(FLUSH2)
+        );        
+			end
+		endcase
+	end
+	2: begin
+		case (WR_DATA_WIDTH)
+			1: begin
+				defparam BRAM_BLK.MODE_BITS = { 1'b1,
+					11'd10, 11'd10, 4'd0, MODE_2, MODE_1, MODE_2, MODE_1, 1'd0,
+					12'd10, 12'd10, 4'd0, MODE_2, MODE_1, MODE_2, MODE_1, 1'd0
+				};
+        (* is_inferred = 1 *)
+        (* is_split = 1 *)
+        (* rd_data_width = RD_DATA_WIDTH *)
+        (* wr_data_width = WR_DATA_WIDTH *)
+        TDP36K BRAM_BLK (
+          .RESET_ni(RESET_ni),
+        
+          .WDATA_A1_i(PORT_A1_WDATA),
+          .RDATA_A1_o(),
+          .ADDR_A1_i(WR1_ADDR_SHIFTED),
+          .CLK_A1_i(WR1_CLK_i),
+          .REN_A1_i(),
+          .WEN_A1_i(WEN1_i),
+          .BE_A1_i(WR1_BE[1:0]),
+        
+          .WDATA_B1_i(18'h0),
+          .RDATA_B1_o(PORT_B1_RDATA),
+          .ADDR_B1_i(RD1_ADDR_SHIFTED),
+          .CLK_B1_i(RD1_CLK_i),
+          .REN_B1_i(REN1_i),
+          .WEN_B1_i(1'b0),
+          .BE_B1_i({REN1_i,REN1_i}),
+        
+          .WDATA_A2_i(PORT_A2_WDATA),
+          .RDATA_A2_o(),
+          .ADDR_A2_i(WR2_ADDR_SHIFTED),
+          .CLK_A2_i(WR2_CLK_i),
+          .REN_A2_i(1'b0),
+          .WEN_A2_i(WEN2_i),
+          .BE_A2_i(WR2_BE[1:0]),
+        
+          .WDATA_B2_i(18'h0),
+          .RDATA_B2_o(PORT_B2_RDATA),
+          .ADDR_B2_i(RD2_ADDR_SHIFTED),
+          .CLK_B2_i(RD2_CLK_i),
+          .REN_B2_i(REN2_i),
+          .WEN_B2_i(1'b0),
+          .BE_B2_i({REN2_i,REN2_i}),
+        
+          .FLUSH1_i(FLUSH1),
+          .FLUSH2_i(FLUSH2)
+        );        
+			end
+			2: begin
+				defparam BRAM_BLK.MODE_BITS = { 1'b1,
+					11'd10, 11'd10, 4'd0, MODE_2, MODE_2, MODE_2, MODE_2, 1'd0,
+					12'd10, 12'd10, 4'd0, MODE_2, MODE_2, MODE_2, MODE_2, 1'd0
+				};
+        (* is_inferred = 1 *)
+        (* is_split = 1 *)
+        (* rd_data_width = RD_DATA_WIDTH *)
+        (* wr_data_width = WR_DATA_WIDTH *)
+        TDP36K BRAM_BLK (
+          .RESET_ni(RESET_ni),
+        
+          .WDATA_A1_i(PORT_A1_WDATA),
+          .RDATA_A1_o(),
+          .ADDR_A1_i(WR1_ADDR_SHIFTED),
+          .CLK_A1_i(WR1_CLK_i),
+          .REN_A1_i(),
+          .WEN_A1_i(WEN1_i),
+          .BE_A1_i(WR1_BE[1:0]),
+        
+          .WDATA_B1_i(18'h0),
+          .RDATA_B1_o(PORT_B1_RDATA),
+          .ADDR_B1_i(RD1_ADDR_SHIFTED),
+          .CLK_B1_i(RD1_CLK_i),
+          .REN_B1_i(REN1_i),
+          .WEN_B1_i(1'b0),
+          .BE_B1_i({REN1_i,REN1_i}),
+        
+          .WDATA_A2_i(PORT_A2_WDATA),
+          .RDATA_A2_o(),
+          .ADDR_A2_i(WR2_ADDR_SHIFTED),
+          .CLK_A2_i(WR2_CLK_i),
+          .REN_A2_i(1'b0),
+          .WEN_A2_i(WEN2_i),
+          .BE_A2_i(WR2_BE[1:0]),
+        
+          .WDATA_B2_i(18'h0),
+          .RDATA_B2_o(PORT_B2_RDATA),
+          .ADDR_B2_i(RD2_ADDR_SHIFTED),
+          .CLK_B2_i(RD2_CLK_i),
+          .REN_B2_i(REN2_i),
+          .WEN_B2_i(1'b0),
+          .BE_B2_i({REN2_i,REN2_i}),
+        
+          .FLUSH1_i(FLUSH1),
+          .FLUSH2_i(FLUSH2)
+        );        
+			end
+			4: begin
+				defparam BRAM_BLK.MODE_BITS = { 1'b1,
+					11'd10, 11'd10, 4'd0, MODE_2, MODE_4, MODE_2, MODE_4, 1'd0,
+					12'd10, 12'd10, 4'd0, MODE_2, MODE_4, MODE_2, MODE_4, 1'd0
+				};
+        (* is_inferred = 1 *)
+        (* is_split = 1 *)
+        (* rd_data_width = RD_DATA_WIDTH *)
+        (* wr_data_width = WR_DATA_WIDTH *)
+        TDP36K BRAM_BLK (
+          .RESET_ni(RESET_ni),
+        
+          .WDATA_A1_i(PORT_A1_WDATA),
+          .RDATA_A1_o(),
+          .ADDR_A1_i(WR1_ADDR_SHIFTED),
+          .CLK_A1_i(WR1_CLK_i),
+          .REN_A1_i(),
+          .WEN_A1_i(WEN1_i),
+          .BE_A1_i(WR1_BE[1:0]),
+        
+          .WDATA_B1_i(18'h0),
+          .RDATA_B1_o(PORT_B1_RDATA),
+          .ADDR_B1_i(RD1_ADDR_SHIFTED),
+          .CLK_B1_i(RD1_CLK_i),
+          .REN_B1_i(REN1_i),
+          .WEN_B1_i(1'b0),
+          .BE_B1_i({REN1_i,REN1_i}),
+        
+          .WDATA_A2_i(PORT_A2_WDATA),
+          .RDATA_A2_o(),
+          .ADDR_A2_i(WR2_ADDR_SHIFTED),
+          .CLK_A2_i(WR2_CLK_i),
+          .REN_A2_i(1'b0),
+          .WEN_A2_i(WEN2_i),
+          .BE_A2_i(WR2_BE[1:0]),
+        
+          .WDATA_B2_i(18'h0),
+          .RDATA_B2_o(PORT_B2_RDATA),
+          .ADDR_B2_i(RD2_ADDR_SHIFTED),
+          .CLK_B2_i(RD2_CLK_i),
+          .REN_B2_i(REN2_i),
+          .WEN_B2_i(1'b0),
+          .BE_B2_i({REN2_i,REN2_i}),
+        
+          .FLUSH1_i(FLUSH1),
+          .FLUSH2_i(FLUSH2)
+        );        
+			end
+			8, 9: begin
+				defparam BRAM_BLK.MODE_BITS = { 1'b1,
+					11'd10, 11'd10, 4'd0, MODE_2, MODE_9, MODE_2, MODE_9, 1'd0,
+					12'd10, 12'd10, 4'd0, MODE_2, MODE_9, MODE_2, MODE_9, 1'd0
+				};
+        (* is_inferred = 1 *)
+        (* is_split = 1 *)
+        (* rd_data_width = RD_DATA_WIDTH *)
+        (* wr_data_width = WR_DATA_WIDTH *)
+        TDP36K BRAM_BLK (
+          .RESET_ni(RESET_ni),
+        
+          .WDATA_A1_i(PORT_A1_WDATA),
+          .RDATA_A1_o(),
+          .ADDR_A1_i(WR1_ADDR_SHIFTED),
+          .CLK_A1_i(WR1_CLK_i),
+          .REN_A1_i(),
+          .WEN_A1_i(WEN1_i),
+          .BE_A1_i(WR1_BE[1:0]),
+        
+          .WDATA_B1_i(18'h0),
+          .RDATA_B1_o(PORT_B1_RDATA),
+          .ADDR_B1_i(RD1_ADDR_SHIFTED),
+          .CLK_B1_i(RD1_CLK_i),
+          .REN_B1_i(REN1_i),
+          .WEN_B1_i(1'b0),
+          .BE_B1_i({REN1_i,REN1_i}),
+        
+          .WDATA_A2_i(PORT_A2_WDATA),
+          .RDATA_A2_o(),
+          .ADDR_A2_i(WR2_ADDR_SHIFTED),
+          .CLK_A2_i(WR2_CLK_i),
+          .REN_A2_i(1'b0),
+          .WEN_A2_i(WEN2_i),
+          .BE_A2_i(WR2_BE[1:0]),
+        
+          .WDATA_B2_i(18'h0),
+          .RDATA_B2_o(PORT_B2_RDATA),
+          .ADDR_B2_i(RD2_ADDR_SHIFTED),
+          .CLK_B2_i(RD2_CLK_i),
+          .REN_B2_i(REN2_i),
+          .WEN_B2_i(1'b0),
+          .BE_B2_i({REN2_i,REN2_i}),
+        
+          .FLUSH1_i(FLUSH1),
+          .FLUSH2_i(FLUSH2)
+        );        
+			end
+			16, 18: begin
+				defparam BRAM_BLK.MODE_BITS = { 1'b1,
+					11'd10, 11'd10, 4'd0, MODE_2, MODE_18, MODE_2, MODE_18, 1'd0,
+					12'd10, 12'd10, 4'd0, MODE_2, MODE_18, MODE_2, MODE_18, 1'd0
+				};
+        (* is_inferred = 1 *)
+        (* is_split = 1 *)
+        (* rd_data_width = RD_DATA_WIDTH *)
+        (* wr_data_width = WR_DATA_WIDTH *)
+        TDP36K BRAM_BLK (
+          .RESET_ni(RESET_ni),
+        
+          .WDATA_A1_i(PORT_A1_WDATA),
+          .RDATA_A1_o(),
+          .ADDR_A1_i(WR1_ADDR_SHIFTED),
+          .CLK_A1_i(WR1_CLK_i),
+          .REN_A1_i(),
+          .WEN_A1_i(WEN1_i),
+          .BE_A1_i(WR1_BE[1:0]),
+        
+          .WDATA_B1_i(18'h0),
+          .RDATA_B1_o(PORT_B1_RDATA),
+          .ADDR_B1_i(RD1_ADDR_SHIFTED),
+          .CLK_B1_i(RD1_CLK_i),
+          .REN_B1_i(REN1_i),
+          .WEN_B1_i(1'b0),
+          .BE_B1_i({REN1_i,REN1_i}),
+        
+          .WDATA_A2_i(PORT_A2_WDATA),
+          .RDATA_A2_o(),
+          .ADDR_A2_i(WR2_ADDR_SHIFTED),
+          .CLK_A2_i(WR2_CLK_i),
+          .REN_A2_i(1'b0),
+          .WEN_A2_i(WEN2_i),
+          .BE_A2_i(WR2_BE[1:0]),
+        
+          .WDATA_B2_i(18'h0),
+          .RDATA_B2_o(PORT_B2_RDATA),
+          .ADDR_B2_i(RD2_ADDR_SHIFTED),
+          .CLK_B2_i(RD2_CLK_i),
+          .REN_B2_i(REN2_i),
+          .WEN_B2_i(1'b0),
+          .BE_B2_i({REN2_i,REN2_i}),
+        
+          .FLUSH1_i(FLUSH1),
+          .FLUSH2_i(FLUSH2)
+        );        
+			end
+			default: begin
+				defparam BRAM_BLK.MODE_BITS = { 1'b1,
+					11'd10, 11'd10, 4'd0, MODE_2, MODE_1, MODE_2, MODE_1, 1'd0,
+					12'd10, 12'd10, 4'd0, MODE_2, MODE_1, MODE_2, MODE_1, 1'd0
+				};
+        (* is_inferred = 1 *)
+        (* is_split = 1 *)
+        (* rd_data_width = RD_DATA_WIDTH *)
+        (* wr_data_width = WR_DATA_WIDTH *)
+        TDP36K BRAM_BLK (
+          .RESET_ni(RESET_ni),
+        
+          .WDATA_A1_i(PORT_A1_WDATA),
+          .RDATA_A1_o(),
+          .ADDR_A1_i(WR1_ADDR_SHIFTED),
+          .CLK_A1_i(WR1_CLK_i),
+          .REN_A1_i(),
+          .WEN_A1_i(WEN1_i),
+          .BE_A1_i(WR1_BE[1:0]),
+        
+          .WDATA_B1_i(18'h0),
+          .RDATA_B1_o(PORT_B1_RDATA),
+          .ADDR_B1_i(RD1_ADDR_SHIFTED),
+          .CLK_B1_i(RD1_CLK_i),
+          .REN_B1_i(REN1_i),
+          .WEN_B1_i(1'b0),
+          .BE_B1_i({REN1_i,REN1_i}),
+        
+          .WDATA_A2_i(PORT_A2_WDATA),
+          .RDATA_A2_o(),
+          .ADDR_A2_i(WR2_ADDR_SHIFTED),
+          .CLK_A2_i(WR2_CLK_i),
+          .REN_A2_i(1'b0),
+          .WEN_A2_i(WEN2_i),
+          .BE_A2_i(WR2_BE[1:0]),
+        
+          .WDATA_B2_i(18'h0),
+          .RDATA_B2_o(PORT_B2_RDATA),
+          .ADDR_B2_i(RD2_ADDR_SHIFTED),
+          .CLK_B2_i(RD2_CLK_i),
+          .REN_B2_i(REN2_i),
+          .WEN_B2_i(1'b0),
+          .BE_B2_i({REN2_i,REN2_i}),
+        
+          .FLUSH1_i(FLUSH1),
+          .FLUSH2_i(FLUSH2)
+        );        
+			end
+		endcase
+	end
+	4: begin
+		case (WR_DATA_WIDTH)
+			1: begin
+				defparam BRAM_BLK.MODE_BITS = { 1'b1,
+					11'd10, 11'd10, 4'd0, MODE_4, MODE_1, MODE_4, MODE_1, 1'd0,
+					12'd10, 12'd10, 4'd0, MODE_4, MODE_1, MODE_4, MODE_1, 1'd0
+				};
+        (* is_inferred = 1 *)
+        (* is_split = 1 *)
+        (* rd_data_width = RD_DATA_WIDTH *)
+        (* wr_data_width = WR_DATA_WIDTH *)
+        TDP36K BRAM_BLK (
+          .RESET_ni(RESET_ni),
+        
+          .WDATA_A1_i(PORT_A1_WDATA),
+          .RDATA_A1_o(),
+          .ADDR_A1_i(WR1_ADDR_SHIFTED),
+          .CLK_A1_i(WR1_CLK_i),
+          .REN_A1_i(),
+          .WEN_A1_i(WEN1_i),
+          .BE_A1_i(WR1_BE[1:0]),
+        
+          .WDATA_B1_i(18'h0),
+          .RDATA_B1_o(PORT_B1_RDATA),
+          .ADDR_B1_i(RD1_ADDR_SHIFTED),
+          .CLK_B1_i(RD1_CLK_i),
+          .REN_B1_i(REN1_i),
+          .WEN_B1_i(1'b0),
+          .BE_B1_i({REN1_i,REN1_i}),
+        
+          .WDATA_A2_i(PORT_A2_WDATA),
+          .RDATA_A2_o(),
+          .ADDR_A2_i(WR2_ADDR_SHIFTED),
+          .CLK_A2_i(WR2_CLK_i),
+          .REN_A2_i(1'b0),
+          .WEN_A2_i(WEN2_i),
+          .BE_A2_i(WR2_BE[1:0]),
+        
+          .WDATA_B2_i(18'h0),
+          .RDATA_B2_o(PORT_B2_RDATA),
+          .ADDR_B2_i(RD2_ADDR_SHIFTED),
+          .CLK_B2_i(RD2_CLK_i),
+          .REN_B2_i(REN2_i),
+          .WEN_B2_i(1'b0),
+          .BE_B2_i({REN2_i,REN2_i}),
+        
+          .FLUSH1_i(FLUSH1),
+          .FLUSH2_i(FLUSH2)
+        );        
+			end
+			2: begin
+				defparam BRAM_BLK.MODE_BITS = { 1'b1,
+					11'd10, 11'd10, 4'd0, MODE_4, MODE_2, MODE_4, MODE_2, 1'd0,
+					12'd10, 12'd10, 4'd0, MODE_4, MODE_2, MODE_4, MODE_2, 1'd0
+				};
+        (* is_inferred = 1 *)
+        (* is_split = 1 *)
+        (* rd_data_width = RD_DATA_WIDTH *)
+        (* wr_data_width = WR_DATA_WIDTH *)
+        TDP36K BRAM_BLK (
+          .RESET_ni(RESET_ni),
+        
+          .WDATA_A1_i(PORT_A1_WDATA),
+          .RDATA_A1_o(),
+          .ADDR_A1_i(WR1_ADDR_SHIFTED),
+          .CLK_A1_i(WR1_CLK_i),
+          .REN_A1_i(),
+          .WEN_A1_i(WEN1_i),
+          .BE_A1_i(WR1_BE[1:0]),
+        
+          .WDATA_B1_i(18'h0),
+          .RDATA_B1_o(PORT_B1_RDATA),
+          .ADDR_B1_i(RD1_ADDR_SHIFTED),
+          .CLK_B1_i(RD1_CLK_i),
+          .REN_B1_i(REN1_i),
+          .WEN_B1_i(1'b0),
+          .BE_B1_i({REN1_i,REN1_i}),
+        
+          .WDATA_A2_i(PORT_A2_WDATA),
+          .RDATA_A2_o(),
+          .ADDR_A2_i(WR2_ADDR_SHIFTED),
+          .CLK_A2_i(WR2_CLK_i),
+          .REN_A2_i(1'b0),
+          .WEN_A2_i(WEN2_i),
+          .BE_A2_i(WR2_BE[1:0]),
+        
+          .WDATA_B2_i(18'h0),
+          .RDATA_B2_o(PORT_B2_RDATA),
+          .ADDR_B2_i(RD2_ADDR_SHIFTED),
+          .CLK_B2_i(RD2_CLK_i),
+          .REN_B2_i(REN2_i),
+          .WEN_B2_i(1'b0),
+          .BE_B2_i({REN2_i,REN2_i}),
+        
+          .FLUSH1_i(FLUSH1),
+          .FLUSH2_i(FLUSH2)
+        );        
+			end
+			4: begin
+				defparam BRAM_BLK.MODE_BITS = { 1'b1,
+					11'd10, 11'd10, 4'd0, MODE_4, MODE_4, MODE_4, MODE_4, 1'd0,
+					12'd10, 12'd10, 4'd0, MODE_4, MODE_4, MODE_4, MODE_4, 1'd0
+				};
+        (* is_inferred = 1 *)
+        (* is_split = 1 *)
+        (* rd_data_width = RD_DATA_WIDTH *)
+        (* wr_data_width = WR_DATA_WIDTH *)
+        TDP36K BRAM_BLK (
+          .RESET_ni(RESET_ni),
+        
+          .WDATA_A1_i(PORT_A1_WDATA),
+          .RDATA_A1_o(),
+          .ADDR_A1_i(WR1_ADDR_SHIFTED),
+          .CLK_A1_i(WR1_CLK_i),
+          .REN_A1_i(),
+          .WEN_A1_i(WEN1_i),
+          .BE_A1_i(WR1_BE[1:0]),
+        
+          .WDATA_B1_i(18'h0),
+          .RDATA_B1_o(PORT_B1_RDATA),
+          .ADDR_B1_i(RD1_ADDR_SHIFTED),
+          .CLK_B1_i(RD1_CLK_i),
+          .REN_B1_i(REN1_i),
+          .WEN_B1_i(1'b0),
+          .BE_B1_i({REN1_i,REN1_i}),
+        
+          .WDATA_A2_i(PORT_A2_WDATA),
+          .RDATA_A2_o(),
+          .ADDR_A2_i(WR2_ADDR_SHIFTED),
+          .CLK_A2_i(WR2_CLK_i),
+          .REN_A2_i(1'b0),
+          .WEN_A2_i(WEN2_i),
+          .BE_A2_i(WR2_BE[1:0]),
+        
+          .WDATA_B2_i(18'h0),
+          .RDATA_B2_o(PORT_B2_RDATA),
+          .ADDR_B2_i(RD2_ADDR_SHIFTED),
+          .CLK_B2_i(RD2_CLK_i),
+          .REN_B2_i(REN2_i),
+          .WEN_B2_i(1'b0),
+          .BE_B2_i({REN2_i,REN2_i}),
+        
+          .FLUSH1_i(FLUSH1),
+          .FLUSH2_i(FLUSH2)
+        );        
+			end
+			8, 9: begin
+				defparam BRAM_BLK.MODE_BITS = { 1'b1,
+					11'd10, 11'd10, 4'd0, MODE_4, MODE_9, MODE_4, MODE_9, 1'd0,
+					12'd10, 12'd10, 4'd0, MODE_4, MODE_9, MODE_4, MODE_9, 1'd0
+				};
+        (* is_inferred = 1 *)
+        (* is_split = 1 *)
+        (* rd_data_width = RD_DATA_WIDTH *)
+        (* wr_data_width = WR_DATA_WIDTH *)
+        TDP36K BRAM_BLK (
+          .RESET_ni(RESET_ni),
+        
+          .WDATA_A1_i(PORT_A1_WDATA),
+          .RDATA_A1_o(),
+          .ADDR_A1_i(WR1_ADDR_SHIFTED),
+          .CLK_A1_i(WR1_CLK_i),
+          .REN_A1_i(),
+          .WEN_A1_i(WEN1_i),
+          .BE_A1_i(WR1_BE[1:0]),
+        
+          .WDATA_B1_i(18'h0),
+          .RDATA_B1_o(PORT_B1_RDATA),
+          .ADDR_B1_i(RD1_ADDR_SHIFTED),
+          .CLK_B1_i(RD1_CLK_i),
+          .REN_B1_i(REN1_i),
+          .WEN_B1_i(1'b0),
+          .BE_B1_i({REN1_i,REN1_i}),
+        
+          .WDATA_A2_i(PORT_A2_WDATA),
+          .RDATA_A2_o(),
+          .ADDR_A2_i(WR2_ADDR_SHIFTED),
+          .CLK_A2_i(WR2_CLK_i),
+          .REN_A2_i(1'b0),
+          .WEN_A2_i(WEN2_i),
+          .BE_A2_i(WR2_BE[1:0]),
+        
+          .WDATA_B2_i(18'h0),
+          .RDATA_B2_o(PORT_B2_RDATA),
+          .ADDR_B2_i(RD2_ADDR_SHIFTED),
+          .CLK_B2_i(RD2_CLK_i),
+          .REN_B2_i(REN2_i),
+          .WEN_B2_i(1'b0),
+          .BE_B2_i({REN2_i,REN2_i}),
+        
+          .FLUSH1_i(FLUSH1),
+          .FLUSH2_i(FLUSH2)
+        );       
+			end
+			16, 18: begin
+				defparam BRAM_BLK.MODE_BITS = { 1'b1,
+					11'd10, 11'd10, 4'd0, MODE_4, MODE_18, MODE_4, MODE_18, 1'd0,
+					12'd10, 12'd10, 4'd0, MODE_4, MODE_18, MODE_4, MODE_18, 1'd0
+				};
+        (* is_inferred = 1 *)
+        (* is_split = 1 *)
+        (* rd_data_width = RD_DATA_WIDTH *)
+        (* wr_data_width = WR_DATA_WIDTH *)
+        TDP36K BRAM_BLK (
+          .RESET_ni(RESET_ni),
+        
+          .WDATA_A1_i(PORT_A1_WDATA),
+          .RDATA_A1_o(),
+          .ADDR_A1_i(WR1_ADDR_SHIFTED),
+          .CLK_A1_i(WR1_CLK_i),
+          .REN_A1_i(),
+          .WEN_A1_i(WEN1_i),
+          .BE_A1_i(WR1_BE[1:0]),
+        
+          .WDATA_B1_i(18'h0),
+          .RDATA_B1_o(PORT_B1_RDATA),
+          .ADDR_B1_i(RD1_ADDR_SHIFTED),
+          .CLK_B1_i(RD1_CLK_i),
+          .REN_B1_i(REN1_i),
+          .WEN_B1_i(1'b0),
+          .BE_B1_i({REN1_i,REN1_i}),
+        
+          .WDATA_A2_i(PORT_A2_WDATA),
+          .RDATA_A2_o(),
+          .ADDR_A2_i(WR2_ADDR_SHIFTED),
+          .CLK_A2_i(WR2_CLK_i),
+          .REN_A2_i(1'b0),
+          .WEN_A2_i(WEN2_i),
+          .BE_A2_i(WR2_BE[1:0]),
+        
+          .WDATA_B2_i(18'h0),
+          .RDATA_B2_o(PORT_B2_RDATA),
+          .ADDR_B2_i(RD2_ADDR_SHIFTED),
+          .CLK_B2_i(RD2_CLK_i),
+          .REN_B2_i(REN2_i),
+          .WEN_B2_i(1'b0),
+          .BE_B2_i({REN2_i,REN2_i}),
+        
+          .FLUSH1_i(FLUSH1),
+          .FLUSH2_i(FLUSH2)
+        );        
+			end
+			default: begin
+				defparam BRAM_BLK.MODE_BITS = { 1'b1,
+					11'd10, 11'd10, 4'd0, MODE_4, MODE_1, MODE_4, MODE_1, 1'd0,
+					12'd10, 12'd10, 4'd0, MODE_4, MODE_1, MODE_4, MODE_1, 1'd0
+				};
+        (* is_inferred = 1 *)
+        (* is_split = 1 *)
+        (* rd_data_width = RD_DATA_WIDTH *)
+        (* wr_data_width = WR_DATA_WIDTH *)
+        TDP36K BRAM_BLK (
+          .RESET_ni(RESET_ni),
+        
+          .WDATA_A1_i(PORT_A1_WDATA),
+          .RDATA_A1_o(),
+          .ADDR_A1_i(WR1_ADDR_SHIFTED),
+          .CLK_A1_i(WR1_CLK_i),
+          .REN_A1_i(),
+          .WEN_A1_i(WEN1_i),
+          .BE_A1_i(WR1_BE[1:0]),
+        
+          .WDATA_B1_i(18'h0),
+          .RDATA_B1_o(PORT_B1_RDATA),
+          .ADDR_B1_i(RD1_ADDR_SHIFTED),
+          .CLK_B1_i(RD1_CLK_i),
+          .REN_B1_i(REN1_i),
+          .WEN_B1_i(1'b0),
+          .BE_B1_i({REN1_i,REN1_i}),
+        
+          .WDATA_A2_i(PORT_A2_WDATA),
+          .RDATA_A2_o(),
+          .ADDR_A2_i(WR2_ADDR_SHIFTED),
+          .CLK_A2_i(WR2_CLK_i),
+          .REN_A2_i(1'b0),
+          .WEN_A2_i(WEN2_i),
+          .BE_A2_i(WR2_BE[1:0]),
+        
+          .WDATA_B2_i(18'h0),
+          .RDATA_B2_o(PORT_B2_RDATA),
+          .ADDR_B2_i(RD2_ADDR_SHIFTED),
+          .CLK_B2_i(RD2_CLK_i),
+          .REN_B2_i(REN2_i),
+          .WEN_B2_i(1'b0),
+          .BE_B2_i({REN2_i,REN2_i}),
+        
+          .FLUSH1_i(FLUSH1),
+          .FLUSH2_i(FLUSH2)
+        );        
+			end
+		endcase
+	end
+	8, 9: begin
+		case (WR_DATA_WIDTH)
+			1: begin
+				defparam BRAM_BLK.MODE_BITS = { 1'b1,
+					11'd10, 11'd10, 4'd0, MODE_9, MODE_1, MODE_9, MODE_1, 1'd0,
+					12'd10, 12'd10, 4'd0, MODE_9, MODE_1, MODE_9, MODE_1, 1'd0
+				};
+        (* is_inferred = 1 *)
+        (* is_split = 1 *)
+        (* rd_data_width = RD_DATA_WIDTH *)
+        (* wr_data_width = WR_DATA_WIDTH *)
+        TDP36K BRAM_BLK (
+          .RESET_ni(RESET_ni),
+        
+          .WDATA_A1_i(PORT_A1_WDATA),
+          .RDATA_A1_o(),
+          .ADDR_A1_i(WR1_ADDR_SHIFTED),
+          .CLK_A1_i(WR1_CLK_i),
+          .REN_A1_i(),
+          .WEN_A1_i(WEN1_i),
+          .BE_A1_i(WR1_BE[1:0]),
+        
+          .WDATA_B1_i(18'h0),
+          .RDATA_B1_o(PORT_B1_RDATA),
+          .ADDR_B1_i(RD1_ADDR_SHIFTED),
+          .CLK_B1_i(RD1_CLK_i),
+          .REN_B1_i(REN1_i),
+          .WEN_B1_i(1'b0),
+          .BE_B1_i({REN1_i,REN1_i}),
+        
+          .WDATA_A2_i(PORT_A2_WDATA),
+          .RDATA_A2_o(),
+          .ADDR_A2_i(WR2_ADDR_SHIFTED),
+          .CLK_A2_i(WR2_CLK_i),
+          .REN_A2_i(1'b0),
+          .WEN_A2_i(WEN2_i),
+          .BE_A2_i(WR2_BE[1:0]),
+        
+          .WDATA_B2_i(18'h0),
+          .RDATA_B2_o(PORT_B2_RDATA),
+          .ADDR_B2_i(RD2_ADDR_SHIFTED),
+          .CLK_B2_i(RD2_CLK_i),
+          .REN_B2_i(REN2_i),
+          .WEN_B2_i(1'b0),
+          .BE_B2_i({REN2_i,REN2_i}),
+        
+          .FLUSH1_i(FLUSH1),
+          .FLUSH2_i(FLUSH2)
+        );        
+			end
+			2: begin
+				defparam BRAM_BLK.MODE_BITS = { 1'b1,
+					11'd10, 11'd10, 4'd0, MODE_9, MODE_2, MODE_9, MODE_2, 1'd0,
+					12'd10, 12'd10, 4'd0, MODE_9, MODE_2, MODE_9, MODE_2, 1'd0
+				};
+        (* is_inferred = 1 *)
+        (* is_split = 1 *)
+        (* rd_data_width = RD_DATA_WIDTH *)
+        (* wr_data_width = WR_DATA_WIDTH *)
+        TDP36K BRAM_BLK (
+          .RESET_ni(RESET_ni),
+        
+          .WDATA_A1_i(PORT_A1_WDATA),
+          .RDATA_A1_o(),
+          .ADDR_A1_i(WR1_ADDR_SHIFTED),
+          .CLK_A1_i(WR1_CLK_i),
+          .REN_A1_i(),
+          .WEN_A1_i(WEN1_i),
+          .BE_A1_i(WR1_BE[1:0]),
+        
+          .WDATA_B1_i(18'h0),
+          .RDATA_B1_o(PORT_B1_RDATA),
+          .ADDR_B1_i(RD1_ADDR_SHIFTED),
+          .CLK_B1_i(RD1_CLK_i),
+          .REN_B1_i(REN1_i),
+          .WEN_B1_i(1'b0),
+          .BE_B1_i({REN1_i,REN1_i}),
+        
+          .WDATA_A2_i(PORT_A2_WDATA),
+          .RDATA_A2_o(),
+          .ADDR_A2_i(WR2_ADDR_SHIFTED),
+          .CLK_A2_i(WR2_CLK_i),
+          .REN_A2_i(1'b0),
+          .WEN_A2_i(WEN2_i),
+          .BE_A2_i(WR2_BE[1:0]),
+        
+          .WDATA_B2_i(18'h0),
+          .RDATA_B2_o(PORT_B2_RDATA),
+          .ADDR_B2_i(RD2_ADDR_SHIFTED),
+          .CLK_B2_i(RD2_CLK_i),
+          .REN_B2_i(REN2_i),
+          .WEN_B2_i(1'b0),
+          .BE_B2_i({REN2_i,REN2_i}),
+        
+          .FLUSH1_i(FLUSH1),
+          .FLUSH2_i(FLUSH2)
+        );        
+			end
+			4: begin
+				defparam BRAM_BLK.MODE_BITS = { 1'b1,
+					11'd10, 11'd10, 4'd0, MODE_9, MODE_4, MODE_9, MODE_4, 1'd0,
+					12'd10, 12'd10, 4'd0, MODE_9, MODE_4, MODE_9, MODE_4, 1'd0
+				};
+        (* is_inferred = 1 *)
+        (* is_split = 1 *)
+        (* rd_data_width = RD_DATA_WIDTH *)
+        (* wr_data_width = WR_DATA_WIDTH *)
+        TDP36K BRAM_BLK (
+          .RESET_ni(RESET_ni),
+        
+          .WDATA_A1_i(PORT_A1_WDATA),
+          .RDATA_A1_o(),
+          .ADDR_A1_i(WR1_ADDR_SHIFTED),
+          .CLK_A1_i(WR1_CLK_i),
+          .REN_A1_i(),
+          .WEN_A1_i(WEN1_i),
+          .BE_A1_i(WR1_BE[1:0]),
+        
+          .WDATA_B1_i(18'h0),
+          .RDATA_B1_o(PORT_B1_RDATA),
+          .ADDR_B1_i(RD1_ADDR_SHIFTED),
+          .CLK_B1_i(RD1_CLK_i),
+          .REN_B1_i(REN1_i),
+          .WEN_B1_i(1'b0),
+          .BE_B1_i({REN1_i,REN1_i}),
+        
+          .WDATA_A2_i(PORT_A2_WDATA),
+          .RDATA_A2_o(),
+          .ADDR_A2_i(WR2_ADDR_SHIFTED),
+          .CLK_A2_i(WR2_CLK_i),
+          .REN_A2_i(1'b0),
+          .WEN_A2_i(WEN2_i),
+          .BE_A2_i(WR2_BE[1:0]),
+        
+          .WDATA_B2_i(18'h0),
+          .RDATA_B2_o(PORT_B2_RDATA),
+          .ADDR_B2_i(RD2_ADDR_SHIFTED),
+          .CLK_B2_i(RD2_CLK_i),
+          .REN_B2_i(REN2_i),
+          .WEN_B2_i(1'b0),
+          .BE_B2_i({REN2_i,REN2_i}),
+        
+          .FLUSH1_i(FLUSH1),
+          .FLUSH2_i(FLUSH2)
+        );        
+			end
+			8, 9: begin
+				defparam BRAM_BLK.MODE_BITS = { 1'b1,
+					11'd10, 11'd10, 4'd0, MODE_9, MODE_9, MODE_9, MODE_9, 1'd0,
+					12'd10, 12'd10, 4'd0, MODE_9, MODE_9, MODE_9, MODE_9, 1'd0
+				};
+        (* is_inferred = 1 *)
+        (* is_split = 1 *)
+        (* rd_data_width = RD_DATA_WIDTH *)
+        (* wr_data_width = WR_DATA_WIDTH *)
+        TDP36K BRAM_BLK (
+          .RESET_ni(RESET_ni),
+        
+          .WDATA_A1_i(PORT_A1_WDATA),
+          .RDATA_A1_o(),
+          .ADDR_A1_i(WR1_ADDR_SHIFTED),
+          .CLK_A1_i(WR1_CLK_i),
+          .REN_A1_i(),
+          .WEN_A1_i(WEN1_i),
+          .BE_A1_i(WR1_BE[1:0]),
+        
+          .WDATA_B1_i(18'h0),
+          .RDATA_B1_o(PORT_B1_RDATA),
+          .ADDR_B1_i(RD1_ADDR_SHIFTED),
+          .CLK_B1_i(RD1_CLK_i),
+          .REN_B1_i(REN1_i),
+          .WEN_B1_i(1'b0),
+          .BE_B1_i({REN1_i,REN1_i}),
+        
+          .WDATA_A2_i(PORT_A2_WDATA),
+          .RDATA_A2_o(),
+          .ADDR_A2_i(WR2_ADDR_SHIFTED),
+          .CLK_A2_i(WR2_CLK_i),
+          .REN_A2_i(1'b0),
+          .WEN_A2_i(WEN2_i),
+          .BE_A2_i(WR2_BE[1:0]),
+        
+          .WDATA_B2_i(18'h0),
+          .RDATA_B2_o(PORT_B2_RDATA),
+          .ADDR_B2_i(RD2_ADDR_SHIFTED),
+          .CLK_B2_i(RD2_CLK_i),
+          .REN_B2_i(REN2_i),
+          .WEN_B2_i(1'b0),
+          .BE_B2_i({REN2_i,REN2_i}),
+        
+          .FLUSH1_i(FLUSH1),
+          .FLUSH2_i(FLUSH2)
+        );        
+			end
+			16, 18: begin
+				defparam BRAM_BLK.MODE_BITS = { 1'b1,
+					11'd10, 11'd10, 4'd0, MODE_9, MODE_18, MODE_9, MODE_18, 1'd0,
+					12'd10, 12'd10, 4'd0, MODE_9, MODE_18, MODE_9, MODE_18, 1'd0
+				};
+        (* is_inferred = 1 *)
+        (* is_split = 1 *)
+        (* rd_data_width = RD_DATA_WIDTH *)
+        (* wr_data_width = WR_DATA_WIDTH *)
+        TDP36K BRAM_BLK (
+          .RESET_ni(RESET_ni),
+        
+          .WDATA_A1_i(PORT_A1_WDATA),
+          .RDATA_A1_o(),
+          .ADDR_A1_i(WR1_ADDR_SHIFTED),
+          .CLK_A1_i(WR1_CLK_i),
+          .REN_A1_i(),
+          .WEN_A1_i(WEN1_i),
+          .BE_A1_i(WR1_BE[1:0]),
+        
+          .WDATA_B1_i(18'h0),
+          .RDATA_B1_o(PORT_B1_RDATA),
+          .ADDR_B1_i(RD1_ADDR_SHIFTED),
+          .CLK_B1_i(RD1_CLK_i),
+          .REN_B1_i(REN1_i),
+          .WEN_B1_i(1'b0),
+          .BE_B1_i({REN1_i,REN1_i}),
+        
+          .WDATA_A2_i(PORT_A2_WDATA),
+          .RDATA_A2_o(),
+          .ADDR_A2_i(WR2_ADDR_SHIFTED),
+          .CLK_A2_i(WR2_CLK_i),
+          .REN_A2_i(1'b0),
+          .WEN_A2_i(WEN2_i),
+          .BE_A2_i(WR2_BE[1:0]),
+        
+          .WDATA_B2_i(18'h0),
+          .RDATA_B2_o(PORT_B2_RDATA),
+          .ADDR_B2_i(RD2_ADDR_SHIFTED),
+          .CLK_B2_i(RD2_CLK_i),
+          .REN_B2_i(REN2_i),
+          .WEN_B2_i(1'b0),
+          .BE_B2_i({REN2_i,REN2_i}),
+        
+          .FLUSH1_i(FLUSH1),
+          .FLUSH2_i(FLUSH2)
+        );        
+			end
+			default: begin
+				defparam BRAM_BLK.MODE_BITS = { 1'b1,
+					11'd10, 11'd10, 4'd0, MODE_9, MODE_1, MODE_9, MODE_1, 1'd0,
+					12'd10, 12'd10, 4'd0, MODE_9, MODE_1, MODE_9, MODE_1, 1'd0
+				};
+        (* is_inferred = 1 *)
+        (* is_split = 1 *)
+        (* rd_data_width = RD_DATA_WIDTH *)
+        (* wr_data_width = WR_DATA_WIDTH *)
+        TDP36K BRAM_BLK (
+          .RESET_ni(RESET_ni),
+        
+          .WDATA_A1_i(PORT_A1_WDATA),
+          .RDATA_A1_o(),
+          .ADDR_A1_i(WR1_ADDR_SHIFTED),
+          .CLK_A1_i(WR1_CLK_i),
+          .REN_A1_i(),
+          .WEN_A1_i(WEN1_i),
+          .BE_A1_i(WR1_BE[1:0]),
+        
+          .WDATA_B1_i(18'h0),
+          .RDATA_B1_o(PORT_B1_RDATA),
+          .ADDR_B1_i(RD1_ADDR_SHIFTED),
+          .CLK_B1_i(RD1_CLK_i),
+          .REN_B1_i(REN1_i),
+          .WEN_B1_i(1'b0),
+          .BE_B1_i({REN1_i,REN1_i}),
+        
+          .WDATA_A2_i(PORT_A2_WDATA),
+          .RDATA_A2_o(),
+          .ADDR_A2_i(WR2_ADDR_SHIFTED),
+          .CLK_A2_i(WR2_CLK_i),
+          .REN_A2_i(1'b0),
+          .WEN_A2_i(WEN2_i),
+          .BE_A2_i(WR2_BE[1:0]),
+        
+          .WDATA_B2_i(18'h0),
+          .RDATA_B2_o(PORT_B2_RDATA),
+          .ADDR_B2_i(RD2_ADDR_SHIFTED),
+          .CLK_B2_i(RD2_CLK_i),
+          .REN_B2_i(REN2_i),
+          .WEN_B2_i(1'b0),
+          .BE_B2_i({REN2_i,REN2_i}),
+        
+          .FLUSH1_i(FLUSH1),
+          .FLUSH2_i(FLUSH2)
+        );        
+			end
+		endcase
+	end
+	16, 18: begin
+		case (WR_DATA_WIDTH)
+			1: begin
+				defparam BRAM_BLK.MODE_BITS = { 1'b1,
+					11'd10, 11'd10, 4'd0, MODE_18, MODE_1, MODE_18, MODE_1, 1'd0,
+					12'd10, 12'd10, 4'd0, MODE_18, MODE_1, MODE_18, MODE_1, 1'd0
+				};
+        (* is_inferred = 1 *)
+        (* is_split = 1 *)
+        (* rd_data_width = RD_DATA_WIDTH *)
+        (* wr_data_width = WR_DATA_WIDTH *)
+        TDP36K BRAM_BLK (
+          .RESET_ni(RESET_ni),
+        
+          .WDATA_A1_i(PORT_A1_WDATA),
+          .RDATA_A1_o(),
+          .ADDR_A1_i(WR1_ADDR_SHIFTED),
+          .CLK_A1_i(WR1_CLK_i),
+          .REN_A1_i(),
+          .WEN_A1_i(WEN1_i),
+          .BE_A1_i(WR1_BE[1:0]),
+        
+          .WDATA_B1_i(18'h0),
+          .RDATA_B1_o(PORT_B1_RDATA),
+          .ADDR_B1_i(RD1_ADDR_SHIFTED),
+          .CLK_B1_i(RD1_CLK_i),
+          .REN_B1_i(REN1_i),
+          .WEN_B1_i(1'b0),
+          .BE_B1_i({REN1_i,REN1_i}),
+        
+          .WDATA_A2_i(PORT_A2_WDATA),
+          .RDATA_A2_o(),
+          .ADDR_A2_i(WR2_ADDR_SHIFTED),
+          .CLK_A2_i(WR2_CLK_i),
+          .REN_A2_i(1'b0),
+          .WEN_A2_i(WEN2_i),
+          .BE_A2_i(WR2_BE[1:0]),
+        
+          .WDATA_B2_i(18'h0),
+          .RDATA_B2_o(PORT_B2_RDATA),
+          .ADDR_B2_i(RD2_ADDR_SHIFTED),
+          .CLK_B2_i(RD2_CLK_i),
+          .REN_B2_i(REN2_i),
+          .WEN_B2_i(1'b0),
+          .BE_B2_i({REN2_i,REN2_i}),
+        
+          .FLUSH1_i(FLUSH1),
+          .FLUSH2_i(FLUSH2)
+        );        
+			end
+			2: begin
+				defparam BRAM_BLK.MODE_BITS = { 1'b1,
+					11'd10, 11'd10, 4'd0, MODE_18, MODE_2, MODE_18, MODE_2, 1'd0,
+					12'd10, 12'd10, 4'd0, MODE_18, MODE_2, MODE_18, MODE_2, 1'd0
+				};
+        (* is_inferred = 1 *)
+        (* is_split = 1 *)
+        (* rd_data_width = RD_DATA_WIDTH *)
+        (* wr_data_width = WR_DATA_WIDTH *)
+        TDP36K BRAM_BLK (
+          .RESET_ni(RESET_ni),
+        
+          .WDATA_A1_i(PORT_A1_WDATA),
+          .RDATA_A1_o(),
+          .ADDR_A1_i(WR1_ADDR_SHIFTED),
+          .CLK_A1_i(WR1_CLK_i),
+          .REN_A1_i(),
+          .WEN_A1_i(WEN1_i),
+          .BE_A1_i(WR1_BE[1:0]),
+        
+          .WDATA_B1_i(18'h0),
+          .RDATA_B1_o(PORT_B1_RDATA),
+          .ADDR_B1_i(RD1_ADDR_SHIFTED),
+          .CLK_B1_i(RD1_CLK_i),
+          .REN_B1_i(REN1_i),
+          .WEN_B1_i(1'b0),
+          .BE_B1_i({REN1_i,REN1_i}),
+        
+          .WDATA_A2_i(PORT_A2_WDATA),
+          .RDATA_A2_o(),
+          .ADDR_A2_i(WR2_ADDR_SHIFTED),
+          .CLK_A2_i(WR2_CLK_i),
+          .REN_A2_i(1'b0),
+          .WEN_A2_i(WEN2_i),
+          .BE_A2_i(WR2_BE[1:0]),
+        
+          .WDATA_B2_i(18'h0),
+          .RDATA_B2_o(PORT_B2_RDATA),
+          .ADDR_B2_i(RD2_ADDR_SHIFTED),
+          .CLK_B2_i(RD2_CLK_i),
+          .REN_B2_i(REN2_i),
+          .WEN_B2_i(1'b0),
+          .BE_B2_i({REN2_i,REN2_i}),
+        
+          .FLUSH1_i(FLUSH1),
+          .FLUSH2_i(FLUSH2)
+        );        
+			end
+			4: begin
+				defparam BRAM_BLK.MODE_BITS = { 1'b1,
+					11'd10, 11'd10, 4'd0, MODE_18, MODE_4, MODE_18, MODE_4, 1'd0,
+					12'd10, 12'd10, 4'd0, MODE_18, MODE_4, MODE_18, MODE_4, 1'd0
+				};
+        (* is_inferred = 1 *)
+        (* is_split = 1 *)
+        (* rd_data_width = RD_DATA_WIDTH *)
+        (* wr_data_width = WR_DATA_WIDTH *)
+        TDP36K BRAM_BLK (
+          .RESET_ni(RESET_ni),
+        
+          .WDATA_A1_i(PORT_A1_WDATA),
+          .RDATA_A1_o(),
+          .ADDR_A1_i(WR1_ADDR_SHIFTED),
+          .CLK_A1_i(WR1_CLK_i),
+          .REN_A1_i(),
+          .WEN_A1_i(WEN1_i),
+          .BE_A1_i(WR1_BE[1:0]),
+        
+          .WDATA_B1_i(18'h0),
+          .RDATA_B1_o(PORT_B1_RDATA),
+          .ADDR_B1_i(RD1_ADDR_SHIFTED),
+          .CLK_B1_i(RD1_CLK_i),
+          .REN_B1_i(REN1_i),
+          .WEN_B1_i(1'b0),
+          .BE_B1_i({REN1_i,REN1_i}),
+        
+          .WDATA_A2_i(PORT_A2_WDATA),
+          .RDATA_A2_o(),
+          .ADDR_A2_i(WR2_ADDR_SHIFTED),
+          .CLK_A2_i(WR2_CLK_i),
+          .REN_A2_i(1'b0),
+          .WEN_A2_i(WEN2_i),
+          .BE_A2_i(WR2_BE[1:0]),
+        
+          .WDATA_B2_i(18'h0),
+          .RDATA_B2_o(PORT_B2_RDATA),
+          .ADDR_B2_i(RD2_ADDR_SHIFTED),
+          .CLK_B2_i(RD2_CLK_i),
+          .REN_B2_i(REN2_i),
+          .WEN_B2_i(1'b0),
+          .BE_B2_i({REN2_i,REN2_i}),
+        
+          .FLUSH1_i(FLUSH1),
+          .FLUSH2_i(FLUSH2)
+        );        
+			end
+			8, 9: begin
+				defparam BRAM_BLK.MODE_BITS = { 1'b1,
+					11'd10, 11'd10, 4'd0, MODE_18, MODE_9, MODE_18, MODE_9, 1'd0,
+					12'd10, 12'd10, 4'd0, MODE_18, MODE_9, MODE_18, MODE_9, 1'd0
+				};
+        (* is_inferred = 1 *)
+        (* is_split = 1 *)
+        (* rd_data_width = RD_DATA_WIDTH *)
+        (* wr_data_width = WR_DATA_WIDTH *)
+        TDP36K BRAM_BLK (
+          .RESET_ni(RESET_ni),
+        
+          .WDATA_A1_i(PORT_A1_WDATA),
+          .RDATA_A1_o(),
+          .ADDR_A1_i(WR1_ADDR_SHIFTED),
+          .CLK_A1_i(WR1_CLK_i),
+          .REN_A1_i(),
+          .WEN_A1_i(WEN1_i),
+          .BE_A1_i(WR1_BE[1:0]),
+        
+          .WDATA_B1_i(18'h0),
+          .RDATA_B1_o(PORT_B1_RDATA),
+          .ADDR_B1_i(RD1_ADDR_SHIFTED),
+          .CLK_B1_i(RD1_CLK_i),
+          .REN_B1_i(REN1_i),
+          .WEN_B1_i(1'b0),
+          .BE_B1_i({REN1_i,REN1_i}),
+        
+          .WDATA_A2_i(PORT_A2_WDATA),
+          .RDATA_A2_o(),
+          .ADDR_A2_i(WR2_ADDR_SHIFTED),
+          .CLK_A2_i(WR2_CLK_i),
+          .REN_A2_i(1'b0),
+          .WEN_A2_i(WEN2_i),
+          .BE_A2_i(WR2_BE[1:0]),
+        
+          .WDATA_B2_i(18'h0),
+          .RDATA_B2_o(PORT_B2_RDATA),
+          .ADDR_B2_i(RD2_ADDR_SHIFTED),
+          .CLK_B2_i(RD2_CLK_i),
+          .REN_B2_i(REN2_i),
+          .WEN_B2_i(1'b0),
+          .BE_B2_i({REN2_i,REN2_i}),
+        
+          .FLUSH1_i(FLUSH1),
+          .FLUSH2_i(FLUSH2)
+        );        
+			end
+			16, 18: begin
+				defparam BRAM_BLK.MODE_BITS = { 1'b1,
+					11'd10, 11'd10, 4'd0, MODE_18, MODE_18, MODE_18, MODE_18, 1'd0,
+					12'd10, 12'd10, 4'd0, MODE_18, MODE_18, MODE_18, MODE_18, 1'd0
+				};
+        (* is_inferred = 1 *)
+        (* is_split = 1 *)
+        (* rd_data_width = RD_DATA_WIDTH *)
+        (* wr_data_width = WR_DATA_WIDTH *)
+        TDP36K BRAM_BLK (
+          .RESET_ni(RESET_ni),
+        
+          .WDATA_A1_i(PORT_A1_WDATA),
+          .RDATA_A1_o(),
+          .ADDR_A1_i(WR1_ADDR_SHIFTED),
+          .CLK_A1_i(WR1_CLK_i),
+          .REN_A1_i(),
+          .WEN_A1_i(WEN1_i),
+          .BE_A1_i(WR1_BE[1:0]),
+        
+          .WDATA_B1_i(18'h0),
+          .RDATA_B1_o(PORT_B1_RDATA),
+          .ADDR_B1_i(RD1_ADDR_SHIFTED),
+          .CLK_B1_i(RD1_CLK_i),
+          .REN_B1_i(REN1_i),
+          .WEN_B1_i(1'b0),
+          .BE_B1_i({REN1_i,REN1_i}),
+        
+          .WDATA_A2_i(PORT_A2_WDATA),
+          .RDATA_A2_o(),
+          .ADDR_A2_i(WR2_ADDR_SHIFTED),
+          .CLK_A2_i(WR2_CLK_i),
+          .REN_A2_i(1'b0),
+          .WEN_A2_i(WEN2_i),
+          .BE_A2_i(WR2_BE[1:0]),
+        
+          .WDATA_B2_i(18'h0),
+          .RDATA_B2_o(PORT_B2_RDATA),
+          .ADDR_B2_i(RD2_ADDR_SHIFTED),
+          .CLK_B2_i(RD2_CLK_i),
+          .REN_B2_i(REN2_i),
+          .WEN_B2_i(1'b0),
+          .BE_B2_i({REN2_i,REN2_i}),
+        
+          .FLUSH1_i(FLUSH1),
+          .FLUSH2_i(FLUSH2)
+        );        
+			end
+			default: begin
+				defparam BRAM_BLK.MODE_BITS = { 1'b1,
+					11'd10, 11'd10, 4'd0, MODE_18, MODE_1, MODE_18, MODE_1, 1'd0,
+					12'd10, 12'd10, 4'd0, MODE_18, MODE_1, MODE_18, MODE_1, 1'd0
+				};
+        (* is_inferred = 1 *)
+        (* is_split = 1 *)
+        (* rd_data_width = RD_DATA_WIDTH *)
+        (* wr_data_width = WR_DATA_WIDTH *)
+        TDP36K BRAM_BLK (
+          .RESET_ni(RESET_ni),
+        
+          .WDATA_A1_i(PORT_A1_WDATA),
+          .RDATA_A1_o(),
+          .ADDR_A1_i(WR1_ADDR_SHIFTED),
+          .CLK_A1_i(WR1_CLK_i),
+          .REN_A1_i(),
+          .WEN_A1_i(WEN1_i),
+          .BE_A1_i(WR1_BE[1:0]),
+        
+          .WDATA_B1_i(18'h0),
+          .RDATA_B1_o(PORT_B1_RDATA),
+          .ADDR_B1_i(RD1_ADDR_SHIFTED),
+          .CLK_B1_i(RD1_CLK_i),
+          .REN_B1_i(REN1_i),
+          .WEN_B1_i(1'b0),
+          .BE_B1_i({REN1_i,REN1_i}),
+        
+          .WDATA_A2_i(PORT_A2_WDATA),
+          .RDATA_A2_o(),
+          .ADDR_A2_i(WR2_ADDR_SHIFTED),
+          .CLK_A2_i(WR2_CLK_i),
+          .REN_A2_i(1'b0),
+          .WEN_A2_i(WEN2_i),
+          .BE_A2_i(WR2_BE[1:0]),
+        
+          .WDATA_B2_i(18'h0),
+          .RDATA_B2_o(PORT_B2_RDATA),
+          .ADDR_B2_i(RD2_ADDR_SHIFTED),
+          .CLK_B2_i(RD2_CLK_i),
+          .REN_B2_i(REN2_i),
+          .WEN_B2_i(1'b0),
+          .BE_B2_i({REN2_i,REN2_i}),
+        
+          .FLUSH1_i(FLUSH1),
+          .FLUSH2_i(FLUSH2)
+        );        
+			end
+		endcase
+	end
+	default: begin
+		case (WR_DATA_WIDTH)
+			1: begin
+				defparam BRAM_BLK.MODE_BITS = { 1'b1,
+					11'd10, 11'd10, 4'd0, MODE_1, MODE_1, MODE_1, MODE_1, 1'd0,
+					12'd10, 12'd10, 4'd0, MODE_1, MODE_1, MODE_1, MODE_1, 1'd0
+				};
+        (* is_inferred = 1 *)
+        (* is_split = 1 *)
+        (* rd_data_width = RD_DATA_WIDTH *)
+        (* wr_data_width = WR_DATA_WIDTH *)
+        TDP36K BRAM_BLK (
+          .RESET_ni(RESET_ni),
+        
+          .WDATA_A1_i(PORT_A1_WDATA),
+          .RDATA_A1_o(),
+          .ADDR_A1_i(WR1_ADDR_SHIFTED),
+          .CLK_A1_i(WR1_CLK_i),
+          .REN_A1_i(),
+          .WEN_A1_i(WEN1_i),
+          .BE_A1_i(WR1_BE[1:0]),
+        
+          .WDATA_B1_i(18'h0),
+          .RDATA_B1_o(PORT_B1_RDATA),
+          .ADDR_B1_i(RD1_ADDR_SHIFTED),
+          .CLK_B1_i(RD1_CLK_i),
+          .REN_B1_i(REN1_i),
+          .WEN_B1_i(1'b0),
+          .BE_B1_i({REN1_i,REN1_i}),
+        
+          .WDATA_A2_i(PORT_A2_WDATA),
+          .RDATA_A2_o(),
+          .ADDR_A2_i(WR2_ADDR_SHIFTED),
+          .CLK_A2_i(WR2_CLK_i),
+          .REN_A2_i(1'b0),
+          .WEN_A2_i(WEN2_i),
+          .BE_A2_i(WR2_BE[1:0]),
+        
+          .WDATA_B2_i(18'h0),
+          .RDATA_B2_o(PORT_B2_RDATA),
+          .ADDR_B2_i(RD2_ADDR_SHIFTED),
+          .CLK_B2_i(RD2_CLK_i),
+          .REN_B2_i(REN2_i),
+          .WEN_B2_i(1'b0),
+          .BE_B2_i({REN2_i,REN2_i}),
+        
+          .FLUSH1_i(FLUSH1),
+          .FLUSH2_i(FLUSH2)
+        );        
+			end
+			2: begin
+				defparam BRAM_BLK.MODE_BITS = { 1'b1,
+					11'd10, 11'd10, 4'd0, MODE_1, MODE_2, MODE_1, MODE_2, 1'd0,
+					12'd10, 12'd10, 4'd0, MODE_1, MODE_2, MODE_1, MODE_2, 1'd0
+				};
+        (* is_inferred = 1 *)
+        (* is_split = 1 *)
+        (* rd_data_width = RD_DATA_WIDTH *)
+        (* wr_data_width = WR_DATA_WIDTH *)
+        TDP36K BRAM_BLK (
+          .RESET_ni(RESET_ni),
+        
+          .WDATA_A1_i(PORT_A1_WDATA),
+          .RDATA_A1_o(),
+          .ADDR_A1_i(WR1_ADDR_SHIFTED),
+          .CLK_A1_i(WR1_CLK_i),
+          .REN_A1_i(),
+          .WEN_A1_i(WEN1_i),
+          .BE_A1_i(WR1_BE[1:0]),
+        
+          .WDATA_B1_i(18'h0),
+          .RDATA_B1_o(PORT_B1_RDATA),
+          .ADDR_B1_i(RD1_ADDR_SHIFTED),
+          .CLK_B1_i(RD1_CLK_i),
+          .REN_B1_i(REN1_i),
+          .WEN_B1_i(1'b0),
+          .BE_B1_i({REN1_i,REN1_i}),
+        
+          .WDATA_A2_i(PORT_A2_WDATA),
+          .RDATA_A2_o(),
+          .ADDR_A2_i(WR2_ADDR_SHIFTED),
+          .CLK_A2_i(WR2_CLK_i),
+          .REN_A2_i(1'b0),
+          .WEN_A2_i(WEN2_i),
+          .BE_A2_i(WR2_BE[1:0]),
+        
+          .WDATA_B2_i(18'h0),
+          .RDATA_B2_o(PORT_B2_RDATA),
+          .ADDR_B2_i(RD2_ADDR_SHIFTED),
+          .CLK_B2_i(RD2_CLK_i),
+          .REN_B2_i(REN2_i),
+          .WEN_B2_i(1'b0),
+          .BE_B2_i({REN2_i,REN2_i}),
+        
+          .FLUSH1_i(FLUSH1),
+          .FLUSH2_i(FLUSH2)
+        );        
+			end
+			4: begin
+				defparam BRAM_BLK.MODE_BITS = { 1'b1,
+					11'd10, 11'd10, 4'd0, MODE_1, MODE_4, MODE_1, MODE_4, 1'd0,
+					12'd10, 12'd10, 4'd0, MODE_1, MODE_4, MODE_1, MODE_4, 1'd0
+				};
+        (* is_inferred = 1 *)
+        (* is_split = 1 *)
+        (* rd_data_width = RD_DATA_WIDTH *)
+        (* wr_data_width = WR_DATA_WIDTH *)
+        TDP36K BRAM_BLK (
+          .RESET_ni(RESET_ni),
+        
+          .WDATA_A1_i(PORT_A1_WDATA),
+          .RDATA_A1_o(),
+          .ADDR_A1_i(WR1_ADDR_SHIFTED),
+          .CLK_A1_i(WR1_CLK_i),
+          .REN_A1_i(),
+          .WEN_A1_i(WEN1_i),
+          .BE_A1_i(WR1_BE[1:0]),
+        
+          .WDATA_B1_i(18'h0),
+          .RDATA_B1_o(PORT_B1_RDATA),
+          .ADDR_B1_i(RD1_ADDR_SHIFTED),
+          .CLK_B1_i(RD1_CLK_i),
+          .REN_B1_i(REN1_i),
+          .WEN_B1_i(1'b0),
+          .BE_B1_i({REN1_i,REN1_i}),
+        
+          .WDATA_A2_i(PORT_A2_WDATA),
+          .RDATA_A2_o(),
+          .ADDR_A2_i(WR2_ADDR_SHIFTED),
+          .CLK_A2_i(WR2_CLK_i),
+          .REN_A2_i(1'b0),
+          .WEN_A2_i(WEN2_i),
+          .BE_A2_i(WR2_BE[1:0]),
+        
+          .WDATA_B2_i(18'h0),
+          .RDATA_B2_o(PORT_B2_RDATA),
+          .ADDR_B2_i(RD2_ADDR_SHIFTED),
+          .CLK_B2_i(RD2_CLK_i),
+          .REN_B2_i(REN2_i),
+          .WEN_B2_i(1'b0),
+          .BE_B2_i({REN2_i,REN2_i}),
+        
+          .FLUSH1_i(FLUSH1),
+          .FLUSH2_i(FLUSH2)
+        );        
+			end
+			8, 9: begin
+				defparam BRAM_BLK.MODE_BITS = { 1'b1,
+					11'd10, 11'd10, 4'd0, MODE_1, MODE_9, MODE_1, MODE_9, 1'd0,
+					12'd10, 12'd10, 4'd0, MODE_1, MODE_9, MODE_1, MODE_9, 1'd0
+				};
+        (* is_inferred = 1 *)
+        (* is_split = 1 *)
+        (* rd_data_width = RD_DATA_WIDTH *)
+        (* wr_data_width = WR_DATA_WIDTH *)
+        TDP36K BRAM_BLK (
+          .RESET_ni(RESET_ni),
+        
+          .WDATA_A1_i(PORT_A1_WDATA),
+          .RDATA_A1_o(),
+          .ADDR_A1_i(WR1_ADDR_SHIFTED),
+          .CLK_A1_i(WR1_CLK_i),
+          .REN_A1_i(),
+          .WEN_A1_i(WEN1_i),
+          .BE_A1_i(WR1_BE[1:0]),
+        
+          .WDATA_B1_i(18'h0),
+          .RDATA_B1_o(PORT_B1_RDATA),
+          .ADDR_B1_i(RD1_ADDR_SHIFTED),
+          .CLK_B1_i(RD1_CLK_i),
+          .REN_B1_i(REN1_i),
+          .WEN_B1_i(1'b0),
+          .BE_B1_i({REN1_i,REN1_i}),
+        
+          .WDATA_A2_i(PORT_A2_WDATA),
+          .RDATA_A2_o(),
+          .ADDR_A2_i(WR2_ADDR_SHIFTED),
+          .CLK_A2_i(WR2_CLK_i),
+          .REN_A2_i(1'b0),
+          .WEN_A2_i(WEN2_i),
+          .BE_A2_i(WR2_BE[1:0]),
+        
+          .WDATA_B2_i(18'h0),
+          .RDATA_B2_o(PORT_B2_RDATA),
+          .ADDR_B2_i(RD2_ADDR_SHIFTED),
+          .CLK_B2_i(RD2_CLK_i),
+          .REN_B2_i(REN2_i),
+          .WEN_B2_i(1'b0),
+          .BE_B2_i({REN2_i,REN2_i}),
+        
+          .FLUSH1_i(FLUSH1),
+          .FLUSH2_i(FLUSH2)
+        );        
+			end
+			16, 18: begin
+				defparam BRAM_BLK.MODE_BITS = { 1'b1,
+					11'd10, 11'd10, 4'd0, MODE_1, MODE_18, MODE_1, MODE_18, 1'd0,
+					12'd10, 12'd10, 4'd0, MODE_1, MODE_18, MODE_1, MODE_18, 1'd0
+				};
+        (* is_inferred = 1 *)
+        (* is_split = 1 *)
+        (* rd_data_width = RD_DATA_WIDTH *)
+        (* wr_data_width = WR_DATA_WIDTH *)
+        TDP36K BRAM_BLK (
+          .RESET_ni(RESET_ni),
+        
+          .WDATA_A1_i(PORT_A1_WDATA),
+          .RDATA_A1_o(),
+          .ADDR_A1_i(WR1_ADDR_SHIFTED),
+          .CLK_A1_i(WR1_CLK_i),
+          .REN_A1_i(),
+          .WEN_A1_i(WEN1_i),
+          .BE_A1_i(WR1_BE[1:0]),
+        
+          .WDATA_B1_i(18'h0),
+          .RDATA_B1_o(PORT_B1_RDATA),
+          .ADDR_B1_i(RD1_ADDR_SHIFTED),
+          .CLK_B1_i(RD1_CLK_i),
+          .REN_B1_i(REN1_i),
+          .WEN_B1_i(1'b0),
+          .BE_B1_i({REN1_i,REN1_i}),
+        
+          .WDATA_A2_i(PORT_A2_WDATA),
+          .RDATA_A2_o(),
+          .ADDR_A2_i(WR2_ADDR_SHIFTED),
+          .CLK_A2_i(WR2_CLK_i),
+          .REN_A2_i(1'b0),
+          .WEN_A2_i(WEN2_i),
+          .BE_A2_i(WR2_BE[1:0]),
+        
+          .WDATA_B2_i(18'h0),
+          .RDATA_B2_o(PORT_B2_RDATA),
+          .ADDR_B2_i(RD2_ADDR_SHIFTED),
+          .CLK_B2_i(RD2_CLK_i),
+          .REN_B2_i(REN2_i),
+          .WEN_B2_i(1'b0),
+          .BE_B2_i({REN2_i,REN2_i}),
+        
+          .FLUSH1_i(FLUSH1),
+          .FLUSH2_i(FLUSH2)
+        );        
+			end
+			default: begin
+				defparam BRAM_BLK.MODE_BITS = { 1'b1,
+					11'd10, 11'd10, 4'd0, MODE_1, MODE_1, MODE_1, MODE_1, 1'd0,
+					12'd10, 12'd10, 4'd0, MODE_1, MODE_1, MODE_1, MODE_1, 1'd0
+				};
+        (* is_inferred = 1 *)
+        (* is_split = 1 *)
+        (* rd_data_width = RD_DATA_WIDTH *)
+        (* wr_data_width = WR_DATA_WIDTH *)
+        TDP36K BRAM_BLK (
+          .RESET_ni(RESET_ni),
+        
+          .WDATA_A1_i(PORT_A1_WDATA),
+          .RDATA_A1_o(),
+          .ADDR_A1_i(WR1_ADDR_SHIFTED),
+          .CLK_A1_i(WR1_CLK_i),
+          .REN_A1_i(),
+          .WEN_A1_i(WEN1_i),
+          .BE_A1_i(WR1_BE[1:0]),
+        
+          .WDATA_B1_i(18'h0),
+          .RDATA_B1_o(PORT_B1_RDATA),
+          .ADDR_B1_i(RD1_ADDR_SHIFTED),
+          .CLK_B1_i(RD1_CLK_i),
+          .REN_B1_i(REN1_i),
+          .WEN_B1_i(1'b0),
+          .BE_B1_i({REN1_i,REN1_i}),
+        
+          .WDATA_A2_i(PORT_A2_WDATA),
+          .RDATA_A2_o(),
+          .ADDR_A2_i(WR2_ADDR_SHIFTED),
+          .CLK_A2_i(WR2_CLK_i),
+          .REN_A2_i(1'b0),
+          .WEN_A2_i(WEN2_i),
+          .BE_A2_i(WR2_BE[1:0]),
+        
+          .WDATA_B2_i(18'h0),
+          .RDATA_B2_o(PORT_B2_RDATA),
+          .ADDR_B2_i(RD2_ADDR_SHIFTED),
+          .CLK_B2_i(RD2_CLK_i),
+          .REN_B2_i(REN2_i),
+          .WEN_B2_i(1'b0),
+          .BE_B2_i({REN2_i,REN2_i}),
+        
+          .FLUSH1_i(FLUSH1),
+          .FLUSH2_i(FLUSH2)
+        );        
+			end
+		endcase
+	end
+endcase
+
+endmodule
+
+module RAM_18K_BLK (
+    WEN_i,
+    REN_i,
+    WR_CLK_i,
+    RD_CLK_i,
+    WR_BE_i,
+    WR_ADDR_i,
+    RD_ADDR_i,
+    WDATA_i,
+    RDATA_o
+);
+
+parameter WR_ADDR_WIDTH = 10;
+parameter RD_ADDR_WIDTH = 10;
+parameter WR_DATA_WIDTH = 18;
+parameter RD_DATA_WIDTH = 18;
+parameter BE_WIDTH = 2;
+
+input wire WEN_i;
+input wire REN_i;
+input wire WR_CLK_i;
+input wire RD_CLK_i;
+input wire [BE_WIDTH-1:0] WR_BE_i;
+input wire [WR_ADDR_WIDTH-1 :0] WR_ADDR_i;
+input wire [RD_ADDR_WIDTH-1 :0] RD_ADDR_i;
+input wire [WR_DATA_WIDTH-1 :0] WDATA_i;
+output wire [RD_DATA_WIDTH-1 :0] RDATA_o;
+
+  BRAM2x18_SP  #(
+      .WR_ADDR_WIDTH(WR_ADDR_WIDTH), 
+      .RD_ADDR_WIDTH(RD_ADDR_WIDTH),
+      .WR_DATA_WIDTH(WR_DATA_WIDTH), 
+      .RD_DATA_WIDTH(RD_DATA_WIDTH),
+      .BE1_WIDTH(BE_WIDTH),
+      .BE2_WIDTH()      
+       ) U1
+      (
+      .RESET_ni(1'b1),
+      
+      .WEN1_i(WEN_i),
+      .REN1_i(REN_i),
+      .WR1_CLK_i(WR_CLK_i),
+      .RD1_CLK_i(RD_CLK_i),
+      .WR1_BE_i(WR_BE_i),
+      .WR1_ADDR_i(WR_ADDR_i),
+      .RD1_ADDR_i(RD_ADDR_i),
+      .WDATA1_i(WDATA_i),
+      .RDATA1_o(RDATA_o),
+      
+      .WEN2_i(),
+      .REN2_i(),
+      .WR2_CLK_i(),
+      .RD2_CLK_i(),
+      .WR2_BE_i(),
+      .WR2_ADDR_i(),
+      .RD2_ADDR_i(),
+      .WDATA2_i(),
+      .RDATA2_o()
+      );
+    
+endmodule
+
+module RAM_36K_BLK (
+    WEN_i,
+    REN_i,
+    WR_CLK_i,
+    RD_CLK_i,
+    WR_BE_i,
+    WR_ADDR_i,
+    RD_ADDR_i,
+    WDATA_i,
+    RDATA_o
+);
+
+parameter WR_ADDR_WIDTH = 10;
+parameter RD_ADDR_WIDTH = 10;
+parameter WR_DATA_WIDTH = 36;
+parameter RD_DATA_WIDTH = 36;
+parameter BE_WIDTH = 4;
+
+localparam MODE_36 = 3'b011; // 36- or 32-bit
+localparam MODE_18 = 3'b010; // 18- or 16-bit
+localparam MODE_9 = 3'b001; // 9- or 8-bit
+localparam MODE_4 = 3'b100; // 4-bit
+localparam MODE_2 = 3'b110; // 2-bit
+localparam MODE_1 = 3'b101; // 1-bit
+
+input wire WEN_i;
+input wire REN_i;
+input wire WR_CLK_i;
+input wire RD_CLK_i;
+input wire [BE_WIDTH-1:0] WR_BE_i;
+input wire [WR_ADDR_WIDTH-1 :0] WR_ADDR_i;
+input wire [RD_ADDR_WIDTH-1 :0] RD_ADDR_i;
+input wire [WR_DATA_WIDTH-1 :0] WDATA_i;
+output wire [RD_DATA_WIDTH-1 :0] RDATA_o;
+
+wire [14:RD_ADDR_WIDTH] RD_ADDR_CMPL;
+wire [14:WR_ADDR_WIDTH] WR_ADDR_CMPL;
+wire [35:0] RD_DATA_CMPL;
+wire [35:WR_DATA_WIDTH] WR_DATA_CMPL;
+
+wire [14:0] RD_ADDR_TOTAL;
+wire [14:0] WR_ADDR_TOTAL;
+
+wire [14:0] RD_ADDR_SHIFTED;
+wire [14:0] WR_ADDR_SHIFTED;
+
+wire [3:0] WR_BE;
+
+wire FLUSH1;
+wire FLUSH2;
+
+generate
+  if (WR_ADDR_WIDTH == 15) begin
+    assign WR_ADDR_TOTAL = WR_ADDR_i;
+  end else begin
+    assign WR_ADDR_TOTAL[14:WR_ADDR_WIDTH] = 0;
+    assign WR_ADDR_TOTAL[WR_ADDR_WIDTH-1:0] = WR_ADDR_i;
+  end
+endgenerate
+
+generate
+  if (RD_ADDR_WIDTH == 15) begin
+    assign RD_ADDR_TOTAL = RD_ADDR_i;
+  end else begin
+    assign RD_ADDR_TOTAL[14:RD_ADDR_WIDTH] = 0;
+    assign RD_ADDR_TOTAL[RD_ADDR_WIDTH-1:0] = RD_ADDR_i;
+  end
+endgenerate
+
+// Apply shift
+case (RD_DATA_WIDTH)
+	1: begin
+		assign RD_ADDR_SHIFTED = RD_ADDR_TOTAL;
+	end
+	2: begin
+		assign RD_ADDR_SHIFTED = RD_ADDR_TOTAL << 1;
+	end
+	4: begin
+		assign RD_ADDR_SHIFTED = RD_ADDR_TOTAL << 2;
+	end
+	8, 9: begin
+		assign RD_ADDR_SHIFTED = RD_ADDR_TOTAL << 3;
+	end
+	16, 18: begin
+		assign RD_ADDR_SHIFTED = RD_ADDR_TOTAL << 4;
+	end
+	32, 36: begin
+		assign RD_ADDR_SHIFTED = RD_ADDR_TOTAL << 5;
+	end
+	default: begin
+		assign RD_ADDR_SHIFTED = RD_ADDR_TOTAL;
+	end
+endcase
+
+case (WR_DATA_WIDTH)
+	1: begin
+		assign WR_ADDR_SHIFTED = WR_ADDR_TOTAL;
+	end
+	2: begin
+		assign WR_ADDR_SHIFTED = WR_ADDR_TOTAL << 1;
+	end
+	4: begin
+		assign WR_ADDR_SHIFTED = WR_ADDR_TOTAL << 2;
+	end
+	8, 9: begin
+		assign WR_ADDR_SHIFTED = WR_ADDR_TOTAL << 3;
+	end
+	16, 18: begin
+		assign WR_ADDR_SHIFTED = WR_ADDR_TOTAL << 4;
+	end
+	32, 36: begin
+		assign WR_ADDR_SHIFTED = WR_ADDR_TOTAL << 5;
+	end
+	default: begin
+		assign WR_ADDR_SHIFTED = WR_ADDR_TOTAL;
+	end
+endcase
+
+case (BE_WIDTH)
+	4: begin
+		assign WR_BE = WR_BE_i[BE_WIDTH-1 :0];
+	end
+	default: begin
+		assign WR_BE[3:BE_WIDTH] = 0;
+    assign WR_BE[BE_WIDTH-1 :0] = WR_BE_i[BE_WIDTH-1 :0];
+	end
+endcase
+
+assign FLUSH1 = 1'b0;
+assign FLUSH2 = 1'b0;
+
+// TODO configure per width
+wire [17:0] PORT_B1_RDATA;
+wire [17:0] PORT_B2_RDATA;
+wire [35:0] PORT_A_WDATA;
+
+generate
+  if (WR_DATA_WIDTH == 36) begin
+    assign PORT_A_WDATA[WR_DATA_WIDTH-1:0] = WDATA_i[WR_DATA_WIDTH-1:0];
+  end else if (WR_DATA_WIDTH > 18 && WR_DATA_WIDTH < 36) begin
+    assign PORT_A_WDATA[WR_DATA_WIDTH+1:18]  = WDATA_i[WR_DATA_WIDTH-1:16];
+    assign PORT_A_WDATA[17:0] = {2'b00,WDATA_i[15:0]};
+  end else if (WR_DATA_WIDTH == 9) begin
+    assign PORT_A_WDATA = {19'h0, WDATA_i[8], 8'h0, WDATA_i[7:0]};
+  end else begin
+    assign PORT_A_WDATA[35:WR_DATA_WIDTH] = 0;
+    assign PORT_A_WDATA[WR_DATA_WIDTH-1:0] = WDATA_i[WR_DATA_WIDTH-1:0];
+  end
+endgenerate
+
+generate
+  if (RD_DATA_WIDTH == 36) begin
+    assign RD_DATA_CMPL = {PORT_B2_RDATA, PORT_B1_RDATA};
+  end else if (RD_DATA_WIDTH > 18 && RD_DATA_WIDTH < 36) begin
+    assign RD_DATA_CMPL  = {2'b00,PORT_B2_RDATA[17:0],PORT_B1_RDATA[15:0]};
+  end else if (RD_DATA_WIDTH == 9) begin
+    assign RD_DATA_CMPL = { 27'h0, PORT_B1_RDATA[16], PORT_B1_RDATA[7:0]};
+  end else begin
+    assign RD_DATA_CMPL = {18'h0, PORT_B1_RDATA};
+  end
+endgenerate
+
+assign RDATA_o = RD_DATA_CMPL[RD_DATA_WIDTH-1:0];
+
+// Assign parameters
+case (RD_DATA_WIDTH)
+	1: begin
+		case (WR_DATA_WIDTH)
+			1: begin
+				defparam BRAM_BLK.MODE_BITS = { 1'b0,
+					11'd10, 11'd10, 4'd0, MODE_1, MODE_1, MODE_1, MODE_1, 1'd0,
+					12'd10, 12'd10, 4'd0, MODE_1, MODE_1, MODE_1, MODE_1, 1'd0
+				};
+        (* is_inferred = 1 *)
+        (* rd_data_width = RD_DATA_WIDTH *)
+        (* wr_data_width = WR_DATA_WIDTH *)
+        TDP36K BRAM_BLK (
+          .RESET_ni(1'b1),
+        
+          .WDATA_A1_i(PORT_A_WDATA[17:0]),
+          .RDATA_A1_o(),
+          .ADDR_A1_i(WR_ADDR_SHIFTED),
+          .CLK_A1_i(WR_CLK_i),
+          .REN_A1_i(1'b0),
+          .WEN_A1_i(WEN_i),
+          .BE_A1_i(WR_BE[1:0]),
+        
+          .WDATA_B1_i(18'h0),
+          .RDATA_B1_o(PORT_B1_RDATA[17:0]),
+          .ADDR_B1_i(RD_ADDR_SHIFTED),
+          .CLK_B1_i(RD_CLK_i),
+          .REN_B1_i(REN_i),
+          .WEN_B1_i(1'b0),
+          .BE_B1_i({REN_i,REN_i}),
+        
+          .WDATA_A2_i(PORT_A_WDATA[35:18]),
+          .RDATA_A2_o(),
+          .ADDR_A2_i(WR_ADDR_SHIFTED),
+          .CLK_A2_i(WR_CLK_i),
+          .REN_A2_i(1'b0),
+          .WEN_A2_i(WEN_i),
+          .BE_A2_i(WR_BE[3:2]),
+        
+          .WDATA_B2_i(18'h0),
+          .RDATA_B2_o(PORT_B2_RDATA[17:0]),
+          .ADDR_B2_i(RD_ADDR_SHIFTED),
+          .CLK_B2_i(RD_CLK_i),
+          .REN_B2_i(REN_i),
+          .WEN_B2_i(1'b0),
+          .BE_B2_i({REN_i,REN_i}),
+        
+          .FLUSH1_i(FLUSH1),
+          .FLUSH2_i(FLUSH2)
+        );        
+			end
+			2: begin
+				defparam BRAM_BLK.MODE_BITS = { 1'b0,
+					11'd10, 11'd10, 4'd0, MODE_1, MODE_2, MODE_1, MODE_2, 1'd0,
+					12'd10, 12'd10, 4'd0, MODE_1, MODE_2, MODE_1, MODE_2, 1'd0
+				};
+        (* is_inferred = 1 *)
+        (* rd_data_width = RD_DATA_WIDTH *)
+        (* wr_data_width = WR_DATA_WIDTH *)
+        TDP36K BRAM_BLK (
+          .RESET_ni(1'b1),
+        
+          .WDATA_A1_i(PORT_A_WDATA[17:0]),
+          .RDATA_A1_o(),
+          .ADDR_A1_i(WR_ADDR_SHIFTED),
+          .CLK_A1_i(WR_CLK_i),
+          .REN_A1_i(1'b0),
+          .WEN_A1_i(WEN_i),
+          .BE_A1_i(WR_BE[1:0]),
+        
+          .WDATA_B1_i(18'h0),
+          .RDATA_B1_o(PORT_B1_RDATA[17:0]),
+          .ADDR_B1_i(RD_ADDR_SHIFTED),
+          .CLK_B1_i(RD_CLK_i),
+          .REN_B1_i(REN_i),
+          .WEN_B1_i(1'b0),
+          .BE_B1_i({REN_i,REN_i}),
+        
+          .WDATA_A2_i(PORT_A_WDATA[35:18]),
+          .RDATA_A2_o(),
+          .ADDR_A2_i(WR_ADDR_SHIFTED),
+          .CLK_A2_i(WR_CLK_i),
+          .REN_A2_i(1'b0),
+          .WEN_A2_i(WEN_i),
+          .BE_A2_i(WR_BE[3:2]),
+        
+          .WDATA_B2_i(18'h0),
+          .RDATA_B2_o(PORT_B2_RDATA[17:0]),
+          .ADDR_B2_i(RD_ADDR_SHIFTED),
+          .CLK_B2_i(RD_CLK_i),
+          .REN_B2_i(REN_i),
+          .WEN_B2_i(1'b0),
+          .BE_B2_i({REN_i,REN_i}),
+        
+          .FLUSH1_i(FLUSH1),
+          .FLUSH2_i(FLUSH2)
+        );       
+			end
+			4: begin
+				defparam BRAM_BLK.MODE_BITS = { 1'b0,
+					11'd10, 11'd10, 4'd0, MODE_1, MODE_4, MODE_1, MODE_4, 1'd0,
+					12'd10, 12'd10, 4'd0, MODE_1, MODE_4, MODE_1, MODE_4, 1'd0
+				};
+        (* is_inferred = 1 *)
+        (* rd_data_width = RD_DATA_WIDTH *)
+        (* wr_data_width = WR_DATA_WIDTH *)
+        TDP36K BRAM_BLK (
+          .RESET_ni(1'b1),
+        
+          .WDATA_A1_i(PORT_A_WDATA[17:0]),
+          .RDATA_A1_o(),
+          .ADDR_A1_i(WR_ADDR_SHIFTED),
+          .CLK_A1_i(WR_CLK_i),
+          .REN_A1_i(1'b0),
+          .WEN_A1_i(WEN_i),
+          .BE_A1_i(WR_BE[1:0]),
+        
+          .WDATA_B1_i(18'h0),
+          .RDATA_B1_o(PORT_B1_RDATA[17:0]),
+          .ADDR_B1_i(RD_ADDR_SHIFTED),
+          .CLK_B1_i(RD_CLK_i),
+          .REN_B1_i(REN_i),
+          .WEN_B1_i(1'b0),
+          .BE_B1_i({REN_i,REN_i}),
+        
+          .WDATA_A2_i(PORT_A_WDATA[35:18]),
+          .RDATA_A2_o(),
+          .ADDR_A2_i(WR_ADDR_SHIFTED),
+          .CLK_A2_i(WR_CLK_i),
+          .REN_A2_i(1'b0),
+          .WEN_A2_i(WEN_i),
+          .BE_A2_i(WR_BE[3:2]),
+        
+          .WDATA_B2_i(18'h0),
+          .RDATA_B2_o(PORT_B2_RDATA[17:0]),
+          .ADDR_B2_i(RD_ADDR_SHIFTED),
+          .CLK_B2_i(RD_CLK_i),
+          .REN_B2_i(REN_i),
+          .WEN_B2_i(1'b0),
+          .BE_B2_i({REN_i,REN_i}),
+        
+          .FLUSH1_i(FLUSH1),
+          .FLUSH2_i(FLUSH2)
+        );        
+			end
+			8, 9: begin
+				defparam BRAM_BLK.MODE_BITS = { 1'b0,
+					11'd10, 11'd10, 4'd0, MODE_1, MODE_9, MODE_1, MODE_9, 1'd0,
+					12'd10, 12'd10, 4'd0, MODE_1, MODE_9, MODE_1, MODE_9, 1'd0
+				};
+        (* is_inferred = 1 *)
+        (* rd_data_width = RD_DATA_WIDTH *)
+        (* wr_data_width = WR_DATA_WIDTH *)
+        TDP36K BRAM_BLK (
+          .RESET_ni(1'b1),
+        
+          .WDATA_A1_i(PORT_A_WDATA[17:0]),
+          .RDATA_A1_o(),
+          .ADDR_A1_i(WR_ADDR_SHIFTED),
+          .CLK_A1_i(WR_CLK_i),
+          .REN_A1_i(1'b0),
+          .WEN_A1_i(WEN_i),
+          .BE_A1_i(WR_BE[1:0]),
+        
+          .WDATA_B1_i(18'h0),
+          .RDATA_B1_o(PORT_B1_RDATA[17:0]),
+          .ADDR_B1_i(RD_ADDR_SHIFTED),
+          .CLK_B1_i(RD_CLK_i),
+          .REN_B1_i(REN_i),
+          .WEN_B1_i(1'b0),
+          .BE_B1_i({REN_i,REN_i}),
+        
+          .WDATA_A2_i(PORT_A_WDATA[35:18]),
+          .RDATA_A2_o(),
+          .ADDR_A2_i(WR_ADDR_SHIFTED),
+          .CLK_A2_i(WR_CLK_i),
+          .REN_A2_i(1'b0),
+          .WEN_A2_i(WEN_i),
+          .BE_A2_i(WR_BE[3:2]),
+        
+          .WDATA_B2_i(18'h0),
+          .RDATA_B2_o(PORT_B2_RDATA[17:0]),
+          .ADDR_B2_i(RD_ADDR_SHIFTED),
+          .CLK_B2_i(RD_CLK_i),
+          .REN_B2_i(REN_i),
+          .WEN_B2_i(1'b0),
+          .BE_B2_i({REN_i,REN_i}),
+        
+          .FLUSH1_i(FLUSH1),
+          .FLUSH2_i(FLUSH2)
+        );        
+			end
+			16, 18: begin
+				defparam BRAM_BLK.MODE_BITS = { 1'b0,
+					11'd10, 11'd10, 4'd0, MODE_1, MODE_18, MODE_1, MODE_18, 1'd0,
+					12'd10, 12'd10, 4'd0, MODE_1, MODE_18, MODE_1, MODE_18, 1'd0
+				};
+        (* is_inferred = 1 *)
+        (* rd_data_width = RD_DATA_WIDTH *)
+        (* wr_data_width = WR_DATA_WIDTH *)
+        TDP36K BRAM_BLK (
+          .RESET_ni(1'b1),
+        
+          .WDATA_A1_i(PORT_A_WDATA[17:0]),
+          .RDATA_A1_o(),
+          .ADDR_A1_i(WR_ADDR_SHIFTED),
+          .CLK_A1_i(WR_CLK_i),
+          .REN_A1_i(1'b0),
+          .WEN_A1_i(WEN_i),
+          .BE_A1_i(WR_BE[1:0]),
+        
+          .WDATA_B1_i(18'h0),
+          .RDATA_B1_o(PORT_B1_RDATA[17:0]),
+          .ADDR_B1_i(RD_ADDR_SHIFTED),
+          .CLK_B1_i(RD_CLK_i),
+          .REN_B1_i(REN_i),
+          .WEN_B1_i(1'b0),
+          .BE_B1_i({REN_i,REN_i}),
+        
+          .WDATA_A2_i(PORT_A_WDATA[35:18]),
+          .RDATA_A2_o(),
+          .ADDR_A2_i(WR_ADDR_SHIFTED),
+          .CLK_A2_i(WR_CLK_i),
+          .REN_A2_i(1'b0),
+          .WEN_A2_i(WEN_i),
+          .BE_A2_i(WR_BE[3:2]),
+        
+          .WDATA_B2_i(18'h0),
+          .RDATA_B2_o(PORT_B2_RDATA[17:0]),
+          .ADDR_B2_i(RD_ADDR_SHIFTED),
+          .CLK_B2_i(RD_CLK_i),
+          .REN_B2_i(REN_i),
+          .WEN_B2_i(1'b0),
+          .BE_B2_i({REN_i,REN_i}),
+        
+          .FLUSH1_i(FLUSH1),
+          .FLUSH2_i(FLUSH2)
+        );        
+			end
+			32, 36: begin
+				defparam BRAM_BLK.MODE_BITS = { 1'b0,
+					11'd10, 11'd10, 4'd0, MODE_1, MODE_36, MODE_1, MODE_36, 1'd0,
+					12'd10, 12'd10, 4'd0, MODE_1, MODE_36, MODE_1, MODE_36, 1'd0
+				};
+        (* is_inferred = 1 *)
+        (* rd_data_width = RD_DATA_WIDTH *)
+        (* wr_data_width = WR_DATA_WIDTH *)
+        TDP36K BRAM_BLK (
+          .RESET_ni(1'b1),
+        
+          .WDATA_A1_i(PORT_A_WDATA[17:0]),
+          .RDATA_A1_o(),
+          .ADDR_A1_i(WR_ADDR_SHIFTED),
+          .CLK_A1_i(WR_CLK_i),
+          .REN_A1_i(1'b0),
+          .WEN_A1_i(WEN_i),
+          .BE_A1_i(WR_BE[1:0]),
+        
+          .WDATA_B1_i(18'h0),
+          .RDATA_B1_o(PORT_B1_RDATA[17:0]),
+          .ADDR_B1_i(RD_ADDR_SHIFTED),
+          .CLK_B1_i(RD_CLK_i),
+          .REN_B1_i(REN_i),
+          .WEN_B1_i(1'b0),
+          .BE_B1_i({REN_i,REN_i}),
+        
+          .WDATA_A2_i(PORT_A_WDATA[35:18]),
+          .RDATA_A2_o(),
+          .ADDR_A2_i(WR_ADDR_SHIFTED),
+          .CLK_A2_i(WR_CLK_i),
+          .REN_A2_i(1'b0),
+          .WEN_A2_i(WEN_i),
+          .BE_A2_i(WR_BE[3:2]),
+        
+          .WDATA_B2_i(18'h0),
+          .RDATA_B2_o(PORT_B2_RDATA[17:0]),
+          .ADDR_B2_i(RD_ADDR_SHIFTED),
+          .CLK_B2_i(RD_CLK_i),
+          .REN_B2_i(REN_i),
+          .WEN_B2_i(1'b0),
+          .BE_B2_i({REN_i,REN_i}),
+        
+          .FLUSH1_i(FLUSH1),
+          .FLUSH2_i(FLUSH2)
+        );        
+			end
+			default: begin
+				defparam BRAM_BLK.MODE_BITS = { 1'b0,
+					11'd10, 11'd10, 4'd0, MODE_1, MODE_1, MODE_1, MODE_1, 1'd0,
+					12'd10, 12'd10, 4'd0, MODE_1, MODE_1, MODE_1, MODE_1, 1'd0
+				};
+        (* is_inferred = 1 *)
+        (* rd_data_width = RD_DATA_WIDTH *)
+        (* wr_data_width = WR_DATA_WIDTH *)
+        TDP36K BRAM_BLK (
+          .RESET_ni(1'b1),
+        
+          .WDATA_A1_i(PORT_A_WDATA[17:0]),
+          .RDATA_A1_o(),
+          .ADDR_A1_i(WR_ADDR_SHIFTED),
+          .CLK_A1_i(WR_CLK_i),
+          .REN_A1_i(1'b0),
+          .WEN_A1_i(WEN_i),
+          .BE_A1_i(WR_BE[1:0]),
+        
+          .WDATA_B1_i(18'h0),
+          .RDATA_B1_o(PORT_B1_RDATA[17:0]),
+          .ADDR_B1_i(RD_ADDR_SHIFTED),
+          .CLK_B1_i(RD_CLK_i),
+          .REN_B1_i(REN_i),
+          .WEN_B1_i(1'b0),
+          .BE_B1_i({REN_i,REN_i}),
+        
+          .WDATA_A2_i(PORT_A_WDATA[35:18]),
+          .RDATA_A2_o(),
+          .ADDR_A2_i(WR_ADDR_SHIFTED),
+          .CLK_A2_i(WR_CLK_i),
+          .REN_A2_i(1'b0),
+          .WEN_A2_i(WEN_i),
+          .BE_A2_i(WR_BE[3:2]),
+        
+          .WDATA_B2_i(18'h0),
+          .RDATA_B2_o(PORT_B2_RDATA[17:0]),
+          .ADDR_B2_i(RD_ADDR_SHIFTED),
+          .CLK_B2_i(RD_CLK_i),
+          .REN_B2_i(REN_i),
+          .WEN_B2_i(1'b0),
+          .BE_B2_i({REN_i,REN_i}),
+        
+          .FLUSH1_i(FLUSH1),
+          .FLUSH2_i(FLUSH2)
+        );       
+			end
+		endcase
+	end
+	2: begin
+		case (WR_DATA_WIDTH)
+			1: begin
+				defparam BRAM_BLK.MODE_BITS = { 1'b0,
+					11'd10, 11'd10, 4'd0, MODE_2, MODE_1, MODE_2, MODE_1, 1'd0,
+					12'd10, 12'd10, 4'd0, MODE_2, MODE_1, MODE_2, MODE_1, 1'd0
+				};
+        (* is_inferred = 1 *)
+        (* rd_data_width = RD_DATA_WIDTH *)
+        (* wr_data_width = WR_DATA_WIDTH *)
+        TDP36K BRAM_BLK (
+          .RESET_ni(1'b1),
+        
+          .WDATA_A1_i(PORT_A_WDATA[17:0]),
+          .RDATA_A1_o(),
+          .ADDR_A1_i(WR_ADDR_SHIFTED),
+          .CLK_A1_i(WR_CLK_i),
+          .REN_A1_i(1'b0),
+          .WEN_A1_i(WEN_i),
+          .BE_A1_i(WR_BE[1:0]),
+        
+          .WDATA_B1_i(18'h0),
+          .RDATA_B1_o(PORT_B1_RDATA[17:0]),
+          .ADDR_B1_i(RD_ADDR_SHIFTED),
+          .CLK_B1_i(RD_CLK_i),
+          .REN_B1_i(REN_i),
+          .WEN_B1_i(1'b0),
+          .BE_B1_i({REN_i,REN_i}),
+        
+          .WDATA_A2_i(PORT_A_WDATA[35:18]),
+          .RDATA_A2_o(),
+          .ADDR_A2_i(WR_ADDR_SHIFTED),
+          .CLK_A2_i(WR_CLK_i),
+          .REN_A2_i(1'b0),
+          .WEN_A2_i(WEN_i),
+          .BE_A2_i(WR_BE[3:2]),
+        
+          .WDATA_B2_i(18'h0),
+          .RDATA_B2_o(PORT_B2_RDATA[17:0]),
+          .ADDR_B2_i(RD_ADDR_SHIFTED),
+          .CLK_B2_i(RD_CLK_i),
+          .REN_B2_i(REN_i),
+          .WEN_B2_i(1'b0),
+          .BE_B2_i({REN_i,REN_i}),
+        
+          .FLUSH1_i(FLUSH1),
+          .FLUSH2_i(FLUSH2)
+        );        
+			end
+			2: begin
+				defparam BRAM_BLK.MODE_BITS = { 1'b0,
+					11'd10, 11'd10, 4'd0, MODE_2, MODE_2, MODE_2, MODE_2, 1'd0,
+					12'd10, 12'd10, 4'd0, MODE_2, MODE_2, MODE_2, MODE_2, 1'd0
+				};
+        (* is_inferred = 1 *)
+        (* rd_data_width = RD_DATA_WIDTH *)
+        (* wr_data_width = WR_DATA_WIDTH *)
+        TDP36K BRAM_BLK (
+          .RESET_ni(1'b1),
+        
+          .WDATA_A1_i(PORT_A_WDATA[17:0]),
+          .RDATA_A1_o(),
+          .ADDR_A1_i(WR_ADDR_SHIFTED),
+          .CLK_A1_i(WR_CLK_i),
+          .REN_A1_i(1'b0),
+          .WEN_A1_i(WEN_i),
+          .BE_A1_i(WR_BE[1:0]),
+        
+          .WDATA_B1_i(18'h0),
+          .RDATA_B1_o(PORT_B1_RDATA[17:0]),
+          .ADDR_B1_i(RD_ADDR_SHIFTED),
+          .CLK_B1_i(RD_CLK_i),
+          .REN_B1_i(REN_i),
+          .WEN_B1_i(1'b0),
+          .BE_B1_i({REN_i,REN_i}),
+        
+          .WDATA_A2_i(PORT_A_WDATA[35:18]),
+          .RDATA_A2_o(),
+          .ADDR_A2_i(WR_ADDR_SHIFTED),
+          .CLK_A2_i(WR_CLK_i),
+          .REN_A2_i(1'b0),
+          .WEN_A2_i(WEN_i),
+          .BE_A2_i(WR_BE[3:2]),
+        
+          .WDATA_B2_i(18'h0),
+          .RDATA_B2_o(PORT_B2_RDATA[17:0]),
+          .ADDR_B2_i(RD_ADDR_SHIFTED),
+          .CLK_B2_i(RD_CLK_i),
+          .REN_B2_i(REN_i),
+          .WEN_B2_i(1'b0),
+          .BE_B2_i({REN_i,REN_i}),
+        
+          .FLUSH1_i(FLUSH1),
+          .FLUSH2_i(FLUSH2)
+        );        
+			end
+			4: begin
+				defparam BRAM_BLK.MODE_BITS = { 1'b0,
+					11'd10, 11'd10, 4'd0, MODE_2, MODE_4, MODE_2, MODE_4, 1'd0,
+					12'd10, 12'd10, 4'd0, MODE_2, MODE_4, MODE_2, MODE_4, 1'd0
+				};
+        (* is_inferred = 1 *)
+        (* rd_data_width = RD_DATA_WIDTH *)
+        (* wr_data_width = WR_DATA_WIDTH *)
+        TDP36K BRAM_BLK (
+          .RESET_ni(1'b1),
+        
+          .WDATA_A1_i(PORT_A_WDATA[17:0]),
+          .RDATA_A1_o(),
+          .ADDR_A1_i(WR_ADDR_SHIFTED),
+          .CLK_A1_i(WR_CLK_i),
+          .REN_A1_i(1'b0),
+          .WEN_A1_i(WEN_i),
+          .BE_A1_i(WR_BE[1:0]),
+        
+          .WDATA_B1_i(18'h0),
+          .RDATA_B1_o(PORT_B1_RDATA[17:0]),
+          .ADDR_B1_i(RD_ADDR_SHIFTED),
+          .CLK_B1_i(RD_CLK_i),
+          .REN_B1_i(REN_i),
+          .WEN_B1_i(1'b0),
+          .BE_B1_i({REN_i,REN_i}),
+        
+          .WDATA_A2_i(PORT_A_WDATA[35:18]),
+          .RDATA_A2_o(),
+          .ADDR_A2_i(WR_ADDR_SHIFTED),
+          .CLK_A2_i(WR_CLK_i),
+          .REN_A2_i(1'b0),
+          .WEN_A2_i(WEN_i),
+          .BE_A2_i(WR_BE[3:2]),
+        
+          .WDATA_B2_i(18'h0),
+          .RDATA_B2_o(PORT_B2_RDATA[17:0]),
+          .ADDR_B2_i(RD_ADDR_SHIFTED),
+          .CLK_B2_i(RD_CLK_i),
+          .REN_B2_i(REN_i),
+          .WEN_B2_i(1'b0),
+          .BE_B2_i({REN_i,REN_i}),
+        
+          .FLUSH1_i(FLUSH1),
+          .FLUSH2_i(FLUSH2)
+        );        
+			end
+			8, 9: begin
+				defparam BRAM_BLK.MODE_BITS = { 1'b0,
+					11'd10, 11'd10, 4'd0, MODE_2, MODE_9, MODE_2, MODE_9, 1'd0,
+					12'd10, 12'd10, 4'd0, MODE_2, MODE_9, MODE_2, MODE_9, 1'd0
+				};
+        (* is_inferred = 1 *)
+        (* rd_data_width = RD_DATA_WIDTH *)
+        (* wr_data_width = WR_DATA_WIDTH *)
+        TDP36K BRAM_BLK (
+          .RESET_ni(1'b1),
+        
+          .WDATA_A1_i(PORT_A_WDATA[17:0]),
+          .RDATA_A1_o(),
+          .ADDR_A1_i(WR_ADDR_SHIFTED),
+          .CLK_A1_i(WR_CLK_i),
+          .REN_A1_i(1'b0),
+          .WEN_A1_i(WEN_i),
+          .BE_A1_i(WR_BE[1:0]),
+        
+          .WDATA_B1_i(18'h0),
+          .RDATA_B1_o(PORT_B1_RDATA[17:0]),
+          .ADDR_B1_i(RD_ADDR_SHIFTED),
+          .CLK_B1_i(RD_CLK_i),
+          .REN_B1_i(REN_i),
+          .WEN_B1_i(1'b0),
+          .BE_B1_i({REN_i,REN_i}),
+        
+          .WDATA_A2_i(PORT_A_WDATA[35:18]),
+          .RDATA_A2_o(),
+          .ADDR_A2_i(WR_ADDR_SHIFTED),
+          .CLK_A2_i(WR_CLK_i),
+          .REN_A2_i(1'b0),
+          .WEN_A2_i(WEN_i),
+          .BE_A2_i(WR_BE[3:2]),
+        
+          .WDATA_B2_i(18'h0),
+          .RDATA_B2_o(PORT_B2_RDATA[17:0]),
+          .ADDR_B2_i(RD_ADDR_SHIFTED),
+          .CLK_B2_i(RD_CLK_i),
+          .REN_B2_i(REN_i),
+          .WEN_B2_i(1'b0),
+          .BE_B2_i({REN_i,REN_i}),
+        
+          .FLUSH1_i(FLUSH1),
+          .FLUSH2_i(FLUSH2)
+        );        
+			end
+			16, 18: begin
+				defparam BRAM_BLK.MODE_BITS = { 1'b0,
+					11'd10, 11'd10, 4'd0, MODE_2, MODE_18, MODE_2, MODE_18, 1'd0,
+					12'd10, 12'd10, 4'd0, MODE_2, MODE_18, MODE_2, MODE_18, 1'd0
+				};
+        (* is_inferred = 1 *)
+        (* rd_data_width = RD_DATA_WIDTH *)
+        (* wr_data_width = WR_DATA_WIDTH *)
+        TDP36K BRAM_BLK (
+          .RESET_ni(1'b1),
+        
+          .WDATA_A1_i(PORT_A_WDATA[17:0]),
+          .RDATA_A1_o(),
+          .ADDR_A1_i(WR_ADDR_SHIFTED),
+          .CLK_A1_i(WR_CLK_i),
+          .REN_A1_i(1'b0),
+          .WEN_A1_i(WEN_i),
+          .BE_A1_i(WR_BE[1:0]),
+        
+          .WDATA_B1_i(18'h0),
+          .RDATA_B1_o(PORT_B1_RDATA[17:0]),
+          .ADDR_B1_i(RD_ADDR_SHIFTED),
+          .CLK_B1_i(RD_CLK_i),
+          .REN_B1_i(REN_i),
+          .WEN_B1_i(1'b0),
+          .BE_B1_i({REN_i,REN_i}),
+        
+          .WDATA_A2_i(PORT_A_WDATA[35:18]),
+          .RDATA_A2_o(),
+          .ADDR_A2_i(WR_ADDR_SHIFTED),
+          .CLK_A2_i(WR_CLK_i),
+          .REN_A2_i(1'b0),
+          .WEN_A2_i(WEN_i),
+          .BE_A2_i(WR_BE[3:2]),
+        
+          .WDATA_B2_i(18'h0),
+          .RDATA_B2_o(PORT_B2_RDATA[17:0]),
+          .ADDR_B2_i(RD_ADDR_SHIFTED),
+          .CLK_B2_i(RD_CLK_i),
+          .REN_B2_i(REN_i),
+          .WEN_B2_i(1'b0),
+          .BE_B2_i({REN_i,REN_i}),
+        
+          .FLUSH1_i(FLUSH1),
+          .FLUSH2_i(FLUSH2)
+        );        
+			end
+			32, 36: begin
+				defparam BRAM_BLK.MODE_BITS = { 1'b0,
+					11'd10, 11'd10, 4'd0, MODE_2, MODE_36, MODE_2, MODE_36, 1'd0,
+					12'd10, 12'd10, 4'd0, MODE_2, MODE_36, MODE_2, MODE_36, 1'd0
+				};
+        (* is_inferred = 1 *)
+        (* rd_data_width = RD_DATA_WIDTH *)
+        (* wr_data_width = WR_DATA_WIDTH *)
+        TDP36K BRAM_BLK (
+          .RESET_ni(1'b1),
+        
+          .WDATA_A1_i(PORT_A_WDATA[17:0]),
+          .RDATA_A1_o(),
+          .ADDR_A1_i(WR_ADDR_SHIFTED),
+          .CLK_A1_i(WR_CLK_i),
+          .REN_A1_i(1'b0),
+          .WEN_A1_i(WEN_i),
+          .BE_A1_i(WR_BE[1:0]),
+        
+          .WDATA_B1_i(18'h0),
+          .RDATA_B1_o(PORT_B1_RDATA[17:0]),
+          .ADDR_B1_i(RD_ADDR_SHIFTED),
+          .CLK_B1_i(RD_CLK_i),
+          .REN_B1_i(REN_i),
+          .WEN_B1_i(1'b0),
+          .BE_B1_i({REN_i,REN_i}),
+        
+          .WDATA_A2_i(PORT_A_WDATA[35:18]),
+          .RDATA_A2_o(),
+          .ADDR_A2_i(WR_ADDR_SHIFTED),
+          .CLK_A2_i(WR_CLK_i),
+          .REN_A2_i(1'b0),
+          .WEN_A2_i(WEN_i),
+          .BE_A2_i(WR_BE[3:2]),
+        
+          .WDATA_B2_i(18'h0),
+          .RDATA_B2_o(PORT_B2_RDATA[17:0]),
+          .ADDR_B2_i(RD_ADDR_SHIFTED),
+          .CLK_B2_i(RD_CLK_i),
+          .REN_B2_i(REN_i),
+          .WEN_B2_i(1'b0),
+          .BE_B2_i({REN_i,REN_i}),
+        
+          .FLUSH1_i(FLUSH1),
+          .FLUSH2_i(FLUSH2)
+        );        
+			end
+			default: begin
+				defparam BRAM_BLK.MODE_BITS = { 1'b0,
+					11'd10, 11'd10, 4'd0, MODE_2, MODE_1, MODE_2, MODE_1, 1'd0,
+					12'd10, 12'd10, 4'd0, MODE_2, MODE_1, MODE_2, MODE_1, 1'd0
+				};
+        (* is_inferred = 1 *)
+        (* rd_data_width = RD_DATA_WIDTH *)
+        (* wr_data_width = WR_DATA_WIDTH *)
+        TDP36K BRAM_BLK (
+          .RESET_ni(1'b1),
+        
+          .WDATA_A1_i(PORT_A_WDATA[17:0]),
+          .RDATA_A1_o(),
+          .ADDR_A1_i(WR_ADDR_SHIFTED),
+          .CLK_A1_i(WR_CLK_i),
+          .REN_A1_i(1'b0),
+          .WEN_A1_i(WEN_i),
+          .BE_A1_i(WR_BE[1:0]),
+        
+          .WDATA_B1_i(18'h0),
+          .RDATA_B1_o(PORT_B1_RDATA[17:0]),
+          .ADDR_B1_i(RD_ADDR_SHIFTED),
+          .CLK_B1_i(RD_CLK_i),
+          .REN_B1_i(REN_i),
+          .WEN_B1_i(1'b0),
+          .BE_B1_i({REN_i,REN_i}),
+        
+          .WDATA_A2_i(PORT_A_WDATA[35:18]),
+          .RDATA_A2_o(),
+          .ADDR_A2_i(WR_ADDR_SHIFTED),
+          .CLK_A2_i(WR_CLK_i),
+          .REN_A2_i(1'b0),
+          .WEN_A2_i(WEN_i),
+          .BE_A2_i(WR_BE[3:2]),
+        
+          .WDATA_B2_i(18'h0),
+          .RDATA_B2_o(PORT_B2_RDATA[17:0]),
+          .ADDR_B2_i(RD_ADDR_SHIFTED),
+          .CLK_B2_i(RD_CLK_i),
+          .REN_B2_i(REN_i),
+          .WEN_B2_i(1'b0),
+          .BE_B2_i({REN_i,REN_i}),
+        
+          .FLUSH1_i(FLUSH1),
+          .FLUSH2_i(FLUSH2)
+        );        
+			end
+		endcase
+	end
+	4: begin
+		case (WR_DATA_WIDTH)
+			1: begin
+				defparam BRAM_BLK.MODE_BITS = { 1'b0,
+					11'd10, 11'd10, 4'd0, MODE_4, MODE_1, MODE_4, MODE_1, 1'd0,
+					12'd10, 12'd10, 4'd0, MODE_4, MODE_1, MODE_4, MODE_1, 1'd0
+				};
+        (* is_inferred = 1 *)
+        (* rd_data_width = RD_DATA_WIDTH *)
+        (* wr_data_width = WR_DATA_WIDTH *)
+        TDP36K BRAM_BLK (
+          .RESET_ni(1'b1),
+        
+          .WDATA_A1_i(PORT_A_WDATA[17:0]),
+          .RDATA_A1_o(),
+          .ADDR_A1_i(WR_ADDR_SHIFTED),
+          .CLK_A1_i(WR_CLK_i),
+          .REN_A1_i(1'b0),
+          .WEN_A1_i(WEN_i),
+          .BE_A1_i(WR_BE[1:0]),
+        
+          .WDATA_B1_i(18'h0),
+          .RDATA_B1_o(PORT_B1_RDATA[17:0]),
+          .ADDR_B1_i(RD_ADDR_SHIFTED),
+          .CLK_B1_i(RD_CLK_i),
+          .REN_B1_i(REN_i),
+          .WEN_B1_i(1'b0),
+          .BE_B1_i({REN_i,REN_i}),
+        
+          .WDATA_A2_i(PORT_A_WDATA[35:18]),
+          .RDATA_A2_o(),
+          .ADDR_A2_i(WR_ADDR_SHIFTED),
+          .CLK_A2_i(WR_CLK_i),
+          .REN_A2_i(1'b0),
+          .WEN_A2_i(WEN_i),
+          .BE_A2_i(WR_BE[3:2]),
+        
+          .WDATA_B2_i(18'h0),
+          .RDATA_B2_o(PORT_B2_RDATA[17:0]),
+          .ADDR_B2_i(RD_ADDR_SHIFTED),
+          .CLK_B2_i(RD_CLK_i),
+          .REN_B2_i(REN_i),
+          .WEN_B2_i(1'b0),
+          .BE_B2_i({REN_i,REN_i}),
+        
+          .FLUSH1_i(FLUSH1),
+          .FLUSH2_i(FLUSH2)
+        );
+			end
+			2: begin
+				defparam BRAM_BLK.MODE_BITS = { 1'b0,
+					11'd10, 11'd10, 4'd0, MODE_4, MODE_2, MODE_4, MODE_2, 1'd0,
+					12'd10, 12'd10, 4'd0, MODE_4, MODE_2, MODE_4, MODE_2, 1'd0
+				};
+        (* is_inferred = 1 *)
+        (* rd_data_width = RD_DATA_WIDTH *)
+        (* wr_data_width = WR_DATA_WIDTH *)
+        TDP36K BRAM_BLK (
+          .RESET_ni(1'b1),
+        
+          .WDATA_A1_i(PORT_A_WDATA[17:0]),
+          .RDATA_A1_o(),
+          .ADDR_A1_i(WR_ADDR_SHIFTED),
+          .CLK_A1_i(WR_CLK_i),
+          .REN_A1_i(1'b0),
+          .WEN_A1_i(WEN_i),
+          .BE_A1_i(WR_BE[1:0]),
+        
+          .WDATA_B1_i(18'h0),
+          .RDATA_B1_o(PORT_B1_RDATA[17:0]),
+          .ADDR_B1_i(RD_ADDR_SHIFTED),
+          .CLK_B1_i(RD_CLK_i),
+          .REN_B1_i(REN_i),
+          .WEN_B1_i(1'b0),
+          .BE_B1_i({REN_i,REN_i}),
+        
+          .WDATA_A2_i(PORT_A_WDATA[35:18]),
+          .RDATA_A2_o(),
+          .ADDR_A2_i(WR_ADDR_SHIFTED),
+          .CLK_A2_i(WR_CLK_i),
+          .REN_A2_i(1'b0),
+          .WEN_A2_i(WEN_i),
+          .BE_A2_i(WR_BE[3:2]),
+        
+          .WDATA_B2_i(18'h0),
+          .RDATA_B2_o(PORT_B2_RDATA[17:0]),
+          .ADDR_B2_i(RD_ADDR_SHIFTED),
+          .CLK_B2_i(RD_CLK_i),
+          .REN_B2_i(REN_i),
+          .WEN_B2_i(1'b0),
+          .BE_B2_i({REN_i,REN_i}),
+        
+          .FLUSH1_i(FLUSH1),
+          .FLUSH2_i(FLUSH2)
+        );        
+			end
+			4: begin
+				defparam BRAM_BLK.MODE_BITS = { 1'b0,
+					11'd10, 11'd10, 4'd0, MODE_4, MODE_4, MODE_4, MODE_4, 1'd0,
+					12'd10, 12'd10, 4'd0, MODE_4, MODE_4, MODE_4, MODE_4, 1'd0
+				};
+        (* is_inferred = 1 *)
+        (* rd_data_width = RD_DATA_WIDTH *)
+        (* wr_data_width = WR_DATA_WIDTH *)
+        TDP36K BRAM_BLK (
+          .RESET_ni(1'b1),
+        
+          .WDATA_A1_i(PORT_A_WDATA[17:0]),
+          .RDATA_A1_o(),
+          .ADDR_A1_i(WR_ADDR_SHIFTED),
+          .CLK_A1_i(WR_CLK_i),
+          .REN_A1_i(1'b0),
+          .WEN_A1_i(WEN_i),
+          .BE_A1_i(WR_BE[1:0]),
+        
+          .WDATA_B1_i(18'h0),
+          .RDATA_B1_o(PORT_B1_RDATA[17:0]),
+          .ADDR_B1_i(RD_ADDR_SHIFTED),
+          .CLK_B1_i(RD_CLK_i),
+          .REN_B1_i(REN_i),
+          .WEN_B1_i(1'b0),
+          .BE_B1_i({REN_i,REN_i}),
+        
+          .WDATA_A2_i(PORT_A_WDATA[35:18]),
+          .RDATA_A2_o(),
+          .ADDR_A2_i(WR_ADDR_SHIFTED),
+          .CLK_A2_i(WR_CLK_i),
+          .REN_A2_i(1'b0),
+          .WEN_A2_i(WEN_i),
+          .BE_A2_i(WR_BE[3:2]),
+        
+          .WDATA_B2_i(18'h0),
+          .RDATA_B2_o(PORT_B2_RDATA[17:0]),
+          .ADDR_B2_i(RD_ADDR_SHIFTED),
+          .CLK_B2_i(RD_CLK_i),
+          .REN_B2_i(REN_i),
+          .WEN_B2_i(1'b0),
+          .BE_B2_i({REN_i,REN_i}),
+        
+          .FLUSH1_i(FLUSH1),
+          .FLUSH2_i(FLUSH2)
+        );        
+			end
+			8, 9: begin
+				defparam BRAM_BLK.MODE_BITS = { 1'b0,
+					11'd10, 11'd10, 4'd0, MODE_4, MODE_9, MODE_4, MODE_9, 1'd0,
+					12'd10, 12'd10, 4'd0, MODE_4, MODE_9, MODE_4, MODE_9, 1'd0
+				};
+        (* is_inferred = 1 *)
+        (* rd_data_width = RD_DATA_WIDTH *)
+        (* wr_data_width = WR_DATA_WIDTH *)
+        TDP36K BRAM_BLK (
+          .RESET_ni(1'b1),
+        
+          .WDATA_A1_i(PORT_A_WDATA[17:0]),
+          .RDATA_A1_o(),
+          .ADDR_A1_i(WR_ADDR_SHIFTED),
+          .CLK_A1_i(WR_CLK_i),
+          .REN_A1_i(1'b0),
+          .WEN_A1_i(WEN_i),
+          .BE_A1_i(WR_BE[1:0]),
+        
+          .WDATA_B1_i(18'h0),
+          .RDATA_B1_o(PORT_B1_RDATA[17:0]),
+          .ADDR_B1_i(RD_ADDR_SHIFTED),
+          .CLK_B1_i(RD_CLK_i),
+          .REN_B1_i(REN_i),
+          .WEN_B1_i(1'b0),
+          .BE_B1_i({REN_i,REN_i}),
+        
+          .WDATA_A2_i(PORT_A_WDATA[35:18]),
+          .RDATA_A2_o(),
+          .ADDR_A2_i(WR_ADDR_SHIFTED),
+          .CLK_A2_i(WR_CLK_i),
+          .REN_A2_i(1'b0),
+          .WEN_A2_i(WEN_i),
+          .BE_A2_i(WR_BE[3:2]),
+        
+          .WDATA_B2_i(18'h0),
+          .RDATA_B2_o(PORT_B2_RDATA[17:0]),
+          .ADDR_B2_i(RD_ADDR_SHIFTED),
+          .CLK_B2_i(RD_CLK_i),
+          .REN_B2_i(REN_i),
+          .WEN_B2_i(1'b0),
+          .BE_B2_i({REN_i,REN_i}),
+        
+          .FLUSH1_i(FLUSH1),
+          .FLUSH2_i(FLUSH2)
+        );        
+			end
+			16, 18: begin
+				defparam BRAM_BLK.MODE_BITS = { 1'b0,
+					11'd10, 11'd10, 4'd0, MODE_4, MODE_18, MODE_4, MODE_18, 1'd0,
+					12'd10, 12'd10, 4'd0, MODE_4, MODE_18, MODE_4, MODE_18, 1'd0
+				};
+        (* is_inferred = 1 *)
+        (* rd_data_width = RD_DATA_WIDTH *)
+        (* wr_data_width = WR_DATA_WIDTH *)
+        TDP36K BRAM_BLK (
+          .RESET_ni(1'b1),
+        
+          .WDATA_A1_i(PORT_A_WDATA[17:0]),
+          .RDATA_A1_o(),
+          .ADDR_A1_i(WR_ADDR_SHIFTED),
+          .CLK_A1_i(WR_CLK_i),
+          .REN_A1_i(1'b0),
+          .WEN_A1_i(WEN_i),
+          .BE_A1_i(WR_BE[1:0]),
+        
+          .WDATA_B1_i(18'h0),
+          .RDATA_B1_o(PORT_B1_RDATA[17:0]),
+          .ADDR_B1_i(RD_ADDR_SHIFTED),
+          .CLK_B1_i(RD_CLK_i),
+          .REN_B1_i(REN_i),
+          .WEN_B1_i(1'b0),
+          .BE_B1_i({REN_i,REN_i}),
+        
+          .WDATA_A2_i(PORT_A_WDATA[35:18]),
+          .RDATA_A2_o(),
+          .ADDR_A2_i(WR_ADDR_SHIFTED),
+          .CLK_A2_i(WR_CLK_i),
+          .REN_A2_i(1'b0),
+          .WEN_A2_i(WEN_i),
+          .BE_A2_i(WR_BE[3:2]),
+        
+          .WDATA_B2_i(18'h0),
+          .RDATA_B2_o(PORT_B2_RDATA[17:0]),
+          .ADDR_B2_i(RD_ADDR_SHIFTED),
+          .CLK_B2_i(RD_CLK_i),
+          .REN_B2_i(REN_i),
+          .WEN_B2_i(1'b0),
+          .BE_B2_i({REN_i,REN_i}),
+        
+          .FLUSH1_i(FLUSH1),
+          .FLUSH2_i(FLUSH2)
+        );        
+			end
+			32, 36: begin
+				defparam BRAM_BLK.MODE_BITS = { 1'b0,
+					11'd10, 11'd10, 4'd0, MODE_4, MODE_36, MODE_4, MODE_36, 1'd0,
+					12'd10, 12'd10, 4'd0, MODE_4, MODE_36, MODE_4, MODE_36, 1'd0
+				};
+        (* is_inferred = 1 *)
+        (* rd_data_width = RD_DATA_WIDTH *)
+        (* wr_data_width = WR_DATA_WIDTH *)
+        TDP36K BRAM_BLK (
+          .RESET_ni(1'b1),
+        
+          .WDATA_A1_i(PORT_A_WDATA[17:0]),
+          .RDATA_A1_o(),
+          .ADDR_A1_i(WR_ADDR_SHIFTED),
+          .CLK_A1_i(WR_CLK_i),
+          .REN_A1_i(1'b0),
+          .WEN_A1_i(WEN_i),
+          .BE_A1_i(WR_BE[1:0]),
+        
+          .WDATA_B1_i(18'h0),
+          .RDATA_B1_o(PORT_B1_RDATA[17:0]),
+          .ADDR_B1_i(RD_ADDR_SHIFTED),
+          .CLK_B1_i(RD_CLK_i),
+          .REN_B1_i(REN_i),
+          .WEN_B1_i(1'b0),
+          .BE_B1_i({REN_i,REN_i}),
+        
+          .WDATA_A2_i(PORT_A_WDATA[35:18]),
+          .RDATA_A2_o(),
+          .ADDR_A2_i(WR_ADDR_SHIFTED),
+          .CLK_A2_i(WR_CLK_i),
+          .REN_A2_i(1'b0),
+          .WEN_A2_i(WEN_i),
+          .BE_A2_i(WR_BE[3:2]),
+        
+          .WDATA_B2_i(18'h0),
+          .RDATA_B2_o(PORT_B2_RDATA[17:0]),
+          .ADDR_B2_i(RD_ADDR_SHIFTED),
+          .CLK_B2_i(RD_CLK_i),
+          .REN_B2_i(REN_i),
+          .WEN_B2_i(1'b0),
+          .BE_B2_i({REN_i,REN_i}),
+        
+          .FLUSH1_i(FLUSH1),
+          .FLUSH2_i(FLUSH2)
+        );        
+			end
+			default: begin
+				defparam BRAM_BLK.MODE_BITS = { 1'b0,
+					11'd10, 11'd10, 4'd0, MODE_4, MODE_1, MODE_4, MODE_1, 1'd0,
+					12'd10, 12'd10, 4'd0, MODE_4, MODE_1, MODE_4, MODE_1, 1'd0
+				};
+        (* is_inferred = 1 *)
+        (* rd_data_width = RD_DATA_WIDTH *)
+        (* wr_data_width = WR_DATA_WIDTH *)
+        TDP36K BRAM_BLK (
+          .RESET_ni(1'b1),
+        
+          .WDATA_A1_i(PORT_A_WDATA[17:0]),
+          .RDATA_A1_o(),
+          .ADDR_A1_i(WR_ADDR_SHIFTED),
+          .CLK_A1_i(WR_CLK_i),
+          .REN_A1_i(1'b0),
+          .WEN_A1_i(WEN_i),
+          .BE_A1_i(WR_BE[1:0]),
+        
+          .WDATA_B1_i(18'h0),
+          .RDATA_B1_o(PORT_B1_RDATA[17:0]),
+          .ADDR_B1_i(RD_ADDR_SHIFTED),
+          .CLK_B1_i(RD_CLK_i),
+          .REN_B1_i(REN_i),
+          .WEN_B1_i(1'b0),
+          .BE_B1_i({REN_i,REN_i}),
+        
+          .WDATA_A2_i(PORT_A_WDATA[35:18]),
+          .RDATA_A2_o(),
+          .ADDR_A2_i(WR_ADDR_SHIFTED),
+          .CLK_A2_i(WR_CLK_i),
+          .REN_A2_i(1'b0),
+          .WEN_A2_i(WEN_i),
+          .BE_A2_i(WR_BE[3:2]),
+        
+          .WDATA_B2_i(18'h0),
+          .RDATA_B2_o(PORT_B2_RDATA[17:0]),
+          .ADDR_B2_i(RD_ADDR_SHIFTED),
+          .CLK_B2_i(RD_CLK_i),
+          .REN_B2_i(REN_i),
+          .WEN_B2_i(1'b0),
+          .BE_B2_i({REN_i,REN_i}),
+        
+          .FLUSH1_i(FLUSH1),
+          .FLUSH2_i(FLUSH2)
+        );        
+			end
+		endcase
+	end
+	8, 9: begin
+		case (WR_DATA_WIDTH)
+			1: begin
+				defparam BRAM_BLK.MODE_BITS = { 1'b0,
+					11'd10, 11'd10, 4'd0, MODE_9, MODE_1, MODE_9, MODE_1, 1'd0,
+					12'd10, 12'd10, 4'd0, MODE_9, MODE_1, MODE_9, MODE_1, 1'd0
+				};
+        (* is_inferred = 1 *)
+        (* rd_data_width = RD_DATA_WIDTH *)
+        (* wr_data_width = WR_DATA_WIDTH *)
+        TDP36K BRAM_BLK (
+          .RESET_ni(1'b1),
+        
+          .WDATA_A1_i(PORT_A_WDATA[17:0]),
+          .RDATA_A1_o(),
+          .ADDR_A1_i(WR_ADDR_SHIFTED),
+          .CLK_A1_i(WR_CLK_i),
+          .REN_A1_i(1'b0),
+          .WEN_A1_i(WEN_i),
+          .BE_A1_i(WR_BE[1:0]),
+        
+          .WDATA_B1_i(18'h0),
+          .RDATA_B1_o(PORT_B1_RDATA[17:0]),
+          .ADDR_B1_i(RD_ADDR_SHIFTED),
+          .CLK_B1_i(RD_CLK_i),
+          .REN_B1_i(REN_i),
+          .WEN_B1_i(1'b0),
+          .BE_B1_i({REN_i,REN_i}),
+        
+          .WDATA_A2_i(PORT_A_WDATA[35:18]),
+          .RDATA_A2_o(),
+          .ADDR_A2_i(WR_ADDR_SHIFTED),
+          .CLK_A2_i(WR_CLK_i),
+          .REN_A2_i(1'b0),
+          .WEN_A2_i(WEN_i),
+          .BE_A2_i(WR_BE[3:2]),
+        
+          .WDATA_B2_i(18'h0),
+          .RDATA_B2_o(PORT_B2_RDATA[17:0]),
+          .ADDR_B2_i(RD_ADDR_SHIFTED),
+          .CLK_B2_i(RD_CLK_i),
+          .REN_B2_i(REN_i),
+          .WEN_B2_i(1'b0),
+          .BE_B2_i({REN_i,REN_i}),
+        
+          .FLUSH1_i(FLUSH1),
+          .FLUSH2_i(FLUSH2)
+        );        
+			end
+			2: begin
+				defparam BRAM_BLK.MODE_BITS = { 1'b0,
+					11'd10, 11'd10, 4'd0, MODE_9, MODE_2, MODE_9, MODE_2, 1'd0,
+					12'd10, 12'd10, 4'd0, MODE_9, MODE_2, MODE_9, MODE_2, 1'd0
+				};
+        (* is_inferred = 1 *)
+        (* rd_data_width = RD_DATA_WIDTH *)
+        (* wr_data_width = WR_DATA_WIDTH *)
+        TDP36K BRAM_BLK (
+          .RESET_ni(1'b1),
+        
+          .WDATA_A1_i(PORT_A_WDATA[17:0]),
+          .RDATA_A1_o(),
+          .ADDR_A1_i(WR_ADDR_SHIFTED),
+          .CLK_A1_i(WR_CLK_i),
+          .REN_A1_i(1'b0),
+          .WEN_A1_i(WEN_i),
+          .BE_A1_i(WR_BE[1:0]),
+        
+          .WDATA_B1_i(18'h0),
+          .RDATA_B1_o(PORT_B1_RDATA[17:0]),
+          .ADDR_B1_i(RD_ADDR_SHIFTED),
+          .CLK_B1_i(RD_CLK_i),
+          .REN_B1_i(REN_i),
+          .WEN_B1_i(1'b0),
+          .BE_B1_i({REN_i,REN_i}),
+        
+          .WDATA_A2_i(PORT_A_WDATA[35:18]),
+          .RDATA_A2_o(),
+          .ADDR_A2_i(WR_ADDR_SHIFTED),
+          .CLK_A2_i(WR_CLK_i),
+          .REN_A2_i(1'b0),
+          .WEN_A2_i(WEN_i),
+          .BE_A2_i(WR_BE[3:2]),
+        
+          .WDATA_B2_i(18'h0),
+          .RDATA_B2_o(PORT_B2_RDATA[17:0]),
+          .ADDR_B2_i(RD_ADDR_SHIFTED),
+          .CLK_B2_i(RD_CLK_i),
+          .REN_B2_i(REN_i),
+          .WEN_B2_i(1'b0),
+          .BE_B2_i({REN_i,REN_i}),
+        
+          .FLUSH1_i(FLUSH1),
+          .FLUSH2_i(FLUSH2)
+        );        
+			end
+			4: begin
+				defparam BRAM_BLK.MODE_BITS = { 1'b0,
+					11'd10, 11'd10, 4'd0, MODE_9, MODE_4, MODE_9, MODE_4, 1'd0,
+					12'd10, 12'd10, 4'd0, MODE_9, MODE_4, MODE_9, MODE_4, 1'd0
+				};
+        (* is_inferred = 1 *)
+        (* rd_data_width = RD_DATA_WIDTH *)
+        (* wr_data_width = WR_DATA_WIDTH *)
+        TDP36K BRAM_BLK (
+          .RESET_ni(1'b1),
+        
+          .WDATA_A1_i(PORT_A_WDATA[17:0]),
+          .RDATA_A1_o(),
+          .ADDR_A1_i(WR_ADDR_SHIFTED),
+          .CLK_A1_i(WR_CLK_i),
+          .REN_A1_i(1'b0),
+          .WEN_A1_i(WEN_i),
+          .BE_A1_i(WR_BE[1:0]),
+        
+          .WDATA_B1_i(18'h0),
+          .RDATA_B1_o(PORT_B1_RDATA[17:0]),
+          .ADDR_B1_i(RD_ADDR_SHIFTED),
+          .CLK_B1_i(RD_CLK_i),
+          .REN_B1_i(REN_i),
+          .WEN_B1_i(1'b0),
+          .BE_B1_i({REN_i,REN_i}),
+        
+          .WDATA_A2_i(PORT_A_WDATA[35:18]),
+          .RDATA_A2_o(),
+          .ADDR_A2_i(WR_ADDR_SHIFTED),
+          .CLK_A2_i(WR_CLK_i),
+          .REN_A2_i(1'b0),
+          .WEN_A2_i(WEN_i),
+          .BE_A2_i(WR_BE[3:2]),
+        
+          .WDATA_B2_i(18'h0),
+          .RDATA_B2_o(PORT_B2_RDATA[17:0]),
+          .ADDR_B2_i(RD_ADDR_SHIFTED),
+          .CLK_B2_i(RD_CLK_i),
+          .REN_B2_i(REN_i),
+          .WEN_B2_i(1'b0),
+          .BE_B2_i({REN_i,REN_i}),
+        
+          .FLUSH1_i(FLUSH1),
+          .FLUSH2_i(FLUSH2)
+        );        
+			end
+			8, 9: begin
+				defparam BRAM_BLK.MODE_BITS = { 1'b0,
+					11'd10, 11'd10, 4'd0, MODE_9, MODE_9, MODE_9, MODE_9, 1'd0,
+					12'd10, 12'd10, 4'd0, MODE_9, MODE_9, MODE_9, MODE_9, 1'd0
+				};
+        (* is_inferred = 1 *)
+        (* rd_data_width = RD_DATA_WIDTH *)
+        (* wr_data_width = WR_DATA_WIDTH *)
+        TDP36K BRAM_BLK (
+          .RESET_ni(1'b1),
+        
+          .WDATA_A1_i(PORT_A_WDATA[17:0]),
+          .RDATA_A1_o(),
+          .ADDR_A1_i(WR_ADDR_SHIFTED),
+          .CLK_A1_i(WR_CLK_i),
+          .REN_A1_i(1'b0),
+          .WEN_A1_i(WEN_i),
+          .BE_A1_i(WR_BE[1:0]),
+        
+          .WDATA_B1_i(18'h0),
+          .RDATA_B1_o(PORT_B1_RDATA[17:0]),
+          .ADDR_B1_i(RD_ADDR_SHIFTED),
+          .CLK_B1_i(RD_CLK_i),
+          .REN_B1_i(REN_i),
+          .WEN_B1_i(1'b0),
+          .BE_B1_i({REN_i,REN_i}),
+        
+          .WDATA_A2_i(PORT_A_WDATA[35:18]),
+          .RDATA_A2_o(),
+          .ADDR_A2_i(WR_ADDR_SHIFTED),
+          .CLK_A2_i(WR_CLK_i),
+          .REN_A2_i(1'b0),
+          .WEN_A2_i(WEN_i),
+          .BE_A2_i(WR_BE[3:2]),
+        
+          .WDATA_B2_i(18'h0),
+          .RDATA_B2_o(PORT_B2_RDATA[17:0]),
+          .ADDR_B2_i(RD_ADDR_SHIFTED),
+          .CLK_B2_i(RD_CLK_i),
+          .REN_B2_i(REN_i),
+          .WEN_B2_i(1'b0),
+          .BE_B2_i({REN_i,REN_i}),
+        
+          .FLUSH1_i(FLUSH1),
+          .FLUSH2_i(FLUSH2)
+        );        
+			end
+			16, 18: begin
+				defparam BRAM_BLK.MODE_BITS = { 1'b0,
+					11'd10, 11'd10, 4'd0, MODE_9, MODE_18, MODE_9, MODE_18, 1'd0,
+					12'd10, 12'd10, 4'd0, MODE_9, MODE_18, MODE_9, MODE_18, 1'd0
+				};
+        (* is_inferred = 1 *)
+        (* rd_data_width = RD_DATA_WIDTH *)
+        (* wr_data_width = WR_DATA_WIDTH *)
+        TDP36K BRAM_BLK (
+          .RESET_ni(1'b1),
+        
+          .WDATA_A1_i(PORT_A_WDATA[17:0]),
+          .RDATA_A1_o(),
+          .ADDR_A1_i(WR_ADDR_SHIFTED),
+          .CLK_A1_i(WR_CLK_i),
+          .REN_A1_i(1'b0),
+          .WEN_A1_i(WEN_i),
+          .BE_A1_i(WR_BE[1:0]),
+        
+          .WDATA_B1_i(18'h0),
+          .RDATA_B1_o(PORT_B1_RDATA[17:0]),
+          .ADDR_B1_i(RD_ADDR_SHIFTED),
+          .CLK_B1_i(RD_CLK_i),
+          .REN_B1_i(REN_i),
+          .WEN_B1_i(1'b0),
+          .BE_B1_i({REN_i,REN_i}),
+        
+          .WDATA_A2_i(PORT_A_WDATA[35:18]),
+          .RDATA_A2_o(),
+          .ADDR_A2_i(WR_ADDR_SHIFTED),
+          .CLK_A2_i(WR_CLK_i),
+          .REN_A2_i(1'b0),
+          .WEN_A2_i(WEN_i),
+          .BE_A2_i(WR_BE[3:2]),
+        
+          .WDATA_B2_i(18'h0),
+          .RDATA_B2_o(PORT_B2_RDATA[17:0]),
+          .ADDR_B2_i(RD_ADDR_SHIFTED),
+          .CLK_B2_i(RD_CLK_i),
+          .REN_B2_i(REN_i),
+          .WEN_B2_i(1'b0),
+          .BE_B2_i({REN_i,REN_i}),
+        
+          .FLUSH1_i(FLUSH1),
+          .FLUSH2_i(FLUSH2)
+        );        
+			end
+			32, 36: begin
+				defparam BRAM_BLK.MODE_BITS = { 1'b0,
+					11'd10, 11'd10, 4'd0, MODE_9, MODE_36, MODE_9, MODE_36, 1'd0,
+					12'd10, 12'd10, 4'd0, MODE_9, MODE_36, MODE_9, MODE_36, 1'd0
+				};
+        (* is_inferred = 1 *)
+        (* rd_data_width = RD_DATA_WIDTH *)
+        (* wr_data_width = WR_DATA_WIDTH *)
+        TDP36K BRAM_BLK (
+          .RESET_ni(1'b1),
+        
+          .WDATA_A1_i(PORT_A_WDATA[17:0]),
+          .RDATA_A1_o(),
+          .ADDR_A1_i(WR_ADDR_SHIFTED),
+          .CLK_A1_i(WR_CLK_i),
+          .REN_A1_i(1'b0),
+          .WEN_A1_i(WEN_i),
+          .BE_A1_i(WR_BE[1:0]),
+        
+          .WDATA_B1_i(18'h0),
+          .RDATA_B1_o(PORT_B1_RDATA[17:0]),
+          .ADDR_B1_i(RD_ADDR_SHIFTED),
+          .CLK_B1_i(RD_CLK_i),
+          .REN_B1_i(REN_i),
+          .WEN_B1_i(1'b0),
+          .BE_B1_i({REN_i,REN_i}),
+        
+          .WDATA_A2_i(PORT_A_WDATA[35:18]),
+          .RDATA_A2_o(),
+          .ADDR_A2_i(WR_ADDR_SHIFTED),
+          .CLK_A2_i(WR_CLK_i),
+          .REN_A2_i(1'b0),
+          .WEN_A2_i(WEN_i),
+          .BE_A2_i(WR_BE[3:2]),
+        
+          .WDATA_B2_i(18'h0),
+          .RDATA_B2_o(PORT_B2_RDATA[17:0]),
+          .ADDR_B2_i(RD_ADDR_SHIFTED),
+          .CLK_B2_i(RD_CLK_i),
+          .REN_B2_i(REN_i),
+          .WEN_B2_i(1'b0),
+          .BE_B2_i({REN_i,REN_i}),
+        
+          .FLUSH1_i(FLUSH1),
+          .FLUSH2_i(FLUSH2)
+        );        
+			end
+			default: begin
+				defparam BRAM_BLK.MODE_BITS = { 1'b0,
+					11'd10, 11'd10, 4'd0, MODE_9, MODE_1, MODE_9, MODE_1, 1'd0,
+					12'd10, 12'd10, 4'd0, MODE_9, MODE_1, MODE_9, MODE_1, 1'd0
+				};
+        (* is_inferred = 1 *)
+        (* rd_data_width = RD_DATA_WIDTH *)
+        (* wr_data_width = WR_DATA_WIDTH *)
+        TDP36K BRAM_BLK (
+          .RESET_ni(1'b1),
+        
+          .WDATA_A1_i(PORT_A_WDATA[17:0]),
+          .RDATA_A1_o(),
+          .ADDR_A1_i(WR_ADDR_SHIFTED),
+          .CLK_A1_i(WR_CLK_i),
+          .REN_A1_i(1'b0),
+          .WEN_A1_i(WEN_i),
+          .BE_A1_i(WR_BE[1:0]),
+        
+          .WDATA_B1_i(18'h0),
+          .RDATA_B1_o(PORT_B1_RDATA[17:0]),
+          .ADDR_B1_i(RD_ADDR_SHIFTED),
+          .CLK_B1_i(RD_CLK_i),
+          .REN_B1_i(REN_i),
+          .WEN_B1_i(1'b0),
+          .BE_B1_i({REN_i,REN_i}),
+        
+          .WDATA_A2_i(PORT_A_WDATA[35:18]),
+          .RDATA_A2_o(),
+          .ADDR_A2_i(WR_ADDR_SHIFTED),
+          .CLK_A2_i(WR_CLK_i),
+          .REN_A2_i(1'b0),
+          .WEN_A2_i(WEN_i),
+          .BE_A2_i(WR_BE[3:2]),
+        
+          .WDATA_B2_i(18'h0),
+          .RDATA_B2_o(PORT_B2_RDATA[17:0]),
+          .ADDR_B2_i(RD_ADDR_SHIFTED),
+          .CLK_B2_i(RD_CLK_i),
+          .REN_B2_i(REN_i),
+          .WEN_B2_i(1'b0),
+          .BE_B2_i({REN_i,REN_i}),
+        
+          .FLUSH1_i(FLUSH1),
+          .FLUSH2_i(FLUSH2)
+        );        
+			end
+		endcase
+	end
+	16, 18: begin
+		case (WR_DATA_WIDTH)
+			1: begin
+				defparam BRAM_BLK.MODE_BITS = { 1'b0,
+					11'd10, 11'd10, 4'd0, MODE_18, MODE_1, MODE_18, MODE_1, 1'd0,
+					12'd10, 12'd10, 4'd0, MODE_18, MODE_1, MODE_18, MODE_1, 1'd0
+				};
+        (* is_inferred = 1 *)
+        (* rd_data_width = RD_DATA_WIDTH *)
+        (* wr_data_width = WR_DATA_WIDTH *)
+        TDP36K BRAM_BLK (
+          .RESET_ni(1'b1),
+        
+          .WDATA_A1_i(PORT_A_WDATA[17:0]),
+          .RDATA_A1_o(),
+          .ADDR_A1_i(WR_ADDR_SHIFTED),
+          .CLK_A1_i(WR_CLK_i),
+          .REN_A1_i(1'b0),
+          .WEN_A1_i(WEN_i),
+          .BE_A1_i(WR_BE[1:0]),
+        
+          .WDATA_B1_i(18'h0),
+          .RDATA_B1_o(PORT_B1_RDATA[17:0]),
+          .ADDR_B1_i(RD_ADDR_SHIFTED),
+          .CLK_B1_i(RD_CLK_i),
+          .REN_B1_i(REN_i),
+          .WEN_B1_i(1'b0),
+          .BE_B1_i({REN_i,REN_i}),
+        
+          .WDATA_A2_i(PORT_A_WDATA[35:18]),
+          .RDATA_A2_o(),
+          .ADDR_A2_i(WR_ADDR_SHIFTED),
+          .CLK_A2_i(WR_CLK_i),
+          .REN_A2_i(1'b0),
+          .WEN_A2_i(WEN_i),
+          .BE_A2_i(WR_BE[3:2]),
+        
+          .WDATA_B2_i(18'h0),
+          .RDATA_B2_o(PORT_B2_RDATA[17:0]),
+          .ADDR_B2_i(RD_ADDR_SHIFTED),
+          .CLK_B2_i(RD_CLK_i),
+          .REN_B2_i(REN_i),
+          .WEN_B2_i(1'b0),
+          .BE_B2_i({REN_i,REN_i}),
+        
+          .FLUSH1_i(FLUSH1),
+          .FLUSH2_i(FLUSH2)
+        );        
+			end
+			2: begin
+				defparam BRAM_BLK.MODE_BITS = { 1'b0,
+					11'd10, 11'd10, 4'd0, MODE_18, MODE_2, MODE_18, MODE_2, 1'd0,
+					12'd10, 12'd10, 4'd0, MODE_18, MODE_2, MODE_18, MODE_2, 1'd0
+				};
+        (* is_inferred = 1 *)
+        (* rd_data_width = RD_DATA_WIDTH *)
+        (* wr_data_width = WR_DATA_WIDTH *)
+        TDP36K BRAM_BLK (
+          .RESET_ni(1'b1),
+        
+          .WDATA_A1_i(PORT_A_WDATA[17:0]),
+          .RDATA_A1_o(),
+          .ADDR_A1_i(WR_ADDR_SHIFTED),
+          .CLK_A1_i(WR_CLK_i),
+          .REN_A1_i(1'b0),
+          .WEN_A1_i(WEN_i),
+          .BE_A1_i(WR_BE[1:0]),
+        
+          .WDATA_B1_i(18'h0),
+          .RDATA_B1_o(PORT_B1_RDATA[17:0]),
+          .ADDR_B1_i(RD_ADDR_SHIFTED),
+          .CLK_B1_i(RD_CLK_i),
+          .REN_B1_i(REN_i),
+          .WEN_B1_i(1'b0),
+          .BE_B1_i({REN_i,REN_i}),
+        
+          .WDATA_A2_i(PORT_A_WDATA[35:18]),
+          .RDATA_A2_o(),
+          .ADDR_A2_i(WR_ADDR_SHIFTED),
+          .CLK_A2_i(WR_CLK_i),
+          .REN_A2_i(1'b0),
+          .WEN_A2_i(WEN_i),
+          .BE_A2_i(WR_BE[3:2]),
+        
+          .WDATA_B2_i(18'h0),
+          .RDATA_B2_o(PORT_B2_RDATA[17:0]),
+          .ADDR_B2_i(RD_ADDR_SHIFTED),
+          .CLK_B2_i(RD_CLK_i),
+          .REN_B2_i(REN_i),
+          .WEN_B2_i(1'b0),
+          .BE_B2_i({REN_i,REN_i}),
+        
+          .FLUSH1_i(FLUSH1),
+          .FLUSH2_i(FLUSH2)
+        );        
+			end
+			4: begin
+				defparam BRAM_BLK.MODE_BITS = { 1'b0,
+					11'd10, 11'd10, 4'd0, MODE_18, MODE_4, MODE_18, MODE_4, 1'd0,
+					12'd10, 12'd10, 4'd0, MODE_18, MODE_4, MODE_18, MODE_4, 1'd0
+				};
+        (* is_inferred = 1 *)
+        (* rd_data_width = RD_DATA_WIDTH *)
+        (* wr_data_width = WR_DATA_WIDTH *)
+        TDP36K BRAM_BLK (
+          .RESET_ni(1'b1),
+        
+          .WDATA_A1_i(PORT_A_WDATA[17:0]),
+          .RDATA_A1_o(),
+          .ADDR_A1_i(WR_ADDR_SHIFTED),
+          .CLK_A1_i(WR_CLK_i),
+          .REN_A1_i(1'b0),
+          .WEN_A1_i(WEN_i),
+          .BE_A1_i(WR_BE[1:0]),
+        
+          .WDATA_B1_i(18'h0),
+          .RDATA_B1_o(PORT_B1_RDATA[17:0]),
+          .ADDR_B1_i(RD_ADDR_SHIFTED),
+          .CLK_B1_i(RD_CLK_i),
+          .REN_B1_i(REN_i),
+          .WEN_B1_i(1'b0),
+          .BE_B1_i({REN_i,REN_i}),
+        
+          .WDATA_A2_i(PORT_A_WDATA[35:18]),
+          .RDATA_A2_o(),
+          .ADDR_A2_i(WR_ADDR_SHIFTED),
+          .CLK_A2_i(WR_CLK_i),
+          .REN_A2_i(1'b0),
+          .WEN_A2_i(WEN_i),
+          .BE_A2_i(WR_BE[3:2]),
+        
+          .WDATA_B2_i(18'h0),
+          .RDATA_B2_o(PORT_B2_RDATA[17:0]),
+          .ADDR_B2_i(RD_ADDR_SHIFTED),
+          .CLK_B2_i(RD_CLK_i),
+          .REN_B2_i(REN_i),
+          .WEN_B2_i(1'b0),
+          .BE_B2_i({REN_i,REN_i}),
+        
+          .FLUSH1_i(FLUSH1),
+          .FLUSH2_i(FLUSH2)
+        );        
+			end
+			8, 9: begin
+				defparam BRAM_BLK.MODE_BITS = { 1'b0,
+					11'd10, 11'd10, 4'd0, MODE_18, MODE_9, MODE_18, MODE_9, 1'd0,
+					12'd10, 12'd10, 4'd0, MODE_18, MODE_9, MODE_18, MODE_9, 1'd0
+				};
+        (* is_inferred = 1 *)
+        (* rd_data_width = RD_DATA_WIDTH *)
+        (* wr_data_width = WR_DATA_WIDTH *)
+        TDP36K BRAM_BLK (
+          .RESET_ni(1'b1),
+        
+          .WDATA_A1_i(PORT_A_WDATA[17:0]),
+          .RDATA_A1_o(),
+          .ADDR_A1_i(WR_ADDR_SHIFTED),
+          .CLK_A1_i(WR_CLK_i),
+          .REN_A1_i(1'b0),
+          .WEN_A1_i(WEN_i),
+          .BE_A1_i(WR_BE[1:0]),
+        
+          .WDATA_B1_i(18'h0),
+          .RDATA_B1_o(PORT_B1_RDATA[17:0]),
+          .ADDR_B1_i(RD_ADDR_SHIFTED),
+          .CLK_B1_i(RD_CLK_i),
+          .REN_B1_i(REN_i),
+          .WEN_B1_i(1'b0),
+          .BE_B1_i({REN_i,REN_i}),
+        
+          .WDATA_A2_i(PORT_A_WDATA[35:18]),
+          .RDATA_A2_o(),
+          .ADDR_A2_i(WR_ADDR_SHIFTED),
+          .CLK_A2_i(WR_CLK_i),
+          .REN_A2_i(1'b0),
+          .WEN_A2_i(WEN_i),
+          .BE_A2_i(WR_BE[3:2]),
+        
+          .WDATA_B2_i(18'h0),
+          .RDATA_B2_o(PORT_B2_RDATA[17:0]),
+          .ADDR_B2_i(RD_ADDR_SHIFTED),
+          .CLK_B2_i(RD_CLK_i),
+          .REN_B2_i(REN_i),
+          .WEN_B2_i(1'b0),
+          .BE_B2_i({REN_i,REN_i}),
+        
+          .FLUSH1_i(FLUSH1),
+          .FLUSH2_i(FLUSH2)
+        );        
+			end
+			16, 18: begin
+				defparam BRAM_BLK.MODE_BITS = { 1'b0,
+					11'd10, 11'd10, 4'd0, MODE_18, MODE_18, MODE_18, MODE_18, 1'd0,
+					12'd10, 12'd10, 4'd0, MODE_18, MODE_18, MODE_18, MODE_18, 1'd0
+				};
+        (* is_inferred = 1 *)
+        (* rd_data_width = RD_DATA_WIDTH *)
+        (* wr_data_width = WR_DATA_WIDTH *)
+        TDP36K BRAM_BLK (
+          .RESET_ni(1'b1),
+        
+          .WDATA_A1_i(PORT_A_WDATA[17:0]),
+          .RDATA_A1_o(),
+          .ADDR_A1_i(WR_ADDR_SHIFTED),
+          .CLK_A1_i(WR_CLK_i),
+          .REN_A1_i(1'b0),
+          .WEN_A1_i(WEN_i),
+          .BE_A1_i(WR_BE[1:0]),
+        
+          .WDATA_B1_i(18'h0),
+          .RDATA_B1_o(PORT_B1_RDATA[17:0]),
+          .ADDR_B1_i(RD_ADDR_SHIFTED),
+          .CLK_B1_i(RD_CLK_i),
+          .REN_B1_i(REN_i),
+          .WEN_B1_i(1'b0),
+          .BE_B1_i({REN_i,REN_i}),
+        
+          .WDATA_A2_i(PORT_A_WDATA[35:18]),
+          .RDATA_A2_o(),
+          .ADDR_A2_i(WR_ADDR_SHIFTED),
+          .CLK_A2_i(WR_CLK_i),
+          .REN_A2_i(1'b0),
+          .WEN_A2_i(WEN_i),
+          .BE_A2_i(WR_BE[3:2]),
+        
+          .WDATA_B2_i(18'h0),
+          .RDATA_B2_o(PORT_B2_RDATA[17:0]),
+          .ADDR_B2_i(RD_ADDR_SHIFTED),
+          .CLK_B2_i(RD_CLK_i),
+          .REN_B2_i(REN_i),
+          .WEN_B2_i(1'b0),
+          .BE_B2_i({REN_i,REN_i}),
+        
+          .FLUSH1_i(FLUSH1),
+          .FLUSH2_i(FLUSH2)
+        );        
+			end
+			32, 36: begin
+				defparam BRAM_BLK.MODE_BITS = { 1'b0,
+					11'd10, 11'd10, 4'd0, MODE_18, MODE_36, MODE_18, MODE_36, 1'd0,
+					12'd10, 12'd10, 4'd0, MODE_18, MODE_36, MODE_18, MODE_36, 1'd0
+				};
+        (* is_inferred = 1 *)
+        (* rd_data_width = RD_DATA_WIDTH *)
+        (* wr_data_width = WR_DATA_WIDTH *)
+        TDP36K BRAM_BLK (
+          .RESET_ni(1'b1),
+        
+          .WDATA_A1_i(PORT_A_WDATA[17:0]),
+          .RDATA_A1_o(),
+          .ADDR_A1_i(WR_ADDR_SHIFTED),
+          .CLK_A1_i(WR_CLK_i),
+          .REN_A1_i(1'b0),
+          .WEN_A1_i(WEN_i),
+          .BE_A1_i(WR_BE[1:0]),
+        
+          .WDATA_B1_i(18'h0),
+          .RDATA_B1_o(PORT_B1_RDATA[17:0]),
+          .ADDR_B1_i(RD_ADDR_SHIFTED),
+          .CLK_B1_i(RD_CLK_i),
+          .REN_B1_i(REN_i),
+          .WEN_B1_i(1'b0),
+          .BE_B1_i({REN_i,REN_i}),
+        
+          .WDATA_A2_i(PORT_A_WDATA[35:18]),
+          .RDATA_A2_o(),
+          .ADDR_A2_i(WR_ADDR_SHIFTED),
+          .CLK_A2_i(WR_CLK_i),
+          .REN_A2_i(1'b0),
+          .WEN_A2_i(WEN_i),
+          .BE_A2_i(WR_BE[3:2]),
+        
+          .WDATA_B2_i(18'h0),
+          .RDATA_B2_o(PORT_B2_RDATA[17:0]),
+          .ADDR_B2_i(RD_ADDR_SHIFTED),
+          .CLK_B2_i(RD_CLK_i),
+          .REN_B2_i(REN_i),
+          .WEN_B2_i(1'b0),
+          .BE_B2_i({REN_i,REN_i}),
+        
+          .FLUSH1_i(FLUSH1),
+          .FLUSH2_i(FLUSH2)
+        );        
+			end
+			default: begin
+				defparam BRAM_BLK.MODE_BITS = { 1'b0,
+					11'd10, 11'd10, 4'd0, MODE_18, MODE_1, MODE_18, MODE_1, 1'd0,
+					12'd10, 12'd10, 4'd0, MODE_18, MODE_1, MODE_18, MODE_1, 1'd0
+				};
+        (* is_inferred = 1 *)
+        (* rd_data_width = RD_DATA_WIDTH *)
+        (* wr_data_width = WR_DATA_WIDTH *)
+        TDP36K BRAM_BLK (
+          .RESET_ni(1'b1),
+        
+          .WDATA_A1_i(PORT_A_WDATA[17:0]),
+          .RDATA_A1_o(),
+          .ADDR_A1_i(WR_ADDR_SHIFTED),
+          .CLK_A1_i(WR_CLK_i),
+          .REN_A1_i(1'b0),
+          .WEN_A1_i(WEN_i),
+          .BE_A1_i(WR_BE[1:0]),
+        
+          .WDATA_B1_i(18'h0),
+          .RDATA_B1_o(PORT_B1_RDATA[17:0]),
+          .ADDR_B1_i(RD_ADDR_SHIFTED),
+          .CLK_B1_i(RD_CLK_i),
+          .REN_B1_i(REN_i),
+          .WEN_B1_i(1'b0),
+          .BE_B1_i({REN_i,REN_i}),
+        
+          .WDATA_A2_i(PORT_A_WDATA[35:18]),
+          .RDATA_A2_o(),
+          .ADDR_A2_i(WR_ADDR_SHIFTED),
+          .CLK_A2_i(WR_CLK_i),
+          .REN_A2_i(1'b0),
+          .WEN_A2_i(WEN_i),
+          .BE_A2_i(WR_BE[3:2]),
+        
+          .WDATA_B2_i(18'h0),
+          .RDATA_B2_o(PORT_B2_RDATA[17:0]),
+          .ADDR_B2_i(RD_ADDR_SHIFTED),
+          .CLK_B2_i(RD_CLK_i),
+          .REN_B2_i(REN_i),
+          .WEN_B2_i(1'b0),
+          .BE_B2_i({REN_i,REN_i}),
+        
+          .FLUSH1_i(FLUSH1),
+          .FLUSH2_i(FLUSH2)
+        );        
+			end
+		endcase
+	end
+	32, 36: begin
+		case (WR_DATA_WIDTH)
+			1: begin
+				defparam BRAM_BLK.MODE_BITS = { 1'b0,
+					11'd10, 11'd10, 4'd0, MODE_36, MODE_1, MODE_36, MODE_1, 1'd0,
+					12'd10, 12'd10, 4'd0, MODE_36, MODE_1, MODE_36, MODE_1, 1'd0
+				};
+        (* is_inferred = 1 *)
+        (* rd_data_width = RD_DATA_WIDTH *)
+        (* wr_data_width = WR_DATA_WIDTH *)
+        TDP36K BRAM_BLK (
+          .RESET_ni(1'b1),
+        
+          .WDATA_A1_i(PORT_A_WDATA[17:0]),
+          .RDATA_A1_o(),
+          .ADDR_A1_i(WR_ADDR_SHIFTED),
+          .CLK_A1_i(WR_CLK_i),
+          .REN_A1_i(1'b0),
+          .WEN_A1_i(WEN_i),
+          .BE_A1_i(WR_BE[1:0]),
+        
+          .WDATA_B1_i(18'h0),
+          .RDATA_B1_o(PORT_B1_RDATA[17:0]),
+          .ADDR_B1_i(RD_ADDR_SHIFTED),
+          .CLK_B1_i(RD_CLK_i),
+          .REN_B1_i(REN_i),
+          .WEN_B1_i(1'b0),
+          .BE_B1_i({REN_i,REN_i}),
+        
+          .WDATA_A2_i(PORT_A_WDATA[35:18]),
+          .RDATA_A2_o(),
+          .ADDR_A2_i(WR_ADDR_SHIFTED),
+          .CLK_A2_i(WR_CLK_i),
+          .REN_A2_i(1'b0),
+          .WEN_A2_i(WEN_i),
+          .BE_A2_i(WR_BE[3:2]),
+        
+          .WDATA_B2_i(18'h0),
+          .RDATA_B2_o(PORT_B2_RDATA[17:0]),
+          .ADDR_B2_i(RD_ADDR_SHIFTED),
+          .CLK_B2_i(RD_CLK_i),
+          .REN_B2_i(REN_i),
+          .WEN_B2_i(1'b0),
+          .BE_B2_i({REN_i,REN_i}),
+        
+          .FLUSH1_i(FLUSH1),
+          .FLUSH2_i(FLUSH2)
+        );        
+			end
+			2: begin
+				defparam BRAM_BLK.MODE_BITS = { 1'b0,
+					11'd10, 11'd10, 4'd0, MODE_36, MODE_2, MODE_36, MODE_2, 1'd0,
+					12'd10, 12'd10, 4'd0, MODE_36, MODE_2, MODE_36, MODE_2, 1'd0
+				};
+        (* is_inferred = 1 *)
+        (* rd_data_width = RD_DATA_WIDTH *)
+        (* wr_data_width = WR_DATA_WIDTH *)
+        TDP36K BRAM_BLK (
+          .RESET_ni(1'b1),
+        
+          .WDATA_A1_i(PORT_A_WDATA[17:0]),
+          .RDATA_A1_o(),
+          .ADDR_A1_i(WR_ADDR_SHIFTED),
+          .CLK_A1_i(WR_CLK_i),
+          .REN_A1_i(1'b0),
+          .WEN_A1_i(WEN_i),
+          .BE_A1_i(WR_BE[1:0]),
+        
+          .WDATA_B1_i(18'h0),
+          .RDATA_B1_o(PORT_B1_RDATA[17:0]),
+          .ADDR_B1_i(RD_ADDR_SHIFTED),
+          .CLK_B1_i(RD_CLK_i),
+          .REN_B1_i(REN_i),
+          .WEN_B1_i(1'b0),
+          .BE_B1_i({REN_i,REN_i}),
+        
+          .WDATA_A2_i(PORT_A_WDATA[35:18]),
+          .RDATA_A2_o(),
+          .ADDR_A2_i(WR_ADDR_SHIFTED),
+          .CLK_A2_i(WR_CLK_i),
+          .REN_A2_i(1'b0),
+          .WEN_A2_i(WEN_i),
+          .BE_A2_i(WR_BE[3:2]),
+        
+          .WDATA_B2_i(18'h0),
+          .RDATA_B2_o(PORT_B2_RDATA[17:0]),
+          .ADDR_B2_i(RD_ADDR_SHIFTED),
+          .CLK_B2_i(RD_CLK_i),
+          .REN_B2_i(REN_i),
+          .WEN_B2_i(1'b0),
+          .BE_B2_i({REN_i,REN_i}),
+        
+          .FLUSH1_i(FLUSH1),
+          .FLUSH2_i(FLUSH2)
+        );        
+			end
+			4: begin
+				defparam BRAM_BLK.MODE_BITS = { 1'b0,
+					11'd10, 11'd10, 4'd0, MODE_36, MODE_4, MODE_36, MODE_4, 1'd0,
+					12'd10, 12'd10, 4'd0, MODE_36, MODE_4, MODE_36, MODE_4, 1'd0
+				};
+        (* is_inferred = 1 *)
+        (* rd_data_width = RD_DATA_WIDTH *)
+        (* wr_data_width = WR_DATA_WIDTH *)
+        TDP36K BRAM_BLK (
+          .RESET_ni(1'b1),
+        
+          .WDATA_A1_i(PORT_A_WDATA[17:0]),
+          .RDATA_A1_o(),
+          .ADDR_A1_i(WR_ADDR_SHIFTED),
+          .CLK_A1_i(WR_CLK_i),
+          .REN_A1_i(1'b0),
+          .WEN_A1_i(WEN_i),
+          .BE_A1_i(WR_BE[1:0]),
+        
+          .WDATA_B1_i(18'h0),
+          .RDATA_B1_o(PORT_B1_RDATA[17:0]),
+          .ADDR_B1_i(RD_ADDR_SHIFTED),
+          .CLK_B1_i(RD_CLK_i),
+          .REN_B1_i(REN_i),
+          .WEN_B1_i(1'b0),
+          .BE_B1_i({REN_i,REN_i}),
+        
+          .WDATA_A2_i(PORT_A_WDATA[35:18]),
+          .RDATA_A2_o(),
+          .ADDR_A2_i(WR_ADDR_SHIFTED),
+          .CLK_A2_i(WR_CLK_i),
+          .REN_A2_i(1'b0),
+          .WEN_A2_i(WEN_i),
+          .BE_A2_i(WR_BE[3:2]),
+        
+          .WDATA_B2_i(18'h0),
+          .RDATA_B2_o(PORT_B2_RDATA[17:0]),
+          .ADDR_B2_i(RD_ADDR_SHIFTED),
+          .CLK_B2_i(RD_CLK_i),
+          .REN_B2_i(REN_i),
+          .WEN_B2_i(1'b0),
+          .BE_B2_i({REN_i,REN_i}),
+        
+          .FLUSH1_i(FLUSH1),
+          .FLUSH2_i(FLUSH2)
+        );        
+			end
+			8, 9: begin
+				defparam BRAM_BLK.MODE_BITS = { 1'b0,
+					11'd10, 11'd10, 4'd0, MODE_36, MODE_9, MODE_36, MODE_9, 1'd0,
+					12'd10, 12'd10, 4'd0, MODE_36, MODE_9, MODE_36, MODE_9, 1'd0
+				};
+        (* is_inferred = 1 *)
+        (* rd_data_width = RD_DATA_WIDTH *)
+        (* wr_data_width = WR_DATA_WIDTH *)
+        TDP36K BRAM_BLK (
+          .RESET_ni(1'b1),
+        
+          .WDATA_A1_i(PORT_A_WDATA[17:0]),
+          .RDATA_A1_o(),
+          .ADDR_A1_i(WR_ADDR_SHIFTED),
+          .CLK_A1_i(WR_CLK_i),
+          .REN_A1_i(1'b0),
+          .WEN_A1_i(WEN_i),
+          .BE_A1_i(WR_BE[1:0]),
+        
+          .WDATA_B1_i(18'h0),
+          .RDATA_B1_o(PORT_B1_RDATA[17:0]),
+          .ADDR_B1_i(RD_ADDR_SHIFTED),
+          .CLK_B1_i(RD_CLK_i),
+          .REN_B1_i(REN_i),
+          .WEN_B1_i(1'b0),
+          .BE_B1_i({REN_i,REN_i}),
+        
+          .WDATA_A2_i(PORT_A_WDATA[35:18]),
+          .RDATA_A2_o(),
+          .ADDR_A2_i(WR_ADDR_SHIFTED),
+          .CLK_A2_i(WR_CLK_i),
+          .REN_A2_i(1'b0),
+          .WEN_A2_i(WEN_i),
+          .BE_A2_i(WR_BE[3:2]),
+        
+          .WDATA_B2_i(18'h0),
+          .RDATA_B2_o(PORT_B2_RDATA[17:0]),
+          .ADDR_B2_i(RD_ADDR_SHIFTED),
+          .CLK_B2_i(RD_CLK_i),
+          .REN_B2_i(REN_i),
+          .WEN_B2_i(1'b0),
+          .BE_B2_i({REN_i,REN_i}),
+        
+          .FLUSH1_i(FLUSH1),
+          .FLUSH2_i(FLUSH2)
+        );        
+			end
+			16, 18: begin
+				defparam BRAM_BLK.MODE_BITS = { 1'b0,
+					11'd10, 11'd10, 4'd0, MODE_36, MODE_18, MODE_36, MODE_18, 1'd0,
+					12'd10, 12'd10, 4'd0, MODE_36, MODE_18, MODE_36, MODE_18, 1'd0
+				};
+        (* is_inferred = 1 *)
+        (* rd_data_width = RD_DATA_WIDTH *)
+        (* wr_data_width = WR_DATA_WIDTH *)
+        TDP36K BRAM_BLK (
+          .RESET_ni(1'b1),
+        
+          .WDATA_A1_i(PORT_A_WDATA[17:0]),
+          .RDATA_A1_o(),
+          .ADDR_A1_i(WR_ADDR_SHIFTED),
+          .CLK_A1_i(WR_CLK_i),
+          .REN_A1_i(1'b0),
+          .WEN_A1_i(WEN_i),
+          .BE_A1_i(WR_BE[1:0]),
+        
+          .WDATA_B1_i(18'h0),
+          .RDATA_B1_o(PORT_B1_RDATA[17:0]),
+          .ADDR_B1_i(RD_ADDR_SHIFTED),
+          .CLK_B1_i(RD_CLK_i),
+          .REN_B1_i(REN_i),
+          .WEN_B1_i(1'b0),
+          .BE_B1_i({REN_i,REN_i}),
+        
+          .WDATA_A2_i(PORT_A_WDATA[35:18]),
+          .RDATA_A2_o(),
+          .ADDR_A2_i(WR_ADDR_SHIFTED),
+          .CLK_A2_i(WR_CLK_i),
+          .REN_A2_i(1'b0),
+          .WEN_A2_i(WEN_i),
+          .BE_A2_i(WR_BE[3:2]),
+        
+          .WDATA_B2_i(18'h0),
+          .RDATA_B2_o(PORT_B2_RDATA[17:0]),
+          .ADDR_B2_i(RD_ADDR_SHIFTED),
+          .CLK_B2_i(RD_CLK_i),
+          .REN_B2_i(REN_i),
+          .WEN_B2_i(1'b0),
+          .BE_B2_i({REN_i,REN_i}),
+        
+          .FLUSH1_i(FLUSH1),
+          .FLUSH2_i(FLUSH2)
+        );        
+			end
+			32, 36: begin
+				defparam BRAM_BLK.MODE_BITS = { 1'b0,
+					11'd10, 11'd10, 4'd0, MODE_36, MODE_36, MODE_36, MODE_36, 1'd0,
+					12'd10, 12'd10, 4'd0, MODE_36, MODE_36, MODE_36, MODE_36, 1'd0
+				};
+        (* is_inferred = 1 *)
+        (* rd_data_width = RD_DATA_WIDTH *)
+        (* wr_data_width = WR_DATA_WIDTH *)
+        TDP36K BRAM_BLK (
+          .RESET_ni(1'b1),
+        
+          .WDATA_A1_i(PORT_A_WDATA[17:0]),
+          .RDATA_A1_o(),
+          .ADDR_A1_i(WR_ADDR_SHIFTED),
+          .CLK_A1_i(WR_CLK_i),
+          .REN_A1_i(1'b0),
+          .WEN_A1_i(WEN_i),
+          .BE_A1_i(WR_BE[1:0]),
+        
+          .WDATA_B1_i(18'h0),
+          .RDATA_B1_o(PORT_B1_RDATA[17:0]),
+          .ADDR_B1_i(RD_ADDR_SHIFTED),
+          .CLK_B1_i(RD_CLK_i),
+          .REN_B1_i(REN_i),
+          .WEN_B1_i(1'b0),
+          .BE_B1_i({REN_i,REN_i}),
+        
+          .WDATA_A2_i(PORT_A_WDATA[35:18]),
+          .RDATA_A2_o(),
+          .ADDR_A2_i(WR_ADDR_SHIFTED),
+          .CLK_A2_i(WR_CLK_i),
+          .REN_A2_i(1'b0),
+          .WEN_A2_i(WEN_i),
+          .BE_A2_i(WR_BE[3:2]),
+        
+          .WDATA_B2_i(18'h0),
+          .RDATA_B2_o(PORT_B2_RDATA[17:0]),
+          .ADDR_B2_i(RD_ADDR_SHIFTED),
+          .CLK_B2_i(RD_CLK_i),
+          .REN_B2_i(REN_i),
+          .WEN_B2_i(1'b0),
+          .BE_B2_i({REN_i,REN_i}),
+        
+          .FLUSH1_i(FLUSH1),
+          .FLUSH2_i(FLUSH2)
+        );        
+			end
+			default: begin
+				defparam BRAM_BLK.MODE_BITS = { 1'b0,
+					11'd10, 11'd10, 4'd0, MODE_36, MODE_1, MODE_36, MODE_1, 1'd0,
+					12'd10, 12'd10, 4'd0, MODE_36, MODE_1, MODE_36, MODE_1, 1'd0
+				};
+        (* is_inferred = 1 *)
+        (* rd_data_width = RD_DATA_WIDTH *)
+        (* wr_data_width = WR_DATA_WIDTH *)
+        TDP36K BRAM_BLK (
+          .RESET_ni(1'b1),
+        
+          .WDATA_A1_i(PORT_A_WDATA[17:0]),
+          .RDATA_A1_o(),
+          .ADDR_A1_i(WR_ADDR_SHIFTED),
+          .CLK_A1_i(WR_CLK_i),
+          .REN_A1_i(1'b0),
+          .WEN_A1_i(WEN_i),
+          .BE_A1_i(WR_BE[1:0]),
+        
+          .WDATA_B1_i(18'h0),
+          .RDATA_B1_o(PORT_B1_RDATA[17:0]),
+          .ADDR_B1_i(RD_ADDR_SHIFTED),
+          .CLK_B1_i(RD_CLK_i),
+          .REN_B1_i(REN_i),
+          .WEN_B1_i(1'b0),
+          .BE_B1_i({REN_i,REN_i}),
+        
+          .WDATA_A2_i(PORT_A_WDATA[35:18]),
+          .RDATA_A2_o(),
+          .ADDR_A2_i(WR_ADDR_SHIFTED),
+          .CLK_A2_i(WR_CLK_i),
+          .REN_A2_i(1'b0),
+          .WEN_A2_i(WEN_i),
+          .BE_A2_i(WR_BE[3:2]),
+        
+          .WDATA_B2_i(18'h0),
+          .RDATA_B2_o(PORT_B2_RDATA[17:0]),
+          .ADDR_B2_i(RD_ADDR_SHIFTED),
+          .CLK_B2_i(RD_CLK_i),
+          .REN_B2_i(REN_i),
+          .WEN_B2_i(1'b0),
+          .BE_B2_i({REN_i,REN_i}),
+        
+          .FLUSH1_i(FLUSH1),
+          .FLUSH2_i(FLUSH2)
+        );        
+			end
+		endcase
+	end
+	default: begin
+		case (WR_DATA_WIDTH)
+			1: begin
+				defparam BRAM_BLK.MODE_BITS = { 1'b0,
+					11'd10, 11'd10, 4'd0, MODE_1, MODE_1, MODE_1, MODE_1, 1'd0,
+					12'd10, 12'd10, 4'd0, MODE_1, MODE_1, MODE_1, MODE_1, 1'd0
+				};
+        (* is_inferred = 1 *)
+        (* rd_data_width = RD_DATA_WIDTH *)
+        (* wr_data_width = WR_DATA_WIDTH *)
+        TDP36K BRAM_BLK (
+          .RESET_ni(1'b1),
+        
+          .WDATA_A1_i(PORT_A_WDATA[17:0]),
+          .RDATA_A1_o(),
+          .ADDR_A1_i(WR_ADDR_SHIFTED),
+          .CLK_A1_i(WR_CLK_i),
+          .REN_A1_i(1'b0),
+          .WEN_A1_i(WEN_i),
+          .BE_A1_i(WR_BE[1:0]),
+        
+          .WDATA_B1_i(18'h0),
+          .RDATA_B1_o(PORT_B1_RDATA[17:0]),
+          .ADDR_B1_i(RD_ADDR_SHIFTED),
+          .CLK_B1_i(RD_CLK_i),
+          .REN_B1_i(REN_i),
+          .WEN_B1_i(1'b0),
+          .BE_B1_i({REN_i,REN_i}),
+        
+          .WDATA_A2_i(PORT_A_WDATA[35:18]),
+          .RDATA_A2_o(),
+          .ADDR_A2_i(WR_ADDR_SHIFTED),
+          .CLK_A2_i(WR_CLK_i),
+          .REN_A2_i(1'b0),
+          .WEN_A2_i(WEN_i),
+          .BE_A2_i(WR_BE[3:2]),
+        
+          .WDATA_B2_i(18'h0),
+          .RDATA_B2_o(PORT_B2_RDATA[17:0]),
+          .ADDR_B2_i(RD_ADDR_SHIFTED),
+          .CLK_B2_i(RD_CLK_i),
+          .REN_B2_i(REN_i),
+          .WEN_B2_i(1'b0),
+          .BE_B2_i({REN_i,REN_i}),
+        
+          .FLUSH1_i(FLUSH1),
+          .FLUSH2_i(FLUSH2)
+        );        
+			end
+			2: begin
+				defparam BRAM_BLK.MODE_BITS = { 1'b0,
+					11'd10, 11'd10, 4'd0, MODE_1, MODE_2, MODE_1, MODE_2, 1'd0,
+					12'd10, 12'd10, 4'd0, MODE_1, MODE_2, MODE_1, MODE_2, 1'd0
+				};
+        (* is_inferred = 1 *)
+        (* rd_data_width = RD_DATA_WIDTH *)
+        (* wr_data_width = WR_DATA_WIDTH *)
+        TDP36K BRAM_BLK (
+          .RESET_ni(1'b1),
+        
+          .WDATA_A1_i(PORT_A_WDATA[17:0]),
+          .RDATA_A1_o(),
+          .ADDR_A1_i(WR_ADDR_SHIFTED),
+          .CLK_A1_i(WR_CLK_i),
+          .REN_A1_i(1'b0),
+          .WEN_A1_i(WEN_i),
+          .BE_A1_i(WR_BE[1:0]),
+        
+          .WDATA_B1_i(18'h0),
+          .RDATA_B1_o(PORT_B1_RDATA[17:0]),
+          .ADDR_B1_i(RD_ADDR_SHIFTED),
+          .CLK_B1_i(RD_CLK_i),
+          .REN_B1_i(REN_i),
+          .WEN_B1_i(1'b0),
+          .BE_B1_i({REN_i,REN_i}),
+        
+          .WDATA_A2_i(PORT_A_WDATA[35:18]),
+          .RDATA_A2_o(),
+          .ADDR_A2_i(WR_ADDR_SHIFTED),
+          .CLK_A2_i(WR_CLK_i),
+          .REN_A2_i(1'b0),
+          .WEN_A2_i(WEN_i),
+          .BE_A2_i(WR_BE[3:2]),
+        
+          .WDATA_B2_i(18'h0),
+          .RDATA_B2_o(PORT_B2_RDATA[17:0]),
+          .ADDR_B2_i(RD_ADDR_SHIFTED),
+          .CLK_B2_i(RD_CLK_i),
+          .REN_B2_i(REN_i),
+          .WEN_B2_i(1'b0),
+          .BE_B2_i({REN_i,REN_i}),
+        
+          .FLUSH1_i(FLUSH1),
+          .FLUSH2_i(FLUSH2)
+        );        
+			end
+			4: begin
+				defparam BRAM_BLK.MODE_BITS = { 1'b0,
+					11'd10, 11'd10, 4'd0, MODE_1, MODE_4, MODE_1, MODE_4, 1'd0,
+					12'd10, 12'd10, 4'd0, MODE_1, MODE_4, MODE_1, MODE_4, 1'd0
+				};
+        (* is_inferred = 1 *)
+        (* rd_data_width = RD_DATA_WIDTH *)
+        (* wr_data_width = WR_DATA_WIDTH *)
+        TDP36K BRAM_BLK (
+          .RESET_ni(1'b1),
+        
+          .WDATA_A1_i(PORT_A_WDATA[17:0]),
+          .RDATA_A1_o(),
+          .ADDR_A1_i(WR_ADDR_SHIFTED),
+          .CLK_A1_i(WR_CLK_i),
+          .REN_A1_i(1'b0),
+          .WEN_A1_i(WEN_i),
+          .BE_A1_i(WR_BE[1:0]),
+        
+          .WDATA_B1_i(18'h0),
+          .RDATA_B1_o(PORT_B1_RDATA[17:0]),
+          .ADDR_B1_i(RD_ADDR_SHIFTED),
+          .CLK_B1_i(RD_CLK_i),
+          .REN_B1_i(REN_i),
+          .WEN_B1_i(1'b0),
+          .BE_B1_i({REN_i,REN_i}),
+        
+          .WDATA_A2_i(PORT_A_WDATA[35:18]),
+          .RDATA_A2_o(),
+          .ADDR_A2_i(WR_ADDR_SHIFTED),
+          .CLK_A2_i(WR_CLK_i),
+          .REN_A2_i(1'b0),
+          .WEN_A2_i(WEN_i),
+          .BE_A2_i(WR_BE[3:2]),
+        
+          .WDATA_B2_i(18'h0),
+          .RDATA_B2_o(PORT_B2_RDATA[17:0]),
+          .ADDR_B2_i(RD_ADDR_SHIFTED),
+          .CLK_B2_i(RD_CLK_i),
+          .REN_B2_i(REN_i),
+          .WEN_B2_i(1'b0),
+          .BE_B2_i({REN_i,REN_i}),
+        
+          .FLUSH1_i(FLUSH1),
+          .FLUSH2_i(FLUSH2)
+        );        
+			end
+			8, 9: begin
+				defparam BRAM_BLK.MODE_BITS = { 1'b0,
+					11'd10, 11'd10, 4'd0, MODE_1, MODE_9, MODE_1, MODE_9, 1'd0,
+					12'd10, 12'd10, 4'd0, MODE_1, MODE_9, MODE_1, MODE_9, 1'd0
+				};
+        (* is_inferred = 1 *)
+        (* rd_data_width = RD_DATA_WIDTH *)
+        (* wr_data_width = WR_DATA_WIDTH *)
+        TDP36K BRAM_BLK (
+          .RESET_ni(1'b1),
+        
+          .WDATA_A1_i(PORT_A_WDATA[17:0]),
+          .RDATA_A1_o(),
+          .ADDR_A1_i(WR_ADDR_SHIFTED),
+          .CLK_A1_i(WR_CLK_i),
+          .REN_A1_i(1'b0),
+          .WEN_A1_i(WEN_i),
+          .BE_A1_i(WR_BE[1:0]),
+        
+          .WDATA_B1_i(18'h0),
+          .RDATA_B1_o(PORT_B1_RDATA[17:0]),
+          .ADDR_B1_i(RD_ADDR_SHIFTED),
+          .CLK_B1_i(RD_CLK_i),
+          .REN_B1_i(REN_i),
+          .WEN_B1_i(1'b0),
+          .BE_B1_i({REN_i,REN_i}),
+        
+          .WDATA_A2_i(PORT_A_WDATA[35:18]),
+          .RDATA_A2_o(),
+          .ADDR_A2_i(WR_ADDR_SHIFTED),
+          .CLK_A2_i(WR_CLK_i),
+          .REN_A2_i(1'b0),
+          .WEN_A2_i(WEN_i),
+          .BE_A2_i(WR_BE[3:2]),
+        
+          .WDATA_B2_i(18'h0),
+          .RDATA_B2_o(PORT_B2_RDATA[17:0]),
+          .ADDR_B2_i(RD_ADDR_SHIFTED),
+          .CLK_B2_i(RD_CLK_i),
+          .REN_B2_i(REN_i),
+          .WEN_B2_i(1'b0),
+          .BE_B2_i({REN_i,REN_i}),
+        
+          .FLUSH1_i(FLUSH1),
+          .FLUSH2_i(FLUSH2)
+        );       
+			end
+			16, 18: begin
+				defparam BRAM_BLK.MODE_BITS = { 1'b0,
+					11'd10, 11'd10, 4'd0, MODE_1, MODE_18, MODE_1, MODE_18, 1'd0,
+					12'd10, 12'd10, 4'd0, MODE_1, MODE_18, MODE_1, MODE_18, 1'd0
+				};
+        (* is_inferred = 1 *)
+        (* rd_data_width = RD_DATA_WIDTH *)
+        (* wr_data_width = WR_DATA_WIDTH *)
+        TDP36K BRAM_BLK (
+          .RESET_ni(1'b1),
+        
+          .WDATA_A1_i(PORT_A_WDATA[17:0]),
+          .RDATA_A1_o(),
+          .ADDR_A1_i(WR_ADDR_SHIFTED),
+          .CLK_A1_i(WR_CLK_i),
+          .REN_A1_i(1'b0),
+          .WEN_A1_i(WEN_i),
+          .BE_A1_i(WR_BE[1:0]),
+        
+          .WDATA_B1_i(18'h0),
+          .RDATA_B1_o(PORT_B1_RDATA[17:0]),
+          .ADDR_B1_i(RD_ADDR_SHIFTED),
+          .CLK_B1_i(RD_CLK_i),
+          .REN_B1_i(REN_i),
+          .WEN_B1_i(1'b0),
+          .BE_B1_i({REN_i,REN_i}),
+        
+          .WDATA_A2_i(PORT_A_WDATA[35:18]),
+          .RDATA_A2_o(),
+          .ADDR_A2_i(WR_ADDR_SHIFTED),
+          .CLK_A2_i(WR_CLK_i),
+          .REN_A2_i(1'b0),
+          .WEN_A2_i(WEN_i),
+          .BE_A2_i(WR_BE[3:2]),
+        
+          .WDATA_B2_i(18'h0),
+          .RDATA_B2_o(PORT_B2_RDATA[17:0]),
+          .ADDR_B2_i(RD_ADDR_SHIFTED),
+          .CLK_B2_i(RD_CLK_i),
+          .REN_B2_i(REN_i),
+          .WEN_B2_i(1'b0),
+          .BE_B2_i({REN_i,REN_i}),
+        
+          .FLUSH1_i(FLUSH1),
+          .FLUSH2_i(FLUSH2)
+        );       
+			end
+			32, 36: begin
+				defparam BRAM_BLK.MODE_BITS = { 1'b0,
+					11'd10, 11'd10, 4'd0, MODE_1, MODE_36, MODE_1, MODE_36, 1'd0,
+					12'd10, 12'd10, 4'd0, MODE_1, MODE_36, MODE_1, MODE_36, 1'd0
+				};
+        (* is_inferred = 1 *)
+        (* rd_data_width = RD_DATA_WIDTH *)
+        (* wr_data_width = WR_DATA_WIDTH *)
+        TDP36K BRAM_BLK (
+          .RESET_ni(1'b1),
+        
+          .WDATA_A1_i(PORT_A_WDATA[17:0]),
+          .RDATA_A1_o(),
+          .ADDR_A1_i(WR_ADDR_SHIFTED),
+          .CLK_A1_i(WR_CLK_i),
+          .REN_A1_i(1'b0),
+          .WEN_A1_i(WEN_i),
+          .BE_A1_i(WR_BE[1:0]),
+        
+          .WDATA_B1_i(18'h0),
+          .RDATA_B1_o(PORT_B1_RDATA[17:0]),
+          .ADDR_B1_i(RD_ADDR_SHIFTED),
+          .CLK_B1_i(RD_CLK_i),
+          .REN_B1_i(REN_i),
+          .WEN_B1_i(1'b0),
+          .BE_B1_i({REN_i,REN_i}),
+        
+          .WDATA_A2_i(PORT_A_WDATA[35:18]),
+          .RDATA_A2_o(),
+          .ADDR_A2_i(WR_ADDR_SHIFTED),
+          .CLK_A2_i(WR_CLK_i),
+          .REN_A2_i(1'b0),
+          .WEN_A2_i(WEN_i),
+          .BE_A2_i(WR_BE[3:2]),
+        
+          .WDATA_B2_i(18'h0),
+          .RDATA_B2_o(PORT_B2_RDATA[17:0]),
+          .ADDR_B2_i(RD_ADDR_SHIFTED),
+          .CLK_B2_i(RD_CLK_i),
+          .REN_B2_i(REN_i),
+          .WEN_B2_i(1'b0),
+          .BE_B2_i({REN_i,REN_i}),
+        
+          .FLUSH1_i(FLUSH1),
+          .FLUSH2_i(FLUSH2)
+        );        
+			end
+			default: begin
+				defparam BRAM_BLK.MODE_BITS = { 1'b0,
+					11'd10, 11'd10, 4'd0, MODE_1, MODE_1, MODE_1, MODE_1, 1'd0,
+					12'd10, 12'd10, 4'd0, MODE_1, MODE_1, MODE_1, MODE_1, 1'd0
+				};
+        (* is_inferred = 1 *)
+        (* rd_data_width = RD_DATA_WIDTH *)
+        (* wr_data_width = WR_DATA_WIDTH *)
+        TDP36K BRAM_BLK (
+          .RESET_ni(1'b1),
+        
+          .WDATA_A1_i(PORT_A_WDATA[17:0]),
+          .RDATA_A1_o(),
+          .ADDR_A1_i(WR_ADDR_SHIFTED),
+          .CLK_A1_i(WR_CLK_i),
+          .REN_A1_i(1'b0),
+          .WEN_A1_i(WEN_i),
+          .BE_A1_i(WR_BE[1:0]),
+        
+          .WDATA_B1_i(18'h0),
+          .RDATA_B1_o(PORT_B1_RDATA[17:0]),
+          .ADDR_B1_i(RD_ADDR_SHIFTED),
+          .CLK_B1_i(RD_CLK_i),
+          .REN_B1_i(REN_i),
+          .WEN_B1_i(1'b0),
+          .BE_B1_i({REN_i,REN_i}),
+        
+          .WDATA_A2_i(PORT_A_WDATA[35:18]),
+          .RDATA_A2_o(),
+          .ADDR_A2_i(WR_ADDR_SHIFTED),
+          .CLK_A2_i(WR_CLK_i),
+          .REN_A2_i(1'b0),
+          .WEN_A2_i(WEN_i),
+          .BE_A2_i(WR_BE[3:2]),
+        
+          .WDATA_B2_i(18'h0),
+          .RDATA_B2_o(PORT_B2_RDATA[17:0]),
+          .ADDR_B2_i(RD_ADDR_SHIFTED),
+          .CLK_B2_i(RD_CLK_i),
+          .REN_B2_i(REN_i),
+          .WEN_B2_i(1'b0),
+          .BE_B2_i({REN_i,REN_i}),
+        
+          .FLUSH1_i(FLUSH1),
+          .FLUSH2_i(FLUSH2)
+        );        
+			end
+		endcase
+	end
+endcase
+
+endmodule
+
+module BRAM2x18_DP (A1ADDR, A1DATA, A1EN, B1ADDR, B1DATA, B1EN, C1ADDR, C1DATA, C1EN, CLK1, CLK2, CLK3, CLK4, D1ADDR, D1DATA, D1EN, E1ADDR, E1DATA, E1EN, F1ADDR, F1DATA, F1EN, G1ADDR, G1DATA, G1EN, H1ADDR, H1DATA, H1EN);
+	parameter CFG_ABITS = 11;
+	parameter CFG_DBITS = 18;
+	parameter CFG_ENABLE_B = 4;
+	parameter CFG_ENABLE_D = 4;
+	parameter CFG_ENABLE_F = 4;
+	parameter CFG_ENABLE_H = 4;
+
+	parameter CLKPOL2 = 1;
+	parameter CLKPOL3 = 1;
+	parameter [18431:0] INIT0 = 18432'bx;
+	parameter [18431:0] INIT1 = 18432'bx;
+  
+  localparam MODE_36 = 3'b011; // 36- or 32-bit
+  localparam MODE_18 = 3'b010; // 18- or 16-bit
+  localparam MODE_9 = 3'b001; // 9- or 8-bit
+  localparam MODE_4 = 3'b100; // 4-bit
+  localparam MODE_2 = 3'b110; // 2-bit
+  localparam MODE_1 = 3'b101; // 1-bit
+
+  input wire CLK1;
+  input wire CLK2;
+  input wire CLK3;
+  input wire CLK4;
+
+  input  wire [CFG_ABITS-1:0] A1ADDR;
+  output wire [CFG_DBITS-1:0] A1DATA;
+  input  wire A1EN;
+
+  input  wire [CFG_ABITS-1:0] B1ADDR;
+  input  wire [CFG_DBITS-1:0] B1DATA;
+  input  wire [CFG_ENABLE_B-1:0] B1EN;
+
+  input  wire [CFG_ABITS-1:0] C1ADDR;
+  output wire [CFG_DBITS-1:0] C1DATA;
+  input  wire C1EN;
+
+  input  wire [CFG_ABITS-1:0] D1ADDR;
+  input  wire [CFG_DBITS-1:0] D1DATA;
+  input  wire [CFG_ENABLE_D-1:0] D1EN;
+
+  input  wire [CFG_ABITS-1:0] E1ADDR;
+  output wire [CFG_DBITS-1:0] E1DATA;
+  input  wire E1EN;
+
+  input  wire [CFG_ABITS-1:0] F1ADDR;
+  input  wire [CFG_DBITS-1:0] F1DATA;
+  input  wire [CFG_ENABLE_F-1:0] F1EN;
+
+  input  wire [CFG_ABITS-1:0] G1ADDR;
+  output wire [CFG_DBITS-1:0] G1DATA;
+  input  wire G1EN;
+
+  input  wire [CFG_ABITS-1:0] H1ADDR;
+  input  wire [CFG_DBITS-1:0] H1DATA;
+  input  wire [CFG_ENABLE_H-1:0] H1EN;
+
+	wire FLUSH1;
+	wire FLUSH2;
+
+	wire [14:0] A1ADDR_TOTAL;
+	wire [14:0] B1ADDR_TOTAL;
+	wire [14:0] C1ADDR_TOTAL;
+	wire [14:0] D1ADDR_TOTAL;
+	wire [14:0] E1ADDR_TOTAL;
+	wire [14:0] F1ADDR_TOTAL;
+	wire [14:0] G1ADDR_TOTAL;
+	wire [14:0] H1ADDR_TOTAL;
+  
+  generate
+    if (CFG_ABITS == 15) begin
+      assign A1ADDR_TOTAL = A1ADDR;
+      assign B1ADDR_TOTAL = B1ADDR;
+      assign C1ADDR_TOTAL = C1ADDR;
+      assign D1ADDR_TOTAL = D1ADDR;
+      assign E1ADDR_TOTAL = E1ADDR;
+      assign F1ADDR_TOTAL = F1ADDR;
+      assign G1ADDR_TOTAL = G1ADDR;
+      assign H1ADDR_TOTAL = H1ADDR;
+    end else begin
+      assign A1ADDR_TOTAL[14:CFG_ABITS] = 0;
+      assign A1ADDR_TOTAL[CFG_ABITS-1:0] = A1ADDR;
+      assign B1ADDR_TOTAL[14:CFG_ABITS] = 0;
+      assign B1ADDR_TOTAL[CFG_ABITS-1:0] = B1ADDR;
+      assign C1ADDR_TOTAL[14:CFG_ABITS] = 0;
+      assign C1ADDR_TOTAL[CFG_ABITS-1:0] = C1ADDR;
+      assign D1ADDR_TOTAL[14:CFG_ABITS] = 0;
+      assign D1ADDR_TOTAL[CFG_ABITS-1:0] = D1ADDR;
+      assign E1ADDR_TOTAL[14:CFG_ABITS] = 0;
+      assign E1ADDR_TOTAL[CFG_ABITS-1:0] = E1ADDR;
+      assign F1ADDR_TOTAL[14:CFG_ABITS] = 0;
+      assign F1ADDR_TOTAL[CFG_ABITS-1:0] = F1ADDR;
+      assign G1ADDR_TOTAL[14:CFG_ABITS] = 0;
+      assign G1ADDR_TOTAL[CFG_ABITS-1:0] = G1ADDR;
+      assign H1ADDR_TOTAL[14:CFG_ABITS] = 0;
+      assign H1ADDR_TOTAL[CFG_ABITS-1:0] = H1ADDR;
+    end
+  endgenerate
+
+	wire [17:CFG_DBITS] A1_RDATA_CMPL;
+	wire [17:CFG_DBITS] C1_RDATA_CMPL;
+	wire [17:CFG_DBITS] E1_RDATA_CMPL;
+	wire [17:CFG_DBITS] G1_RDATA_CMPL;
+
+	wire [17:CFG_DBITS] B1_WDATA_CMPL;
+	wire [17:CFG_DBITS] D1_WDATA_CMPL;
+	wire [17:CFG_DBITS] F1_WDATA_CMPL;
+	wire [17:CFG_DBITS] H1_WDATA_CMPL;
+
+	wire [14:0] PORT_A1_ADDR;
+	wire [14:0] PORT_A2_ADDR;
+	wire [14:0] PORT_B1_ADDR;
+	wire [14:0] PORT_B2_ADDR;
+
+	assign FLUSH1 = 1'b0;
+	assign FLUSH2 = 1'b0;
+
+	wire [17:0] PORT_A1_RDATA;
+	wire [17:0] PORT_B1_RDATA;
+	wire [17:0] PORT_A2_RDATA;
+	wire [17:0] PORT_B2_RDATA;
+
+	wire [17:0] PORT_A1_WDATA;
+	wire [17:0] PORT_B1_WDATA;
+	wire [17:0] PORT_A2_WDATA;
+	wire [17:0] PORT_B2_WDATA;
+
+	// Assign read/write data - handle special case for 9bit mode
+	// parity bit for 9bit mode is placed in R/W port on bit #16
+	case (CFG_DBITS)
+		9: begin
+			assign A1DATA = {PORT_A1_RDATA[16], PORT_A1_RDATA[7:0]};
+			assign C1DATA = {PORT_B1_RDATA[16], PORT_B1_RDATA[7:0]};
+			assign E1DATA = {PORT_A2_RDATA[16], PORT_A2_RDATA[7:0]};
+			assign G1DATA = {PORT_B2_RDATA[16], PORT_B2_RDATA[7:0]};
+			assign PORT_A1_WDATA = {B1_WDATA_CMPL[17], B1DATA[8], B1_WDATA_CMPL[16:9], B1DATA[7:0]};
+			assign PORT_B1_WDATA = {D1_WDATA_CMPL[17], D1DATA[8], D1_WDATA_CMPL[16:9], D1DATA[7:0]};
+			assign PORT_A2_WDATA = {F1_WDATA_CMPL[17], F1DATA[8], F1_WDATA_CMPL[16:9], F1DATA[7:0]};
+			assign PORT_B2_WDATA = {H1_WDATA_CMPL[17], H1DATA[8], H1_WDATA_CMPL[16:9], H1DATA[7:0]};
+		end
+		default: begin
+			assign A1DATA = PORT_A1_RDATA[CFG_DBITS-1:0];
+			assign C1DATA = PORT_B1_RDATA[CFG_DBITS-1:0];
+			assign E1DATA = PORT_A2_RDATA[CFG_DBITS-1:0];
+			assign G1DATA = PORT_B2_RDATA[CFG_DBITS-1:0];
+			assign PORT_A1_WDATA = {B1_WDATA_CMPL, B1DATA};
+			assign PORT_B1_WDATA = {D1_WDATA_CMPL, D1DATA};
+			assign PORT_A2_WDATA = {F1_WDATA_CMPL, F1DATA};
+			assign PORT_B2_WDATA = {H1_WDATA_CMPL, H1DATA};
+
+		end
+	endcase
+
+	wire PORT_A1_CLK = CLK1;
+	wire PORT_A2_CLK = CLK3;
+	wire PORT_B1_CLK = CLK2;
+	wire PORT_B2_CLK = CLK4;
+
+	wire PORT_A1_REN = A1EN;
+	wire PORT_A1_WEN = B1EN[0];
+	wire [CFG_ENABLE_B-1:0] PORT_A1_BE = {B1EN[1],B1EN[0]};
+
+	wire PORT_A2_REN = E1EN;
+	wire PORT_A2_WEN = F1EN[0];
+	wire [CFG_ENABLE_F-1:0] PORT_A2_BE = {F1EN[1],F1EN[0]};
+
+	wire PORT_B1_REN = C1EN;
+	wire PORT_B1_WEN = D1EN[0];
+	wire [CFG_ENABLE_D-1:0] PORT_B1_BE = {D1EN[1],D1EN[0]};
+
+	wire PORT_B2_REN = G1EN;
+	wire PORT_B2_WEN = H1EN[0];
+	wire [CFG_ENABLE_H-1:0] PORT_B2_BE = {H1EN[1],H1EN[0]};
+  
+  	case (CFG_DBITS)
+		1: begin
+			assign PORT_A1_ADDR = A1EN ? A1ADDR_TOTAL : (B1EN ? B1ADDR_TOTAL : 14'd0);
+			assign PORT_B1_ADDR = C1EN ? C1ADDR_TOTAL : (D1EN ? D1ADDR_TOTAL : 14'd0);
+			assign PORT_A2_ADDR = E1EN ? E1ADDR_TOTAL : (F1EN ? F1ADDR_TOTAL : 14'd0);
+			assign PORT_B2_ADDR = G1EN ? G1ADDR_TOTAL : (H1EN ? H1ADDR_TOTAL : 14'd0);
+			defparam _TECHMAP_REPLACE_.MODE_BITS = { 1'b1,
+				11'd10, 11'd10, 4'd0, MODE_1, MODE_1, MODE_1, MODE_1, 1'd0,
+				12'd10, 12'd10, 4'd0, MODE_1, MODE_1, MODE_1, MODE_1, 1'd0
+			};
+      (* is_split = 1 *)
+      (* rd_data_width = CFG_DBITS *)
+      (* wr_data_width = CFG_DBITS *)
+      TDP36K  _TECHMAP_REPLACE_ (
+        .WDATA_A1_i(PORT_A1_WDATA),
+        .RDATA_A1_o(PORT_A1_RDATA),
+        .ADDR_A1_i(PORT_A1_ADDR),
+        .CLK_A1_i(PORT_A1_CLK),
+        .REN_A1_i(PORT_A1_REN),
+        .WEN_A1_i(PORT_A1_WEN),
+        .BE_A1_i(PORT_A1_BE),
+    
+        .WDATA_A2_i(PORT_A2_WDATA),
+        .RDATA_A2_o(PORT_A2_RDATA),
+        .ADDR_A2_i(PORT_A2_ADDR),
+        .CLK_A2_i(PORT_A2_CLK),
+        .REN_A2_i(PORT_A2_REN),
+        .WEN_A2_i(PORT_A2_WEN),
+        .BE_A2_i(PORT_A2_BE),
+    
+        .WDATA_B1_i(PORT_B1_WDATA),
+        .RDATA_B1_o(PORT_B1_RDATA),
+        .ADDR_B1_i(PORT_B1_ADDR),
+        .CLK_B1_i(PORT_B1_CLK),
+        .REN_B1_i(PORT_B1_REN),
+        .WEN_B1_i(PORT_B1_WEN),
+        .BE_B1_i(PORT_B1_BE),
+    
+        .WDATA_B2_i(PORT_B2_WDATA),
+        .RDATA_B2_o(PORT_B2_RDATA),
+        .ADDR_B2_i(PORT_B2_ADDR),
+        .CLK_B2_i(PORT_B2_CLK),
+        .REN_B2_i(PORT_B2_REN),
+        .WEN_B2_i(PORT_B2_WEN),
+        .BE_B2_i(PORT_B2_BE),
+    
+        .FLUSH1_i(FLUSH1),
+        .FLUSH2_i(FLUSH2)
+      );
+		end
+
+		2: begin
+			assign PORT_A1_ADDR = A1EN ? (A1ADDR_TOTAL << 1) : (B1EN ? (B1ADDR_TOTAL << 1) : 14'd0);
+			assign PORT_B1_ADDR = C1EN ? (C1ADDR_TOTAL << 1) : (D1EN ? (D1ADDR_TOTAL << 1) : 14'd0);
+			assign PORT_A2_ADDR = E1EN ? (E1ADDR_TOTAL << 1) : (F1EN ? (F1ADDR_TOTAL << 1) : 14'd0);
+			assign PORT_B2_ADDR = G1EN ? (G1ADDR_TOTAL << 1) : (H1EN ? (H1ADDR_TOTAL << 1) : 14'd0);
+			defparam _TECHMAP_REPLACE_.MODE_BITS = { 1'b1,
+				11'd10, 11'd10, 4'd0, MODE_2, MODE_2, MODE_2, MODE_2, 1'd0,
+				12'd10, 12'd10, 4'd0, MODE_2, MODE_2, MODE_2, MODE_2, 1'd0
+			};
+      (* is_split = 1 *)
+      (* rd_data_width = CFG_DBITS *)
+      (* wr_data_width = CFG_DBITS *)
+      TDP36K  _TECHMAP_REPLACE_ (
+        .WDATA_A1_i(PORT_A1_WDATA),
+        .RDATA_A1_o(PORT_A1_RDATA),
+        .ADDR_A1_i(PORT_A1_ADDR),
+        .CLK_A1_i(PORT_A1_CLK),
+        .REN_A1_i(PORT_A1_REN),
+        .WEN_A1_i(PORT_A1_WEN),
+        .BE_A1_i(PORT_A1_BE),
+    
+        .WDATA_A2_i(PORT_A2_WDATA),
+        .RDATA_A2_o(PORT_A2_RDATA),
+        .ADDR_A2_i(PORT_A2_ADDR),
+        .CLK_A2_i(PORT_A2_CLK),
+        .REN_A2_i(PORT_A2_REN),
+        .WEN_A2_i(PORT_A2_WEN),
+        .BE_A2_i(PORT_A2_BE),
+    
+        .WDATA_B1_i(PORT_B1_WDATA),
+        .RDATA_B1_o(PORT_B1_RDATA),
+        .ADDR_B1_i(PORT_B1_ADDR),
+        .CLK_B1_i(PORT_B1_CLK),
+        .REN_B1_i(PORT_B1_REN),
+        .WEN_B1_i(PORT_B1_WEN),
+        .BE_B1_i(PORT_B1_BE),
+    
+        .WDATA_B2_i(PORT_B2_WDATA),
+        .RDATA_B2_o(PORT_B2_RDATA),
+        .ADDR_B2_i(PORT_B2_ADDR),
+        .CLK_B2_i(PORT_B2_CLK),
+        .REN_B2_i(PORT_B2_REN),
+        .WEN_B2_i(PORT_B2_WEN),
+        .BE_B2_i(PORT_B2_BE),
+    
+        .FLUSH1_i(FLUSH1),
+        .FLUSH2_i(FLUSH2)
+      );
+		end
+
+		4: begin
+			assign PORT_A1_ADDR = A1EN ? (A1ADDR_TOTAL << 2) : (B1EN ? (B1ADDR_TOTAL << 2) : 14'd0);
+			assign PORT_B1_ADDR = C1EN ? (C1ADDR_TOTAL << 2) : (D1EN ? (D1ADDR_TOTAL << 2) : 14'd0);
+			assign PORT_A2_ADDR = E1EN ? (E1ADDR_TOTAL << 2) : (F1EN ? (F1ADDR_TOTAL << 2) : 14'd0);
+			assign PORT_B2_ADDR = G1EN ? (G1ADDR_TOTAL << 2) : (H1EN ? (H1ADDR_TOTAL << 2) : 14'd0);
+			defparam _TECHMAP_REPLACE_.MODE_BITS = { 1'b1,
+				11'd10, 11'd10, 4'd0, MODE_4, MODE_4, MODE_4, MODE_4, 1'd0,
+				12'd10, 12'd10, 4'd0, MODE_4, MODE_4, MODE_4, MODE_4, 1'd0
+			};
+      (* is_split = 1 *)
+      (* rd_data_width = CFG_DBITS *)
+      (* wr_data_width = CFG_DBITS *)
+      TDP36K  _TECHMAP_REPLACE_ (
+        .WDATA_A1_i(PORT_A1_WDATA),
+        .RDATA_A1_o(PORT_A1_RDATA),
+        .ADDR_A1_i(PORT_A1_ADDR),
+        .CLK_A1_i(PORT_A1_CLK),
+        .REN_A1_i(PORT_A1_REN),
+        .WEN_A1_i(PORT_A1_WEN),
+        .BE_A1_i(PORT_A1_BE),
+    
+        .WDATA_A2_i(PORT_A2_WDATA),
+        .RDATA_A2_o(PORT_A2_RDATA),
+        .ADDR_A2_i(PORT_A2_ADDR),
+        .CLK_A2_i(PORT_A2_CLK),
+        .REN_A2_i(PORT_A2_REN),
+        .WEN_A2_i(PORT_A2_WEN),
+        .BE_A2_i(PORT_A2_BE),
+    
+        .WDATA_B1_i(PORT_B1_WDATA),
+        .RDATA_B1_o(PORT_B1_RDATA),
+        .ADDR_B1_i(PORT_B1_ADDR),
+        .CLK_B1_i(PORT_B1_CLK),
+        .REN_B1_i(PORT_B1_REN),
+        .WEN_B1_i(PORT_B1_WEN),
+        .BE_B1_i(PORT_B1_BE),
+    
+        .WDATA_B2_i(PORT_B2_WDATA),
+        .RDATA_B2_o(PORT_B2_RDATA),
+        .ADDR_B2_i(PORT_B2_ADDR),
+        .CLK_B2_i(PORT_B2_CLK),
+        .REN_B2_i(PORT_B2_REN),
+        .WEN_B2_i(PORT_B2_WEN),
+        .BE_B2_i(PORT_B2_BE),
+    
+        .FLUSH1_i(FLUSH1),
+        .FLUSH2_i(FLUSH2)
+      );
+		end
+
+		8, 9: begin
+			assign PORT_A1_ADDR = A1EN ? (A1ADDR_TOTAL << 3) : (B1EN ? (B1ADDR_TOTAL << 3) : 14'd0);
+			assign PORT_B1_ADDR = C1EN ? (C1ADDR_TOTAL << 3) : (D1EN ? (D1ADDR_TOTAL << 3) : 14'd0);
+			assign PORT_A2_ADDR = E1EN ? (E1ADDR_TOTAL << 3) : (F1EN ? (F1ADDR_TOTAL << 3) : 14'd0);
+			assign PORT_B2_ADDR = G1EN ? (G1ADDR_TOTAL << 3) : (H1EN ? (H1ADDR_TOTAL << 3) : 14'd0);
+			defparam _TECHMAP_REPLACE_.MODE_BITS = { 1'b1,
+				11'd10, 11'd10, 4'd0, MODE_9, MODE_9, MODE_9, MODE_9, 1'd0,
+				12'd10, 12'd10, 4'd0, MODE_9, MODE_9, MODE_9, MODE_9, 1'd0
+			};
+      (* is_split = 1 *)
+      (* rd_data_width = CFG_DBITS *)
+      (* wr_data_width = CFG_DBITS *)
+      TDP36K  _TECHMAP_REPLACE_ (
+        .WDATA_A1_i(PORT_A1_WDATA),
+        .RDATA_A1_o(PORT_A1_RDATA),
+        .ADDR_A1_i(PORT_A1_ADDR),
+        .CLK_A1_i(PORT_A1_CLK),
+        .REN_A1_i(PORT_A1_REN),
+        .WEN_A1_i(PORT_A1_WEN),
+        .BE_A1_i(PORT_A1_BE),
+    
+        .WDATA_A2_i(PORT_A2_WDATA),
+        .RDATA_A2_o(PORT_A2_RDATA),
+        .ADDR_A2_i(PORT_A2_ADDR),
+        .CLK_A2_i(PORT_A2_CLK),
+        .REN_A2_i(PORT_A2_REN),
+        .WEN_A2_i(PORT_A2_WEN),
+        .BE_A2_i(PORT_A2_BE),
+    
+        .WDATA_B1_i(PORT_B1_WDATA),
+        .RDATA_B1_o(PORT_B1_RDATA),
+        .ADDR_B1_i(PORT_B1_ADDR),
+        .CLK_B1_i(PORT_B1_CLK),
+        .REN_B1_i(PORT_B1_REN),
+        .WEN_B1_i(PORT_B1_WEN),
+        .BE_B1_i(PORT_B1_BE),
+    
+        .WDATA_B2_i(PORT_B2_WDATA),
+        .RDATA_B2_o(PORT_B2_RDATA),
+        .ADDR_B2_i(PORT_B2_ADDR),
+        .CLK_B2_i(PORT_B2_CLK),
+        .REN_B2_i(PORT_B2_REN),
+        .WEN_B2_i(PORT_B2_WEN),
+        .BE_B2_i(PORT_B2_BE),
+    
+        .FLUSH1_i(FLUSH1),
+        .FLUSH2_i(FLUSH2)
+      );
+		end
+
+		16, 18: begin
+			assign PORT_A1_ADDR = A1EN ? (A1ADDR_TOTAL << 4) : (B1EN ? (B1ADDR_TOTAL << 4) : 14'd0);
+			assign PORT_B1_ADDR = C1EN ? (C1ADDR_TOTAL << 4) : (D1EN ? (D1ADDR_TOTAL << 4) : 14'd0);
+			assign PORT_A2_ADDR = E1EN ? (E1ADDR_TOTAL << 4) : (F1EN ? (F1ADDR_TOTAL << 4) : 14'd0);
+			assign PORT_B2_ADDR = G1EN ? (G1ADDR_TOTAL << 4) : (H1EN ? (H1ADDR_TOTAL << 4) : 14'd0);
+			defparam _TECHMAP_REPLACE_.MODE_BITS = { 1'b1,
+				11'd10, 11'd10, 4'd0, MODE_18, MODE_18, MODE_18, MODE_18, 1'd0,
+				12'd10, 12'd10, 4'd0, MODE_18, MODE_18, MODE_18, MODE_18, 1'd0
+			};
+      (* is_split = 1 *)
+      (* rd_data_width = CFG_DBITS *)
+      (* wr_data_width = CFG_DBITS *)
+      TDP36K  _TECHMAP_REPLACE_ (
+        .WDATA_A1_i(PORT_A1_WDATA),
+        .RDATA_A1_o(PORT_A1_RDATA),
+        .ADDR_A1_i(PORT_A1_ADDR),
+        .CLK_A1_i(PORT_A1_CLK),
+        .REN_A1_i(PORT_A1_REN),
+        .WEN_A1_i(PORT_A1_WEN),
+        .BE_A1_i(PORT_A1_BE),
+    
+        .WDATA_A2_i(PORT_A2_WDATA),
+        .RDATA_A2_o(PORT_A2_RDATA),
+        .ADDR_A2_i(PORT_A2_ADDR),
+        .CLK_A2_i(PORT_A2_CLK),
+        .REN_A2_i(PORT_A2_REN),
+        .WEN_A2_i(PORT_A2_WEN),
+        .BE_A2_i(PORT_A2_BE),
+    
+        .WDATA_B1_i(PORT_B1_WDATA),
+        .RDATA_B1_o(PORT_B1_RDATA),
+        .ADDR_B1_i(PORT_B1_ADDR),
+        .CLK_B1_i(PORT_B1_CLK),
+        .REN_B1_i(PORT_B1_REN),
+        .WEN_B1_i(PORT_B1_WEN),
+        .BE_B1_i(PORT_B1_BE),
+    
+        .WDATA_B2_i(PORT_B2_WDATA),
+        .RDATA_B2_o(PORT_B2_RDATA),
+        .ADDR_B2_i(PORT_B2_ADDR),
+        .CLK_B2_i(PORT_B2_CLK),
+        .REN_B2_i(PORT_B2_REN),
+        .WEN_B2_i(PORT_B2_WEN),
+        .BE_B2_i(PORT_B2_BE),
+    
+        .FLUSH1_i(FLUSH1),
+        .FLUSH2_i(FLUSH2)
+      );
+		end
+
+		default: begin
+			assign PORT_A1_ADDR = A1EN ? A1ADDR_TOTAL : (B1EN ? B1ADDR_TOTAL : 14'd0);
+			assign PORT_B1_ADDR = C1EN ? C1ADDR_TOTAL : (D1EN ? D1ADDR_TOTAL : 14'd0);
+			assign PORT_A2_ADDR = E1EN ? E1ADDR_TOTAL : (F1EN ? F1ADDR_TOTAL : 14'd0);
+			assign PORT_B2_ADDR = G1EN ? G1ADDR_TOTAL : (H1EN ? H1ADDR_TOTAL : 14'd0);
+			defparam _TECHMAP_REPLACE_.MODE_BITS = { 1'b1,
+				11'd10, 11'd10, 4'd0, MODE_36, MODE_36, MODE_36, MODE_36, 1'd0,
+				12'd10, 12'd10, 4'd0, MODE_36, MODE_36, MODE_36, MODE_36, 1'd0
+			};
+      (* is_split = 1 *)
+      (* rd_data_width = CFG_DBITS *)
+      (* wr_data_width = CFG_DBITS *)
+      TDP36K  _TECHMAP_REPLACE_ (
+        .WDATA_A1_i(PORT_A1_WDATA),
+        .RDATA_A1_o(PORT_A1_RDATA),
+        .ADDR_A1_i(PORT_A1_ADDR),
+        .CLK_A1_i(PORT_A1_CLK),
+        .REN_A1_i(PORT_A1_REN),
+        .WEN_A1_i(PORT_A1_WEN),
+        .BE_A1_i(PORT_A1_BE),
+    
+        .WDATA_A2_i(PORT_A2_WDATA),
+        .RDATA_A2_o(PORT_A2_RDATA),
+        .ADDR_A2_i(PORT_A2_ADDR),
+        .CLK_A2_i(PORT_A2_CLK),
+        .REN_A2_i(PORT_A2_REN),
+        .WEN_A2_i(PORT_A2_WEN),
+        .BE_A2_i(PORT_A2_BE),
+    
+        .WDATA_B1_i(PORT_B1_WDATA),
+        .RDATA_B1_o(PORT_B1_RDATA),
+        .ADDR_B1_i(PORT_B1_ADDR),
+        .CLK_B1_i(PORT_B1_CLK),
+        .REN_B1_i(PORT_B1_REN),
+        .WEN_B1_i(PORT_B1_WEN),
+        .BE_B1_i(PORT_B1_BE),
+    
+        .WDATA_B2_i(PORT_B2_WDATA),
+        .RDATA_B2_o(PORT_B2_RDATA),
+        .ADDR_B2_i(PORT_B2_ADDR),
+        .CLK_B2_i(PORT_B2_CLK),
+        .REN_B2_i(PORT_B2_REN),
+        .WEN_B2_i(PORT_B2_WEN),
+        .BE_B2_i(PORT_B2_BE),
+    
+        .FLUSH1_i(FLUSH1),
+        .FLUSH2_i(FLUSH2)
+      );
+		end
+	endcase
+
+endmodule
+
+module DPRAM_18K_BLK (   
+    CLK1_i,
+    WEN1_i,
+    REN1_i,
+    WR1_ADDR_i,
+    RD1_ADDR_i,
+    WDATA1_i,
+    RDATA1_o,
+    
+    CLK2_i,
+    WEN2_i,
+    REN2_i,
+    WR2_ADDR_i,
+    RD2_ADDR_i,
+    WDATA2_i,
+    RDATA2_o
+);
+
+parameter ADDR_WIDTH = 10;
+parameter DATA_WIDTH = 18;
+parameter BE1_WIDTH = 2;
+parameter BE2_WIDTH = 2;
+
+input wire CLK1_i;
+input wire WEN1_i;
+input wire REN1_i;
+input wire [ADDR_WIDTH-1 :0] WR1_ADDR_i;
+input wire [ADDR_WIDTH-1 :0] RD1_ADDR_i;
+input wire [DATA_WIDTH-1 :0] WDATA1_i;
+output wire [DATA_WIDTH-1 :0] RDATA1_o;
+
+input wire CLK2_i;
+input wire WEN2_i;
+input wire REN2_i;
+input wire [ADDR_WIDTH-1 :0] WR2_ADDR_i;
+input wire [ADDR_WIDTH-1 :0] RD2_ADDR_i;
+input wire [DATA_WIDTH-1 :0] WDATA2_i;
+output wire [DATA_WIDTH-1 :0] RDATA2_o;
+
+(* is_inferred = 1 *)
+BRAM2x18_DP #(
+	.CFG_ABITS(ADDR_WIDTH),
+	.CFG_DBITS(DATA_WIDTH),
+	.CFG_ENABLE_B(BE1_WIDTH),
+	.CFG_ENABLE_D(BE2_WIDTH)
+) bram2x18_inst (
+	.A1ADDR(RD1_ADDR_i),
+	.A1DATA(RDATA1_o),
+	.A1EN(REN1_i),
+	.B1ADDR(WR1_ADDR_i),
+	.B1DATA(WDATA1_i),
+	.B1EN({WEN1_i,WEN1_i}),
+	.CLK1(CLK1_i),
+
+	.C1ADDR(RD2_ADDR_i),
+	.C1DATA(RDATA2_o),
+	.C1EN(REN2_i),
+	.D1ADDR(WR2_ADDR_i),
+	.D1DATA(WDATA2_i),
+	.D1EN({WEN2_i,WEN2_i}),
+	.CLK2(CLK2_i),
+
+	.E1ADDR(),
+	.E1DATA(),
+	.E1EN(),
+	.F1ADDR(),
+	.F1DATA(),
+	.F1EN(),
+	.CLK3(),
+
+	.G1ADDR(),
+	.G1DATA(),
+	.G1EN(),
+	.H1ADDR(),
+	.H1DATA(),
+	.H1EN(),
+	.CLK4()
+);
+endmodule
+
+module DPRAM_36K_BLK (   
+    CLK1_i,
+    WEN1_i,
+    WR1_BE_i,
+    REN1_i,
+    WR1_ADDR_i,
+    RD1_ADDR_i,
+    WDATA1_i,
+    RDATA1_o,
+    
+    CLK2_i,
+    WEN2_i,
+    WR2_BE_i,
+    REN2_i,
+    WR2_ADDR_i,
+    RD2_ADDR_i,
+    WDATA2_i,
+    RDATA2_o
+);
+
+parameter ADDR_WIDTH = 10;
+parameter DATA_WIDTH = 36;
+parameter BE1_WIDTH = 4;
+parameter BE2_WIDTH = 4;
+
+localparam MODE_36 = 3'b011; // 36- or 32-bit
+localparam MODE_18 = 3'b010; // 18- or 16-bit
+localparam MODE_9 = 3'b001; // 9- or 8-bit
+localparam MODE_4 = 3'b100; // 4-bit
+localparam MODE_2 = 3'b110; // 2-bit
+localparam MODE_1 = 3'b101; // 1-bit
+
+input wire CLK1_i;
+input wire WEN1_i;
+input wire [BE1_WIDTH-1 :0] WR1_BE_i;
+input wire REN1_i;
+input wire [ADDR_WIDTH-1 :0] WR1_ADDR_i;
+input wire [ADDR_WIDTH-1 :0] RD1_ADDR_i;
+input wire [DATA_WIDTH-1 :0] WDATA1_i;
+output wire [DATA_WIDTH-1 :0] RDATA1_o;
+
+input wire CLK2_i;
+input wire WEN2_i;
+input wire [BE2_WIDTH-1 :0] WR2_BE_i;
+input wire REN2_i;
+input wire [ADDR_WIDTH-1 :0] WR2_ADDR_i;
+input wire [ADDR_WIDTH-1 :0] RD2_ADDR_i;
+input wire [DATA_WIDTH-1 :0] WDATA2_i;
+output wire [DATA_WIDTH-1 :0] RDATA2_o;
+
+wire FLUSH1;
+wire FLUSH2;
+
+wire [14:0] A1ADDR_TOTAL;
+wire [14:0] B1ADDR_TOTAL;
+wire [14:0] C1ADDR_TOTAL;
+wire [14:0] D1ADDR_TOTAL;
+
+generate
+  if (ADDR_WIDTH == 15) begin
+    assign A1ADDR_TOTAL = RD1_ADDR_i;
+    assign B1ADDR_TOTAL = WR1_ADDR_i;
+    assign C1ADDR_TOTAL = RD2_ADDR_i;
+    assign D1ADDR_TOTAL = WR2_ADDR_i;
+  end else begin
+    assign A1ADDR_TOTAL[14:ADDR_WIDTH] = 0;
+    assign A1ADDR_TOTAL[ADDR_WIDTH-1:0] = RD1_ADDR_i;
+    assign B1ADDR_TOTAL[14:ADDR_WIDTH] = 0;
+    assign B1ADDR_TOTAL[ADDR_WIDTH-1:0] = WR1_ADDR_i;
+    assign C1ADDR_TOTAL[14:ADDR_WIDTH] = 0;
+    assign C1ADDR_TOTAL[ADDR_WIDTH-1:0] = RD2_ADDR_i;
+    assign D1ADDR_TOTAL[14:ADDR_WIDTH] = 0;
+    assign D1ADDR_TOTAL[ADDR_WIDTH-1:0] = WR2_ADDR_i;
+  end
+endgenerate
+
+wire [35:DATA_WIDTH] A1DATA_CMPL;
+wire [35:DATA_WIDTH] B1DATA_CMPL;
+wire [35:DATA_WIDTH] C1DATA_CMPL;
+wire [35:DATA_WIDTH] D1DATA_CMPL;
+
+wire [35:0] A1DATA_TOTAL;
+wire [35:0] B1DATA_TOTAL;
+wire [35:0] C1DATA_TOTAL;
+wire [35:0] D1DATA_TOTAL;
+
+wire [14:0] PORT_A_ADDR;
+wire [14:0] PORT_B_ADDR;
+
+wire [3:0] WR1_BE;
+wire [3:0] WR2_BE;
+
+generate
+  if (BE1_WIDTH == 4) begin
+    assign WR1_BE = WR1_BE_i;
+  end else begin
+    assign WR1_BE[3:BE1_WIDTH] = 0;
+    assign WR1_BE[BE1_WIDTH-1:0] = WR1_BE_i[BE1_WIDTH-1:0];
+  end
+endgenerate
+
+generate
+  if (BE2_WIDTH == 4) begin
+    assign WR2_BE = WR2_BE_i;
+  end else begin
+    assign WR2_BE[3:BE2_WIDTH] = 0;
+    assign WR2_BE[BE2_WIDTH-1:0] = WR2_BE_i[BE2_WIDTH-1:0];
+  end
+endgenerate
+
+// Assign read/write data - handle special case for 9bit mode
+// parity bit for 9bit mode is placed in R/W port on bit #16
+case (DATA_WIDTH)
+	9: begin
+		assign RDATA1_o = {A1DATA_TOTAL[16], A1DATA_TOTAL[7:0]};
+		assign RDATA2_o = {C1DATA_TOTAL[16], C1DATA_TOTAL[7:0]};
+		assign B1DATA_TOTAL = {B1DATA_CMPL[35:17], WDATA1_i[8], B1DATA_CMPL[16:9], WDATA1_i[7:0]};
+		assign D1DATA_TOTAL = {D1DATA_CMPL[35:17], WDATA2_i[8], D1DATA_CMPL[16:9], WDATA2_i[7:0]};
+	end
+	default: begin
+		assign RDATA1_o = A1DATA_TOTAL[DATA_WIDTH-1:0];
+		assign RDATA2_o = C1DATA_TOTAL[DATA_WIDTH-1:0];
+		assign B1DATA_TOTAL = {B1DATA_CMPL, WDATA1_i};
+		assign D1DATA_TOTAL = {D1DATA_CMPL, WDATA2_i};
+	end
+endcase
+
+assign FLUSH1 = 1'b0;
+assign FLUSH2 = 1'b0;
+
+case (DATA_WIDTH)
+	1: begin
+		assign PORT_A_ADDR = REN1_i ? A1ADDR_TOTAL : (WEN1_i ? B1ADDR_TOTAL : 15'd0);
+		assign PORT_B_ADDR = REN2_i ? C1ADDR_TOTAL : (WEN2_i ? D1ADDR_TOTAL : 15'd0);
+          defparam U1.MODE_BITS = { 1'b0,
+              11'd10, 11'd10, 4'd0, MODE_1, MODE_1, MODE_1, MODE_1, 1'd0,
+              12'd10, 12'd10, 4'd0, MODE_1, MODE_1, MODE_1, MODE_1, 1'd0
+          };
+          (* is_inferred = 1 *)
+          (* rd_data_width = DATA_WIDTH *)
+          (* wr_data_width = DATA_WIDTH *)
+          TDP36K U1 (
+            .RESET_ni(1'b1),
+            .WDATA_A1_i(B1DATA_TOTAL[17:0]),
+            .WDATA_A2_i(B1DATA_TOTAL[35:18]),
+            .RDATA_A1_o(A1DATA_TOTAL[17:0]),
+            .RDATA_A2_o(A1DATA_TOTAL[35:18]),
+            .ADDR_A1_i(PORT_A_ADDR),
+            .ADDR_A2_i(PORT_A_ADDR),
+            .CLK_A1_i(CLK1_i),
+            .CLK_A2_i(CLK1_i),
+            .REN_A1_i(REN1_i),
+            .REN_A2_i(REN1_i),
+            .WEN_A1_i(WEN1_i),
+            .WEN_A2_i(WEN1_i),
+            .BE_A1_i(WR1_BE[1:0]),
+            .BE_A2_i(WR1_BE[3:0]),
+          
+            .WDATA_B1_i(D1DATA_TOTAL[17:0]),
+            .WDATA_B2_i(D1DATA_TOTAL[35:18]),
+            .RDATA_B1_o(C1DATA_TOTAL[17:0]),
+            .RDATA_B2_o(C1DATA_TOTAL[35:18]),
+            .ADDR_B1_i(PORT_B_ADDR),
+            .ADDR_B2_i(PORT_B_ADDR),
+            .CLK_B1_i(CLK2_i),
+            .CLK_B2_i(CLK2_i),
+            .REN_B1_i(REN2_i),
+            .REN_B2_i(REN2_i),
+            .WEN_B1_i(WEN2_i),
+            .WEN_B2_i(WEN2_i),
+            .BE_B1_i(WR2_BE[1:0]),
+            .BE_B2_i(WR2_BE[3:0]),
+          
+            .FLUSH1_i(FLUSH1),
+            .FLUSH2_i(FLUSH2)
+          );          
+	end
+
+	2: begin
+		assign PORT_A_ADDR = REN1_i ? (A1ADDR_TOTAL << 1) : (WEN1_i ? (B1ADDR_TOTAL << 1) : 15'd0);
+		assign PORT_B_ADDR = REN2_i ? (C1ADDR_TOTAL << 1) : (WEN2_i ? (D1ADDR_TOTAL << 1) : 15'd0);
+          defparam U1.MODE_BITS = { 1'b0,
+              11'd10, 11'd10, 4'd0, MODE_2, MODE_2, MODE_2, MODE_2, 1'd0,
+              12'd10, 12'd10, 4'd0, MODE_2, MODE_2, MODE_2, MODE_2, 1'd0
+          };
+          (* is_inferred = 1 *)
+          (* rd_data_width = DATA_WIDTH *)
+          (* wr_data_width = DATA_WIDTH *)
+          TDP36K U1 (
+            .RESET_ni(1'b1),
+            .WDATA_A1_i(B1DATA_TOTAL[17:0]),
+            .WDATA_A2_i(B1DATA_TOTAL[35:18]),
+            .RDATA_A1_o(A1DATA_TOTAL[17:0]),
+            .RDATA_A2_o(A1DATA_TOTAL[35:18]),
+            .ADDR_A1_i(PORT_A_ADDR),
+            .ADDR_A2_i(PORT_A_ADDR),
+            .CLK_A1_i(CLK1_i),
+            .CLK_A2_i(CLK1_i),
+            .REN_A1_i(REN1_i),
+            .REN_A2_i(REN1_i),
+            .WEN_A1_i(WEN1_i),
+            .WEN_A2_i(WEN1_i),
+            .BE_A1_i(WR1_BE[1:0]),
+            .BE_A2_i(WR1_BE[3:0]),
+          
+            .WDATA_B1_i(D1DATA_TOTAL[17:0]),
+            .WDATA_B2_i(D1DATA_TOTAL[35:18]),
+            .RDATA_B1_o(C1DATA_TOTAL[17:0]),
+            .RDATA_B2_o(C1DATA_TOTAL[35:18]),
+            .ADDR_B1_i(PORT_B_ADDR),
+            .ADDR_B2_i(PORT_B_ADDR),
+            .CLK_B1_i(CLK2_i),
+            .CLK_B2_i(CLK2_i),
+            .REN_B1_i(REN2_i),
+            .REN_B2_i(REN2_i),
+            .WEN_B1_i(WEN2_i),
+            .WEN_B2_i(WEN2_i),
+            .BE_B1_i(WR2_BE[1:0]),
+            .BE_B2_i(WR2_BE[3:0]),
+          
+            .FLUSH1_i(FLUSH1),
+            .FLUSH2_i(FLUSH2)
+          );          
+	end
+
+	4: begin
+		assign PORT_A_ADDR = REN1_i ? (A1ADDR_TOTAL << 2) : (WEN1_i ? (B1ADDR_TOTAL << 2) : 15'd0);
+		assign PORT_B_ADDR = REN2_i ? (C1ADDR_TOTAL << 2) : (WEN2_i ? (D1ADDR_TOTAL << 2) : 15'd0);
+          defparam U1.MODE_BITS = { 1'b0,
+              11'd10, 11'd10, 4'd0, MODE_4, MODE_4, MODE_4, MODE_4, 1'd0,
+              12'd10, 12'd10, 4'd0, MODE_4, MODE_4, MODE_4, MODE_4, 1'd0
+          };
+          (* is_inferred = 1 *)
+          (* rd_data_width = DATA_WIDTH *)
+          (* wr_data_width = DATA_WIDTH *)
+          TDP36K U1 (
+            .RESET_ni(1'b1),
+            .WDATA_A1_i(B1DATA_TOTAL[17:0]),
+            .WDATA_A2_i(B1DATA_TOTAL[35:18]),
+            .RDATA_A1_o(A1DATA_TOTAL[17:0]),
+            .RDATA_A2_o(A1DATA_TOTAL[35:18]),
+            .ADDR_A1_i(PORT_A_ADDR),
+            .ADDR_A2_i(PORT_A_ADDR),
+            .CLK_A1_i(CLK1_i),
+            .CLK_A2_i(CLK1_i),
+            .REN_A1_i(REN1_i),
+            .REN_A2_i(REN1_i),
+            .WEN_A1_i(WEN1_i),
+            .WEN_A2_i(WEN1_i),
+            .BE_A1_i(WR1_BE[1:0]),
+            .BE_A2_i(WR1_BE[3:0]),
+          
+            .WDATA_B1_i(D1DATA_TOTAL[17:0]),
+            .WDATA_B2_i(D1DATA_TOTAL[35:18]),
+            .RDATA_B1_o(C1DATA_TOTAL[17:0]),
+            .RDATA_B2_o(C1DATA_TOTAL[35:18]),
+            .ADDR_B1_i(PORT_B_ADDR),
+            .ADDR_B2_i(PORT_B_ADDR),
+            .CLK_B1_i(CLK2_i),
+            .CLK_B2_i(CLK2_i),
+            .REN_B1_i(REN2_i),
+            .REN_B2_i(REN2_i),
+            .WEN_B1_i(WEN2_i),
+            .WEN_B2_i(WEN2_i),
+            .BE_B1_i(WR2_BE[1:0]),
+            .BE_B2_i(WR2_BE[3:0]),
+          
+            .FLUSH1_i(FLUSH1),
+            .FLUSH2_i(FLUSH2)
+          );          
+	end
+
+	8, 9: begin
+		assign PORT_A_ADDR = REN1_i ? (A1ADDR_TOTAL << 3) : (WEN1_i ? (B1ADDR_TOTAL << 3) : 15'd0);
+		assign PORT_B_ADDR = REN2_i ? (C1ADDR_TOTAL << 3) : (WEN2_i ? (D1ADDR_TOTAL << 3) : 15'd0);
+          defparam U1.MODE_BITS = { 1'b0,
+              11'd10, 11'd10, 4'd0, MODE_9, MODE_9, MODE_9, MODE_9, 1'd0,
+              12'd10, 12'd10, 4'd0, MODE_9, MODE_9, MODE_9, MODE_9, 1'd0
+          };
+          (* is_inferred = 1 *)
+          (* rd_data_width = DATA_WIDTH *)
+          (* wr_data_width = DATA_WIDTH *)
+          TDP36K U1 (
+            .RESET_ni(1'b1),
+            .WDATA_A1_i(B1DATA_TOTAL[17:0]),
+            .WDATA_A2_i(B1DATA_TOTAL[35:18]),
+            .RDATA_A1_o(A1DATA_TOTAL[17:0]),
+            .RDATA_A2_o(A1DATA_TOTAL[35:18]),
+            .ADDR_A1_i(PORT_A_ADDR),
+            .ADDR_A2_i(PORT_A_ADDR),
+            .CLK_A1_i(CLK1_i),
+            .CLK_A2_i(CLK1_i),
+            .REN_A1_i(REN1_i),
+            .REN_A2_i(REN1_i),
+            .WEN_A1_i(WEN1_i),
+            .WEN_A2_i(WEN1_i),
+            .BE_A1_i(WR1_BE[1:0]),
+            .BE_A2_i(WR1_BE[3:0]),
+          
+            .WDATA_B1_i(D1DATA_TOTAL[17:0]),
+            .WDATA_B2_i(D1DATA_TOTAL[35:18]),
+            .RDATA_B1_o(C1DATA_TOTAL[17:0]),
+            .RDATA_B2_o(C1DATA_TOTAL[35:18]),
+            .ADDR_B1_i(PORT_B_ADDR),
+            .ADDR_B2_i(PORT_B_ADDR),
+            .CLK_B1_i(CLK2_i),
+            .CLK_B2_i(CLK2_i),
+            .REN_B1_i(REN2_i),
+            .REN_B2_i(REN2_i),
+            .WEN_B1_i(WEN2_i),
+            .WEN_B2_i(WEN2_i),
+            .BE_B1_i(WR2_BE[1:0]),
+            .BE_B2_i(WR2_BE[3:0]),
+          
+            .FLUSH1_i(FLUSH1),
+            .FLUSH2_i(FLUSH2)
+          );          
+	end
+
+	16, 18: begin
+		assign PORT_A_ADDR = REN1_i ? (A1ADDR_TOTAL << 4) : (WEN1_i ? (B1ADDR_TOTAL << 4) : 15'd0);
+		assign PORT_B_ADDR = REN2_i ? (C1ADDR_TOTAL << 4) : (WEN2_i ? (D1ADDR_TOTAL << 4) : 15'd0);
+          defparam U1.MODE_BITS = { 1'b0,
+              11'd10, 11'd10, 4'd0, MODE_18, MODE_18, MODE_18, MODE_18, 1'd0,
+              12'd10, 12'd10, 4'd0, MODE_18, MODE_18, MODE_18, MODE_18, 1'd0
+          };
+          (* is_inferred = 1 *)
+          (* rd_data_width = DATA_WIDTH *)
+          (* wr_data_width = DATA_WIDTH *)
+          TDP36K U1 (
+            .RESET_ni(1'b1),
+            .WDATA_A1_i(B1DATA_TOTAL[17:0]),
+            .WDATA_A2_i(B1DATA_TOTAL[35:18]),
+            .RDATA_A1_o(A1DATA_TOTAL[17:0]),
+            .RDATA_A2_o(A1DATA_TOTAL[35:18]),
+            .ADDR_A1_i(PORT_A_ADDR),
+            .ADDR_A2_i(PORT_A_ADDR),
+            .CLK_A1_i(CLK1_i),
+            .CLK_A2_i(CLK1_i),
+            .REN_A1_i(REN1_i),
+            .REN_A2_i(REN1_i),
+            .WEN_A1_i(WEN1_i),
+            .WEN_A2_i(WEN1_i),
+            .BE_A1_i(WR1_BE[1:0]),
+            .BE_A2_i(WR1_BE[3:0]),
+          
+            .WDATA_B1_i(D1DATA_TOTAL[17:0]),
+            .WDATA_B2_i(D1DATA_TOTAL[35:18]),
+            .RDATA_B1_o(C1DATA_TOTAL[17:0]),
+            .RDATA_B2_o(C1DATA_TOTAL[35:18]),
+            .ADDR_B1_i(PORT_B_ADDR),
+            .ADDR_B2_i(PORT_B_ADDR),
+            .CLK_B1_i(CLK2_i),
+            .CLK_B2_i(CLK2_i),
+            .REN_B1_i(REN2_i),
+            .REN_B2_i(REN2_i),
+            .WEN_B1_i(WEN2_i),
+            .WEN_B2_i(WEN2_i),
+            .BE_B1_i(WR2_BE[1:0]),
+            .BE_B2_i(WR2_BE[3:0]),
+          
+            .FLUSH1_i(FLUSH1),
+            .FLUSH2_i(FLUSH2)
+          );          
+	end
+
+	32, 36: begin
+		assign PORT_A_ADDR = REN1_i ? (A1ADDR_TOTAL << 5) : (WEN1_i ? (B1ADDR_TOTAL << 5) : 15'd0);
+		assign PORT_B_ADDR = REN2_i ? (C1ADDR_TOTAL << 5) : (WEN2_i ? (D1ADDR_TOTAL << 5) : 15'd0);
+          defparam U1.MODE_BITS = { 1'b0,
+              11'd10, 11'd10, 4'd0, MODE_36, MODE_36, MODE_36, MODE_36, 1'd0,
+              12'd10, 12'd10, 4'd0, MODE_36, MODE_36, MODE_36, MODE_36, 1'd0
+          };
+          (* is_inferred = 1 *)
+          (* rd_data_width = DATA_WIDTH *)
+          (* wr_data_width = DATA_WIDTH *)
+          TDP36K U1 (
+            .RESET_ni(1'b1),
+            .WDATA_A1_i(B1DATA_TOTAL[17:0]),
+            .WDATA_A2_i(B1DATA_TOTAL[35:18]),
+            .RDATA_A1_o(A1DATA_TOTAL[17:0]),
+            .RDATA_A2_o(A1DATA_TOTAL[35:18]),
+            .ADDR_A1_i(PORT_A_ADDR),
+            .ADDR_A2_i(PORT_A_ADDR),
+            .CLK_A1_i(CLK1_i),
+            .CLK_A2_i(CLK1_i),
+            .REN_A1_i(REN1_i),
+            .REN_A2_i(REN1_i),
+            .WEN_A1_i(WEN1_i),
+            .WEN_A2_i(WEN1_i),
+            .BE_A1_i(WR1_BE[1:0]),
+            .BE_A2_i(WR1_BE[3:0]),
+          
+            .WDATA_B1_i(D1DATA_TOTAL[17:0]),
+            .WDATA_B2_i(D1DATA_TOTAL[35:18]),
+            .RDATA_B1_o(C1DATA_TOTAL[17:0]),
+            .RDATA_B2_o(C1DATA_TOTAL[35:18]),
+            .ADDR_B1_i(PORT_B_ADDR),
+            .ADDR_B2_i(PORT_B_ADDR),
+            .CLK_B1_i(CLK2_i),
+            .CLK_B2_i(CLK2_i),
+            .REN_B1_i(REN2_i),
+            .REN_B2_i(REN2_i),
+            .WEN_B1_i(WEN2_i),
+            .WEN_B2_i(WEN2_i),
+            .BE_B1_i(WR2_BE[1:0]),
+            .BE_B2_i(WR2_BE[3:0]),
+          
+            .FLUSH1_i(FLUSH1),
+            .FLUSH2_i(FLUSH2)
+          );          
+	end
+	default: begin
+		assign PORT_A_ADDR = REN1_i ? (A1ADDR_TOTAL << 5) : (WEN1_i ? (B1ADDR_TOTAL << 5) : 15'd0);
+		assign PORT_B_ADDR = REN2_i ? (C1ADDR_TOTAL << 5) : (WEN2_i ? (D1ADDR_TOTAL << 5) : 15'd0);
+          defparam U1.MODE_BITS = { 1'b0,
+              11'd10, 11'd10, 4'd0, MODE_36, MODE_36, MODE_36, MODE_36, 1'd0,
+              12'd10, 12'd10, 4'd0, MODE_36, MODE_36, MODE_36, MODE_36, 1'd0
+          };
+          (* is_inferred = 1 *)
+          (* rd_data_width = DATA_WIDTH *)
+          (* wr_data_width = DATA_WIDTH *)
+          TDP36K U1 (
+            .RESET_ni(1'b1),
+            .WDATA_A1_i(B1DATA_TOTAL[17:0]),
+            .WDATA_A2_i(B1DATA_TOTAL[35:18]),
+            .RDATA_A1_o(A1DATA_TOTAL[17:0]),
+            .RDATA_A2_o(A1DATA_TOTAL[35:18]),
+            .ADDR_A1_i(PORT_A_ADDR),
+            .ADDR_A2_i(PORT_A_ADDR),
+            .CLK_A1_i(CLK1_i),
+            .CLK_A2_i(CLK1_i),
+            .REN_A1_i(REN1_i),
+            .REN_A2_i(REN1_i),
+            .WEN_A1_i(WEN1_i),
+            .WEN_A2_i(WEN1_i),
+            .BE_A1_i(WR1_BE[1:0]),
+            .BE_A2_i(WR1_BE[3:0]),
+          
+            .WDATA_B1_i(D1DATA_TOTAL[17:0]),
+            .WDATA_B2_i(D1DATA_TOTAL[35:18]),
+            .RDATA_B1_o(C1DATA_TOTAL[17:0]),
+            .RDATA_B2_o(C1DATA_TOTAL[35:18]),
+            .ADDR_B1_i(PORT_B_ADDR),
+            .ADDR_B2_i(PORT_B_ADDR),
+            .CLK_B1_i(CLK2_i),
+            .CLK_B2_i(CLK2_i),
+            .REN_B1_i(REN2_i),
+            .REN_B2_i(REN2_i),
+            .WEN_B1_i(WEN2_i),
+            .WEN_B2_i(WEN2_i),
+            .BE_B1_i(WR2_BE[1:0]),
+            .BE_B2_i(WR2_BE[3:0]),
+          
+            .FLUSH1_i(FLUSH1),
+            .FLUSH2_i(FLUSH2)
+          );          
+	end
+endcase
+
+endmodule
+
+// ============================================================================
+// TDP36K write width 1 functional modes
+
+module TDP36K_BRAM_WR_X1_RD_X1_nonsplit (
+    RESET_ni,
+    WEN_A1_i,   WEN_B1_i,
+    REN_A1_i,   REN_B1_i,
+    CLK_A1_i,   CLK_B1_i,
+    BE_A1_i,    BE_B1_i,
+    ADDR_A1_i,  ADDR_B1_i,
+    WDATA_A1_i, WDATA_B1_i,
+    RDATA_A1_o, RDATA_B1_o,
+    FLUSH1_i,
+    WEN_A2_i,   WEN_B2_i,
+    REN_A2_i,   REN_B2_i,
+    CLK_A2_i,   CLK_B2_i,
+    BE_A2_i,    BE_B2_i,
+    ADDR_A2_i,  ADDR_B2_i,
+    WDATA_A2_i, WDATA_B2_i,
+    RDATA_A2_o, RDATA_B2_o,
+    FLUSH2_i
+);
+    parameter [80:0] MODE_BITS = 81'd0;
+
+    input wire RESET_ni;
+    input wire WEN_A1_i, WEN_B1_i;
+    input wire REN_A1_i, REN_B1_i;
+    input wire WEN_A2_i, WEN_B2_i;
+    input wire REN_A2_i, REN_B2_i;
+
+    (* clkbuf_sink *)
+    input wire CLK_A1_i;
+    (* clkbuf_sink *)
+    input wire CLK_B1_i;
+    (* clkbuf_sink *)
+    input wire CLK_A2_i;
+    (* clkbuf_sink *)
+    input wire CLK_B2_i;
+
+    input  wire [ 1:0] BE_A1_i,    BE_B1_i;
+    input  wire [14:0] ADDR_A1_i,  ADDR_B1_i;
+    input  wire [17:0] WDATA_A1_i, WDATA_B1_i;
+    output wire [17:0] RDATA_A1_o, RDATA_B1_o;
+
+    input  wire FLUSH1_i;
+
+    input  wire [ 1:0] BE_A2_i,    BE_B2_i;
+    input  wire [13:0] ADDR_A2_i,  ADDR_B2_i;
+    input  wire [17:0] WDATA_A2_i, WDATA_B2_i;
+    output wire [17:0] RDATA_A2_o, RDATA_B2_o;
+
+    input  wire FLUSH2_i;
+
+    TDP36K #(.MODE_BITS(MODE_BITS)) bram (
+        .RESET_ni   (RESET_ni),   
+        .WEN_A1_i   (WEN_A1_i),   .WEN_B1_i   (WEN_B1_i),
+        .REN_A1_i   (REN_A1_i),   .REN_B1_i   (REN_B1_i),
+        .CLK_A1_i   (CLK_A1_i),   .CLK_B1_i   (CLK_B1_i),
+        .BE_A1_i    (BE_A1_i),    .BE_B1_i    (BE_B1_i),
+        .ADDR_A1_i  (ADDR_A1_i),  .ADDR_B1_i  (ADDR_B1_i),
+        .WDATA_A1_i (WDATA_A1_i), .WDATA_B1_i (WDATA_B1_i),
+        .RDATA_A1_o (RDATA_A1_o), .RDATA_B1_o (RDATA_B1_o),
+        .FLUSH1_i   (FLUSH1_i),
+        .WEN_A2_i   (WEN_A2_i),   .WEN_B2_i   (WEN_B2_i),
+        .REN_A2_i   (REN_A2_i),   .REN_B2_i   (REN_B2_i),
+        .CLK_A2_i   (CLK_A2_i),   .CLK_B2_i   (CLK_B2_i),
+        .BE_A2_i    (BE_A2_i),    .BE_B2_i    (BE_B2_i),
+        .ADDR_A2_i  (ADDR_A2_i),  .ADDR_B2_i  (ADDR_B2_i),
+        .WDATA_A2_i (WDATA_A2_i), .WDATA_B2_i (WDATA_B2_i),
+        .RDATA_A2_o (RDATA_A2_o), .RDATA_B2_o (RDATA_B2_o),
+        .FLUSH2_i   (FLUSH2_i)
+    );
+
+`ifdef SDF_SIM
+	specify
+		(negedge RESET_ni => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+		(negedge RESET_ni => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+		(negedge RESET_ni => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+		(negedge RESET_ni => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+		(posedge CLK_A1_i => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+		(posedge CLK_B1_i => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+		(posedge CLK_A2_i => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+		(posedge CLK_B2_i => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+    $setuphold(posedge CLK_A1_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_A1_i, FLUSH1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, WEN_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, REN_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, BE_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, ADDR_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, WDATA_A1_i, 0, 0);
+    $setuphold(posedge CLK_B1_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_B1_i, WEN_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, REN_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, BE_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, ADDR_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, WDATA_B1_i, 0, 0);
+    $setuphold(posedge CLK_A2_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_A2_i, FLUSH2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, WEN_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, REN_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, BE_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, ADDR_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, WDATA_A2_i, 0, 0);
+    $setuphold(posedge CLK_B2_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_B2_i, WEN_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, REN_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, BE_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, ADDR_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, WDATA_B2_i, 0, 0);
+	endspecify
+`endif
+
+endmodule
+
+module TDP36K_BRAM_WR_X1_RD_X2_nonsplit (
+    RESET_ni,
+    WEN_A1_i,   WEN_B1_i,
+    REN_A1_i,   REN_B1_i,
+    CLK_A1_i,   CLK_B1_i,
+    BE_A1_i,    BE_B1_i,
+    ADDR_A1_i,  ADDR_B1_i,
+    WDATA_A1_i, WDATA_B1_i,
+    RDATA_A1_o, RDATA_B1_o,
+    FLUSH1_i,
+    WEN_A2_i,   WEN_B2_i,
+    REN_A2_i,   REN_B2_i,
+    CLK_A2_i,   CLK_B2_i,
+    BE_A2_i,    BE_B2_i,
+    ADDR_A2_i,  ADDR_B2_i,
+    WDATA_A2_i, WDATA_B2_i,
+    RDATA_A2_o, RDATA_B2_o,
+    FLUSH2_i
+);
+    parameter [80:0] MODE_BITS = 81'd0;
+
+    input  wire RESET_ni;
+    input  wire WEN_A1_i, WEN_B1_i;
+    input  wire REN_A1_i, REN_B1_i;
+    input  wire WEN_A2_i, WEN_B2_i;
+    input  wire REN_A2_i, REN_B2_i;
+
+    (* clkbuf_sink *)
+    input  wire CLK_A1_i;
+    (* clkbuf_sink *)
+    input  wire CLK_B1_i;
+    (* clkbuf_sink *)
+    input  wire CLK_A2_i;
+    (* clkbuf_sink *)
+    input  wire CLK_B2_i;
+
+    input  wire [ 1:0] BE_A1_i,    BE_B1_i;
+    input  wire [14:0] ADDR_A1_i,  ADDR_B1_i;
+    input  wire [17:0] WDATA_A1_i, WDATA_B1_i;
+    output wire [17:0] RDATA_A1_o, RDATA_B1_o;
+
+    input  wire FLUSH1_i;
+
+    input  wire [ 1:0] BE_A2_i,    BE_B2_i;
+    input  wire [13:0] ADDR_A2_i,  ADDR_B2_i;
+    input  wire [17:0] WDATA_A2_i, WDATA_B2_i;
+    output wire [17:0] RDATA_A2_o, RDATA_B2_o;
+
+    input  wire FLUSH2_i;
+
+    TDP36K #(.MODE_BITS(MODE_BITS)) bram (
+        .RESET_ni   (RESET_ni),   
+        .WEN_A1_i   (WEN_A1_i),   .WEN_B1_i   (WEN_B1_i),
+        .REN_A1_i   (REN_A1_i),   .REN_B1_i   (REN_B1_i),
+        .CLK_A1_i   (CLK_A1_i),   .CLK_B1_i   (CLK_B1_i),
+        .BE_A1_i    (BE_A1_i),    .BE_B1_i    (BE_B1_i),
+        .ADDR_A1_i  (ADDR_A1_i),  .ADDR_B1_i  (ADDR_B1_i),
+        .WDATA_A1_i (WDATA_A1_i), .WDATA_B1_i (WDATA_B1_i),
+        .RDATA_A1_o (RDATA_A1_o), .RDATA_B1_o (RDATA_B1_o),
+        .FLUSH1_i   (FLUSH1_i),
+        .WEN_A2_i   (WEN_A2_i),   .WEN_B2_i   (WEN_B2_i),
+        .REN_A2_i   (REN_A2_i),   .REN_B2_i   (REN_B2_i),
+        .CLK_A2_i   (CLK_A2_i),   .CLK_B2_i   (CLK_B2_i),
+        .BE_A2_i    (BE_A2_i),    .BE_B2_i    (BE_B2_i),
+        .ADDR_A2_i  (ADDR_A2_i),  .ADDR_B2_i  (ADDR_B2_i),
+        .WDATA_A2_i (WDATA_A2_i), .WDATA_B2_i (WDATA_B2_i),
+        .RDATA_A2_o (RDATA_A2_o), .RDATA_B2_o (RDATA_B2_o),
+        .FLUSH2_i   (FLUSH2_i)
+    );
+
+`ifdef SDF_SIM
+	specify
+		(negedge RESET_ni => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+		(negedge RESET_ni => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+		(negedge RESET_ni => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+		(negedge RESET_ni => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+		(posedge CLK_A1_i => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+		(posedge CLK_B1_i => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+		(posedge CLK_A2_i => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+		(posedge CLK_B2_i => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+    $setuphold(posedge CLK_A1_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_A1_i, FLUSH1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, WEN_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, REN_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, BE_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, ADDR_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, WDATA_A1_i, 0, 0);
+    $setuphold(posedge CLK_B1_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_B1_i, WEN_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, REN_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, BE_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, ADDR_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, WDATA_B1_i, 0, 0);
+    $setuphold(posedge CLK_A2_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_A2_i, FLUSH2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, WEN_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, REN_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, BE_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, ADDR_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, WDATA_A2_i, 0, 0);
+    $setuphold(posedge CLK_B2_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_B2_i, WEN_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, REN_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, BE_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, ADDR_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, WDATA_B2_i, 0, 0);
+	endspecify
+`endif
+
+endmodule
+
+module TDP36K_BRAM_WR_X1_RD_X4_nonsplit (
+    RESET_ni,
+    WEN_A1_i,   WEN_B1_i,
+    REN_A1_i,   REN_B1_i,
+    CLK_A1_i,   CLK_B1_i,
+    BE_A1_i,    BE_B1_i,
+    ADDR_A1_i,  ADDR_B1_i,
+    WDATA_A1_i, WDATA_B1_i,
+    RDATA_A1_o, RDATA_B1_o,
+    FLUSH1_i,
+    WEN_A2_i,   WEN_B2_i,
+    REN_A2_i,   REN_B2_i,
+    CLK_A2_i,   CLK_B2_i,
+    BE_A2_i,    BE_B2_i,
+    ADDR_A2_i,  ADDR_B2_i,
+    WDATA_A2_i, WDATA_B2_i,
+    RDATA_A2_o, RDATA_B2_o,
+    FLUSH2_i
+);
+    parameter [80:0] MODE_BITS = 81'd0;
+
+    input  wire RESET_ni;
+    input  wire WEN_A1_i, WEN_B1_i;
+    input  wire REN_A1_i, REN_B1_i;
+    input  wire WEN_A2_i, WEN_B2_i;
+    input  wire REN_A2_i, REN_B2_i;
+
+    (* clkbuf_sink *)
+    input  wire CLK_A1_i;
+    (* clkbuf_sink *)
+    input  wire CLK_B1_i;
+    (* clkbuf_sink *)
+    input  wire CLK_A2_i;
+    (* clkbuf_sink *)
+    input  wire CLK_B2_i;
+
+    input  wire [ 1:0] BE_A1_i,    BE_B1_i;
+    input  wire [14:0] ADDR_A1_i,  ADDR_B1_i;
+    input  wire [17:0] WDATA_A1_i, WDATA_B1_i;
+    output wire [17:0] RDATA_A1_o, RDATA_B1_o;
+
+    input  wire FLUSH1_i;
+
+    input  wire [ 1:0] BE_A2_i,    BE_B2_i;
+    input  wire [13:0] ADDR_A2_i,  ADDR_B2_i;
+    input  wire [17:0] WDATA_A2_i, WDATA_B2_i;
+    output wire [17:0] RDATA_A2_o, RDATA_B2_o;
+
+    input  wire FLUSH2_i;
+
+    TDP36K #(.MODE_BITS(MODE_BITS)) bram (
+        .RESET_ni   (RESET_ni),   
+        .WEN_A1_i   (WEN_A1_i),   .WEN_B1_i   (WEN_B1_i),
+        .REN_A1_i   (REN_A1_i),   .REN_B1_i   (REN_B1_i),
+        .CLK_A1_i   (CLK_A1_i),   .CLK_B1_i   (CLK_B1_i),
+        .BE_A1_i    (BE_A1_i),    .BE_B1_i    (BE_B1_i),
+        .ADDR_A1_i  (ADDR_A1_i),  .ADDR_B1_i  (ADDR_B1_i),
+        .WDATA_A1_i (WDATA_A1_i), .WDATA_B1_i (WDATA_B1_i),
+        .RDATA_A1_o (RDATA_A1_o), .RDATA_B1_o (RDATA_B1_o),
+        .FLUSH1_i   (FLUSH1_i),
+        .WEN_A2_i   (WEN_A2_i),   .WEN_B2_i   (WEN_B2_i),
+        .REN_A2_i   (REN_A2_i),   .REN_B2_i   (REN_B2_i),
+        .CLK_A2_i   (CLK_A2_i),   .CLK_B2_i   (CLK_B2_i),
+        .BE_A2_i    (BE_A2_i),    .BE_B2_i    (BE_B2_i),
+        .ADDR_A2_i  (ADDR_A2_i),  .ADDR_B2_i  (ADDR_B2_i),
+        .WDATA_A2_i (WDATA_A2_i), .WDATA_B2_i (WDATA_B2_i),
+        .RDATA_A2_o (RDATA_A2_o), .RDATA_B2_o (RDATA_B2_o),
+        .FLUSH2_i   (FLUSH2_i)
+    );
+
+`ifdef SDF_SIM
+	specify
+		(negedge RESET_ni => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+		(negedge RESET_ni => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+		(negedge RESET_ni => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+		(negedge RESET_ni => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+		(posedge CLK_A1_i => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+		(posedge CLK_B1_i => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+		(posedge CLK_A2_i => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+		(posedge CLK_B2_i => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+    $setuphold(posedge CLK_A1_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_A1_i, FLUSH1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, WEN_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, REN_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, BE_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, ADDR_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, WDATA_A1_i, 0, 0);
+    $setuphold(posedge CLK_B1_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_B1_i, WEN_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, REN_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, BE_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, ADDR_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, WDATA_B1_i, 0, 0);
+    $setuphold(posedge CLK_A2_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_A2_i, FLUSH2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, WEN_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, REN_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, BE_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, ADDR_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, WDATA_A2_i, 0, 0);
+    $setuphold(posedge CLK_B2_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_B2_i, WEN_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, REN_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, BE_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, ADDR_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, WDATA_B2_i, 0, 0);
+	endspecify
+`endif
+
+endmodule
+
+module TDP36K_BRAM_WR_X1_RD_X9_nonsplit (
+    RESET_ni,
+    WEN_A1_i,   WEN_B1_i,
+    REN_A1_i,   REN_B1_i,
+    CLK_A1_i,   CLK_B1_i,
+    BE_A1_i,    BE_B1_i,
+    ADDR_A1_i,  ADDR_B1_i,
+    WDATA_A1_i, WDATA_B1_i,
+    RDATA_A1_o, RDATA_B1_o,
+    FLUSH1_i,
+    WEN_A2_i,   WEN_B2_i,
+    REN_A2_i,   REN_B2_i,
+    CLK_A2_i,   CLK_B2_i,
+    BE_A2_i,    BE_B2_i,
+    ADDR_A2_i,  ADDR_B2_i,
+    WDATA_A2_i, WDATA_B2_i,
+    RDATA_A2_o, RDATA_B2_o,
+    FLUSH2_i
+);
+    parameter [80:0] MODE_BITS = 81'd0;
+
+    input  wire RESET_ni;
+    input  wire WEN_A1_i, WEN_B1_i;
+    input  wire REN_A1_i, REN_B1_i;
+    input  wire WEN_A2_i, WEN_B2_i;
+    input  wire REN_A2_i, REN_B2_i;
+
+    (* clkbuf_sink *)
+    input  wire CLK_A1_i;
+    (* clkbuf_sink *)
+    input  wire CLK_B1_i;
+    (* clkbuf_sink *)
+    input  wire CLK_A2_i;
+    (* clkbuf_sink *)
+    input  wire CLK_B2_i;
+
+    input  wire [ 1:0] BE_A1_i,    BE_B1_i;
+    input  wire [14:0] ADDR_A1_i,  ADDR_B1_i;
+    input  wire [17:0] WDATA_A1_i, WDATA_B1_i;
+    output wire [17:0] RDATA_A1_o, RDATA_B1_o;
+
+    input  wire FLUSH1_i;
+
+    input  wire [ 1:0] BE_A2_i,    BE_B2_i;
+    input  wire [13:0] ADDR_A2_i,  ADDR_B2_i;
+    input  wire [17:0] WDATA_A2_i, WDATA_B2_i;
+    output wire [17:0] RDATA_A2_o, RDATA_B2_o;
+
+    input  wire FLUSH2_i;
+
+    TDP36K #(.MODE_BITS(MODE_BITS)) bram (
+        .RESET_ni   (RESET_ni),   
+        .WEN_A1_i   (WEN_A1_i),   .WEN_B1_i   (WEN_B1_i),
+        .REN_A1_i   (REN_A1_i),   .REN_B1_i   (REN_B1_i),
+        .CLK_A1_i   (CLK_A1_i),   .CLK_B1_i   (CLK_B1_i),
+        .BE_A1_i    (BE_A1_i),    .BE_B1_i    (BE_B1_i),
+        .ADDR_A1_i  (ADDR_A1_i),  .ADDR_B1_i  (ADDR_B1_i),
+        .WDATA_A1_i (WDATA_A1_i), .WDATA_B1_i (WDATA_B1_i),
+        .RDATA_A1_o (RDATA_A1_o), .RDATA_B1_o (RDATA_B1_o),
+        .FLUSH1_i   (FLUSH1_i),
+        .WEN_A2_i   (WEN_A2_i),   .WEN_B2_i   (WEN_B2_i),
+        .REN_A2_i   (REN_A2_i),   .REN_B2_i   (REN_B2_i),
+        .CLK_A2_i   (CLK_A2_i),   .CLK_B2_i   (CLK_B2_i),
+        .BE_A2_i    (BE_A2_i),    .BE_B2_i    (BE_B2_i),
+        .ADDR_A2_i  (ADDR_A2_i),  .ADDR_B2_i  (ADDR_B2_i),
+        .WDATA_A2_i (WDATA_A2_i), .WDATA_B2_i (WDATA_B2_i),
+        .RDATA_A2_o (RDATA_A2_o), .RDATA_B2_o (RDATA_B2_o),
+        .FLUSH2_i   (FLUSH2_i)
+    );
+
+`ifdef SDF_SIM
+	specify
+		(negedge RESET_ni => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+		(negedge RESET_ni => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+		(negedge RESET_ni => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+		(negedge RESET_ni => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+		(posedge CLK_A1_i => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+		(posedge CLK_B1_i => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+		(posedge CLK_A2_i => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+		(posedge CLK_B2_i => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+    $setuphold(posedge CLK_A1_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_A1_i, FLUSH1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, WEN_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, REN_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, BE_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, ADDR_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, WDATA_A1_i, 0, 0);
+    $setuphold(posedge CLK_B1_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_B1_i, WEN_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, REN_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, BE_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, ADDR_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, WDATA_B1_i, 0, 0);
+    $setuphold(posedge CLK_A2_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_A2_i, FLUSH2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, WEN_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, REN_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, BE_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, ADDR_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, WDATA_A2_i, 0, 0);
+    $setuphold(posedge CLK_B2_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_B2_i, WEN_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, REN_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, BE_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, ADDR_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, WDATA_B2_i, 0, 0);
+	endspecify
+`endif
+
+endmodule
+
+module TDP36K_BRAM_WR_X1_RD_X18_nonsplit (
+    RESET_ni,
+    WEN_A1_i,   WEN_B1_i,
+    REN_A1_i,   REN_B1_i,
+    CLK_A1_i,   CLK_B1_i,
+    BE_A1_i,    BE_B1_i,
+    ADDR_A1_i,  ADDR_B1_i,
+    WDATA_A1_i, WDATA_B1_i,
+    RDATA_A1_o, RDATA_B1_o,
+    FLUSH1_i,
+    WEN_A2_i,   WEN_B2_i,
+    REN_A2_i,   REN_B2_i,
+    CLK_A2_i,   CLK_B2_i,
+    BE_A2_i,    BE_B2_i,
+    ADDR_A2_i,  ADDR_B2_i,
+    WDATA_A2_i, WDATA_B2_i,
+    RDATA_A2_o, RDATA_B2_o,
+    FLUSH2_i
+);
+    parameter [80:0] MODE_BITS = 81'd0;
+
+    input  wire RESET_ni;
+    input  wire WEN_A1_i, WEN_B1_i;
+    input  wire REN_A1_i, REN_B1_i;
+    input  wire WEN_A2_i, WEN_B2_i;
+    input  wire REN_A2_i, REN_B2_i;
+
+    (* clkbuf_sink *)
+    input  wire CLK_A1_i;
+    (* clkbuf_sink *)
+    input  wire CLK_B1_i;
+    (* clkbuf_sink *)
+    input  wire CLK_A2_i;
+    (* clkbuf_sink *)
+    input  wire CLK_B2_i;
+
+    input  wire [ 1:0] BE_A1_i,    BE_B1_i;
+    input  wire [14:0] ADDR_A1_i,  ADDR_B1_i;
+    input  wire [17:0] WDATA_A1_i, WDATA_B1_i;
+    output wire [17:0] RDATA_A1_o, RDATA_B1_o;
+
+    input  wire FLUSH1_i;
+
+    input  wire [ 1:0] BE_A2_i,    BE_B2_i;
+    input  wire [13:0] ADDR_A2_i,  ADDR_B2_i;
+    input  wire [17:0] WDATA_A2_i, WDATA_B2_i;
+    output wire [17:0] RDATA_A2_o, RDATA_B2_o;
+
+    input  wire FLUSH2_i;
+
+    TDP36K #(.MODE_BITS(MODE_BITS)) bram (
+        .RESET_ni   (RESET_ni),   
+        .WEN_A1_i   (WEN_A1_i),   .WEN_B1_i   (WEN_B1_i),
+        .REN_A1_i   (REN_A1_i),   .REN_B1_i   (REN_B1_i),
+        .CLK_A1_i   (CLK_A1_i),   .CLK_B1_i   (CLK_B1_i),
+        .BE_A1_i    (BE_A1_i),    .BE_B1_i    (BE_B1_i),
+        .ADDR_A1_i  (ADDR_A1_i),  .ADDR_B1_i  (ADDR_B1_i),
+        .WDATA_A1_i (WDATA_A1_i), .WDATA_B1_i (WDATA_B1_i),
+        .RDATA_A1_o (RDATA_A1_o), .RDATA_B1_o (RDATA_B1_o),
+        .FLUSH1_i   (FLUSH1_i),
+        .WEN_A2_i   (WEN_A2_i),   .WEN_B2_i   (WEN_B2_i),
+        .REN_A2_i   (REN_A2_i),   .REN_B2_i   (REN_B2_i),
+        .CLK_A2_i   (CLK_A2_i),   .CLK_B2_i   (CLK_B2_i),
+        .BE_A2_i    (BE_A2_i),    .BE_B2_i    (BE_B2_i),
+        .ADDR_A2_i  (ADDR_A2_i),  .ADDR_B2_i  (ADDR_B2_i),
+        .WDATA_A2_i (WDATA_A2_i), .WDATA_B2_i (WDATA_B2_i),
+        .RDATA_A2_o (RDATA_A2_o), .RDATA_B2_o (RDATA_B2_o),
+        .FLUSH2_i   (FLUSH2_i)
+    );
+
+`ifdef SDF_SIM
+	specify
+		(negedge RESET_ni => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+		(negedge RESET_ni => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+		(negedge RESET_ni => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+		(negedge RESET_ni => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+		(posedge CLK_A1_i => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+		(posedge CLK_B1_i => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+		(posedge CLK_A2_i => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+		(posedge CLK_B2_i => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+    $setuphold(posedge CLK_A1_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_A1_i, FLUSH1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, WEN_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, REN_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, BE_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, ADDR_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, WDATA_A1_i, 0, 0);
+    $setuphold(posedge CLK_B1_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_B1_i, WEN_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, REN_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, BE_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, ADDR_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, WDATA_B1_i, 0, 0);
+    $setuphold(posedge CLK_A2_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_A2_i, FLUSH2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, WEN_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, REN_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, BE_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, ADDR_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, WDATA_A2_i, 0, 0);
+    $setuphold(posedge CLK_B2_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_B2_i, WEN_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, REN_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, BE_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, ADDR_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, WDATA_B2_i, 0, 0);
+	endspecify
+`endif
+
+endmodule
+
+module TDP36K_BRAM_WR_X1_RD_X36_nonsplit (
+    RESET_ni,
+    WEN_A1_i,   WEN_B1_i,
+    REN_A1_i,   REN_B1_i,
+    CLK_A1_i,   CLK_B1_i,
+    BE_A1_i,    BE_B1_i,
+    ADDR_A1_i,  ADDR_B1_i,
+    WDATA_A1_i, WDATA_B1_i,
+    RDATA_A1_o, RDATA_B1_o,
+    FLUSH1_i,
+    WEN_A2_i,   WEN_B2_i,
+    REN_A2_i,   REN_B2_i,
+    CLK_A2_i,   CLK_B2_i,
+    BE_A2_i,    BE_B2_i,
+    ADDR_A2_i,  ADDR_B2_i,
+    WDATA_A2_i, WDATA_B2_i,
+    RDATA_A2_o, RDATA_B2_o,
+    FLUSH2_i
+);
+    parameter [80:0] MODE_BITS = 81'd0;
+
+    input  wire RESET_ni;
+    input  wire WEN_A1_i, WEN_B1_i;
+    input  wire REN_A1_i, REN_B1_i;
+    input  wire WEN_A2_i, WEN_B2_i;
+    input  wire REN_A2_i, REN_B2_i;
+
+    (* clkbuf_sink *)
+    input  wire CLK_A1_i;
+    (* clkbuf_sink *)
+    input  wire CLK_B1_i;
+    (* clkbuf_sink *)
+    input  wire CLK_A2_i;
+    (* clkbuf_sink *)
+    input  wire CLK_B2_i;
+
+    input  wire [ 1:0] BE_A1_i,    BE_B1_i;
+    input  wire [14:0] ADDR_A1_i,  ADDR_B1_i;
+    input  wire [17:0] WDATA_A1_i, WDATA_B1_i;
+    output wire [17:0] RDATA_A1_o, RDATA_B1_o;
+
+    input  wire FLUSH1_i;
+
+    input  wire [ 1:0] BE_A2_i,    BE_B2_i;
+    input  wire [13:0] ADDR_A2_i,  ADDR_B2_i;
+    input  wire [17:0] WDATA_A2_i, WDATA_B2_i;
+    output wire [17:0] RDATA_A2_o, RDATA_B2_o;
+
+    input  wire FLUSH2_i;
+
+    TDP36K #(.MODE_BITS(MODE_BITS)) bram (
+        .RESET_ni   (RESET_ni),   
+        .WEN_A1_i   (WEN_A1_i),   .WEN_B1_i   (WEN_B1_i),
+        .REN_A1_i   (REN_A1_i),   .REN_B1_i   (REN_B1_i),
+        .CLK_A1_i   (CLK_A1_i),   .CLK_B1_i   (CLK_B1_i),
+        .BE_A1_i    (BE_A1_i),    .BE_B1_i    (BE_B1_i),
+        .ADDR_A1_i  (ADDR_A1_i),  .ADDR_B1_i  (ADDR_B1_i),
+        .WDATA_A1_i (WDATA_A1_i), .WDATA_B1_i (WDATA_B1_i),
+        .RDATA_A1_o (RDATA_A1_o), .RDATA_B1_o (RDATA_B1_o),
+        .FLUSH1_i   (FLUSH1_i),
+        .WEN_A2_i   (WEN_A2_i),   .WEN_B2_i   (WEN_B2_i),
+        .REN_A2_i   (REN_A2_i),   .REN_B2_i   (REN_B2_i),
+        .CLK_A2_i   (CLK_A2_i),   .CLK_B2_i   (CLK_B2_i),
+        .BE_A2_i    (BE_A2_i),    .BE_B2_i    (BE_B2_i),
+        .ADDR_A2_i  (ADDR_A2_i),  .ADDR_B2_i  (ADDR_B2_i),
+        .WDATA_A2_i (WDATA_A2_i), .WDATA_B2_i (WDATA_B2_i),
+        .RDATA_A2_o (RDATA_A2_o), .RDATA_B2_o (RDATA_B2_o),
+        .FLUSH2_i   (FLUSH2_i)
+    );
+
+`ifdef SDF_SIM
+	specify
+		(negedge RESET_ni => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+		(negedge RESET_ni => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+		(negedge RESET_ni => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+		(negedge RESET_ni => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+		(posedge CLK_A1_i => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+		(posedge CLK_B1_i => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+		(posedge CLK_A2_i => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+		(posedge CLK_B2_i => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+    $setuphold(posedge CLK_A1_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_A1_i, FLUSH1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, WEN_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, REN_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, BE_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, ADDR_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, WDATA_A1_i, 0, 0);
+    $setuphold(posedge CLK_B1_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_B1_i, WEN_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, REN_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, BE_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, ADDR_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, WDATA_B1_i, 0, 0);
+    $setuphold(posedge CLK_A2_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_A2_i, FLUSH2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, WEN_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, REN_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, BE_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, ADDR_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, WDATA_A2_i, 0, 0);
+    $setuphold(posedge CLK_B2_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_B2_i, WEN_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, REN_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, BE_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, ADDR_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, WDATA_B2_i, 0, 0);
+	endspecify
+`endif
+
+endmodule
+
+// ============================================================================
+// TDP36K write width 2 functional modes
+
+module TDP36K_BRAM_WR_X2_RD_X1_nonsplit (
+    RESET_ni,
+    WEN_A1_i,   WEN_B1_i,
+    REN_A1_i,   REN_B1_i,
+    CLK_A1_i,   CLK_B1_i,
+    BE_A1_i,    BE_B1_i,
+    ADDR_A1_i,  ADDR_B1_i,
+    WDATA_A1_i, WDATA_B1_i,
+    RDATA_A1_o, RDATA_B1_o,
+    FLUSH1_i,
+    WEN_A2_i,   WEN_B2_i,
+    REN_A2_i,   REN_B2_i,
+    CLK_A2_i,   CLK_B2_i,
+    BE_A2_i,    BE_B2_i,
+    ADDR_A2_i,  ADDR_B2_i,
+    WDATA_A2_i, WDATA_B2_i,
+    RDATA_A2_o, RDATA_B2_o,
+    FLUSH2_i
+);
+    parameter [80:0] MODE_BITS = 81'd0;
+
+    input  wire RESET_ni;
+    input  wire WEN_A1_i, WEN_B1_i;
+    input  wire REN_A1_i, REN_B1_i;
+    input  wire WEN_A2_i, WEN_B2_i;
+    input  wire REN_A2_i, REN_B2_i;
+
+    (* clkbuf_sink *)
+    input  wire CLK_A1_i;
+    (* clkbuf_sink *)
+    input  wire CLK_B1_i;
+    (* clkbuf_sink *)
+    input  wire CLK_A2_i;
+    (* clkbuf_sink *)
+    input  wire CLK_B2_i;
+
+    input  wire [ 1:0] BE_A1_i,    BE_B1_i;
+    input  wire [14:0] ADDR_A1_i,  ADDR_B1_i;
+    input  wire [17:0] WDATA_A1_i, WDATA_B1_i;
+    output wire [17:0] RDATA_A1_o, RDATA_B1_o;
+
+    input  wire FLUSH1_i;
+
+    input  wire [ 1:0] BE_A2_i,    BE_B2_i;
+    input  wire [13:0] ADDR_A2_i,  ADDR_B2_i;
+    input  wire [17:0] WDATA_A2_i, WDATA_B2_i;
+    output wire [17:0] RDATA_A2_o, RDATA_B2_o;
+
+    input  wire FLUSH2_i;
+
+    TDP36K #(.MODE_BITS(MODE_BITS)) bram (
+        .RESET_ni   (RESET_ni),   
+        .WEN_A1_i   (WEN_A1_i),   .WEN_B1_i   (WEN_B1_i),
+        .REN_A1_i   (REN_A1_i),   .REN_B1_i   (REN_B1_i),
+        .CLK_A1_i   (CLK_A1_i),   .CLK_B1_i   (CLK_B1_i),
+        .BE_A1_i    (BE_A1_i),    .BE_B1_i    (BE_B1_i),
+        .ADDR_A1_i  (ADDR_A1_i),  .ADDR_B1_i  (ADDR_B1_i),
+        .WDATA_A1_i (WDATA_A1_i), .WDATA_B1_i (WDATA_B1_i),
+        .RDATA_A1_o (RDATA_A1_o), .RDATA_B1_o (RDATA_B1_o),
+        .FLUSH1_i   (FLUSH1_i),
+        .WEN_A2_i   (WEN_A2_i),   .WEN_B2_i   (WEN_B2_i),
+        .REN_A2_i   (REN_A2_i),   .REN_B2_i   (REN_B2_i),
+        .CLK_A2_i   (CLK_A2_i),   .CLK_B2_i   (CLK_B2_i),
+        .BE_A2_i    (BE_A2_i),    .BE_B2_i    (BE_B2_i),
+        .ADDR_A2_i  (ADDR_A2_i),  .ADDR_B2_i  (ADDR_B2_i),
+        .WDATA_A2_i (WDATA_A2_i), .WDATA_B2_i (WDATA_B2_i),
+        .RDATA_A2_o (RDATA_A2_o), .RDATA_B2_o (RDATA_B2_o),
+        .FLUSH2_i   (FLUSH2_i)
+    );
+
+`ifdef SDF_SIM
+	specify
+		(negedge RESET_ni => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+		(negedge RESET_ni => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+		(negedge RESET_ni => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+		(negedge RESET_ni => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+		(posedge CLK_A1_i => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+		(posedge CLK_B1_i => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+		(posedge CLK_A2_i => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+		(posedge CLK_B2_i => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+    $setuphold(posedge CLK_A1_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_A1_i, FLUSH1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, WEN_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, REN_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, BE_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, ADDR_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, WDATA_A1_i, 0, 0);
+    $setuphold(posedge CLK_B1_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_B1_i, WEN_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, REN_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, BE_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, ADDR_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, WDATA_B1_i, 0, 0);
+    $setuphold(posedge CLK_A2_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_A2_i, FLUSH2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, WEN_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, REN_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, BE_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, ADDR_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, WDATA_A2_i, 0, 0);
+    $setuphold(posedge CLK_B2_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_B2_i, WEN_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, REN_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, BE_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, ADDR_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, WDATA_B2_i, 0, 0);
+	endspecify
+`endif
+
+endmodule
+
+module TDP36K_BRAM_WR_X2_RD_X2_nonsplit (
+    RESET_ni,
+    WEN_A1_i,   WEN_B1_i,
+    REN_A1_i,   REN_B1_i,
+    CLK_A1_i,   CLK_B1_i,
+    BE_A1_i,    BE_B1_i,
+    ADDR_A1_i,  ADDR_B1_i,
+    WDATA_A1_i, WDATA_B1_i,
+    RDATA_A1_o, RDATA_B1_o,
+    FLUSH1_i,
+    WEN_A2_i,   WEN_B2_i,
+    REN_A2_i,   REN_B2_i,
+    CLK_A2_i,   CLK_B2_i,
+    BE_A2_i,    BE_B2_i,
+    ADDR_A2_i,  ADDR_B2_i,
+    WDATA_A2_i, WDATA_B2_i,
+    RDATA_A2_o, RDATA_B2_o,
+    FLUSH2_i
+);
+    parameter [80:0] MODE_BITS = 81'd0;
+
+    input  wire RESET_ni;
+    input  wire WEN_A1_i, WEN_B1_i;
+    input  wire REN_A1_i, REN_B1_i;
+    input  wire WEN_A2_i, WEN_B2_i;
+    input  wire REN_A2_i, REN_B2_i;
+
+    (* clkbuf_sink *)
+    input  wire CLK_A1_i;
+    (* clkbuf_sink *)
+    input  wire CLK_B1_i;
+    (* clkbuf_sink *)
+    input  wire CLK_A2_i;
+    (* clkbuf_sink *)
+    input  wire CLK_B2_i;
+
+    input  wire [ 1:0] BE_A1_i,    BE_B1_i;
+    input  wire [14:0] ADDR_A1_i,  ADDR_B1_i;
+    input  wire [17:0] WDATA_A1_i, WDATA_B1_i;
+    output wire [17:0] RDATA_A1_o, RDATA_B1_o;
+
+    input  wire FLUSH1_i;
+
+    input  wire [ 1:0] BE_A2_i,    BE_B2_i;
+    input  wire [13:0] ADDR_A2_i,  ADDR_B2_i;
+    input  wire [17:0] WDATA_A2_i, WDATA_B2_i;
+    output wire [17:0] RDATA_A2_o, RDATA_B2_o;
+
+    input  wire FLUSH2_i;
+
+    TDP36K #(.MODE_BITS(MODE_BITS)) bram (
+        .RESET_ni   (RESET_ni),   
+        .WEN_A1_i   (WEN_A1_i),   .WEN_B1_i   (WEN_B1_i),
+        .REN_A1_i   (REN_A1_i),   .REN_B1_i   (REN_B1_i),
+        .CLK_A1_i   (CLK_A1_i),   .CLK_B1_i   (CLK_B1_i),
+        .BE_A1_i    (BE_A1_i),    .BE_B1_i    (BE_B1_i),
+        .ADDR_A1_i  (ADDR_A1_i),  .ADDR_B1_i  (ADDR_B1_i),
+        .WDATA_A1_i (WDATA_A1_i), .WDATA_B1_i (WDATA_B1_i),
+        .RDATA_A1_o (RDATA_A1_o), .RDATA_B1_o (RDATA_B1_o),
+        .FLUSH1_i   (FLUSH1_i),
+        .WEN_A2_i   (WEN_A2_i),   .WEN_B2_i   (WEN_B2_i),
+        .REN_A2_i   (REN_A2_i),   .REN_B2_i   (REN_B2_i),
+        .CLK_A2_i   (CLK_A2_i),   .CLK_B2_i   (CLK_B2_i),
+        .BE_A2_i    (BE_A2_i),    .BE_B2_i    (BE_B2_i),
+        .ADDR_A2_i  (ADDR_A2_i),  .ADDR_B2_i  (ADDR_B2_i),
+        .WDATA_A2_i (WDATA_A2_i), .WDATA_B2_i (WDATA_B2_i),
+        .RDATA_A2_o (RDATA_A2_o), .RDATA_B2_o (RDATA_B2_o),
+        .FLUSH2_i   (FLUSH2_i)
+    );
+
+`ifdef SDF_SIM
+	specify
+		(negedge RESET_ni => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+		(negedge RESET_ni => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+		(negedge RESET_ni => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+		(negedge RESET_ni => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+		(posedge CLK_A1_i => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+		(posedge CLK_B1_i => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+		(posedge CLK_A2_i => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+		(posedge CLK_B2_i => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+    $setuphold(posedge CLK_A1_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_A1_i, FLUSH1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, WEN_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, REN_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, BE_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, ADDR_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, WDATA_A1_i, 0, 0);
+    $setuphold(posedge CLK_B1_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_B1_i, WEN_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, REN_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, BE_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, ADDR_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, WDATA_B1_i, 0, 0);
+    $setuphold(posedge CLK_A2_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_A2_i, FLUSH2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, WEN_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, REN_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, BE_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, ADDR_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, WDATA_A2_i, 0, 0);
+    $setuphold(posedge CLK_B2_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_B2_i, WEN_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, REN_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, BE_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, ADDR_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, WDATA_B2_i, 0, 0);
+	endspecify
+`endif
+
+endmodule
+
+module TDP36K_BRAM_WR_X2_RD_X4_nonsplit (
+    RESET_ni,
+    WEN_A1_i,   WEN_B1_i,
+    REN_A1_i,   REN_B1_i,
+    CLK_A1_i,   CLK_B1_i,
+    BE_A1_i,    BE_B1_i,
+    ADDR_A1_i,  ADDR_B1_i,
+    WDATA_A1_i, WDATA_B1_i,
+    RDATA_A1_o, RDATA_B1_o,
+    FLUSH1_i,
+    WEN_A2_i,   WEN_B2_i,
+    REN_A2_i,   REN_B2_i,
+    CLK_A2_i,   CLK_B2_i,
+    BE_A2_i,    BE_B2_i,
+    ADDR_A2_i,  ADDR_B2_i,
+    WDATA_A2_i, WDATA_B2_i,
+    RDATA_A2_o, RDATA_B2_o,
+    FLUSH2_i
+);
+    parameter [80:0] MODE_BITS = 81'd0;
+
+    input  wire RESET_ni;
+    input  wire WEN_A1_i, WEN_B1_i;
+    input  wire REN_A1_i, REN_B1_i;
+    input  wire WEN_A2_i, WEN_B2_i;
+    input  wire REN_A2_i, REN_B2_i;
+
+    (* clkbuf_sink *)
+    input  wire CLK_A1_i;
+    (* clkbuf_sink *)
+    input  wire CLK_B1_i;
+    (* clkbuf_sink *)
+    input  wire CLK_A2_i;
+    (* clkbuf_sink *)
+    input  wire CLK_B2_i;
+
+    input  wire [ 1:0] BE_A1_i,    BE_B1_i;
+    input  wire [14:0] ADDR_A1_i,  ADDR_B1_i;
+    input  wire [17:0] WDATA_A1_i, WDATA_B1_i;
+    output wire [17:0] RDATA_A1_o, RDATA_B1_o;
+
+    input  wire FLUSH1_i;
+
+    input  wire [ 1:0] BE_A2_i,    BE_B2_i;
+    input  wire [13:0] ADDR_A2_i,  ADDR_B2_i;
+    input  wire [17:0] WDATA_A2_i, WDATA_B2_i;
+    output wire [17:0] RDATA_A2_o, RDATA_B2_o;
+
+    input  wire FLUSH2_i;
+
+    TDP36K #(.MODE_BITS(MODE_BITS)) bram (
+        .RESET_ni   (RESET_ni),   
+        .WEN_A1_i   (WEN_A1_i),   .WEN_B1_i   (WEN_B1_i),
+        .REN_A1_i   (REN_A1_i),   .REN_B1_i   (REN_B1_i),
+        .CLK_A1_i   (CLK_A1_i),   .CLK_B1_i   (CLK_B1_i),
+        .BE_A1_i    (BE_A1_i),    .BE_B1_i    (BE_B1_i),
+        .ADDR_A1_i  (ADDR_A1_i),  .ADDR_B1_i  (ADDR_B1_i),
+        .WDATA_A1_i (WDATA_A1_i), .WDATA_B1_i (WDATA_B1_i),
+        .RDATA_A1_o (RDATA_A1_o), .RDATA_B1_o (RDATA_B1_o),
+        .FLUSH1_i   (FLUSH1_i),
+        .WEN_A2_i   (WEN_A2_i),   .WEN_B2_i   (WEN_B2_i),
+        .REN_A2_i   (REN_A2_i),   .REN_B2_i   (REN_B2_i),
+        .CLK_A2_i   (CLK_A2_i),   .CLK_B2_i   (CLK_B2_i),
+        .BE_A2_i    (BE_A2_i),    .BE_B2_i    (BE_B2_i),
+        .ADDR_A2_i  (ADDR_A2_i),  .ADDR_B2_i  (ADDR_B2_i),
+        .WDATA_A2_i (WDATA_A2_i), .WDATA_B2_i (WDATA_B2_i),
+        .RDATA_A2_o (RDATA_A2_o), .RDATA_B2_o (RDATA_B2_o),
+        .FLUSH2_i   (FLUSH2_i)
+    );
+
+`ifdef SDF_SIM
+	specify
+		(negedge RESET_ni => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+		(negedge RESET_ni => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+		(negedge RESET_ni => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+		(negedge RESET_ni => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+		(posedge CLK_A1_i => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+		(posedge CLK_B1_i => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+		(posedge CLK_A2_i => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+		(posedge CLK_B2_i => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+    $setuphold(posedge CLK_A1_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_A1_i, FLUSH1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, WEN_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, REN_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, BE_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, ADDR_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, WDATA_A1_i, 0, 0);
+    $setuphold(posedge CLK_B1_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_B1_i, WEN_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, REN_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, BE_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, ADDR_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, WDATA_B1_i, 0, 0);
+    $setuphold(posedge CLK_A2_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_A2_i, FLUSH2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, WEN_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, REN_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, BE_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, ADDR_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, WDATA_A2_i, 0, 0);
+    $setuphold(posedge CLK_B2_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_B2_i, WEN_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, REN_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, BE_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, ADDR_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, WDATA_B2_i, 0, 0);
+	endspecify
+`endif
+
+endmodule
+
+module TDP36K_BRAM_WR_X2_RD_X9_nonsplit (
+    RESET_ni,
+    WEN_A1_i,   WEN_B1_i,
+    REN_A1_i,   REN_B1_i,
+    CLK_A1_i,   CLK_B1_i,
+    BE_A1_i,    BE_B1_i,
+    ADDR_A1_i,  ADDR_B1_i,
+    WDATA_A1_i, WDATA_B1_i,
+    RDATA_A1_o, RDATA_B1_o,
+    FLUSH1_i,
+    WEN_A2_i,   WEN_B2_i,
+    REN_A2_i,   REN_B2_i,
+    CLK_A2_i,   CLK_B2_i,
+    BE_A2_i,    BE_B2_i,
+    ADDR_A2_i,  ADDR_B2_i,
+    WDATA_A2_i, WDATA_B2_i,
+    RDATA_A2_o, RDATA_B2_o,
+    FLUSH2_i
+);
+    parameter [80:0] MODE_BITS = 81'd0;
+
+    input  wire RESET_ni;
+    input  wire WEN_A1_i, WEN_B1_i;
+    input  wire REN_A1_i, REN_B1_i;
+    input  wire WEN_A2_i, WEN_B2_i;
+    input  wire REN_A2_i, REN_B2_i;
+
+    (* clkbuf_sink *)
+    input  wire CLK_A1_i;
+    (* clkbuf_sink *)
+    input  wire CLK_B1_i;
+    (* clkbuf_sink *)
+    input  wire CLK_A2_i;
+    (* clkbuf_sink *)
+    input  wire CLK_B2_i;
+
+    input  wire [ 1:0] BE_A1_i,    BE_B1_i;
+    input  wire [14:0] ADDR_A1_i,  ADDR_B1_i;
+    input  wire [17:0] WDATA_A1_i, WDATA_B1_i;
+    output wire [17:0] RDATA_A1_o, RDATA_B1_o;
+
+    input  wire FLUSH1_i;
+
+    input  wire [ 1:0] BE_A2_i,    BE_B2_i;
+    input  wire [13:0] ADDR_A2_i,  ADDR_B2_i;
+    input  wire [17:0] WDATA_A2_i, WDATA_B2_i;
+    output wire [17:0] RDATA_A2_o, RDATA_B2_o;
+
+    input  wire FLUSH2_i;
+
+    TDP36K #(.MODE_BITS(MODE_BITS)) bram (
+        .RESET_ni   (RESET_ni),   
+        .WEN_A1_i   (WEN_A1_i),   .WEN_B1_i   (WEN_B1_i),
+        .REN_A1_i   (REN_A1_i),   .REN_B1_i   (REN_B1_i),
+        .CLK_A1_i   (CLK_A1_i),   .CLK_B1_i   (CLK_B1_i),
+        .BE_A1_i    (BE_A1_i),    .BE_B1_i    (BE_B1_i),
+        .ADDR_A1_i  (ADDR_A1_i),  .ADDR_B1_i  (ADDR_B1_i),
+        .WDATA_A1_i (WDATA_A1_i), .WDATA_B1_i (WDATA_B1_i),
+        .RDATA_A1_o (RDATA_A1_o), .RDATA_B1_o (RDATA_B1_o),
+        .FLUSH1_i   (FLUSH1_i),
+        .WEN_A2_i   (WEN_A2_i),   .WEN_B2_i   (WEN_B2_i),
+        .REN_A2_i   (REN_A2_i),   .REN_B2_i   (REN_B2_i),
+        .CLK_A2_i   (CLK_A2_i),   .CLK_B2_i   (CLK_B2_i),
+        .BE_A2_i    (BE_A2_i),    .BE_B2_i    (BE_B2_i),
+        .ADDR_A2_i  (ADDR_A2_i),  .ADDR_B2_i  (ADDR_B2_i),
+        .WDATA_A2_i (WDATA_A2_i), .WDATA_B2_i (WDATA_B2_i),
+        .RDATA_A2_o (RDATA_A2_o), .RDATA_B2_o (RDATA_B2_o),
+        .FLUSH2_i   (FLUSH2_i)
+    );
+
+`ifdef SDF_SIM
+	specify
+		(negedge RESET_ni => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+		(negedge RESET_ni => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+		(negedge RESET_ni => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+		(negedge RESET_ni => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+		(posedge CLK_A1_i => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+		(posedge CLK_B1_i => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+		(posedge CLK_A2_i => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+		(posedge CLK_B2_i => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+    $setuphold(posedge CLK_A1_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_A1_i, FLUSH1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, WEN_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, REN_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, BE_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, ADDR_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, WDATA_A1_i, 0, 0);
+    $setuphold(posedge CLK_B1_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_B1_i, WEN_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, REN_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, BE_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, ADDR_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, WDATA_B1_i, 0, 0);
+    $setuphold(posedge CLK_A2_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_A2_i, FLUSH2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, WEN_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, REN_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, BE_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, ADDR_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, WDATA_A2_i, 0, 0);
+    $setuphold(posedge CLK_B2_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_B2_i, WEN_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, REN_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, BE_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, ADDR_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, WDATA_B2_i, 0, 0);
+	endspecify
+`endif
+
+endmodule
+
+module TDP36K_BRAM_WR_X2_RD_X18_nonsplit (
+    RESET_ni,
+    WEN_A1_i,   WEN_B1_i,
+    REN_A1_i,   REN_B1_i,
+    CLK_A1_i,   CLK_B1_i,
+    BE_A1_i,    BE_B1_i,
+    ADDR_A1_i,  ADDR_B1_i,
+    WDATA_A1_i, WDATA_B1_i,
+    RDATA_A1_o, RDATA_B1_o,
+    FLUSH1_i,
+    WEN_A2_i,   WEN_B2_i,
+    REN_A2_i,   REN_B2_i,
+    CLK_A2_i,   CLK_B2_i,
+    BE_A2_i,    BE_B2_i,
+    ADDR_A2_i,  ADDR_B2_i,
+    WDATA_A2_i, WDATA_B2_i,
+    RDATA_A2_o, RDATA_B2_o,
+    FLUSH2_i
+);
+    parameter [80:0] MODE_BITS = 81'd0;
+
+    input  wire RESET_ni;
+    input  wire WEN_A1_i, WEN_B1_i;
+    input  wire REN_A1_i, REN_B1_i;
+    input  wire WEN_A2_i, WEN_B2_i;
+    input  wire REN_A2_i, REN_B2_i;
+
+    (* clkbuf_sink *)
+    input  wire CLK_A1_i;
+    (* clkbuf_sink *)
+    input  wire CLK_B1_i;
+    (* clkbuf_sink *)
+    input  wire CLK_A2_i;
+    (* clkbuf_sink *)
+    input  wire CLK_B2_i;
+
+    input  wire [ 1:0] BE_A1_i,    BE_B1_i;
+    input  wire [14:0] ADDR_A1_i,  ADDR_B1_i;
+    input  wire [17:0] WDATA_A1_i, WDATA_B1_i;
+    output wire [17:0] RDATA_A1_o, RDATA_B1_o;
+
+    input  wire FLUSH1_i;
+
+    input  wire [ 1:0] BE_A2_i,    BE_B2_i;
+    input  wire [13:0] ADDR_A2_i,  ADDR_B2_i;
+    input  wire [17:0] WDATA_A2_i, WDATA_B2_i;
+    output wire [17:0] RDATA_A2_o, RDATA_B2_o;
+
+    input  wire FLUSH2_i;
+
+    TDP36K #(.MODE_BITS(MODE_BITS)) bram (
+        .RESET_ni   (RESET_ni),   
+        .WEN_A1_i   (WEN_A1_i),   .WEN_B1_i   (WEN_B1_i),
+        .REN_A1_i   (REN_A1_i),   .REN_B1_i   (REN_B1_i),
+        .CLK_A1_i   (CLK_A1_i),   .CLK_B1_i   (CLK_B1_i),
+        .BE_A1_i    (BE_A1_i),    .BE_B1_i    (BE_B1_i),
+        .ADDR_A1_i  (ADDR_A1_i),  .ADDR_B1_i  (ADDR_B1_i),
+        .WDATA_A1_i (WDATA_A1_i), .WDATA_B1_i (WDATA_B1_i),
+        .RDATA_A1_o (RDATA_A1_o), .RDATA_B1_o (RDATA_B1_o),
+        .FLUSH1_i   (FLUSH1_i),
+        .WEN_A2_i   (WEN_A2_i),   .WEN_B2_i   (WEN_B2_i),
+        .REN_A2_i   (REN_A2_i),   .REN_B2_i   (REN_B2_i),
+        .CLK_A2_i   (CLK_A2_i),   .CLK_B2_i   (CLK_B2_i),
+        .BE_A2_i    (BE_A2_i),    .BE_B2_i    (BE_B2_i),
+        .ADDR_A2_i  (ADDR_A2_i),  .ADDR_B2_i  (ADDR_B2_i),
+        .WDATA_A2_i (WDATA_A2_i), .WDATA_B2_i (WDATA_B2_i),
+        .RDATA_A2_o (RDATA_A2_o), .RDATA_B2_o (RDATA_B2_o),
+        .FLUSH2_i   (FLUSH2_i)
+    );
+
+`ifdef SDF_SIM
+	specify  
+		(negedge RESET_ni => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+		(negedge RESET_ni => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+		(negedge RESET_ni => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+		(negedge RESET_ni => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+		(posedge CLK_A1_i => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+		(posedge CLK_B1_i => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+		(posedge CLK_A2_i => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+		(posedge CLK_B2_i => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+    $setuphold(posedge CLK_A1_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_A1_i, FLUSH1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, WEN_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, REN_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, BE_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, ADDR_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, WDATA_A1_i, 0, 0);
+    $setuphold(posedge CLK_B1_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_B1_i, WEN_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, REN_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, BE_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, ADDR_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, WDATA_B1_i, 0, 0);
+    $setuphold(posedge CLK_A2_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_A2_i, FLUSH2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, WEN_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, REN_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, BE_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, ADDR_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, WDATA_A2_i, 0, 0);
+    $setuphold(posedge CLK_B2_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_B2_i, WEN_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, REN_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, BE_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, ADDR_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, WDATA_B2_i, 0, 0);
+	endspecify
+`endif
+
+endmodule
+
+module TDP36K_BRAM_WR_X2_RD_X36_nonsplit (
+    RESET_ni,
+    WEN_A1_i,   WEN_B1_i,
+    REN_A1_i,   REN_B1_i,
+    CLK_A1_i,   CLK_B1_i,
+    BE_A1_i,    BE_B1_i,
+    ADDR_A1_i,  ADDR_B1_i,
+    WDATA_A1_i, WDATA_B1_i,
+    RDATA_A1_o, RDATA_B1_o,
+    FLUSH1_i,
+    WEN_A2_i,   WEN_B2_i,
+    REN_A2_i,   REN_B2_i,
+    CLK_A2_i,   CLK_B2_i,
+    BE_A2_i,    BE_B2_i,
+    ADDR_A2_i,  ADDR_B2_i,
+    WDATA_A2_i, WDATA_B2_i,
+    RDATA_A2_o, RDATA_B2_o,
+    FLUSH2_i
+);
+    parameter [80:0] MODE_BITS = 81'd0;
+
+    input  wire RESET_ni;
+    input  wire WEN_A1_i, WEN_B1_i;
+    input  wire REN_A1_i, REN_B1_i;
+    input  wire WEN_A2_i, WEN_B2_i;
+    input  wire REN_A2_i, REN_B2_i;
+
+    (* clkbuf_sink *)
+    input  wire CLK_A1_i;
+    (* clkbuf_sink *)
+    input  wire CLK_B1_i;
+    (* clkbuf_sink *)
+    input  wire CLK_A2_i;
+    (* clkbuf_sink *)
+    input  wire CLK_B2_i;
+
+    input  wire [ 1:0] BE_A1_i,    BE_B1_i;
+    input  wire [14:0] ADDR_A1_i,  ADDR_B1_i;
+    input  wire [17:0] WDATA_A1_i, WDATA_B1_i;
+    output wire [17:0] RDATA_A1_o, RDATA_B1_o;
+
+    input  wire FLUSH1_i;
+
+    input  wire [ 1:0] BE_A2_i,    BE_B2_i;
+    input  wire [13:0] ADDR_A2_i,  ADDR_B2_i;
+    input  wire [17:0] WDATA_A2_i, WDATA_B2_i;
+    output wire [17:0] RDATA_A2_o, RDATA_B2_o;
+
+    input  wire FLUSH2_i;
+
+    TDP36K #(.MODE_BITS(MODE_BITS)) bram (
+        .RESET_ni   (RESET_ni),   
+        .WEN_A1_i   (WEN_A1_i),   .WEN_B1_i   (WEN_B1_i),
+        .REN_A1_i   (REN_A1_i),   .REN_B1_i   (REN_B1_i),
+        .CLK_A1_i   (CLK_A1_i),   .CLK_B1_i   (CLK_B1_i),
+        .BE_A1_i    (BE_A1_i),    .BE_B1_i    (BE_B1_i),
+        .ADDR_A1_i  (ADDR_A1_i),  .ADDR_B1_i  (ADDR_B1_i),
+        .WDATA_A1_i (WDATA_A1_i), .WDATA_B1_i (WDATA_B1_i),
+        .RDATA_A1_o (RDATA_A1_o), .RDATA_B1_o (RDATA_B1_o),
+        .FLUSH1_i   (FLUSH1_i),
+        .WEN_A2_i   (WEN_A2_i),   .WEN_B2_i   (WEN_B2_i),
+        .REN_A2_i   (REN_A2_i),   .REN_B2_i   (REN_B2_i),
+        .CLK_A2_i   (CLK_A2_i),   .CLK_B2_i   (CLK_B2_i),
+        .BE_A2_i    (BE_A2_i),    .BE_B2_i    (BE_B2_i),
+        .ADDR_A2_i  (ADDR_A2_i),  .ADDR_B2_i  (ADDR_B2_i),
+        .WDATA_A2_i (WDATA_A2_i), .WDATA_B2_i (WDATA_B2_i),
+        .RDATA_A2_o (RDATA_A2_o), .RDATA_B2_o (RDATA_B2_o),
+        .FLUSH2_i   (FLUSH2_i)
+    );
+
+`ifdef SDF_SIM
+	specify
+		(negedge RESET_ni => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+		(negedge RESET_ni => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+		(negedge RESET_ni => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+		(negedge RESET_ni => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+		(posedge CLK_A1_i => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+		(posedge CLK_B1_i => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+		(posedge CLK_A2_i => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+		(posedge CLK_B2_i => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+    $setuphold(posedge CLK_A1_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_A1_i, FLUSH1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, WEN_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, REN_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, BE_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, ADDR_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, WDATA_A1_i, 0, 0);
+    $setuphold(posedge CLK_B1_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_B1_i, WEN_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, REN_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, BE_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, ADDR_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, WDATA_B1_i, 0, 0);
+    $setuphold(posedge CLK_A2_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_A2_i, FLUSH2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, WEN_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, REN_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, BE_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, ADDR_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, WDATA_A2_i, 0, 0);
+    $setuphold(posedge CLK_B2_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_B2_i, WEN_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, REN_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, BE_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, ADDR_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, WDATA_B2_i, 0, 0);
+	endspecify
+`endif
+
+endmodule
+
+// ============================================================================
+// TDP36K write width 4 functional modes
+
+module TDP36K_BRAM_WR_X4_RD_X1_nonsplit (
+    RESET_ni,
+    WEN_A1_i,   WEN_B1_i,
+    REN_A1_i,   REN_B1_i,
+    CLK_A1_i,   CLK_B1_i,
+    BE_A1_i,    BE_B1_i,
+    ADDR_A1_i,  ADDR_B1_i,
+    WDATA_A1_i, WDATA_B1_i,
+    RDATA_A1_o, RDATA_B1_o,
+    FLUSH1_i,
+    WEN_A2_i,   WEN_B2_i,
+    REN_A2_i,   REN_B2_i,
+    CLK_A2_i,   CLK_B2_i,
+    BE_A2_i,    BE_B2_i,
+    ADDR_A2_i,  ADDR_B2_i,
+    WDATA_A2_i, WDATA_B2_i,
+    RDATA_A2_o, RDATA_B2_o,
+    FLUSH2_i
+);
+    parameter [80:0] MODE_BITS = 81'd0;
+
+    input  wire RESET_ni;
+    input  wire WEN_A1_i, WEN_B1_i;
+    input  wire REN_A1_i, REN_B1_i;
+    input  wire WEN_A2_i, WEN_B2_i;
+    input  wire REN_A2_i, REN_B2_i;
+
+    (* clkbuf_sink *)
+    input  wire CLK_A1_i;
+    (* clkbuf_sink *)
+    input  wire CLK_B1_i;
+    (* clkbuf_sink *)
+    input  wire CLK_A2_i;
+    (* clkbuf_sink *)
+    input  wire CLK_B2_i;
+
+    input  wire [ 1:0] BE_A1_i,    BE_B1_i;
+    input  wire [14:0] ADDR_A1_i,  ADDR_B1_i;
+    input  wire [17:0] WDATA_A1_i, WDATA_B1_i;
+    output wire [17:0] RDATA_A1_o, RDATA_B1_o;
+
+    input  wire FLUSH1_i;
+
+    input  wire [ 1:0] BE_A2_i,    BE_B2_i;
+    input  wire [13:0] ADDR_A2_i,  ADDR_B2_i;
+    input  wire [17:0] WDATA_A2_i, WDATA_B2_i;
+    output wire [17:0] RDATA_A2_o, RDATA_B2_o;
+
+    input  wire FLUSH2_i;
+
+    TDP36K #(.MODE_BITS(MODE_BITS)) bram (
+        .RESET_ni   (RESET_ni),   
+        .WEN_A1_i   (WEN_A1_i),   .WEN_B1_i   (WEN_B1_i),
+        .REN_A1_i   (REN_A1_i),   .REN_B1_i   (REN_B1_i),
+        .CLK_A1_i   (CLK_A1_i),   .CLK_B1_i   (CLK_B1_i),
+        .BE_A1_i    (BE_A1_i),    .BE_B1_i    (BE_B1_i),
+        .ADDR_A1_i  (ADDR_A1_i),  .ADDR_B1_i  (ADDR_B1_i),
+        .WDATA_A1_i (WDATA_A1_i), .WDATA_B1_i (WDATA_B1_i),
+        .RDATA_A1_o (RDATA_A1_o), .RDATA_B1_o (RDATA_B1_o),
+        .FLUSH1_i   (FLUSH1_i),
+        .WEN_A2_i   (WEN_A2_i),   .WEN_B2_i   (WEN_B2_i),
+        .REN_A2_i   (REN_A2_i),   .REN_B2_i   (REN_B2_i),
+        .CLK_A2_i   (CLK_A2_i),   .CLK_B2_i   (CLK_B2_i),
+        .BE_A2_i    (BE_A2_i),    .BE_B2_i    (BE_B2_i),
+        .ADDR_A2_i  (ADDR_A2_i),  .ADDR_B2_i  (ADDR_B2_i),
+        .WDATA_A2_i (WDATA_A2_i), .WDATA_B2_i (WDATA_B2_i),
+        .RDATA_A2_o (RDATA_A2_o), .RDATA_B2_o (RDATA_B2_o),
+        .FLUSH2_i   (FLUSH2_i)
+    );
+
+`ifdef SDF_SIM
+	specify
+		(negedge RESET_ni => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+		(negedge RESET_ni => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+		(negedge RESET_ni => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+		(negedge RESET_ni => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+		(posedge CLK_A1_i => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+		(posedge CLK_B1_i => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+		(posedge CLK_A2_i => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+		(posedge CLK_B2_i => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+    $setuphold(posedge CLK_A1_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_A1_i, FLUSH1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, WEN_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, REN_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, BE_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, ADDR_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, WDATA_A1_i, 0, 0);
+    $setuphold(posedge CLK_B1_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_B1_i, WEN_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, REN_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, BE_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, ADDR_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, WDATA_B1_i, 0, 0);
+    $setuphold(posedge CLK_A2_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_A2_i, FLUSH2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, WEN_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, REN_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, BE_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, ADDR_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, WDATA_A2_i, 0, 0);
+    $setuphold(posedge CLK_B2_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_B2_i, WEN_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, REN_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, BE_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, ADDR_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, WDATA_B2_i, 0, 0);
+	endspecify
+`endif
+
+endmodule
+
+module TDP36K_BRAM_WR_X4_RD_X2_nonsplit (
+    RESET_ni,
+    WEN_A1_i,   WEN_B1_i,
+    REN_A1_i,   REN_B1_i,
+    CLK_A1_i,   CLK_B1_i,
+    BE_A1_i,    BE_B1_i,
+    ADDR_A1_i,  ADDR_B1_i,
+    WDATA_A1_i, WDATA_B1_i,
+    RDATA_A1_o, RDATA_B1_o,
+    FLUSH1_i,
+    WEN_A2_i,   WEN_B2_i,
+    REN_A2_i,   REN_B2_i,
+    CLK_A2_i,   CLK_B2_i,
+    BE_A2_i,    BE_B2_i,
+    ADDR_A2_i,  ADDR_B2_i,
+    WDATA_A2_i, WDATA_B2_i,
+    RDATA_A2_o, RDATA_B2_o,
+    FLUSH2_i
+);
+    parameter [80:0] MODE_BITS = 81'd0;
+
+    input  wire RESET_ni;
+    input  wire WEN_A1_i, WEN_B1_i;
+    input  wire REN_A1_i, REN_B1_i;
+    input  wire WEN_A2_i, WEN_B2_i;
+    input  wire REN_A2_i, REN_B2_i;
+
+    (* clkbuf_sink *)
+    input  wire CLK_A1_i;
+    (* clkbuf_sink *)
+    input  wire CLK_B1_i;
+    (* clkbuf_sink *)
+    input  wire CLK_A2_i;
+    (* clkbuf_sink *)
+    input  wire CLK_B2_i;
+
+    input  wire [ 1:0] BE_A1_i,    BE_B1_i;
+    input  wire [14:0] ADDR_A1_i,  ADDR_B1_i;
+    input  wire [17:0] WDATA_A1_i, WDATA_B1_i;
+    output wire [17:0] RDATA_A1_o, RDATA_B1_o;
+
+    input  wire FLUSH1_i;
+
+    input  wire [ 1:0] BE_A2_i,    BE_B2_i;
+    input  wire [13:0] ADDR_A2_i,  ADDR_B2_i;
+    input  wire [17:0] WDATA_A2_i, WDATA_B2_i;
+    output wire [17:0] RDATA_A2_o, RDATA_B2_o;
+
+    input  wire FLUSH2_i;
+
+    TDP36K #(.MODE_BITS(MODE_BITS)) bram (
+        .RESET_ni   (RESET_ni),   
+        .WEN_A1_i   (WEN_A1_i),   .WEN_B1_i   (WEN_B1_i),
+        .REN_A1_i   (REN_A1_i),   .REN_B1_i   (REN_B1_i),
+        .CLK_A1_i   (CLK_A1_i),   .CLK_B1_i   (CLK_B1_i),
+        .BE_A1_i    (BE_A1_i),    .BE_B1_i    (BE_B1_i),
+        .ADDR_A1_i  (ADDR_A1_i),  .ADDR_B1_i  (ADDR_B1_i),
+        .WDATA_A1_i (WDATA_A1_i), .WDATA_B1_i (WDATA_B1_i),
+        .RDATA_A1_o (RDATA_A1_o), .RDATA_B1_o (RDATA_B1_o),
+        .FLUSH1_i   (FLUSH1_i),
+        .WEN_A2_i   (WEN_A2_i),   .WEN_B2_i   (WEN_B2_i),
+        .REN_A2_i   (REN_A2_i),   .REN_B2_i   (REN_B2_i),
+        .CLK_A2_i   (CLK_A2_i),   .CLK_B2_i   (CLK_B2_i),
+        .BE_A2_i    (BE_A2_i),    .BE_B2_i    (BE_B2_i),
+        .ADDR_A2_i  (ADDR_A2_i),  .ADDR_B2_i  (ADDR_B2_i),
+        .WDATA_A2_i (WDATA_A2_i), .WDATA_B2_i (WDATA_B2_i),
+        .RDATA_A2_o (RDATA_A2_o), .RDATA_B2_o (RDATA_B2_o),
+        .FLUSH2_i   (FLUSH2_i)
+    );
+
+`ifdef SDF_SIM
+	specify
+		(negedge RESET_ni => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+		(negedge RESET_ni => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+		(negedge RESET_ni => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+		(negedge RESET_ni => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+		(posedge CLK_A1_i => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+		(posedge CLK_B1_i => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+		(posedge CLK_A2_i => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+		(posedge CLK_B2_i => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+    $setuphold(posedge CLK_A1_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_A1_i, FLUSH1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, WEN_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, REN_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, BE_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, ADDR_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, WDATA_A1_i, 0, 0);
+    $setuphold(posedge CLK_B1_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_B1_i, WEN_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, REN_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, BE_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, ADDR_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, WDATA_B1_i, 0, 0);
+    $setuphold(posedge CLK_A2_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_A2_i, FLUSH2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, WEN_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, REN_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, BE_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, ADDR_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, WDATA_A2_i, 0, 0);
+    $setuphold(posedge CLK_B2_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_B2_i, WEN_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, REN_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, BE_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, ADDR_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, WDATA_B2_i, 0, 0);
+	endspecify
+`endif
+
+endmodule
+
+module TDP36K_BRAM_WR_X4_RD_X4_nonsplit (
+    RESET_ni,
+    WEN_A1_i,   WEN_B1_i,
+    REN_A1_i,   REN_B1_i,
+    CLK_A1_i,   CLK_B1_i,
+    BE_A1_i,    BE_B1_i,
+    ADDR_A1_i,  ADDR_B1_i,
+    WDATA_A1_i, WDATA_B1_i,
+    RDATA_A1_o, RDATA_B1_o,
+    FLUSH1_i,
+    WEN_A2_i,   WEN_B2_i,
+    REN_A2_i,   REN_B2_i,
+    CLK_A2_i,   CLK_B2_i,
+    BE_A2_i,    BE_B2_i,
+    ADDR_A2_i,  ADDR_B2_i,
+    WDATA_A2_i, WDATA_B2_i,
+    RDATA_A2_o, RDATA_B2_o,
+    FLUSH2_i
+);
+    parameter [80:0] MODE_BITS = 81'd0;
+
+    input  wire RESET_ni;
+    input  wire WEN_A1_i, WEN_B1_i;
+    input  wire REN_A1_i, REN_B1_i;
+    input  wire WEN_A2_i, WEN_B2_i;
+    input  wire REN_A2_i, REN_B2_i;
+
+    (* clkbuf_sink *)
+    input  wire CLK_A1_i;
+    (* clkbuf_sink *)
+    input  wire CLK_B1_i;
+    (* clkbuf_sink *)
+    input  wire CLK_A2_i;
+    (* clkbuf_sink *)
+    input  wire CLK_B2_i;
+
+    input  wire [ 1:0] BE_A1_i,    BE_B1_i;
+    input  wire [14:0] ADDR_A1_i,  ADDR_B1_i;
+    input  wire [17:0] WDATA_A1_i, WDATA_B1_i;
+    output wire [17:0] RDATA_A1_o, RDATA_B1_o;
+
+    input  wire FLUSH1_i;
+
+    input  wire [ 1:0] BE_A2_i,    BE_B2_i;
+    input  wire [13:0] ADDR_A2_i,  ADDR_B2_i;
+    input  wire [17:0] WDATA_A2_i, WDATA_B2_i;
+    output wire [17:0] RDATA_A2_o, RDATA_B2_o;
+
+    input  wire FLUSH2_i;
+
+    TDP36K #(.MODE_BITS(MODE_BITS)) bram (
+        .RESET_ni   (RESET_ni),   
+        .WEN_A1_i   (WEN_A1_i),   .WEN_B1_i   (WEN_B1_i),
+        .REN_A1_i   (REN_A1_i),   .REN_B1_i   (REN_B1_i),
+        .CLK_A1_i   (CLK_A1_i),   .CLK_B1_i   (CLK_B1_i),
+        .BE_A1_i    (BE_A1_i),    .BE_B1_i    (BE_B1_i),
+        .ADDR_A1_i  (ADDR_A1_i),  .ADDR_B1_i  (ADDR_B1_i),
+        .WDATA_A1_i (WDATA_A1_i), .WDATA_B1_i (WDATA_B1_i),
+        .RDATA_A1_o (RDATA_A1_o), .RDATA_B1_o (RDATA_B1_o),
+        .FLUSH1_i   (FLUSH1_i),
+        .WEN_A2_i   (WEN_A2_i),   .WEN_B2_i   (WEN_B2_i),
+        .REN_A2_i   (REN_A2_i),   .REN_B2_i   (REN_B2_i),
+        .CLK_A2_i   (CLK_A2_i),   .CLK_B2_i   (CLK_B2_i),
+        .BE_A2_i    (BE_A2_i),    .BE_B2_i    (BE_B2_i),
+        .ADDR_A2_i  (ADDR_A2_i),  .ADDR_B2_i  (ADDR_B2_i),
+        .WDATA_A2_i (WDATA_A2_i), .WDATA_B2_i (WDATA_B2_i),
+        .RDATA_A2_o (RDATA_A2_o), .RDATA_B2_o (RDATA_B2_o),
+        .FLUSH2_i   (FLUSH2_i)
+    );
+
+`ifdef SDF_SIM
+	specify
+		(negedge RESET_ni => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+		(negedge RESET_ni => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+		(negedge RESET_ni => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+		(negedge RESET_ni => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+		(posedge CLK_A1_i => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+		(posedge CLK_B1_i => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+		(posedge CLK_A2_i => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+		(posedge CLK_B2_i => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+    $setuphold(posedge CLK_A1_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_A1_i, FLUSH1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, WEN_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, REN_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, BE_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, ADDR_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, WDATA_A1_i, 0, 0);
+    $setuphold(posedge CLK_B1_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_B1_i, WEN_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, REN_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, BE_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, ADDR_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, WDATA_B1_i, 0, 0);
+    $setuphold(posedge CLK_A2_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_A2_i, FLUSH2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, WEN_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, REN_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, BE_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, ADDR_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, WDATA_A2_i, 0, 0);
+    $setuphold(posedge CLK_B2_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_B2_i, WEN_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, REN_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, BE_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, ADDR_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, WDATA_B2_i, 0, 0);
+	endspecify
+`endif
+
+endmodule
+
+module TDP36K_BRAM_WR_X4_RD_X9_nonsplit (
+    RESET_ni,
+    WEN_A1_i,   WEN_B1_i,
+    REN_A1_i,   REN_B1_i,
+    CLK_A1_i,   CLK_B1_i,
+    BE_A1_i,    BE_B1_i,
+    ADDR_A1_i,  ADDR_B1_i,
+    WDATA_A1_i, WDATA_B1_i,
+    RDATA_A1_o, RDATA_B1_o,
+    FLUSH1_i,
+    WEN_A2_i,   WEN_B2_i,
+    REN_A2_i,   REN_B2_i,
+    CLK_A2_i,   CLK_B2_i,
+    BE_A2_i,    BE_B2_i,
+    ADDR_A2_i,  ADDR_B2_i,
+    WDATA_A2_i, WDATA_B2_i,
+    RDATA_A2_o, RDATA_B2_o,
+    FLUSH2_i
+);
+    parameter [80:0] MODE_BITS = 81'd0;
+
+    input  wire RESET_ni;
+    input  wire WEN_A1_i, WEN_B1_i;
+    input  wire REN_A1_i, REN_B1_i;
+    input  wire WEN_A2_i, WEN_B2_i;
+    input  wire REN_A2_i, REN_B2_i;
+
+    (* clkbuf_sink *)
+    input  wire CLK_A1_i;
+    (* clkbuf_sink *)
+    input  wire CLK_B1_i;
+    (* clkbuf_sink *)
+    input  wire CLK_A2_i;
+    (* clkbuf_sink *)
+    input  wire CLK_B2_i;
+
+    input  wire [ 1:0] BE_A1_i,    BE_B1_i;
+    input  wire [14:0] ADDR_A1_i,  ADDR_B1_i;
+    input  wire [17:0] WDATA_A1_i, WDATA_B1_i;
+    output wire [17:0] RDATA_A1_o, RDATA_B1_o;
+
+    input  wire FLUSH1_i;
+
+    input  wire [ 1:0] BE_A2_i,    BE_B2_i;
+    input  wire [13:0] ADDR_A2_i,  ADDR_B2_i;
+    input  wire [17:0] WDATA_A2_i, WDATA_B2_i;
+    output wire [17:0] RDATA_A2_o, RDATA_B2_o;
+
+    input  wire FLUSH2_i;
+
+    TDP36K #(.MODE_BITS(MODE_BITS)) bram (
+        .RESET_ni   (RESET_ni),   
+        .WEN_A1_i   (WEN_A1_i),   .WEN_B1_i   (WEN_B1_i),
+        .REN_A1_i   (REN_A1_i),   .REN_B1_i   (REN_B1_i),
+        .CLK_A1_i   (CLK_A1_i),   .CLK_B1_i   (CLK_B1_i),
+        .BE_A1_i    (BE_A1_i),    .BE_B1_i    (BE_B1_i),
+        .ADDR_A1_i  (ADDR_A1_i),  .ADDR_B1_i  (ADDR_B1_i),
+        .WDATA_A1_i (WDATA_A1_i), .WDATA_B1_i (WDATA_B1_i),
+        .RDATA_A1_o (RDATA_A1_o), .RDATA_B1_o (RDATA_B1_o),
+        .FLUSH1_i   (FLUSH1_i),
+        .WEN_A2_i   (WEN_A2_i),   .WEN_B2_i   (WEN_B2_i),
+        .REN_A2_i   (REN_A2_i),   .REN_B2_i   (REN_B2_i),
+        .CLK_A2_i   (CLK_A2_i),   .CLK_B2_i   (CLK_B2_i),
+        .BE_A2_i    (BE_A2_i),    .BE_B2_i    (BE_B2_i),
+        .ADDR_A2_i  (ADDR_A2_i),  .ADDR_B2_i  (ADDR_B2_i),
+        .WDATA_A2_i (WDATA_A2_i), .WDATA_B2_i (WDATA_B2_i),
+        .RDATA_A2_o (RDATA_A2_o), .RDATA_B2_o (RDATA_B2_o),
+        .FLUSH2_i   (FLUSH2_i)
+    );
+
+`ifdef SDF_SIM
+	specify
+		(negedge RESET_ni => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+		(negedge RESET_ni => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+		(negedge RESET_ni => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+		(negedge RESET_ni => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+		(posedge CLK_A1_i => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+		(posedge CLK_B1_i => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+		(posedge CLK_A2_i => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+		(posedge CLK_B2_i => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+    $setuphold(posedge CLK_A1_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_A1_i, FLUSH1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, WEN_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, REN_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, BE_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, ADDR_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, WDATA_A1_i, 0, 0);
+    $setuphold(posedge CLK_B1_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_B1_i, WEN_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, REN_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, BE_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, ADDR_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, WDATA_B1_i, 0, 0);
+    $setuphold(posedge CLK_A2_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_A2_i, FLUSH2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, WEN_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, REN_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, BE_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, ADDR_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, WDATA_A2_i, 0, 0);
+    $setuphold(posedge CLK_B2_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_B2_i, WEN_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, REN_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, BE_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, ADDR_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, WDATA_B2_i, 0, 0);
+	endspecify
+`endif
+
+endmodule
+
+module TDP36K_BRAM_WR_X4_RD_X18_nonsplit (
+    RESET_ni,
+    WEN_A1_i,   WEN_B1_i,
+    REN_A1_i,   REN_B1_i,
+    CLK_A1_i,   CLK_B1_i,
+    BE_A1_i,    BE_B1_i,
+    ADDR_A1_i,  ADDR_B1_i,
+    WDATA_A1_i, WDATA_B1_i,
+    RDATA_A1_o, RDATA_B1_o,
+    FLUSH1_i,
+    WEN_A2_i,   WEN_B2_i,
+    REN_A2_i,   REN_B2_i,
+    CLK_A2_i,   CLK_B2_i,
+    BE_A2_i,    BE_B2_i,
+    ADDR_A2_i,  ADDR_B2_i,
+    WDATA_A2_i, WDATA_B2_i,
+    RDATA_A2_o, RDATA_B2_o,
+    FLUSH2_i
+);
+    parameter [80:0] MODE_BITS = 81'd0;
+
+    input  wire RESET_ni;
+    input  wire WEN_A1_i, WEN_B1_i;
+    input  wire REN_A1_i, REN_B1_i;
+    input  wire WEN_A2_i, WEN_B2_i;
+    input  wire REN_A2_i, REN_B2_i;
+
+    (* clkbuf_sink *)
+    input  wire CLK_A1_i;
+    (* clkbuf_sink *)
+    input  wire CLK_B1_i;
+    (* clkbuf_sink *)
+    input  wire CLK_A2_i;
+    (* clkbuf_sink *)
+    input  wire CLK_B2_i;
+
+    input  wire [ 1:0] BE_A1_i,    BE_B1_i;
+    input  wire [14:0] ADDR_A1_i,  ADDR_B1_i;
+    input  wire [17:0] WDATA_A1_i, WDATA_B1_i;
+    output wire [17:0] RDATA_A1_o, RDATA_B1_o;
+
+    input  wire FLUSH1_i;
+
+    input  wire [ 1:0] BE_A2_i,    BE_B2_i;
+    input  wire [13:0] ADDR_A2_i,  ADDR_B2_i;
+    input  wire [17:0] WDATA_A2_i, WDATA_B2_i;
+    output wire [17:0] RDATA_A2_o, RDATA_B2_o;
+
+    input  wire FLUSH2_i;
+
+    TDP36K #(.MODE_BITS(MODE_BITS)) bram (
+        .RESET_ni   (RESET_ni),   
+        .WEN_A1_i   (WEN_A1_i),   .WEN_B1_i   (WEN_B1_i),
+        .REN_A1_i   (REN_A1_i),   .REN_B1_i   (REN_B1_i),
+        .CLK_A1_i   (CLK_A1_i),   .CLK_B1_i   (CLK_B1_i),
+        .BE_A1_i    (BE_A1_i),    .BE_B1_i    (BE_B1_i),
+        .ADDR_A1_i  (ADDR_A1_i),  .ADDR_B1_i  (ADDR_B1_i),
+        .WDATA_A1_i (WDATA_A1_i), .WDATA_B1_i (WDATA_B1_i),
+        .RDATA_A1_o (RDATA_A1_o), .RDATA_B1_o (RDATA_B1_o),
+        .FLUSH1_i   (FLUSH1_i),
+        .WEN_A2_i   (WEN_A2_i),   .WEN_B2_i   (WEN_B2_i),
+        .REN_A2_i   (REN_A2_i),   .REN_B2_i   (REN_B2_i),
+        .CLK_A2_i   (CLK_A2_i),   .CLK_B2_i   (CLK_B2_i),
+        .BE_A2_i    (BE_A2_i),    .BE_B2_i    (BE_B2_i),
+        .ADDR_A2_i  (ADDR_A2_i),  .ADDR_B2_i  (ADDR_B2_i),
+        .WDATA_A2_i (WDATA_A2_i), .WDATA_B2_i (WDATA_B2_i),
+        .RDATA_A2_o (RDATA_A2_o), .RDATA_B2_o (RDATA_B2_o),
+        .FLUSH2_i   (FLUSH2_i)
+    );
+
+`ifdef SDF_SIM
+	specify
+		(negedge RESET_ni => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+		(negedge RESET_ni => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+		(negedge RESET_ni => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+		(negedge RESET_ni => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+		(posedge CLK_A1_i => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+		(posedge CLK_B1_i => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+		(posedge CLK_A2_i => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+		(posedge CLK_B2_i => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+    $setuphold(posedge CLK_A1_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_A1_i, FLUSH1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, WEN_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, REN_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, BE_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, ADDR_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, WDATA_A1_i, 0, 0);
+    $setuphold(posedge CLK_B1_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_B1_i, WEN_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, REN_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, BE_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, ADDR_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, WDATA_B1_i, 0, 0);
+    $setuphold(posedge CLK_A2_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_A2_i, FLUSH2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, WEN_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, REN_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, BE_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, ADDR_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, WDATA_A2_i, 0, 0);
+    $setuphold(posedge CLK_B2_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_B2_i, WEN_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, REN_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, BE_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, ADDR_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, WDATA_B2_i, 0, 0);
+	endspecify
+`endif
+
+endmodule
+
+module TDP36K_BRAM_WR_X4_RD_X36_nonsplit (
+    RESET_ni,
+    WEN_A1_i,   WEN_B1_i,
+    REN_A1_i,   REN_B1_i,
+    CLK_A1_i,   CLK_B1_i,
+    BE_A1_i,    BE_B1_i,
+    ADDR_A1_i,  ADDR_B1_i,
+    WDATA_A1_i, WDATA_B1_i,
+    RDATA_A1_o, RDATA_B1_o,
+    FLUSH1_i,
+    WEN_A2_i,   WEN_B2_i,
+    REN_A2_i,   REN_B2_i,
+    CLK_A2_i,   CLK_B2_i,
+    BE_A2_i,    BE_B2_i,
+    ADDR_A2_i,  ADDR_B2_i,
+    WDATA_A2_i, WDATA_B2_i,
+    RDATA_A2_o, RDATA_B2_o,
+    FLUSH2_i
+);
+    parameter [80:0] MODE_BITS = 81'd0;
+
+    input  wire RESET_ni;
+    input  wire WEN_A1_i, WEN_B1_i;
+    input  wire REN_A1_i, REN_B1_i;
+    input  wire WEN_A2_i, WEN_B2_i;
+    input  wire REN_A2_i, REN_B2_i;
+
+    (* clkbuf_sink *)
+    input  wire CLK_A1_i;
+    (* clkbuf_sink *)
+    input  wire CLK_B1_i;
+    (* clkbuf_sink *)
+    input  wire CLK_A2_i;
+    (* clkbuf_sink *)
+    input  wire CLK_B2_i;
+
+    input  wire [ 1:0] BE_A1_i,    BE_B1_i;
+    input  wire [14:0] ADDR_A1_i,  ADDR_B1_i;
+    input  wire [17:0] WDATA_A1_i, WDATA_B1_i;
+    output wire [17:0] RDATA_A1_o, RDATA_B1_o;
+
+    input  wire FLUSH1_i;
+
+    input  wire [ 1:0] BE_A2_i,    BE_B2_i;
+    input  wire [13:0] ADDR_A2_i,  ADDR_B2_i;
+    input  wire [17:0] WDATA_A2_i, WDATA_B2_i;
+    output wire [17:0] RDATA_A2_o, RDATA_B2_o;
+
+    input  wire FLUSH2_i;
+
+    TDP36K #(.MODE_BITS(MODE_BITS)) bram (
+        .RESET_ni   (RESET_ni),   
+        .WEN_A1_i   (WEN_A1_i),   .WEN_B1_i   (WEN_B1_i),
+        .REN_A1_i   (REN_A1_i),   .REN_B1_i   (REN_B1_i),
+        .CLK_A1_i   (CLK_A1_i),   .CLK_B1_i   (CLK_B1_i),
+        .BE_A1_i    (BE_A1_i),    .BE_B1_i    (BE_B1_i),
+        .ADDR_A1_i  (ADDR_A1_i),  .ADDR_B1_i  (ADDR_B1_i),
+        .WDATA_A1_i (WDATA_A1_i), .WDATA_B1_i (WDATA_B1_i),
+        .RDATA_A1_o (RDATA_A1_o), .RDATA_B1_o (RDATA_B1_o),
+        .FLUSH1_i   (FLUSH1_i),
+        .WEN_A2_i   (WEN_A2_i),   .WEN_B2_i   (WEN_B2_i),
+        .REN_A2_i   (REN_A2_i),   .REN_B2_i   (REN_B2_i),
+        .CLK_A2_i   (CLK_A2_i),   .CLK_B2_i   (CLK_B2_i),
+        .BE_A2_i    (BE_A2_i),    .BE_B2_i    (BE_B2_i),
+        .ADDR_A2_i  (ADDR_A2_i),  .ADDR_B2_i  (ADDR_B2_i),
+        .WDATA_A2_i (WDATA_A2_i), .WDATA_B2_i (WDATA_B2_i),
+        .RDATA_A2_o (RDATA_A2_o), .RDATA_B2_o (RDATA_B2_o),
+        .FLUSH2_i   (FLUSH2_i)
+    );
+
+`ifdef SDF_SIM
+	specify
+		(negedge RESET_ni => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+		(negedge RESET_ni => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+		(negedge RESET_ni => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+		(negedge RESET_ni => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+		(posedge CLK_A1_i => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+		(posedge CLK_B1_i => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+		(posedge CLK_A2_i => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+		(posedge CLK_B2_i => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+    $setuphold(posedge CLK_A1_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_A1_i, FLUSH1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, WEN_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, REN_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, BE_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, ADDR_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, WDATA_A1_i, 0, 0);
+    $setuphold(posedge CLK_B1_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_B1_i, WEN_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, REN_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, BE_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, ADDR_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, WDATA_B1_i, 0, 0);
+    $setuphold(posedge CLK_A2_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_A2_i, FLUSH2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, WEN_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, REN_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, BE_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, ADDR_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, WDATA_A2_i, 0, 0);
+    $setuphold(posedge CLK_B2_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_B2_i, WEN_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, REN_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, BE_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, ADDR_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, WDATA_B2_i, 0, 0);
+	endspecify
+`endif
+
+endmodule
+
+// ============================================================================
+// TDP36K write width 9 functional modes
+
+module TDP36K_BRAM_WR_X9_RD_X1_nonsplit (
+    RESET_ni,
+    WEN_A1_i,   WEN_B1_i,
+    REN_A1_i,   REN_B1_i,
+    CLK_A1_i,   CLK_B1_i,
+    BE_A1_i,    BE_B1_i,
+    ADDR_A1_i,  ADDR_B1_i,
+    WDATA_A1_i, WDATA_B1_i,
+    RDATA_A1_o, RDATA_B1_o,
+    FLUSH1_i,
+    WEN_A2_i,   WEN_B2_i,
+    REN_A2_i,   REN_B2_i,
+    CLK_A2_i,   CLK_B2_i,
+    BE_A2_i,    BE_B2_i,
+    ADDR_A2_i,  ADDR_B2_i,
+    WDATA_A2_i, WDATA_B2_i,
+    RDATA_A2_o, RDATA_B2_o,
+    FLUSH2_i
+);
+    parameter [80:0] MODE_BITS = 81'd0;
+
+    input  wire RESET_ni;
+    input  wire WEN_A1_i, WEN_B1_i;
+    input  wire REN_A1_i, REN_B1_i;
+    input  wire WEN_A2_i, WEN_B2_i;
+    input  wire REN_A2_i, REN_B2_i;
+
+    (* clkbuf_sink *)
+    input  wire CLK_A1_i;
+    (* clkbuf_sink *)
+    input  wire CLK_B1_i;
+    (* clkbuf_sink *)
+    input  wire CLK_A2_i;
+    (* clkbuf_sink *)
+    input  wire CLK_B2_i;
+
+    input  wire [ 1:0] BE_A1_i,    BE_B1_i;
+    input  wire [14:0] ADDR_A1_i,  ADDR_B1_i;
+    input  wire [17:0] WDATA_A1_i, WDATA_B1_i;
+    output wire [17:0] RDATA_A1_o, RDATA_B1_o;
+
+    input  wire FLUSH1_i;
+
+    input  wire [ 1:0] BE_A2_i,    BE_B2_i;
+    input  wire [13:0] ADDR_A2_i,  ADDR_B2_i;
+    input  wire [17:0] WDATA_A2_i, WDATA_B2_i;
+    output wire [17:0] RDATA_A2_o, RDATA_B2_o;
+
+    input  wire FLUSH2_i;
+
+    TDP36K #(.MODE_BITS(MODE_BITS)) bram (
+        .RESET_ni   (RESET_ni),   
+        .WEN_A1_i   (WEN_A1_i),   .WEN_B1_i   (WEN_B1_i),
+        .REN_A1_i   (REN_A1_i),   .REN_B1_i   (REN_B1_i),
+        .CLK_A1_i   (CLK_A1_i),   .CLK_B1_i   (CLK_B1_i),
+        .BE_A1_i    (BE_A1_i),    .BE_B1_i    (BE_B1_i),
+        .ADDR_A1_i  (ADDR_A1_i),  .ADDR_B1_i  (ADDR_B1_i),
+        .WDATA_A1_i (WDATA_A1_i), .WDATA_B1_i (WDATA_B1_i),
+        .RDATA_A1_o (RDATA_A1_o), .RDATA_B1_o (RDATA_B1_o),
+        .FLUSH1_i   (FLUSH1_i),
+        .WEN_A2_i   (WEN_A2_i),   .WEN_B2_i   (WEN_B2_i),
+        .REN_A2_i   (REN_A2_i),   .REN_B2_i   (REN_B2_i),
+        .CLK_A2_i   (CLK_A2_i),   .CLK_B2_i   (CLK_B2_i),
+        .BE_A2_i    (BE_A2_i),    .BE_B2_i    (BE_B2_i),
+        .ADDR_A2_i  (ADDR_A2_i),  .ADDR_B2_i  (ADDR_B2_i),
+        .WDATA_A2_i (WDATA_A2_i), .WDATA_B2_i (WDATA_B2_i),
+        .RDATA_A2_o (RDATA_A2_o), .RDATA_B2_o (RDATA_B2_o),
+        .FLUSH2_i   (FLUSH2_i)
+    );
+
+`ifdef SDF_SIM
+	specify
+		(negedge RESET_ni => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+		(negedge RESET_ni => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+		(negedge RESET_ni => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+		(negedge RESET_ni => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+		(posedge CLK_A1_i => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+		(posedge CLK_B1_i => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+		(posedge CLK_A2_i => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+		(posedge CLK_B2_i => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+    $setuphold(posedge CLK_A1_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_A1_i, FLUSH1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, WEN_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, REN_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, BE_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, ADDR_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, WDATA_A1_i, 0, 0);
+    $setuphold(posedge CLK_B1_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_B1_i, WEN_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, REN_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, BE_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, ADDR_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, WDATA_B1_i, 0, 0);
+    $setuphold(posedge CLK_A2_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_A2_i, FLUSH2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, WEN_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, REN_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, BE_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, ADDR_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, WDATA_A2_i, 0, 0);
+    $setuphold(posedge CLK_B2_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_B2_i, WEN_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, REN_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, BE_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, ADDR_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, WDATA_B2_i, 0, 0);
+	endspecify
+`endif
+
+endmodule
+
+module TDP36K_BRAM_WR_X9_RD_X2_nonsplit (
+    RESET_ni,
+    WEN_A1_i,   WEN_B1_i,
+    REN_A1_i,   REN_B1_i,
+    CLK_A1_i,   CLK_B1_i,
+    BE_A1_i,    BE_B1_i,
+    ADDR_A1_i,  ADDR_B1_i,
+    WDATA_A1_i, WDATA_B1_i,
+    RDATA_A1_o, RDATA_B1_o,
+    FLUSH1_i,
+    WEN_A2_i,   WEN_B2_i,
+    REN_A2_i,   REN_B2_i,
+    CLK_A2_i,   CLK_B2_i,
+    BE_A2_i,    BE_B2_i,
+    ADDR_A2_i,  ADDR_B2_i,
+    WDATA_A2_i, WDATA_B2_i,
+    RDATA_A2_o, RDATA_B2_o,
+    FLUSH2_i
+);
+    parameter [80:0] MODE_BITS = 81'd0;
+
+    input  wire RESET_ni;
+    input  wire WEN_A1_i, WEN_B1_i;
+    input  wire REN_A1_i, REN_B1_i;
+    input  wire WEN_A2_i, WEN_B2_i;
+    input  wire REN_A2_i, REN_B2_i;
+
+    (* clkbuf_sink *)
+    input  wire CLK_A1_i;
+    (* clkbuf_sink *)
+    input  wire CLK_B1_i;
+    (* clkbuf_sink *)
+    input  wire CLK_A2_i;
+    (* clkbuf_sink *)
+    input  wire CLK_B2_i;
+
+    input  wire [ 1:0] BE_A1_i,    BE_B1_i;
+    input  wire [14:0] ADDR_A1_i,  ADDR_B1_i;
+    input  wire [17:0] WDATA_A1_i, WDATA_B1_i;
+    output wire [17:0] RDATA_A1_o, RDATA_B1_o;
+
+    input  wire FLUSH1_i;
+
+    input  wire [ 1:0] BE_A2_i,    BE_B2_i;
+    input  wire [13:0] ADDR_A2_i,  ADDR_B2_i;
+    input  wire [17:0] WDATA_A2_i, WDATA_B2_i;
+    output wire [17:0] RDATA_A2_o, RDATA_B2_o;
+
+    input  wire FLUSH2_i;
+
+    TDP36K #(.MODE_BITS(MODE_BITS)) bram (
+        .RESET_ni   (RESET_ni),   
+        .WEN_A1_i   (WEN_A1_i),   .WEN_B1_i   (WEN_B1_i),
+        .REN_A1_i   (REN_A1_i),   .REN_B1_i   (REN_B1_i),
+        .CLK_A1_i   (CLK_A1_i),   .CLK_B1_i   (CLK_B1_i),
+        .BE_A1_i    (BE_A1_i),    .BE_B1_i    (BE_B1_i),
+        .ADDR_A1_i  (ADDR_A1_i),  .ADDR_B1_i  (ADDR_B1_i),
+        .WDATA_A1_i (WDATA_A1_i), .WDATA_B1_i (WDATA_B1_i),
+        .RDATA_A1_o (RDATA_A1_o), .RDATA_B1_o (RDATA_B1_o),
+        .FLUSH1_i   (FLUSH1_i),
+        .WEN_A2_i   (WEN_A2_i),   .WEN_B2_i   (WEN_B2_i),
+        .REN_A2_i   (REN_A2_i),   .REN_B2_i   (REN_B2_i),
+        .CLK_A2_i   (CLK_A2_i),   .CLK_B2_i   (CLK_B2_i),
+        .BE_A2_i    (BE_A2_i),    .BE_B2_i    (BE_B2_i),
+        .ADDR_A2_i  (ADDR_A2_i),  .ADDR_B2_i  (ADDR_B2_i),
+        .WDATA_A2_i (WDATA_A2_i), .WDATA_B2_i (WDATA_B2_i),
+        .RDATA_A2_o (RDATA_A2_o), .RDATA_B2_o (RDATA_B2_o),
+        .FLUSH2_i   (FLUSH2_i)
+    );
+
+`ifdef SDF_SIM
+	specify
+		(negedge RESET_ni => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+		(negedge RESET_ni => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+		(negedge RESET_ni => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+		(negedge RESET_ni => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+		(posedge CLK_A1_i => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+		(posedge CLK_B1_i => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+		(posedge CLK_A2_i => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+		(posedge CLK_B2_i => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+    $setuphold(posedge CLK_A1_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_A1_i, FLUSH1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, WEN_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, REN_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, BE_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, ADDR_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, WDATA_A1_i, 0, 0);
+    $setuphold(posedge CLK_B1_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_B1_i, WEN_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, REN_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, BE_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, ADDR_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, WDATA_B1_i, 0, 0);
+    $setuphold(posedge CLK_A2_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_A2_i, FLUSH2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, WEN_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, REN_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, BE_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, ADDR_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, WDATA_A2_i, 0, 0);
+    $setuphold(posedge CLK_B2_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_B2_i, WEN_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, REN_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, BE_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, ADDR_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, WDATA_B2_i, 0, 0);
+	endspecify
+`endif
+
+endmodule
+
+module TDP36K_BRAM_WR_X9_RD_X4_nonsplit (
+    RESET_ni,
+    WEN_A1_i,   WEN_B1_i,
+    REN_A1_i,   REN_B1_i,
+    CLK_A1_i,   CLK_B1_i,
+    BE_A1_i,    BE_B1_i,
+    ADDR_A1_i,  ADDR_B1_i,
+    WDATA_A1_i, WDATA_B1_i,
+    RDATA_A1_o, RDATA_B1_o,
+    FLUSH1_i,
+    WEN_A2_i,   WEN_B2_i,
+    REN_A2_i,   REN_B2_i,
+    CLK_A2_i,   CLK_B2_i,
+    BE_A2_i,    BE_B2_i,
+    ADDR_A2_i,  ADDR_B2_i,
+    WDATA_A2_i, WDATA_B2_i,
+    RDATA_A2_o, RDATA_B2_o,
+    FLUSH2_i
+);
+    parameter [80:0] MODE_BITS = 81'd0;
+
+    input  wire RESET_ni;
+    input  wire WEN_A1_i, WEN_B1_i;
+    input  wire REN_A1_i, REN_B1_i;
+    input  wire WEN_A2_i, WEN_B2_i;
+    input  wire REN_A2_i, REN_B2_i;
+
+    (* clkbuf_sink *)
+    input  wire CLK_A1_i;
+    (* clkbuf_sink *)
+    input  wire CLK_B1_i;
+    (* clkbuf_sink *)
+    input  wire CLK_A2_i;
+    (* clkbuf_sink *)
+    input  wire CLK_B2_i;
+
+    input  wire [ 1:0] BE_A1_i,    BE_B1_i;
+    input  wire [14:0] ADDR_A1_i,  ADDR_B1_i;
+    input  wire [17:0] WDATA_A1_i, WDATA_B1_i;
+    output wire [17:0] RDATA_A1_o, RDATA_B1_o;
+
+    input  wire FLUSH1_i;
+
+    input  wire [ 1:0] BE_A2_i,    BE_B2_i;
+    input  wire [13:0] ADDR_A2_i,  ADDR_B2_i;
+    input  wire [17:0] WDATA_A2_i, WDATA_B2_i;
+    output wire [17:0] RDATA_A2_o, RDATA_B2_o;
+
+    input  wire FLUSH2_i;
+
+    TDP36K #(.MODE_BITS(MODE_BITS)) bram (
+        .RESET_ni   (RESET_ni),   
+        .WEN_A1_i   (WEN_A1_i),   .WEN_B1_i   (WEN_B1_i),
+        .REN_A1_i   (REN_A1_i),   .REN_B1_i   (REN_B1_i),
+        .CLK_A1_i   (CLK_A1_i),   .CLK_B1_i   (CLK_B1_i),
+        .BE_A1_i    (BE_A1_i),    .BE_B1_i    (BE_B1_i),
+        .ADDR_A1_i  (ADDR_A1_i),  .ADDR_B1_i  (ADDR_B1_i),
+        .WDATA_A1_i (WDATA_A1_i), .WDATA_B1_i (WDATA_B1_i),
+        .RDATA_A1_o (RDATA_A1_o), .RDATA_B1_o (RDATA_B1_o),
+        .FLUSH1_i   (FLUSH1_i),
+        .WEN_A2_i   (WEN_A2_i),   .WEN_B2_i   (WEN_B2_i),
+        .REN_A2_i   (REN_A2_i),   .REN_B2_i   (REN_B2_i),
+        .CLK_A2_i   (CLK_A2_i),   .CLK_B2_i   (CLK_B2_i),
+        .BE_A2_i    (BE_A2_i),    .BE_B2_i    (BE_B2_i),
+        .ADDR_A2_i  (ADDR_A2_i),  .ADDR_B2_i  (ADDR_B2_i),
+        .WDATA_A2_i (WDATA_A2_i), .WDATA_B2_i (WDATA_B2_i),
+        .RDATA_A2_o (RDATA_A2_o), .RDATA_B2_o (RDATA_B2_o),
+        .FLUSH2_i   (FLUSH2_i)
+    );
+
+`ifdef SDF_SIM
+	specify
+		(negedge RESET_ni => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+		(negedge RESET_ni => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+		(negedge RESET_ni => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+		(negedge RESET_ni => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+		(posedge CLK_A1_i => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+		(posedge CLK_B1_i => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+		(posedge CLK_A2_i => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+		(posedge CLK_B2_i => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+    $setuphold(posedge CLK_A1_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_A1_i, FLUSH1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, WEN_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, REN_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, BE_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, ADDR_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, WDATA_A1_i, 0, 0);
+    $setuphold(posedge CLK_B1_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_B1_i, WEN_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, REN_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, BE_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, ADDR_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, WDATA_B1_i, 0, 0);
+    $setuphold(posedge CLK_A2_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_A2_i, FLUSH2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, WEN_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, REN_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, BE_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, ADDR_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, WDATA_A2_i, 0, 0);
+    $setuphold(posedge CLK_B2_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_B2_i, WEN_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, REN_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, BE_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, ADDR_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, WDATA_B2_i, 0, 0);
+	endspecify
+`endif
+
+endmodule
+
+module TDP36K_BRAM_WR_X9_RD_X9_nonsplit (
+    RESET_ni,
+    WEN_A1_i,   WEN_B1_i,
+    REN_A1_i,   REN_B1_i,
+    CLK_A1_i,   CLK_B1_i,
+    BE_A1_i,    BE_B1_i,
+    ADDR_A1_i,  ADDR_B1_i,
+    WDATA_A1_i, WDATA_B1_i,
+    RDATA_A1_o, RDATA_B1_o,
+    FLUSH1_i,
+    WEN_A2_i,   WEN_B2_i,
+    REN_A2_i,   REN_B2_i,
+    CLK_A2_i,   CLK_B2_i,
+    BE_A2_i,    BE_B2_i,
+    ADDR_A2_i,  ADDR_B2_i,
+    WDATA_A2_i, WDATA_B2_i,
+    RDATA_A2_o, RDATA_B2_o,
+    FLUSH2_i
+);
+    parameter [80:0] MODE_BITS = 81'd0;
+
+    input  wire RESET_ni;
+    input  wire WEN_A1_i, WEN_B1_i;
+    input  wire REN_A1_i, REN_B1_i;
+    input  wire WEN_A2_i, WEN_B2_i;
+    input  wire REN_A2_i, REN_B2_i;
+
+    (* clkbuf_sink *)
+    input  wire CLK_A1_i;
+    (* clkbuf_sink *)
+    input  wire CLK_B1_i;
+    (* clkbuf_sink *)
+    input  wire CLK_A2_i;
+    (* clkbuf_sink *)
+    input  wire CLK_B2_i;
+
+    input  wire [ 1:0] BE_A1_i,    BE_B1_i;
+    input  wire [14:0] ADDR_A1_i,  ADDR_B1_i;
+    input  wire [17:0] WDATA_A1_i, WDATA_B1_i;
+    output wire [17:0] RDATA_A1_o, RDATA_B1_o;
+
+    input  wire FLUSH1_i;
+
+    input  wire [ 1:0] BE_A2_i,    BE_B2_i;
+    input  wire [13:0] ADDR_A2_i,  ADDR_B2_i;
+    input  wire [17:0] WDATA_A2_i, WDATA_B2_i;
+    output wire [17:0] RDATA_A2_o, RDATA_B2_o;
+
+    input  wire FLUSH2_i;
+
+    TDP36K #(.MODE_BITS(MODE_BITS)) bram (
+        .RESET_ni   (RESET_ni),   
+        .WEN_A1_i   (WEN_A1_i),   .WEN_B1_i   (WEN_B1_i),
+        .REN_A1_i   (REN_A1_i),   .REN_B1_i   (REN_B1_i),
+        .CLK_A1_i   (CLK_A1_i),   .CLK_B1_i   (CLK_B1_i),
+        .BE_A1_i    (BE_A1_i),    .BE_B1_i    (BE_B1_i),
+        .ADDR_A1_i  (ADDR_A1_i),  .ADDR_B1_i  (ADDR_B1_i),
+        .WDATA_A1_i (WDATA_A1_i), .WDATA_B1_i (WDATA_B1_i),
+        .RDATA_A1_o (RDATA_A1_o), .RDATA_B1_o (RDATA_B1_o),
+        .FLUSH1_i   (FLUSH1_i),
+        .WEN_A2_i   (WEN_A2_i),   .WEN_B2_i   (WEN_B2_i),
+        .REN_A2_i   (REN_A2_i),   .REN_B2_i   (REN_B2_i),
+        .CLK_A2_i   (CLK_A2_i),   .CLK_B2_i   (CLK_B2_i),
+        .BE_A2_i    (BE_A2_i),    .BE_B2_i    (BE_B2_i),
+        .ADDR_A2_i  (ADDR_A2_i),  .ADDR_B2_i  (ADDR_B2_i),
+        .WDATA_A2_i (WDATA_A2_i), .WDATA_B2_i (WDATA_B2_i),
+        .RDATA_A2_o (RDATA_A2_o), .RDATA_B2_o (RDATA_B2_o),
+        .FLUSH2_i   (FLUSH2_i)
+    );
+
+`ifdef SDF_SIM
+	specify
+		(negedge RESET_ni => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+		(negedge RESET_ni => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+		(negedge RESET_ni => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+		(negedge RESET_ni => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+		(posedge CLK_A1_i => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+		(posedge CLK_B1_i => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+		(posedge CLK_A2_i => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+		(posedge CLK_B2_i => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+    $setuphold(posedge CLK_A1_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_A1_i, FLUSH1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, WEN_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, REN_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, BE_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, ADDR_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, WDATA_A1_i, 0, 0);
+    $setuphold(posedge CLK_B1_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_B1_i, WEN_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, REN_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, BE_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, ADDR_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, WDATA_B1_i, 0, 0);
+    $setuphold(posedge CLK_A2_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_A2_i, FLUSH2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, WEN_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, REN_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, BE_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, ADDR_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, WDATA_A2_i, 0, 0);
+    $setuphold(posedge CLK_B2_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_B2_i, WEN_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, REN_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, BE_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, ADDR_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, WDATA_B2_i, 0, 0);
+	endspecify
+`endif
+
+endmodule
+
+module TDP36K_BRAM_WR_X9_RD_X18_nonsplit (
+    RESET_ni,
+    WEN_A1_i,   WEN_B1_i,
+    REN_A1_i,   REN_B1_i,
+    CLK_A1_i,   CLK_B1_i,
+    BE_A1_i,    BE_B1_i,
+    ADDR_A1_i,  ADDR_B1_i,
+    WDATA_A1_i, WDATA_B1_i,
+    RDATA_A1_o, RDATA_B1_o,
+    FLUSH1_i,
+    WEN_A2_i,   WEN_B2_i,
+    REN_A2_i,   REN_B2_i,
+    CLK_A2_i,   CLK_B2_i,
+    BE_A2_i,    BE_B2_i,
+    ADDR_A2_i,  ADDR_B2_i,
+    WDATA_A2_i, WDATA_B2_i,
+    RDATA_A2_o, RDATA_B2_o,
+    FLUSH2_i
+);
+    parameter [80:0] MODE_BITS = 81'd0;
+
+    input  wire RESET_ni;
+    input  wire WEN_A1_i, WEN_B1_i;
+    input  wire REN_A1_i, REN_B1_i;
+    input  wire WEN_A2_i, WEN_B2_i;
+    input  wire REN_A2_i, REN_B2_i;
+
+    (* clkbuf_sink *)
+    input  wire CLK_A1_i;
+    (* clkbuf_sink *)
+    input  wire CLK_B1_i;
+    (* clkbuf_sink *)
+    input  wire CLK_A2_i;
+    (* clkbuf_sink *)
+    input  wire CLK_B2_i;
+
+    input  wire [ 1:0] BE_A1_i,    BE_B1_i;
+    input  wire [14:0] ADDR_A1_i,  ADDR_B1_i;
+    input  wire [17:0] WDATA_A1_i, WDATA_B1_i;
+    output wire [17:0] RDATA_A1_o, RDATA_B1_o;
+
+    input  wire FLUSH1_i;
+
+    input  wire [ 1:0] BE_A2_i,    BE_B2_i;
+    input  wire [13:0] ADDR_A2_i,  ADDR_B2_i;
+    input  wire [17:0] WDATA_A2_i, WDATA_B2_i;
+    output wire [17:0] RDATA_A2_o, RDATA_B2_o;
+
+    input  wire FLUSH2_i;
+
+    TDP36K #(.MODE_BITS(MODE_BITS)) bram (
+        .RESET_ni   (RESET_ni),   
+        .WEN_A1_i   (WEN_A1_i),   .WEN_B1_i   (WEN_B1_i),
+        .REN_A1_i   (REN_A1_i),   .REN_B1_i   (REN_B1_i),
+        .CLK_A1_i   (CLK_A1_i),   .CLK_B1_i   (CLK_B1_i),
+        .BE_A1_i    (BE_A1_i),    .BE_B1_i    (BE_B1_i),
+        .ADDR_A1_i  (ADDR_A1_i),  .ADDR_B1_i  (ADDR_B1_i),
+        .WDATA_A1_i (WDATA_A1_i), .WDATA_B1_i (WDATA_B1_i),
+        .RDATA_A1_o (RDATA_A1_o), .RDATA_B1_o (RDATA_B1_o),
+        .FLUSH1_i   (FLUSH1_i),
+        .WEN_A2_i   (WEN_A2_i),   .WEN_B2_i   (WEN_B2_i),
+        .REN_A2_i   (REN_A2_i),   .REN_B2_i   (REN_B2_i),
+        .CLK_A2_i   (CLK_A2_i),   .CLK_B2_i   (CLK_B2_i),
+        .BE_A2_i    (BE_A2_i),    .BE_B2_i    (BE_B2_i),
+        .ADDR_A2_i  (ADDR_A2_i),  .ADDR_B2_i  (ADDR_B2_i),
+        .WDATA_A2_i (WDATA_A2_i), .WDATA_B2_i (WDATA_B2_i),
+        .RDATA_A2_o (RDATA_A2_o), .RDATA_B2_o (RDATA_B2_o),
+        .FLUSH2_i   (FLUSH2_i)
+    );
+
+`ifdef SDF_SIM
+	specify
+		(negedge RESET_ni => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+		(negedge RESET_ni => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+		(negedge RESET_ni => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+		(negedge RESET_ni => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+		(posedge CLK_A1_i => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+		(posedge CLK_B1_i => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+		(posedge CLK_A2_i => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+		(posedge CLK_B2_i => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+    $setuphold(posedge CLK_A1_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_A1_i, FLUSH1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, WEN_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, REN_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, BE_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, ADDR_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, WDATA_A1_i, 0, 0);
+    $setuphold(posedge CLK_B1_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_B1_i, WEN_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, REN_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, BE_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, ADDR_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, WDATA_B1_i, 0, 0);
+    $setuphold(posedge CLK_A2_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_A2_i, FLUSH2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, WEN_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, REN_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, BE_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, ADDR_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, WDATA_A2_i, 0, 0);
+    $setuphold(posedge CLK_B2_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_B2_i, WEN_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, REN_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, BE_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, ADDR_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, WDATA_B2_i, 0, 0);
+	endspecify
+`endif
+
+endmodule
+
+module TDP36K_BRAM_WR_X9_RD_X36_nonsplit (
+    RESET_ni,
+    WEN_A1_i,   WEN_B1_i,
+    REN_A1_i,   REN_B1_i,
+    CLK_A1_i,   CLK_B1_i,
+    BE_A1_i,    BE_B1_i,
+    ADDR_A1_i,  ADDR_B1_i,
+    WDATA_A1_i, WDATA_B1_i,
+    RDATA_A1_o, RDATA_B1_o,
+    FLUSH1_i,
+    WEN_A2_i,   WEN_B2_i,
+    REN_A2_i,   REN_B2_i,
+    CLK_A2_i,   CLK_B2_i,
+    BE_A2_i,    BE_B2_i,
+    ADDR_A2_i,  ADDR_B2_i,
+    WDATA_A2_i, WDATA_B2_i,
+    RDATA_A2_o, RDATA_B2_o,
+    FLUSH2_i
+);
+    parameter [80:0] MODE_BITS = 81'd0;
+
+    input  wire RESET_ni;
+    input  wire WEN_A1_i, WEN_B1_i;
+    input  wire REN_A1_i, REN_B1_i;
+    input  wire WEN_A2_i, WEN_B2_i;
+    input  wire REN_A2_i, REN_B2_i;
+
+    (* clkbuf_sink *)
+    input  wire CLK_A1_i;
+    (* clkbuf_sink *)
+    input  wire CLK_B1_i;
+    (* clkbuf_sink *)
+    input  wire CLK_A2_i;
+    (* clkbuf_sink *)
+    input  wire CLK_B2_i;
+
+    input  wire [ 1:0] BE_A1_i,    BE_B1_i;
+    input  wire [14:0] ADDR_A1_i,  ADDR_B1_i;
+    input  wire [17:0] WDATA_A1_i, WDATA_B1_i;
+    output wire [17:0] RDATA_A1_o, RDATA_B1_o;
+
+    input  wire FLUSH1_i;
+
+    input  wire [ 1:0] BE_A2_i,    BE_B2_i;
+    input  wire [13:0] ADDR_A2_i,  ADDR_B2_i;
+    input  wire [17:0] WDATA_A2_i, WDATA_B2_i;
+    output wire [17:0] RDATA_A2_o, RDATA_B2_o;
+
+    input  wire FLUSH2_i;
+
+    TDP36K #(.MODE_BITS(MODE_BITS)) bram (
+        .RESET_ni   (RESET_ni),   
+        .WEN_A1_i   (WEN_A1_i),   .WEN_B1_i   (WEN_B1_i),
+        .REN_A1_i   (REN_A1_i),   .REN_B1_i   (REN_B1_i),
+        .CLK_A1_i   (CLK_A1_i),   .CLK_B1_i   (CLK_B1_i),
+        .BE_A1_i    (BE_A1_i),    .BE_B1_i    (BE_B1_i),
+        .ADDR_A1_i  (ADDR_A1_i),  .ADDR_B1_i  (ADDR_B1_i),
+        .WDATA_A1_i (WDATA_A1_i), .WDATA_B1_i (WDATA_B1_i),
+        .RDATA_A1_o (RDATA_A1_o), .RDATA_B1_o (RDATA_B1_o),
+        .FLUSH1_i   (FLUSH1_i),
+        .WEN_A2_i   (WEN_A2_i),   .WEN_B2_i   (WEN_B2_i),
+        .REN_A2_i   (REN_A2_i),   .REN_B2_i   (REN_B2_i),
+        .CLK_A2_i   (CLK_A2_i),   .CLK_B2_i   (CLK_B2_i),
+        .BE_A2_i    (BE_A2_i),    .BE_B2_i    (BE_B2_i),
+        .ADDR_A2_i  (ADDR_A2_i),  .ADDR_B2_i  (ADDR_B2_i),
+        .WDATA_A2_i (WDATA_A2_i), .WDATA_B2_i (WDATA_B2_i),
+        .RDATA_A2_o (RDATA_A2_o), .RDATA_B2_o (RDATA_B2_o),
+        .FLUSH2_i   (FLUSH2_i)
+    );
+
+`ifdef SDF_SIM
+	specify
+		(negedge RESET_ni => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+		(negedge RESET_ni => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+		(negedge RESET_ni => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+		(negedge RESET_ni => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+		(posedge CLK_A1_i => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+		(posedge CLK_B1_i => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+		(posedge CLK_A2_i => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+		(posedge CLK_B2_i => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+    $setuphold(posedge CLK_A1_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_A1_i, FLUSH1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, WEN_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, REN_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, BE_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, ADDR_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, WDATA_A1_i, 0, 0);
+    $setuphold(posedge CLK_B1_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_B1_i, WEN_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, REN_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, BE_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, ADDR_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, WDATA_B1_i, 0, 0);
+    $setuphold(posedge CLK_A2_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_A2_i, FLUSH2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, WEN_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, REN_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, BE_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, ADDR_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, WDATA_A2_i, 0, 0);
+    $setuphold(posedge CLK_B2_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_B2_i, WEN_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, REN_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, BE_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, ADDR_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, WDATA_B2_i, 0, 0);
+	endspecify
+`endif
+
+endmodule
+
+// ============================================================================
+// TDP36K write width 18 functional modes
+
+module TDP36K_BRAM_WR_X18_RD_X1_nonsplit (
+    RESET_ni,
+    WEN_A1_i,   WEN_B1_i,
+    REN_A1_i,   REN_B1_i,
+    CLK_A1_i,   CLK_B1_i,
+    BE_A1_i,    BE_B1_i,
+    ADDR_A1_i,  ADDR_B1_i,
+    WDATA_A1_i, WDATA_B1_i,
+    RDATA_A1_o, RDATA_B1_o,
+    FLUSH1_i,
+    WEN_A2_i,   WEN_B2_i,
+    REN_A2_i,   REN_B2_i,
+    CLK_A2_i,   CLK_B2_i,
+    BE_A2_i,    BE_B2_i,
+    ADDR_A2_i,  ADDR_B2_i,
+    WDATA_A2_i, WDATA_B2_i,
+    RDATA_A2_o, RDATA_B2_o,
+    FLUSH2_i
+);
+    parameter [80:0] MODE_BITS = 81'd0;
+
+    input  wire RESET_ni;
+    input  wire WEN_A1_i, WEN_B1_i;
+    input  wire REN_A1_i, REN_B1_i;
+    input  wire WEN_A2_i, WEN_B2_i;
+    input  wire REN_A2_i, REN_B2_i;
+
+    (* clkbuf_sink *)
+    input  wire CLK_A1_i;
+    (* clkbuf_sink *)
+    input  wire CLK_B1_i;
+    (* clkbuf_sink *)
+    input  wire CLK_A2_i;
+    (* clkbuf_sink *)
+    input  wire CLK_B2_i;
+
+    input  wire [ 1:0] BE_A1_i,    BE_B1_i;
+    input  wire [14:0] ADDR_A1_i,  ADDR_B1_i;
+    input  wire [17:0] WDATA_A1_i, WDATA_B1_i;
+    output wire [17:0] RDATA_A1_o, RDATA_B1_o;
+
+    input  wire FLUSH1_i;
+
+    input  wire [ 1:0] BE_A2_i,    BE_B2_i;
+    input  wire [13:0] ADDR_A2_i,  ADDR_B2_i;
+    input  wire [17:0] WDATA_A2_i, WDATA_B2_i;
+    output wire [17:0] RDATA_A2_o, RDATA_B2_o;
+
+    input  wire FLUSH2_i;
+
+    TDP36K #(.MODE_BITS(MODE_BITS)) bram (
+        .RESET_ni   (RESET_ni),   
+        .WEN_A1_i   (WEN_A1_i),   .WEN_B1_i   (WEN_B1_i),
+        .REN_A1_i   (REN_A1_i),   .REN_B1_i   (REN_B1_i),
+        .CLK_A1_i   (CLK_A1_i),   .CLK_B1_i   (CLK_B1_i),
+        .BE_A1_i    (BE_A1_i),    .BE_B1_i    (BE_B1_i),
+        .ADDR_A1_i  (ADDR_A1_i),  .ADDR_B1_i  (ADDR_B1_i),
+        .WDATA_A1_i (WDATA_A1_i), .WDATA_B1_i (WDATA_B1_i),
+        .RDATA_A1_o (RDATA_A1_o), .RDATA_B1_o (RDATA_B1_o),
+        .FLUSH1_i   (FLUSH1_i),
+        .WEN_A2_i   (WEN_A2_i),   .WEN_B2_i   (WEN_B2_i),
+        .REN_A2_i   (REN_A2_i),   .REN_B2_i   (REN_B2_i),
+        .CLK_A2_i   (CLK_A2_i),   .CLK_B2_i   (CLK_B2_i),
+        .BE_A2_i    (BE_A2_i),    .BE_B2_i    (BE_B2_i),
+        .ADDR_A2_i  (ADDR_A2_i),  .ADDR_B2_i  (ADDR_B2_i),
+        .WDATA_A2_i (WDATA_A2_i), .WDATA_B2_i (WDATA_B2_i),
+        .RDATA_A2_o (RDATA_A2_o), .RDATA_B2_o (RDATA_B2_o),
+        .FLUSH2_i   (FLUSH2_i)
+    );
+
+`ifdef SDF_SIM
+	specify
+		(negedge RESET_ni => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+		(negedge RESET_ni => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+		(negedge RESET_ni => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+		(negedge RESET_ni => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+		(posedge CLK_A1_i => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+		(posedge CLK_B1_i => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+		(posedge CLK_A2_i => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+		(posedge CLK_B2_i => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+    $setuphold(posedge CLK_A1_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_A1_i, FLUSH1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, WEN_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, REN_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, BE_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, ADDR_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, WDATA_A1_i, 0, 0);
+    $setuphold(posedge CLK_B1_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_B1_i, WEN_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, REN_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, BE_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, ADDR_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, WDATA_B1_i, 0, 0);
+    $setuphold(posedge CLK_A2_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_A2_i, FLUSH2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, WEN_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, REN_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, BE_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, ADDR_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, WDATA_A2_i, 0, 0);
+    $setuphold(posedge CLK_B2_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_B2_i, WEN_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, REN_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, BE_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, ADDR_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, WDATA_B2_i, 0, 0);
+	endspecify
+`endif
+
+endmodule
+
+module TDP36K_BRAM_WR_X18_RD_X2_nonsplit (
+    RESET_ni,
+    WEN_A1_i,   WEN_B1_i,
+    REN_A1_i,   REN_B1_i,
+    CLK_A1_i,   CLK_B1_i,
+    BE_A1_i,    BE_B1_i,
+    ADDR_A1_i,  ADDR_B1_i,
+    WDATA_A1_i, WDATA_B1_i,
+    RDATA_A1_o, RDATA_B1_o,
+    FLUSH1_i,
+    WEN_A2_i,   WEN_B2_i,
+    REN_A2_i,   REN_B2_i,
+    CLK_A2_i,   CLK_B2_i,
+    BE_A2_i,    BE_B2_i,
+    ADDR_A2_i,  ADDR_B2_i,
+    WDATA_A2_i, WDATA_B2_i,
+    RDATA_A2_o, RDATA_B2_o,
+    FLUSH2_i
+);
+    parameter [80:0] MODE_BITS = 81'd0;
+
+    input  wire RESET_ni;
+    input  wire WEN_A1_i, WEN_B1_i;
+    input  wire REN_A1_i, REN_B1_i;
+    input  wire WEN_A2_i, WEN_B2_i;
+    input  wire REN_A2_i, REN_B2_i;
+
+    (* clkbuf_sink *)
+    input  wire CLK_A1_i;
+    (* clkbuf_sink *)
+    input  wire CLK_B1_i;
+    (* clkbuf_sink *)
+    input  wire CLK_A2_i;
+    (* clkbuf_sink *)
+    input  wire CLK_B2_i;
+
+    input  wire [ 1:0] BE_A1_i,    BE_B1_i;
+    input  wire [14:0] ADDR_A1_i,  ADDR_B1_i;
+    input  wire [17:0] WDATA_A1_i, WDATA_B1_i;
+    output wire [17:0] RDATA_A1_o, RDATA_B1_o;
+
+    input  wire FLUSH1_i;
+
+    input  wire [ 1:0] BE_A2_i,    BE_B2_i;
+    input  wire [13:0] ADDR_A2_i,  ADDR_B2_i;
+    input  wire [17:0] WDATA_A2_i, WDATA_B2_i;
+    output wire [17:0] RDATA_A2_o, RDATA_B2_o;
+
+    input  wire FLUSH2_i;
+
+    TDP36K #(.MODE_BITS(MODE_BITS)) bram (
+        .RESET_ni   (RESET_ni),   
+        .WEN_A1_i   (WEN_A1_i),   .WEN_B1_i   (WEN_B1_i),
+        .REN_A1_i   (REN_A1_i),   .REN_B1_i   (REN_B1_i),
+        .CLK_A1_i   (CLK_A1_i),   .CLK_B1_i   (CLK_B1_i),
+        .BE_A1_i    (BE_A1_i),    .BE_B1_i    (BE_B1_i),
+        .ADDR_A1_i  (ADDR_A1_i),  .ADDR_B1_i  (ADDR_B1_i),
+        .WDATA_A1_i (WDATA_A1_i), .WDATA_B1_i (WDATA_B1_i),
+        .RDATA_A1_o (RDATA_A1_o), .RDATA_B1_o (RDATA_B1_o),
+        .FLUSH1_i   (FLUSH1_i),
+        .WEN_A2_i   (WEN_A2_i),   .WEN_B2_i   (WEN_B2_i),
+        .REN_A2_i   (REN_A2_i),   .REN_B2_i   (REN_B2_i),
+        .CLK_A2_i   (CLK_A2_i),   .CLK_B2_i   (CLK_B2_i),
+        .BE_A2_i    (BE_A2_i),    .BE_B2_i    (BE_B2_i),
+        .ADDR_A2_i  (ADDR_A2_i),  .ADDR_B2_i  (ADDR_B2_i),
+        .WDATA_A2_i (WDATA_A2_i), .WDATA_B2_i (WDATA_B2_i),
+        .RDATA_A2_o (RDATA_A2_o), .RDATA_B2_o (RDATA_B2_o),
+        .FLUSH2_i   (FLUSH2_i)
+    );
+
+`ifdef SDF_SIM
+	specify
+		(negedge RESET_ni => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+		(negedge RESET_ni => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+		(negedge RESET_ni => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+		(negedge RESET_ni => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+		(posedge CLK_A1_i => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+		(posedge CLK_B1_i => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+		(posedge CLK_A2_i => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+		(posedge CLK_B2_i => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+    $setuphold(posedge CLK_A1_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_A1_i, FLUSH1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, WEN_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, REN_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, BE_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, ADDR_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, WDATA_A1_i, 0, 0);
+    $setuphold(posedge CLK_B1_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_B1_i, WEN_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, REN_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, BE_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, ADDR_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, WDATA_B1_i, 0, 0);
+    $setuphold(posedge CLK_A2_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_A2_i, FLUSH2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, WEN_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, REN_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, BE_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, ADDR_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, WDATA_A2_i, 0, 0);
+    $setuphold(posedge CLK_B2_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_B2_i, WEN_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, REN_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, BE_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, ADDR_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, WDATA_B2_i, 0, 0);
+	endspecify
+`endif
+
+endmodule
+
+module TDP36K_BRAM_WR_X18_RD_X4_nonsplit (
+    RESET_ni,
+    WEN_A1_i,   WEN_B1_i,
+    REN_A1_i,   REN_B1_i,
+    CLK_A1_i,   CLK_B1_i,
+    BE_A1_i,    BE_B1_i,
+    ADDR_A1_i,  ADDR_B1_i,
+    WDATA_A1_i, WDATA_B1_i,
+    RDATA_A1_o, RDATA_B1_o,
+    FLUSH1_i,
+    WEN_A2_i,   WEN_B2_i,
+    REN_A2_i,   REN_B2_i,
+    CLK_A2_i,   CLK_B2_i,
+    BE_A2_i,    BE_B2_i,
+    ADDR_A2_i,  ADDR_B2_i,
+    WDATA_A2_i, WDATA_B2_i,
+    RDATA_A2_o, RDATA_B2_o,
+    FLUSH2_i
+);
+    parameter [80:0] MODE_BITS = 81'd0;
+
+    input  wire RESET_ni;
+    input  wire WEN_A1_i, WEN_B1_i;
+    input  wire REN_A1_i, REN_B1_i;
+    input  wire WEN_A2_i, WEN_B2_i;
+    input  wire REN_A2_i, REN_B2_i;
+
+    (* clkbuf_sink *)
+    input  wire CLK_A1_i;
+    (* clkbuf_sink *)
+    input  wire CLK_B1_i;
+    (* clkbuf_sink *)
+    input  wire CLK_A2_i;
+    (* clkbuf_sink *)
+    input  wire CLK_B2_i;
+
+    input  wire [ 1:0] BE_A1_i,    BE_B1_i;
+    input  wire [14:0] ADDR_A1_i,  ADDR_B1_i;
+    input  wire [17:0] WDATA_A1_i, WDATA_B1_i;
+    output wire [17:0] RDATA_A1_o, RDATA_B1_o;
+
+    input  wire FLUSH1_i;
+
+    input  wire [ 1:0] BE_A2_i,    BE_B2_i;
+    input  wire [13:0] ADDR_A2_i,  ADDR_B2_i;
+    input  wire [17:0] WDATA_A2_i, WDATA_B2_i;
+    output wire [17:0] RDATA_A2_o, RDATA_B2_o;
+
+    input  wire FLUSH2_i;
+
+    TDP36K #(.MODE_BITS(MODE_BITS)) bram (
+        .RESET_ni   (RESET_ni),   
+        .WEN_A1_i   (WEN_A1_i),   .WEN_B1_i   (WEN_B1_i),
+        .REN_A1_i   (REN_A1_i),   .REN_B1_i   (REN_B1_i),
+        .CLK_A1_i   (CLK_A1_i),   .CLK_B1_i   (CLK_B1_i),
+        .BE_A1_i    (BE_A1_i),    .BE_B1_i    (BE_B1_i),
+        .ADDR_A1_i  (ADDR_A1_i),  .ADDR_B1_i  (ADDR_B1_i),
+        .WDATA_A1_i (WDATA_A1_i), .WDATA_B1_i (WDATA_B1_i),
+        .RDATA_A1_o (RDATA_A1_o), .RDATA_B1_o (RDATA_B1_o),
+        .FLUSH1_i   (FLUSH1_i),
+        .WEN_A2_i   (WEN_A2_i),   .WEN_B2_i   (WEN_B2_i),
+        .REN_A2_i   (REN_A2_i),   .REN_B2_i   (REN_B2_i),
+        .CLK_A2_i   (CLK_A2_i),   .CLK_B2_i   (CLK_B2_i),
+        .BE_A2_i    (BE_A2_i),    .BE_B2_i    (BE_B2_i),
+        .ADDR_A2_i  (ADDR_A2_i),  .ADDR_B2_i  (ADDR_B2_i),
+        .WDATA_A2_i (WDATA_A2_i), .WDATA_B2_i (WDATA_B2_i),
+        .RDATA_A2_o (RDATA_A2_o), .RDATA_B2_o (RDATA_B2_o),
+        .FLUSH2_i   (FLUSH2_i)
+    );
+
+`ifdef SDF_SIM
+	specify
+		(negedge RESET_ni => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+		(negedge RESET_ni => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+		(negedge RESET_ni => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+		(negedge RESET_ni => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+		(posedge CLK_A1_i => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+		(posedge CLK_B1_i => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+		(posedge CLK_A2_i => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+		(posedge CLK_B2_i => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+    $setuphold(posedge CLK_A1_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_A1_i, FLUSH1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, WEN_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, REN_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, BE_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, ADDR_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, WDATA_A1_i, 0, 0);
+    $setuphold(posedge CLK_B1_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_B1_i, WEN_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, REN_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, BE_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, ADDR_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, WDATA_B1_i, 0, 0);
+    $setuphold(posedge CLK_A2_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_A2_i, FLUSH2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, WEN_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, REN_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, BE_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, ADDR_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, WDATA_A2_i, 0, 0);
+    $setuphold(posedge CLK_B2_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_B2_i, WEN_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, REN_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, BE_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, ADDR_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, WDATA_B2_i, 0, 0);
+	endspecify
+`endif
+
+endmodule
+
+module TDP36K_BRAM_WR_X18_RD_X9_nonsplit (
+    RESET_ni,
+    WEN_A1_i,   WEN_B1_i,
+    REN_A1_i,   REN_B1_i,
+    CLK_A1_i,   CLK_B1_i,
+    BE_A1_i,    BE_B1_i,
+    ADDR_A1_i,  ADDR_B1_i,
+    WDATA_A1_i, WDATA_B1_i,
+    RDATA_A1_o, RDATA_B1_o,
+    FLUSH1_i,
+    WEN_A2_i,   WEN_B2_i,
+    REN_A2_i,   REN_B2_i,
+    CLK_A2_i,   CLK_B2_i,
+    BE_A2_i,    BE_B2_i,
+    ADDR_A2_i,  ADDR_B2_i,
+    WDATA_A2_i, WDATA_B2_i,
+    RDATA_A2_o, RDATA_B2_o,
+    FLUSH2_i
+);
+    parameter [80:0] MODE_BITS = 81'd0;
+
+    input  wire RESET_ni;
+    input  wire WEN_A1_i, WEN_B1_i;
+    input  wire REN_A1_i, REN_B1_i;
+    input  wire WEN_A2_i, WEN_B2_i;
+    input  wire REN_A2_i, REN_B2_i;
+
+    (* clkbuf_sink *)
+    input  wire CLK_A1_i;
+    (* clkbuf_sink *)
+    input  wire CLK_B1_i;
+    (* clkbuf_sink *)
+    input  wire CLK_A2_i;
+    (* clkbuf_sink *)
+    input  wire CLK_B2_i;
+
+    input  wire [ 1:0] BE_A1_i,    BE_B1_i;
+    input  wire [14:0] ADDR_A1_i,  ADDR_B1_i;
+    input  wire [17:0] WDATA_A1_i, WDATA_B1_i;
+    output wire [17:0] RDATA_A1_o, RDATA_B1_o;
+
+    input  wire FLUSH1_i;
+
+    input  wire [ 1:0] BE_A2_i,    BE_B2_i;
+    input  wire [13:0] ADDR_A2_i,  ADDR_B2_i;
+    input  wire [17:0] WDATA_A2_i, WDATA_B2_i;
+    output wire [17:0] RDATA_A2_o, RDATA_B2_o;
+
+    input  wire FLUSH2_i;
+
+    TDP36K #(.MODE_BITS(MODE_BITS)) bram (
+        .RESET_ni   (RESET_ni),   
+        .WEN_A1_i   (WEN_A1_i),   .WEN_B1_i   (WEN_B1_i),
+        .REN_A1_i   (REN_A1_i),   .REN_B1_i   (REN_B1_i),
+        .CLK_A1_i   (CLK_A1_i),   .CLK_B1_i   (CLK_B1_i),
+        .BE_A1_i    (BE_A1_i),    .BE_B1_i    (BE_B1_i),
+        .ADDR_A1_i  (ADDR_A1_i),  .ADDR_B1_i  (ADDR_B1_i),
+        .WDATA_A1_i (WDATA_A1_i), .WDATA_B1_i (WDATA_B1_i),
+        .RDATA_A1_o (RDATA_A1_o), .RDATA_B1_o (RDATA_B1_o),
+        .FLUSH1_i   (FLUSH1_i),
+        .WEN_A2_i   (WEN_A2_i),   .WEN_B2_i   (WEN_B2_i),
+        .REN_A2_i   (REN_A2_i),   .REN_B2_i   (REN_B2_i),
+        .CLK_A2_i   (CLK_A2_i),   .CLK_B2_i   (CLK_B2_i),
+        .BE_A2_i    (BE_A2_i),    .BE_B2_i    (BE_B2_i),
+        .ADDR_A2_i  (ADDR_A2_i),  .ADDR_B2_i  (ADDR_B2_i),
+        .WDATA_A2_i (WDATA_A2_i), .WDATA_B2_i (WDATA_B2_i),
+        .RDATA_A2_o (RDATA_A2_o), .RDATA_B2_o (RDATA_B2_o),
+        .FLUSH2_i   (FLUSH2_i)
+    );
+
+`ifdef SDF_SIM
+	specify
+		(negedge RESET_ni => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+		(negedge RESET_ni => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+		(negedge RESET_ni => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+		(negedge RESET_ni => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+		(posedge CLK_A1_i => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+		(posedge CLK_B1_i => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+		(posedge CLK_A2_i => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+		(posedge CLK_B2_i => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+    $setuphold(posedge CLK_A1_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_A1_i, FLUSH1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, WEN_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, REN_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, BE_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, ADDR_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, WDATA_A1_i, 0, 0);
+    $setuphold(posedge CLK_B1_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_B1_i, WEN_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, REN_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, BE_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, ADDR_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, WDATA_B1_i, 0, 0);
+    $setuphold(posedge CLK_A2_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_A2_i, FLUSH2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, WEN_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, REN_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, BE_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, ADDR_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, WDATA_A2_i, 0, 0);
+    $setuphold(posedge CLK_B2_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_B2_i, WEN_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, REN_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, BE_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, ADDR_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, WDATA_B2_i, 0, 0);
+	endspecify
+`endif
+
+endmodule
+
+module TDP36K_BRAM_WR_X18_RD_X18_nonsplit (
+    RESET_ni,
+    WEN_A1_i,   WEN_B1_i,
+    REN_A1_i,   REN_B1_i,
+    CLK_A1_i,   CLK_B1_i,
+    BE_A1_i,    BE_B1_i,
+    ADDR_A1_i,  ADDR_B1_i,
+    WDATA_A1_i, WDATA_B1_i,
+    RDATA_A1_o, RDATA_B1_o,
+    FLUSH1_i,
+    WEN_A2_i,   WEN_B2_i,
+    REN_A2_i,   REN_B2_i,
+    CLK_A2_i,   CLK_B2_i,
+    BE_A2_i,    BE_B2_i,
+    ADDR_A2_i,  ADDR_B2_i,
+    WDATA_A2_i, WDATA_B2_i,
+    RDATA_A2_o, RDATA_B2_o,
+    FLUSH2_i
+);
+    parameter [80:0] MODE_BITS = 81'd0;
+
+    input  wire RESET_ni;
+    input  wire WEN_A1_i, WEN_B1_i;
+    input  wire REN_A1_i, REN_B1_i;
+    input  wire WEN_A2_i, WEN_B2_i;
+    input  wire REN_A2_i, REN_B2_i;
+
+    (* clkbuf_sink *)
+    input  wire CLK_A1_i;
+    (* clkbuf_sink *)
+    input  wire CLK_B1_i;
+    (* clkbuf_sink *)
+    input  wire CLK_A2_i;
+    (* clkbuf_sink *)
+    input  wire CLK_B2_i;
+
+    input  wire [ 1:0] BE_A1_i,    BE_B1_i;
+    input  wire [14:0] ADDR_A1_i,  ADDR_B1_i;
+    input  wire [17:0] WDATA_A1_i, WDATA_B1_i;
+    output wire [17:0] RDATA_A1_o, RDATA_B1_o;
+
+    input  wire FLUSH1_i;
+
+    input  wire [ 1:0] BE_A2_i,    BE_B2_i;
+    input  wire [13:0] ADDR_A2_i,  ADDR_B2_i;
+    input  wire [17:0] WDATA_A2_i, WDATA_B2_i;
+    output wire [17:0] RDATA_A2_o, RDATA_B2_o;
+
+    input  wire FLUSH2_i;
+
+    TDP36K #(.MODE_BITS(MODE_BITS)) bram (
+        .RESET_ni   (RESET_ni),   
+        .WEN_A1_i   (WEN_A1_i),   .WEN_B1_i   (WEN_B1_i),
+        .REN_A1_i   (REN_A1_i),   .REN_B1_i   (REN_B1_i),
+        .CLK_A1_i   (CLK_A1_i),   .CLK_B1_i   (CLK_B1_i),
+        .BE_A1_i    (BE_A1_i),    .BE_B1_i    (BE_B1_i),
+        .ADDR_A1_i  (ADDR_A1_i),  .ADDR_B1_i  (ADDR_B1_i),
+        .WDATA_A1_i (WDATA_A1_i), .WDATA_B1_i (WDATA_B1_i),
+        .RDATA_A1_o (RDATA_A1_o), .RDATA_B1_o (RDATA_B1_o),
+        .FLUSH1_i   (FLUSH1_i),
+        .WEN_A2_i   (WEN_A2_i),   .WEN_B2_i   (WEN_B2_i),
+        .REN_A2_i   (REN_A2_i),   .REN_B2_i   (REN_B2_i),
+        .CLK_A2_i   (CLK_A2_i),   .CLK_B2_i   (CLK_B2_i),
+        .BE_A2_i    (BE_A2_i),    .BE_B2_i    (BE_B2_i),
+        .ADDR_A2_i  (ADDR_A2_i),  .ADDR_B2_i  (ADDR_B2_i),
+        .WDATA_A2_i (WDATA_A2_i), .WDATA_B2_i (WDATA_B2_i),
+        .RDATA_A2_o (RDATA_A2_o), .RDATA_B2_o (RDATA_B2_o),
+        .FLUSH2_i   (FLUSH2_i)
+    );
+
+`ifdef SDF_SIM
+	specify
+		(negedge RESET_ni => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+		(negedge RESET_ni => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+		(negedge RESET_ni => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+		(negedge RESET_ni => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+		(posedge CLK_A1_i => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+		(posedge CLK_B1_i => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+		(posedge CLK_A2_i => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+		(posedge CLK_B2_i => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+    $setuphold(posedge CLK_A1_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_A1_i, FLUSH1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, WEN_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, REN_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, BE_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, ADDR_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, WDATA_A1_i, 0, 0);
+    $setuphold(posedge CLK_B1_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_B1_i, WEN_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, REN_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, BE_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, ADDR_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, WDATA_B1_i, 0, 0);
+    $setuphold(posedge CLK_A2_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_A2_i, FLUSH2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, WEN_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, REN_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, BE_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, ADDR_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, WDATA_A2_i, 0, 0);
+    $setuphold(posedge CLK_B2_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_B2_i, WEN_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, REN_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, BE_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, ADDR_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, WDATA_B2_i, 0, 0);
+	endspecify
+`endif
+
+endmodule
+
+module TDP36K_BRAM_WR_X18_RD_X36_nonsplit (
+    RESET_ni,
+    WEN_A1_i,   WEN_B1_i,
+    REN_A1_i,   REN_B1_i,
+    CLK_A1_i,   CLK_B1_i,
+    BE_A1_i,    BE_B1_i,
+    ADDR_A1_i,  ADDR_B1_i,
+    WDATA_A1_i, WDATA_B1_i,
+    RDATA_A1_o, RDATA_B1_o,
+    FLUSH1_i,
+    WEN_A2_i,   WEN_B2_i,
+    REN_A2_i,   REN_B2_i,
+    CLK_A2_i,   CLK_B2_i,
+    BE_A2_i,    BE_B2_i,
+    ADDR_A2_i,  ADDR_B2_i,
+    WDATA_A2_i, WDATA_B2_i,
+    RDATA_A2_o, RDATA_B2_o,
+    FLUSH2_i
+);
+    parameter [80:0] MODE_BITS = 81'd0;
+
+    input  wire RESET_ni;
+    input  wire WEN_A1_i, WEN_B1_i;
+    input  wire REN_A1_i, REN_B1_i;
+    input  wire WEN_A2_i, WEN_B2_i;
+    input  wire REN_A2_i, REN_B2_i;
+
+    (* clkbuf_sink *)
+    input  wire CLK_A1_i;
+    (* clkbuf_sink *)
+    input  wire CLK_B1_i;
+    (* clkbuf_sink *)
+    input  wire CLK_A2_i;
+    (* clkbuf_sink *)
+    input  wire CLK_B2_i;
+
+    input  wire [ 1:0] BE_A1_i,    BE_B1_i;
+    input  wire [14:0] ADDR_A1_i,  ADDR_B1_i;
+    input  wire [17:0] WDATA_A1_i, WDATA_B1_i;
+    output wire [17:0] RDATA_A1_o, RDATA_B1_o;
+
+    input  wire FLUSH1_i;
+
+    input  wire [ 1:0] BE_A2_i,    BE_B2_i;
+    input  wire [13:0] ADDR_A2_i,  ADDR_B2_i;
+    input  wire [17:0] WDATA_A2_i, WDATA_B2_i;
+    output wire [17:0] RDATA_A2_o, RDATA_B2_o;
+
+    input  wire FLUSH2_i;
+
+    TDP36K #(.MODE_BITS(MODE_BITS)) bram (
+        .RESET_ni   (RESET_ni),   
+        .WEN_A1_i   (WEN_A1_i),   .WEN_B1_i   (WEN_B1_i),
+        .REN_A1_i   (REN_A1_i),   .REN_B1_i   (REN_B1_i),
+        .CLK_A1_i   (CLK_A1_i),   .CLK_B1_i   (CLK_B1_i),
+        .BE_A1_i    (BE_A1_i),    .BE_B1_i    (BE_B1_i),
+        .ADDR_A1_i  (ADDR_A1_i),  .ADDR_B1_i  (ADDR_B1_i),
+        .WDATA_A1_i (WDATA_A1_i), .WDATA_B1_i (WDATA_B1_i),
+        .RDATA_A1_o (RDATA_A1_o), .RDATA_B1_o (RDATA_B1_o),
+        .FLUSH1_i   (FLUSH1_i),
+        .WEN_A2_i   (WEN_A2_i),   .WEN_B2_i   (WEN_B2_i),
+        .REN_A2_i   (REN_A2_i),   .REN_B2_i   (REN_B2_i),
+        .CLK_A2_i   (CLK_A2_i),   .CLK_B2_i   (CLK_B2_i),
+        .BE_A2_i    (BE_A2_i),    .BE_B2_i    (BE_B2_i),
+        .ADDR_A2_i  (ADDR_A2_i),  .ADDR_B2_i  (ADDR_B2_i),
+        .WDATA_A2_i (WDATA_A2_i), .WDATA_B2_i (WDATA_B2_i),
+        .RDATA_A2_o (RDATA_A2_o), .RDATA_B2_o (RDATA_B2_o),
+        .FLUSH2_i   (FLUSH2_i)
+    );
+
+`ifdef SDF_SIM
+	specify
+		(negedge RESET_ni => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+		(negedge RESET_ni => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+		(negedge RESET_ni => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+		(negedge RESET_ni => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+		(posedge CLK_A1_i => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+		(posedge CLK_B1_i => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+		(posedge CLK_A2_i => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+		(posedge CLK_B2_i => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+    $setuphold(posedge CLK_A1_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_A1_i, FLUSH1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, WEN_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, REN_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, BE_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, ADDR_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, WDATA_A1_i, 0, 0);
+    $setuphold(posedge CLK_B1_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_B1_i, WEN_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, REN_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, BE_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, ADDR_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, WDATA_B1_i, 0, 0);
+    $setuphold(posedge CLK_A2_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_A2_i, FLUSH2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, WEN_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, REN_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, BE_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, ADDR_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, WDATA_A2_i, 0, 0);
+    $setuphold(posedge CLK_B2_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_B2_i, WEN_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, REN_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, BE_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, ADDR_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, WDATA_B2_i, 0, 0);
+	endspecify
+`endif
+
+endmodule
+
+// ============================================================================
+// TDP36K write width 36 functional modes
+
+module TDP36K_BRAM_WR_X36_RD_X1_nonsplit (
+    RESET_ni,
+    WEN_A1_i,   WEN_B1_i,
+    REN_A1_i,   REN_B1_i,
+    CLK_A1_i,   CLK_B1_i,
+    BE_A1_i,    BE_B1_i,
+    ADDR_A1_i,  ADDR_B1_i,
+    WDATA_A1_i, WDATA_B1_i,
+    RDATA_A1_o, RDATA_B1_o,
+    FLUSH1_i,
+    WEN_A2_i,   WEN_B2_i,
+    REN_A2_i,   REN_B2_i,
+    CLK_A2_i,   CLK_B2_i,
+    BE_A2_i,    BE_B2_i,
+    ADDR_A2_i,  ADDR_B2_i,
+    WDATA_A2_i, WDATA_B2_i,
+    RDATA_A2_o, RDATA_B2_o,
+    FLUSH2_i
+);
+    parameter [80:0] MODE_BITS = 81'd0;
+
+    input  wire RESET_ni;
+    input  wire WEN_A1_i, WEN_B1_i;
+    input  wire REN_A1_i, REN_B1_i;
+    input  wire WEN_A2_i, WEN_B2_i;
+    input  wire REN_A2_i, REN_B2_i;
+
+    (* clkbuf_sink *)
+    input  wire CLK_A1_i;
+    (* clkbuf_sink *)
+    input  wire CLK_B1_i;
+    (* clkbuf_sink *)
+    input  wire CLK_A2_i;
+    (* clkbuf_sink *)
+    input  wire CLK_B2_i;
+
+    input  wire [ 1:0] BE_A1_i,    BE_B1_i;
+    input  wire [14:0] ADDR_A1_i,  ADDR_B1_i;
+    input  wire [17:0] WDATA_A1_i, WDATA_B1_i;
+    output wire [17:0] RDATA_A1_o, RDATA_B1_o;
+
+    input  wire FLUSH1_i;
+
+    input  wire [ 1:0] BE_A2_i,    BE_B2_i;
+    input  wire [13:0] ADDR_A2_i,  ADDR_B2_i;
+    input  wire [17:0] WDATA_A2_i, WDATA_B2_i;
+    output wire [17:0] RDATA_A2_o, RDATA_B2_o;
+
+    input  wire FLUSH2_i;
+
+    TDP36K #(.MODE_BITS(MODE_BITS)) bram (
+        .RESET_ni   (RESET_ni),   
+        .WEN_A1_i   (WEN_A1_i),   .WEN_B1_i   (WEN_B1_i),
+        .REN_A1_i   (REN_A1_i),   .REN_B1_i   (REN_B1_i),
+        .CLK_A1_i   (CLK_A1_i),   .CLK_B1_i   (CLK_B1_i),
+        .BE_A1_i    (BE_A1_i),    .BE_B1_i    (BE_B1_i),
+        .ADDR_A1_i  (ADDR_A1_i),  .ADDR_B1_i  (ADDR_B1_i),
+        .WDATA_A1_i (WDATA_A1_i), .WDATA_B1_i (WDATA_B1_i),
+        .RDATA_A1_o (RDATA_A1_o), .RDATA_B1_o (RDATA_B1_o),
+        .FLUSH1_i   (FLUSH1_i),
+        .WEN_A2_i   (WEN_A2_i),   .WEN_B2_i   (WEN_B2_i),
+        .REN_A2_i   (REN_A2_i),   .REN_B2_i   (REN_B2_i),
+        .CLK_A2_i   (CLK_A2_i),   .CLK_B2_i   (CLK_B2_i),
+        .BE_A2_i    (BE_A2_i),    .BE_B2_i    (BE_B2_i),
+        .ADDR_A2_i  (ADDR_A2_i),  .ADDR_B2_i  (ADDR_B2_i),
+        .WDATA_A2_i (WDATA_A2_i), .WDATA_B2_i (WDATA_B2_i),
+        .RDATA_A2_o (RDATA_A2_o), .RDATA_B2_o (RDATA_B2_o),
+        .FLUSH2_i   (FLUSH2_i)
+    );
+
+`ifdef SDF_SIM
+	specify
+		(negedge RESET_ni => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+		(negedge RESET_ni => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+		(negedge RESET_ni => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+		(negedge RESET_ni => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+		(posedge CLK_A1_i => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+		(posedge CLK_B1_i => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+		(posedge CLK_A2_i => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+		(posedge CLK_B2_i => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+    $setuphold(posedge CLK_A1_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_A1_i, FLUSH1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, WEN_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, REN_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, BE_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, ADDR_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, WDATA_A1_i, 0, 0);
+    $setuphold(posedge CLK_B1_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_B1_i, WEN_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, REN_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, BE_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, ADDR_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, WDATA_B1_i, 0, 0);
+    $setuphold(posedge CLK_A2_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_A2_i, FLUSH2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, WEN_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, REN_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, BE_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, ADDR_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, WDATA_A2_i, 0, 0);
+    $setuphold(posedge CLK_B2_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_B2_i, WEN_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, REN_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, BE_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, ADDR_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, WDATA_B2_i, 0, 0);
+	endspecify
+`endif
+
+endmodule
+
+module TDP36K_BRAM_WR_X36_RD_X2_nonsplit (
+    RESET_ni,
+    WEN_A1_i,   WEN_B1_i,
+    REN_A1_i,   REN_B1_i,
+    CLK_A1_i,   CLK_B1_i,
+    BE_A1_i,    BE_B1_i,
+    ADDR_A1_i,  ADDR_B1_i,
+    WDATA_A1_i, WDATA_B1_i,
+    RDATA_A1_o, RDATA_B1_o,
+    FLUSH1_i,
+    WEN_A2_i,   WEN_B2_i,
+    REN_A2_i,   REN_B2_i,
+    CLK_A2_i,   CLK_B2_i,
+    BE_A2_i,    BE_B2_i,
+    ADDR_A2_i,  ADDR_B2_i,
+    WDATA_A2_i, WDATA_B2_i,
+    RDATA_A2_o, RDATA_B2_o,
+    FLUSH2_i
+);
+    parameter [80:0] MODE_BITS = 81'd0;
+
+    input  wire RESET_ni;
+    input  wire WEN_A1_i, WEN_B1_i;
+    input  wire REN_A1_i, REN_B1_i;
+    input  wire WEN_A2_i, WEN_B2_i;
+    input  wire REN_A2_i, REN_B2_i;
+
+    (* clkbuf_sink *)
+    input  wire CLK_A1_i;
+    (* clkbuf_sink *)
+    input  wire CLK_B1_i;
+    (* clkbuf_sink *)
+    input  wire CLK_A2_i;
+    (* clkbuf_sink *)
+    input  wire CLK_B2_i;
+
+    input  wire [ 1:0] BE_A1_i,    BE_B1_i;
+    input  wire [14:0] ADDR_A1_i,  ADDR_B1_i;
+    input  wire [17:0] WDATA_A1_i, WDATA_B1_i;
+    output wire [17:0] RDATA_A1_o, RDATA_B1_o;
+
+    input  wire FLUSH1_i;
+
+    input  wire [ 1:0] BE_A2_i,    BE_B2_i;
+    input  wire [13:0] ADDR_A2_i,  ADDR_B2_i;
+    input  wire [17:0] WDATA_A2_i, WDATA_B2_i;
+    output wire [17:0] RDATA_A2_o, RDATA_B2_o;
+
+    input  wire FLUSH2_i;
+
+    TDP36K #(.MODE_BITS(MODE_BITS)) bram (
+        .RESET_ni   (RESET_ni),   
+        .WEN_A1_i   (WEN_A1_i),   .WEN_B1_i   (WEN_B1_i),
+        .REN_A1_i   (REN_A1_i),   .REN_B1_i   (REN_B1_i),
+        .CLK_A1_i   (CLK_A1_i),   .CLK_B1_i   (CLK_B1_i),
+        .BE_A1_i    (BE_A1_i),    .BE_B1_i    (BE_B1_i),
+        .ADDR_A1_i  (ADDR_A1_i),  .ADDR_B1_i  (ADDR_B1_i),
+        .WDATA_A1_i (WDATA_A1_i), .WDATA_B1_i (WDATA_B1_i),
+        .RDATA_A1_o (RDATA_A1_o), .RDATA_B1_o (RDATA_B1_o),
+        .FLUSH1_i   (FLUSH1_i),
+        .WEN_A2_i   (WEN_A2_i),   .WEN_B2_i   (WEN_B2_i),
+        .REN_A2_i   (REN_A2_i),   .REN_B2_i   (REN_B2_i),
+        .CLK_A2_i   (CLK_A2_i),   .CLK_B2_i   (CLK_B2_i),
+        .BE_A2_i    (BE_A2_i),    .BE_B2_i    (BE_B2_i),
+        .ADDR_A2_i  (ADDR_A2_i),  .ADDR_B2_i  (ADDR_B2_i),
+        .WDATA_A2_i (WDATA_A2_i), .WDATA_B2_i (WDATA_B2_i),
+        .RDATA_A2_o (RDATA_A2_o), .RDATA_B2_o (RDATA_B2_o),
+        .FLUSH2_i   (FLUSH2_i)
+    );
+
+`ifdef SDF_SIM
+	specify
+		(negedge RESET_ni => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+		(negedge RESET_ni => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+		(negedge RESET_ni => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+		(negedge RESET_ni => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+		(posedge CLK_A1_i => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+		(posedge CLK_B1_i => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+		(posedge CLK_A2_i => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+		(posedge CLK_B2_i => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+    $setuphold(posedge CLK_A1_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_A1_i, FLUSH1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, WEN_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, REN_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, BE_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, ADDR_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, WDATA_A1_i, 0, 0);
+    $setuphold(posedge CLK_B1_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_B1_i, WEN_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, REN_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, BE_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, ADDR_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, WDATA_B1_i, 0, 0);
+    $setuphold(posedge CLK_A2_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_A2_i, FLUSH2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, WEN_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, REN_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, BE_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, ADDR_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, WDATA_A2_i, 0, 0);
+    $setuphold(posedge CLK_B2_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_B2_i, WEN_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, REN_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, BE_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, ADDR_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, WDATA_B2_i, 0, 0);
+	endspecify
+`endif
+
+endmodule
+
+module TDP36K_BRAM_WR_X36_RD_X4_nonsplit (
+    RESET_ni,
+    WEN_A1_i,   WEN_B1_i,
+    REN_A1_i,   REN_B1_i,
+    CLK_A1_i,   CLK_B1_i,
+    BE_A1_i,    BE_B1_i,
+    ADDR_A1_i,  ADDR_B1_i,
+    WDATA_A1_i, WDATA_B1_i,
+    RDATA_A1_o, RDATA_B1_o,
+    FLUSH1_i,
+    WEN_A2_i,   WEN_B2_i,
+    REN_A2_i,   REN_B2_i,
+    CLK_A2_i,   CLK_B2_i,
+    BE_A2_i,    BE_B2_i,
+    ADDR_A2_i,  ADDR_B2_i,
+    WDATA_A2_i, WDATA_B2_i,
+    RDATA_A2_o, RDATA_B2_o,
+    FLUSH2_i
+);
+    parameter [80:0] MODE_BITS = 81'd0;
+
+    input  wire RESET_ni;
+    input  wire WEN_A1_i, WEN_B1_i;
+    input  wire REN_A1_i, REN_B1_i;
+    input  wire WEN_A2_i, WEN_B2_i;
+    input  wire REN_A2_i, REN_B2_i;
+
+    (* clkbuf_sink *)
+    input  wire CLK_A1_i;
+    (* clkbuf_sink *)
+    input  wire CLK_B1_i;
+    (* clkbuf_sink *)
+    input  wire CLK_A2_i;
+    (* clkbuf_sink *)
+    input  wire CLK_B2_i;
+
+    input  wire [ 1:0] BE_A1_i,    BE_B1_i;
+    input  wire [14:0] ADDR_A1_i,  ADDR_B1_i;
+    input  wire [17:0] WDATA_A1_i, WDATA_B1_i;
+    output wire [17:0] RDATA_A1_o, RDATA_B1_o;
+
+    input  wire FLUSH1_i;
+
+    input  wire [ 1:0] BE_A2_i,    BE_B2_i;
+    input  wire [13:0] ADDR_A2_i,  ADDR_B2_i;
+    input  wire [17:0] WDATA_A2_i, WDATA_B2_i;
+    output wire [17:0] RDATA_A2_o, RDATA_B2_o;
+
+    input  wire FLUSH2_i;
+
+    TDP36K #(.MODE_BITS(MODE_BITS)) bram (
+        .RESET_ni   (RESET_ni),   
+        .WEN_A1_i   (WEN_A1_i),   .WEN_B1_i   (WEN_B1_i),
+        .REN_A1_i   (REN_A1_i),   .REN_B1_i   (REN_B1_i),
+        .CLK_A1_i   (CLK_A1_i),   .CLK_B1_i   (CLK_B1_i),
+        .BE_A1_i    (BE_A1_i),    .BE_B1_i    (BE_B1_i),
+        .ADDR_A1_i  (ADDR_A1_i),  .ADDR_B1_i  (ADDR_B1_i),
+        .WDATA_A1_i (WDATA_A1_i), .WDATA_B1_i (WDATA_B1_i),
+        .RDATA_A1_o (RDATA_A1_o), .RDATA_B1_o (RDATA_B1_o),
+        .FLUSH1_i   (FLUSH1_i),
+        .WEN_A2_i   (WEN_A2_i),   .WEN_B2_i   (WEN_B2_i),
+        .REN_A2_i   (REN_A2_i),   .REN_B2_i   (REN_B2_i),
+        .CLK_A2_i   (CLK_A2_i),   .CLK_B2_i   (CLK_B2_i),
+        .BE_A2_i    (BE_A2_i),    .BE_B2_i    (BE_B2_i),
+        .ADDR_A2_i  (ADDR_A2_i),  .ADDR_B2_i  (ADDR_B2_i),
+        .WDATA_A2_i (WDATA_A2_i), .WDATA_B2_i (WDATA_B2_i),
+        .RDATA_A2_o (RDATA_A2_o), .RDATA_B2_o (RDATA_B2_o),
+        .FLUSH2_i   (FLUSH2_i)
+    );
+
+`ifdef SDF_SIM
+	specify
+		(negedge RESET_ni => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+		(negedge RESET_ni => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+		(negedge RESET_ni => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+		(negedge RESET_ni => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+		(posedge CLK_A1_i => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+		(posedge CLK_B1_i => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+		(posedge CLK_A2_i => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+		(posedge CLK_B2_i => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+    $setuphold(posedge CLK_A1_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_A1_i, FLUSH1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, WEN_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, REN_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, BE_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, ADDR_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, WDATA_A1_i, 0, 0);
+    $setuphold(posedge CLK_B1_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_B1_i, WEN_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, REN_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, BE_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, ADDR_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, WDATA_B1_i, 0, 0);
+    $setuphold(posedge CLK_A2_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_A2_i, FLUSH2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, WEN_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, REN_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, BE_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, ADDR_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, WDATA_A2_i, 0, 0);
+    $setuphold(posedge CLK_B2_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_B2_i, WEN_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, REN_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, BE_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, ADDR_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, WDATA_B2_i, 0, 0);
+	endspecify
+`endif
+
+endmodule
+
+module TDP36K_BRAM_WR_X36_RD_X9_nonsplit (
+    RESET_ni,
+    WEN_A1_i,   WEN_B1_i,
+    REN_A1_i,   REN_B1_i,
+    CLK_A1_i,   CLK_B1_i,
+    BE_A1_i,    BE_B1_i,
+    ADDR_A1_i,  ADDR_B1_i,
+    WDATA_A1_i, WDATA_B1_i,
+    RDATA_A1_o, RDATA_B1_o,
+    FLUSH1_i,
+    WEN_A2_i,   WEN_B2_i,
+    REN_A2_i,   REN_B2_i,
+    CLK_A2_i,   CLK_B2_i,
+    BE_A2_i,    BE_B2_i,
+    ADDR_A2_i,  ADDR_B2_i,
+    WDATA_A2_i, WDATA_B2_i,
+    RDATA_A2_o, RDATA_B2_o,
+    FLUSH2_i
+);
+    parameter [80:0] MODE_BITS = 81'd0;
+
+    input  wire RESET_ni;
+    input  wire WEN_A1_i, WEN_B1_i;
+    input  wire REN_A1_i, REN_B1_i;
+    input  wire WEN_A2_i, WEN_B2_i;
+    input  wire REN_A2_i, REN_B2_i;
+
+    (* clkbuf_sink *)
+    input  wire CLK_A1_i;
+    (* clkbuf_sink *)
+    input  wire CLK_B1_i;
+    (* clkbuf_sink *)
+    input  wire CLK_A2_i;
+    (* clkbuf_sink *)
+    input  wire CLK_B2_i;
+
+    input  wire [ 1:0] BE_A1_i,    BE_B1_i;
+    input  wire [14:0] ADDR_A1_i,  ADDR_B1_i;
+    input  wire [17:0] WDATA_A1_i, WDATA_B1_i;
+    output wire [17:0] RDATA_A1_o, RDATA_B1_o;
+
+    input  wire FLUSH1_i;
+
+    input  wire [ 1:0] BE_A2_i,    BE_B2_i;
+    input  wire [13:0] ADDR_A2_i,  ADDR_B2_i;
+    input  wire [17:0] WDATA_A2_i, WDATA_B2_i;
+    output wire [17:0] RDATA_A2_o, RDATA_B2_o;
+
+    input  wire FLUSH2_i;
+
+    TDP36K #(.MODE_BITS(MODE_BITS)) bram (
+        .RESET_ni   (RESET_ni),   
+        .WEN_A1_i   (WEN_A1_i),   .WEN_B1_i   (WEN_B1_i),
+        .REN_A1_i   (REN_A1_i),   .REN_B1_i   (REN_B1_i),
+        .CLK_A1_i   (CLK_A1_i),   .CLK_B1_i   (CLK_B1_i),
+        .BE_A1_i    (BE_A1_i),    .BE_B1_i    (BE_B1_i),
+        .ADDR_A1_i  (ADDR_A1_i),  .ADDR_B1_i  (ADDR_B1_i),
+        .WDATA_A1_i (WDATA_A1_i), .WDATA_B1_i (WDATA_B1_i),
+        .RDATA_A1_o (RDATA_A1_o), .RDATA_B1_o (RDATA_B1_o),
+        .FLUSH1_i   (FLUSH1_i),
+        .WEN_A2_i   (WEN_A2_i),   .WEN_B2_i   (WEN_B2_i),
+        .REN_A2_i   (REN_A2_i),   .REN_B2_i   (REN_B2_i),
+        .CLK_A2_i   (CLK_A2_i),   .CLK_B2_i   (CLK_B2_i),
+        .BE_A2_i    (BE_A2_i),    .BE_B2_i    (BE_B2_i),
+        .ADDR_A2_i  (ADDR_A2_i),  .ADDR_B2_i  (ADDR_B2_i),
+        .WDATA_A2_i (WDATA_A2_i), .WDATA_B2_i (WDATA_B2_i),
+        .RDATA_A2_o (RDATA_A2_o), .RDATA_B2_o (RDATA_B2_o),
+        .FLUSH2_i   (FLUSH2_i)
+    );
+	
+`ifdef SDF_SIM
+	specify
+		(negedge RESET_ni => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+		(negedge RESET_ni => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+		(negedge RESET_ni => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+		(negedge RESET_ni => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+		(posedge CLK_A1_i => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+		(posedge CLK_B1_i => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+		(posedge CLK_A2_i => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+		(posedge CLK_B2_i => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+    $setuphold(posedge CLK_A1_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_A1_i, FLUSH1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, WEN_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, REN_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, BE_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, ADDR_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, WDATA_A1_i, 0, 0);
+    $setuphold(posedge CLK_B1_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_B1_i, WEN_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, REN_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, BE_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, ADDR_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, WDATA_B1_i, 0, 0);
+    $setuphold(posedge CLK_A2_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_A2_i, FLUSH2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, WEN_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, REN_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, BE_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, ADDR_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, WDATA_A2_i, 0, 0);
+    $setuphold(posedge CLK_B2_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_B2_i, WEN_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, REN_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, BE_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, ADDR_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, WDATA_B2_i, 0, 0);
+	endspecify
+`endif
+
+endmodule
+
+module TDP36K_BRAM_WR_X36_RD_X18_nonsplit (
+    RESET_ni,
+    WEN_A1_i,   WEN_B1_i,
+    REN_A1_i,   REN_B1_i,
+    CLK_A1_i,   CLK_B1_i,
+    BE_A1_i,    BE_B1_i,
+    ADDR_A1_i,  ADDR_B1_i,
+    WDATA_A1_i, WDATA_B1_i,
+    RDATA_A1_o, RDATA_B1_o,
+    FLUSH1_i,
+    WEN_A2_i,   WEN_B2_i,
+    REN_A2_i,   REN_B2_i,
+    CLK_A2_i,   CLK_B2_i,
+    BE_A2_i,    BE_B2_i,
+    ADDR_A2_i,  ADDR_B2_i,
+    WDATA_A2_i, WDATA_B2_i,
+    RDATA_A2_o, RDATA_B2_o,
+    FLUSH2_i
+);
+    parameter [80:0] MODE_BITS = 81'd0;
+
+    input  wire RESET_ni;
+    input  wire WEN_A1_i, WEN_B1_i;
+    input  wire REN_A1_i, REN_B1_i;
+    input  wire WEN_A2_i, WEN_B2_i;
+    input  wire REN_A2_i, REN_B2_i;
+
+    (* clkbuf_sink *)
+    input  wire CLK_A1_i;
+    (* clkbuf_sink *)
+    input  wire CLK_B1_i;
+    (* clkbuf_sink *)
+    input  wire CLK_A2_i;
+    (* clkbuf_sink *)
+    input  wire CLK_B2_i;
+
+    input  wire [ 1:0] BE_A1_i,    BE_B1_i;
+    input  wire [14:0] ADDR_A1_i,  ADDR_B1_i;
+    input  wire [17:0] WDATA_A1_i, WDATA_B1_i;
+    output wire [17:0] RDATA_A1_o, RDATA_B1_o;
+
+    input  wire FLUSH1_i;
+
+    input  wire [ 1:0] BE_A2_i,    BE_B2_i;
+    input  wire [13:0] ADDR_A2_i,  ADDR_B2_i;
+    input  wire [17:0] WDATA_A2_i, WDATA_B2_i;
+    output wire [17:0] RDATA_A2_o, RDATA_B2_o;
+
+    input  wire FLUSH2_i;
+
+    TDP36K #(.MODE_BITS(MODE_BITS)) bram (
+        .RESET_ni   (RESET_ni),   
+        .WEN_A1_i   (WEN_A1_i),   .WEN_B1_i   (WEN_B1_i),
+        .REN_A1_i   (REN_A1_i),   .REN_B1_i   (REN_B1_i),
+        .CLK_A1_i   (CLK_A1_i),   .CLK_B1_i   (CLK_B1_i),
+        .BE_A1_i    (BE_A1_i),    .BE_B1_i    (BE_B1_i),
+        .ADDR_A1_i  (ADDR_A1_i),  .ADDR_B1_i  (ADDR_B1_i),
+        .WDATA_A1_i (WDATA_A1_i), .WDATA_B1_i (WDATA_B1_i),
+        .RDATA_A1_o (RDATA_A1_o), .RDATA_B1_o (RDATA_B1_o),
+        .FLUSH1_i   (FLUSH1_i),
+        .WEN_A2_i   (WEN_A2_i),   .WEN_B2_i   (WEN_B2_i),
+        .REN_A2_i   (REN_A2_i),   .REN_B2_i   (REN_B2_i),
+        .CLK_A2_i   (CLK_A2_i),   .CLK_B2_i   (CLK_B2_i),
+        .BE_A2_i    (BE_A2_i),    .BE_B2_i    (BE_B2_i),
+        .ADDR_A2_i  (ADDR_A2_i),  .ADDR_B2_i  (ADDR_B2_i),
+        .WDATA_A2_i (WDATA_A2_i), .WDATA_B2_i (WDATA_B2_i),
+        .RDATA_A2_o (RDATA_A2_o), .RDATA_B2_o (RDATA_B2_o),
+        .FLUSH2_i   (FLUSH2_i)
+    );
+
+`ifdef SDF_SIM
+	specify
+		(negedge RESET_ni => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+		(negedge RESET_ni => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+		(negedge RESET_ni => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+		(negedge RESET_ni => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+		(posedge CLK_A1_i => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+		(posedge CLK_B1_i => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+		(posedge CLK_A2_i => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+		(posedge CLK_B2_i => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+    $setuphold(posedge CLK_A1_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_A1_i, FLUSH1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, WEN_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, REN_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, BE_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, ADDR_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, WDATA_A1_i, 0, 0);
+    $setuphold(posedge CLK_B1_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_B1_i, WEN_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, REN_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, BE_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, ADDR_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, WDATA_B1_i, 0, 0);
+    $setuphold(posedge CLK_A2_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_A2_i, FLUSH2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, WEN_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, REN_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, BE_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, ADDR_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, WDATA_A2_i, 0, 0);
+    $setuphold(posedge CLK_B2_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_B2_i, WEN_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, REN_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, BE_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, ADDR_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, WDATA_B2_i, 0, 0);
+	endspecify
+`endif
+
+endmodule
+
+module TDP36K_BRAM_WR_X36_RD_X36_nonsplit (
+    RESET_ni,
+    WEN_A1_i,   WEN_B1_i,
+    REN_A1_i,   REN_B1_i,
+    CLK_A1_i,   CLK_B1_i,
+    BE_A1_i,    BE_B1_i,
+    ADDR_A1_i,  ADDR_B1_i,
+    WDATA_A1_i, WDATA_B1_i,
+    RDATA_A1_o, RDATA_B1_o,
+    FLUSH1_i,
+    WEN_A2_i,   WEN_B2_i,
+    REN_A2_i,   REN_B2_i,
+    CLK_A2_i,   CLK_B2_i,
+    BE_A2_i,    BE_B2_i,
+    ADDR_A2_i,  ADDR_B2_i,
+    WDATA_A2_i, WDATA_B2_i,
+    RDATA_A2_o, RDATA_B2_o,
+    FLUSH2_i
+);
+    parameter [80:0] MODE_BITS = 81'd0;
+
+    input  wire RESET_ni;
+    input  wire WEN_A1_i, WEN_B1_i;
+    input  wire REN_A1_i, REN_B1_i;
+    input  wire WEN_A2_i, WEN_B2_i;
+    input  wire REN_A2_i, REN_B2_i;
+
+    (* clkbuf_sink *)
+    input  wire CLK_A1_i;
+    (* clkbuf_sink *)
+    input  wire CLK_B1_i;
+    (* clkbuf_sink *)
+    input  wire CLK_A2_i;
+    (* clkbuf_sink *)
+    input  wire CLK_B2_i;
+
+    input  wire [ 1:0] BE_A1_i,    BE_B1_i;
+    input  wire [14:0] ADDR_A1_i,  ADDR_B1_i;
+    input  wire [17:0] WDATA_A1_i, WDATA_B1_i;
+    output wire [17:0] RDATA_A1_o, RDATA_B1_o;
+
+    input  wire FLUSH1_i;
+
+    input  wire [ 1:0] BE_A2_i,    BE_B2_i;
+    input  wire [13:0] ADDR_A2_i,  ADDR_B2_i;
+    input  wire [17:0] WDATA_A2_i, WDATA_B2_i;
+    output wire [17:0] RDATA_A2_o, RDATA_B2_o;
+
+    input  wire FLUSH2_i;
+
+    TDP36K #(.MODE_BITS(MODE_BITS)) bram (
+        .RESET_ni   (RESET_ni),   
+        .WEN_A1_i   (WEN_A1_i),   .WEN_B1_i   (WEN_B1_i),
+        .REN_A1_i   (REN_A1_i),   .REN_B1_i   (REN_B1_i),
+        .CLK_A1_i   (CLK_A1_i),   .CLK_B1_i   (CLK_B1_i),
+        .BE_A1_i    (BE_A1_i),    .BE_B1_i    (BE_B1_i),
+        .ADDR_A1_i  (ADDR_A1_i),  .ADDR_B1_i  (ADDR_B1_i),
+        .WDATA_A1_i (WDATA_A1_i), .WDATA_B1_i (WDATA_B1_i),
+        .RDATA_A1_o (RDATA_A1_o), .RDATA_B1_o (RDATA_B1_o),
+        .FLUSH1_i   (FLUSH1_i),
+        .WEN_A2_i   (WEN_A2_i),   .WEN_B2_i   (WEN_B2_i),
+        .REN_A2_i   (REN_A2_i),   .REN_B2_i   (REN_B2_i),
+        .CLK_A2_i   (CLK_A2_i),   .CLK_B2_i   (CLK_B2_i),
+        .BE_A2_i    (BE_A2_i),    .BE_B2_i    (BE_B2_i),
+        .ADDR_A2_i  (ADDR_A2_i),  .ADDR_B2_i  (ADDR_B2_i),
+        .WDATA_A2_i (WDATA_A2_i), .WDATA_B2_i (WDATA_B2_i),
+        .RDATA_A2_o (RDATA_A2_o), .RDATA_B2_o (RDATA_B2_o),
+        .FLUSH2_i   (FLUSH2_i)
+    );
+
+`ifdef SDF_SIM
+	specify
+		(negedge RESET_ni => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+		(negedge RESET_ni => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+		(negedge RESET_ni => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+		(negedge RESET_ni => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+		(posedge CLK_A1_i => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+		(posedge CLK_B1_i => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+		(posedge CLK_A2_i => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+		(posedge CLK_B2_i => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+    $setuphold(posedge CLK_A1_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_A1_i, FLUSH1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, WEN_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, REN_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, BE_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, ADDR_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, WDATA_A1_i, 0, 0);
+    $setuphold(posedge CLK_B1_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_B1_i, WEN_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, REN_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, BE_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, ADDR_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, WDATA_B1_i, 0, 0);
+    $setuphold(posedge CLK_A2_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_A2_i, FLUSH2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, WEN_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, REN_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, BE_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, ADDR_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, WDATA_A2_i, 0, 0);
+    $setuphold(posedge CLK_B2_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_B2_i, WEN_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, REN_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, BE_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, ADDR_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, WDATA_B2_i, 0, 0);
+	endspecify
+`endif
+
+endmodule
+
+// ============================================================================
+// TDP36K (split mode) write width 1 functional modes
+
+module TDP36K_BRAM_WR_X1_RD_X1_split (
+    RESET_ni,
+    WEN_A1_i,   WEN_B1_i,
+    REN_A1_i,   REN_B1_i,
+    CLK_A1_i,   CLK_B1_i,
+    BE_A1_i,    BE_B1_i,
+    ADDR_A1_i,  ADDR_B1_i,
+    WDATA_A1_i, WDATA_B1_i,
+    RDATA_A1_o, RDATA_B1_o,
+    FLUSH1_i,
+    WEN_A2_i,   WEN_B2_i,
+    REN_A2_i,   REN_B2_i,
+    CLK_A2_i,   CLK_B2_i,
+    BE_A2_i,    BE_B2_i,
+    ADDR_A2_i,  ADDR_B2_i,
+    WDATA_A2_i, WDATA_B2_i,
+    RDATA_A2_o, RDATA_B2_o,
+    FLUSH2_i
+);
+    parameter [80:0] MODE_BITS = 81'd0;
+
+    input  wire RESET_ni;
+    input  wire WEN_A1_i, WEN_B1_i;
+    input  wire REN_A1_i, REN_B1_i;
+    input  wire WEN_A2_i, WEN_B2_i;
+    input  wire REN_A2_i, REN_B2_i;
+
+    (* clkbuf_sink *)
+    input  wire CLK_A1_i;
+    (* clkbuf_sink *)
+    input  wire CLK_B1_i;
+    (* clkbuf_sink *)
+    input  wire CLK_A2_i;
+    (* clkbuf_sink *)
+    input  wire CLK_B2_i;
+
+    input  wire [ 1:0] BE_A1_i,    BE_B1_i;
+    input  wire [14:0] ADDR_A1_i,  ADDR_B1_i;
+    input  wire [17:0] WDATA_A1_i, WDATA_B1_i;
+    output wire [17:0] RDATA_A1_o, RDATA_B1_o;
+
+    input  wire FLUSH1_i;
+
+    input  wire [ 1:0] BE_A2_i,    BE_B2_i;
+    input  wire [13:0] ADDR_A2_i,  ADDR_B2_i;
+    input  wire [17:0] WDATA_A2_i, WDATA_B2_i;
+    output wire [17:0] RDATA_A2_o, RDATA_B2_o;
+
+    input  wire FLUSH2_i;
+
+    TDP36K #(.MODE_BITS(MODE_BITS)) bram (
+        .RESET_ni   (RESET_ni),   
+        .WEN_A1_i   (WEN_A1_i),   .WEN_B1_i   (WEN_B1_i),
+        .REN_A1_i   (REN_A1_i),   .REN_B1_i   (REN_B1_i),
+        .CLK_A1_i   (CLK_A1_i),   .CLK_B1_i   (CLK_B1_i),
+        .BE_A1_i    (BE_A1_i),    .BE_B1_i    (BE_B1_i),
+        .ADDR_A1_i  (ADDR_A1_i),  .ADDR_B1_i  (ADDR_B1_i),
+        .WDATA_A1_i (WDATA_A1_i), .WDATA_B1_i (WDATA_B1_i),
+        .RDATA_A1_o (RDATA_A1_o), .RDATA_B1_o (RDATA_B1_o),
+        .FLUSH1_i   (FLUSH1_i),
+        .WEN_A2_i   (WEN_A2_i),   .WEN_B2_i   (WEN_B2_i),
+        .REN_A2_i   (REN_A2_i),   .REN_B2_i   (REN_B2_i),
+        .CLK_A2_i   (CLK_A2_i),   .CLK_B2_i   (CLK_B2_i),
+        .BE_A2_i    (BE_A2_i),    .BE_B2_i    (BE_B2_i),
+        .ADDR_A2_i  (ADDR_A2_i),  .ADDR_B2_i  (ADDR_B2_i),
+        .WDATA_A2_i (WDATA_A2_i), .WDATA_B2_i (WDATA_B2_i),
+        .RDATA_A2_o (RDATA_A2_o), .RDATA_B2_o (RDATA_B2_o),
+        .FLUSH2_i   (FLUSH2_i)
+    );
+
+`ifdef SDF_SIM
+	specify
+		(negedge RESET_ni => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+		(negedge RESET_ni => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+		(negedge RESET_ni => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+		(negedge RESET_ni => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+		(posedge CLK_A1_i => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+		(posedge CLK_B1_i => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+		(posedge CLK_A2_i => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+		(posedge CLK_B2_i => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+    $setuphold(posedge CLK_A1_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_A1_i, FLUSH1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, WEN_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, REN_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, BE_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, ADDR_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, WDATA_A1_i, 0, 0);
+    $setuphold(posedge CLK_B1_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_B1_i, WEN_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, REN_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, BE_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, ADDR_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, WDATA_B1_i, 0, 0);
+    $setuphold(posedge CLK_A2_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_A2_i, FLUSH2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, WEN_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, REN_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, BE_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, ADDR_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, WDATA_A2_i, 0, 0);
+    $setuphold(posedge CLK_B2_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_B2_i, WEN_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, REN_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, BE_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, ADDR_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, WDATA_B2_i, 0, 0);
+	endspecify
+`endif
+
+endmodule
+
+module TDP36K_BRAM_WR_X1_RD_X2_split (
+    RESET_ni,
+    WEN_A1_i,   WEN_B1_i,
+    REN_A1_i,   REN_B1_i,
+    CLK_A1_i,   CLK_B1_i,
+    BE_A1_i,    BE_B1_i,
+    ADDR_A1_i,  ADDR_B1_i,
+    WDATA_A1_i, WDATA_B1_i,
+    RDATA_A1_o, RDATA_B1_o,
+    FLUSH1_i,
+    WEN_A2_i,   WEN_B2_i,
+    REN_A2_i,   REN_B2_i,
+    CLK_A2_i,   CLK_B2_i,
+    BE_A2_i,    BE_B2_i,
+    ADDR_A2_i,  ADDR_B2_i,
+    WDATA_A2_i, WDATA_B2_i,
+    RDATA_A2_o, RDATA_B2_o,
+    FLUSH2_i
+);
+    parameter [80:0] MODE_BITS = 81'd0;
+
+    input  wire RESET_ni;
+    input  wire WEN_A1_i, WEN_B1_i;
+    input  wire REN_A1_i, REN_B1_i;
+    input  wire WEN_A2_i, WEN_B2_i;
+    input  wire REN_A2_i, REN_B2_i;
+
+    (* clkbuf_sink *)
+    input  wire CLK_A1_i;
+    (* clkbuf_sink *)
+    input  wire CLK_B1_i;
+    (* clkbuf_sink *)
+    input  wire CLK_A2_i;
+    (* clkbuf_sink *)
+    input  wire CLK_B2_i;
+
+    input  wire [ 1:0] BE_A1_i,    BE_B1_i;
+    input  wire [14:0] ADDR_A1_i,  ADDR_B1_i;
+    input  wire [17:0] WDATA_A1_i, WDATA_B1_i;
+    output wire [17:0] RDATA_A1_o, RDATA_B1_o;
+
+    input  wire FLUSH1_i;
+
+    input  wire [ 1:0] BE_A2_i,    BE_B2_i;
+    input  wire [13:0] ADDR_A2_i,  ADDR_B2_i;
+    input  wire [17:0] WDATA_A2_i, WDATA_B2_i;
+    output wire [17:0] RDATA_A2_o, RDATA_B2_o;
+
+    input  wire FLUSH2_i;
+
+    TDP36K #(.MODE_BITS(MODE_BITS)) bram (
+        .RESET_ni   (RESET_ni),   
+        .WEN_A1_i   (WEN_A1_i),   .WEN_B1_i   (WEN_B1_i),
+        .REN_A1_i   (REN_A1_i),   .REN_B1_i   (REN_B1_i),
+        .CLK_A1_i   (CLK_A1_i),   .CLK_B1_i   (CLK_B1_i),
+        .BE_A1_i    (BE_A1_i),    .BE_B1_i    (BE_B1_i),
+        .ADDR_A1_i  (ADDR_A1_i),  .ADDR_B1_i  (ADDR_B1_i),
+        .WDATA_A1_i (WDATA_A1_i), .WDATA_B1_i (WDATA_B1_i),
+        .RDATA_A1_o (RDATA_A1_o), .RDATA_B1_o (RDATA_B1_o),
+        .FLUSH1_i   (FLUSH1_i),
+        .WEN_A2_i   (WEN_A2_i),   .WEN_B2_i   (WEN_B2_i),
+        .REN_A2_i   (REN_A2_i),   .REN_B2_i   (REN_B2_i),
+        .CLK_A2_i   (CLK_A2_i),   .CLK_B2_i   (CLK_B2_i),
+        .BE_A2_i    (BE_A2_i),    .BE_B2_i    (BE_B2_i),
+        .ADDR_A2_i  (ADDR_A2_i),  .ADDR_B2_i  (ADDR_B2_i),
+        .WDATA_A2_i (WDATA_A2_i), .WDATA_B2_i (WDATA_B2_i),
+        .RDATA_A2_o (RDATA_A2_o), .RDATA_B2_o (RDATA_B2_o),
+        .FLUSH2_i   (FLUSH2_i)
+    );
+
+`ifdef SDF_SIM
+	specify
+		(negedge RESET_ni => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+		(negedge RESET_ni => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+		(negedge RESET_ni => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+		(negedge RESET_ni => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+		(posedge CLK_A1_i => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+		(posedge CLK_B1_i => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+		(posedge CLK_A2_i => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+		(posedge CLK_B2_i => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+    $setuphold(posedge CLK_A1_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_A1_i, FLUSH1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, WEN_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, REN_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, BE_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, ADDR_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, WDATA_A1_i, 0, 0);
+    $setuphold(posedge CLK_B1_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_B1_i, WEN_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, REN_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, BE_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, ADDR_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, WDATA_B1_i, 0, 0);
+    $setuphold(posedge CLK_A2_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_A2_i, FLUSH2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, WEN_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, REN_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, BE_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, ADDR_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, WDATA_A2_i, 0, 0);
+    $setuphold(posedge CLK_B2_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_B2_i, WEN_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, REN_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, BE_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, ADDR_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, WDATA_B2_i, 0, 0);
+	endspecify
+`endif
+
+endmodule
+
+module TDP36K_BRAM_WR_X1_RD_X4_split (
+    RESET_ni,
+    WEN_A1_i,   WEN_B1_i,
+    REN_A1_i,   REN_B1_i,
+    CLK_A1_i,   CLK_B1_i,
+    BE_A1_i,    BE_B1_i,
+    ADDR_A1_i,  ADDR_B1_i,
+    WDATA_A1_i, WDATA_B1_i,
+    RDATA_A1_o, RDATA_B1_o,
+    FLUSH1_i,
+    WEN_A2_i,   WEN_B2_i,
+    REN_A2_i,   REN_B2_i,
+    CLK_A2_i,   CLK_B2_i,
+    BE_A2_i,    BE_B2_i,
+    ADDR_A2_i,  ADDR_B2_i,
+    WDATA_A2_i, WDATA_B2_i,
+    RDATA_A2_o, RDATA_B2_o,
+    FLUSH2_i
+);
+    parameter [80:0] MODE_BITS = 81'd0;
+
+    input  wire RESET_ni;
+    input  wire WEN_A1_i, WEN_B1_i;
+    input  wire REN_A1_i, REN_B1_i;
+    input  wire WEN_A2_i, WEN_B2_i;
+    input  wire REN_A2_i, REN_B2_i;
+
+    (* clkbuf_sink *)
+    input  wire CLK_A1_i;
+    (* clkbuf_sink *)
+    input  wire CLK_B1_i;
+    (* clkbuf_sink *)
+    input  wire CLK_A2_i;
+    (* clkbuf_sink *)
+    input  wire CLK_B2_i;
+
+    input  wire [ 1:0] BE_A1_i,    BE_B1_i;
+    input  wire [14:0] ADDR_A1_i,  ADDR_B1_i;
+    input  wire [17:0] WDATA_A1_i, WDATA_B1_i;
+    output wire [17:0] RDATA_A1_o, RDATA_B1_o;
+
+    input  wire FLUSH1_i;
+
+    input  wire [ 1:0] BE_A2_i,    BE_B2_i;
+    input  wire [13:0] ADDR_A2_i,  ADDR_B2_i;
+    input  wire [17:0] WDATA_A2_i, WDATA_B2_i;
+    output wire [17:0] RDATA_A2_o, RDATA_B2_o;
+
+    input  wire FLUSH2_i;
+
+    TDP36K #(.MODE_BITS(MODE_BITS)) bram (
+        .RESET_ni   (RESET_ni),   
+        .WEN_A1_i   (WEN_A1_i),   .WEN_B1_i   (WEN_B1_i),
+        .REN_A1_i   (REN_A1_i),   .REN_B1_i   (REN_B1_i),
+        .CLK_A1_i   (CLK_A1_i),   .CLK_B1_i   (CLK_B1_i),
+        .BE_A1_i    (BE_A1_i),    .BE_B1_i    (BE_B1_i),
+        .ADDR_A1_i  (ADDR_A1_i),  .ADDR_B1_i  (ADDR_B1_i),
+        .WDATA_A1_i (WDATA_A1_i), .WDATA_B1_i (WDATA_B1_i),
+        .RDATA_A1_o (RDATA_A1_o), .RDATA_B1_o (RDATA_B1_o),
+        .FLUSH1_i   (FLUSH1_i),
+        .WEN_A2_i   (WEN_A2_i),   .WEN_B2_i   (WEN_B2_i),
+        .REN_A2_i   (REN_A2_i),   .REN_B2_i   (REN_B2_i),
+        .CLK_A2_i   (CLK_A2_i),   .CLK_B2_i   (CLK_B2_i),
+        .BE_A2_i    (BE_A2_i),    .BE_B2_i    (BE_B2_i),
+        .ADDR_A2_i  (ADDR_A2_i),  .ADDR_B2_i  (ADDR_B2_i),
+        .WDATA_A2_i (WDATA_A2_i), .WDATA_B2_i (WDATA_B2_i),
+        .RDATA_A2_o (RDATA_A2_o), .RDATA_B2_o (RDATA_B2_o),
+        .FLUSH2_i   (FLUSH2_i)
+    );
+
+`ifdef SDF_SIM
+	specify
+		(negedge RESET_ni => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+		(negedge RESET_ni => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+		(negedge RESET_ni => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+		(negedge RESET_ni => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+		(posedge CLK_A1_i => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+		(posedge CLK_B1_i => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+		(posedge CLK_A2_i => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+		(posedge CLK_B2_i => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+    $setuphold(posedge CLK_A1_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_A1_i, FLUSH1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, WEN_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, REN_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, BE_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, ADDR_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, WDATA_A1_i, 0, 0);
+    $setuphold(posedge CLK_B1_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_B1_i, WEN_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, REN_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, BE_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, ADDR_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, WDATA_B1_i, 0, 0);
+    $setuphold(posedge CLK_A2_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_A2_i, FLUSH2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, WEN_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, REN_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, BE_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, ADDR_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, WDATA_A2_i, 0, 0);
+    $setuphold(posedge CLK_B2_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_B2_i, WEN_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, REN_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, BE_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, ADDR_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, WDATA_B2_i, 0, 0);
+	endspecify
+`endif
+
+endmodule
+
+module TDP36K_BRAM_WR_X1_RD_X9_split (
+    RESET_ni,
+    WEN_A1_i,   WEN_B1_i,
+    REN_A1_i,   REN_B1_i,
+    CLK_A1_i,   CLK_B1_i,
+    BE_A1_i,    BE_B1_i,
+    ADDR_A1_i,  ADDR_B1_i,
+    WDATA_A1_i, WDATA_B1_i,
+    RDATA_A1_o, RDATA_B1_o,
+    FLUSH1_i,
+    WEN_A2_i,   WEN_B2_i,
+    REN_A2_i,   REN_B2_i,
+    CLK_A2_i,   CLK_B2_i,
+    BE_A2_i,    BE_B2_i,
+    ADDR_A2_i,  ADDR_B2_i,
+    WDATA_A2_i, WDATA_B2_i,
+    RDATA_A2_o, RDATA_B2_o,
+    FLUSH2_i
+);
+    parameter [80:0] MODE_BITS = 81'd0;
+
+    input  wire RESET_ni;
+    input  wire WEN_A1_i, WEN_B1_i;
+    input  wire REN_A1_i, REN_B1_i;
+    input  wire WEN_A2_i, WEN_B2_i;
+    input  wire REN_A2_i, REN_B2_i;
+
+    (* clkbuf_sink *)
+    input  wire CLK_A1_i;
+    (* clkbuf_sink *)
+    input  wire CLK_B1_i;
+    (* clkbuf_sink *)
+    input  wire CLK_A2_i;
+    (* clkbuf_sink *)
+    input  wire CLK_B2_i;
+
+    input  wire [ 1:0] BE_A1_i,    BE_B1_i;
+    input  wire [14:0] ADDR_A1_i,  ADDR_B1_i;
+    input  wire [17:0] WDATA_A1_i, WDATA_B1_i;
+    output wire [17:0] RDATA_A1_o, RDATA_B1_o;
+
+    input  wire FLUSH1_i;
+
+    input  wire [ 1:0] BE_A2_i,    BE_B2_i;
+    input  wire [13:0] ADDR_A2_i,  ADDR_B2_i;
+    input  wire [17:0] WDATA_A2_i, WDATA_B2_i;
+    output wire [17:0] RDATA_A2_o, RDATA_B2_o;
+
+    input  wire FLUSH2_i;
+
+    TDP36K #(.MODE_BITS(MODE_BITS)) bram (
+        .RESET_ni   (RESET_ni),   
+        .WEN_A1_i   (WEN_A1_i),   .WEN_B1_i   (WEN_B1_i),
+        .REN_A1_i   (REN_A1_i),   .REN_B1_i   (REN_B1_i),
+        .CLK_A1_i   (CLK_A1_i),   .CLK_B1_i   (CLK_B1_i),
+        .BE_A1_i    (BE_A1_i),    .BE_B1_i    (BE_B1_i),
+        .ADDR_A1_i  (ADDR_A1_i),  .ADDR_B1_i  (ADDR_B1_i),
+        .WDATA_A1_i (WDATA_A1_i), .WDATA_B1_i (WDATA_B1_i),
+        .RDATA_A1_o (RDATA_A1_o), .RDATA_B1_o (RDATA_B1_o),
+        .FLUSH1_i   (FLUSH1_i),
+        .WEN_A2_i   (WEN_A2_i),   .WEN_B2_i   (WEN_B2_i),
+        .REN_A2_i   (REN_A2_i),   .REN_B2_i   (REN_B2_i),
+        .CLK_A2_i   (CLK_A2_i),   .CLK_B2_i   (CLK_B2_i),
+        .BE_A2_i    (BE_A2_i),    .BE_B2_i    (BE_B2_i),
+        .ADDR_A2_i  (ADDR_A2_i),  .ADDR_B2_i  (ADDR_B2_i),
+        .WDATA_A2_i (WDATA_A2_i), .WDATA_B2_i (WDATA_B2_i),
+        .RDATA_A2_o (RDATA_A2_o), .RDATA_B2_o (RDATA_B2_o),
+        .FLUSH2_i   (FLUSH2_i)
+    );
+
+`ifdef SDF_SIM
+	specify
+		(negedge RESET_ni => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+		(negedge RESET_ni => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+		(negedge RESET_ni => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+		(negedge RESET_ni => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+		(posedge CLK_A1_i => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+		(posedge CLK_B1_i => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+		(posedge CLK_A2_i => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+		(posedge CLK_B2_i => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+    $setuphold(posedge CLK_A1_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_A1_i, FLUSH1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, WEN_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, REN_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, BE_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, ADDR_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, WDATA_A1_i, 0, 0);
+    $setuphold(posedge CLK_B1_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_B1_i, WEN_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, REN_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, BE_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, ADDR_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, WDATA_B1_i, 0, 0);
+    $setuphold(posedge CLK_A2_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_A2_i, FLUSH2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, WEN_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, REN_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, BE_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, ADDR_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, WDATA_A2_i, 0, 0);
+    $setuphold(posedge CLK_B2_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_B2_i, WEN_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, REN_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, BE_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, ADDR_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, WDATA_B2_i, 0, 0);
+	endspecify
+`endif
+
+endmodule
+
+module TDP36K_BRAM_WR_X1_RD_X18_split (
+    RESET_ni,
+    WEN_A1_i,   WEN_B1_i,
+    REN_A1_i,   REN_B1_i,
+    CLK_A1_i,   CLK_B1_i,
+    BE_A1_i,    BE_B1_i,
+    ADDR_A1_i,  ADDR_B1_i,
+    WDATA_A1_i, WDATA_B1_i,
+    RDATA_A1_o, RDATA_B1_o,
+    FLUSH1_i,
+    WEN_A2_i,   WEN_B2_i,
+    REN_A2_i,   REN_B2_i,
+    CLK_A2_i,   CLK_B2_i,
+    BE_A2_i,    BE_B2_i,
+    ADDR_A2_i,  ADDR_B2_i,
+    WDATA_A2_i, WDATA_B2_i,
+    RDATA_A2_o, RDATA_B2_o,
+    FLUSH2_i
+);
+    parameter [80:0] MODE_BITS = 81'd0;
+
+    input  wire RESET_ni;
+    input  wire WEN_A1_i, WEN_B1_i;
+    input  wire REN_A1_i, REN_B1_i;
+    input  wire WEN_A2_i, WEN_B2_i;
+    input  wire REN_A2_i, REN_B2_i;
+
+    (* clkbuf_sink *)
+    input  wire CLK_A1_i;
+    (* clkbuf_sink *)
+    input  wire CLK_B1_i;
+    (* clkbuf_sink *)
+    input  wire CLK_A2_i;
+    (* clkbuf_sink *)
+    input  wire CLK_B2_i;
+
+    input  wire [ 1:0] BE_A1_i,    BE_B1_i;
+    input  wire [14:0] ADDR_A1_i,  ADDR_B1_i;
+    input  wire [17:0] WDATA_A1_i, WDATA_B1_i;
+    output wire [17:0] RDATA_A1_o, RDATA_B1_o;
+
+    input  wire FLUSH1_i;
+
+    input  wire [ 1:0] BE_A2_i,    BE_B2_i;
+    input  wire [13:0] ADDR_A2_i,  ADDR_B2_i;
+    input  wire [17:0] WDATA_A2_i, WDATA_B2_i;
+    output wire [17:0] RDATA_A2_o, RDATA_B2_o;
+
+    input  wire FLUSH2_i;
+
+    TDP36K #(.MODE_BITS(MODE_BITS)) bram (
+        .RESET_ni   (RESET_ni),   
+        .WEN_A1_i   (WEN_A1_i),   .WEN_B1_i   (WEN_B1_i),
+        .REN_A1_i   (REN_A1_i),   .REN_B1_i   (REN_B1_i),
+        .CLK_A1_i   (CLK_A1_i),   .CLK_B1_i   (CLK_B1_i),
+        .BE_A1_i    (BE_A1_i),    .BE_B1_i    (BE_B1_i),
+        .ADDR_A1_i  (ADDR_A1_i),  .ADDR_B1_i  (ADDR_B1_i),
+        .WDATA_A1_i (WDATA_A1_i), .WDATA_B1_i (WDATA_B1_i),
+        .RDATA_A1_o (RDATA_A1_o), .RDATA_B1_o (RDATA_B1_o),
+        .FLUSH1_i   (FLUSH1_i),
+        .WEN_A2_i   (WEN_A2_i),   .WEN_B2_i   (WEN_B2_i),
+        .REN_A2_i   (REN_A2_i),   .REN_B2_i   (REN_B2_i),
+        .CLK_A2_i   (CLK_A2_i),   .CLK_B2_i   (CLK_B2_i),
+        .BE_A2_i    (BE_A2_i),    .BE_B2_i    (BE_B2_i),
+        .ADDR_A2_i  (ADDR_A2_i),  .ADDR_B2_i  (ADDR_B2_i),
+        .WDATA_A2_i (WDATA_A2_i), .WDATA_B2_i (WDATA_B2_i),
+        .RDATA_A2_o (RDATA_A2_o), .RDATA_B2_o (RDATA_B2_o),
+        .FLUSH2_i   (FLUSH2_i)
+    );
+
+`ifdef SDF_SIM
+	specify
+		(negedge RESET_ni => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+		(negedge RESET_ni => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+		(negedge RESET_ni => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+		(negedge RESET_ni => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+		(posedge CLK_A1_i => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+		(posedge CLK_B1_i => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+		(posedge CLK_A2_i => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+		(posedge CLK_B2_i => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+    $setuphold(posedge CLK_A1_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_A1_i, FLUSH1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, WEN_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, REN_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, BE_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, ADDR_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, WDATA_A1_i, 0, 0);
+    $setuphold(posedge CLK_B1_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_B1_i, WEN_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, REN_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, BE_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, ADDR_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, WDATA_B1_i, 0, 0);
+    $setuphold(posedge CLK_A2_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_A2_i, FLUSH2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, WEN_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, REN_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, BE_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, ADDR_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, WDATA_A2_i, 0, 0);
+    $setuphold(posedge CLK_B2_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_B2_i, WEN_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, REN_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, BE_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, ADDR_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, WDATA_B2_i, 0, 0);
+	endspecify
+`endif
+
+endmodule
+
+// ============================================================================
+// TDP36K (split mode) write width 2 functional modes
+
+module TDP36K_BRAM_WR_X2_RD_X1_split (
+    RESET_ni,
+    WEN_A1_i,   WEN_B1_i,
+    REN_A1_i,   REN_B1_i,
+    CLK_A1_i,   CLK_B1_i,
+    BE_A1_i,    BE_B1_i,
+    ADDR_A1_i,  ADDR_B1_i,
+    WDATA_A1_i, WDATA_B1_i,
+    RDATA_A1_o, RDATA_B1_o,
+    FLUSH1_i,
+    WEN_A2_i,   WEN_B2_i,
+    REN_A2_i,   REN_B2_i,
+    CLK_A2_i,   CLK_B2_i,
+    BE_A2_i,    BE_B2_i,
+    ADDR_A2_i,  ADDR_B2_i,
+    WDATA_A2_i, WDATA_B2_i,
+    RDATA_A2_o, RDATA_B2_o,
+    FLUSH2_i
+);
+    parameter [80:0] MODE_BITS = 81'd0;
+
+    input  wire RESET_ni;
+    input  wire WEN_A1_i, WEN_B1_i;
+    input  wire REN_A1_i, REN_B1_i;
+    input  wire WEN_A2_i, WEN_B2_i;
+    input  wire REN_A2_i, REN_B2_i;
+
+    (* clkbuf_sink *)
+    input  wire CLK_A1_i;
+    (* clkbuf_sink *)
+    input  wire CLK_B1_i;
+    (* clkbuf_sink *)
+    input  wire CLK_A2_i;
+    (* clkbuf_sink *)
+    input  wire CLK_B2_i;
+
+    input  wire [ 1:0] BE_A1_i,    BE_B1_i;
+    input  wire [14:0] ADDR_A1_i,  ADDR_B1_i;
+    input  wire [17:0] WDATA_A1_i, WDATA_B1_i;
+    output wire [17:0] RDATA_A1_o, RDATA_B1_o;
+
+    input  wire FLUSH1_i;
+
+    input  wire [ 1:0] BE_A2_i,    BE_B2_i;
+    input  wire [13:0] ADDR_A2_i,  ADDR_B2_i;
+    input  wire [17:0] WDATA_A2_i, WDATA_B2_i;
+    output wire [17:0] RDATA_A2_o, RDATA_B2_o;
+
+    input  wire FLUSH2_i;
+
+    TDP36K #(.MODE_BITS(MODE_BITS)) bram (
+        .RESET_ni   (RESET_ni),   
+        .WEN_A1_i   (WEN_A1_i),   .WEN_B1_i   (WEN_B1_i),
+        .REN_A1_i   (REN_A1_i),   .REN_B1_i   (REN_B1_i),
+        .CLK_A1_i   (CLK_A1_i),   .CLK_B1_i   (CLK_B1_i),
+        .BE_A1_i    (BE_A1_i),    .BE_B1_i    (BE_B1_i),
+        .ADDR_A1_i  (ADDR_A1_i),  .ADDR_B1_i  (ADDR_B1_i),
+        .WDATA_A1_i (WDATA_A1_i), .WDATA_B1_i (WDATA_B1_i),
+        .RDATA_A1_o (RDATA_A1_o), .RDATA_B1_o (RDATA_B1_o),
+        .FLUSH1_i   (FLUSH1_i),
+        .WEN_A2_i   (WEN_A2_i),   .WEN_B2_i   (WEN_B2_i),
+        .REN_A2_i   (REN_A2_i),   .REN_B2_i   (REN_B2_i),
+        .CLK_A2_i   (CLK_A2_i),   .CLK_B2_i   (CLK_B2_i),
+        .BE_A2_i    (BE_A2_i),    .BE_B2_i    (BE_B2_i),
+        .ADDR_A2_i  (ADDR_A2_i),  .ADDR_B2_i  (ADDR_B2_i),
+        .WDATA_A2_i (WDATA_A2_i), .WDATA_B2_i (WDATA_B2_i),
+        .RDATA_A2_o (RDATA_A2_o), .RDATA_B2_o (RDATA_B2_o),
+        .FLUSH2_i   (FLUSH2_i)
+    );
+
+`ifdef SDF_SIM
+	specify
+		(negedge RESET_ni => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+		(negedge RESET_ni => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+		(negedge RESET_ni => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+		(negedge RESET_ni => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+		(posedge CLK_A1_i => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+		(posedge CLK_B1_i => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+		(posedge CLK_A2_i => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+		(posedge CLK_B2_i => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+    $setuphold(posedge CLK_A1_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_A1_i, FLUSH1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, WEN_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, REN_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, BE_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, ADDR_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, WDATA_A1_i, 0, 0);
+    $setuphold(posedge CLK_B1_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_B1_i, WEN_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, REN_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, BE_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, ADDR_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, WDATA_B1_i, 0, 0);
+    $setuphold(posedge CLK_A2_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_A2_i, FLUSH2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, WEN_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, REN_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, BE_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, ADDR_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, WDATA_A2_i, 0, 0);
+    $setuphold(posedge CLK_B2_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_B2_i, WEN_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, REN_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, BE_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, ADDR_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, WDATA_B2_i, 0, 0);
+	endspecify
+`endif
+
+endmodule
+
+module TDP36K_BRAM_WR_X2_RD_X2_split (
+    RESET_ni,
+    WEN_A1_i,   WEN_B1_i,
+    REN_A1_i,   REN_B1_i,
+    CLK_A1_i,   CLK_B1_i,
+    BE_A1_i,    BE_B1_i,
+    ADDR_A1_i,  ADDR_B1_i,
+    WDATA_A1_i, WDATA_B1_i,
+    RDATA_A1_o, RDATA_B1_o,
+    FLUSH1_i,
+    WEN_A2_i,   WEN_B2_i,
+    REN_A2_i,   REN_B2_i,
+    CLK_A2_i,   CLK_B2_i,
+    BE_A2_i,    BE_B2_i,
+    ADDR_A2_i,  ADDR_B2_i,
+    WDATA_A2_i, WDATA_B2_i,
+    RDATA_A2_o, RDATA_B2_o,
+    FLUSH2_i
+);
+    parameter [80:0] MODE_BITS = 81'd0;
+
+    input  wire RESET_ni;
+    input  wire WEN_A1_i, WEN_B1_i;
+    input  wire REN_A1_i, REN_B1_i;
+    input  wire WEN_A2_i, WEN_B2_i;
+    input  wire REN_A2_i, REN_B2_i;
+
+    (* clkbuf_sink *)
+    input  wire CLK_A1_i;
+    (* clkbuf_sink *)
+    input  wire CLK_B1_i;
+    (* clkbuf_sink *)
+    input  wire CLK_A2_i;
+    (* clkbuf_sink *)
+    input  wire CLK_B2_i;
+
+    input  wire [ 1:0] BE_A1_i,    BE_B1_i;
+    input  wire [14:0] ADDR_A1_i,  ADDR_B1_i;
+    input  wire [17:0] WDATA_A1_i, WDATA_B1_i;
+    output wire [17:0] RDATA_A1_o, RDATA_B1_o;
+
+    input  wire FLUSH1_i;
+
+    input  wire [ 1:0] BE_A2_i,    BE_B2_i;
+    input  wire [13:0] ADDR_A2_i,  ADDR_B2_i;
+    input  wire [17:0] WDATA_A2_i, WDATA_B2_i;
+    output wire [17:0] RDATA_A2_o, RDATA_B2_o;
+
+    input  wire FLUSH2_i;
+
+    TDP36K #(.MODE_BITS(MODE_BITS)) bram (
+        .RESET_ni   (RESET_ni),   
+        .WEN_A1_i   (WEN_A1_i),   .WEN_B1_i   (WEN_B1_i),
+        .REN_A1_i   (REN_A1_i),   .REN_B1_i   (REN_B1_i),
+        .CLK_A1_i   (CLK_A1_i),   .CLK_B1_i   (CLK_B1_i),
+        .BE_A1_i    (BE_A1_i),    .BE_B1_i    (BE_B1_i),
+        .ADDR_A1_i  (ADDR_A1_i),  .ADDR_B1_i  (ADDR_B1_i),
+        .WDATA_A1_i (WDATA_A1_i), .WDATA_B1_i (WDATA_B1_i),
+        .RDATA_A1_o (RDATA_A1_o), .RDATA_B1_o (RDATA_B1_o),
+        .FLUSH1_i   (FLUSH1_i),
+        .WEN_A2_i   (WEN_A2_i),   .WEN_B2_i   (WEN_B2_i),
+        .REN_A2_i   (REN_A2_i),   .REN_B2_i   (REN_B2_i),
+        .CLK_A2_i   (CLK_A2_i),   .CLK_B2_i   (CLK_B2_i),
+        .BE_A2_i    (BE_A2_i),    .BE_B2_i    (BE_B2_i),
+        .ADDR_A2_i  (ADDR_A2_i),  .ADDR_B2_i  (ADDR_B2_i),
+        .WDATA_A2_i (WDATA_A2_i), .WDATA_B2_i (WDATA_B2_i),
+        .RDATA_A2_o (RDATA_A2_o), .RDATA_B2_o (RDATA_B2_o),
+        .FLUSH2_i   (FLUSH2_i)
+    );
+
+`ifdef SDF_SIM
+	specify
+		(negedge RESET_ni => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+		(negedge RESET_ni => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+		(negedge RESET_ni => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+		(negedge RESET_ni => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+		(posedge CLK_A1_i => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+		(posedge CLK_B1_i => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+		(posedge CLK_A2_i => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+		(posedge CLK_B2_i => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+    $setuphold(posedge CLK_A1_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_A1_i, FLUSH1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, WEN_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, REN_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, BE_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, ADDR_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, WDATA_A1_i, 0, 0);
+    $setuphold(posedge CLK_B1_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_B1_i, WEN_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, REN_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, BE_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, ADDR_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, WDATA_B1_i, 0, 0);
+    $setuphold(posedge CLK_A2_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_A2_i, FLUSH2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, WEN_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, REN_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, BE_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, ADDR_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, WDATA_A2_i, 0, 0);
+    $setuphold(posedge CLK_B2_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_B2_i, WEN_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, REN_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, BE_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, ADDR_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, WDATA_B2_i, 0, 0);
+	endspecify
+`endif
+
+endmodule
+
+module TDP36K_BRAM_WR_X2_RD_X4_split (
+    RESET_ni,
+    WEN_A1_i,   WEN_B1_i,
+    REN_A1_i,   REN_B1_i,
+    CLK_A1_i,   CLK_B1_i,
+    BE_A1_i,    BE_B1_i,
+    ADDR_A1_i,  ADDR_B1_i,
+    WDATA_A1_i, WDATA_B1_i,
+    RDATA_A1_o, RDATA_B1_o,
+    FLUSH1_i,
+    WEN_A2_i,   WEN_B2_i,
+    REN_A2_i,   REN_B2_i,
+    CLK_A2_i,   CLK_B2_i,
+    BE_A2_i,    BE_B2_i,
+    ADDR_A2_i,  ADDR_B2_i,
+    WDATA_A2_i, WDATA_B2_i,
+    RDATA_A2_o, RDATA_B2_o,
+    FLUSH2_i
+);
+    parameter [80:0] MODE_BITS = 81'd0;
+
+    input  wire RESET_ni;
+    input  wire WEN_A1_i, WEN_B1_i;
+    input  wire REN_A1_i, REN_B1_i;
+    input  wire WEN_A2_i, WEN_B2_i;
+    input  wire REN_A2_i, REN_B2_i;
+
+    (* clkbuf_sink *)
+    input  wire CLK_A1_i;
+    (* clkbuf_sink *)
+    input  wire CLK_B1_i;
+    (* clkbuf_sink *)
+    input  wire CLK_A2_i;
+    (* clkbuf_sink *)
+    input  wire CLK_B2_i;
+
+    input  wire [ 1:0] BE_A1_i,    BE_B1_i;
+    input  wire [14:0] ADDR_A1_i,  ADDR_B1_i;
+    input  wire [17:0] WDATA_A1_i, WDATA_B1_i;
+    output wire [17:0] RDATA_A1_o, RDATA_B1_o;
+
+    input  wire FLUSH1_i;
+
+    input  wire [ 1:0] BE_A2_i,    BE_B2_i;
+    input  wire [13:0] ADDR_A2_i,  ADDR_B2_i;
+    input  wire [17:0] WDATA_A2_i, WDATA_B2_i;
+    output wire [17:0] RDATA_A2_o, RDATA_B2_o;
+
+    input  wire FLUSH2_i;
+
+    TDP36K #(.MODE_BITS(MODE_BITS)) bram (
+        .RESET_ni   (RESET_ni),   
+        .WEN_A1_i   (WEN_A1_i),   .WEN_B1_i   (WEN_B1_i),
+        .REN_A1_i   (REN_A1_i),   .REN_B1_i   (REN_B1_i),
+        .CLK_A1_i   (CLK_A1_i),   .CLK_B1_i   (CLK_B1_i),
+        .BE_A1_i    (BE_A1_i),    .BE_B1_i    (BE_B1_i),
+        .ADDR_A1_i  (ADDR_A1_i),  .ADDR_B1_i  (ADDR_B1_i),
+        .WDATA_A1_i (WDATA_A1_i), .WDATA_B1_i (WDATA_B1_i),
+        .RDATA_A1_o (RDATA_A1_o), .RDATA_B1_o (RDATA_B1_o),
+        .FLUSH1_i   (FLUSH1_i),
+        .WEN_A2_i   (WEN_A2_i),   .WEN_B2_i   (WEN_B2_i),
+        .REN_A2_i   (REN_A2_i),   .REN_B2_i   (REN_B2_i),
+        .CLK_A2_i   (CLK_A2_i),   .CLK_B2_i   (CLK_B2_i),
+        .BE_A2_i    (BE_A2_i),    .BE_B2_i    (BE_B2_i),
+        .ADDR_A2_i  (ADDR_A2_i),  .ADDR_B2_i  (ADDR_B2_i),
+        .WDATA_A2_i (WDATA_A2_i), .WDATA_B2_i (WDATA_B2_i),
+        .RDATA_A2_o (RDATA_A2_o), .RDATA_B2_o (RDATA_B2_o),
+        .FLUSH2_i   (FLUSH2_i)
+    );
+
+`ifdef SDF_SIM
+	specify
+		(negedge RESET_ni => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+		(negedge RESET_ni => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+		(negedge RESET_ni => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+		(negedge RESET_ni => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+		(posedge CLK_A1_i => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+		(posedge CLK_B1_i => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+		(posedge CLK_A2_i => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+		(posedge CLK_B2_i => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+    $setuphold(posedge CLK_A1_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_A1_i, FLUSH1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, WEN_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, REN_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, BE_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, ADDR_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, WDATA_A1_i, 0, 0);
+    $setuphold(posedge CLK_B1_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_B1_i, WEN_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, REN_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, BE_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, ADDR_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, WDATA_B1_i, 0, 0);
+    $setuphold(posedge CLK_A2_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_A2_i, FLUSH2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, WEN_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, REN_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, BE_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, ADDR_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, WDATA_A2_i, 0, 0);
+    $setuphold(posedge CLK_B2_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_B2_i, WEN_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, REN_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, BE_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, ADDR_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, WDATA_B2_i, 0, 0);
+	endspecify
+`endif
+
+endmodule
+
+module TDP36K_BRAM_WR_X2_RD_X9_split (
+    RESET_ni,
+    WEN_A1_i,   WEN_B1_i,
+    REN_A1_i,   REN_B1_i,
+    CLK_A1_i,   CLK_B1_i,
+    BE_A1_i,    BE_B1_i,
+    ADDR_A1_i,  ADDR_B1_i,
+    WDATA_A1_i, WDATA_B1_i,
+    RDATA_A1_o, RDATA_B1_o,
+    FLUSH1_i,
+    WEN_A2_i,   WEN_B2_i,
+    REN_A2_i,   REN_B2_i,
+    CLK_A2_i,   CLK_B2_i,
+    BE_A2_i,    BE_B2_i,
+    ADDR_A2_i,  ADDR_B2_i,
+    WDATA_A2_i, WDATA_B2_i,
+    RDATA_A2_o, RDATA_B2_o,
+    FLUSH2_i
+);
+    parameter [80:0] MODE_BITS = 81'd0;
+
+    input  wire RESET_ni;
+    input  wire WEN_A1_i, WEN_B1_i;
+    input  wire REN_A1_i, REN_B1_i;
+    input  wire WEN_A2_i, WEN_B2_i;
+    input  wire REN_A2_i, REN_B2_i;
+
+    (* clkbuf_sink *)
+    input  wire CLK_A1_i;
+    (* clkbuf_sink *)
+    input  wire CLK_B1_i;
+    (* clkbuf_sink *)
+    input  wire CLK_A2_i;
+    (* clkbuf_sink *)
+    input  wire CLK_B2_i;
+
+    input  wire [ 1:0] BE_A1_i,    BE_B1_i;
+    input  wire [14:0] ADDR_A1_i,  ADDR_B1_i;
+    input  wire [17:0] WDATA_A1_i, WDATA_B1_i;
+    output wire [17:0] RDATA_A1_o, RDATA_B1_o;
+
+    input  wire FLUSH1_i;
+
+    input  wire [ 1:0] BE_A2_i,    BE_B2_i;
+    input  wire [13:0] ADDR_A2_i,  ADDR_B2_i;
+    input  wire [17:0] WDATA_A2_i, WDATA_B2_i;
+    output wire [17:0] RDATA_A2_o, RDATA_B2_o;
+
+    input  wire FLUSH2_i;
+
+    TDP36K #(.MODE_BITS(MODE_BITS)) bram (
+        .RESET_ni   (RESET_ni),   
+        .WEN_A1_i   (WEN_A1_i),   .WEN_B1_i   (WEN_B1_i),
+        .REN_A1_i   (REN_A1_i),   .REN_B1_i   (REN_B1_i),
+        .CLK_A1_i   (CLK_A1_i),   .CLK_B1_i   (CLK_B1_i),
+        .BE_A1_i    (BE_A1_i),    .BE_B1_i    (BE_B1_i),
+        .ADDR_A1_i  (ADDR_A1_i),  .ADDR_B1_i  (ADDR_B1_i),
+        .WDATA_A1_i (WDATA_A1_i), .WDATA_B1_i (WDATA_B1_i),
+        .RDATA_A1_o (RDATA_A1_o), .RDATA_B1_o (RDATA_B1_o),
+        .FLUSH1_i   (FLUSH1_i),
+        .WEN_A2_i   (WEN_A2_i),   .WEN_B2_i   (WEN_B2_i),
+        .REN_A2_i   (REN_A2_i),   .REN_B2_i   (REN_B2_i),
+        .CLK_A2_i   (CLK_A2_i),   .CLK_B2_i   (CLK_B2_i),
+        .BE_A2_i    (BE_A2_i),    .BE_B2_i    (BE_B2_i),
+        .ADDR_A2_i  (ADDR_A2_i),  .ADDR_B2_i  (ADDR_B2_i),
+        .WDATA_A2_i (WDATA_A2_i), .WDATA_B2_i (WDATA_B2_i),
+        .RDATA_A2_o (RDATA_A2_o), .RDATA_B2_o (RDATA_B2_o),
+        .FLUSH2_i   (FLUSH2_i)
+    );
+
+`ifdef SDF_SIM
+	specify
+		(negedge RESET_ni => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+		(negedge RESET_ni => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+		(negedge RESET_ni => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+		(negedge RESET_ni => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+		(posedge CLK_A1_i => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+		(posedge CLK_B1_i => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+		(posedge CLK_A2_i => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+		(posedge CLK_B2_i => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+    $setuphold(posedge CLK_A1_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_A1_i, FLUSH1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, WEN_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, REN_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, BE_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, ADDR_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, WDATA_A1_i, 0, 0);
+    $setuphold(posedge CLK_B1_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_B1_i, WEN_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, REN_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, BE_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, ADDR_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, WDATA_B1_i, 0, 0);
+    $setuphold(posedge CLK_A2_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_A2_i, FLUSH2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, WEN_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, REN_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, BE_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, ADDR_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, WDATA_A2_i, 0, 0);
+    $setuphold(posedge CLK_B2_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_B2_i, WEN_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, REN_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, BE_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, ADDR_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, WDATA_B2_i, 0, 0);
+	endspecify
+`endif
+
+endmodule
+
+module TDP36K_BRAM_WR_X2_RD_X18_split (
+    RESET_ni,
+    WEN_A1_i,   WEN_B1_i,
+    REN_A1_i,   REN_B1_i,
+    CLK_A1_i,   CLK_B1_i,
+    BE_A1_i,    BE_B1_i,
+    ADDR_A1_i,  ADDR_B1_i,
+    WDATA_A1_i, WDATA_B1_i,
+    RDATA_A1_o, RDATA_B1_o,
+    FLUSH1_i,
+    WEN_A2_i,   WEN_B2_i,
+    REN_A2_i,   REN_B2_i,
+    CLK_A2_i,   CLK_B2_i,
+    BE_A2_i,    BE_B2_i,
+    ADDR_A2_i,  ADDR_B2_i,
+    WDATA_A2_i, WDATA_B2_i,
+    RDATA_A2_o, RDATA_B2_o,
+    FLUSH2_i
+);
+    parameter [80:0] MODE_BITS = 81'd0;
+
+    input  wire RESET_ni;
+    input  wire WEN_A1_i, WEN_B1_i;
+    input  wire REN_A1_i, REN_B1_i;
+    input  wire WEN_A2_i, WEN_B2_i;
+    input  wire REN_A2_i, REN_B2_i;
+
+    (* clkbuf_sink *)
+    input  wire CLK_A1_i;
+    (* clkbuf_sink *)
+    input  wire CLK_B1_i;
+    (* clkbuf_sink *)
+    input  wire CLK_A2_i;
+    (* clkbuf_sink *)
+    input  wire CLK_B2_i;
+
+    input  wire [ 1:0] BE_A1_i,    BE_B1_i;
+    input  wire [14:0] ADDR_A1_i,  ADDR_B1_i;
+    input  wire [17:0] WDATA_A1_i, WDATA_B1_i;
+    output wire [17:0] RDATA_A1_o, RDATA_B1_o;
+
+    input  wire FLUSH1_i;
+
+    input  wire [ 1:0] BE_A2_i,    BE_B2_i;
+    input  wire [13:0] ADDR_A2_i,  ADDR_B2_i;
+    input  wire [17:0] WDATA_A2_i, WDATA_B2_i;
+    output wire [17:0] RDATA_A2_o, RDATA_B2_o;
+
+    input  wire FLUSH2_i;
+
+    TDP36K #(.MODE_BITS(MODE_BITS)) bram (
+        .RESET_ni   (RESET_ni),   
+        .WEN_A1_i   (WEN_A1_i),   .WEN_B1_i   (WEN_B1_i),
+        .REN_A1_i   (REN_A1_i),   .REN_B1_i   (REN_B1_i),
+        .CLK_A1_i   (CLK_A1_i),   .CLK_B1_i   (CLK_B1_i),
+        .BE_A1_i    (BE_A1_i),    .BE_B1_i    (BE_B1_i),
+        .ADDR_A1_i  (ADDR_A1_i),  .ADDR_B1_i  (ADDR_B1_i),
+        .WDATA_A1_i (WDATA_A1_i), .WDATA_B1_i (WDATA_B1_i),
+        .RDATA_A1_o (RDATA_A1_o), .RDATA_B1_o (RDATA_B1_o),
+        .FLUSH1_i   (FLUSH1_i),
+        .WEN_A2_i   (WEN_A2_i),   .WEN_B2_i   (WEN_B2_i),
+        .REN_A2_i   (REN_A2_i),   .REN_B2_i   (REN_B2_i),
+        .CLK_A2_i   (CLK_A2_i),   .CLK_B2_i   (CLK_B2_i),
+        .BE_A2_i    (BE_A2_i),    .BE_B2_i    (BE_B2_i),
+        .ADDR_A2_i  (ADDR_A2_i),  .ADDR_B2_i  (ADDR_B2_i),
+        .WDATA_A2_i (WDATA_A2_i), .WDATA_B2_i (WDATA_B2_i),
+        .RDATA_A2_o (RDATA_A2_o), .RDATA_B2_o (RDATA_B2_o),
+        .FLUSH2_i   (FLUSH2_i)
+    );
+
+`ifdef SDF_SIM
+	specify
+		(negedge RESET_ni => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+		(negedge RESET_ni => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+		(negedge RESET_ni => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+		(negedge RESET_ni => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+		(posedge CLK_A1_i => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+		(posedge CLK_B1_i => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+		(posedge CLK_A2_i => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+		(posedge CLK_B2_i => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+    $setuphold(posedge CLK_A1_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_A1_i, FLUSH1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, WEN_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, REN_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, BE_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, ADDR_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, WDATA_A1_i, 0, 0);
+    $setuphold(posedge CLK_B1_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_B1_i, WEN_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, REN_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, BE_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, ADDR_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, WDATA_B1_i, 0, 0);
+    $setuphold(posedge CLK_A2_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_A2_i, FLUSH2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, WEN_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, REN_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, BE_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, ADDR_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, WDATA_A2_i, 0, 0);
+    $setuphold(posedge CLK_B2_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_B2_i, WEN_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, REN_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, BE_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, ADDR_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, WDATA_B2_i, 0, 0);
+	endspecify
+`endif
+
+endmodule
+
+// ============================================================================
+// TDP36K (split mode) write width 4 functional modes
+
+module TDP36K_BRAM_WR_X4_RD_X1_split (
+    RESET_ni,
+    WEN_A1_i,   WEN_B1_i,
+    REN_A1_i,   REN_B1_i,
+    CLK_A1_i,   CLK_B1_i,
+    BE_A1_i,    BE_B1_i,
+    ADDR_A1_i,  ADDR_B1_i,
+    WDATA_A1_i, WDATA_B1_i,
+    RDATA_A1_o, RDATA_B1_o,
+    FLUSH1_i,
+    WEN_A2_i,   WEN_B2_i,
+    REN_A2_i,   REN_B2_i,
+    CLK_A2_i,   CLK_B2_i,
+    BE_A2_i,    BE_B2_i,
+    ADDR_A2_i,  ADDR_B2_i,
+    WDATA_A2_i, WDATA_B2_i,
+    RDATA_A2_o, RDATA_B2_o,
+    FLUSH2_i
+);
+    parameter [80:0] MODE_BITS = 81'd0;
+
+    input  wire RESET_ni;
+    input  wire WEN_A1_i, WEN_B1_i;
+    input  wire REN_A1_i, REN_B1_i;
+    input  wire WEN_A2_i, WEN_B2_i;
+    input  wire REN_A2_i, REN_B2_i;
+
+    (* clkbuf_sink *)
+    input  wire CLK_A1_i;
+    (* clkbuf_sink *)
+    input  wire CLK_B1_i;
+    (* clkbuf_sink *)
+    input  wire CLK_A2_i;
+    (* clkbuf_sink *)
+    input  wire CLK_B2_i;
+
+    input  wire [ 1:0] BE_A1_i,    BE_B1_i;
+    input  wire [14:0] ADDR_A1_i,  ADDR_B1_i;
+    input  wire [17:0] WDATA_A1_i, WDATA_B1_i;
+    output wire [17:0] RDATA_A1_o, RDATA_B1_o;
+
+    input  wire FLUSH1_i;
+
+    input  wire [ 1:0] BE_A2_i,    BE_B2_i;
+    input  wire [13:0] ADDR_A2_i,  ADDR_B2_i;
+    input  wire [17:0] WDATA_A2_i, WDATA_B2_i;
+    output wire [17:0] RDATA_A2_o, RDATA_B2_o;
+
+    input  wire FLUSH2_i;
+
+    TDP36K #(.MODE_BITS(MODE_BITS)) bram (
+        .RESET_ni   (RESET_ni),   
+        .WEN_A1_i   (WEN_A1_i),   .WEN_B1_i   (WEN_B1_i),
+        .REN_A1_i   (REN_A1_i),   .REN_B1_i   (REN_B1_i),
+        .CLK_A1_i   (CLK_A1_i),   .CLK_B1_i   (CLK_B1_i),
+        .BE_A1_i    (BE_A1_i),    .BE_B1_i    (BE_B1_i),
+        .ADDR_A1_i  (ADDR_A1_i),  .ADDR_B1_i  (ADDR_B1_i),
+        .WDATA_A1_i (WDATA_A1_i), .WDATA_B1_i (WDATA_B1_i),
+        .RDATA_A1_o (RDATA_A1_o), .RDATA_B1_o (RDATA_B1_o),
+        .FLUSH1_i   (FLUSH1_i),
+        .WEN_A2_i   (WEN_A2_i),   .WEN_B2_i   (WEN_B2_i),
+        .REN_A2_i   (REN_A2_i),   .REN_B2_i   (REN_B2_i),
+        .CLK_A2_i   (CLK_A2_i),   .CLK_B2_i   (CLK_B2_i),
+        .BE_A2_i    (BE_A2_i),    .BE_B2_i    (BE_B2_i),
+        .ADDR_A2_i  (ADDR_A2_i),  .ADDR_B2_i  (ADDR_B2_i),
+        .WDATA_A2_i (WDATA_A2_i), .WDATA_B2_i (WDATA_B2_i),
+        .RDATA_A2_o (RDATA_A2_o), .RDATA_B2_o (RDATA_B2_o),
+        .FLUSH2_i   (FLUSH2_i)
+    );
+
+`ifdef SDF_SIM
+	specify
+		(negedge RESET_ni => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+		(negedge RESET_ni => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+		(negedge RESET_ni => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+		(negedge RESET_ni => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+		(posedge CLK_A1_i => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+		(posedge CLK_B1_i => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+		(posedge CLK_A2_i => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+		(posedge CLK_B2_i => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+    $setuphold(posedge CLK_A1_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_A1_i, FLUSH1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, WEN_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, REN_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, BE_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, ADDR_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, WDATA_A1_i, 0, 0);
+    $setuphold(posedge CLK_B1_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_B1_i, WEN_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, REN_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, BE_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, ADDR_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, WDATA_B1_i, 0, 0);
+    $setuphold(posedge CLK_A2_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_A2_i, FLUSH2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, WEN_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, REN_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, BE_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, ADDR_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, WDATA_A2_i, 0, 0);
+    $setuphold(posedge CLK_B2_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_B2_i, WEN_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, REN_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, BE_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, ADDR_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, WDATA_B2_i, 0, 0);
+	endspecify
+`endif
+
+endmodule
+
+module TDP36K_BRAM_WR_X4_RD_X2_split (
+    RESET_ni,
+    WEN_A1_i,   WEN_B1_i,
+    REN_A1_i,   REN_B1_i,
+    CLK_A1_i,   CLK_B1_i,
+    BE_A1_i,    BE_B1_i,
+    ADDR_A1_i,  ADDR_B1_i,
+    WDATA_A1_i, WDATA_B1_i,
+    RDATA_A1_o, RDATA_B1_o,
+    FLUSH1_i,
+    WEN_A2_i,   WEN_B2_i,
+    REN_A2_i,   REN_B2_i,
+    CLK_A2_i,   CLK_B2_i,
+    BE_A2_i,    BE_B2_i,
+    ADDR_A2_i,  ADDR_B2_i,
+    WDATA_A2_i, WDATA_B2_i,
+    RDATA_A2_o, RDATA_B2_o,
+    FLUSH2_i
+);
+    parameter [80:0] MODE_BITS = 81'd0;
+
+    input  wire RESET_ni;
+    input  wire WEN_A1_i, WEN_B1_i;
+    input  wire REN_A1_i, REN_B1_i;
+    input  wire WEN_A2_i, WEN_B2_i;
+    input  wire REN_A2_i, REN_B2_i;
+
+    (* clkbuf_sink *)
+    input  wire CLK_A1_i;
+    (* clkbuf_sink *)
+    input  wire CLK_B1_i;
+    (* clkbuf_sink *)
+    input  wire CLK_A2_i;
+    (* clkbuf_sink *)
+    input  wire CLK_B2_i;
+
+    input  wire [ 1:0] BE_A1_i,    BE_B1_i;
+    input  wire [14:0] ADDR_A1_i,  ADDR_B1_i;
+    input  wire [17:0] WDATA_A1_i, WDATA_B1_i;
+    output wire [17:0] RDATA_A1_o, RDATA_B1_o;
+
+    input  wire FLUSH1_i;
+
+    input  wire [ 1:0] BE_A2_i,    BE_B2_i;
+    input  wire [13:0] ADDR_A2_i,  ADDR_B2_i;
+    input  wire [17:0] WDATA_A2_i, WDATA_B2_i;
+    output wire [17:0] RDATA_A2_o, RDATA_B2_o;
+
+    input  wire FLUSH2_i;
+
+    TDP36K #(.MODE_BITS(MODE_BITS)) bram (
+        .RESET_ni   (RESET_ni),   
+        .WEN_A1_i   (WEN_A1_i),   .WEN_B1_i   (WEN_B1_i),
+        .REN_A1_i   (REN_A1_i),   .REN_B1_i   (REN_B1_i),
+        .CLK_A1_i   (CLK_A1_i),   .CLK_B1_i   (CLK_B1_i),
+        .BE_A1_i    (BE_A1_i),    .BE_B1_i    (BE_B1_i),
+        .ADDR_A1_i  (ADDR_A1_i),  .ADDR_B1_i  (ADDR_B1_i),
+        .WDATA_A1_i (WDATA_A1_i), .WDATA_B1_i (WDATA_B1_i),
+        .RDATA_A1_o (RDATA_A1_o), .RDATA_B1_o (RDATA_B1_o),
+        .FLUSH1_i   (FLUSH1_i),
+        .WEN_A2_i   (WEN_A2_i),   .WEN_B2_i   (WEN_B2_i),
+        .REN_A2_i   (REN_A2_i),   .REN_B2_i   (REN_B2_i),
+        .CLK_A2_i   (CLK_A2_i),   .CLK_B2_i   (CLK_B2_i),
+        .BE_A2_i    (BE_A2_i),    .BE_B2_i    (BE_B2_i),
+        .ADDR_A2_i  (ADDR_A2_i),  .ADDR_B2_i  (ADDR_B2_i),
+        .WDATA_A2_i (WDATA_A2_i), .WDATA_B2_i (WDATA_B2_i),
+        .RDATA_A2_o (RDATA_A2_o), .RDATA_B2_o (RDATA_B2_o),
+        .FLUSH2_i   (FLUSH2_i)
+    );
+
+`ifdef SDF_SIM
+	specify
+		(negedge RESET_ni => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+		(negedge RESET_ni => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+		(negedge RESET_ni => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+		(negedge RESET_ni => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+		(posedge CLK_A1_i => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+		(posedge CLK_B1_i => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+		(posedge CLK_A2_i => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+		(posedge CLK_B2_i => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+    $setuphold(posedge CLK_A1_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_A1_i, FLUSH1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, WEN_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, REN_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, BE_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, ADDR_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, WDATA_A1_i, 0, 0);
+    $setuphold(posedge CLK_B1_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_B1_i, WEN_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, REN_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, BE_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, ADDR_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, WDATA_B1_i, 0, 0);
+    $setuphold(posedge CLK_A2_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_A2_i, FLUSH2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, WEN_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, REN_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, BE_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, ADDR_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, WDATA_A2_i, 0, 0);
+    $setuphold(posedge CLK_B2_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_B2_i, WEN_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, REN_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, BE_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, ADDR_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, WDATA_B2_i, 0, 0);
+	endspecify
+`endif
+
+endmodule
+
+module TDP36K_BRAM_WR_X4_RD_X4_split (
+    RESET_ni,
+    WEN_A1_i,   WEN_B1_i,
+    REN_A1_i,   REN_B1_i,
+    CLK_A1_i,   CLK_B1_i,
+    BE_A1_i,    BE_B1_i,
+    ADDR_A1_i,  ADDR_B1_i,
+    WDATA_A1_i, WDATA_B1_i,
+    RDATA_A1_o, RDATA_B1_o,
+    FLUSH1_i,
+    WEN_A2_i,   WEN_B2_i,
+    REN_A2_i,   REN_B2_i,
+    CLK_A2_i,   CLK_B2_i,
+    BE_A2_i,    BE_B2_i,
+    ADDR_A2_i,  ADDR_B2_i,
+    WDATA_A2_i, WDATA_B2_i,
+    RDATA_A2_o, RDATA_B2_o,
+    FLUSH2_i
+);
+    parameter [80:0] MODE_BITS = 81'd0;
+
+    input  wire RESET_ni;
+    input  wire WEN_A1_i, WEN_B1_i;
+    input  wire REN_A1_i, REN_B1_i;
+    input  wire WEN_A2_i, WEN_B2_i;
+    input  wire REN_A2_i, REN_B2_i;
+
+    (* clkbuf_sink *)
+    input  wire CLK_A1_i;
+    (* clkbuf_sink *)
+    input  wire CLK_B1_i;
+    (* clkbuf_sink *)
+    input  wire CLK_A2_i;
+    (* clkbuf_sink *)
+    input  wire CLK_B2_i;
+
+    input  wire [ 1:0] BE_A1_i,    BE_B1_i;
+    input  wire [14:0] ADDR_A1_i,  ADDR_B1_i;
+    input  wire [17:0] WDATA_A1_i, WDATA_B1_i;
+    output wire [17:0] RDATA_A1_o, RDATA_B1_o;
+
+    input  wire FLUSH1_i;
+
+    input  wire [ 1:0] BE_A2_i,    BE_B2_i;
+    input  wire [13:0] ADDR_A2_i,  ADDR_B2_i;
+    input  wire [17:0] WDATA_A2_i, WDATA_B2_i;
+    output wire [17:0] RDATA_A2_o, RDATA_B2_o;
+
+    input  wire FLUSH2_i;
+
+    TDP36K #(.MODE_BITS(MODE_BITS)) bram (
+        .RESET_ni   (RESET_ni),   
+        .WEN_A1_i   (WEN_A1_i),   .WEN_B1_i   (WEN_B1_i),
+        .REN_A1_i   (REN_A1_i),   .REN_B1_i   (REN_B1_i),
+        .CLK_A1_i   (CLK_A1_i),   .CLK_B1_i   (CLK_B1_i),
+        .BE_A1_i    (BE_A1_i),    .BE_B1_i    (BE_B1_i),
+        .ADDR_A1_i  (ADDR_A1_i),  .ADDR_B1_i  (ADDR_B1_i),
+        .WDATA_A1_i (WDATA_A1_i), .WDATA_B1_i (WDATA_B1_i),
+        .RDATA_A1_o (RDATA_A1_o), .RDATA_B1_o (RDATA_B1_o),
+        .FLUSH1_i   (FLUSH1_i),
+        .WEN_A2_i   (WEN_A2_i),   .WEN_B2_i   (WEN_B2_i),
+        .REN_A2_i   (REN_A2_i),   .REN_B2_i   (REN_B2_i),
+        .CLK_A2_i   (CLK_A2_i),   .CLK_B2_i   (CLK_B2_i),
+        .BE_A2_i    (BE_A2_i),    .BE_B2_i    (BE_B2_i),
+        .ADDR_A2_i  (ADDR_A2_i),  .ADDR_B2_i  (ADDR_B2_i),
+        .WDATA_A2_i (WDATA_A2_i), .WDATA_B2_i (WDATA_B2_i),
+        .RDATA_A2_o (RDATA_A2_o), .RDATA_B2_o (RDATA_B2_o),
+        .FLUSH2_i   (FLUSH2_i)
+    );
+
+`ifdef SDF_SIM
+	specify
+		(negedge RESET_ni => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+		(negedge RESET_ni => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+		(negedge RESET_ni => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+		(negedge RESET_ni => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+		(posedge CLK_A1_i => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+		(posedge CLK_B1_i => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+		(posedge CLK_A2_i => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+		(posedge CLK_B2_i => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+    $setuphold(posedge CLK_A1_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_A1_i, FLUSH1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, WEN_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, REN_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, BE_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, ADDR_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, WDATA_A1_i, 0, 0);
+    $setuphold(posedge CLK_B1_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_B1_i, WEN_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, REN_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, BE_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, ADDR_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, WDATA_B1_i, 0, 0);
+    $setuphold(posedge CLK_A2_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_A2_i, FLUSH2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, WEN_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, REN_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, BE_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, ADDR_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, WDATA_A2_i, 0, 0);
+    $setuphold(posedge CLK_B2_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_B2_i, WEN_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, REN_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, BE_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, ADDR_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, WDATA_B2_i, 0, 0);
+	endspecify
+`endif
+
+endmodule
+
+module TDP36K_BRAM_WR_X4_RD_X9_split (
+    RESET_ni,
+    WEN_A1_i,   WEN_B1_i,
+    REN_A1_i,   REN_B1_i,
+    CLK_A1_i,   CLK_B1_i,
+    BE_A1_i,    BE_B1_i,
+    ADDR_A1_i,  ADDR_B1_i,
+    WDATA_A1_i, WDATA_B1_i,
+    RDATA_A1_o, RDATA_B1_o,
+    FLUSH1_i,
+    WEN_A2_i,   WEN_B2_i,
+    REN_A2_i,   REN_B2_i,
+    CLK_A2_i,   CLK_B2_i,
+    BE_A2_i,    BE_B2_i,
+    ADDR_A2_i,  ADDR_B2_i,
+    WDATA_A2_i, WDATA_B2_i,
+    RDATA_A2_o, RDATA_B2_o,
+    FLUSH2_i
+);
+    parameter [80:0] MODE_BITS = 81'd0;
+
+    input  wire RESET_ni;
+    input  wire WEN_A1_i, WEN_B1_i;
+    input  wire REN_A1_i, REN_B1_i;
+    input  wire WEN_A2_i, WEN_B2_i;
+    input  wire REN_A2_i, REN_B2_i;
+
+    (* clkbuf_sink *)
+    input  wire CLK_A1_i;
+    (* clkbuf_sink *)
+    input  wire CLK_B1_i;
+    (* clkbuf_sink *)
+    input  wire CLK_A2_i;
+    (* clkbuf_sink *)
+    input  wire CLK_B2_i;
+
+    input  wire [ 1:0] BE_A1_i,    BE_B1_i;
+    input  wire [14:0] ADDR_A1_i,  ADDR_B1_i;
+    input  wire [17:0] WDATA_A1_i, WDATA_B1_i;
+    output wire [17:0] RDATA_A1_o, RDATA_B1_o;
+
+    input  wire FLUSH1_i;
+
+    input  wire [ 1:0] BE_A2_i,    BE_B2_i;
+    input  wire [13:0] ADDR_A2_i,  ADDR_B2_i;
+    input  wire [17:0] WDATA_A2_i, WDATA_B2_i;
+    output wire [17:0] RDATA_A2_o, RDATA_B2_o;
+
+    input  wire FLUSH2_i;
+
+    TDP36K #(.MODE_BITS(MODE_BITS)) bram (
+        .RESET_ni   (RESET_ni),   
+        .WEN_A1_i   (WEN_A1_i),   .WEN_B1_i   (WEN_B1_i),
+        .REN_A1_i   (REN_A1_i),   .REN_B1_i   (REN_B1_i),
+        .CLK_A1_i   (CLK_A1_i),   .CLK_B1_i   (CLK_B1_i),
+        .BE_A1_i    (BE_A1_i),    .BE_B1_i    (BE_B1_i),
+        .ADDR_A1_i  (ADDR_A1_i),  .ADDR_B1_i  (ADDR_B1_i),
+        .WDATA_A1_i (WDATA_A1_i), .WDATA_B1_i (WDATA_B1_i),
+        .RDATA_A1_o (RDATA_A1_o), .RDATA_B1_o (RDATA_B1_o),
+        .FLUSH1_i   (FLUSH1_i),
+        .WEN_A2_i   (WEN_A2_i),   .WEN_B2_i   (WEN_B2_i),
+        .REN_A2_i   (REN_A2_i),   .REN_B2_i   (REN_B2_i),
+        .CLK_A2_i   (CLK_A2_i),   .CLK_B2_i   (CLK_B2_i),
+        .BE_A2_i    (BE_A2_i),    .BE_B2_i    (BE_B2_i),
+        .ADDR_A2_i  (ADDR_A2_i),  .ADDR_B2_i  (ADDR_B2_i),
+        .WDATA_A2_i (WDATA_A2_i), .WDATA_B2_i (WDATA_B2_i),
+        .RDATA_A2_o (RDATA_A2_o), .RDATA_B2_o (RDATA_B2_o),
+        .FLUSH2_i   (FLUSH2_i)
+    );
+
+`ifdef SDF_SIM
+	specify
+		(negedge RESET_ni => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+		(negedge RESET_ni => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+		(negedge RESET_ni => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+		(negedge RESET_ni => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+		(posedge CLK_A1_i => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+		(posedge CLK_B1_i => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+		(posedge CLK_A2_i => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+		(posedge CLK_B2_i => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+    $setuphold(posedge CLK_A1_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_A1_i, FLUSH1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, WEN_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, REN_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, BE_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, ADDR_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, WDATA_A1_i, 0, 0);
+    $setuphold(posedge CLK_B1_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_B1_i, WEN_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, REN_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, BE_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, ADDR_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, WDATA_B1_i, 0, 0);
+    $setuphold(posedge CLK_A2_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_A2_i, FLUSH2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, WEN_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, REN_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, BE_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, ADDR_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, WDATA_A2_i, 0, 0);
+    $setuphold(posedge CLK_B2_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_B2_i, WEN_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, REN_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, BE_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, ADDR_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, WDATA_B2_i, 0, 0);
+	endspecify
+`endif
+
+endmodule
+
+module TDP36K_BRAM_WR_X4_RD_X18_split (
+    RESET_ni,
+    WEN_A1_i,   WEN_B1_i,
+    REN_A1_i,   REN_B1_i,
+    CLK_A1_i,   CLK_B1_i,
+    BE_A1_i,    BE_B1_i,
+    ADDR_A1_i,  ADDR_B1_i,
+    WDATA_A1_i, WDATA_B1_i,
+    RDATA_A1_o, RDATA_B1_o,
+    FLUSH1_i,
+    WEN_A2_i,   WEN_B2_i,
+    REN_A2_i,   REN_B2_i,
+    CLK_A2_i,   CLK_B2_i,
+    BE_A2_i,    BE_B2_i,
+    ADDR_A2_i,  ADDR_B2_i,
+    WDATA_A2_i, WDATA_B2_i,
+    RDATA_A2_o, RDATA_B2_o,
+    FLUSH2_i
+);
+    parameter [80:0] MODE_BITS = 81'd0;
+
+    input  wire RESET_ni;
+    input  wire WEN_A1_i, WEN_B1_i;
+    input  wire REN_A1_i, REN_B1_i;
+    input  wire WEN_A2_i, WEN_B2_i;
+    input  wire REN_A2_i, REN_B2_i;
+
+    (* clkbuf_sink *)
+    input  wire CLK_A1_i;
+    (* clkbuf_sink *)
+    input  wire CLK_B1_i;
+    (* clkbuf_sink *)
+    input  wire CLK_A2_i;
+    (* clkbuf_sink *)
+    input  wire CLK_B2_i;
+
+    input  wire [ 1:0] BE_A1_i,    BE_B1_i;
+    input  wire [14:0] ADDR_A1_i,  ADDR_B1_i;
+    input  wire [17:0] WDATA_A1_i, WDATA_B1_i;
+    output wire [17:0] RDATA_A1_o, RDATA_B1_o;
+
+    input  wire FLUSH1_i;
+
+    input  wire [ 1:0] BE_A2_i,    BE_B2_i;
+    input  wire [13:0] ADDR_A2_i,  ADDR_B2_i;
+    input  wire [17:0] WDATA_A2_i, WDATA_B2_i;
+    output wire [17:0] RDATA_A2_o, RDATA_B2_o;
+
+    input  wire FLUSH2_i;
+
+    TDP36K #(.MODE_BITS(MODE_BITS)) bram (
+        .RESET_ni   (RESET_ni),   
+        .WEN_A1_i   (WEN_A1_i),   .WEN_B1_i   (WEN_B1_i),
+        .REN_A1_i   (REN_A1_i),   .REN_B1_i   (REN_B1_i),
+        .CLK_A1_i   (CLK_A1_i),   .CLK_B1_i   (CLK_B1_i),
+        .BE_A1_i    (BE_A1_i),    .BE_B1_i    (BE_B1_i),
+        .ADDR_A1_i  (ADDR_A1_i),  .ADDR_B1_i  (ADDR_B1_i),
+        .WDATA_A1_i (WDATA_A1_i), .WDATA_B1_i (WDATA_B1_i),
+        .RDATA_A1_o (RDATA_A1_o), .RDATA_B1_o (RDATA_B1_o),
+        .FLUSH1_i   (FLUSH1_i),
+        .WEN_A2_i   (WEN_A2_i),   .WEN_B2_i   (WEN_B2_i),
+        .REN_A2_i   (REN_A2_i),   .REN_B2_i   (REN_B2_i),
+        .CLK_A2_i   (CLK_A2_i),   .CLK_B2_i   (CLK_B2_i),
+        .BE_A2_i    (BE_A2_i),    .BE_B2_i    (BE_B2_i),
+        .ADDR_A2_i  (ADDR_A2_i),  .ADDR_B2_i  (ADDR_B2_i),
+        .WDATA_A2_i (WDATA_A2_i), .WDATA_B2_i (WDATA_B2_i),
+        .RDATA_A2_o (RDATA_A2_o), .RDATA_B2_o (RDATA_B2_o),
+        .FLUSH2_i   (FLUSH2_i)
+    );
+
+`ifdef SDF_SIM
+	specify
+		(negedge RESET_ni => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+		(negedge RESET_ni => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+		(negedge RESET_ni => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+		(negedge RESET_ni => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+		(posedge CLK_A1_i => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+		(posedge CLK_B1_i => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+		(posedge CLK_A2_i => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+		(posedge CLK_B2_i => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+    $setuphold(posedge CLK_A1_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_A1_i, FLUSH1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, WEN_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, REN_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, BE_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, ADDR_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, WDATA_A1_i, 0, 0);
+    $setuphold(posedge CLK_B1_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_B1_i, WEN_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, REN_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, BE_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, ADDR_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, WDATA_B1_i, 0, 0);
+    $setuphold(posedge CLK_A2_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_A2_i, FLUSH2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, WEN_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, REN_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, BE_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, ADDR_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, WDATA_A2_i, 0, 0);
+    $setuphold(posedge CLK_B2_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_B2_i, WEN_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, REN_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, BE_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, ADDR_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, WDATA_B2_i, 0, 0);
+	endspecify
+`endif
+
+endmodule
+
+// ============================================================================
+// TDP36K (split mode) write width 9 functional modes
+
+module TDP36K_BRAM_WR_X9_RD_X1_split (
+    RESET_ni,
+    WEN_A1_i,   WEN_B1_i,
+    REN_A1_i,   REN_B1_i,
+    CLK_A1_i,   CLK_B1_i,
+    BE_A1_i,    BE_B1_i,
+    ADDR_A1_i,  ADDR_B1_i,
+    WDATA_A1_i, WDATA_B1_i,
+    RDATA_A1_o, RDATA_B1_o,
+    FLUSH1_i,
+    WEN_A2_i,   WEN_B2_i,
+    REN_A2_i,   REN_B2_i,
+    CLK_A2_i,   CLK_B2_i,
+    BE_A2_i,    BE_B2_i,
+    ADDR_A2_i,  ADDR_B2_i,
+    WDATA_A2_i, WDATA_B2_i,
+    RDATA_A2_o, RDATA_B2_o,
+    FLUSH2_i
+);
+    parameter [80:0] MODE_BITS = 81'd0;
+
+    input  wire RESET_ni;
+    input  wire WEN_A1_i, WEN_B1_i;
+    input  wire REN_A1_i, REN_B1_i;
+    input  wire WEN_A2_i, WEN_B2_i;
+    input  wire REN_A2_i, REN_B2_i;
+
+    (* clkbuf_sink *)
+    input  wire CLK_A1_i;
+    (* clkbuf_sink *)
+    input  wire CLK_B1_i;
+    (* clkbuf_sink *)
+    input  wire CLK_A2_i;
+    (* clkbuf_sink *)
+    input  wire CLK_B2_i;
+
+    input  wire [ 1:0] BE_A1_i,    BE_B1_i;
+    input  wire [14:0] ADDR_A1_i,  ADDR_B1_i;
+    input  wire [17:0] WDATA_A1_i, WDATA_B1_i;
+    output wire [17:0] RDATA_A1_o, RDATA_B1_o;
+
+    input  wire FLUSH1_i;
+
+    input  wire [ 1:0] BE_A2_i,    BE_B2_i;
+    input  wire [13:0] ADDR_A2_i,  ADDR_B2_i;
+    input  wire [17:0] WDATA_A2_i, WDATA_B2_i;
+    output wire [17:0] RDATA_A2_o, RDATA_B2_o;
+
+    input  wire FLUSH2_i;
+
+    TDP36K #(.MODE_BITS(MODE_BITS)) bram (
+        .RESET_ni   (RESET_ni),   
+        .WEN_A1_i   (WEN_A1_i),   .WEN_B1_i   (WEN_B1_i),
+        .REN_A1_i   (REN_A1_i),   .REN_B1_i   (REN_B1_i),
+        .CLK_A1_i   (CLK_A1_i),   .CLK_B1_i   (CLK_B1_i),
+        .BE_A1_i    (BE_A1_i),    .BE_B1_i    (BE_B1_i),
+        .ADDR_A1_i  (ADDR_A1_i),  .ADDR_B1_i  (ADDR_B1_i),
+        .WDATA_A1_i (WDATA_A1_i), .WDATA_B1_i (WDATA_B1_i),
+        .RDATA_A1_o (RDATA_A1_o), .RDATA_B1_o (RDATA_B1_o),
+        .FLUSH1_i   (FLUSH1_i),
+        .WEN_A2_i   (WEN_A2_i),   .WEN_B2_i   (WEN_B2_i),
+        .REN_A2_i   (REN_A2_i),   .REN_B2_i   (REN_B2_i),
+        .CLK_A2_i   (CLK_A2_i),   .CLK_B2_i   (CLK_B2_i),
+        .BE_A2_i    (BE_A2_i),    .BE_B2_i    (BE_B2_i),
+        .ADDR_A2_i  (ADDR_A2_i),  .ADDR_B2_i  (ADDR_B2_i),
+        .WDATA_A2_i (WDATA_A2_i), .WDATA_B2_i (WDATA_B2_i),
+        .RDATA_A2_o (RDATA_A2_o), .RDATA_B2_o (RDATA_B2_o),
+        .FLUSH2_i   (FLUSH2_i)
+    );
+
+`ifdef SDF_SIM
+	specify
+		(negedge RESET_ni => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+		(negedge RESET_ni => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+		(negedge RESET_ni => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+		(negedge RESET_ni => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+		(posedge CLK_A1_i => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+		(posedge CLK_B1_i => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+		(posedge CLK_A2_i => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+		(posedge CLK_B2_i => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+    $setuphold(posedge CLK_A1_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_A1_i, FLUSH1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, WEN_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, REN_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, BE_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, ADDR_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, WDATA_A1_i, 0, 0);
+    $setuphold(posedge CLK_B1_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_B1_i, WEN_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, REN_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, BE_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, ADDR_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, WDATA_B1_i, 0, 0);
+    $setuphold(posedge CLK_A2_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_A2_i, FLUSH2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, WEN_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, REN_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, BE_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, ADDR_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, WDATA_A2_i, 0, 0);
+    $setuphold(posedge CLK_B2_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_B2_i, WEN_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, REN_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, BE_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, ADDR_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, WDATA_B2_i, 0, 0);
+	endspecify
+`endif
+
+endmodule
+
+module TDP36K_BRAM_WR_X9_RD_X2_split (
+    RESET_ni,
+    WEN_A1_i,   WEN_B1_i,
+    REN_A1_i,   REN_B1_i,
+    CLK_A1_i,   CLK_B1_i,
+    BE_A1_i,    BE_B1_i,
+    ADDR_A1_i,  ADDR_B1_i,
+    WDATA_A1_i, WDATA_B1_i,
+    RDATA_A1_o, RDATA_B1_o,
+    FLUSH1_i,
+    WEN_A2_i,   WEN_B2_i,
+    REN_A2_i,   REN_B2_i,
+    CLK_A2_i,   CLK_B2_i,
+    BE_A2_i,    BE_B2_i,
+    ADDR_A2_i,  ADDR_B2_i,
+    WDATA_A2_i, WDATA_B2_i,
+    RDATA_A2_o, RDATA_B2_o,
+    FLUSH2_i
+);
+    parameter [80:0] MODE_BITS = 81'd0;
+
+    input  wire RESET_ni;
+    input  wire WEN_A1_i, WEN_B1_i;
+    input  wire REN_A1_i, REN_B1_i;
+    input  wire WEN_A2_i, WEN_B2_i;
+    input  wire REN_A2_i, REN_B2_i;
+
+    (* clkbuf_sink *)
+    input  wire CLK_A1_i;
+    (* clkbuf_sink *)
+    input  wire CLK_B1_i;
+    (* clkbuf_sink *)
+    input  wire CLK_A2_i;
+    (* clkbuf_sink *)
+    input  wire CLK_B2_i;
+
+    input  wire [ 1:0] BE_A1_i,    BE_B1_i;
+    input  wire [14:0] ADDR_A1_i,  ADDR_B1_i;
+    input  wire [17:0] WDATA_A1_i, WDATA_B1_i;
+    output wire [17:0] RDATA_A1_o, RDATA_B1_o;
+
+    input  wire FLUSH1_i;
+
+    input  wire [ 1:0] BE_A2_i,    BE_B2_i;
+    input  wire [13:0] ADDR_A2_i,  ADDR_B2_i;
+    input  wire [17:0] WDATA_A2_i, WDATA_B2_i;
+    output wire [17:0] RDATA_A2_o, RDATA_B2_o;
+
+    input  wire FLUSH2_i;
+
+    TDP36K #(.MODE_BITS(MODE_BITS)) bram (
+        .RESET_ni   (RESET_ni),   
+        .WEN_A1_i   (WEN_A1_i),   .WEN_B1_i   (WEN_B1_i),
+        .REN_A1_i   (REN_A1_i),   .REN_B1_i   (REN_B1_i),
+        .CLK_A1_i   (CLK_A1_i),   .CLK_B1_i   (CLK_B1_i),
+        .BE_A1_i    (BE_A1_i),    .BE_B1_i    (BE_B1_i),
+        .ADDR_A1_i  (ADDR_A1_i),  .ADDR_B1_i  (ADDR_B1_i),
+        .WDATA_A1_i (WDATA_A1_i), .WDATA_B1_i (WDATA_B1_i),
+        .RDATA_A1_o (RDATA_A1_o), .RDATA_B1_o (RDATA_B1_o),
+        .FLUSH1_i   (FLUSH1_i),
+        .WEN_A2_i   (WEN_A2_i),   .WEN_B2_i   (WEN_B2_i),
+        .REN_A2_i   (REN_A2_i),   .REN_B2_i   (REN_B2_i),
+        .CLK_A2_i   (CLK_A2_i),   .CLK_B2_i   (CLK_B2_i),
+        .BE_A2_i    (BE_A2_i),    .BE_B2_i    (BE_B2_i),
+        .ADDR_A2_i  (ADDR_A2_i),  .ADDR_B2_i  (ADDR_B2_i),
+        .WDATA_A2_i (WDATA_A2_i), .WDATA_B2_i (WDATA_B2_i),
+        .RDATA_A2_o (RDATA_A2_o), .RDATA_B2_o (RDATA_B2_o),
+        .FLUSH2_i   (FLUSH2_i)
+    );
+
+`ifdef SDF_SIM
+	specify
+		(negedge RESET_ni => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+		(negedge RESET_ni => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+		(negedge RESET_ni => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+		(negedge RESET_ni => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+		(posedge CLK_A1_i => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+		(posedge CLK_B1_i => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+		(posedge CLK_A2_i => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+		(posedge CLK_B2_i => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+    $setuphold(posedge CLK_A1_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_A1_i, FLUSH1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, WEN_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, REN_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, BE_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, ADDR_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, WDATA_A1_i, 0, 0);
+    $setuphold(posedge CLK_B1_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_B1_i, WEN_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, REN_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, BE_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, ADDR_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, WDATA_B1_i, 0, 0);
+    $setuphold(posedge CLK_A2_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_A2_i, FLUSH2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, WEN_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, REN_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, BE_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, ADDR_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, WDATA_A2_i, 0, 0);
+    $setuphold(posedge CLK_B2_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_B2_i, WEN_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, REN_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, BE_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, ADDR_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, WDATA_B2_i, 0, 0);
+	endspecify
+`endif
+
+endmodule
+
+module TDP36K_BRAM_WR_X9_RD_X4_split (
+    RESET_ni,
+    WEN_A1_i,   WEN_B1_i,
+    REN_A1_i,   REN_B1_i,
+    CLK_A1_i,   CLK_B1_i,
+    BE_A1_i,    BE_B1_i,
+    ADDR_A1_i,  ADDR_B1_i,
+    WDATA_A1_i, WDATA_B1_i,
+    RDATA_A1_o, RDATA_B1_o,
+    FLUSH1_i,
+    WEN_A2_i,   WEN_B2_i,
+    REN_A2_i,   REN_B2_i,
+    CLK_A2_i,   CLK_B2_i,
+    BE_A2_i,    BE_B2_i,
+    ADDR_A2_i,  ADDR_B2_i,
+    WDATA_A2_i, WDATA_B2_i,
+    RDATA_A2_o, RDATA_B2_o,
+    FLUSH2_i
+);
+    parameter [80:0] MODE_BITS = 81'd0;
+
+    input  wire RESET_ni;
+    input  wire WEN_A1_i, WEN_B1_i;
+    input  wire REN_A1_i, REN_B1_i;
+    input  wire WEN_A2_i, WEN_B2_i;
+    input  wire REN_A2_i, REN_B2_i;
+
+    (* clkbuf_sink *)
+    input  wire CLK_A1_i;
+    (* clkbuf_sink *)
+    input  wire CLK_B1_i;
+    (* clkbuf_sink *)
+    input  wire CLK_A2_i;
+    (* clkbuf_sink *)
+    input  wire CLK_B2_i;
+
+    input  wire [ 1:0] BE_A1_i,    BE_B1_i;
+    input  wire [14:0] ADDR_A1_i,  ADDR_B1_i;
+    input  wire [17:0] WDATA_A1_i, WDATA_B1_i;
+    output wire [17:0] RDATA_A1_o, RDATA_B1_o;
+
+    input  wire FLUSH1_i;
+
+    input  wire [ 1:0] BE_A2_i,    BE_B2_i;
+    input  wire [13:0] ADDR_A2_i,  ADDR_B2_i;
+    input  wire [17:0] WDATA_A2_i, WDATA_B2_i;
+    output wire [17:0] RDATA_A2_o, RDATA_B2_o;
+
+    input  wire FLUSH2_i;
+
+    TDP36K #(.MODE_BITS(MODE_BITS)) bram (
+        .RESET_ni   (RESET_ni),   
+        .WEN_A1_i   (WEN_A1_i),   .WEN_B1_i   (WEN_B1_i),
+        .REN_A1_i   (REN_A1_i),   .REN_B1_i   (REN_B1_i),
+        .CLK_A1_i   (CLK_A1_i),   .CLK_B1_i   (CLK_B1_i),
+        .BE_A1_i    (BE_A1_i),    .BE_B1_i    (BE_B1_i),
+        .ADDR_A1_i  (ADDR_A1_i),  .ADDR_B1_i  (ADDR_B1_i),
+        .WDATA_A1_i (WDATA_A1_i), .WDATA_B1_i (WDATA_B1_i),
+        .RDATA_A1_o (RDATA_A1_o), .RDATA_B1_o (RDATA_B1_o),
+        .FLUSH1_i   (FLUSH1_i),
+        .WEN_A2_i   (WEN_A2_i),   .WEN_B2_i   (WEN_B2_i),
+        .REN_A2_i   (REN_A2_i),   .REN_B2_i   (REN_B2_i),
+        .CLK_A2_i   (CLK_A2_i),   .CLK_B2_i   (CLK_B2_i),
+        .BE_A2_i    (BE_A2_i),    .BE_B2_i    (BE_B2_i),
+        .ADDR_A2_i  (ADDR_A2_i),  .ADDR_B2_i  (ADDR_B2_i),
+        .WDATA_A2_i (WDATA_A2_i), .WDATA_B2_i (WDATA_B2_i),
+        .RDATA_A2_o (RDATA_A2_o), .RDATA_B2_o (RDATA_B2_o),
+        .FLUSH2_i   (FLUSH2_i)
+    );
+
+`ifdef SDF_SIM
+	specify
+		(negedge RESET_ni => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+		(negedge RESET_ni => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+		(negedge RESET_ni => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+		(negedge RESET_ni => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+		(posedge CLK_A1_i => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+		(posedge CLK_B1_i => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+		(posedge CLK_A2_i => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+		(posedge CLK_B2_i => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+    $setuphold(posedge CLK_A1_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_A1_i, FLUSH1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, WEN_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, REN_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, BE_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, ADDR_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, WDATA_A1_i, 0, 0);
+    $setuphold(posedge CLK_B1_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_B1_i, WEN_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, REN_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, BE_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, ADDR_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, WDATA_B1_i, 0, 0);
+    $setuphold(posedge CLK_A2_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_A2_i, FLUSH2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, WEN_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, REN_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, BE_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, ADDR_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, WDATA_A2_i, 0, 0);
+    $setuphold(posedge CLK_B2_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_B2_i, WEN_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, REN_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, BE_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, ADDR_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, WDATA_B2_i, 0, 0);
+	endspecify
+`endif
+
+endmodule
+
+module TDP36K_BRAM_WR_X9_RD_X9_split (
+    RESET_ni,
+    WEN_A1_i,   WEN_B1_i,
+    REN_A1_i,   REN_B1_i,
+    CLK_A1_i,   CLK_B1_i,
+    BE_A1_i,    BE_B1_i,
+    ADDR_A1_i,  ADDR_B1_i,
+    WDATA_A1_i, WDATA_B1_i,
+    RDATA_A1_o, RDATA_B1_o,
+    FLUSH1_i,
+    WEN_A2_i,   WEN_B2_i,
+    REN_A2_i,   REN_B2_i,
+    CLK_A2_i,   CLK_B2_i,
+    BE_A2_i,    BE_B2_i,
+    ADDR_A2_i,  ADDR_B2_i,
+    WDATA_A2_i, WDATA_B2_i,
+    RDATA_A2_o, RDATA_B2_o,
+    FLUSH2_i
+);
+    parameter [80:0] MODE_BITS = 81'd0;
+
+    input  wire RESET_ni;
+    input  wire WEN_A1_i, WEN_B1_i;
+    input  wire REN_A1_i, REN_B1_i;
+    input  wire WEN_A2_i, WEN_B2_i;
+    input  wire REN_A2_i, REN_B2_i;
+
+    (* clkbuf_sink *)
+    input  wire CLK_A1_i;
+    (* clkbuf_sink *)
+    input  wire CLK_B1_i;
+    (* clkbuf_sink *)
+    input  wire CLK_A2_i;
+    (* clkbuf_sink *)
+    input  wire CLK_B2_i;
+
+    input  wire [ 1:0] BE_A1_i,    BE_B1_i;
+    input  wire [14:0] ADDR_A1_i,  ADDR_B1_i;
+    input  wire [17:0] WDATA_A1_i, WDATA_B1_i;
+    output wire [17:0] RDATA_A1_o, RDATA_B1_o;
+
+    input  wire FLUSH1_i;
+
+    input  wire [ 1:0] BE_A2_i,    BE_B2_i;
+    input  wire [13:0] ADDR_A2_i,  ADDR_B2_i;
+    input  wire [17:0] WDATA_A2_i, WDATA_B2_i;
+    output wire [17:0] RDATA_A2_o, RDATA_B2_o;
+
+    input  wire FLUSH2_i;
+
+    TDP36K #(.MODE_BITS(MODE_BITS)) bram (
+        .RESET_ni   (RESET_ni),   
+        .WEN_A1_i   (WEN_A1_i),   .WEN_B1_i   (WEN_B1_i),
+        .REN_A1_i   (REN_A1_i),   .REN_B1_i   (REN_B1_i),
+        .CLK_A1_i   (CLK_A1_i),   .CLK_B1_i   (CLK_B1_i),
+        .BE_A1_i    (BE_A1_i),    .BE_B1_i    (BE_B1_i),
+        .ADDR_A1_i  (ADDR_A1_i),  .ADDR_B1_i  (ADDR_B1_i),
+        .WDATA_A1_i (WDATA_A1_i), .WDATA_B1_i (WDATA_B1_i),
+        .RDATA_A1_o (RDATA_A1_o), .RDATA_B1_o (RDATA_B1_o),
+        .FLUSH1_i   (FLUSH1_i),
+        .WEN_A2_i   (WEN_A2_i),   .WEN_B2_i   (WEN_B2_i),
+        .REN_A2_i   (REN_A2_i),   .REN_B2_i   (REN_B2_i),
+        .CLK_A2_i   (CLK_A2_i),   .CLK_B2_i   (CLK_B2_i),
+        .BE_A2_i    (BE_A2_i),    .BE_B2_i    (BE_B2_i),
+        .ADDR_A2_i  (ADDR_A2_i),  .ADDR_B2_i  (ADDR_B2_i),
+        .WDATA_A2_i (WDATA_A2_i), .WDATA_B2_i (WDATA_B2_i),
+        .RDATA_A2_o (RDATA_A2_o), .RDATA_B2_o (RDATA_B2_o),
+        .FLUSH2_i   (FLUSH2_i)
+    );
+
+`ifdef SDF_SIM
+	specify
+		(negedge RESET_ni => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+		(negedge RESET_ni => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+		(negedge RESET_ni => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+		(negedge RESET_ni => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+		(posedge CLK_A1_i => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+		(posedge CLK_B1_i => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+		(posedge CLK_A2_i => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+		(posedge CLK_B2_i => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+    $setuphold(posedge CLK_A1_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_A1_i, FLUSH1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, WEN_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, REN_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, BE_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, ADDR_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, WDATA_A1_i, 0, 0);
+    $setuphold(posedge CLK_B1_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_B1_i, WEN_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, REN_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, BE_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, ADDR_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, WDATA_B1_i, 0, 0);
+    $setuphold(posedge CLK_A2_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_A2_i, FLUSH2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, WEN_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, REN_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, BE_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, ADDR_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, WDATA_A2_i, 0, 0);
+    $setuphold(posedge CLK_B2_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_B2_i, WEN_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, REN_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, BE_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, ADDR_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, WDATA_B2_i, 0, 0);
+	endspecify
+`endif
+
+endmodule
+
+module TDP36K_BRAM_WR_X9_RD_X18_split (
+    RESET_ni,
+    WEN_A1_i,   WEN_B1_i,
+    REN_A1_i,   REN_B1_i,
+    CLK_A1_i,   CLK_B1_i,
+    BE_A1_i,    BE_B1_i,
+    ADDR_A1_i,  ADDR_B1_i,
+    WDATA_A1_i, WDATA_B1_i,
+    RDATA_A1_o, RDATA_B1_o,
+    FLUSH1_i,
+    WEN_A2_i,   WEN_B2_i,
+    REN_A2_i,   REN_B2_i,
+    CLK_A2_i,   CLK_B2_i,
+    BE_A2_i,    BE_B2_i,
+    ADDR_A2_i,  ADDR_B2_i,
+    WDATA_A2_i, WDATA_B2_i,
+    RDATA_A2_o, RDATA_B2_o,
+    FLUSH2_i
+);
+    parameter [80:0] MODE_BITS = 81'd0;
+
+    input  wire RESET_ni;
+    input  wire WEN_A1_i, WEN_B1_i;
+    input  wire REN_A1_i, REN_B1_i;
+    input  wire WEN_A2_i, WEN_B2_i;
+    input  wire REN_A2_i, REN_B2_i;
+
+    (* clkbuf_sink *)
+    input  wire CLK_A1_i;
+    (* clkbuf_sink *)
+    input  wire CLK_B1_i;
+    (* clkbuf_sink *)
+    input  wire CLK_A2_i;
+    (* clkbuf_sink *)
+    input  wire CLK_B2_i;
+
+    input  wire [ 1:0] BE_A1_i,    BE_B1_i;
+    input  wire [14:0] ADDR_A1_i,  ADDR_B1_i;
+    input  wire [17:0] WDATA_A1_i, WDATA_B1_i;
+    output wire [17:0] RDATA_A1_o, RDATA_B1_o;
+
+    input  wire FLUSH1_i;
+
+    input  wire [ 1:0] BE_A2_i,    BE_B2_i;
+    input  wire [13:0] ADDR_A2_i,  ADDR_B2_i;
+    input  wire [17:0] WDATA_A2_i, WDATA_B2_i;
+    output wire [17:0] RDATA_A2_o, RDATA_B2_o;
+
+    input  wire FLUSH2_i;
+
+    TDP36K #(.MODE_BITS(MODE_BITS)) bram (
+        .RESET_ni   (RESET_ni),   
+        .WEN_A1_i   (WEN_A1_i),   .WEN_B1_i   (WEN_B1_i),
+        .REN_A1_i   (REN_A1_i),   .REN_B1_i   (REN_B1_i),
+        .CLK_A1_i   (CLK_A1_i),   .CLK_B1_i   (CLK_B1_i),
+        .BE_A1_i    (BE_A1_i),    .BE_B1_i    (BE_B1_i),
+        .ADDR_A1_i  (ADDR_A1_i),  .ADDR_B1_i  (ADDR_B1_i),
+        .WDATA_A1_i (WDATA_A1_i), .WDATA_B1_i (WDATA_B1_i),
+        .RDATA_A1_o (RDATA_A1_o), .RDATA_B1_o (RDATA_B1_o),
+        .FLUSH1_i   (FLUSH1_i),
+        .WEN_A2_i   (WEN_A2_i),   .WEN_B2_i   (WEN_B2_i),
+        .REN_A2_i   (REN_A2_i),   .REN_B2_i   (REN_B2_i),
+        .CLK_A2_i   (CLK_A2_i),   .CLK_B2_i   (CLK_B2_i),
+        .BE_A2_i    (BE_A2_i),    .BE_B2_i    (BE_B2_i),
+        .ADDR_A2_i  (ADDR_A2_i),  .ADDR_B2_i  (ADDR_B2_i),
+        .WDATA_A2_i (WDATA_A2_i), .WDATA_B2_i (WDATA_B2_i),
+        .RDATA_A2_o (RDATA_A2_o), .RDATA_B2_o (RDATA_B2_o),
+        .FLUSH2_i   (FLUSH2_i)
+    );
+
+`ifdef SDF_SIM
+	specify
+		(negedge RESET_ni => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+		(negedge RESET_ni => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+		(negedge RESET_ni => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+		(negedge RESET_ni => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+		(posedge CLK_A1_i => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+		(posedge CLK_B1_i => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+		(posedge CLK_A2_i => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+		(posedge CLK_B2_i => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+    $setuphold(posedge CLK_A1_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_A1_i, FLUSH1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, WEN_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, REN_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, BE_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, ADDR_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, WDATA_A1_i, 0, 0);
+    $setuphold(posedge CLK_B1_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_B1_i, WEN_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, REN_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, BE_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, ADDR_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, WDATA_B1_i, 0, 0);
+    $setuphold(posedge CLK_A2_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_A2_i, FLUSH2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, WEN_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, REN_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, BE_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, ADDR_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, WDATA_A2_i, 0, 0);
+    $setuphold(posedge CLK_B2_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_B2_i, WEN_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, REN_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, BE_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, ADDR_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, WDATA_B2_i, 0, 0);
+	endspecify
+`endif
+
+endmodule
+
+// ============================================================================
+// TDP36K (split mode) write width 18 functional modes
+
+module TDP36K_BRAM_WR_X18_RD_X1_split (
+    RESET_ni,
+    WEN_A1_i,   WEN_B1_i,
+    REN_A1_i,   REN_B1_i,
+    CLK_A1_i,   CLK_B1_i,
+    BE_A1_i,    BE_B1_i,
+    ADDR_A1_i,  ADDR_B1_i,
+    WDATA_A1_i, WDATA_B1_i,
+    RDATA_A1_o, RDATA_B1_o,
+    FLUSH1_i,
+    WEN_A2_i,   WEN_B2_i,
+    REN_A2_i,   REN_B2_i,
+    CLK_A2_i,   CLK_B2_i,
+    BE_A2_i,    BE_B2_i,
+    ADDR_A2_i,  ADDR_B2_i,
+    WDATA_A2_i, WDATA_B2_i,
+    RDATA_A2_o, RDATA_B2_o,
+    FLUSH2_i
+);
+    parameter [80:0] MODE_BITS = 81'd0;
+
+    input  wire RESET_ni;
+    input  wire WEN_A1_i, WEN_B1_i;
+    input  wire REN_A1_i, REN_B1_i;
+    input  wire WEN_A2_i, WEN_B2_i;
+    input  wire REN_A2_i, REN_B2_i;
+
+    (* clkbuf_sink *)
+    input  wire CLK_A1_i;
+    (* clkbuf_sink *)
+    input  wire CLK_B1_i;
+    (* clkbuf_sink *)
+    input  wire CLK_A2_i;
+    (* clkbuf_sink *)
+    input  wire CLK_B2_i;
+
+    input  wire [ 1:0] BE_A1_i,    BE_B1_i;
+    input  wire [14:0] ADDR_A1_i,  ADDR_B1_i;
+    input  wire [17:0] WDATA_A1_i, WDATA_B1_i;
+    output wire [17:0] RDATA_A1_o, RDATA_B1_o;
+
+    input  wire FLUSH1_i;
+
+    input  wire [ 1:0] BE_A2_i,    BE_B2_i;
+    input  wire [13:0] ADDR_A2_i,  ADDR_B2_i;
+    input  wire [17:0] WDATA_A2_i, WDATA_B2_i;
+    output wire [17:0] RDATA_A2_o, RDATA_B2_o;
+
+    input  wire FLUSH2_i;
+
+    TDP36K #(.MODE_BITS(MODE_BITS)) bram (
+        .RESET_ni   (RESET_ni),   
+        .WEN_A1_i   (WEN_A1_i),   .WEN_B1_i   (WEN_B1_i),
+        .REN_A1_i   (REN_A1_i),   .REN_B1_i   (REN_B1_i),
+        .CLK_A1_i   (CLK_A1_i),   .CLK_B1_i   (CLK_B1_i),
+        .BE_A1_i    (BE_A1_i),    .BE_B1_i    (BE_B1_i),
+        .ADDR_A1_i  (ADDR_A1_i),  .ADDR_B1_i  (ADDR_B1_i),
+        .WDATA_A1_i (WDATA_A1_i), .WDATA_B1_i (WDATA_B1_i),
+        .RDATA_A1_o (RDATA_A1_o), .RDATA_B1_o (RDATA_B1_o),
+        .FLUSH1_i   (FLUSH1_i),
+        .WEN_A2_i   (WEN_A2_i),   .WEN_B2_i   (WEN_B2_i),
+        .REN_A2_i   (REN_A2_i),   .REN_B2_i   (REN_B2_i),
+        .CLK_A2_i   (CLK_A2_i),   .CLK_B2_i   (CLK_B2_i),
+        .BE_A2_i    (BE_A2_i),    .BE_B2_i    (BE_B2_i),
+        .ADDR_A2_i  (ADDR_A2_i),  .ADDR_B2_i  (ADDR_B2_i),
+        .WDATA_A2_i (WDATA_A2_i), .WDATA_B2_i (WDATA_B2_i),
+        .RDATA_A2_o (RDATA_A2_o), .RDATA_B2_o (RDATA_B2_o),
+        .FLUSH2_i   (FLUSH2_i)
+    );
+
+`ifdef SDF_SIM
+	specify
+		(negedge RESET_ni => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+		(negedge RESET_ni => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+		(negedge RESET_ni => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+		(negedge RESET_ni => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+		(posedge CLK_A1_i => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+		(posedge CLK_B1_i => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+		(posedge CLK_A2_i => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+		(posedge CLK_B2_i => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+    $setuphold(posedge CLK_A1_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_A1_i, FLUSH1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, WEN_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, REN_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, BE_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, ADDR_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, WDATA_A1_i, 0, 0);
+    $setuphold(posedge CLK_B1_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_B1_i, WEN_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, REN_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, BE_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, ADDR_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, WDATA_B1_i, 0, 0);
+    $setuphold(posedge CLK_A2_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_A2_i, FLUSH2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, WEN_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, REN_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, BE_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, ADDR_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, WDATA_A2_i, 0, 0);
+    $setuphold(posedge CLK_B2_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_B2_i, WEN_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, REN_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, BE_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, ADDR_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, WDATA_B2_i, 0, 0);
+	endspecify
+`endif
+
+endmodule
+
+module TDP36K_BRAM_WR_X18_RD_X2_split (
+    RESET_ni,
+    WEN_A1_i,   WEN_B1_i,
+    REN_A1_i,   REN_B1_i,
+    CLK_A1_i,   CLK_B1_i,
+    BE_A1_i,    BE_B1_i,
+    ADDR_A1_i,  ADDR_B1_i,
+    WDATA_A1_i, WDATA_B1_i,
+    RDATA_A1_o, RDATA_B1_o,
+    FLUSH1_i,
+    WEN_A2_i,   WEN_B2_i,
+    REN_A2_i,   REN_B2_i,
+    CLK_A2_i,   CLK_B2_i,
+    BE_A2_i,    BE_B2_i,
+    ADDR_A2_i,  ADDR_B2_i,
+    WDATA_A2_i, WDATA_B2_i,
+    RDATA_A2_o, RDATA_B2_o,
+    FLUSH2_i
+);
+    parameter [80:0] MODE_BITS = 81'd0;
+
+    input  wire RESET_ni;
+    input  wire WEN_A1_i, WEN_B1_i;
+    input  wire REN_A1_i, REN_B1_i;
+    input  wire WEN_A2_i, WEN_B2_i;
+    input  wire REN_A2_i, REN_B2_i;
+
+    (* clkbuf_sink *)
+    input  wire CLK_A1_i;
+    (* clkbuf_sink *)
+    input  wire CLK_B1_i;
+    (* clkbuf_sink *)
+    input  wire CLK_A2_i;
+    (* clkbuf_sink *)
+    input  wire CLK_B2_i;
+
+    input  wire [ 1:0] BE_A1_i,    BE_B1_i;
+    input  wire [14:0] ADDR_A1_i,  ADDR_B1_i;
+    input  wire [17:0] WDATA_A1_i, WDATA_B1_i;
+    output wire [17:0] RDATA_A1_o, RDATA_B1_o;
+
+    input  wire FLUSH1_i;
+
+    input  wire [ 1:0] BE_A2_i,    BE_B2_i;
+    input  wire [13:0] ADDR_A2_i,  ADDR_B2_i;
+    input  wire [17:0] WDATA_A2_i, WDATA_B2_i;
+    output wire [17:0] RDATA_A2_o, RDATA_B2_o;
+
+    input  wire FLUSH2_i;
+
+    TDP36K #(.MODE_BITS(MODE_BITS)) bram (
+        .RESET_ni   (RESET_ni),   
+        .WEN_A1_i   (WEN_A1_i),   .WEN_B1_i   (WEN_B1_i),
+        .REN_A1_i   (REN_A1_i),   .REN_B1_i   (REN_B1_i),
+        .CLK_A1_i   (CLK_A1_i),   .CLK_B1_i   (CLK_B1_i),
+        .BE_A1_i    (BE_A1_i),    .BE_B1_i    (BE_B1_i),
+        .ADDR_A1_i  (ADDR_A1_i),  .ADDR_B1_i  (ADDR_B1_i),
+        .WDATA_A1_i (WDATA_A1_i), .WDATA_B1_i (WDATA_B1_i),
+        .RDATA_A1_o (RDATA_A1_o), .RDATA_B1_o (RDATA_B1_o),
+        .FLUSH1_i   (FLUSH1_i),
+        .WEN_A2_i   (WEN_A2_i),   .WEN_B2_i   (WEN_B2_i),
+        .REN_A2_i   (REN_A2_i),   .REN_B2_i   (REN_B2_i),
+        .CLK_A2_i   (CLK_A2_i),   .CLK_B2_i   (CLK_B2_i),
+        .BE_A2_i    (BE_A2_i),    .BE_B2_i    (BE_B2_i),
+        .ADDR_A2_i  (ADDR_A2_i),  .ADDR_B2_i  (ADDR_B2_i),
+        .WDATA_A2_i (WDATA_A2_i), .WDATA_B2_i (WDATA_B2_i),
+        .RDATA_A2_o (RDATA_A2_o), .RDATA_B2_o (RDATA_B2_o),
+        .FLUSH2_i   (FLUSH2_i)
+    );
+
+`ifdef SDF_SIM
+	specify
+		(negedge RESET_ni => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+		(negedge RESET_ni => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+		(negedge RESET_ni => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+		(negedge RESET_ni => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+		(posedge CLK_A1_i => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+		(posedge CLK_B1_i => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+		(posedge CLK_A2_i => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+		(posedge CLK_B2_i => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+    $setuphold(posedge CLK_A1_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_A1_i, FLUSH1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, WEN_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, REN_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, BE_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, ADDR_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, WDATA_A1_i, 0, 0);
+    $setuphold(posedge CLK_B1_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_B1_i, WEN_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, REN_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, BE_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, ADDR_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, WDATA_B1_i, 0, 0);
+    $setuphold(posedge CLK_A2_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_A2_i, FLUSH2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, WEN_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, REN_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, BE_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, ADDR_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, WDATA_A2_i, 0, 0);
+    $setuphold(posedge CLK_B2_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_B2_i, WEN_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, REN_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, BE_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, ADDR_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, WDATA_B2_i, 0, 0);
+	endspecify
+`endif
+
+endmodule
+
+module TDP36K_BRAM_WR_X18_RD_X4_split (
+    RESET_ni,
+    WEN_A1_i,   WEN_B1_i,
+    REN_A1_i,   REN_B1_i,
+    CLK_A1_i,   CLK_B1_i,
+    BE_A1_i,    BE_B1_i,
+    ADDR_A1_i,  ADDR_B1_i,
+    WDATA_A1_i, WDATA_B1_i,
+    RDATA_A1_o, RDATA_B1_o,
+    FLUSH1_i,
+    WEN_A2_i,   WEN_B2_i,
+    REN_A2_i,   REN_B2_i,
+    CLK_A2_i,   CLK_B2_i,
+    BE_A2_i,    BE_B2_i,
+    ADDR_A2_i,  ADDR_B2_i,
+    WDATA_A2_i, WDATA_B2_i,
+    RDATA_A2_o, RDATA_B2_o,
+    FLUSH2_i
+);
+    parameter [80:0] MODE_BITS = 81'd0;
+
+    input  wire RESET_ni;
+    input  wire WEN_A1_i, WEN_B1_i;
+    input  wire REN_A1_i, REN_B1_i;
+    input  wire WEN_A2_i, WEN_B2_i;
+    input  wire REN_A2_i, REN_B2_i;
+
+    (* clkbuf_sink *)
+    input  wire CLK_A1_i;
+    (* clkbuf_sink *)
+    input  wire CLK_B1_i;
+    (* clkbuf_sink *)
+    input  wire CLK_A2_i;
+    (* clkbuf_sink *)
+    input  wire CLK_B2_i;
+
+    input  wire [ 1:0] BE_A1_i,    BE_B1_i;
+    input  wire [14:0] ADDR_A1_i,  ADDR_B1_i;
+    input  wire [17:0] WDATA_A1_i, WDATA_B1_i;
+    output wire [17:0] RDATA_A1_o, RDATA_B1_o;
+
+    input  wire FLUSH1_i;
+
+    input  wire [ 1:0] BE_A2_i,    BE_B2_i;
+    input  wire [13:0] ADDR_A2_i,  ADDR_B2_i;
+    input  wire [17:0] WDATA_A2_i, WDATA_B2_i;
+    output wire [17:0] RDATA_A2_o, RDATA_B2_o;
+
+    input  wire FLUSH2_i;
+
+    TDP36K #(.MODE_BITS(MODE_BITS)) bram (
+        .RESET_ni   (RESET_ni),   
+        .WEN_A1_i   (WEN_A1_i),   .WEN_B1_i   (WEN_B1_i),
+        .REN_A1_i   (REN_A1_i),   .REN_B1_i   (REN_B1_i),
+        .CLK_A1_i   (CLK_A1_i),   .CLK_B1_i   (CLK_B1_i),
+        .BE_A1_i    (BE_A1_i),    .BE_B1_i    (BE_B1_i),
+        .ADDR_A1_i  (ADDR_A1_i),  .ADDR_B1_i  (ADDR_B1_i),
+        .WDATA_A1_i (WDATA_A1_i), .WDATA_B1_i (WDATA_B1_i),
+        .RDATA_A1_o (RDATA_A1_o), .RDATA_B1_o (RDATA_B1_o),
+        .FLUSH1_i   (FLUSH1_i),
+        .WEN_A2_i   (WEN_A2_i),   .WEN_B2_i   (WEN_B2_i),
+        .REN_A2_i   (REN_A2_i),   .REN_B2_i   (REN_B2_i),
+        .CLK_A2_i   (CLK_A2_i),   .CLK_B2_i   (CLK_B2_i),
+        .BE_A2_i    (BE_A2_i),    .BE_B2_i    (BE_B2_i),
+        .ADDR_A2_i  (ADDR_A2_i),  .ADDR_B2_i  (ADDR_B2_i),
+        .WDATA_A2_i (WDATA_A2_i), .WDATA_B2_i (WDATA_B2_i),
+        .RDATA_A2_o (RDATA_A2_o), .RDATA_B2_o (RDATA_B2_o),
+        .FLUSH2_i   (FLUSH2_i)
+    );
+
+`ifdef SDF_SIM
+	specify
+		(negedge RESET_ni => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+		(negedge RESET_ni => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+		(negedge RESET_ni => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+		(negedge RESET_ni => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+		(posedge CLK_A1_i => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+		(posedge CLK_B1_i => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+		(posedge CLK_A2_i => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+		(posedge CLK_B2_i => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+    $setuphold(posedge CLK_A1_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_A1_i, FLUSH1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, WEN_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, REN_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, BE_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, ADDR_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, WDATA_A1_i, 0, 0);
+    $setuphold(posedge CLK_B1_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_B1_i, WEN_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, REN_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, BE_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, ADDR_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, WDATA_B1_i, 0, 0);
+    $setuphold(posedge CLK_A2_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_A2_i, FLUSH2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, WEN_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, REN_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, BE_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, ADDR_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, WDATA_A2_i, 0, 0);
+    $setuphold(posedge CLK_B2_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_B2_i, WEN_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, REN_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, BE_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, ADDR_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, WDATA_B2_i, 0, 0);
+	endspecify
+`endif
+
+endmodule
+
+module TDP36K_BRAM_WR_X18_RD_X9_split (
+    RESET_ni,
+    WEN_A1_i,   WEN_B1_i,
+    REN_A1_i,   REN_B1_i,
+    CLK_A1_i,   CLK_B1_i,
+    BE_A1_i,    BE_B1_i,
+    ADDR_A1_i,  ADDR_B1_i,
+    WDATA_A1_i, WDATA_B1_i,
+    RDATA_A1_o, RDATA_B1_o,
+    FLUSH1_i,
+    WEN_A2_i,   WEN_B2_i,
+    REN_A2_i,   REN_B2_i,
+    CLK_A2_i,   CLK_B2_i,
+    BE_A2_i,    BE_B2_i,
+    ADDR_A2_i,  ADDR_B2_i,
+    WDATA_A2_i, WDATA_B2_i,
+    RDATA_A2_o, RDATA_B2_o,
+    FLUSH2_i
+);
+    parameter [80:0] MODE_BITS = 81'd0;
+
+    input  wire RESET_ni;
+    input  wire WEN_A1_i, WEN_B1_i;
+    input  wire REN_A1_i, REN_B1_i;
+    input  wire WEN_A2_i, WEN_B2_i;
+    input  wire REN_A2_i, REN_B2_i;
+
+    (* clkbuf_sink *)
+    input  wire CLK_A1_i;
+    (* clkbuf_sink *)
+    input  wire CLK_B1_i;
+    (* clkbuf_sink *)
+    input  wire CLK_A2_i;
+    (* clkbuf_sink *)
+    input  wire CLK_B2_i;
+
+    input  wire [ 1:0] BE_A1_i,    BE_B1_i;
+    input  wire [14:0] ADDR_A1_i,  ADDR_B1_i;
+    input  wire [17:0] WDATA_A1_i, WDATA_B1_i;
+    output wire [17:0] RDATA_A1_o, RDATA_B1_o;
+
+    input  wire FLUSH1_i;
+
+    input  wire [ 1:0] BE_A2_i,    BE_B2_i;
+    input  wire [13:0] ADDR_A2_i,  ADDR_B2_i;
+    input  wire [17:0] WDATA_A2_i, WDATA_B2_i;
+    output wire [17:0] RDATA_A2_o, RDATA_B2_o;
+
+    input  wire FLUSH2_i;
+
+    TDP36K #(.MODE_BITS(MODE_BITS)) bram (
+        .RESET_ni   (RESET_ni),   
+        .WEN_A1_i   (WEN_A1_i),   .WEN_B1_i   (WEN_B1_i),
+        .REN_A1_i   (REN_A1_i),   .REN_B1_i   (REN_B1_i),
+        .CLK_A1_i   (CLK_A1_i),   .CLK_B1_i   (CLK_B1_i),
+        .BE_A1_i    (BE_A1_i),    .BE_B1_i    (BE_B1_i),
+        .ADDR_A1_i  (ADDR_A1_i),  .ADDR_B1_i  (ADDR_B1_i),
+        .WDATA_A1_i (WDATA_A1_i), .WDATA_B1_i (WDATA_B1_i),
+        .RDATA_A1_o (RDATA_A1_o), .RDATA_B1_o (RDATA_B1_o),
+        .FLUSH1_i   (FLUSH1_i),
+        .WEN_A2_i   (WEN_A2_i),   .WEN_B2_i   (WEN_B2_i),
+        .REN_A2_i   (REN_A2_i),   .REN_B2_i   (REN_B2_i),
+        .CLK_A2_i   (CLK_A2_i),   .CLK_B2_i   (CLK_B2_i),
+        .BE_A2_i    (BE_A2_i),    .BE_B2_i    (BE_B2_i),
+        .ADDR_A2_i  (ADDR_A2_i),  .ADDR_B2_i  (ADDR_B2_i),
+        .WDATA_A2_i (WDATA_A2_i), .WDATA_B2_i (WDATA_B2_i),
+        .RDATA_A2_o (RDATA_A2_o), .RDATA_B2_o (RDATA_B2_o),
+        .FLUSH2_i   (FLUSH2_i)
+    );
+
+`ifdef SDF_SIM
+	specify
+		(negedge RESET_ni => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+		(negedge RESET_ni => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+		(negedge RESET_ni => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+		(negedge RESET_ni => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+		(posedge CLK_A1_i => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+		(posedge CLK_B1_i => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+		(posedge CLK_A2_i => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+		(posedge CLK_B2_i => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+    $setuphold(posedge CLK_A1_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_A1_i, FLUSH1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, WEN_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, REN_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, BE_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, ADDR_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, WDATA_A1_i, 0, 0);
+    $setuphold(posedge CLK_B1_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_B1_i, WEN_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, REN_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, BE_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, ADDR_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, WDATA_B1_i, 0, 0);
+    $setuphold(posedge CLK_A2_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_A2_i, FLUSH2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, WEN_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, REN_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, BE_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, ADDR_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, WDATA_A2_i, 0, 0);
+    $setuphold(posedge CLK_B2_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_B2_i, WEN_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, REN_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, BE_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, ADDR_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, WDATA_B2_i, 0, 0);
+	endspecify
+`endif
+
+endmodule
+
+module TDP36K_BRAM_WR_X18_RD_X18_split (
+    RESET_ni,
+    WEN_A1_i,   WEN_B1_i,
+    REN_A1_i,   REN_B1_i,
+    CLK_A1_i,   CLK_B1_i,
+    BE_A1_i,    BE_B1_i,
+    ADDR_A1_i,  ADDR_B1_i,
+    WDATA_A1_i, WDATA_B1_i,
+    RDATA_A1_o, RDATA_B1_o,
+    FLUSH1_i,
+    WEN_A2_i,   WEN_B2_i,
+    REN_A2_i,   REN_B2_i,
+    CLK_A2_i,   CLK_B2_i,
+    BE_A2_i,    BE_B2_i,
+    ADDR_A2_i,  ADDR_B2_i,
+    WDATA_A2_i, WDATA_B2_i,
+    RDATA_A2_o, RDATA_B2_o,
+    FLUSH2_i
+);
+    parameter [80:0] MODE_BITS = 81'd0;
+
+    input  wire RESET_ni;
+    input  wire WEN_A1_i, WEN_B1_i;
+    input  wire REN_A1_i, REN_B1_i;
+    input  wire WEN_A2_i, WEN_B2_i;
+    input  wire REN_A2_i, REN_B2_i;
+
+    (* clkbuf_sink *)
+    input  wire CLK_A1_i;
+    (* clkbuf_sink *)
+    input  wire CLK_B1_i;
+    (* clkbuf_sink *)
+    input  wire CLK_A2_i;
+    (* clkbuf_sink *)
+    input  wire CLK_B2_i;
+
+    input  wire [ 1:0] BE_A1_i,    BE_B1_i;
+    input  wire [14:0] ADDR_A1_i,  ADDR_B1_i;
+    input  wire [17:0] WDATA_A1_i, WDATA_B1_i;
+    output wire [17:0] RDATA_A1_o, RDATA_B1_o;
+
+    input  wire FLUSH1_i;
+
+    input  wire [ 1:0] BE_A2_i,    BE_B2_i;
+    input  wire [13:0] ADDR_A2_i,  ADDR_B2_i;
+    input  wire [17:0] WDATA_A2_i, WDATA_B2_i;
+    output wire [17:0] RDATA_A2_o, RDATA_B2_o;
+
+    input  wire FLUSH2_i;
+
+    TDP36K #(.MODE_BITS(MODE_BITS)) bram (
+        .RESET_ni   (RESET_ni),   
+        .WEN_A1_i   (WEN_A1_i),   .WEN_B1_i   (WEN_B1_i),
+        .REN_A1_i   (REN_A1_i),   .REN_B1_i   (REN_B1_i),
+        .CLK_A1_i   (CLK_A1_i),   .CLK_B1_i   (CLK_B1_i),
+        .BE_A1_i    (BE_A1_i),    .BE_B1_i    (BE_B1_i),
+        .ADDR_A1_i  (ADDR_A1_i),  .ADDR_B1_i  (ADDR_B1_i),
+        .WDATA_A1_i (WDATA_A1_i), .WDATA_B1_i (WDATA_B1_i),
+        .RDATA_A1_o (RDATA_A1_o), .RDATA_B1_o (RDATA_B1_o),
+        .FLUSH1_i   (FLUSH1_i),
+        .WEN_A2_i   (WEN_A2_i),   .WEN_B2_i   (WEN_B2_i),
+        .REN_A2_i   (REN_A2_i),   .REN_B2_i   (REN_B2_i),
+        .CLK_A2_i   (CLK_A2_i),   .CLK_B2_i   (CLK_B2_i),
+        .BE_A2_i    (BE_A2_i),    .BE_B2_i    (BE_B2_i),
+        .ADDR_A2_i  (ADDR_A2_i),  .ADDR_B2_i  (ADDR_B2_i),
+        .WDATA_A2_i (WDATA_A2_i), .WDATA_B2_i (WDATA_B2_i),
+        .RDATA_A2_o (RDATA_A2_o), .RDATA_B2_o (RDATA_B2_o),
+        .FLUSH2_i   (FLUSH2_i)
+    );
+
+`ifdef SDF_SIM
+	specify
+		(negedge RESET_ni => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+		(negedge RESET_ni => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+		(negedge RESET_ni => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+		(negedge RESET_ni => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+		(posedge CLK_A1_i => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+		(posedge CLK_B1_i => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+		(posedge CLK_A2_i => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+		(posedge CLK_B2_i => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+    $setuphold(posedge CLK_A1_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_A1_i, FLUSH1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, WEN_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, REN_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, BE_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, ADDR_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, WDATA_A1_i, 0, 0);
+    $setuphold(posedge CLK_B1_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_B1_i, WEN_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, REN_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, BE_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, ADDR_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, WDATA_B1_i, 0, 0);
+    $setuphold(posedge CLK_A2_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_A2_i, FLUSH2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, WEN_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, REN_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, BE_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, ADDR_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, WDATA_A2_i, 0, 0);
+    $setuphold(posedge CLK_B2_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_B2_i, WEN_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, REN_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, BE_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, ADDR_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, WDATA_B2_i, 0, 0);
+	endspecify
+`endif
+
+endmodule
+
+//=================================================================================
+
+module SFIFO_18K_BLK (
+    DIN,
+    PUSH,
+    POP,
+    CLK,
+    Async_Flush,
+    Overrun_Error,
+    Full_Watermark,
+    Almost_Full,
+    Full,
+    Underrun_Error,
+    Empty_Watermark,
+    Almost_Empty,
+    Empty,
+    DOUT
+);
+  
+  parameter WR_DATA_WIDTH = 18;
+  parameter RD_DATA_WIDTH = 18;
+  parameter UPAE_DBITS = 11'd10;
+  parameter UPAF_DBITS = 11'd10;
+
+  input wire CLK;
+  input wire PUSH, POP;
+  input wire [WR_DATA_WIDTH-1:0] DIN;
+  input wire Async_Flush;
+  output wire [RD_DATA_WIDTH-1:0] DOUT;
+  output wire Almost_Full, Almost_Empty;
+  output wire Full, Empty;
+  output wire Full_Watermark, Empty_Watermark;
+  output wire Overrun_Error, Underrun_Error;
+ 
+ 	BRAM2x18_SFIFO  #(
+      .WR_DATA_WIDTH(WR_DATA_WIDTH), 
+      .RD_DATA_WIDTH(RD_DATA_WIDTH),
+      .UPAE_DBITS1(UPAE_DBITS),
+      .UPAF_DBITS1(UPAF_DBITS),
+      .UPAE_DBITS2(),
+      .UPAF_DBITS2()     
+       ) U1
+      (
+      .DIN1(DIN),
+      .PUSH1(PUSH),
+      .POP1(POP),
+      .CLK1(CLK),
+      .Async_Flush1(Async_Flush),
+      .Overrun_Error1(Overrun_Error),
+      .Full_Watermark1(Full_Watermark),
+      .Almost_Full1(Almost_Full),
+      .Full1(Full),
+      .Underrun_Error1(Underrun_Error),
+      .Empty_Watermark1(Empty_Watermark),
+      .Almost_Empty1(Almost_Empty),
+      .Empty1(Empty),
+      .DOUT1(DOUT),
+      
+      .DIN2(),
+      .PUSH2(),
+      .POP2(),
+      .CLK2(),
+      .Async_Flush2(),
+      .Overrun_Error2(),
+      .Full_Watermark2(),
+      .Almost_Full2(),
+      .Full2(),
+      .Underrun_Error2(),
+      .Empty_Watermark2(),
+      .Almost_Empty2(),
+      .Empty2(),
+      .DOUT2()
+	);
+
+endmodule
+
+module AFIFO_18K_BLK (
+    DIN,
+    PUSH,
+    POP,
+    Push_Clk,
+    Pop_Clk,
+    Async_Flush,
+    Overrun_Error,
+    Full_Watermark,
+    Almost_Full,
+    Full,
+    Underrun_Error,
+    Empty_Watermark,
+    Almost_Empty,
+    Empty,
+    DOUT
+);
+  
+  parameter WR_DATA_WIDTH = 18;
+  parameter RD_DATA_WIDTH = 18;
+  parameter UPAE_DBITS = 11'd10;
+  parameter UPAF_DBITS = 11'd10;
+
+  input wire Push_Clk, Pop_Clk;
+  input wire PUSH, POP;
+  input wire [WR_DATA_WIDTH-1:0] DIN;
+  input wire Async_Flush;
+  output wire [RD_DATA_WIDTH-1:0] DOUT;
+  output wire Almost_Full, Almost_Empty;
+  output wire Full, Empty;
+  output wire Full_Watermark, Empty_Watermark;
+  output wire Overrun_Error, Underrun_Error;
+ 
+ 	BRAM2x18_AFIFO  #(
+      .WR_DATA_WIDTH(WR_DATA_WIDTH), 
+      .RD_DATA_WIDTH(RD_DATA_WIDTH),
+      .UPAE_DBITS1(UPAE_DBITS),
+      .UPAF_DBITS1(UPAF_DBITS),
+      .UPAE_DBITS2(),
+      .UPAF_DBITS2()       
+       ) U1
+      (
+      .DIN1(DIN),
+      .PUSH1(PUSH),
+      .POP1(POP),
+      .Push_Clk1(Push_Clk),
+      .Pop_Clk1(Pop_Clk),
+      .Async_Flush1(Async_Flush),
+      .Overrun_Error1(Overrun_Error),
+      .Full_Watermark1(Full_Watermark),
+      .Almost_Full1(Almost_Full),
+      .Full1(Full),
+      .Underrun_Error1(Underrun_Error),
+      .Empty_Watermark1(Empty_Watermark),
+      .Almost_Empty1(Almost_Empty),
+      .Empty1(Empty),
+      .DOUT1(DOUT),
+      
+      .DIN2(),
+      .PUSH2(),
+      .POP2(),
+      .Push_Clk2(),
+      .Pop_Clk2(),
+      .Async_Flush2(),
+      .Overrun_Error2(),
+      .Full_Watermark2(),
+      .Almost_Full2(),
+      .Full2(),
+      .Underrun_Error2(),
+      .Empty_Watermark2(),
+      .Almost_Empty2(),
+      .Empty2(),
+      .DOUT2()
+	);
+
+endmodule
+
+module BRAM2x18_SFIFO (
+    DIN1,
+    PUSH1,
+    POP1,
+    CLK1,
+    Async_Flush1,
+    Overrun_Error1,
+    Full_Watermark1,
+    Almost_Full1,
+    Full1,
+    Underrun_Error1,
+    Empty_Watermark1,
+    Almost_Empty1,
+    Empty1,
+    DOUT1,
+    
+    DIN2,
+    PUSH2,
+    POP2,
+    CLK2,
+    Async_Flush2,
+    Overrun_Error2,
+    Full_Watermark2,
+    Almost_Full2,
+    Full2,
+    Underrun_Error2,
+    Empty_Watermark2,
+    Almost_Empty2,
+    Empty2,
+    DOUT2
+);
+
+  parameter WR_DATA_WIDTH = 18;
+  parameter RD_DATA_WIDTH = 18;
+
+  
+  parameter UPAE_DBITS1 = 11'd10;
+  parameter UPAF_DBITS1 = 11'd10;
+  
+  parameter UPAE_DBITS2 = 11'd10;
+  parameter UPAF_DBITS2 = 11'd10;
+  
+  localparam MODE_36 = 3'b011; // 36- or 32-bit
+  localparam MODE_18 = 3'b010; // 18- or 16-bit
+  localparam MODE_9 = 3'b001; // 9- or 8-bit
+  localparam MODE_4 = 3'b100; // 4-bit
+  localparam MODE_2 = 3'b110; // 2-bit
+  localparam MODE_1 = 3'b101; // 1-bit
+
+  input wire CLK1;
+  input wire PUSH1, POP1;
+  input wire [WR_DATA_WIDTH-1:0] DIN1;
+  input wire Async_Flush1;
+  output wire [RD_DATA_WIDTH-1:0] DOUT1;
+  output wire Almost_Full1, Almost_Empty1;
+  output wire Full1, Empty1;
+  output wire Full_Watermark1, Empty_Watermark1;
+  output wire Overrun_Error1, Underrun_Error1;
+  
+  input wire CLK2;
+  input wire PUSH2, POP2;
+  input wire [WR_DATA_WIDTH-1:0] DIN2;
+  input wire Async_Flush2;
+  output wire [RD_DATA_WIDTH-1:0] DOUT2;
+  output wire Almost_Full2, Almost_Empty2;
+  output wire Full2, Empty2;
+  output wire Full_Watermark2, Empty_Watermark2;
+  output wire Overrun_Error2, Underrun_Error2;
+  
+  wire [17:0] in_reg1;
+  wire [17:0] out_reg1;
+  wire [17:0] fifo1_flags;
+  
+  wire [17:0] in_reg2;
+  wire [17:0] out_reg2;
+  wire [17:0] fifo2_flags;
+  
+  wire Push_Clk1, Pop_Clk1;
+  wire Push_Clk2, Pop_Clk2;
+  assign Push_Clk1 = CLK1;
+  assign Pop_Clk1 = CLK1;
+  assign Push_Clk2 = CLK2;
+  assign Pop_Clk2 = CLK2;
+  
+  assign Overrun_Error1 = fifo1_flags[0];
+  assign Full_Watermark1 = fifo1_flags[1];
+  assign Almost_Full1 = fifo1_flags[2];
+  assign Full1 = fifo1_flags[3];
+  assign Underrun_Error1 = fifo1_flags[4];
+  assign Empty_Watermark1 = fifo1_flags[5];
+  assign Almost_Empty1 = fifo1_flags[6];
+  assign Empty1 = fifo1_flags[7];
+  
+  assign Overrun_Error2 = fifo2_flags[0];
+  assign Full_Watermark2 = fifo2_flags[1];
+  assign Almost_Full2 = fifo2_flags[2];
+  assign Full2 = fifo2_flags[3];
+  assign Underrun_Error2 = fifo2_flags[4];
+  assign Empty_Watermark2 = fifo2_flags[5];
+  assign Almost_Empty2 = fifo2_flags[6];
+  assign Empty2 = fifo2_flags[7];
+  
+  generate
+    if (WR_DATA_WIDTH == 18) begin
+      assign in_reg1[17:0] = DIN1[17:0];
+      assign in_reg2[17:0] = DIN2[17:0];
+    end else if (WR_DATA_WIDTH == 9) begin
+      assign in_reg1[17:0] = {1'b0, DIN1[8], 8'h0, DIN1[7:0]};
+      assign in_reg2[17:0] = {1'b0, DIN2[8], 8'h0, DIN2[7:0]};
+    end else begin
+      assign in_reg1[17:WR_DATA_WIDTH]  = 0;
+      assign in_reg1[WR_DATA_WIDTH-1:0] = DIN1[WR_DATA_WIDTH-1:0];
+      assign in_reg2[17:WR_DATA_WIDTH]  = 0;
+      assign in_reg2[WR_DATA_WIDTH-1:0] = DIN2[WR_DATA_WIDTH-1:0];
+    end
+  endgenerate     
+  
+ case (RD_DATA_WIDTH)
+	8, 9: begin
+		case (WR_DATA_WIDTH)
+			8, 9: begin
+				defparam U1.MODE_BITS = { 1'b1,
+					UPAF_DBITS2, UPAE_DBITS2, 4'h1, MODE_9, MODE_9, MODE_9, MODE_9, 1'b1,
+					1'b0, UPAF_DBITS1, 1'b0, UPAE_DBITS1, 4'h1, MODE_9, MODE_9, MODE_9, MODE_9, 1'b1
+				};
+        (* is_fifo = 1 *) 
+        (* sync_fifo = 1 *) 
+        (* is_split = 1 *)
+        (* rd_data_width = RD_DATA_WIDTH *)
+        (* wr_data_width = WR_DATA_WIDTH *) 
+        TDP36K U1 (
+          .RESET_ni(1'b1),
+          .WDATA_A1_i(in_reg1[17:0]),
+          .WDATA_A2_i(in_reg2[17:0]),
+          .RDATA_A1_o(fifo1_flags),
+          .RDATA_A2_o(fifo2_flags),
+          .ADDR_A1_i(14'h0),
+          .ADDR_A2_i(14'h0),
+          .CLK_A1_i(Push_Clk1),
+          .CLK_A2_i(Push_Clk2),
+          .REN_A1_i(1'b1),
+          .REN_A2_i(1'b1),
+          .WEN_A1_i(PUSH1),
+          .WEN_A2_i(PUSH2),
+          .BE_A1_i(2'b11),
+          .BE_A2_i(2'b11),
+      
+          .WDATA_B1_i(18'h0),
+          .WDATA_B2_i(18'h0),
+          .RDATA_B1_o(out_reg1[17:0]),
+          .RDATA_B2_o(out_reg2[17:0]),
+          .ADDR_B1_i(14'h0),
+          .ADDR_B2_i(14'h0),
+          .CLK_B1_i(Pop_Clk1),
+          .CLK_B2_i(Pop_Clk2),
+          .REN_B1_i(POP1),
+          .REN_B2_i(POP2),
+          .WEN_B1_i(1'b0),
+          .WEN_B2_i(1'b0),
+          .BE_B1_i(2'b11),
+          .BE_B2_i(2'b11),
+      
+          .FLUSH1_i(Async_Flush1),
+          .FLUSH2_i(Async_Flush2)
+        );        
+			end
+			16, 18: begin
+				defparam U1.MODE_BITS = { 1'b1,
+					UPAF_DBITS2, UPAE_DBITS2, 4'h1, MODE_9, MODE_18, MODE_9, MODE_18, 1'b1,
+					1'b0, UPAF_DBITS1, 1'b0, UPAE_DBITS1, 4'h1, MODE_9, MODE_18, MODE_9, MODE_18, 1'b1
+				};
+        (* is_fifo = 1 *) 
+        (* sync_fifo = 1 *) 
+        (* is_split = 1 *)
+        (* rd_data_width = RD_DATA_WIDTH *)
+        (* wr_data_width = WR_DATA_WIDTH *) 
+        TDP36K U1 (
+          .RESET_ni(1'b1),
+          .WDATA_A1_i(in_reg1[17:0]),
+          .WDATA_A2_i(in_reg2[17:0]),
+          .RDATA_A1_o(fifo1_flags),
+          .RDATA_A2_o(fifo2_flags),
+          .ADDR_A1_i(14'h0),
+          .ADDR_A2_i(14'h0),
+          .CLK_A1_i(Push_Clk1),
+          .CLK_A2_i(Push_Clk2),
+          .REN_A1_i(1'b1),
+          .REN_A2_i(1'b1),
+          .WEN_A1_i(PUSH1),
+          .WEN_A2_i(PUSH2),
+          .BE_A1_i(2'b11),
+          .BE_A2_i(2'b11),
+      
+          .WDATA_B1_i(18'h0),
+          .WDATA_B2_i(18'h0),
+          .RDATA_B1_o(out_reg1[17:0]),
+          .RDATA_B2_o(out_reg2[17:0]),
+          .ADDR_B1_i(14'h0),
+          .ADDR_B2_i(14'h0),
+          .CLK_B1_i(Pop_Clk1),
+          .CLK_B2_i(Pop_Clk2),
+          .REN_B1_i(POP1),
+          .REN_B2_i(POP2),
+          .WEN_B1_i(1'b0),
+          .WEN_B2_i(1'b0),
+          .BE_B1_i(2'b11),
+          .BE_B2_i(2'b11),
+      
+          .FLUSH1_i(Async_Flush1),
+          .FLUSH2_i(Async_Flush2)
+        );        
+			end
+			default: begin
+				defparam U1.MODE_BITS = { 1'b1,
+					UPAF_DBITS2, UPAE_DBITS2, 4'h1, MODE_9, MODE_9, MODE_9, MODE_9, 1'b1,
+					1'b0, UPAF_DBITS1, 1'b0, UPAE_DBITS1, 4'h1, MODE_9, MODE_9, MODE_9, MODE_9, 1'b1
+				};
+        (* is_fifo = 1 *) 
+        (* sync_fifo = 1 *) 
+        (* is_split = 1 *)
+        (* rd_data_width = RD_DATA_WIDTH *)
+        (* wr_data_width = WR_DATA_WIDTH *) 
+        TDP36K U1 (
+          .RESET_ni(1'b1),
+          .WDATA_A1_i(in_reg1[17:0]),
+          .WDATA_A2_i(in_reg2[17:0]),
+          .RDATA_A1_o(fifo1_flags),
+          .RDATA_A2_o(fifo2_flags),
+          .ADDR_A1_i(14'h0),
+          .ADDR_A2_i(14'h0),
+          .CLK_A1_i(Push_Clk1),
+          .CLK_A2_i(Push_Clk2),
+          .REN_A1_i(1'b1),
+          .REN_A2_i(1'b1),
+          .WEN_A1_i(PUSH1),
+          .WEN_A2_i(PUSH2),
+          .BE_A1_i(2'b11),
+          .BE_A2_i(2'b11),
+      
+          .WDATA_B1_i(18'h0),
+          .WDATA_B2_i(18'h0),
+          .RDATA_B1_o(out_reg1[17:0]),
+          .RDATA_B2_o(out_reg2[17:0]),
+          .ADDR_B1_i(14'h0),
+          .ADDR_B2_i(14'h0),
+          .CLK_B1_i(Pop_Clk1),
+          .CLK_B2_i(Pop_Clk2),
+          .REN_B1_i(POP1),
+          .REN_B2_i(POP2),
+          .WEN_B1_i(1'b0),
+          .WEN_B2_i(1'b0),
+          .BE_B1_i(2'b11),
+          .BE_B2_i(2'b11),
+      
+          .FLUSH1_i(Async_Flush1),
+          .FLUSH2_i(Async_Flush2)
+        );        
+			end
+		endcase
+	end
+	16, 18: begin
+		case (WR_DATA_WIDTH)
+			8, 9: begin
+				defparam U1.MODE_BITS = { 1'b1,
+					UPAF_DBITS2, UPAE_DBITS2, 4'h1, MODE_18, MODE_9, MODE_18, MODE_9, 1'b1,
+					1'b0, UPAF_DBITS1, 1'b0, UPAE_DBITS1, 4'h1, MODE_18, MODE_9, MODE_18, MODE_9, 1'b1
+				};
+        (* is_fifo = 1 *) 
+        (* sync_fifo = 1 *) 
+        (* is_split = 1 *)
+        (* rd_data_width = RD_DATA_WIDTH *)
+        (* wr_data_width = WR_DATA_WIDTH *) 
+        TDP36K U1 (
+          .RESET_ni(1'b1),
+          .WDATA_A1_i(in_reg1[17:0]),
+          .WDATA_A2_i(in_reg2[17:0]),
+          .RDATA_A1_o(fifo1_flags),
+          .RDATA_A2_o(fifo2_flags),
+          .ADDR_A1_i(14'h0),
+          .ADDR_A2_i(14'h0),
+          .CLK_A1_i(Push_Clk1),
+          .CLK_A2_i(Push_Clk2),
+          .REN_A1_i(1'b1),
+          .REN_A2_i(1'b1),
+          .WEN_A1_i(PUSH1),
+          .WEN_A2_i(PUSH2),
+          .BE_A1_i(2'b11),
+          .BE_A2_i(2'b11),
+      
+          .WDATA_B1_i(18'h0),
+          .WDATA_B2_i(18'h0),
+          .RDATA_B1_o(out_reg1[17:0]),
+          .RDATA_B2_o(out_reg2[17:0]),
+          .ADDR_B1_i(14'h0),
+          .ADDR_B2_i(14'h0),
+          .CLK_B1_i(Pop_Clk1),
+          .CLK_B2_i(Pop_Clk2),
+          .REN_B1_i(POP1),
+          .REN_B2_i(POP2),
+          .WEN_B1_i(1'b0),
+          .WEN_B2_i(1'b0),
+          .BE_B1_i(2'b11),
+          .BE_B2_i(2'b11),
+      
+          .FLUSH1_i(Async_Flush1),
+          .FLUSH2_i(Async_Flush2)
+        );        
+			end
+			16, 18: begin
+				defparam U1.MODE_BITS = { 1'b1,
+					UPAF_DBITS2, UPAE_DBITS2, 4'h1, MODE_18, MODE_18, MODE_18, MODE_18, 1'b1,
+					1'b0, UPAF_DBITS1, 1'b0, UPAE_DBITS1, 4'h1, MODE_18, MODE_18, MODE_18, MODE_18, 1'b1
+				};
+        (* is_fifo = 1 *) 
+        (* sync_fifo = 1 *) 
+        (* is_split = 1 *)
+        (* rd_data_width = RD_DATA_WIDTH *)
+        (* wr_data_width = WR_DATA_WIDTH *) 
+        TDP36K U1 (
+          .RESET_ni(1'b1),
+          .WDATA_A1_i(in_reg1[17:0]),
+          .WDATA_A2_i(in_reg2[17:0]),
+          .RDATA_A1_o(fifo1_flags),
+          .RDATA_A2_o(fifo2_flags),
+          .ADDR_A1_i(14'h0),
+          .ADDR_A2_i(14'h0),
+          .CLK_A1_i(Push_Clk1),
+          .CLK_A2_i(Push_Clk2),
+          .REN_A1_i(1'b1),
+          .REN_A2_i(1'b1),
+          .WEN_A1_i(PUSH1),
+          .WEN_A2_i(PUSH2),
+          .BE_A1_i(2'b11),
+          .BE_A2_i(2'b11),
+      
+          .WDATA_B1_i(18'h0),
+          .WDATA_B2_i(18'h0),
+          .RDATA_B1_o(out_reg1[17:0]),
+          .RDATA_B2_o(out_reg2[17:0]),
+          .ADDR_B1_i(14'h0),
+          .ADDR_B2_i(14'h0),
+          .CLK_B1_i(Pop_Clk1),
+          .CLK_B2_i(Pop_Clk2),
+          .REN_B1_i(POP1),
+          .REN_B2_i(POP2),
+          .WEN_B1_i(1'b0),
+          .WEN_B2_i(1'b0),
+          .BE_B1_i(2'b11),
+          .BE_B2_i(2'b11),
+      
+          .FLUSH1_i(Async_Flush1),
+          .FLUSH2_i(Async_Flush2)
+        );        
+			end
+			default: begin
+				defparam U1.MODE_BITS = { 1'b1,
+					UPAF_DBITS2, UPAE_DBITS2, 4'h1, MODE_18, MODE_18, MODE_18, MODE_18, 1'b1,
+					1'b0, UPAF_DBITS1, 1'b0, UPAE_DBITS1, 4'h1, MODE_18, MODE_18, MODE_18, MODE_18, 1'b1
+				};
+        (* is_fifo = 1 *) 
+        (* sync_fifo = 1 *) 
+        (* is_split = 1 *)
+        (* rd_data_width = RD_DATA_WIDTH *)
+        (* wr_data_width = WR_DATA_WIDTH *) 
+        TDP36K U1 (
+          .RESET_ni(1'b1),
+          .WDATA_A1_i(in_reg1[17:0]),
+          .WDATA_A2_i(in_reg2[17:0]),
+          .RDATA_A1_o(fifo1_flags),
+          .RDATA_A2_o(fifo2_flags),
+          .ADDR_A1_i(14'h0),
+          .ADDR_A2_i(14'h0),
+          .CLK_A1_i(Push_Clk1),
+          .CLK_A2_i(Push_Clk2),
+          .REN_A1_i(1'b1),
+          .REN_A2_i(1'b1),
+          .WEN_A1_i(PUSH1),
+          .WEN_A2_i(PUSH2),
+          .BE_A1_i(2'b11),
+          .BE_A2_i(2'b11),
+      
+          .WDATA_B1_i(18'h0),
+          .WDATA_B2_i(18'h0),
+          .RDATA_B1_o(out_reg1[17:0]),
+          .RDATA_B2_o(out_reg2[17:0]),
+          .ADDR_B1_i(14'h0),
+          .ADDR_B2_i(14'h0),
+          .CLK_B1_i(Pop_Clk1),
+          .CLK_B2_i(Pop_Clk2),
+          .REN_B1_i(POP1),
+          .REN_B2_i(POP2),
+          .WEN_B1_i(1'b0),
+          .WEN_B2_i(1'b0),
+          .BE_B1_i(2'b11),
+          .BE_B2_i(2'b11),
+      
+          .FLUSH1_i(Async_Flush1),
+          .FLUSH2_i(Async_Flush2)
+        );        
+			end
+		endcase
+	end
+	default: begin
+		case (WR_DATA_WIDTH)
+			8, 9: begin
+				defparam U1.MODE_BITS = { 1'b1,
+					UPAF_DBITS2, UPAE_DBITS2, 4'h1, MODE_9, MODE_9, MODE_9, MODE_9, 1'b1,
+					1'b0, UPAF_DBITS1, 1'b0, UPAE_DBITS1, 4'h1, MODE_9, MODE_9, MODE_9, MODE_9, 1'b1
+				};
+        (* is_fifo = 1 *) 
+        (* sync_fifo = 1 *) 
+        (* is_split = 1 *)
+        (* rd_data_width = RD_DATA_WIDTH *)
+        (* wr_data_width = WR_DATA_WIDTH *) 
+        TDP36K U1 (
+          .RESET_ni(1'b1),
+          .WDATA_A1_i(in_reg1[17:0]),
+          .WDATA_A2_i(in_reg2[17:0]),
+          .RDATA_A1_o(fifo1_flags),
+          .RDATA_A2_o(fifo2_flags),
+          .ADDR_A1_i(14'h0),
+          .ADDR_A2_i(14'h0),
+          .CLK_A1_i(Push_Clk1),
+          .CLK_A2_i(Push_Clk2),
+          .REN_A1_i(1'b1),
+          .REN_A2_i(1'b1),
+          .WEN_A1_i(PUSH1),
+          .WEN_A2_i(PUSH2),
+          .BE_A1_i(2'b11),
+          .BE_A2_i(2'b11),
+      
+          .WDATA_B1_i(18'h0),
+          .WDATA_B2_i(18'h0),
+          .RDATA_B1_o(out_reg1[17:0]),
+          .RDATA_B2_o(out_reg2[17:0]),
+          .ADDR_B1_i(14'h0),
+          .ADDR_B2_i(14'h0),
+          .CLK_B1_i(Pop_Clk1),
+          .CLK_B2_i(Pop_Clk2),
+          .REN_B1_i(POP1),
+          .REN_B2_i(POP2),
+          .WEN_B1_i(1'b0),
+          .WEN_B2_i(1'b0),
+          .BE_B1_i(2'b11),
+          .BE_B2_i(2'b11),
+      
+          .FLUSH1_i(Async_Flush1),
+          .FLUSH2_i(Async_Flush2)
+        );        
+			end
+			16, 18: begin
+				defparam U1.MODE_BITS = { 1'b1,
+					UPAF_DBITS2, UPAE_DBITS2, 4'h1, MODE_18, MODE_18, MODE_18, MODE_18, 1'b1,
+					1'b0, UPAF_DBITS1, 1'b0, UPAE_DBITS1, 4'h1, MODE_18, MODE_18, MODE_18, MODE_18, 1'b1
+				};
+        (* is_fifo = 1 *) 
+        (* sync_fifo = 1 *) 
+        (* is_split = 1 *)
+        (* rd_data_width = RD_DATA_WIDTH *)
+        (* wr_data_width = WR_DATA_WIDTH *) 
+        TDP36K U1 (
+          .RESET_ni(1'b1),
+          .WDATA_A1_i(in_reg1[17:0]),
+          .WDATA_A2_i(in_reg2[17:0]),
+          .RDATA_A1_o(fifo1_flags),
+          .RDATA_A2_o(fifo2_flags),
+          .ADDR_A1_i(14'h0),
+          .ADDR_A2_i(14'h0),
+          .CLK_A1_i(Push_Clk1),
+          .CLK_A2_i(Push_Clk2),
+          .REN_A1_i(1'b1),
+          .REN_A2_i(1'b1),
+          .WEN_A1_i(PUSH1),
+          .WEN_A2_i(PUSH2),
+          .BE_A1_i(2'b11),
+          .BE_A2_i(2'b11),
+      
+          .WDATA_B1_i(18'h0),
+          .WDATA_B2_i(18'h0),
+          .RDATA_B1_o(out_reg1[17:0]),
+          .RDATA_B2_o(out_reg2[17:0]),
+          .ADDR_B1_i(14'h0),
+          .ADDR_B2_i(14'h0),
+          .CLK_B1_i(Pop_Clk1),
+          .CLK_B2_i(Pop_Clk2),
+          .REN_B1_i(POP1),
+          .REN_B2_i(POP2),
+          .WEN_B1_i(1'b0),
+          .WEN_B2_i(1'b0),
+          .BE_B1_i(2'b11),
+          .BE_B2_i(2'b11),
+      
+          .FLUSH1_i(Async_Flush1),
+          .FLUSH2_i(Async_Flush2)
+        );        
+			end
+			default: begin
+				defparam U1.MODE_BITS = { 1'b1,
+					UPAF_DBITS2, UPAE_DBITS2, 4'h1, MODE_18, MODE_18, MODE_18, MODE_18, 1'b1,
+					1'b0, UPAF_DBITS1, 1'b0, UPAE_DBITS1, 4'h1, MODE_18, MODE_18, MODE_18, MODE_18, 1'b1
+				};
+        (* is_fifo = 1 *) 
+        (* sync_fifo = 1 *) 
+        (* is_split = 1 *)
+        (* rd_data_width = RD_DATA_WIDTH *)
+        (* wr_data_width = WR_DATA_WIDTH *) 
+        TDP36K U1 (
+          .RESET_ni(1'b1),
+          .WDATA_A1_i(in_reg1[17:0]),
+          .WDATA_A2_i(in_reg2[17:0]),
+          .RDATA_A1_o(fifo1_flags),
+          .RDATA_A2_o(fifo2_flags),
+          .ADDR_A1_i(14'h0),
+          .ADDR_A2_i(14'h0),
+          .CLK_A1_i(Push_Clk1),
+          .CLK_A2_i(Push_Clk2),
+          .REN_A1_i(1'b1),
+          .REN_A2_i(1'b1),
+          .WEN_A1_i(PUSH1),
+          .WEN_A2_i(PUSH2),
+          .BE_A1_i(2'b11),
+          .BE_A2_i(2'b11),
+      
+          .WDATA_B1_i(18'h0),
+          .WDATA_B2_i(18'h0),
+          .RDATA_B1_o(out_reg1[17:0]),
+          .RDATA_B2_o(out_reg2[17:0]),
+          .ADDR_B1_i(14'h0),
+          .ADDR_B2_i(14'h0),
+          .CLK_B1_i(Pop_Clk1),
+          .CLK_B2_i(Pop_Clk2),
+          .REN_B1_i(POP1),
+          .REN_B2_i(POP2),
+          .WEN_B1_i(1'b0),
+          .WEN_B2_i(1'b0),
+          .BE_B1_i(2'b11),
+          .BE_B2_i(2'b11),
+      
+          .FLUSH1_i(Async_Flush1),
+          .FLUSH2_i(Async_Flush2)
+        );
+			end
+		endcase
+	end
+  endcase
+
+  generate
+    if (RD_DATA_WIDTH == 9) begin
+      assign DOUT1[RD_DATA_WIDTH-1:0] = {out_reg1[16], out_reg1[7:0]};
+      assign DOUT2[RD_DATA_WIDTH-1:0] = {out_reg2[16], out_reg2[7:0]};
+    end else begin
+      assign DOUT1[RD_DATA_WIDTH-1:0] = out_reg1[RD_DATA_WIDTH-1:0];
+      assign DOUT2[RD_DATA_WIDTH-1:0] = out_reg2[RD_DATA_WIDTH-1:0];
+    end
+  endgenerate 
+
+endmodule
+
+module BRAM2x18_AFIFO (
+    DIN1,
+    PUSH1,
+    POP1,
+    Push_Clk1,
+    Pop_Clk1,
+    Async_Flush1,
+    Overrun_Error1,
+    Full_Watermark1,
+    Almost_Full1,
+    Full1,
+    Underrun_Error1,
+    Empty_Watermark1,
+    Almost_Empty1,
+    Empty1,
+    DOUT1,
+    
+    DIN2,
+    PUSH2,
+    POP2,
+    Push_Clk2,
+    Pop_Clk2,
+    Async_Flush2,
+    Overrun_Error2,
+    Full_Watermark2,
+    Almost_Full2,
+    Full2,
+    Underrun_Error2,
+    Empty_Watermark2,
+    Almost_Empty2,
+    Empty2,
+    DOUT2
+);
+
+  parameter WR_DATA_WIDTH = 18;
+  parameter RD_DATA_WIDTH = 18;
+
+  
+  parameter UPAE_DBITS1 = 11'd10;
+  parameter UPAF_DBITS1 = 11'd10;
+  
+  parameter UPAE_DBITS2 = 11'd10;
+  parameter UPAF_DBITS2 = 11'd10;
+  
+  localparam MODE_36 = 3'b011; // 36- or 32-bit
+  localparam MODE_18 = 3'b010; // 18- or 16-bit
+  localparam MODE_9 = 3'b001; // 9- or 8-bit
+  localparam MODE_4 = 3'b100; // 4-bit
+  localparam MODE_2 = 3'b110; // 2-bit
+  localparam MODE_1 = 3'b101; // 1-bit
+
+  input wire Push_Clk1, Pop_Clk1;
+  input wire PUSH1, POP1;
+  input wire [WR_DATA_WIDTH-1:0] DIN1;
+  input wire Async_Flush1;
+  output wire [RD_DATA_WIDTH-1:0] DOUT1;
+  output wire Almost_Full1, Almost_Empty1;
+  output wire Full1, Empty1;
+  output wire Full_Watermark1, Empty_Watermark1;
+  output wire Overrun_Error1, Underrun_Error1;
+  
+  input wire Push_Clk2, Pop_Clk2;
+  input wire PUSH2, POP2;
+  input wire [WR_DATA_WIDTH-1:0] DIN2;
+  input wire Async_Flush2;
+  output wire [RD_DATA_WIDTH-1:0] DOUT2;
+  output wire Almost_Full2, Almost_Empty2;
+  output wire Full2, Empty2;
+  output wire Full_Watermark2, Empty_Watermark2;
+  output wire Overrun_Error2, Underrun_Error2;
+  
+  wire [17:0] in_reg1;
+  wire [17:0] out_reg1;
+  wire [17:0] fifo1_flags;
+  
+  wire [17:0] in_reg2;
+  wire [17:0] out_reg2;
+  wire [17:0] fifo2_flags;
+  
+  assign Overrun_Error1 = fifo1_flags[0];
+  assign Full_Watermark1 = fifo1_flags[1];
+  assign Almost_Full1 = fifo1_flags[2];
+  assign Full1 = fifo1_flags[3];
+  assign Underrun_Error1 = fifo1_flags[4];
+  assign Empty_Watermark1 = fifo1_flags[5];
+  assign Almost_Empty1 = fifo1_flags[6];
+  assign Empty1 = fifo1_flags[7];
+  
+  assign Overrun_Error2 = fifo2_flags[0];
+  assign Full_Watermark2 = fifo2_flags[1];
+  assign Almost_Full2 = fifo2_flags[2];
+  assign Full2 = fifo2_flags[3];
+  assign Underrun_Error2 = fifo2_flags[4];
+  assign Empty_Watermark2 = fifo2_flags[5];
+  assign Almost_Empty2 = fifo2_flags[6];
+  assign Empty2 = fifo2_flags[7];
+  
+  generate
+    if (WR_DATA_WIDTH == 18) begin
+      assign in_reg1[17:0] = DIN1[17:0];
+      assign in_reg2[17:0] = DIN2[17:0];
+    end else if (WR_DATA_WIDTH == 9) begin
+      assign in_reg1[17:0] = {1'b0, DIN1[8], 8'h0, DIN1[7:0]};
+      assign in_reg2[17:0] = {1'b0, DIN2[8], 8'h0, DIN2[7:0]};
+    end else begin
+      assign in_reg1[17:WR_DATA_WIDTH]  = 0;
+      assign in_reg1[WR_DATA_WIDTH-1:0] = DIN1[WR_DATA_WIDTH-1:0];
+      assign in_reg2[17:WR_DATA_WIDTH]  = 0;
+      assign in_reg2[WR_DATA_WIDTH-1:0] = DIN2[WR_DATA_WIDTH-1:0];
+    end
+  endgenerate   
+  
+ case (RD_DATA_WIDTH)
+	8, 9: begin
+		case (WR_DATA_WIDTH)
+			8, 9: begin
+				defparam U1.MODE_BITS = { 1'b1,
+					UPAF_DBITS2, UPAE_DBITS2, 4'h1, MODE_9, MODE_9, MODE_9, MODE_9, 1'b0,
+					1'b0, UPAF_DBITS1, 1'b0, UPAE_DBITS1, 4'h1, MODE_9, MODE_9, MODE_9, MODE_9, 1'b0
+				};
+        (* is_fifo = 1 *) 
+        (* sync_fifo = 0 *) 
+        (* is_split = 1 *)
+        (* rd_data_width = RD_DATA_WIDTH *)
+        (* wr_data_width = WR_DATA_WIDTH *) 
+        TDP36K U1 (
+          .RESET_ni(1'b1),
+          .WDATA_A1_i(in_reg1[17:0]),
+          .WDATA_A2_i(in_reg2[17:0]),
+          .RDATA_A1_o(fifo1_flags),
+          .RDATA_A2_o(fifo2_flags),
+          .ADDR_A1_i(14'h0),
+          .ADDR_A2_i(14'h0),
+          .CLK_A1_i(Push_Clk1),
+          .CLK_A2_i(Push_Clk2),
+          .REN_A1_i(1'b1),
+          .REN_A2_i(1'b1),
+          .WEN_A1_i(PUSH1),
+          .WEN_A2_i(PUSH2),
+          .BE_A1_i(2'b11),
+          .BE_A2_i(2'b11),
+      
+          .WDATA_B1_i(18'h0),
+          .WDATA_B2_i(18'h0),
+          .RDATA_B1_o(out_reg1[17:0]),
+          .RDATA_B2_o(out_reg2[17:0]),
+          .ADDR_B1_i(14'h0),
+          .ADDR_B2_i(14'h0),
+          .CLK_B1_i(Pop_Clk1),
+          .CLK_B2_i(Pop_Clk2),
+          .REN_B1_i(POP1),
+          .REN_B2_i(POP2),
+          .WEN_B1_i(1'b0),
+          .WEN_B2_i(1'b0),
+          .BE_B1_i(2'b11),
+          .BE_B2_i(2'b11),
+      
+          .FLUSH1_i(Async_Flush1),
+          .FLUSH2_i(Async_Flush2)
+        );        
+			end
+			16, 18: begin
+				defparam U1.MODE_BITS = { 1'b1,
+					UPAF_DBITS2, UPAE_DBITS2, 4'h1, MODE_9, MODE_18, MODE_9, MODE_18, 1'b0,
+					1'b0, UPAF_DBITS1, 1'b0, UPAE_DBITS1, 4'h1, MODE_9, MODE_18, MODE_9, MODE_18, 1'b0
+				};
+        (* is_fifo = 1 *) 
+        (* sync_fifo = 0 *) 
+        (* is_split = 1 *)
+        (* rd_data_width = RD_DATA_WIDTH *)
+        (* wr_data_width = WR_DATA_WIDTH *) 
+        TDP36K U1 (
+          .RESET_ni(1'b1),
+          .WDATA_A1_i(in_reg1[17:0]),
+          .WDATA_A2_i(in_reg2[17:0]),
+          .RDATA_A1_o(fifo1_flags),
+          .RDATA_A2_o(fifo2_flags),
+          .ADDR_A1_i(14'h0),
+          .ADDR_A2_i(14'h0),
+          .CLK_A1_i(Push_Clk1),
+          .CLK_A2_i(Push_Clk2),
+          .REN_A1_i(1'b1),
+          .REN_A2_i(1'b1),
+          .WEN_A1_i(PUSH1),
+          .WEN_A2_i(PUSH2),
+          .BE_A1_i(2'b11),
+          .BE_A2_i(2'b11),
+      
+          .WDATA_B1_i(18'h0),
+          .WDATA_B2_i(18'h0),
+          .RDATA_B1_o(out_reg1[17:0]),
+          .RDATA_B2_o(out_reg2[17:0]),
+          .ADDR_B1_i(14'h0),
+          .ADDR_B2_i(14'h0),
+          .CLK_B1_i(Pop_Clk1),
+          .CLK_B2_i(Pop_Clk2),
+          .REN_B1_i(POP1),
+          .REN_B2_i(POP2),
+          .WEN_B1_i(1'b0),
+          .WEN_B2_i(1'b0),
+          .BE_B1_i(2'b11),
+          .BE_B2_i(2'b11),
+      
+          .FLUSH1_i(Async_Flush1),
+          .FLUSH2_i(Async_Flush2)
+        );        
+			end
+			default: begin
+				defparam U1.MODE_BITS = { 1'b1,
+					UPAF_DBITS2, UPAE_DBITS2, 4'h1, MODE_9, MODE_9, MODE_9, MODE_9, 1'b0,
+					1'b0, UPAF_DBITS1, 1'b0, UPAE_DBITS1, 4'h1, MODE_9, MODE_9, MODE_9, MODE_9, 1'b0
+				};
+        (* is_fifo = 1 *) 
+        (* sync_fifo = 0 *) 
+        (* is_split = 1 *)
+        (* rd_data_width = RD_DATA_WIDTH *)
+        (* wr_data_width = WR_DATA_WIDTH *) 
+        TDP36K U1 (
+          .RESET_ni(1'b1),
+          .WDATA_A1_i(in_reg1[17:0]),
+          .WDATA_A2_i(in_reg2[17:0]),
+          .RDATA_A1_o(fifo1_flags),
+          .RDATA_A2_o(fifo2_flags),
+          .ADDR_A1_i(14'h0),
+          .ADDR_A2_i(14'h0),
+          .CLK_A1_i(Push_Clk1),
+          .CLK_A2_i(Push_Clk2),
+          .REN_A1_i(1'b1),
+          .REN_A2_i(1'b1),
+          .WEN_A1_i(PUSH1),
+          .WEN_A2_i(PUSH2),
+          .BE_A1_i(2'b11),
+          .BE_A2_i(2'b11),
+      
+          .WDATA_B1_i(18'h0),
+          .WDATA_B2_i(18'h0),
+          .RDATA_B1_o(out_reg1[17:0]),
+          .RDATA_B2_o(out_reg2[17:0]),
+          .ADDR_B1_i(14'h0),
+          .ADDR_B2_i(14'h0),
+          .CLK_B1_i(Pop_Clk1),
+          .CLK_B2_i(Pop_Clk2),
+          .REN_B1_i(POP1),
+          .REN_B2_i(POP2),
+          .WEN_B1_i(1'b0),
+          .WEN_B2_i(1'b0),
+          .BE_B1_i(2'b11),
+          .BE_B2_i(2'b11),
+      
+          .FLUSH1_i(Async_Flush1),
+          .FLUSH2_i(Async_Flush2)
+        );        
+			end
+		endcase
+	end
+	16, 18: begin
+		case (WR_DATA_WIDTH)
+			8, 9: begin
+				defparam U1.MODE_BITS = { 1'b1,
+					UPAF_DBITS2, UPAE_DBITS2, 4'h1, MODE_18, MODE_9, MODE_18, MODE_9, 1'b0,
+					1'b0, UPAF_DBITS1, 1'b0, UPAE_DBITS1, 4'h1, MODE_18, MODE_9, MODE_18, MODE_9, 1'b0
+				};
+        (* is_fifo = 1 *) 
+        (* sync_fifo = 0 *) 
+        (* is_split = 1 *)
+        (* rd_data_width = RD_DATA_WIDTH *)
+        (* wr_data_width = WR_DATA_WIDTH *) 
+        TDP36K U1 (
+          .RESET_ni(1'b1),
+          .WDATA_A1_i(in_reg1[17:0]),
+          .WDATA_A2_i(in_reg2[17:0]),
+          .RDATA_A1_o(fifo1_flags),
+          .RDATA_A2_o(fifo2_flags),
+          .ADDR_A1_i(14'h0),
+          .ADDR_A2_i(14'h0),
+          .CLK_A1_i(Push_Clk1),
+          .CLK_A2_i(Push_Clk2),
+          .REN_A1_i(1'b1),
+          .REN_A2_i(1'b1),
+          .WEN_A1_i(PUSH1),
+          .WEN_A2_i(PUSH2),
+          .BE_A1_i(2'b11),
+          .BE_A2_i(2'b11),
+      
+          .WDATA_B1_i(18'h0),
+          .WDATA_B2_i(18'h0),
+          .RDATA_B1_o(out_reg1[17:0]),
+          .RDATA_B2_o(out_reg2[17:0]),
+          .ADDR_B1_i(14'h0),
+          .ADDR_B2_i(14'h0),
+          .CLK_B1_i(Pop_Clk1),
+          .CLK_B2_i(Pop_Clk2),
+          .REN_B1_i(POP1),
+          .REN_B2_i(POP2),
+          .WEN_B1_i(1'b0),
+          .WEN_B2_i(1'b0),
+          .BE_B1_i(2'b11),
+          .BE_B2_i(2'b11),
+      
+          .FLUSH1_i(Async_Flush1),
+          .FLUSH2_i(Async_Flush2)
+        );        
+			end
+			16, 18: begin
+				defparam U1.MODE_BITS = { 1'b1,
+					UPAF_DBITS2, UPAE_DBITS2, 4'h1, MODE_18, MODE_18, MODE_18, MODE_18, 1'b0,
+					1'b0, UPAF_DBITS1, 1'b0, UPAE_DBITS1, 4'h1, MODE_18, MODE_18, MODE_18, MODE_18, 1'b0
+				};
+        (* is_fifo = 1 *) 
+        (* sync_fifo = 0 *) 
+        (* is_split = 1 *)
+        (* rd_data_width = RD_DATA_WIDTH *)
+        (* wr_data_width = WR_DATA_WIDTH *) 
+        TDP36K U1 (
+          .RESET_ni(1'b1),
+          .WDATA_A1_i(in_reg1[17:0]),
+          .WDATA_A2_i(in_reg2[17:0]),
+          .RDATA_A1_o(fifo1_flags),
+          .RDATA_A2_o(fifo2_flags),
+          .ADDR_A1_i(14'h0),
+          .ADDR_A2_i(14'h0),
+          .CLK_A1_i(Push_Clk1),
+          .CLK_A2_i(Push_Clk2),
+          .REN_A1_i(1'b1),
+          .REN_A2_i(1'b1),
+          .WEN_A1_i(PUSH1),
+          .WEN_A2_i(PUSH2),
+          .BE_A1_i(2'b11),
+          .BE_A2_i(2'b11),
+      
+          .WDATA_B1_i(18'h0),
+          .WDATA_B2_i(18'h0),
+          .RDATA_B1_o(out_reg1[17:0]),
+          .RDATA_B2_o(out_reg2[17:0]),
+          .ADDR_B1_i(14'h0),
+          .ADDR_B2_i(14'h0),
+          .CLK_B1_i(Pop_Clk1),
+          .CLK_B2_i(Pop_Clk2),
+          .REN_B1_i(POP1),
+          .REN_B2_i(POP2),
+          .WEN_B1_i(1'b0),
+          .WEN_B2_i(1'b0),
+          .BE_B1_i(2'b11),
+          .BE_B2_i(2'b11),
+      
+          .FLUSH1_i(Async_Flush1),
+          .FLUSH2_i(Async_Flush2)
+        );        
+			end
+			default: begin
+				defparam U1.MODE_BITS = { 1'b1,
+					UPAF_DBITS2, UPAE_DBITS2, 4'h1, MODE_18, MODE_18, MODE_18, MODE_18, 1'b0,
+					1'b0, UPAF_DBITS1, 1'b0, UPAE_DBITS1, 4'h1, MODE_18, MODE_18, MODE_18, MODE_18, 1'b0
+				};
+        (* is_fifo = 1 *) 
+        (* sync_fifo = 0 *) 
+        (* is_split = 1 *)
+        (* rd_data_width = RD_DATA_WIDTH *)
+        (* wr_data_width = WR_DATA_WIDTH *) 
+        TDP36K U1 (
+          .RESET_ni(1'b1),
+          .WDATA_A1_i(in_reg1[17:0]),
+          .WDATA_A2_i(in_reg2[17:0]),
+          .RDATA_A1_o(fifo1_flags),
+          .RDATA_A2_o(fifo2_flags),
+          .ADDR_A1_i(14'h0),
+          .ADDR_A2_i(14'h0),
+          .CLK_A1_i(Push_Clk1),
+          .CLK_A2_i(Push_Clk2),
+          .REN_A1_i(1'b1),
+          .REN_A2_i(1'b1),
+          .WEN_A1_i(PUSH1),
+          .WEN_A2_i(PUSH2),
+          .BE_A1_i(2'b11),
+          .BE_A2_i(2'b11),
+      
+          .WDATA_B1_i(18'h0),
+          .WDATA_B2_i(18'h0),
+          .RDATA_B1_o(out_reg1[17:0]),
+          .RDATA_B2_o(out_reg2[17:0]),
+          .ADDR_B1_i(14'h0),
+          .ADDR_B2_i(14'h0),
+          .CLK_B1_i(Pop_Clk1),
+          .CLK_B2_i(Pop_Clk2),
+          .REN_B1_i(POP1),
+          .REN_B2_i(POP2),
+          .WEN_B1_i(1'b0),
+          .WEN_B2_i(1'b0),
+          .BE_B1_i(2'b11),
+          .BE_B2_i(2'b11),
+      
+          .FLUSH1_i(Async_Flush1),
+          .FLUSH2_i(Async_Flush2)
+        );        
+			end
+		endcase
+	end
+	default: begin
+		case (WR_DATA_WIDTH)
+			8, 9: begin
+				defparam U1.MODE_BITS = { 1'b1,
+					UPAF_DBITS2, UPAE_DBITS2, 4'h1, MODE_9, MODE_9, MODE_9, MODE_9, 1'b0,
+					1'b0, UPAF_DBITS1, 1'b0, UPAE_DBITS1, 4'h1, MODE_9, MODE_9, MODE_9, MODE_9, 1'b0
+				};
+        (* is_fifo = 1 *) 
+        (* sync_fifo = 0 *) 
+        (* is_split = 1 *)
+        (* rd_data_width = RD_DATA_WIDTH *)
+        (* wr_data_width = WR_DATA_WIDTH *) 
+        TDP36K U1 (
+          .RESET_ni(1'b1),
+          .WDATA_A1_i(in_reg1[17:0]),
+          .WDATA_A2_i(in_reg2[17:0]),
+          .RDATA_A1_o(fifo1_flags),
+          .RDATA_A2_o(fifo2_flags),
+          .ADDR_A1_i(14'h0),
+          .ADDR_A2_i(14'h0),
+          .CLK_A1_i(Push_Clk1),
+          .CLK_A2_i(Push_Clk2),
+          .REN_A1_i(1'b1),
+          .REN_A2_i(1'b1),
+          .WEN_A1_i(PUSH1),
+          .WEN_A2_i(PUSH2),
+          .BE_A1_i(2'b11),
+          .BE_A2_i(2'b11),
+      
+          .WDATA_B1_i(18'h0),
+          .WDATA_B2_i(18'h0),
+          .RDATA_B1_o(out_reg1[17:0]),
+          .RDATA_B2_o(out_reg2[17:0]),
+          .ADDR_B1_i(14'h0),
+          .ADDR_B2_i(14'h0),
+          .CLK_B1_i(Pop_Clk1),
+          .CLK_B2_i(Pop_Clk2),
+          .REN_B1_i(POP1),
+          .REN_B2_i(POP2),
+          .WEN_B1_i(1'b0),
+          .WEN_B2_i(1'b0),
+          .BE_B1_i(2'b11),
+          .BE_B2_i(2'b11),
+      
+          .FLUSH1_i(Async_Flush1),
+          .FLUSH2_i(Async_Flush2)
+        );        
+			end
+			16, 18: begin
+				defparam U1.MODE_BITS = { 1'b1,
+					UPAF_DBITS2, UPAE_DBITS2, 4'h1, MODE_18, MODE_18, MODE_18, MODE_18, 1'b0,
+					1'b0, UPAF_DBITS1, 1'b0, UPAE_DBITS1, 4'h1, MODE_18, MODE_18, MODE_18, MODE_18, 1'b0
+				};
+        (* is_fifo = 1 *) 
+        (* sync_fifo = 0 *) 
+        (* is_split = 1 *)
+        (* rd_data_width = RD_DATA_WIDTH *)
+        (* wr_data_width = WR_DATA_WIDTH *) 
+        TDP36K U1 (
+          .RESET_ni(1'b1),
+          .WDATA_A1_i(in_reg1[17:0]),
+          .WDATA_A2_i(in_reg2[17:0]),
+          .RDATA_A1_o(fifo1_flags),
+          .RDATA_A2_o(fifo2_flags),
+          .ADDR_A1_i(14'h0),
+          .ADDR_A2_i(14'h0),
+          .CLK_A1_i(Push_Clk1),
+          .CLK_A2_i(Push_Clk2),
+          .REN_A1_i(1'b1),
+          .REN_A2_i(1'b1),
+          .WEN_A1_i(PUSH1),
+          .WEN_A2_i(PUSH2),
+          .BE_A1_i(2'b11),
+          .BE_A2_i(2'b11),
+      
+          .WDATA_B1_i(18'h0),
+          .WDATA_B2_i(18'h0),
+          .RDATA_B1_o(out_reg1[17:0]),
+          .RDATA_B2_o(out_reg2[17:0]),
+          .ADDR_B1_i(14'h0),
+          .ADDR_B2_i(14'h0),
+          .CLK_B1_i(Pop_Clk1),
+          .CLK_B2_i(Pop_Clk2),
+          .REN_B1_i(POP1),
+          .REN_B2_i(POP2),
+          .WEN_B1_i(1'b0),
+          .WEN_B2_i(1'b0),
+          .BE_B1_i(2'b11),
+          .BE_B2_i(2'b11),
+      
+          .FLUSH1_i(Async_Flush1),
+          .FLUSH2_i(Async_Flush2)
+        );       
+			end
+			default: begin
+				defparam U1.MODE_BITS = { 1'b1,
+					UPAF_DBITS2, UPAE_DBITS2, 4'h1, MODE_18, MODE_18, MODE_18, MODE_18, 1'b0,
+					1'b0, UPAF_DBITS1, 1'b0, UPAE_DBITS1, 4'h1, MODE_18, MODE_18, MODE_18, MODE_18, 1'b0
+				};
+        (* is_fifo = 1 *) 
+        (* sync_fifo = 0 *) 
+        (* is_split = 1 *)
+        (* rd_data_width = RD_DATA_WIDTH *)
+        (* wr_data_width = WR_DATA_WIDTH *) 
+        TDP36K U1 (
+          .RESET_ni(1'b1),
+          .WDATA_A1_i(in_reg1[17:0]),
+          .WDATA_A2_i(in_reg2[17:0]),
+          .RDATA_A1_o(fifo1_flags),
+          .RDATA_A2_o(fifo2_flags),
+          .ADDR_A1_i(14'h0),
+          .ADDR_A2_i(14'h0),
+          .CLK_A1_i(Push_Clk1),
+          .CLK_A2_i(Push_Clk2),
+          .REN_A1_i(1'b1),
+          .REN_A2_i(1'b1),
+          .WEN_A1_i(PUSH1),
+          .WEN_A2_i(PUSH2),
+          .BE_A1_i(2'b11),
+          .BE_A2_i(2'b11),
+      
+          .WDATA_B1_i(18'h0),
+          .WDATA_B2_i(18'h0),
+          .RDATA_B1_o(out_reg1[17:0]),
+          .RDATA_B2_o(out_reg2[17:0]),
+          .ADDR_B1_i(14'h0),
+          .ADDR_B2_i(14'h0),
+          .CLK_B1_i(Pop_Clk1),
+          .CLK_B2_i(Pop_Clk2),
+          .REN_B1_i(POP1),
+          .REN_B2_i(POP2),
+          .WEN_B1_i(1'b0),
+          .WEN_B2_i(1'b0),
+          .BE_B1_i(2'b11),
+          .BE_B2_i(2'b11),
+      
+          .FLUSH1_i(Async_Flush1),
+          .FLUSH2_i(Async_Flush2)
+        );
+			end
+		endcase
+	end
+  endcase
+
+  generate
+    if (RD_DATA_WIDTH == 9) begin
+      assign DOUT1[RD_DATA_WIDTH-1:0] = {out_reg1[16], out_reg1[7:0]};
+      assign DOUT2[RD_DATA_WIDTH-1:0] = {out_reg2[16], out_reg2[7:0]};
+    end else begin
+      assign DOUT1[RD_DATA_WIDTH-1:0] = out_reg1[RD_DATA_WIDTH-1:0];
+      assign DOUT2[RD_DATA_WIDTH-1:0] = out_reg2[RD_DATA_WIDTH-1:0];
+    end
+  endgenerate  
+
+endmodule
+
+module SFIFO_36K_BLK (
+    DIN,
+    PUSH,
+    POP,
+    CLK,
+    Async_Flush,
+    Overrun_Error,
+    Full_Watermark,
+    Almost_Full,
+    Full,
+    Underrun_Error,
+    Empty_Watermark,
+    Almost_Empty,
+    Empty,
+    DOUT
+);
+
+  parameter WR_DATA_WIDTH = 36;
+  parameter RD_DATA_WIDTH = 36;
+  parameter UPAE_DBITS = 12'd10;
+  parameter UPAF_DBITS = 12'd10;
+  
+  localparam MODE_36 = 3'b011; // 36- or 32-bit
+  localparam MODE_18 = 3'b010; // 18- or 16-bit
+  localparam MODE_9 = 3'b001; // 9- or 8-bit
+  localparam MODE_4 = 3'b100; // 4-bit
+  localparam MODE_2 = 3'b110; // 2-bit
+  localparam MODE_1 = 3'b101; // 1-bit
+
+  input wire CLK;
+  input wire PUSH, POP;
+  input wire [WR_DATA_WIDTH-1:0] DIN;
+  input wire Async_Flush;
+  output wire [RD_DATA_WIDTH-1:0] DOUT;
+  output wire Almost_Full, Almost_Empty;
+  output wire Full, Empty;
+  output wire Full_Watermark, Empty_Watermark;
+  output wire Overrun_Error, Underrun_Error;
+  
+  wire [35:0] in_reg;
+  wire [35:0] out_reg;
+  wire [17:0] fifo_flags;
+  
+  wire [35:0] RD_DATA_CMPL;
+  wire [35:WR_DATA_WIDTH] WR_DATA_CMPL;
+  
+  wire Push_Clk, Pop_Clk;
+  
+  assign Push_Clk = CLK;
+  assign Pop_Clk = CLK;
+  
+  assign Overrun_Error = fifo_flags[0];
+  assign Full_Watermark = fifo_flags[1];
+  assign Almost_Full = fifo_flags[2];
+  assign Full = fifo_flags[3];
+  assign Underrun_Error = fifo_flags[4];
+  assign Empty_Watermark = fifo_flags[5];
+  assign Almost_Empty = fifo_flags[6];
+  assign Empty = fifo_flags[7];
+   
+  generate
+    if (WR_DATA_WIDTH == 36) begin
+      assign in_reg[WR_DATA_WIDTH-1:0] = DIN[WR_DATA_WIDTH-1:0];
+    end else if (WR_DATA_WIDTH > 18 && WR_DATA_WIDTH < 36) begin
+      assign in_reg[WR_DATA_WIDTH+1:18] = DIN[WR_DATA_WIDTH-1:16];
+      assign in_reg[17:0] = {2'b00,DIN[15:0]};
+    end else if (WR_DATA_WIDTH == 9) begin
+      assign in_reg[35:0] = {19'h0, DIN[8], 8'h0, DIN[7:0]};
+    end else begin
+      assign in_reg[35:WR_DATA_WIDTH]  = 0;
+      assign in_reg[WR_DATA_WIDTH-1:0] = DIN[WR_DATA_WIDTH-1:0];
+    end
+  endgenerate
+  
+  generate
+    if (RD_DATA_WIDTH == 36) begin
+      assign RD_DATA_CMPL = out_reg;
+    end else if (RD_DATA_WIDTH > 18 && RD_DATA_WIDTH < 36) begin
+      assign RD_DATA_CMPL  = {2'b00,out_reg[35:18],out_reg[15:0]};
+    end else if (RD_DATA_WIDTH == 9) begin
+      assign RD_DATA_CMPL = { 27'h0, out_reg[16], out_reg[7:0]};
+    end else begin
+      assign RD_DATA_CMPL = {18'h0, out_reg[17:0]};
+    end
+  endgenerate
+  
+  case (RD_DATA_WIDTH)
+	8, 9: begin
+		case (WR_DATA_WIDTH)
+			8, 9: begin
+				defparam U1.MODE_BITS = { 1'b0,
+					11'd10, 11'd10, 4'd0, MODE_9, MODE_9, MODE_9, MODE_9, 1'd0,
+					UPAF_DBITS, UPAE_DBITS, 4'h1, MODE_9, MODE_9, MODE_9, MODE_9, 1'b1
+				};
+        (* is_fifo = 1 *)
+        (* sync_fifo = 1 *)
+        (* rd_data_width = RD_DATA_WIDTH *) 
+        (* wr_data_width = WR_DATA_WIDTH *)
+        TDP36K U1 (
+          .RESET_ni(1'b1),
+          .WDATA_A1_i(in_reg[17:0]),
+          .WDATA_A2_i(in_reg[35:18]),
+          .RDATA_A1_o(fifo_flags),
+          .RDATA_A2_o(),
+          .ADDR_A1_i(14'h0),
+          .ADDR_A2_i(14'h0),
+          .CLK_A1_i(Push_Clk),
+          .CLK_A2_i(1'b0),
+          .REN_A1_i(1'b1),
+          .REN_A2_i(1'b0),
+          .WEN_A1_i(PUSH),
+          .WEN_A2_i(1'b0),
+          .BE_A1_i(2'b11),
+          .BE_A2_i(2'b11),
+      
+          .WDATA_B1_i(18'h0),
+          .WDATA_B2_i(18'h0),
+          .RDATA_B1_o(out_reg[17:0]),
+          .RDATA_B2_o(out_reg[35:18]),
+          .ADDR_B1_i(14'h0),
+          .ADDR_B2_i(14'h0),
+          .CLK_B1_i(Pop_Clk),
+          .CLK_B2_i(1'b0),
+          .REN_B1_i(POP),
+          .REN_B2_i(1'b0),
+          .WEN_B1_i(1'b0),
+          .WEN_B2_i(1'b0),
+          .BE_B1_i(2'b11),
+          .BE_B2_i(2'b11),
+      
+          .FLUSH1_i(Async_Flush),
+          .FLUSH2_i(1'b0)
+        );
+			end
+			16, 18: begin
+				defparam U1.MODE_BITS = { 1'b0,
+					11'd10, 11'd10, 4'd0, MODE_9, MODE_18, MODE_9, MODE_18, 1'd0,
+					UPAF_DBITS, UPAE_DBITS, 4'h1, MODE_9, MODE_18, MODE_9, MODE_18, 1'b1
+				};
+        (* is_fifo = 1 *)
+        (* sync_fifo = 1 *)
+        (* rd_data_width = RD_DATA_WIDTH *) 
+        (* wr_data_width = WR_DATA_WIDTH *)
+        TDP36K U1 (
+          .RESET_ni(1'b1),
+          .WDATA_A1_i(in_reg[17:0]),
+          .WDATA_A2_i(in_reg[35:18]),
+          .RDATA_A1_o(fifo_flags),
+          .RDATA_A2_o(),
+          .ADDR_A1_i(14'h0),
+          .ADDR_A2_i(14'h0),
+          .CLK_A1_i(Push_Clk),
+          .CLK_A2_i(1'b0),
+          .REN_A1_i(1'b1),
+          .REN_A2_i(1'b0),
+          .WEN_A1_i(PUSH),
+          .WEN_A2_i(1'b0),
+          .BE_A1_i(2'b11),
+          .BE_A2_i(2'b11),
+      
+          .WDATA_B1_i(18'h0),
+          .WDATA_B2_i(18'h0),
+          .RDATA_B1_o(out_reg[17:0]),
+          .RDATA_B2_o(out_reg[35:18]),
+          .ADDR_B1_i(14'h0),
+          .ADDR_B2_i(14'h0),
+          .CLK_B1_i(Pop_Clk),
+          .CLK_B2_i(1'b0),
+          .REN_B1_i(POP),
+          .REN_B2_i(1'b0),
+          .WEN_B1_i(1'b0),
+          .WEN_B2_i(1'b0),
+          .BE_B1_i(2'b11),
+          .BE_B2_i(2'b11),
+      
+          .FLUSH1_i(Async_Flush),
+          .FLUSH2_i(1'b0)
+        );        
+			end
+			32, 36: begin
+				defparam U1.MODE_BITS = { 1'b0,
+					11'd10, 11'd10, 4'd0, MODE_9, MODE_36, MODE_9, MODE_36, 1'd0,
+					UPAF_DBITS, UPAE_DBITS, 4'h1, MODE_9, MODE_36, MODE_9, MODE_36, 1'b1
+				};
+        (* is_fifo = 1 *)
+        (* sync_fifo = 1 *)
+        (* rd_data_width = RD_DATA_WIDTH *) 
+        (* wr_data_width = WR_DATA_WIDTH *)
+        TDP36K U1 (
+          .RESET_ni(1'b1),
+          .WDATA_A1_i(in_reg[17:0]),
+          .WDATA_A2_i(in_reg[35:18]),
+          .RDATA_A1_o(fifo_flags),
+          .RDATA_A2_o(),
+          .ADDR_A1_i(14'h0),
+          .ADDR_A2_i(14'h0),
+          .CLK_A1_i(Push_Clk),
+          .CLK_A2_i(1'b0),
+          .REN_A1_i(1'b1),
+          .REN_A2_i(1'b0),
+          .WEN_A1_i(PUSH),
+          .WEN_A2_i(1'b0),
+          .BE_A1_i(2'b11),
+          .BE_A2_i(2'b11),
+      
+          .WDATA_B1_i(18'h0),
+          .WDATA_B2_i(18'h0),
+          .RDATA_B1_o(out_reg[17:0]),
+          .RDATA_B2_o(out_reg[35:18]),
+          .ADDR_B1_i(14'h0),
+          .ADDR_B2_i(14'h0),
+          .CLK_B1_i(Pop_Clk),
+          .CLK_B2_i(1'b0),
+          .REN_B1_i(POP),
+          .REN_B2_i(1'b0),
+          .WEN_B1_i(1'b0),
+          .WEN_B2_i(1'b0),
+          .BE_B1_i(2'b11),
+          .BE_B2_i(2'b11),
+      
+          .FLUSH1_i(Async_Flush),
+          .FLUSH2_i(1'b0)
+        );        
+			end
+			default: begin
+				defparam U1.MODE_BITS = { 1'b0,
+					11'd10, 11'd10, 4'd0, MODE_9, MODE_9, MODE_9, MODE_9, 1'd0,
+					UPAF_DBITS, UPAE_DBITS, 4'h1, MODE_9, MODE_9, MODE_9, MODE_9, 1'b1
+				};
+        (* is_fifo = 1 *)
+        (* sync_fifo = 1 *)
+        (* rd_data_width = RD_DATA_WIDTH *) 
+        (* wr_data_width = WR_DATA_WIDTH *)
+        TDP36K U1 (
+          .RESET_ni(1'b1),
+          .WDATA_A1_i(in_reg[17:0]),
+          .WDATA_A2_i(in_reg[35:18]),
+          .RDATA_A1_o(fifo_flags),
+          .RDATA_A2_o(),
+          .ADDR_A1_i(14'h0),
+          .ADDR_A2_i(14'h0),
+          .CLK_A1_i(Push_Clk),
+          .CLK_A2_i(1'b0),
+          .REN_A1_i(1'b1),
+          .REN_A2_i(1'b0),
+          .WEN_A1_i(PUSH),
+          .WEN_A2_i(1'b0),
+          .BE_A1_i(2'b11),
+          .BE_A2_i(2'b11),
+      
+          .WDATA_B1_i(18'h0),
+          .WDATA_B2_i(18'h0),
+          .RDATA_B1_o(out_reg[17:0]),
+          .RDATA_B2_o(out_reg[35:18]),
+          .ADDR_B1_i(14'h0),
+          .ADDR_B2_i(14'h0),
+          .CLK_B1_i(Pop_Clk),
+          .CLK_B2_i(1'b0),
+          .REN_B1_i(POP),
+          .REN_B2_i(1'b0),
+          .WEN_B1_i(1'b0),
+          .WEN_B2_i(1'b0),
+          .BE_B1_i(2'b11),
+          .BE_B2_i(2'b11),
+      
+          .FLUSH1_i(Async_Flush),
+          .FLUSH2_i(1'b0)
+        );        
+			end
+		endcase
+	end
+	16, 18: begin
+		case (WR_DATA_WIDTH)
+			8, 9: begin
+				defparam U1.MODE_BITS = { 1'b0,
+					11'd10, 11'd10, 4'd0, MODE_18, MODE_9, MODE_18, MODE_9, 1'd0,
+					UPAF_DBITS, UPAE_DBITS, 4'h1, MODE_18, MODE_9, MODE_18, MODE_9, 1'b1
+				};
+        (* is_fifo = 1 *)
+        (* sync_fifo = 1 *)
+        (* rd_data_width = RD_DATA_WIDTH *) 
+        (* wr_data_width = WR_DATA_WIDTH *)
+        TDP36K U1 (
+          .RESET_ni(1'b1),
+          .WDATA_A1_i(in_reg[17:0]),
+          .WDATA_A2_i(in_reg[35:18]),
+          .RDATA_A1_o(fifo_flags),
+          .RDATA_A2_o(),
+          .ADDR_A1_i(14'h0),
+          .ADDR_A2_i(14'h0),
+          .CLK_A1_i(Push_Clk),
+          .CLK_A2_i(1'b0),
+          .REN_A1_i(1'b1),
+          .REN_A2_i(1'b0),
+          .WEN_A1_i(PUSH),
+          .WEN_A2_i(1'b0),
+          .BE_A1_i(2'b11),
+          .BE_A2_i(2'b11),
+      
+          .WDATA_B1_i(18'h0),
+          .WDATA_B2_i(18'h0),
+          .RDATA_B1_o(out_reg[17:0]),
+          .RDATA_B2_o(out_reg[35:18]),
+          .ADDR_B1_i(14'h0),
+          .ADDR_B2_i(14'h0),
+          .CLK_B1_i(Pop_Clk),
+          .CLK_B2_i(1'b0),
+          .REN_B1_i(POP),
+          .REN_B2_i(1'b0),
+          .WEN_B1_i(1'b0),
+          .WEN_B2_i(1'b0),
+          .BE_B1_i(2'b11),
+          .BE_B2_i(2'b11),
+      
+          .FLUSH1_i(Async_Flush),
+          .FLUSH2_i(1'b0)
+        );        
+			end
+			16, 18: begin
+				defparam U1.MODE_BITS = { 1'b0,
+					11'd10, 11'd10, 4'd0, MODE_18, MODE_18, MODE_18, MODE_18, 1'd0,
+					UPAF_DBITS, UPAE_DBITS, 4'h1, MODE_18, MODE_18, MODE_18, MODE_18, 1'b1
+				};
+        (* is_fifo = 1 *)
+        (* sync_fifo = 1 *)
+        (* rd_data_width = RD_DATA_WIDTH *) 
+        (* wr_data_width = WR_DATA_WIDTH *)
+        TDP36K U1 (
+          .RESET_ni(1'b1),
+          .WDATA_A1_i(in_reg[17:0]),
+          .WDATA_A2_i(in_reg[35:18]),
+          .RDATA_A1_o(fifo_flags),
+          .RDATA_A2_o(),
+          .ADDR_A1_i(14'h0),
+          .ADDR_A2_i(14'h0),
+          .CLK_A1_i(Push_Clk),
+          .CLK_A2_i(1'b0),
+          .REN_A1_i(1'b1),
+          .REN_A2_i(1'b0),
+          .WEN_A1_i(PUSH),
+          .WEN_A2_i(1'b0),
+          .BE_A1_i(2'b11),
+          .BE_A2_i(2'b11),
+      
+          .WDATA_B1_i(18'h0),
+          .WDATA_B2_i(18'h0),
+          .RDATA_B1_o(out_reg[17:0]),
+          .RDATA_B2_o(out_reg[35:18]),
+          .ADDR_B1_i(14'h0),
+          .ADDR_B2_i(14'h0),
+          .CLK_B1_i(Pop_Clk),
+          .CLK_B2_i(1'b0),
+          .REN_B1_i(POP),
+          .REN_B2_i(1'b0),
+          .WEN_B1_i(1'b0),
+          .WEN_B2_i(1'b0),
+          .BE_B1_i(2'b11),
+          .BE_B2_i(2'b11),
+      
+          .FLUSH1_i(Async_Flush),
+          .FLUSH2_i(1'b0)
+        );        
+			end
+			32, 36: begin
+				defparam U1.MODE_BITS = { 1'b0,
+					11'd10, 11'd10, 4'd0, MODE_18, MODE_36, MODE_18, MODE_36, 1'd0,
+					UPAF_DBITS, UPAE_DBITS, 4'h1, MODE_18, MODE_36, MODE_18, MODE_36, 1'b1
+				};
+        (* is_fifo = 1 *)
+        (* sync_fifo = 1 *)
+        (* rd_data_width = RD_DATA_WIDTH *) 
+        (* wr_data_width = WR_DATA_WIDTH *)
+        TDP36K U1 (
+          .RESET_ni(1'b1),
+          .WDATA_A1_i(in_reg[17:0]),
+          .WDATA_A2_i(in_reg[35:18]),
+          .RDATA_A1_o(fifo_flags),
+          .RDATA_A2_o(),
+          .ADDR_A1_i(14'h0),
+          .ADDR_A2_i(14'h0),
+          .CLK_A1_i(Push_Clk),
+          .CLK_A2_i(1'b0),
+          .REN_A1_i(1'b1),
+          .REN_A2_i(1'b0),
+          .WEN_A1_i(PUSH),
+          .WEN_A2_i(1'b0),
+          .BE_A1_i(2'b11),
+          .BE_A2_i(2'b11),
+      
+          .WDATA_B1_i(18'h0),
+          .WDATA_B2_i(18'h0),
+          .RDATA_B1_o(out_reg[17:0]),
+          .RDATA_B2_o(out_reg[35:18]),
+          .ADDR_B1_i(14'h0),
+          .ADDR_B2_i(14'h0),
+          .CLK_B1_i(Pop_Clk),
+          .CLK_B2_i(1'b0),
+          .REN_B1_i(POP),
+          .REN_B2_i(1'b0),
+          .WEN_B1_i(1'b0),
+          .WEN_B2_i(1'b0),
+          .BE_B1_i(2'b11),
+          .BE_B2_i(2'b11),
+      
+          .FLUSH1_i(Async_Flush),
+          .FLUSH2_i(1'b0)
+        );        
+			end
+			default: begin
+				defparam U1.MODE_BITS = { 1'b0,
+					11'd10, 11'd10, 4'd0, MODE_18, MODE_18, MODE_18, MODE_18, 1'd0,
+					UPAF_DBITS, UPAE_DBITS, 4'h1, MODE_18, MODE_18, MODE_18, MODE_18, 1'b1
+				};
+        (* is_fifo = 1 *)
+        (* sync_fifo = 1 *)
+        (* rd_data_width = RD_DATA_WIDTH *) 
+        (* wr_data_width = WR_DATA_WIDTH *)
+        TDP36K U1 (
+          .RESET_ni(1'b1),
+          .WDATA_A1_i(in_reg[17:0]),
+          .WDATA_A2_i(in_reg[35:18]),
+          .RDATA_A1_o(fifo_flags),
+          .RDATA_A2_o(),
+          .ADDR_A1_i(14'h0),
+          .ADDR_A2_i(14'h0),
+          .CLK_A1_i(Push_Clk),
+          .CLK_A2_i(1'b0),
+          .REN_A1_i(1'b1),
+          .REN_A2_i(1'b0),
+          .WEN_A1_i(PUSH),
+          .WEN_A2_i(1'b0),
+          .BE_A1_i(2'b11),
+          .BE_A2_i(2'b11),
+      
+          .WDATA_B1_i(18'h0),
+          .WDATA_B2_i(18'h0),
+          .RDATA_B1_o(out_reg[17:0]),
+          .RDATA_B2_o(out_reg[35:18]),
+          .ADDR_B1_i(14'h0),
+          .ADDR_B2_i(14'h0),
+          .CLK_B1_i(Pop_Clk),
+          .CLK_B2_i(1'b0),
+          .REN_B1_i(POP),
+          .REN_B2_i(1'b0),
+          .WEN_B1_i(1'b0),
+          .WEN_B2_i(1'b0),
+          .BE_B1_i(2'b11),
+          .BE_B2_i(2'b11),
+      
+          .FLUSH1_i(Async_Flush),
+          .FLUSH2_i(1'b0)
+        );        
+			end
+		endcase
+	end
+	32, 36: begin
+		case (WR_DATA_WIDTH)
+			8, 9: begin
+				defparam U1.MODE_BITS = { 1'b0,
+					11'd10, 11'd10, 4'd0, MODE_36, MODE_9, MODE_36, MODE_9, 1'd0,
+					UPAF_DBITS, UPAE_DBITS, 4'h1, MODE_36, MODE_9, MODE_36, MODE_9, 1'b1
+				};
+        (* is_fifo = 1 *)
+        (* sync_fifo = 1 *)
+        (* rd_data_width = RD_DATA_WIDTH *) 
+        (* wr_data_width = WR_DATA_WIDTH *)
+        TDP36K U1 (
+          .RESET_ni(1'b1),
+          .WDATA_A1_i(in_reg[17:0]),
+          .WDATA_A2_i(in_reg[35:18]),
+          .RDATA_A1_o(fifo_flags),
+          .RDATA_A2_o(),
+          .ADDR_A1_i(14'h0),
+          .ADDR_A2_i(14'h0),
+          .CLK_A1_i(Push_Clk),
+          .CLK_A2_i(1'b0),
+          .REN_A1_i(1'b1),
+          .REN_A2_i(1'b0),
+          .WEN_A1_i(PUSH),
+          .WEN_A2_i(1'b0),
+          .BE_A1_i(2'b11),
+          .BE_A2_i(2'b11),
+      
+          .WDATA_B1_i(18'h0),
+          .WDATA_B2_i(18'h0),
+          .RDATA_B1_o(out_reg[17:0]),
+          .RDATA_B2_o(out_reg[35:18]),
+          .ADDR_B1_i(14'h0),
+          .ADDR_B2_i(14'h0),
+          .CLK_B1_i(Pop_Clk),
+          .CLK_B2_i(1'b0),
+          .REN_B1_i(POP),
+          .REN_B2_i(1'b0),
+          .WEN_B1_i(1'b0),
+          .WEN_B2_i(1'b0),
+          .BE_B1_i(2'b11),
+          .BE_B2_i(2'b11),
+      
+          .FLUSH1_i(Async_Flush),
+          .FLUSH2_i(1'b0)
+        );        
+			end
+			16, 18: begin
+				defparam U1.MODE_BITS = { 1'b0,
+					11'd10, 11'd10, 4'd0, MODE_36, MODE_18, MODE_36, MODE_18, 1'd0,
+					UPAF_DBITS, UPAE_DBITS, 4'h1, MODE_36, MODE_18, MODE_36, MODE_18, 1'b1
+				};
+        (* is_fifo = 1 *)
+        (* sync_fifo = 1 *)
+        (* rd_data_width = RD_DATA_WIDTH *) 
+        (* wr_data_width = WR_DATA_WIDTH *)
+        TDP36K U1 (
+          .RESET_ni(1'b1),
+          .WDATA_A1_i(in_reg[17:0]),
+          .WDATA_A2_i(in_reg[35:18]),
+          .RDATA_A1_o(fifo_flags),
+          .RDATA_A2_o(),
+          .ADDR_A1_i(14'h0),
+          .ADDR_A2_i(14'h0),
+          .CLK_A1_i(Push_Clk),
+          .CLK_A2_i(1'b0),
+          .REN_A1_i(1'b1),
+          .REN_A2_i(1'b0),
+          .WEN_A1_i(PUSH),
+          .WEN_A2_i(1'b0),
+          .BE_A1_i(2'b11),
+          .BE_A2_i(2'b11),
+      
+          .WDATA_B1_i(18'h0),
+          .WDATA_B2_i(18'h0),
+          .RDATA_B1_o(out_reg[17:0]),
+          .RDATA_B2_o(out_reg[35:18]),
+          .ADDR_B1_i(14'h0),
+          .ADDR_B2_i(14'h0),
+          .CLK_B1_i(Pop_Clk),
+          .CLK_B2_i(1'b0),
+          .REN_B1_i(POP),
+          .REN_B2_i(1'b0),
+          .WEN_B1_i(1'b0),
+          .WEN_B2_i(1'b0),
+          .BE_B1_i(2'b11),
+          .BE_B2_i(2'b11),
+      
+          .FLUSH1_i(Async_Flush),
+          .FLUSH2_i(1'b0)
+        );        
+			end
+			32, 36: begin
+				defparam U1.MODE_BITS = { 1'b0,
+					11'd10, 11'd10, 4'd0, MODE_36, MODE_36, MODE_36, MODE_36, 1'd0,
+					UPAF_DBITS, UPAE_DBITS, 4'h1, MODE_36, MODE_36, MODE_36, MODE_36, 1'b1
+				};
+        (* is_fifo = 1 *)
+        (* sync_fifo = 1 *)
+        (* rd_data_width = RD_DATA_WIDTH *) 
+        (* wr_data_width = WR_DATA_WIDTH *)
+        TDP36K U1 (
+          .RESET_ni(1'b1),
+          .WDATA_A1_i(in_reg[17:0]),
+          .WDATA_A2_i(in_reg[35:18]),
+          .RDATA_A1_o(fifo_flags),
+          .RDATA_A2_o(),
+          .ADDR_A1_i(14'h0),
+          .ADDR_A2_i(14'h0),
+          .CLK_A1_i(Push_Clk),
+          .CLK_A2_i(1'b0),
+          .REN_A1_i(1'b1),
+          .REN_A2_i(1'b0),
+          .WEN_A1_i(PUSH),
+          .WEN_A2_i(1'b0),
+          .BE_A1_i(2'b11),
+          .BE_A2_i(2'b11),
+      
+          .WDATA_B1_i(18'h0),
+          .WDATA_B2_i(18'h0),
+          .RDATA_B1_o(out_reg[17:0]),
+          .RDATA_B2_o(out_reg[35:18]),
+          .ADDR_B1_i(14'h0),
+          .ADDR_B2_i(14'h0),
+          .CLK_B1_i(Pop_Clk),
+          .CLK_B2_i(1'b0),
+          .REN_B1_i(POP),
+          .REN_B2_i(1'b0),
+          .WEN_B1_i(1'b0),
+          .WEN_B2_i(1'b0),
+          .BE_B1_i(2'b11),
+          .BE_B2_i(2'b11),
+      
+          .FLUSH1_i(Async_Flush),
+          .FLUSH2_i(1'b0)
+        );        
+			end
+			default: begin
+				defparam U1.MODE_BITS = { 1'b0,
+					11'd10, 11'd10, 4'd0, MODE_36, MODE_36, MODE_36, MODE_36, 1'd0,
+					UPAF_DBITS, UPAE_DBITS, 4'h1, MODE_36, MODE_36, MODE_36, MODE_36, 1'b1
+				};
+        (* is_fifo = 1 *)
+        (* sync_fifo = 1 *)
+        (* rd_data_width = RD_DATA_WIDTH *) 
+        (* wr_data_width = WR_DATA_WIDTH *)
+        TDP36K U1 (
+          .RESET_ni(1'b1),
+          .WDATA_A1_i(in_reg[17:0]),
+          .WDATA_A2_i(in_reg[35:18]),
+          .RDATA_A1_o(fifo_flags),
+          .RDATA_A2_o(),
+          .ADDR_A1_i(14'h0),
+          .ADDR_A2_i(14'h0),
+          .CLK_A1_i(Push_Clk),
+          .CLK_A2_i(1'b0),
+          .REN_A1_i(1'b1),
+          .REN_A2_i(1'b0),
+          .WEN_A1_i(PUSH),
+          .WEN_A2_i(1'b0),
+          .BE_A1_i(2'b11),
+          .BE_A2_i(2'b11),
+      
+          .WDATA_B1_i(18'h0),
+          .WDATA_B2_i(18'h0),
+          .RDATA_B1_o(out_reg[17:0]),
+          .RDATA_B2_o(out_reg[35:18]),
+          .ADDR_B1_i(14'h0),
+          .ADDR_B2_i(14'h0),
+          .CLK_B1_i(Pop_Clk),
+          .CLK_B2_i(1'b0),
+          .REN_B1_i(POP),
+          .REN_B2_i(1'b0),
+          .WEN_B1_i(1'b0),
+          .WEN_B2_i(1'b0),
+          .BE_B1_i(2'b11),
+          .BE_B2_i(2'b11),
+      
+          .FLUSH1_i(Async_Flush),
+          .FLUSH2_i(1'b0)
+        );        
+			end
+		endcase
+	end
+	default: begin
+		case (WR_DATA_WIDTH)
+			8, 9: begin
+				defparam U1.MODE_BITS = { 1'b0,
+					11'd10, 11'd10, 4'd0, MODE_9, MODE_9, MODE_9, MODE_9, 1'd0,
+					UPAF_DBITS, UPAE_DBITS, 4'h1, MODE_9, MODE_9, MODE_9, MODE_9, 1'b1
+				};
+        (* is_fifo = 1 *)
+        (* sync_fifo = 1 *)
+        (* rd_data_width = RD_DATA_WIDTH *) 
+        (* wr_data_width = WR_DATA_WIDTH *)
+        TDP36K U1 (
+          .RESET_ni(1'b1),
+          .WDATA_A1_i(in_reg[17:0]),
+          .WDATA_A2_i(in_reg[35:18]),
+          .RDATA_A1_o(fifo_flags),
+          .RDATA_A2_o(),
+          .ADDR_A1_i(14'h0),
+          .ADDR_A2_i(14'h0),
+          .CLK_A1_i(Push_Clk),
+          .CLK_A2_i(1'b0),
+          .REN_A1_i(1'b1),
+          .REN_A2_i(1'b0),
+          .WEN_A1_i(PUSH),
+          .WEN_A2_i(1'b0),
+          .BE_A1_i(2'b11),
+          .BE_A2_i(2'b11),
+      
+          .WDATA_B1_i(18'h0),
+          .WDATA_B2_i(18'h0),
+          .RDATA_B1_o(out_reg[17:0]),
+          .RDATA_B2_o(out_reg[35:18]),
+          .ADDR_B1_i(14'h0),
+          .ADDR_B2_i(14'h0),
+          .CLK_B1_i(Pop_Clk),
+          .CLK_B2_i(1'b0),
+          .REN_B1_i(POP),
+          .REN_B2_i(1'b0),
+          .WEN_B1_i(1'b0),
+          .WEN_B2_i(1'b0),
+          .BE_B1_i(2'b11),
+          .BE_B2_i(2'b11),
+      
+          .FLUSH1_i(Async_Flush),
+          .FLUSH2_i(1'b0)
+        );        
+			end
+			16, 18: begin
+				defparam U1.MODE_BITS = { 1'b0,
+					11'd10, 11'd10, 4'd0, MODE_18, MODE_18, MODE_18, MODE_18, 1'd0,
+					UPAF_DBITS, UPAE_DBITS, 4'h1, MODE_18, MODE_18, MODE_18, MODE_18, 1'b1
+				};
+        (* is_fifo = 1 *)
+        (* sync_fifo = 1 *)
+        (* rd_data_width = RD_DATA_WIDTH *) 
+        (* wr_data_width = WR_DATA_WIDTH *)
+        TDP36K U1 (
+          .RESET_ni(1'b1),
+          .WDATA_A1_i(in_reg[17:0]),
+          .WDATA_A2_i(in_reg[35:18]),
+          .RDATA_A1_o(fifo_flags),
+          .RDATA_A2_o(),
+          .ADDR_A1_i(14'h0),
+          .ADDR_A2_i(14'h0),
+          .CLK_A1_i(Push_Clk),
+          .CLK_A2_i(1'b0),
+          .REN_A1_i(1'b1),
+          .REN_A2_i(1'b0),
+          .WEN_A1_i(PUSH),
+          .WEN_A2_i(1'b0),
+          .BE_A1_i(2'b11),
+          .BE_A2_i(2'b11),
+      
+          .WDATA_B1_i(18'h0),
+          .WDATA_B2_i(18'h0),
+          .RDATA_B1_o(out_reg[17:0]),
+          .RDATA_B2_o(out_reg[35:18]),
+          .ADDR_B1_i(14'h0),
+          .ADDR_B2_i(14'h0),
+          .CLK_B1_i(Pop_Clk),
+          .CLK_B2_i(1'b0),
+          .REN_B1_i(POP),
+          .REN_B2_i(1'b0),
+          .WEN_B1_i(1'b0),
+          .WEN_B2_i(1'b0),
+          .BE_B1_i(2'b11),
+          .BE_B2_i(2'b11),
+      
+          .FLUSH1_i(Async_Flush),
+          .FLUSH2_i(1'b0)
+        );        
+			end
+			32, 36: begin
+				defparam U1.MODE_BITS = { 1'b0,
+					11'd10, 11'd10, 4'd0, MODE_36, MODE_36, MODE_36, MODE_36, 1'd0,
+					UPAF_DBITS, UPAE_DBITS, 4'h1, MODE_36, MODE_36, MODE_36, MODE_36, 1'b1
+				};
+        (* is_fifo = 1 *)
+        (* sync_fifo = 1 *)
+        (* rd_data_width = RD_DATA_WIDTH *) 
+        (* wr_data_width = WR_DATA_WIDTH *)
+        TDP36K U1 (
+          .RESET_ni(1'b1),
+          .WDATA_A1_i(in_reg[17:0]),
+          .WDATA_A2_i(in_reg[35:18]),
+          .RDATA_A1_o(fifo_flags),
+          .RDATA_A2_o(),
+          .ADDR_A1_i(14'h0),
+          .ADDR_A2_i(14'h0),
+          .CLK_A1_i(Push_Clk),
+          .CLK_A2_i(1'b0),
+          .REN_A1_i(1'b1),
+          .REN_A2_i(1'b0),
+          .WEN_A1_i(PUSH),
+          .WEN_A2_i(1'b0),
+          .BE_A1_i(2'b11),
+          .BE_A2_i(2'b11),
+      
+          .WDATA_B1_i(18'h0),
+          .WDATA_B2_i(18'h0),
+          .RDATA_B1_o(out_reg[17:0]),
+          .RDATA_B2_o(out_reg[35:18]),
+          .ADDR_B1_i(14'h0),
+          .ADDR_B2_i(14'h0),
+          .CLK_B1_i(Pop_Clk),
+          .CLK_B2_i(1'b0),
+          .REN_B1_i(POP),
+          .REN_B2_i(1'b0),
+          .WEN_B1_i(1'b0),
+          .WEN_B2_i(1'b0),
+          .BE_B1_i(2'b11),
+          .BE_B2_i(2'b11),
+      
+          .FLUSH1_i(Async_Flush),
+          .FLUSH2_i(1'b0)
+        );
+			end
+			default: begin
+				defparam U1.MODE_BITS = { 1'b0,
+					11'd10, 11'd10, 4'd0, MODE_36, MODE_36, MODE_36, MODE_36, 1'd0,
+					UPAF_DBITS, UPAE_DBITS, 4'h1, MODE_36, MODE_36, MODE_36, MODE_36, 1'b1
+				};
+        (* is_fifo = 1 *)
+        (* sync_fifo = 1 *)
+        (* rd_data_width = RD_DATA_WIDTH *) 
+        (* wr_data_width = WR_DATA_WIDTH *)
+        TDP36K U1 (
+          .RESET_ni(1'b1),
+          .WDATA_A1_i(in_reg[17:0]),
+          .WDATA_A2_i(in_reg[35:18]),
+          .RDATA_A1_o(fifo_flags),
+          .RDATA_A2_o(),
+          .ADDR_A1_i(14'h0),
+          .ADDR_A2_i(14'h0),
+          .CLK_A1_i(Push_Clk),
+          .CLK_A2_i(1'b0),
+          .REN_A1_i(1'b1),
+          .REN_A2_i(1'b0),
+          .WEN_A1_i(PUSH),
+          .WEN_A2_i(1'b0),
+          .BE_A1_i(2'b11),
+          .BE_A2_i(2'b11),
+      
+          .WDATA_B1_i(18'h0),
+          .WDATA_B2_i(18'h0),
+          .RDATA_B1_o(out_reg[17:0]),
+          .RDATA_B2_o(out_reg[35:18]),
+          .ADDR_B1_i(14'h0),
+          .ADDR_B2_i(14'h0),
+          .CLK_B1_i(Pop_Clk),
+          .CLK_B2_i(1'b0),
+          .REN_B1_i(POP),
+          .REN_B2_i(1'b0),
+          .WEN_B1_i(1'b0),
+          .WEN_B2_i(1'b0),
+          .BE_B1_i(2'b11),
+          .BE_B2_i(2'b11),
+      
+          .FLUSH1_i(Async_Flush),
+          .FLUSH2_i(1'b0)
+        );
+			end
+		endcase
+	end
+ endcase
+
+  assign DOUT[RD_DATA_WIDTH-1 : 0] = RD_DATA_CMPL[RD_DATA_WIDTH-1 : 0];
+
+endmodule
+
+module AFIFO_36K_BLK (
+    DIN,
+    PUSH,
+    POP,
+    Push_Clk,
+    Pop_Clk,
+    Async_Flush,
+    Overrun_Error,
+    Full_Watermark,
+    Almost_Full,
+    Full,
+    Underrun_Error,
+    Empty_Watermark,
+    Almost_Empty,
+    Empty,
+    DOUT
+);
+
+  parameter WR_DATA_WIDTH = 36;
+  parameter RD_DATA_WIDTH = 36;
+  parameter UPAE_DBITS = 12'd10;
+  parameter UPAF_DBITS = 12'd10;
+
+  localparam MODE_36 = 3'b011; // 36- or 32-bit
+  localparam MODE_18 = 3'b010; // 18- or 16-bit
+  localparam MODE_9 = 3'b001; // 9- or 8-bit
+  localparam MODE_4 = 3'b100; // 4-bit
+  localparam MODE_2 = 3'b110; // 2-bit
+  localparam MODE_1 = 3'b101; // 1-bit
+
+  input wire Push_Clk, Pop_Clk;
+  input wire PUSH, POP;
+  input wire [WR_DATA_WIDTH-1:0] DIN;
+  input wire Async_Flush;
+  output wire [RD_DATA_WIDTH-1:0] DOUT;
+  output wire Almost_Full, Almost_Empty;
+  output wire Full, Empty;
+  output wire Full_Watermark, Empty_Watermark;
+  output wire Overrun_Error, Underrun_Error;
+  
+  wire [35:0] in_reg;
+  wire [35:0] out_reg;
+  wire [17:0] fifo_flags;
+  
+  wire [35:0] RD_DATA_CMPL;
+  wire [35:WR_DATA_WIDTH] WR_DATA_CMPL;
+  
+  assign Overrun_Error = fifo_flags[0];
+  assign Full_Watermark = fifo_flags[1];
+  assign Almost_Full = fifo_flags[2];
+  assign Full = fifo_flags[3];
+  assign Underrun_Error = fifo_flags[4];
+  assign Empty_Watermark = fifo_flags[5];
+  assign Almost_Empty = fifo_flags[6];
+  assign Empty = fifo_flags[7];
+   
+  generate
+    if (WR_DATA_WIDTH == 36) begin
+      assign in_reg[WR_DATA_WIDTH-1:0] = DIN[WR_DATA_WIDTH-1:0];
+    end else if (WR_DATA_WIDTH > 18 && WR_DATA_WIDTH < 36) begin
+      assign in_reg[WR_DATA_WIDTH+1:18] = DIN[WR_DATA_WIDTH-1:16];
+      assign in_reg[17:0] = {2'b00,DIN[15:0]};
+    end else if (WR_DATA_WIDTH == 9) begin
+      assign in_reg[35:0] = {19'h0, DIN[8], 8'h0, DIN[7:0]};
+    end else begin
+      assign in_reg[35:WR_DATA_WIDTH]  = 0;
+      assign in_reg[WR_DATA_WIDTH-1:0] = DIN[WR_DATA_WIDTH-1:0];
+    end
+  endgenerate
+  
+  generate
+    if (RD_DATA_WIDTH == 36) begin
+      assign RD_DATA_CMPL = out_reg;
+    end else if (RD_DATA_WIDTH > 18 && RD_DATA_WIDTH < 36) begin
+      assign RD_DATA_CMPL  = {2'b00,out_reg[35:18],out_reg[15:0]};
+    end else if (RD_DATA_WIDTH == 9) begin
+      assign RD_DATA_CMPL = { 27'h0, out_reg[16], out_reg[7:0]};
+    end else begin
+      assign RD_DATA_CMPL = {18'h0, out_reg[17:0]};
+    end
+  endgenerate
+  
+  case (RD_DATA_WIDTH)
+	8, 9: begin
+		case (WR_DATA_WIDTH)
+			8, 9: begin
+				defparam U1.MODE_BITS = { 1'b0,
+					11'd10, 11'd10, 4'd0, MODE_9, MODE_9, MODE_9, MODE_9, 1'd0,
+					UPAF_DBITS, UPAE_DBITS, 4'h1, MODE_9, MODE_9, MODE_9, MODE_9, 1'b0
+				};
+        
+            (* is_fifo = 1 *)
+            (* sync_fifo = 0 *)
+            (* rd_data_width = RD_DATA_WIDTH *) 
+            (* wr_data_width = WR_DATA_WIDTH *)
+            TDP36K U1 (
+              .RESET_ni(1'b1),
+              .WDATA_A1_i(in_reg[17:0]),
+              .WDATA_A2_i(in_reg[35:18]),
+              .RDATA_A1_o(fifo_flags),
+              .RDATA_A2_o(),
+              .ADDR_A1_i(14'h0),
+              .ADDR_A2_i(14'h0),
+              .CLK_A1_i(Push_Clk),
+              .CLK_A2_i(1'b0),
+              .REN_A1_i(1'b1),
+              .REN_A2_i(1'b0),
+              .WEN_A1_i(PUSH),
+              .WEN_A2_i(1'b0),
+              .BE_A1_i(2'b11),
+              .BE_A2_i(2'b11),
+          
+              .WDATA_B1_i(18'h0),
+              .WDATA_B2_i(18'h0),
+              .RDATA_B1_o(out_reg[17:0]),
+              .RDATA_B2_o(out_reg[35:18]),
+              .ADDR_B1_i(14'h0),
+              .ADDR_B2_i(14'h0),
+              .CLK_B1_i(Pop_Clk),
+              .CLK_B2_i(1'b0),
+              .REN_B1_i(POP),
+              .REN_B2_i(1'b0),
+              .WEN_B1_i(1'b0),
+              .WEN_B2_i(1'b0),
+              .BE_B1_i(2'b11),
+              .BE_B2_i(2'b11),
+          
+              .FLUSH1_i(Async_Flush),
+              .FLUSH2_i(1'b0)
+            );
+  
+			end
+			16, 18: begin
+				defparam U1.MODE_BITS = { 1'b0,
+					11'd10, 11'd10, 4'd0, MODE_9, MODE_18, MODE_9, MODE_18, 1'd0,
+					UPAF_DBITS, UPAE_DBITS, 4'h1, MODE_9, MODE_18, MODE_9, MODE_18, 1'b0
+				};
+        
+            (* is_fifo = 1 *)
+            (* sync_fifo = 0 *)
+            (* rd_data_width = RD_DATA_WIDTH *) 
+            (* wr_data_width = WR_DATA_WIDTH *)
+            TDP36K U1 (
+              .RESET_ni(1'b1),
+              .WDATA_A1_i(in_reg[17:0]),
+              .WDATA_A2_i(in_reg[35:18]),
+              .RDATA_A1_o(fifo_flags),
+              .RDATA_A2_o(),
+              .ADDR_A1_i(14'h0),
+              .ADDR_A2_i(14'h0),
+              .CLK_A1_i(Push_Clk),
+              .CLK_A2_i(1'b0),
+              .REN_A1_i(1'b1),
+              .REN_A2_i(1'b0),
+              .WEN_A1_i(PUSH),
+              .WEN_A2_i(1'b0),
+              .BE_A1_i(2'b11),
+              .BE_A2_i(2'b11),
+          
+              .WDATA_B1_i(18'h0),
+              .WDATA_B2_i(18'h0),
+              .RDATA_B1_o(out_reg[17:0]),
+              .RDATA_B2_o(out_reg[35:18]),
+              .ADDR_B1_i(14'h0),
+              .ADDR_B2_i(14'h0),
+              .CLK_B1_i(Pop_Clk),
+              .CLK_B2_i(1'b0),
+              .REN_B1_i(POP),
+              .REN_B2_i(1'b0),
+              .WEN_B1_i(1'b0),
+              .WEN_B2_i(1'b0),
+              .BE_B1_i(2'b11),
+              .BE_B2_i(2'b11),
+          
+              .FLUSH1_i(Async_Flush),
+              .FLUSH2_i(1'b0)
+            );
+  
+			end
+			32, 36: begin
+				defparam U1.MODE_BITS = { 1'b0,
+					11'd10, 11'd10, 4'd0, MODE_9, MODE_36, MODE_9, MODE_36, 1'd0,
+					UPAF_DBITS, UPAE_DBITS, 4'h1, MODE_9, MODE_36, MODE_9, MODE_36, 1'b0
+				};
+        
+            (* is_fifo = 1 *)
+            (* sync_fifo = 0 *)
+            (* rd_data_width = RD_DATA_WIDTH *) 
+            (* wr_data_width = WR_DATA_WIDTH *)
+            TDP36K U1 (
+              .RESET_ni(1'b1),
+              .WDATA_A1_i(in_reg[17:0]),
+              .WDATA_A2_i(in_reg[35:18]),
+              .RDATA_A1_o(fifo_flags),
+              .RDATA_A2_o(),
+              .ADDR_A1_i(14'h0),
+              .ADDR_A2_i(14'h0),
+              .CLK_A1_i(Push_Clk),
+              .CLK_A2_i(1'b0),
+              .REN_A1_i(1'b1),
+              .REN_A2_i(1'b0),
+              .WEN_A1_i(PUSH),
+              .WEN_A2_i(1'b0),
+              .BE_A1_i(2'b11),
+              .BE_A2_i(2'b11),
+          
+              .WDATA_B1_i(18'h0),
+              .WDATA_B2_i(18'h0),
+              .RDATA_B1_o(out_reg[17:0]),
+              .RDATA_B2_o(out_reg[35:18]),
+              .ADDR_B1_i(14'h0),
+              .ADDR_B2_i(14'h0),
+              .CLK_B1_i(Pop_Clk),
+              .CLK_B2_i(1'b0),
+              .REN_B1_i(POP),
+              .REN_B2_i(1'b0),
+              .WEN_B1_i(1'b0),
+              .WEN_B2_i(1'b0),
+              .BE_B1_i(2'b11),
+              .BE_B2_i(2'b11),
+          
+              .FLUSH1_i(Async_Flush),
+              .FLUSH2_i(1'b0)
+            );
+  
+			end
+			default: begin
+				defparam U1.MODE_BITS = { 1'b0,
+					11'd10, 11'd10, 4'd0, MODE_9, MODE_9, MODE_9, MODE_9, 1'd0,
+					UPAF_DBITS, UPAE_DBITS, 4'h1, MODE_9, MODE_9, MODE_9, MODE_9, 1'b0
+				};
+        
+            (* is_fifo = 1 *)
+            (* sync_fifo = 0 *)
+            (* rd_data_width = RD_DATA_WIDTH *) 
+            (* wr_data_width = WR_DATA_WIDTH *)
+            TDP36K U1 (
+              .RESET_ni(1'b1),
+              .WDATA_A1_i(in_reg[17:0]),
+              .WDATA_A2_i(in_reg[35:18]),
+              .RDATA_A1_o(fifo_flags),
+              .RDATA_A2_o(),
+              .ADDR_A1_i(14'h0),
+              .ADDR_A2_i(14'h0),
+              .CLK_A1_i(Push_Clk),
+              .CLK_A2_i(1'b0),
+              .REN_A1_i(1'b1),
+              .REN_A2_i(1'b0),
+              .WEN_A1_i(PUSH),
+              .WEN_A2_i(1'b0),
+              .BE_A1_i(2'b11),
+              .BE_A2_i(2'b11),
+          
+              .WDATA_B1_i(18'h0),
+              .WDATA_B2_i(18'h0),
+              .RDATA_B1_o(out_reg[17:0]),
+              .RDATA_B2_o(out_reg[35:18]),
+              .ADDR_B1_i(14'h0),
+              .ADDR_B2_i(14'h0),
+              .CLK_B1_i(Pop_Clk),
+              .CLK_B2_i(1'b0),
+              .REN_B1_i(POP),
+              .REN_B2_i(1'b0),
+              .WEN_B1_i(1'b0),
+              .WEN_B2_i(1'b0),
+              .BE_B1_i(2'b11),
+              .BE_B2_i(2'b11),
+          
+              .FLUSH1_i(Async_Flush),
+              .FLUSH2_i(1'b0)
+            );
+  
+			end
+		endcase
+	end
+	16, 18: begin
+		case (WR_DATA_WIDTH)
+			8, 9: begin
+				defparam U1.MODE_BITS = { 1'b0,
+					11'd10, 11'd10, 4'd0, MODE_18, MODE_9, MODE_18, MODE_9, 1'd0,
+					UPAF_DBITS, UPAE_DBITS, 4'h1, MODE_18, MODE_9, MODE_18, MODE_9, 1'b0
+				};
+        
+            (* is_fifo = 1 *)
+            (* sync_fifo = 0 *)
+            (* rd_data_width = RD_DATA_WIDTH *) 
+            (* wr_data_width = WR_DATA_WIDTH *)
+            TDP36K U1 (
+              .RESET_ni(1'b1),
+              .WDATA_A1_i(in_reg[17:0]),
+              .WDATA_A2_i(in_reg[35:18]),
+              .RDATA_A1_o(fifo_flags),
+              .RDATA_A2_o(),
+              .ADDR_A1_i(14'h0),
+              .ADDR_A2_i(14'h0),
+              .CLK_A1_i(Push_Clk),
+              .CLK_A2_i(1'b0),
+              .REN_A1_i(1'b1),
+              .REN_A2_i(1'b0),
+              .WEN_A1_i(PUSH),
+              .WEN_A2_i(1'b0),
+              .BE_A1_i(2'b11),
+              .BE_A2_i(2'b11),
+          
+              .WDATA_B1_i(18'h0),
+              .WDATA_B2_i(18'h0),
+              .RDATA_B1_o(out_reg[17:0]),
+              .RDATA_B2_o(out_reg[35:18]),
+              .ADDR_B1_i(14'h0),
+              .ADDR_B2_i(14'h0),
+              .CLK_B1_i(Pop_Clk),
+              .CLK_B2_i(1'b0),
+              .REN_B1_i(POP),
+              .REN_B2_i(1'b0),
+              .WEN_B1_i(1'b0),
+              .WEN_B2_i(1'b0),
+              .BE_B1_i(2'b11),
+              .BE_B2_i(2'b11),
+          
+              .FLUSH1_i(Async_Flush),
+              .FLUSH2_i(1'b0)
+            );
+  
+			end
+			16, 18: begin
+				defparam U1.MODE_BITS = { 1'b0,
+					11'd10, 11'd10, 4'd0, MODE_18, MODE_18, MODE_18, MODE_18, 1'd0,
+					UPAF_DBITS, UPAE_DBITS, 4'h1, MODE_18, MODE_18, MODE_18, MODE_18, 1'b0
+				};
+        
+            (* is_fifo = 1 *)
+            (* sync_fifo = 0 *)
+            (* rd_data_width = RD_DATA_WIDTH *) 
+            (* wr_data_width = WR_DATA_WIDTH *)
+            TDP36K U1 (
+              .RESET_ni(1'b1),
+              .WDATA_A1_i(in_reg[17:0]),
+              .WDATA_A2_i(in_reg[35:18]),
+              .RDATA_A1_o(fifo_flags),
+              .RDATA_A2_o(),
+              .ADDR_A1_i(14'h0),
+              .ADDR_A2_i(14'h0),
+              .CLK_A1_i(Push_Clk),
+              .CLK_A2_i(1'b0),
+              .REN_A1_i(1'b1),
+              .REN_A2_i(1'b0),
+              .WEN_A1_i(PUSH),
+              .WEN_A2_i(1'b0),
+              .BE_A1_i(2'b11),
+              .BE_A2_i(2'b11),
+          
+              .WDATA_B1_i(18'h0),
+              .WDATA_B2_i(18'h0),
+              .RDATA_B1_o(out_reg[17:0]),
+              .RDATA_B2_o(out_reg[35:18]),
+              .ADDR_B1_i(14'h0),
+              .ADDR_B2_i(14'h0),
+              .CLK_B1_i(Pop_Clk),
+              .CLK_B2_i(1'b0),
+              .REN_B1_i(POP),
+              .REN_B2_i(1'b0),
+              .WEN_B1_i(1'b0),
+              .WEN_B2_i(1'b0),
+              .BE_B1_i(2'b11),
+              .BE_B2_i(2'b11),
+          
+              .FLUSH1_i(Async_Flush),
+              .FLUSH2_i(1'b0)
+            );
+  
+			end
+			32, 36: begin
+				defparam U1.MODE_BITS = { 1'b0,
+					11'd10, 11'd10, 4'd0, MODE_18, MODE_36, MODE_18, MODE_36, 1'd0,
+					UPAF_DBITS, UPAE_DBITS, 4'h1, MODE_18, MODE_36, MODE_18, MODE_36, 1'b0
+				};
+        
+            (* is_fifo = 1 *)
+            (* sync_fifo = 0 *)
+            (* rd_data_width = RD_DATA_WIDTH *) 
+            (* wr_data_width = WR_DATA_WIDTH *)
+            TDP36K U1 (
+              .RESET_ni(1'b1),
+              .WDATA_A1_i(in_reg[17:0]),
+              .WDATA_A2_i(in_reg[35:18]),
+              .RDATA_A1_o(fifo_flags),
+              .RDATA_A2_o(),
+              .ADDR_A1_i(14'h0),
+              .ADDR_A2_i(14'h0),
+              .CLK_A1_i(Push_Clk),
+              .CLK_A2_i(1'b0),
+              .REN_A1_i(1'b1),
+              .REN_A2_i(1'b0),
+              .WEN_A1_i(PUSH),
+              .WEN_A2_i(1'b0),
+              .BE_A1_i(2'b11),
+              .BE_A2_i(2'b11),
+          
+              .WDATA_B1_i(18'h0),
+              .WDATA_B2_i(18'h0),
+              .RDATA_B1_o(out_reg[17:0]),
+              .RDATA_B2_o(out_reg[35:18]),
+              .ADDR_B1_i(14'h0),
+              .ADDR_B2_i(14'h0),
+              .CLK_B1_i(Pop_Clk),
+              .CLK_B2_i(1'b0),
+              .REN_B1_i(POP),
+              .REN_B2_i(1'b0),
+              .WEN_B1_i(1'b0),
+              .WEN_B2_i(1'b0),
+              .BE_B1_i(2'b11),
+              .BE_B2_i(2'b11),
+          
+              .FLUSH1_i(Async_Flush),
+              .FLUSH2_i(1'b0)
+            );
+  
+			end
+			default: begin
+				defparam U1.MODE_BITS = { 1'b0,
+					11'd10, 11'd10, 4'd0, MODE_18, MODE_18, MODE_18, MODE_18, 1'd0,
+					UPAF_DBITS, UPAE_DBITS, 4'h1, MODE_18, MODE_18, MODE_18, MODE_18, 1'b0
+				};
+        
+            (* is_fifo = 1 *)
+            (* sync_fifo = 0 *)
+            (* rd_data_width = RD_DATA_WIDTH *) 
+            (* wr_data_width = WR_DATA_WIDTH *)
+            TDP36K U1 (
+              .RESET_ni(1'b1),
+              .WDATA_A1_i(in_reg[17:0]),
+              .WDATA_A2_i(in_reg[35:18]),
+              .RDATA_A1_o(fifo_flags),
+              .RDATA_A2_o(),
+              .ADDR_A1_i(14'h0),
+              .ADDR_A2_i(14'h0),
+              .CLK_A1_i(Push_Clk),
+              .CLK_A2_i(1'b0),
+              .REN_A1_i(1'b1),
+              .REN_A2_i(1'b0),
+              .WEN_A1_i(PUSH),
+              .WEN_A2_i(1'b0),
+              .BE_A1_i(2'b11),
+              .BE_A2_i(2'b11),
+          
+              .WDATA_B1_i(18'h0),
+              .WDATA_B2_i(18'h0),
+              .RDATA_B1_o(out_reg[17:0]),
+              .RDATA_B2_o(out_reg[35:18]),
+              .ADDR_B1_i(14'h0),
+              .ADDR_B2_i(14'h0),
+              .CLK_B1_i(Pop_Clk),
+              .CLK_B2_i(1'b0),
+              .REN_B1_i(POP),
+              .REN_B2_i(1'b0),
+              .WEN_B1_i(1'b0),
+              .WEN_B2_i(1'b0),
+              .BE_B1_i(2'b11),
+              .BE_B2_i(2'b11),
+          
+              .FLUSH1_i(Async_Flush),
+              .FLUSH2_i(1'b0)
+            );
+  
+			end
+		endcase
+	end
+	32, 36: begin
+		case (WR_DATA_WIDTH)
+			8, 9: begin
+				defparam U1.MODE_BITS = { 1'b0,
+					11'd10, 11'd10, 4'd0, MODE_36, MODE_9, MODE_36, MODE_9, 1'd0,
+					UPAF_DBITS, UPAE_DBITS, 4'h1, MODE_36, MODE_9, MODE_36, MODE_9, 1'b0
+				};
+        
+            (* is_fifo = 1 *)
+            (* sync_fifo = 0 *)
+            (* rd_data_width = RD_DATA_WIDTH *) 
+            (* wr_data_width = WR_DATA_WIDTH *)
+            TDP36K U1 (
+              .RESET_ni(1'b1),
+              .WDATA_A1_i(in_reg[17:0]),
+              .WDATA_A2_i(in_reg[35:18]),
+              .RDATA_A1_o(fifo_flags),
+              .RDATA_A2_o(),
+              .ADDR_A1_i(14'h0),
+              .ADDR_A2_i(14'h0),
+              .CLK_A1_i(Push_Clk),
+              .CLK_A2_i(1'b0),
+              .REN_A1_i(1'b1),
+              .REN_A2_i(1'b0),
+              .WEN_A1_i(PUSH),
+              .WEN_A2_i(1'b0),
+              .BE_A1_i(2'b11),
+              .BE_A2_i(2'b11),
+          
+              .WDATA_B1_i(18'h0),
+              .WDATA_B2_i(18'h0),
+              .RDATA_B1_o(out_reg[17:0]),
+              .RDATA_B2_o(out_reg[35:18]),
+              .ADDR_B1_i(14'h0),
+              .ADDR_B2_i(14'h0),
+              .CLK_B1_i(Pop_Clk),
+              .CLK_B2_i(1'b0),
+              .REN_B1_i(POP),
+              .REN_B2_i(1'b0),
+              .WEN_B1_i(1'b0),
+              .WEN_B2_i(1'b0),
+              .BE_B1_i(2'b11),
+              .BE_B2_i(2'b11),
+          
+              .FLUSH1_i(Async_Flush),
+              .FLUSH2_i(1'b0)
+            );
+  
+			end
+			16, 18: begin
+				defparam U1.MODE_BITS = { 1'b0,
+					11'd10, 11'd10, 4'd0, MODE_36, MODE_18, MODE_36, MODE_18, 1'd0,
+					UPAF_DBITS, UPAE_DBITS, 4'h1, MODE_36, MODE_18, MODE_36, MODE_18, 1'b0
+				};
+        
+            (* is_fifo = 1 *)
+            (* sync_fifo = 0 *)
+            (* rd_data_width = RD_DATA_WIDTH *) 
+            (* wr_data_width = WR_DATA_WIDTH *)
+            TDP36K U1 (
+              .RESET_ni(1'b1),
+              .WDATA_A1_i(in_reg[17:0]),
+              .WDATA_A2_i(in_reg[35:18]),
+              .RDATA_A1_o(fifo_flags),
+              .RDATA_A2_o(),
+              .ADDR_A1_i(14'h0),
+              .ADDR_A2_i(14'h0),
+              .CLK_A1_i(Push_Clk),
+              .CLK_A2_i(1'b0),
+              .REN_A1_i(1'b1),
+              .REN_A2_i(1'b0),
+              .WEN_A1_i(PUSH),
+              .WEN_A2_i(1'b0),
+              .BE_A1_i(2'b11),
+              .BE_A2_i(2'b11),
+          
+              .WDATA_B1_i(18'h0),
+              .WDATA_B2_i(18'h0),
+              .RDATA_B1_o(out_reg[17:0]),
+              .RDATA_B2_o(out_reg[35:18]),
+              .ADDR_B1_i(14'h0),
+              .ADDR_B2_i(14'h0),
+              .CLK_B1_i(Pop_Clk),
+              .CLK_B2_i(1'b0),
+              .REN_B1_i(POP),
+              .REN_B2_i(1'b0),
+              .WEN_B1_i(1'b0),
+              .WEN_B2_i(1'b0),
+              .BE_B1_i(2'b11),
+              .BE_B2_i(2'b11),
+          
+              .FLUSH1_i(Async_Flush),
+              .FLUSH2_i(1'b0)
+            );
+  
+			end
+			32, 36: begin
+				defparam U1.MODE_BITS = { 1'b0,
+					11'd10, 11'd10, 4'd0, MODE_36, MODE_36, MODE_36, MODE_36, 1'd0,
+					UPAF_DBITS, UPAE_DBITS, 4'h1, MODE_36, MODE_36, MODE_36, MODE_36, 1'b0
+				};
+        
+            (* is_fifo = 1 *)
+            (* sync_fifo = 0 *)
+            (* rd_data_width = RD_DATA_WIDTH *) 
+            (* wr_data_width = WR_DATA_WIDTH *)
+            TDP36K U1 (
+              .RESET_ni(1'b1),
+              .WDATA_A1_i(in_reg[17:0]),
+              .WDATA_A2_i(in_reg[35:18]),
+              .RDATA_A1_o(fifo_flags),
+              .RDATA_A2_o(),
+              .ADDR_A1_i(14'h0),
+              .ADDR_A2_i(14'h0),
+              .CLK_A1_i(Push_Clk),
+              .CLK_A2_i(1'b0),
+              .REN_A1_i(1'b1),
+              .REN_A2_i(1'b0),
+              .WEN_A1_i(PUSH),
+              .WEN_A2_i(1'b0),
+              .BE_A1_i(2'b11),
+              .BE_A2_i(2'b11),
+          
+              .WDATA_B1_i(18'h0),
+              .WDATA_B2_i(18'h0),
+              .RDATA_B1_o(out_reg[17:0]),
+              .RDATA_B2_o(out_reg[35:18]),
+              .ADDR_B1_i(14'h0),
+              .ADDR_B2_i(14'h0),
+              .CLK_B1_i(Pop_Clk),
+              .CLK_B2_i(1'b0),
+              .REN_B1_i(POP),
+              .REN_B2_i(1'b0),
+              .WEN_B1_i(1'b0),
+              .WEN_B2_i(1'b0),
+              .BE_B1_i(2'b11),
+              .BE_B2_i(2'b11),
+          
+              .FLUSH1_i(Async_Flush),
+              .FLUSH2_i(1'b0)
+            );
+  
+			end
+			default: begin
+				defparam U1.MODE_BITS = { 1'b0,
+					11'd10, 11'd10, 4'd0, MODE_36, MODE_36, MODE_36, MODE_36, 1'd0,
+					UPAF_DBITS, UPAE_DBITS, 4'h1, MODE_36, MODE_36, MODE_36, MODE_36, 1'b0
+				};
+        
+            (* is_fifo = 1 *)
+            (* sync_fifo = 0 *)
+            (* rd_data_width = RD_DATA_WIDTH *) 
+            (* wr_data_width = WR_DATA_WIDTH *)
+            TDP36K U1 (
+              .RESET_ni(1'b1),
+              .WDATA_A1_i(in_reg[17:0]),
+              .WDATA_A2_i(in_reg[35:18]),
+              .RDATA_A1_o(fifo_flags),
+              .RDATA_A2_o(),
+              .ADDR_A1_i(14'h0),
+              .ADDR_A2_i(14'h0),
+              .CLK_A1_i(Push_Clk),
+              .CLK_A2_i(1'b0),
+              .REN_A1_i(1'b1),
+              .REN_A2_i(1'b0),
+              .WEN_A1_i(PUSH),
+              .WEN_A2_i(1'b0),
+              .BE_A1_i(2'b11),
+              .BE_A2_i(2'b11),
+          
+              .WDATA_B1_i(18'h0),
+              .WDATA_B2_i(18'h0),
+              .RDATA_B1_o(out_reg[17:0]),
+              .RDATA_B2_o(out_reg[35:18]),
+              .ADDR_B1_i(14'h0),
+              .ADDR_B2_i(14'h0),
+              .CLK_B1_i(Pop_Clk),
+              .CLK_B2_i(1'b0),
+              .REN_B1_i(POP),
+              .REN_B2_i(1'b0),
+              .WEN_B1_i(1'b0),
+              .WEN_B2_i(1'b0),
+              .BE_B1_i(2'b11),
+              .BE_B2_i(2'b11),
+          
+              .FLUSH1_i(Async_Flush),
+              .FLUSH2_i(1'b0)
+            );
+  
+			end
+		endcase
+	end
+	default: begin
+		case (WR_DATA_WIDTH)
+			8, 9: begin
+				defparam U1.MODE_BITS = { 1'b0,
+					11'd10, 11'd10, 4'd0, MODE_9, MODE_9, MODE_9, MODE_9, 1'd0,
+					UPAF_DBITS, UPAE_DBITS, 4'h1, MODE_9, MODE_9, MODE_9, MODE_9, 1'b0
+				};
+        
+            (* is_fifo = 1 *)
+            (* sync_fifo = 0 *)
+            (* rd_data_width = RD_DATA_WIDTH *) 
+            (* wr_data_width = WR_DATA_WIDTH *)
+            TDP36K U1 (
+              .RESET_ni(1'b1),
+              .WDATA_A1_i(in_reg[17:0]),
+              .WDATA_A2_i(in_reg[35:18]),
+              .RDATA_A1_o(fifo_flags),
+              .RDATA_A2_o(),
+              .ADDR_A1_i(14'h0),
+              .ADDR_A2_i(14'h0),
+              .CLK_A1_i(Push_Clk),
+              .CLK_A2_i(1'b0),
+              .REN_A1_i(1'b1),
+              .REN_A2_i(1'b0),
+              .WEN_A1_i(PUSH),
+              .WEN_A2_i(1'b0),
+              .BE_A1_i(2'b11),
+              .BE_A2_i(2'b11),
+          
+              .WDATA_B1_i(18'h0),
+              .WDATA_B2_i(18'h0),
+              .RDATA_B1_o(out_reg[17:0]),
+              .RDATA_B2_o(out_reg[35:18]),
+              .ADDR_B1_i(14'h0),
+              .ADDR_B2_i(14'h0),
+              .CLK_B1_i(Pop_Clk),
+              .CLK_B2_i(1'b0),
+              .REN_B1_i(POP),
+              .REN_B2_i(1'b0),
+              .WEN_B1_i(1'b0),
+              .WEN_B2_i(1'b0),
+              .BE_B1_i(2'b11),
+              .BE_B2_i(2'b11),
+          
+              .FLUSH1_i(Async_Flush),
+              .FLUSH2_i(1'b0)
+            );
+  
+			end
+			16, 18: begin
+				defparam U1.MODE_BITS = { 1'b0,
+					11'd10, 11'd10, 4'd0, MODE_18, MODE_18, MODE_18, MODE_18, 1'd0,
+					UPAF_DBITS, UPAE_DBITS, 4'h1, MODE_18, MODE_18, MODE_18, MODE_18, 1'b0
+				};
+        
+            (* is_fifo = 1 *)
+            (* sync_fifo = 0 *)
+            (* rd_data_width = RD_DATA_WIDTH *) 
+            (* wr_data_width = WR_DATA_WIDTH *)
+            TDP36K U1 (
+              .RESET_ni(1'b1),
+              .WDATA_A1_i(in_reg[17:0]),
+              .WDATA_A2_i(in_reg[35:18]),
+              .RDATA_A1_o(fifo_flags),
+              .RDATA_A2_o(),
+              .ADDR_A1_i(14'h0),
+              .ADDR_A2_i(14'h0),
+              .CLK_A1_i(Push_Clk),
+              .CLK_A2_i(1'b0),
+              .REN_A1_i(1'b1),
+              .REN_A2_i(1'b0),
+              .WEN_A1_i(PUSH),
+              .WEN_A2_i(1'b0),
+              .BE_A1_i(2'b11),
+              .BE_A2_i(2'b11),
+          
+              .WDATA_B1_i(18'h0),
+              .WDATA_B2_i(18'h0),
+              .RDATA_B1_o(out_reg[17:0]),
+              .RDATA_B2_o(out_reg[35:18]),
+              .ADDR_B1_i(14'h0),
+              .ADDR_B2_i(14'h0),
+              .CLK_B1_i(Pop_Clk),
+              .CLK_B2_i(1'b0),
+              .REN_B1_i(POP),
+              .REN_B2_i(1'b0),
+              .WEN_B1_i(1'b0),
+              .WEN_B2_i(1'b0),
+              .BE_B1_i(2'b11),
+              .BE_B2_i(2'b11),
+          
+              .FLUSH1_i(Async_Flush),
+              .FLUSH2_i(1'b0)
+            );
+  
+			end
+			32, 36: begin
+				defparam U1.MODE_BITS = { 1'b0,
+					11'd10, 11'd10, 4'd0, MODE_36, MODE_36, MODE_36, MODE_36, 1'd0,
+					UPAF_DBITS, UPAE_DBITS, 4'h1, MODE_36, MODE_36, MODE_36, MODE_36, 1'b0
+				};
+        
+            (* is_fifo = 1 *)
+            (* sync_fifo = 0 *)
+            (* rd_data_width = RD_DATA_WIDTH *) 
+            (* wr_data_width = WR_DATA_WIDTH *)
+            TDP36K U1 (
+              .RESET_ni(1'b1),
+              .WDATA_A1_i(in_reg[17:0]),
+              .WDATA_A2_i(in_reg[35:18]),
+              .RDATA_A1_o(fifo_flags),
+              .RDATA_A2_o(),
+              .ADDR_A1_i(14'h0),
+              .ADDR_A2_i(14'h0),
+              .CLK_A1_i(Push_Clk),
+              .CLK_A2_i(1'b0),
+              .REN_A1_i(1'b1),
+              .REN_A2_i(1'b0),
+              .WEN_A1_i(PUSH),
+              .WEN_A2_i(1'b0),
+              .BE_A1_i(2'b11),
+              .BE_A2_i(2'b11),
+          
+              .WDATA_B1_i(18'h0),
+              .WDATA_B2_i(18'h0),
+              .RDATA_B1_o(out_reg[17:0]),
+              .RDATA_B2_o(out_reg[35:18]),
+              .ADDR_B1_i(14'h0),
+              .ADDR_B2_i(14'h0),
+              .CLK_B1_i(Pop_Clk),
+              .CLK_B2_i(1'b0),
+              .REN_B1_i(POP),
+              .REN_B2_i(1'b0),
+              .WEN_B1_i(1'b0),
+              .WEN_B2_i(1'b0),
+              .BE_B1_i(2'b11),
+              .BE_B2_i(2'b11),
+          
+              .FLUSH1_i(Async_Flush),
+              .FLUSH2_i(1'b0)
+            );
+  
+			end
+			default: begin
+				defparam U1.MODE_BITS = { 1'b0,
+					11'd10, 11'd10, 4'd0, MODE_36, MODE_36, MODE_36, MODE_36, 1'd0,
+					UPAF_DBITS, UPAE_DBITS, 4'h1, MODE_36, MODE_36, MODE_36, MODE_36, 1'b0
+				};
+        
+            (* is_fifo = 1 *)
+            (* sync_fifo = 0 *)
+            (* rd_data_width = RD_DATA_WIDTH *) 
+            (* wr_data_width = WR_DATA_WIDTH *)
+            TDP36K U1 (
+              .RESET_ni(1'b1),
+              .WDATA_A1_i(in_reg[17:0]),
+              .WDATA_A2_i(in_reg[35:18]),
+              .RDATA_A1_o(fifo_flags),
+              .RDATA_A2_o(),
+              .ADDR_A1_i(14'h0),
+              .ADDR_A2_i(14'h0),
+              .CLK_A1_i(Push_Clk),
+              .CLK_A2_i(1'b0),
+              .REN_A1_i(1'b1),
+              .REN_A2_i(1'b0),
+              .WEN_A1_i(PUSH),
+              .WEN_A2_i(1'b0),
+              .BE_A1_i(2'b11),
+              .BE_A2_i(2'b11),
+          
+              .WDATA_B1_i(18'h0),
+              .WDATA_B2_i(18'h0),
+              .RDATA_B1_o(out_reg[17:0]),
+              .RDATA_B2_o(out_reg[35:18]),
+              .ADDR_B1_i(14'h0),
+              .ADDR_B2_i(14'h0),
+              .CLK_B1_i(Pop_Clk),
+              .CLK_B2_i(1'b0),
+              .REN_B1_i(POP),
+              .REN_B2_i(1'b0),
+              .WEN_B1_i(1'b0),
+              .WEN_B2_i(1'b0),
+              .BE_B1_i(2'b11),
+              .BE_B2_i(2'b11),
+          
+              .FLUSH1_i(Async_Flush),
+              .FLUSH2_i(1'b0)
+            );
+  
+			end
+		endcase
+	end
+ endcase
+
+  assign DOUT[RD_DATA_WIDTH-1 : 0] = RD_DATA_CMPL[RD_DATA_WIDTH-1 : 0];
+
+endmodule  
+
+//===============================================================================
+module TDP36K_FIFO_ASYNC_WR_X9_RD_X9_nonsplit (
+    RESET_ni,
+    WEN_A1_i,   WEN_B1_i,
+    REN_A1_i,   REN_B1_i,
+    CLK_A1_i,   CLK_B1_i,
+    BE_A1_i,    BE_B1_i,
+    ADDR_A1_i,  ADDR_B1_i,
+    WDATA_A1_i, WDATA_B1_i,
+    RDATA_A1_o, RDATA_B1_o,
+    FLUSH1_i,
+    WEN_A2_i,   WEN_B2_i,
+    REN_A2_i,   REN_B2_i,
+    CLK_A2_i,   CLK_B2_i,
+    BE_A2_i,    BE_B2_i,
+    ADDR_A2_i,  ADDR_B2_i,
+    WDATA_A2_i, WDATA_B2_i,
+    RDATA_A2_o, RDATA_B2_o,
+    FLUSH2_i
+);
+    parameter [80:0] MODE_BITS = 81'd0;
+
+    input wire  RESET_ni;
+    input wire  WEN_A1_i, WEN_B1_i;
+    input wire  REN_A1_i, REN_B1_i;
+    input wire  WEN_A2_i, WEN_B2_i;
+    input wire  REN_A2_i, REN_B2_i;
+
+    (* clkbuf_sink *)
+    input wire  CLK_A1_i;
+    (* clkbuf_sink *)
+    input wire  CLK_B1_i;
+    (* clkbuf_sink *)
+    input wire  CLK_A2_i;
+    (* clkbuf_sink *)
+    input wire  CLK_B2_i;
+
+    input wire  [ 1:0] BE_A1_i,    BE_B1_i;
+    input wire  [14:0] ADDR_A1_i,  ADDR_B1_i;
+    input wire  [17:0] WDATA_A1_i, WDATA_B1_i;
+    output wire [17:0] RDATA_A1_o, RDATA_B1_o;
+
+    input wire  FLUSH1_i;
+
+    input wire  [ 1:0] BE_A2_i,    BE_B2_i;
+    input wire  [13:0] ADDR_A2_i,  ADDR_B2_i;
+    input wire  [17:0] WDATA_A2_i, WDATA_B2_i;
+    output wire [17:0] RDATA_A2_o, RDATA_B2_o;
+
+    input wire  FLUSH2_i;
+
+    TDP36K #(.MODE_BITS(MODE_BITS)) bram (
+        .RESET_ni   (RESET_ni),   
+        .WEN_A1_i   (WEN_A1_i),   .WEN_B1_i   (WEN_B1_i),
+        .REN_A1_i   (REN_A1_i),   .REN_B1_i   (REN_B1_i),
+        .CLK_A1_i   (CLK_A1_i),   .CLK_B1_i   (CLK_B1_i),
+        .BE_A1_i    (BE_A1_i),    .BE_B1_i    (BE_B1_i),
+        .ADDR_A1_i  (ADDR_A1_i),  .ADDR_B1_i  (ADDR_B1_i),
+        .WDATA_A1_i (WDATA_A1_i), .WDATA_B1_i (WDATA_B1_i),
+        .RDATA_A1_o (RDATA_A1_o), .RDATA_B1_o (RDATA_B1_o),
+        .FLUSH1_i   (FLUSH1_i),
+        .WEN_A2_i   (WEN_A2_i),   .WEN_B2_i   (WEN_B2_i),
+        .REN_A2_i   (REN_A2_i),   .REN_B2_i   (REN_B2_i),
+        .CLK_A2_i   (CLK_A2_i),   .CLK_B2_i   (CLK_B2_i),
+        .BE_A2_i    (BE_A2_i),    .BE_B2_i    (BE_B2_i),
+        .ADDR_A2_i  (ADDR_A2_i),  .ADDR_B2_i  (ADDR_B2_i),
+        .WDATA_A2_i (WDATA_A2_i), .WDATA_B2_i (WDATA_B2_i),
+        .RDATA_A2_o (RDATA_A2_o), .RDATA_B2_o (RDATA_B2_o),
+        .FLUSH2_i   (FLUSH2_i)
+    );
+    
+`ifdef SDF_SIM
+	specify
+    (FLUSH1_i => RDATA_A1_o[0]) = 0;
+    (FLUSH1_i => RDATA_A1_o[1]) = 0;
+    (FLUSH1_i => RDATA_A1_o[2]) = 0;
+    (FLUSH1_i => RDATA_A1_o[3]) = 0;
+    (FLUSH1_i => RDATA_A1_o[4]) = 0;
+    (FLUSH1_i => RDATA_A1_o[5]) = 0;
+    (FLUSH1_i => RDATA_A1_o[6]) = 0;
+    (FLUSH1_i => RDATA_A1_o[7]) = 0;
+    (FLUSH2_i => RDATA_A2_o[0]) = 0;
+    (FLUSH2_i => RDATA_A2_o[1]) = 0;
+    (FLUSH2_i => RDATA_A2_o[2]) = 0;
+    (FLUSH2_i => RDATA_A2_o[3]) = 0;
+    (FLUSH2_i => RDATA_A2_o[4]) = 0;
+    (FLUSH2_i => RDATA_A2_o[5]) = 0;
+    (FLUSH2_i => RDATA_A2_o[6]) = 0;
+    (FLUSH2_i => RDATA_A2_o[7]) = 0;    
+		(negedge RESET_ni => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+		(negedge RESET_ni => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+		(negedge RESET_ni => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+		(negedge RESET_ni => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+		(posedge CLK_A1_i => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+		(posedge CLK_B1_i => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+		(posedge CLK_A2_i => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+		(posedge CLK_B2_i => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+    $setuphold(posedge CLK_A1_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_A1_i, FLUSH1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, WEN_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, REN_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, BE_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, ADDR_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, WDATA_A1_i, 0, 0);
+    $setuphold(posedge CLK_B1_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_B1_i, WEN_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, REN_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, BE_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, ADDR_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, WDATA_B1_i, 0, 0);
+    $setuphold(posedge CLK_A2_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_A2_i, FLUSH2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, WEN_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, REN_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, BE_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, ADDR_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, WDATA_A2_i, 0, 0);
+    $setuphold(posedge CLK_B2_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_B2_i, WEN_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, REN_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, BE_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, ADDR_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, WDATA_B2_i, 0, 0);
+	endspecify
+`endif
+
+endmodule
+
+module TDP36K_FIFO_ASYNC_WR_X9_RD_X18_nonsplit (
+    RESET_ni,
+    WEN_A1_i,   WEN_B1_i,
+    REN_A1_i,   REN_B1_i,
+    CLK_A1_i,   CLK_B1_i,
+    BE_A1_i,    BE_B1_i,
+    ADDR_A1_i,  ADDR_B1_i,
+    WDATA_A1_i, WDATA_B1_i,
+    RDATA_A1_o, RDATA_B1_o,
+    FLUSH1_i,
+    WEN_A2_i,   WEN_B2_i,
+    REN_A2_i,   REN_B2_i,
+    CLK_A2_i,   CLK_B2_i,
+    BE_A2_i,    BE_B2_i,
+    ADDR_A2_i,  ADDR_B2_i,
+    WDATA_A2_i, WDATA_B2_i,
+    RDATA_A2_o, RDATA_B2_o,
+    FLUSH2_i
+);
+    parameter [80:0] MODE_BITS = 81'd0;
+
+    input wire  RESET_ni;
+    input wire  WEN_A1_i, WEN_B1_i;
+    input wire  REN_A1_i, REN_B1_i;
+    input wire  WEN_A2_i, WEN_B2_i;
+    input wire  REN_A2_i, REN_B2_i;
+
+    (* clkbuf_sink *)
+    input wire  CLK_A1_i;
+    (* clkbuf_sink *)
+    input wire  CLK_B1_i;
+    (* clkbuf_sink *)
+    input wire  CLK_A2_i;
+    (* clkbuf_sink *)
+    input wire  CLK_B2_i;
+
+    input wire  [ 1:0] BE_A1_i,    BE_B1_i;
+    input wire  [14:0] ADDR_A1_i,  ADDR_B1_i;
+    input wire  [17:0] WDATA_A1_i, WDATA_B1_i;
+    output wire [17:0] RDATA_A1_o, RDATA_B1_o;
+
+    input wire  FLUSH1_i;
+
+    input wire  [ 1:0] BE_A2_i,    BE_B2_i;
+    input wire  [13:0] ADDR_A2_i,  ADDR_B2_i;
+    input wire  [17:0] WDATA_A2_i, WDATA_B2_i;
+    output wire [17:0] RDATA_A2_o, RDATA_B2_o;
+
+    input wire  FLUSH2_i;
+
+    TDP36K #(.MODE_BITS(MODE_BITS)) bram (
+        .RESET_ni   (RESET_ni),   
+        .WEN_A1_i   (WEN_A1_i),   .WEN_B1_i   (WEN_B1_i),
+        .REN_A1_i   (REN_A1_i),   .REN_B1_i   (REN_B1_i),
+        .CLK_A1_i   (CLK_A1_i),   .CLK_B1_i   (CLK_B1_i),
+        .BE_A1_i    (BE_A1_i),    .BE_B1_i    (BE_B1_i),
+        .ADDR_A1_i  (ADDR_A1_i),  .ADDR_B1_i  (ADDR_B1_i),
+        .WDATA_A1_i (WDATA_A1_i), .WDATA_B1_i (WDATA_B1_i),
+        .RDATA_A1_o (RDATA_A1_o), .RDATA_B1_o (RDATA_B1_o),
+        .FLUSH1_i   (FLUSH1_i),
+        .WEN_A2_i   (WEN_A2_i),   .WEN_B2_i   (WEN_B2_i),
+        .REN_A2_i   (REN_A2_i),   .REN_B2_i   (REN_B2_i),
+        .CLK_A2_i   (CLK_A2_i),   .CLK_B2_i   (CLK_B2_i),
+        .BE_A2_i    (BE_A2_i),    .BE_B2_i    (BE_B2_i),
+        .ADDR_A2_i  (ADDR_A2_i),  .ADDR_B2_i  (ADDR_B2_i),
+        .WDATA_A2_i (WDATA_A2_i), .WDATA_B2_i (WDATA_B2_i),
+        .RDATA_A2_o (RDATA_A2_o), .RDATA_B2_o (RDATA_B2_o),
+        .FLUSH2_i   (FLUSH2_i)
+    );
+ 
+`ifdef SDF_SIM
+	specify
+    (FLUSH1_i => RDATA_A1_o[0]) = 0;
+    (FLUSH1_i => RDATA_A1_o[1]) = 0;
+    (FLUSH1_i => RDATA_A1_o[2]) = 0;
+    (FLUSH1_i => RDATA_A1_o[3]) = 0;
+    (FLUSH1_i => RDATA_A1_o[4]) = 0;
+    (FLUSH1_i => RDATA_A1_o[5]) = 0;
+    (FLUSH1_i => RDATA_A1_o[6]) = 0;
+    (FLUSH1_i => RDATA_A1_o[7]) = 0;
+    (FLUSH2_i => RDATA_A2_o[0]) = 0;
+    (FLUSH2_i => RDATA_A2_o[1]) = 0;
+    (FLUSH2_i => RDATA_A2_o[2]) = 0;
+    (FLUSH2_i => RDATA_A2_o[3]) = 0;
+    (FLUSH2_i => RDATA_A2_o[4]) = 0;
+    (FLUSH2_i => RDATA_A2_o[5]) = 0;
+    (FLUSH2_i => RDATA_A2_o[6]) = 0;
+    (FLUSH2_i => RDATA_A2_o[7]) = 0;    
+		(negedge RESET_ni => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+		(negedge RESET_ni => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+		(negedge RESET_ni => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+		(negedge RESET_ni => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+		(posedge CLK_A1_i => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+		(posedge CLK_B1_i => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+		(posedge CLK_A2_i => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+		(posedge CLK_B2_i => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+    $setuphold(posedge CLK_A1_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_A1_i, FLUSH1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, WEN_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, REN_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, BE_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, ADDR_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, WDATA_A1_i, 0, 0);
+    $setuphold(posedge CLK_B1_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_B1_i, WEN_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, REN_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, BE_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, ADDR_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, WDATA_B1_i, 0, 0);
+    $setuphold(posedge CLK_A2_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_A2_i, FLUSH2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, WEN_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, REN_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, BE_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, ADDR_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, WDATA_A2_i, 0, 0);
+    $setuphold(posedge CLK_B2_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_B2_i, WEN_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, REN_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, BE_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, ADDR_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, WDATA_B2_i, 0, 0);
+	endspecify
+`endif
+
+endmodule
+
+module TDP36K_FIFO_ASYNC_WR_X9_RD_X36_nonsplit (
+    RESET_ni,
+    WEN_A1_i,   WEN_B1_i,
+    REN_A1_i,   REN_B1_i,
+    CLK_A1_i,   CLK_B1_i,
+    BE_A1_i,    BE_B1_i,
+    ADDR_A1_i,  ADDR_B1_i,
+    WDATA_A1_i, WDATA_B1_i,
+    RDATA_A1_o, RDATA_B1_o,
+    FLUSH1_i,
+    WEN_A2_i,   WEN_B2_i,
+    REN_A2_i,   REN_B2_i,
+    CLK_A2_i,   CLK_B2_i,
+    BE_A2_i,    BE_B2_i,
+    ADDR_A2_i,  ADDR_B2_i,
+    WDATA_A2_i, WDATA_B2_i,
+    RDATA_A2_o, RDATA_B2_o,
+    FLUSH2_i
+);
+    parameter [80:0] MODE_BITS = 81'd0;
+
+    input wire  RESET_ni;
+    input wire  WEN_A1_i, WEN_B1_i;
+    input wire  REN_A1_i, REN_B1_i;
+    input wire  WEN_A2_i, WEN_B2_i;
+    input wire  REN_A2_i, REN_B2_i;
+
+    (* clkbuf_sink *)
+    input wire  CLK_A1_i;
+    (* clkbuf_sink *)
+    input wire  CLK_B1_i;
+    (* clkbuf_sink *)
+    input wire  CLK_A2_i;
+    (* clkbuf_sink *)
+    input wire  CLK_B2_i;
+
+    input wire  [ 1:0] BE_A1_i,    BE_B1_i;
+    input wire  [14:0] ADDR_A1_i,  ADDR_B1_i;
+    input wire  [17:0] WDATA_A1_i, WDATA_B1_i;
+    output wire [17:0] RDATA_A1_o, RDATA_B1_o;
+
+    input wire  FLUSH1_i;
+
+    input wire  [ 1:0] BE_A2_i,    BE_B2_i;
+    input wire  [13:0] ADDR_A2_i,  ADDR_B2_i;
+    input wire  [17:0] WDATA_A2_i, WDATA_B2_i;
+    output wire [17:0] RDATA_A2_o, RDATA_B2_o;
+
+    input wire  FLUSH2_i;
+
+    TDP36K #(.MODE_BITS(MODE_BITS)) bram (
+        .RESET_ni   (RESET_ni),   
+        .WEN_A1_i   (WEN_A1_i),   .WEN_B1_i   (WEN_B1_i),
+        .REN_A1_i   (REN_A1_i),   .REN_B1_i   (REN_B1_i),
+        .CLK_A1_i   (CLK_A1_i),   .CLK_B1_i   (CLK_B1_i),
+        .BE_A1_i    (BE_A1_i),    .BE_B1_i    (BE_B1_i),
+        .ADDR_A1_i  (ADDR_A1_i),  .ADDR_B1_i  (ADDR_B1_i),
+        .WDATA_A1_i (WDATA_A1_i), .WDATA_B1_i (WDATA_B1_i),
+        .RDATA_A1_o (RDATA_A1_o), .RDATA_B1_o (RDATA_B1_o),
+        .FLUSH1_i   (FLUSH1_i),
+        .WEN_A2_i   (WEN_A2_i),   .WEN_B2_i   (WEN_B2_i),
+        .REN_A2_i   (REN_A2_i),   .REN_B2_i   (REN_B2_i),
+        .CLK_A2_i   (CLK_A2_i),   .CLK_B2_i   (CLK_B2_i),
+        .BE_A2_i    (BE_A2_i),    .BE_B2_i    (BE_B2_i),
+        .ADDR_A2_i  (ADDR_A2_i),  .ADDR_B2_i  (ADDR_B2_i),
+        .WDATA_A2_i (WDATA_A2_i), .WDATA_B2_i (WDATA_B2_i),
+        .RDATA_A2_o (RDATA_A2_o), .RDATA_B2_o (RDATA_B2_o),
+        .FLUSH2_i   (FLUSH2_i)
+    );
+    
+`ifdef SDF_SIM
+	specify
+    (FLUSH1_i => RDATA_A1_o[0]) = 0;
+    (FLUSH1_i => RDATA_A1_o[1]) = 0;
+    (FLUSH1_i => RDATA_A1_o[2]) = 0;
+    (FLUSH1_i => RDATA_A1_o[3]) = 0;
+    (FLUSH1_i => RDATA_A1_o[4]) = 0;
+    (FLUSH1_i => RDATA_A1_o[5]) = 0;
+    (FLUSH1_i => RDATA_A1_o[6]) = 0;
+    (FLUSH1_i => RDATA_A1_o[7]) = 0;
+    (FLUSH2_i => RDATA_A2_o[0]) = 0;
+    (FLUSH2_i => RDATA_A2_o[1]) = 0;
+    (FLUSH2_i => RDATA_A2_o[2]) = 0;
+    (FLUSH2_i => RDATA_A2_o[3]) = 0;
+    (FLUSH2_i => RDATA_A2_o[4]) = 0;
+    (FLUSH2_i => RDATA_A2_o[5]) = 0;
+    (FLUSH2_i => RDATA_A2_o[6]) = 0;
+    (FLUSH2_i => RDATA_A2_o[7]) = 0;    
+		(negedge RESET_ni => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+		(negedge RESET_ni => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+		(negedge RESET_ni => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+		(negedge RESET_ni => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+		(posedge CLK_A1_i => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+		(posedge CLK_B1_i => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+		(posedge CLK_A2_i => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+		(posedge CLK_B2_i => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+    $setuphold(posedge CLK_A1_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_A1_i, FLUSH1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, WEN_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, REN_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, BE_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, ADDR_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, WDATA_A1_i, 0, 0);
+    $setuphold(posedge CLK_B1_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_B1_i, WEN_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, REN_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, BE_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, ADDR_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, WDATA_B1_i, 0, 0);
+    $setuphold(posedge CLK_A2_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_A2_i, FLUSH2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, WEN_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, REN_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, BE_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, ADDR_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, WDATA_A2_i, 0, 0);
+    $setuphold(posedge CLK_B2_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_B2_i, WEN_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, REN_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, BE_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, ADDR_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, WDATA_B2_i, 0, 0);
+	endspecify
+`endif
+
+endmodule
+
+module TDP36K_FIFO_ASYNC_WR_X18_RD_X9_nonsplit (
+    RESET_ni,
+    WEN_A1_i,   WEN_B1_i,
+    REN_A1_i,   REN_B1_i,
+    CLK_A1_i,   CLK_B1_i,
+    BE_A1_i,    BE_B1_i,
+    ADDR_A1_i,  ADDR_B1_i,
+    WDATA_A1_i, WDATA_B1_i,
+    RDATA_A1_o, RDATA_B1_o,
+    FLUSH1_i,
+    WEN_A2_i,   WEN_B2_i,
+    REN_A2_i,   REN_B2_i,
+    CLK_A2_i,   CLK_B2_i,
+    BE_A2_i,    BE_B2_i,
+    ADDR_A2_i,  ADDR_B2_i,
+    WDATA_A2_i, WDATA_B2_i,
+    RDATA_A2_o, RDATA_B2_o,
+    FLUSH2_i
+);
+    parameter [80:0] MODE_BITS = 81'd0;
+
+    input wire  RESET_ni;
+    input wire  WEN_A1_i, WEN_B1_i;
+    input wire  REN_A1_i, REN_B1_i;
+    input wire  WEN_A2_i, WEN_B2_i;
+    input wire  REN_A2_i, REN_B2_i;
+
+    (* clkbuf_sink *)
+    input wire  CLK_A1_i;
+    (* clkbuf_sink *)
+    input wire  CLK_B1_i;
+    (* clkbuf_sink *)
+    input wire  CLK_A2_i;
+    (* clkbuf_sink *)
+    input wire  CLK_B2_i;
+
+    input wire  [ 1:0] BE_A1_i,    BE_B1_i;
+    input wire  [14:0] ADDR_A1_i,  ADDR_B1_i;
+    input wire  [17:0] WDATA_A1_i, WDATA_B1_i;
+    output wire [17:0] RDATA_A1_o, RDATA_B1_o;
+
+    input wire  FLUSH1_i;
+
+    input wire  [ 1:0] BE_A2_i,    BE_B2_i;
+    input wire  [13:0] ADDR_A2_i,  ADDR_B2_i;
+    input wire  [17:0] WDATA_A2_i, WDATA_B2_i;
+    output wire [17:0] RDATA_A2_o, RDATA_B2_o;
+
+    input wire  FLUSH2_i;
+
+    TDP36K #(.MODE_BITS(MODE_BITS)) bram (
+        .RESET_ni   (RESET_ni),   
+        .WEN_A1_i   (WEN_A1_i),   .WEN_B1_i   (WEN_B1_i),
+        .REN_A1_i   (REN_A1_i),   .REN_B1_i   (REN_B1_i),
+        .CLK_A1_i   (CLK_A1_i),   .CLK_B1_i   (CLK_B1_i),
+        .BE_A1_i    (BE_A1_i),    .BE_B1_i    (BE_B1_i),
+        .ADDR_A1_i  (ADDR_A1_i),  .ADDR_B1_i  (ADDR_B1_i),
+        .WDATA_A1_i (WDATA_A1_i), .WDATA_B1_i (WDATA_B1_i),
+        .RDATA_A1_o (RDATA_A1_o), .RDATA_B1_o (RDATA_B1_o),
+        .FLUSH1_i   (FLUSH1_i),
+        .WEN_A2_i   (WEN_A2_i),   .WEN_B2_i   (WEN_B2_i),
+        .REN_A2_i   (REN_A2_i),   .REN_B2_i   (REN_B2_i),
+        .CLK_A2_i   (CLK_A2_i),   .CLK_B2_i   (CLK_B2_i),
+        .BE_A2_i    (BE_A2_i),    .BE_B2_i    (BE_B2_i),
+        .ADDR_A2_i  (ADDR_A2_i),  .ADDR_B2_i  (ADDR_B2_i),
+        .WDATA_A2_i (WDATA_A2_i), .WDATA_B2_i (WDATA_B2_i),
+        .RDATA_A2_o (RDATA_A2_o), .RDATA_B2_o (RDATA_B2_o),
+        .FLUSH2_i   (FLUSH2_i)
+    );
+    
+`ifdef SDF_SIM
+	specify
+    (FLUSH1_i => RDATA_A1_o[0]) = 0;
+    (FLUSH1_i => RDATA_A1_o[1]) = 0;
+    (FLUSH1_i => RDATA_A1_o[2]) = 0;
+    (FLUSH1_i => RDATA_A1_o[3]) = 0;
+    (FLUSH1_i => RDATA_A1_o[4]) = 0;
+    (FLUSH1_i => RDATA_A1_o[5]) = 0;
+    (FLUSH1_i => RDATA_A1_o[6]) = 0;
+    (FLUSH1_i => RDATA_A1_o[7]) = 0;
+    (FLUSH2_i => RDATA_A2_o[0]) = 0;
+    (FLUSH2_i => RDATA_A2_o[1]) = 0;
+    (FLUSH2_i => RDATA_A2_o[2]) = 0;
+    (FLUSH2_i => RDATA_A2_o[3]) = 0;
+    (FLUSH2_i => RDATA_A2_o[4]) = 0;
+    (FLUSH2_i => RDATA_A2_o[5]) = 0;
+    (FLUSH2_i => RDATA_A2_o[6]) = 0;
+    (FLUSH2_i => RDATA_A2_o[7]) = 0;    
+		(negedge RESET_ni => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+		(negedge RESET_ni => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+		(negedge RESET_ni => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+		(negedge RESET_ni => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+		(posedge CLK_A1_i => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+		(posedge CLK_B1_i => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+		(posedge CLK_A2_i => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+		(posedge CLK_B2_i => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+    $setuphold(posedge CLK_A1_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_A1_i, FLUSH1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, WEN_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, REN_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, BE_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, ADDR_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, WDATA_A1_i, 0, 0);
+    $setuphold(posedge CLK_B1_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_B1_i, WEN_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, REN_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, BE_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, ADDR_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, WDATA_B1_i, 0, 0);
+    $setuphold(posedge CLK_A2_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_A2_i, FLUSH2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, WEN_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, REN_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, BE_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, ADDR_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, WDATA_A2_i, 0, 0);
+    $setuphold(posedge CLK_B2_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_B2_i, WEN_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, REN_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, BE_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, ADDR_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, WDATA_B2_i, 0, 0);
+	endspecify
+`endif
+
+endmodule
+
+module TDP36K_FIFO_ASYNC_WR_X18_RD_X18_nonsplit (
+    RESET_ni,
+    WEN_A1_i,   WEN_B1_i,
+    REN_A1_i,   REN_B1_i,
+    CLK_A1_i,   CLK_B1_i,
+    BE_A1_i,    BE_B1_i,
+    ADDR_A1_i,  ADDR_B1_i,
+    WDATA_A1_i, WDATA_B1_i,
+    RDATA_A1_o, RDATA_B1_o,
+    FLUSH1_i,
+    WEN_A2_i,   WEN_B2_i,
+    REN_A2_i,   REN_B2_i,
+    CLK_A2_i,   CLK_B2_i,
+    BE_A2_i,    BE_B2_i,
+    ADDR_A2_i,  ADDR_B2_i,
+    WDATA_A2_i, WDATA_B2_i,
+    RDATA_A2_o, RDATA_B2_o,
+    FLUSH2_i
+);
+    parameter [80:0] MODE_BITS = 81'd0;
+
+    input wire  RESET_ni;
+    input wire  WEN_A1_i, WEN_B1_i;
+    input wire  REN_A1_i, REN_B1_i;
+    input wire  WEN_A2_i, WEN_B2_i;
+    input wire  REN_A2_i, REN_B2_i;
+
+    (* clkbuf_sink *)
+    input wire  CLK_A1_i;
+    (* clkbuf_sink *)
+    input wire  CLK_B1_i;
+    (* clkbuf_sink *)
+    input wire  CLK_A2_i;
+    (* clkbuf_sink *)
+    input wire  CLK_B2_i;
+
+    input wire  [ 1:0] BE_A1_i,    BE_B1_i;
+    input wire  [14:0] ADDR_A1_i,  ADDR_B1_i;
+    input wire  [17:0] WDATA_A1_i, WDATA_B1_i;
+    output wire [17:0] RDATA_A1_o, RDATA_B1_o;
+
+    input wire  FLUSH1_i;
+
+    input wire  [ 1:0] BE_A2_i,    BE_B2_i;
+    input wire  [13:0] ADDR_A2_i,  ADDR_B2_i;
+    input wire  [17:0] WDATA_A2_i, WDATA_B2_i;
+    output wire [17:0] RDATA_A2_o, RDATA_B2_o;
+
+    input wire  FLUSH2_i;
+
+    TDP36K #(.MODE_BITS(MODE_BITS)) bram (
+        .RESET_ni   (RESET_ni),   
+        .WEN_A1_i   (WEN_A1_i),   .WEN_B1_i   (WEN_B1_i),
+        .REN_A1_i   (REN_A1_i),   .REN_B1_i   (REN_B1_i),
+        .CLK_A1_i   (CLK_A1_i),   .CLK_B1_i   (CLK_B1_i),
+        .BE_A1_i    (BE_A1_i),    .BE_B1_i    (BE_B1_i),
+        .ADDR_A1_i  (ADDR_A1_i),  .ADDR_B1_i  (ADDR_B1_i),
+        .WDATA_A1_i (WDATA_A1_i), .WDATA_B1_i (WDATA_B1_i),
+        .RDATA_A1_o (RDATA_A1_o), .RDATA_B1_o (RDATA_B1_o),
+        .FLUSH1_i   (FLUSH1_i),
+        .WEN_A2_i   (WEN_A2_i),   .WEN_B2_i   (WEN_B2_i),
+        .REN_A2_i   (REN_A2_i),   .REN_B2_i   (REN_B2_i),
+        .CLK_A2_i   (CLK_A2_i),   .CLK_B2_i   (CLK_B2_i),
+        .BE_A2_i    (BE_A2_i),    .BE_B2_i    (BE_B2_i),
+        .ADDR_A2_i  (ADDR_A2_i),  .ADDR_B2_i  (ADDR_B2_i),
+        .WDATA_A2_i (WDATA_A2_i), .WDATA_B2_i (WDATA_B2_i),
+        .RDATA_A2_o (RDATA_A2_o), .RDATA_B2_o (RDATA_B2_o),
+        .FLUSH2_i   (FLUSH2_i)
+    );
+    
+`ifdef SDF_SIM
+	specify
+    (FLUSH1_i => RDATA_A1_o[0]) = 0;
+    (FLUSH1_i => RDATA_A1_o[1]) = 0;
+    (FLUSH1_i => RDATA_A1_o[2]) = 0;
+    (FLUSH1_i => RDATA_A1_o[3]) = 0;
+    (FLUSH1_i => RDATA_A1_o[4]) = 0;
+    (FLUSH1_i => RDATA_A1_o[5]) = 0;
+    (FLUSH1_i => RDATA_A1_o[6]) = 0;
+    (FLUSH1_i => RDATA_A1_o[7]) = 0;
+    (FLUSH2_i => RDATA_A2_o[0]) = 0;
+    (FLUSH2_i => RDATA_A2_o[1]) = 0;
+    (FLUSH2_i => RDATA_A2_o[2]) = 0;
+    (FLUSH2_i => RDATA_A2_o[3]) = 0;
+    (FLUSH2_i => RDATA_A2_o[4]) = 0;
+    (FLUSH2_i => RDATA_A2_o[5]) = 0;
+    (FLUSH2_i => RDATA_A2_o[6]) = 0;
+    (FLUSH2_i => RDATA_A2_o[7]) = 0;    
+		(negedge RESET_ni => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+		(negedge RESET_ni => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+		(negedge RESET_ni => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+		(negedge RESET_ni => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+		(posedge CLK_A1_i => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+		(posedge CLK_B1_i => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+		(posedge CLK_A2_i => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+		(posedge CLK_B2_i => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+    $setuphold(posedge CLK_A1_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_A1_i, FLUSH1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, WEN_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, REN_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, BE_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, ADDR_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, WDATA_A1_i, 0, 0);
+    $setuphold(posedge CLK_B1_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_B1_i, WEN_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, REN_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, BE_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, ADDR_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, WDATA_B1_i, 0, 0);
+    $setuphold(posedge CLK_A2_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_A2_i, FLUSH2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, WEN_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, REN_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, BE_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, ADDR_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, WDATA_A2_i, 0, 0);
+    $setuphold(posedge CLK_B2_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_B2_i, WEN_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, REN_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, BE_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, ADDR_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, WDATA_B2_i, 0, 0);
+	endspecify
+`endif
+
+endmodule
+
+module TDP36K_FIFO_ASYNC_WR_X18_RD_X36_nonsplit (
+    RESET_ni,
+    WEN_A1_i,   WEN_B1_i,
+    REN_A1_i,   REN_B1_i,
+    CLK_A1_i,   CLK_B1_i,
+    BE_A1_i,    BE_B1_i,
+    ADDR_A1_i,  ADDR_B1_i,
+    WDATA_A1_i, WDATA_B1_i,
+    RDATA_A1_o, RDATA_B1_o,
+    FLUSH1_i,
+    WEN_A2_i,   WEN_B2_i,
+    REN_A2_i,   REN_B2_i,
+    CLK_A2_i,   CLK_B2_i,
+    BE_A2_i,    BE_B2_i,
+    ADDR_A2_i,  ADDR_B2_i,
+    WDATA_A2_i, WDATA_B2_i,
+    RDATA_A2_o, RDATA_B2_o,
+    FLUSH2_i
+);
+    parameter [80:0] MODE_BITS = 81'd0;
+
+    input wire  RESET_ni;
+    input wire  WEN_A1_i, WEN_B1_i;
+    input wire  REN_A1_i, REN_B1_i;
+    input wire  WEN_A2_i, WEN_B2_i;
+    input wire  REN_A2_i, REN_B2_i;
+
+    (* clkbuf_sink *)
+    input wire  CLK_A1_i;
+    (* clkbuf_sink *)
+    input wire  CLK_B1_i;
+    (* clkbuf_sink *)
+    input wire  CLK_A2_i;
+    (* clkbuf_sink *)
+    input wire  CLK_B2_i;
+
+    input wire  [ 1:0] BE_A1_i,    BE_B1_i;
+    input wire  [14:0] ADDR_A1_i,  ADDR_B1_i;
+    input wire  [17:0] WDATA_A1_i, WDATA_B1_i;
+    output wire [17:0] RDATA_A1_o, RDATA_B1_o;
+
+    input wire  FLUSH1_i;
+
+    input wire  [ 1:0] BE_A2_i,    BE_B2_i;
+    input wire  [13:0] ADDR_A2_i,  ADDR_B2_i;
+    input wire  [17:0] WDATA_A2_i, WDATA_B2_i;
+    output wire [17:0] RDATA_A2_o, RDATA_B2_o;
+
+    input wire  FLUSH2_i;
+
+    TDP36K #(.MODE_BITS(MODE_BITS)) bram (
+        .RESET_ni   (RESET_ni),   
+        .WEN_A1_i   (WEN_A1_i),   .WEN_B1_i   (WEN_B1_i),
+        .REN_A1_i   (REN_A1_i),   .REN_B1_i   (REN_B1_i),
+        .CLK_A1_i   (CLK_A1_i),   .CLK_B1_i   (CLK_B1_i),
+        .BE_A1_i    (BE_A1_i),    .BE_B1_i    (BE_B1_i),
+        .ADDR_A1_i  (ADDR_A1_i),  .ADDR_B1_i  (ADDR_B1_i),
+        .WDATA_A1_i (WDATA_A1_i), .WDATA_B1_i (WDATA_B1_i),
+        .RDATA_A1_o (RDATA_A1_o), .RDATA_B1_o (RDATA_B1_o),
+        .FLUSH1_i   (FLUSH1_i),
+        .WEN_A2_i   (WEN_A2_i),   .WEN_B2_i   (WEN_B2_i),
+        .REN_A2_i   (REN_A2_i),   .REN_B2_i   (REN_B2_i),
+        .CLK_A2_i   (CLK_A2_i),   .CLK_B2_i   (CLK_B2_i),
+        .BE_A2_i    (BE_A2_i),    .BE_B2_i    (BE_B2_i),
+        .ADDR_A2_i  (ADDR_A2_i),  .ADDR_B2_i  (ADDR_B2_i),
+        .WDATA_A2_i (WDATA_A2_i), .WDATA_B2_i (WDATA_B2_i),
+        .RDATA_A2_o (RDATA_A2_o), .RDATA_B2_o (RDATA_B2_o),
+        .FLUSH2_i   (FLUSH2_i)
+    );
+    
+`ifdef SDF_SIM
+	specify
+    (FLUSH1_i => RDATA_A1_o[0]) = 0;
+    (FLUSH1_i => RDATA_A1_o[1]) = 0;
+    (FLUSH1_i => RDATA_A1_o[2]) = 0;
+    (FLUSH1_i => RDATA_A1_o[3]) = 0;
+    (FLUSH1_i => RDATA_A1_o[4]) = 0;
+    (FLUSH1_i => RDATA_A1_o[5]) = 0;
+    (FLUSH1_i => RDATA_A1_o[6]) = 0;
+    (FLUSH1_i => RDATA_A1_o[7]) = 0;
+    (FLUSH2_i => RDATA_A2_o[0]) = 0;
+    (FLUSH2_i => RDATA_A2_o[1]) = 0;
+    (FLUSH2_i => RDATA_A2_o[2]) = 0;
+    (FLUSH2_i => RDATA_A2_o[3]) = 0;
+    (FLUSH2_i => RDATA_A2_o[4]) = 0;
+    (FLUSH2_i => RDATA_A2_o[5]) = 0;
+    (FLUSH2_i => RDATA_A2_o[6]) = 0;
+    (FLUSH2_i => RDATA_A2_o[7]) = 0;    
+		(negedge RESET_ni => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+		(negedge RESET_ni => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+		(negedge RESET_ni => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+		(negedge RESET_ni => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+		(posedge CLK_A1_i => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+		(posedge CLK_B1_i => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+		(posedge CLK_A2_i => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+		(posedge CLK_B2_i => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+    $setuphold(posedge CLK_A1_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_A1_i, FLUSH1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, WEN_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, REN_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, BE_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, ADDR_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, WDATA_A1_i, 0, 0);
+    $setuphold(posedge CLK_B1_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_B1_i, WEN_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, REN_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, BE_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, ADDR_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, WDATA_B1_i, 0, 0);
+    $setuphold(posedge CLK_A2_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_A2_i, FLUSH2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, WEN_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, REN_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, BE_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, ADDR_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, WDATA_A2_i, 0, 0);
+    $setuphold(posedge CLK_B2_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_B2_i, WEN_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, REN_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, BE_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, ADDR_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, WDATA_B2_i, 0, 0);
+	endspecify
+`endif
+
+endmodule
+
+module TDP36K_FIFO_ASYNC_WR_X36_RD_X9_nonsplit (
+    RESET_ni,
+    WEN_A1_i,   WEN_B1_i,
+    REN_A1_i,   REN_B1_i,
+    CLK_A1_i,   CLK_B1_i,
+    BE_A1_i,    BE_B1_i,
+    ADDR_A1_i,  ADDR_B1_i,
+    WDATA_A1_i, WDATA_B1_i,
+    RDATA_A1_o, RDATA_B1_o,
+    FLUSH1_i,
+    WEN_A2_i,   WEN_B2_i,
+    REN_A2_i,   REN_B2_i,
+    CLK_A2_i,   CLK_B2_i,
+    BE_A2_i,    BE_B2_i,
+    ADDR_A2_i,  ADDR_B2_i,
+    WDATA_A2_i, WDATA_B2_i,
+    RDATA_A2_o, RDATA_B2_o,
+    FLUSH2_i
+);
+    parameter [80:0] MODE_BITS = 81'd0;
+
+    input wire  RESET_ni;
+    input wire  WEN_A1_i, WEN_B1_i;
+    input wire  REN_A1_i, REN_B1_i;
+    input wire  WEN_A2_i, WEN_B2_i;
+    input wire  REN_A2_i, REN_B2_i;
+
+    (* clkbuf_sink *)
+    input wire  CLK_A1_i;
+    (* clkbuf_sink *)
+    input wire  CLK_B1_i;
+    (* clkbuf_sink *)
+    input wire  CLK_A2_i;
+    (* clkbuf_sink *)
+    input wire  CLK_B2_i;
+
+    input wire  [ 1:0] BE_A1_i,    BE_B1_i;
+    input wire  [14:0] ADDR_A1_i,  ADDR_B1_i;
+    input wire  [17:0] WDATA_A1_i, WDATA_B1_i;
+    output wire [17:0] RDATA_A1_o, RDATA_B1_o;
+
+    input wire  FLUSH1_i;
+
+    input wire  [ 1:0] BE_A2_i,    BE_B2_i;
+    input wire  [13:0] ADDR_A2_i,  ADDR_B2_i;
+    input wire  [17:0] WDATA_A2_i, WDATA_B2_i;
+    output wire [17:0] RDATA_A2_o, RDATA_B2_o;
+
+    input wire  FLUSH2_i;
+
+    TDP36K #(.MODE_BITS(MODE_BITS)) bram (
+        .RESET_ni   (RESET_ni),   
+        .WEN_A1_i   (WEN_A1_i),   .WEN_B1_i   (WEN_B1_i),
+        .REN_A1_i   (REN_A1_i),   .REN_B1_i   (REN_B1_i),
+        .CLK_A1_i   (CLK_A1_i),   .CLK_B1_i   (CLK_B1_i),
+        .BE_A1_i    (BE_A1_i),    .BE_B1_i    (BE_B1_i),
+        .ADDR_A1_i  (ADDR_A1_i),  .ADDR_B1_i  (ADDR_B1_i),
+        .WDATA_A1_i (WDATA_A1_i), .WDATA_B1_i (WDATA_B1_i),
+        .RDATA_A1_o (RDATA_A1_o), .RDATA_B1_o (RDATA_B1_o),
+        .FLUSH1_i   (FLUSH1_i),
+        .WEN_A2_i   (WEN_A2_i),   .WEN_B2_i   (WEN_B2_i),
+        .REN_A2_i   (REN_A2_i),   .REN_B2_i   (REN_B2_i),
+        .CLK_A2_i   (CLK_A2_i),   .CLK_B2_i   (CLK_B2_i),
+        .BE_A2_i    (BE_A2_i),    .BE_B2_i    (BE_B2_i),
+        .ADDR_A2_i  (ADDR_A2_i),  .ADDR_B2_i  (ADDR_B2_i),
+        .WDATA_A2_i (WDATA_A2_i), .WDATA_B2_i (WDATA_B2_i),
+        .RDATA_A2_o (RDATA_A2_o), .RDATA_B2_o (RDATA_B2_o),
+        .FLUSH2_i   (FLUSH2_i)
+    );
+    
+`ifdef SDF_SIM
+	specify
+    (FLUSH1_i => RDATA_A1_o[0]) = 0;
+    (FLUSH1_i => RDATA_A1_o[1]) = 0;
+    (FLUSH1_i => RDATA_A1_o[2]) = 0;
+    (FLUSH1_i => RDATA_A1_o[3]) = 0;
+    (FLUSH1_i => RDATA_A1_o[4]) = 0;
+    (FLUSH1_i => RDATA_A1_o[5]) = 0;
+    (FLUSH1_i => RDATA_A1_o[6]) = 0;
+    (FLUSH1_i => RDATA_A1_o[7]) = 0;
+    (FLUSH2_i => RDATA_A2_o[0]) = 0;
+    (FLUSH2_i => RDATA_A2_o[1]) = 0;
+    (FLUSH2_i => RDATA_A2_o[2]) = 0;
+    (FLUSH2_i => RDATA_A2_o[3]) = 0;
+    (FLUSH2_i => RDATA_A2_o[4]) = 0;
+    (FLUSH2_i => RDATA_A2_o[5]) = 0;
+    (FLUSH2_i => RDATA_A2_o[6]) = 0;
+    (FLUSH2_i => RDATA_A2_o[7]) = 0;    
+		(negedge RESET_ni => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+		(negedge RESET_ni => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+		(negedge RESET_ni => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+		(negedge RESET_ni => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+		(posedge CLK_A1_i => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+		(posedge CLK_B1_i => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+		(posedge CLK_A2_i => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+		(posedge CLK_B2_i => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+    $setuphold(posedge CLK_A1_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_A1_i, FLUSH1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, WEN_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, REN_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, BE_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, ADDR_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, WDATA_A1_i, 0, 0);
+    $setuphold(posedge CLK_B1_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_B1_i, WEN_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, REN_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, BE_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, ADDR_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, WDATA_B1_i, 0, 0);
+    $setuphold(posedge CLK_A2_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_A2_i, FLUSH2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, WEN_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, REN_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, BE_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, ADDR_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, WDATA_A2_i, 0, 0);
+    $setuphold(posedge CLK_B2_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_B2_i, WEN_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, REN_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, BE_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, ADDR_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, WDATA_B2_i, 0, 0);
+	endspecify
+`endif
+
+endmodule
+
+module TDP36K_FIFO_ASYNC_WR_X36_RD_X18_nonsplit (
+    RESET_ni,
+    WEN_A1_i,   WEN_B1_i,
+    REN_A1_i,   REN_B1_i,
+    CLK_A1_i,   CLK_B1_i,
+    BE_A1_i,    BE_B1_i,
+    ADDR_A1_i,  ADDR_B1_i,
+    WDATA_A1_i, WDATA_B1_i,
+    RDATA_A1_o, RDATA_B1_o,
+    FLUSH1_i,
+    WEN_A2_i,   WEN_B2_i,
+    REN_A2_i,   REN_B2_i,
+    CLK_A2_i,   CLK_B2_i,
+    BE_A2_i,    BE_B2_i,
+    ADDR_A2_i,  ADDR_B2_i,
+    WDATA_A2_i, WDATA_B2_i,
+    RDATA_A2_o, RDATA_B2_o,
+    FLUSH2_i
+);
+    parameter [80:0] MODE_BITS = 81'd0;
+
+    input wire  RESET_ni;
+    input wire  WEN_A1_i, WEN_B1_i;
+    input wire  REN_A1_i, REN_B1_i;
+    input wire  WEN_A2_i, WEN_B2_i;
+    input wire  REN_A2_i, REN_B2_i;
+
+    (* clkbuf_sink *)
+    input wire  CLK_A1_i;
+    (* clkbuf_sink *)
+    input wire  CLK_B1_i;
+    (* clkbuf_sink *)
+    input wire  CLK_A2_i;
+    (* clkbuf_sink *)
+    input wire  CLK_B2_i;
+
+    input wire  [ 1:0] BE_A1_i,    BE_B1_i;
+    input wire  [14:0] ADDR_A1_i,  ADDR_B1_i;
+    input wire  [17:0] WDATA_A1_i, WDATA_B1_i;
+    output wire [17:0] RDATA_A1_o, RDATA_B1_o;
+
+    input wire  FLUSH1_i;
+
+    input wire  [ 1:0] BE_A2_i,    BE_B2_i;
+    input wire  [13:0] ADDR_A2_i,  ADDR_B2_i;
+    input wire  [17:0] WDATA_A2_i, WDATA_B2_i;
+    output wire [17:0] RDATA_A2_o, RDATA_B2_o;
+
+    input wire  FLUSH2_i;
+
+    TDP36K #(.MODE_BITS(MODE_BITS)) bram (
+        .RESET_ni   (RESET_ni),   
+        .WEN_A1_i   (WEN_A1_i),   .WEN_B1_i   (WEN_B1_i),
+        .REN_A1_i   (REN_A1_i),   .REN_B1_i   (REN_B1_i),
+        .CLK_A1_i   (CLK_A1_i),   .CLK_B1_i   (CLK_B1_i),
+        .BE_A1_i    (BE_A1_i),    .BE_B1_i    (BE_B1_i),
+        .ADDR_A1_i  (ADDR_A1_i),  .ADDR_B1_i  (ADDR_B1_i),
+        .WDATA_A1_i (WDATA_A1_i), .WDATA_B1_i (WDATA_B1_i),
+        .RDATA_A1_o (RDATA_A1_o), .RDATA_B1_o (RDATA_B1_o),
+        .FLUSH1_i   (FLUSH1_i),
+        .WEN_A2_i   (WEN_A2_i),   .WEN_B2_i   (WEN_B2_i),
+        .REN_A2_i   (REN_A2_i),   .REN_B2_i   (REN_B2_i),
+        .CLK_A2_i   (CLK_A2_i),   .CLK_B2_i   (CLK_B2_i),
+        .BE_A2_i    (BE_A2_i),    .BE_B2_i    (BE_B2_i),
+        .ADDR_A2_i  (ADDR_A2_i),  .ADDR_B2_i  (ADDR_B2_i),
+        .WDATA_A2_i (WDATA_A2_i), .WDATA_B2_i (WDATA_B2_i),
+        .RDATA_A2_o (RDATA_A2_o), .RDATA_B2_o (RDATA_B2_o),
+        .FLUSH2_i   (FLUSH2_i)
+    );
+    
+`ifdef SDF_SIM
+	specify
+    (FLUSH1_i => RDATA_A1_o[0]) = 0;
+    (FLUSH1_i => RDATA_A1_o[1]) = 0;
+    (FLUSH1_i => RDATA_A1_o[2]) = 0;
+    (FLUSH1_i => RDATA_A1_o[3]) = 0;
+    (FLUSH1_i => RDATA_A1_o[4]) = 0;
+    (FLUSH1_i => RDATA_A1_o[5]) = 0;
+    (FLUSH1_i => RDATA_A1_o[6]) = 0;
+    (FLUSH1_i => RDATA_A1_o[7]) = 0;
+    (FLUSH2_i => RDATA_A2_o[0]) = 0;
+    (FLUSH2_i => RDATA_A2_o[1]) = 0;
+    (FLUSH2_i => RDATA_A2_o[2]) = 0;
+    (FLUSH2_i => RDATA_A2_o[3]) = 0;
+    (FLUSH2_i => RDATA_A2_o[4]) = 0;
+    (FLUSH2_i => RDATA_A2_o[5]) = 0;
+    (FLUSH2_i => RDATA_A2_o[6]) = 0;
+    (FLUSH2_i => RDATA_A2_o[7]) = 0;    
+		(negedge RESET_ni => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+		(negedge RESET_ni => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+		(negedge RESET_ni => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+		(negedge RESET_ni => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+		(posedge CLK_A1_i => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+		(posedge CLK_B1_i => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+		(posedge CLK_A2_i => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+		(posedge CLK_B2_i => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+    $setuphold(posedge CLK_A1_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_A1_i, FLUSH1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, WEN_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, REN_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, BE_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, ADDR_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, WDATA_A1_i, 0, 0);
+    $setuphold(posedge CLK_B1_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_B1_i, WEN_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, REN_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, BE_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, ADDR_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, WDATA_B1_i, 0, 0);
+    $setuphold(posedge CLK_A2_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_A2_i, FLUSH2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, WEN_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, REN_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, BE_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, ADDR_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, WDATA_A2_i, 0, 0);
+    $setuphold(posedge CLK_B2_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_B2_i, WEN_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, REN_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, BE_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, ADDR_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, WDATA_B2_i, 0, 0);
+	endspecify
+`endif
+
+endmodule
+
+module TDP36K_FIFO_ASYNC_WR_X36_RD_X36_nonsplit (
+    RESET_ni,
+    WEN_A1_i,   WEN_B1_i,
+    REN_A1_i,   REN_B1_i,
+    CLK_A1_i,   CLK_B1_i,
+    BE_A1_i,    BE_B1_i,
+    ADDR_A1_i,  ADDR_B1_i,
+    WDATA_A1_i, WDATA_B1_i,
+    RDATA_A1_o, RDATA_B1_o,
+    FLUSH1_i,
+    WEN_A2_i,   WEN_B2_i,
+    REN_A2_i,   REN_B2_i,
+    CLK_A2_i,   CLK_B2_i,
+    BE_A2_i,    BE_B2_i,
+    ADDR_A2_i,  ADDR_B2_i,
+    WDATA_A2_i, WDATA_B2_i,
+    RDATA_A2_o, RDATA_B2_o,
+    FLUSH2_i
+);
+    parameter [80:0] MODE_BITS = 81'd0;
+
+    input wire  RESET_ni;
+    input wire  WEN_A1_i, WEN_B1_i;
+    input wire  REN_A1_i, REN_B1_i;
+    input wire  WEN_A2_i, WEN_B2_i;
+    input wire  REN_A2_i, REN_B2_i;
+
+    (* clkbuf_sink *)
+    input wire  CLK_A1_i;
+    (* clkbuf_sink *)
+    input wire  CLK_B1_i;
+    (* clkbuf_sink *)
+    input wire  CLK_A2_i;
+    (* clkbuf_sink *)
+    input wire  CLK_B2_i;
+
+    input wire  [ 1:0] BE_A1_i,    BE_B1_i;
+    input wire  [14:0] ADDR_A1_i,  ADDR_B1_i;
+    input wire  [17:0] WDATA_A1_i, WDATA_B1_i;
+    output wire [17:0] RDATA_A1_o, RDATA_B1_o;
+
+    input wire  FLUSH1_i;
+
+    input wire  [ 1:0] BE_A2_i,    BE_B2_i;
+    input wire  [13:0] ADDR_A2_i,  ADDR_B2_i;
+    input wire  [17:0] WDATA_A2_i, WDATA_B2_i;
+    output wire [17:0] RDATA_A2_o, RDATA_B2_o;
+
+    input wire  FLUSH2_i;
+
+    TDP36K #(.MODE_BITS(MODE_BITS)) bram (
+        .RESET_ni   (RESET_ni),   
+        .WEN_A1_i   (WEN_A1_i),   .WEN_B1_i   (WEN_B1_i),
+        .REN_A1_i   (REN_A1_i),   .REN_B1_i   (REN_B1_i),
+        .CLK_A1_i   (CLK_A1_i),   .CLK_B1_i   (CLK_B1_i),
+        .BE_A1_i    (BE_A1_i),    .BE_B1_i    (BE_B1_i),
+        .ADDR_A1_i  (ADDR_A1_i),  .ADDR_B1_i  (ADDR_B1_i),
+        .WDATA_A1_i (WDATA_A1_i), .WDATA_B1_i (WDATA_B1_i),
+        .RDATA_A1_o (RDATA_A1_o), .RDATA_B1_o (RDATA_B1_o),
+        .FLUSH1_i   (FLUSH1_i),
+        .WEN_A2_i   (WEN_A2_i),   .WEN_B2_i   (WEN_B2_i),
+        .REN_A2_i   (REN_A2_i),   .REN_B2_i   (REN_B2_i),
+        .CLK_A2_i   (CLK_A2_i),   .CLK_B2_i   (CLK_B2_i),
+        .BE_A2_i    (BE_A2_i),    .BE_B2_i    (BE_B2_i),
+        .ADDR_A2_i  (ADDR_A2_i),  .ADDR_B2_i  (ADDR_B2_i),
+        .WDATA_A2_i (WDATA_A2_i), .WDATA_B2_i (WDATA_B2_i),
+        .RDATA_A2_o (RDATA_A2_o), .RDATA_B2_o (RDATA_B2_o),
+        .FLUSH2_i   (FLUSH2_i)
+    );
+    
+`ifdef SDF_SIM
+	specify
+    (FLUSH1_i => RDATA_A1_o[0]) = 0;
+    (FLUSH1_i => RDATA_A1_o[1]) = 0;
+    (FLUSH1_i => RDATA_A1_o[2]) = 0;
+    (FLUSH1_i => RDATA_A1_o[3]) = 0;
+    (FLUSH1_i => RDATA_A1_o[4]) = 0;
+    (FLUSH1_i => RDATA_A1_o[5]) = 0;
+    (FLUSH1_i => RDATA_A1_o[6]) = 0;
+    (FLUSH1_i => RDATA_A1_o[7]) = 0;
+    (FLUSH2_i => RDATA_A2_o[0]) = 0;
+    (FLUSH2_i => RDATA_A2_o[1]) = 0;
+    (FLUSH2_i => RDATA_A2_o[2]) = 0;
+    (FLUSH2_i => RDATA_A2_o[3]) = 0;
+    (FLUSH2_i => RDATA_A2_o[4]) = 0;
+    (FLUSH2_i => RDATA_A2_o[5]) = 0;
+    (FLUSH2_i => RDATA_A2_o[6]) = 0;
+    (FLUSH2_i => RDATA_A2_o[7]) = 0;    
+		(negedge RESET_ni => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+		(negedge RESET_ni => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+		(negedge RESET_ni => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+		(negedge RESET_ni => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+		(posedge CLK_A1_i => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+		(posedge CLK_B1_i => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+		(posedge CLK_A2_i => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+		(posedge CLK_B2_i => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+    $setuphold(posedge CLK_A1_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_A1_i, FLUSH1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, WEN_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, REN_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, BE_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, ADDR_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, WDATA_A1_i, 0, 0);
+    $setuphold(posedge CLK_B1_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_B1_i, WEN_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, REN_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, BE_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, ADDR_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, WDATA_B1_i, 0, 0);
+    $setuphold(posedge CLK_A2_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_A2_i, FLUSH2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, WEN_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, REN_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, BE_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, ADDR_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, WDATA_A2_i, 0, 0);
+    $setuphold(posedge CLK_B2_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_B2_i, WEN_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, REN_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, BE_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, ADDR_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, WDATA_B2_i, 0, 0);
+	endspecify
+`endif
+
+endmodule
+
+
+module TDP36K_FIFO_ASYNC_WR_X9_RD_X9_split (
+    RESET_ni,
+    WEN_A1_i,   WEN_B1_i,
+    REN_A1_i,   REN_B1_i,
+    CLK_A1_i,   CLK_B1_i,
+    BE_A1_i,    BE_B1_i,
+    ADDR_A1_i,  ADDR_B1_i,
+    WDATA_A1_i, WDATA_B1_i,
+    RDATA_A1_o, RDATA_B1_o,
+    FLUSH1_i,
+    WEN_A2_i,   WEN_B2_i,
+    REN_A2_i,   REN_B2_i,
+    CLK_A2_i,   CLK_B2_i,
+    BE_A2_i,    BE_B2_i,
+    ADDR_A2_i,  ADDR_B2_i,
+    WDATA_A2_i, WDATA_B2_i,
+    RDATA_A2_o, RDATA_B2_o,
+    FLUSH2_i
+);
+    parameter [80:0] MODE_BITS = 81'd0;
+
+    input wire  RESET_ni;
+    input wire  WEN_A1_i, WEN_B1_i;
+    input wire  REN_A1_i, REN_B1_i;
+    input wire  WEN_A2_i, WEN_B2_i;
+    input wire  REN_A2_i, REN_B2_i;
+
+    (* clkbuf_sink *)
+    input wire  CLK_A1_i;
+    (* clkbuf_sink *)
+    input wire  CLK_B1_i;
+    (* clkbuf_sink *)
+    input wire  CLK_A2_i;
+    (* clkbuf_sink *)
+    input wire  CLK_B2_i;
+
+    input wire  [ 1:0] BE_A1_i,    BE_B1_i;
+    input wire  [14:0] ADDR_A1_i,  ADDR_B1_i;
+    input wire  [17:0] WDATA_A1_i, WDATA_B1_i;
+    output wire [17:0] RDATA_A1_o, RDATA_B1_o;
+
+    input wire  FLUSH1_i;
+
+    input wire  [ 1:0] BE_A2_i,    BE_B2_i;
+    input wire  [13:0] ADDR_A2_i,  ADDR_B2_i;
+    input wire  [17:0] WDATA_A2_i, WDATA_B2_i;
+    output wire [17:0] RDATA_A2_o, RDATA_B2_o;
+
+    input wire  FLUSH2_i;
+
+    TDP36K #(.MODE_BITS(MODE_BITS)) bram (
+        .RESET_ni   (RESET_ni),   
+        .WEN_A1_i   (WEN_A1_i),   .WEN_B1_i   (WEN_B1_i),
+        .REN_A1_i   (REN_A1_i),   .REN_B1_i   (REN_B1_i),
+        .CLK_A1_i   (CLK_A1_i),   .CLK_B1_i   (CLK_B1_i),
+        .BE_A1_i    (BE_A1_i),    .BE_B1_i    (BE_B1_i),
+        .ADDR_A1_i  (ADDR_A1_i),  .ADDR_B1_i  (ADDR_B1_i),
+        .WDATA_A1_i (WDATA_A1_i), .WDATA_B1_i (WDATA_B1_i),
+        .RDATA_A1_o (RDATA_A1_o), .RDATA_B1_o (RDATA_B1_o),
+        .FLUSH1_i   (FLUSH1_i),
+        .WEN_A2_i   (WEN_A2_i),   .WEN_B2_i   (WEN_B2_i),
+        .REN_A2_i   (REN_A2_i),   .REN_B2_i   (REN_B2_i),
+        .CLK_A2_i   (CLK_A2_i),   .CLK_B2_i   (CLK_B2_i),
+        .BE_A2_i    (BE_A2_i),    .BE_B2_i    (BE_B2_i),
+        .ADDR_A2_i  (ADDR_A2_i),  .ADDR_B2_i  (ADDR_B2_i),
+        .WDATA_A2_i (WDATA_A2_i), .WDATA_B2_i (WDATA_B2_i),
+        .RDATA_A2_o (RDATA_A2_o), .RDATA_B2_o (RDATA_B2_o),
+        .FLUSH2_i   (FLUSH2_i)
+    );
+   
+`ifdef SDF_SIM
+	specify
+    (FLUSH1_i => RDATA_A1_o[0]) = 0;
+    (FLUSH1_i => RDATA_A1_o[1]) = 0;
+    (FLUSH1_i => RDATA_A1_o[2]) = 0;
+    (FLUSH1_i => RDATA_A1_o[3]) = 0;
+    (FLUSH1_i => RDATA_A1_o[4]) = 0;
+    (FLUSH1_i => RDATA_A1_o[5]) = 0;
+    (FLUSH1_i => RDATA_A1_o[6]) = 0;
+    (FLUSH1_i => RDATA_A1_o[7]) = 0;
+    (FLUSH2_i => RDATA_A2_o[0]) = 0;
+    (FLUSH2_i => RDATA_A2_o[1]) = 0;
+    (FLUSH2_i => RDATA_A2_o[2]) = 0;
+    (FLUSH2_i => RDATA_A2_o[3]) = 0;
+    (FLUSH2_i => RDATA_A2_o[4]) = 0;
+    (FLUSH2_i => RDATA_A2_o[5]) = 0;
+    (FLUSH2_i => RDATA_A2_o[6]) = 0;
+    (FLUSH2_i => RDATA_A2_o[7]) = 0;    
+		(negedge RESET_ni => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+		(negedge RESET_ni => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+		(negedge RESET_ni => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+		(negedge RESET_ni => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+		(posedge CLK_A1_i => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+		(posedge CLK_B1_i => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+		(posedge CLK_A2_i => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+		(posedge CLK_B2_i => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+    $setuphold(posedge CLK_A1_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_A1_i, FLUSH1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, WEN_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, REN_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, BE_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, ADDR_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, WDATA_A1_i, 0, 0);
+    $setuphold(posedge CLK_B1_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_B1_i, WEN_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, REN_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, BE_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, ADDR_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, WDATA_B1_i, 0, 0);
+    $setuphold(posedge CLK_A2_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_A2_i, FLUSH2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, WEN_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, REN_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, BE_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, ADDR_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, WDATA_A2_i, 0, 0);
+    $setuphold(posedge CLK_B2_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_B2_i, WEN_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, REN_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, BE_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, ADDR_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, WDATA_B2_i, 0, 0);
+	endspecify
+`endif
+
+endmodule
+
+module TDP36K_FIFO_ASYNC_WR_X9_RD_X18_split (
+    RESET_ni,
+    WEN_A1_i,   WEN_B1_i,
+    REN_A1_i,   REN_B1_i,
+    CLK_A1_i,   CLK_B1_i,
+    BE_A1_i,    BE_B1_i,
+    ADDR_A1_i,  ADDR_B1_i,
+    WDATA_A1_i, WDATA_B1_i,
+    RDATA_A1_o, RDATA_B1_o,
+    FLUSH1_i,
+    WEN_A2_i,   WEN_B2_i,
+    REN_A2_i,   REN_B2_i,
+    CLK_A2_i,   CLK_B2_i,
+    BE_A2_i,    BE_B2_i,
+    ADDR_A2_i,  ADDR_B2_i,
+    WDATA_A2_i, WDATA_B2_i,
+    RDATA_A2_o, RDATA_B2_o,
+    FLUSH2_i
+);
+    parameter [80:0] MODE_BITS = 81'd0;
+
+    input wire  RESET_ni;
+    input wire  WEN_A1_i, WEN_B1_i;
+    input wire  REN_A1_i, REN_B1_i;
+    input wire  WEN_A2_i, WEN_B2_i;
+    input wire  REN_A2_i, REN_B2_i;
+
+    (* clkbuf_sink *)
+    input wire  CLK_A1_i;
+    (* clkbuf_sink *)
+    input wire  CLK_B1_i;
+    (* clkbuf_sink *)
+    input wire  CLK_A2_i;
+    (* clkbuf_sink *)
+    input wire  CLK_B2_i;
+
+    input wire  [ 1:0] BE_A1_i,    BE_B1_i;
+    input wire  [14:0] ADDR_A1_i,  ADDR_B1_i;
+    input wire  [17:0] WDATA_A1_i, WDATA_B1_i;
+    output wire [17:0] RDATA_A1_o, RDATA_B1_o;
+
+    input wire  FLUSH1_i;
+
+    input wire  [ 1:0] BE_A2_i,    BE_B2_i;
+    input wire  [13:0] ADDR_A2_i,  ADDR_B2_i;
+    input wire  [17:0] WDATA_A2_i, WDATA_B2_i;
+    output wire [17:0] RDATA_A2_o, RDATA_B2_o;
+
+    input wire  FLUSH2_i;
+
+    TDP36K #(.MODE_BITS(MODE_BITS)) bram (
+        .RESET_ni   (RESET_ni),   
+        .WEN_A1_i   (WEN_A1_i),   .WEN_B1_i   (WEN_B1_i),
+        .REN_A1_i   (REN_A1_i),   .REN_B1_i   (REN_B1_i),
+        .CLK_A1_i   (CLK_A1_i),   .CLK_B1_i   (CLK_B1_i),
+        .BE_A1_i    (BE_A1_i),    .BE_B1_i    (BE_B1_i),
+        .ADDR_A1_i  (ADDR_A1_i),  .ADDR_B1_i  (ADDR_B1_i),
+        .WDATA_A1_i (WDATA_A1_i), .WDATA_B1_i (WDATA_B1_i),
+        .RDATA_A1_o (RDATA_A1_o), .RDATA_B1_o (RDATA_B1_o),
+        .FLUSH1_i   (FLUSH1_i),
+        .WEN_A2_i   (WEN_A2_i),   .WEN_B2_i   (WEN_B2_i),
+        .REN_A2_i   (REN_A2_i),   .REN_B2_i   (REN_B2_i),
+        .CLK_A2_i   (CLK_A2_i),   .CLK_B2_i   (CLK_B2_i),
+        .BE_A2_i    (BE_A2_i),    .BE_B2_i    (BE_B2_i),
+        .ADDR_A2_i  (ADDR_A2_i),  .ADDR_B2_i  (ADDR_B2_i),
+        .WDATA_A2_i (WDATA_A2_i), .WDATA_B2_i (WDATA_B2_i),
+        .RDATA_A2_o (RDATA_A2_o), .RDATA_B2_o (RDATA_B2_o),
+        .FLUSH2_i   (FLUSH2_i)
+    );
+    
+`ifdef SDF_SIM
+	specify
+    (FLUSH1_i => RDATA_A1_o[0]) = 0;
+    (FLUSH1_i => RDATA_A1_o[1]) = 0;
+    (FLUSH1_i => RDATA_A1_o[2]) = 0;
+    (FLUSH1_i => RDATA_A1_o[3]) = 0;
+    (FLUSH1_i => RDATA_A1_o[4]) = 0;
+    (FLUSH1_i => RDATA_A1_o[5]) = 0;
+    (FLUSH1_i => RDATA_A1_o[6]) = 0;
+    (FLUSH1_i => RDATA_A1_o[7]) = 0;
+    (FLUSH2_i => RDATA_A2_o[0]) = 0;
+    (FLUSH2_i => RDATA_A2_o[1]) = 0;
+    (FLUSH2_i => RDATA_A2_o[2]) = 0;
+    (FLUSH2_i => RDATA_A2_o[3]) = 0;
+    (FLUSH2_i => RDATA_A2_o[4]) = 0;
+    (FLUSH2_i => RDATA_A2_o[5]) = 0;
+    (FLUSH2_i => RDATA_A2_o[6]) = 0;
+    (FLUSH2_i => RDATA_A2_o[7]) = 0;    
+		(negedge RESET_ni => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+		(negedge RESET_ni => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+		(negedge RESET_ni => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+		(negedge RESET_ni => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+		(posedge CLK_A1_i => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+		(posedge CLK_B1_i => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+		(posedge CLK_A2_i => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+		(posedge CLK_B2_i => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+    $setuphold(posedge CLK_A1_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_A1_i, FLUSH1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, WEN_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, REN_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, BE_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, ADDR_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, WDATA_A1_i, 0, 0);
+    $setuphold(posedge CLK_B1_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_B1_i, WEN_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, REN_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, BE_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, ADDR_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, WDATA_B1_i, 0, 0);
+    $setuphold(posedge CLK_A2_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_A2_i, FLUSH2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, WEN_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, REN_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, BE_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, ADDR_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, WDATA_A2_i, 0, 0);
+    $setuphold(posedge CLK_B2_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_B2_i, WEN_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, REN_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, BE_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, ADDR_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, WDATA_B2_i, 0, 0);
+	endspecify
+`endif
+
+endmodule
+
+module TDP36K_FIFO_ASYNC_WR_X18_RD_X9_split (
+    RESET_ni,
+    WEN_A1_i,   WEN_B1_i,
+    REN_A1_i,   REN_B1_i,
+    CLK_A1_i,   CLK_B1_i,
+    BE_A1_i,    BE_B1_i,
+    ADDR_A1_i,  ADDR_B1_i,
+    WDATA_A1_i, WDATA_B1_i,
+    RDATA_A1_o, RDATA_B1_o,
+    FLUSH1_i,
+    WEN_A2_i,   WEN_B2_i,
+    REN_A2_i,   REN_B2_i,
+    CLK_A2_i,   CLK_B2_i,
+    BE_A2_i,    BE_B2_i,
+    ADDR_A2_i,  ADDR_B2_i,
+    WDATA_A2_i, WDATA_B2_i,
+    RDATA_A2_o, RDATA_B2_o,
+    FLUSH2_i
+);
+    parameter [80:0] MODE_BITS = 81'd0;
+
+    input wire  RESET_ni;
+    input wire  WEN_A1_i, WEN_B1_i;
+    input wire  REN_A1_i, REN_B1_i;
+    input wire  WEN_A2_i, WEN_B2_i;
+    input wire  REN_A2_i, REN_B2_i;
+
+    (* clkbuf_sink *)
+    input wire  CLK_A1_i;
+    (* clkbuf_sink *)
+    input wire  CLK_B1_i;
+    (* clkbuf_sink *)
+    input wire  CLK_A2_i;
+    (* clkbuf_sink *)
+    input wire  CLK_B2_i;
+
+    input wire  [ 1:0] BE_A1_i,    BE_B1_i;
+    input wire  [14:0] ADDR_A1_i,  ADDR_B1_i;
+    input wire  [17:0] WDATA_A1_i, WDATA_B1_i;
+    output wire [17:0] RDATA_A1_o, RDATA_B1_o;
+
+    input wire  FLUSH1_i;
+
+    input wire  [ 1:0] BE_A2_i,    BE_B2_i;
+    input wire  [13:0] ADDR_A2_i,  ADDR_B2_i;
+    input wire  [17:0] WDATA_A2_i, WDATA_B2_i;
+    output wire [17:0] RDATA_A2_o, RDATA_B2_o;
+
+    input wire  FLUSH2_i;
+
+    TDP36K #(.MODE_BITS(MODE_BITS)) bram (
+        .RESET_ni   (RESET_ni),   
+        .WEN_A1_i   (WEN_A1_i),   .WEN_B1_i   (WEN_B1_i),
+        .REN_A1_i   (REN_A1_i),   .REN_B1_i   (REN_B1_i),
+        .CLK_A1_i   (CLK_A1_i),   .CLK_B1_i   (CLK_B1_i),
+        .BE_A1_i    (BE_A1_i),    .BE_B1_i    (BE_B1_i),
+        .ADDR_A1_i  (ADDR_A1_i),  .ADDR_B1_i  (ADDR_B1_i),
+        .WDATA_A1_i (WDATA_A1_i), .WDATA_B1_i (WDATA_B1_i),
+        .RDATA_A1_o (RDATA_A1_o), .RDATA_B1_o (RDATA_B1_o),
+        .FLUSH1_i   (FLUSH1_i),
+        .WEN_A2_i   (WEN_A2_i),   .WEN_B2_i   (WEN_B2_i),
+        .REN_A2_i   (REN_A2_i),   .REN_B2_i   (REN_B2_i),
+        .CLK_A2_i   (CLK_A2_i),   .CLK_B2_i   (CLK_B2_i),
+        .BE_A2_i    (BE_A2_i),    .BE_B2_i    (BE_B2_i),
+        .ADDR_A2_i  (ADDR_A2_i),  .ADDR_B2_i  (ADDR_B2_i),
+        .WDATA_A2_i (WDATA_A2_i), .WDATA_B2_i (WDATA_B2_i),
+        .RDATA_A2_o (RDATA_A2_o), .RDATA_B2_o (RDATA_B2_o),
+        .FLUSH2_i   (FLUSH2_i)
+    );
+
+`ifdef SDF_SIM
+	specify
+    (FLUSH1_i => RDATA_A1_o[0]) = 0;
+    (FLUSH1_i => RDATA_A1_o[1]) = 0;
+    (FLUSH1_i => RDATA_A1_o[2]) = 0;
+    (FLUSH1_i => RDATA_A1_o[3]) = 0;
+    (FLUSH1_i => RDATA_A1_o[4]) = 0;
+    (FLUSH1_i => RDATA_A1_o[5]) = 0;
+    (FLUSH1_i => RDATA_A1_o[6]) = 0;
+    (FLUSH1_i => RDATA_A1_o[7]) = 0;
+    (FLUSH2_i => RDATA_A2_o[0]) = 0;
+    (FLUSH2_i => RDATA_A2_o[1]) = 0;
+    (FLUSH2_i => RDATA_A2_o[2]) = 0;
+    (FLUSH2_i => RDATA_A2_o[3]) = 0;
+    (FLUSH2_i => RDATA_A2_o[4]) = 0;
+    (FLUSH2_i => RDATA_A2_o[5]) = 0;
+    (FLUSH2_i => RDATA_A2_o[6]) = 0;
+    (FLUSH2_i => RDATA_A2_o[7]) = 0;    
+		(negedge RESET_ni => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+		(negedge RESET_ni => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+		(negedge RESET_ni => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+		(negedge RESET_ni => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+		(posedge CLK_A1_i => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+		(posedge CLK_B1_i => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+		(posedge CLK_A2_i => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+		(posedge CLK_B2_i => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+    $setuphold(posedge CLK_A1_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_A1_i, FLUSH1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, WEN_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, REN_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, BE_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, ADDR_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, WDATA_A1_i, 0, 0);
+    $setuphold(posedge CLK_B1_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_B1_i, WEN_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, REN_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, BE_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, ADDR_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, WDATA_B1_i, 0, 0);
+    $setuphold(posedge CLK_A2_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_A2_i, FLUSH2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, WEN_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, REN_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, BE_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, ADDR_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, WDATA_A2_i, 0, 0);
+    $setuphold(posedge CLK_B2_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_B2_i, WEN_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, REN_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, BE_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, ADDR_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, WDATA_B2_i, 0, 0);
+	endspecify
+`endif
+
+endmodule
+
+module TDP36K_FIFO_ASYNC_WR_X18_RD_X18_split (
+    RESET_ni,
+    WEN_A1_i,   WEN_B1_i,
+    REN_A1_i,   REN_B1_i,
+    CLK_A1_i,   CLK_B1_i,
+    BE_A1_i,    BE_B1_i,
+    ADDR_A1_i,  ADDR_B1_i,
+    WDATA_A1_i, WDATA_B1_i,
+    RDATA_A1_o, RDATA_B1_o,
+    FLUSH1_i,
+    WEN_A2_i,   WEN_B2_i,
+    REN_A2_i,   REN_B2_i,
+    CLK_A2_i,   CLK_B2_i,
+    BE_A2_i,    BE_B2_i,
+    ADDR_A2_i,  ADDR_B2_i,
+    WDATA_A2_i, WDATA_B2_i,
+    RDATA_A2_o, RDATA_B2_o,
+    FLUSH2_i
+);
+    parameter [80:0] MODE_BITS = 81'd0;
+
+    input wire  RESET_ni;
+    input wire  WEN_A1_i, WEN_B1_i;
+    input wire  REN_A1_i, REN_B1_i;
+    input wire  WEN_A2_i, WEN_B2_i;
+    input wire  REN_A2_i, REN_B2_i;
+
+    (* clkbuf_sink *)
+    input wire  CLK_A1_i;
+    (* clkbuf_sink *)
+    input wire  CLK_B1_i;
+    (* clkbuf_sink *)
+    input wire  CLK_A2_i;
+    (* clkbuf_sink *)
+    input wire  CLK_B2_i;
+
+    input wire  [ 1:0] BE_A1_i,    BE_B1_i;
+    input wire  [14:0] ADDR_A1_i,  ADDR_B1_i;
+    input wire  [17:0] WDATA_A1_i, WDATA_B1_i;
+    output wire [17:0] RDATA_A1_o, RDATA_B1_o;
+
+    input wire  FLUSH1_i;
+
+    input wire  [ 1:0] BE_A2_i,    BE_B2_i;
+    input wire  [13:0] ADDR_A2_i,  ADDR_B2_i;
+    input wire  [17:0] WDATA_A2_i, WDATA_B2_i;
+    output wire [17:0] RDATA_A2_o, RDATA_B2_o;
+
+    input wire  FLUSH2_i;
+
+    TDP36K #(.MODE_BITS(MODE_BITS)) bram (
+        .RESET_ni   (RESET_ni),   
+        .WEN_A1_i   (WEN_A1_i),   .WEN_B1_i   (WEN_B1_i),
+        .REN_A1_i   (REN_A1_i),   .REN_B1_i   (REN_B1_i),
+        .CLK_A1_i   (CLK_A1_i),   .CLK_B1_i   (CLK_B1_i),
+        .BE_A1_i    (BE_A1_i),    .BE_B1_i    (BE_B1_i),
+        .ADDR_A1_i  (ADDR_A1_i),  .ADDR_B1_i  (ADDR_B1_i),
+        .WDATA_A1_i (WDATA_A1_i), .WDATA_B1_i (WDATA_B1_i),
+        .RDATA_A1_o (RDATA_A1_o), .RDATA_B1_o (RDATA_B1_o),
+        .FLUSH1_i   (FLUSH1_i),
+        .WEN_A2_i   (WEN_A2_i),   .WEN_B2_i   (WEN_B2_i),
+        .REN_A2_i   (REN_A2_i),   .REN_B2_i   (REN_B2_i),
+        .CLK_A2_i   (CLK_A2_i),   .CLK_B2_i   (CLK_B2_i),
+        .BE_A2_i    (BE_A2_i),    .BE_B2_i    (BE_B2_i),
+        .ADDR_A2_i  (ADDR_A2_i),  .ADDR_B2_i  (ADDR_B2_i),
+        .WDATA_A2_i (WDATA_A2_i), .WDATA_B2_i (WDATA_B2_i),
+        .RDATA_A2_o (RDATA_A2_o), .RDATA_B2_o (RDATA_B2_o),
+        .FLUSH2_i   (FLUSH2_i)
+    );
+
+`ifdef SDF_SIM
+	specify
+    (FLUSH1_i => RDATA_A1_o[0]) = 0;
+    (FLUSH1_i => RDATA_A1_o[1]) = 0;
+    (FLUSH1_i => RDATA_A1_o[2]) = 0;
+    (FLUSH1_i => RDATA_A1_o[3]) = 0;
+    (FLUSH1_i => RDATA_A1_o[4]) = 0;
+    (FLUSH1_i => RDATA_A1_o[5]) = 0;
+    (FLUSH1_i => RDATA_A1_o[6]) = 0;
+    (FLUSH1_i => RDATA_A1_o[7]) = 0;
+    (FLUSH2_i => RDATA_A2_o[0]) = 0;
+    (FLUSH2_i => RDATA_A2_o[1]) = 0;
+    (FLUSH2_i => RDATA_A2_o[2]) = 0;
+    (FLUSH2_i => RDATA_A2_o[3]) = 0;
+    (FLUSH2_i => RDATA_A2_o[4]) = 0;
+    (FLUSH2_i => RDATA_A2_o[5]) = 0;
+    (FLUSH2_i => RDATA_A2_o[6]) = 0;
+    (FLUSH2_i => RDATA_A2_o[7]) = 0;    
+		(negedge RESET_ni => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+		(negedge RESET_ni => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+		(negedge RESET_ni => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+		(negedge RESET_ni => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+		(posedge CLK_A1_i => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+		(posedge CLK_B1_i => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+		(posedge CLK_A2_i => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+		(posedge CLK_B2_i => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+    $setuphold(posedge CLK_A1_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_A1_i, FLUSH1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, WEN_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, REN_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, BE_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, ADDR_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, WDATA_A1_i, 0, 0);
+    $setuphold(posedge CLK_B1_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_B1_i, WEN_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, REN_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, BE_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, ADDR_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, WDATA_B1_i, 0, 0);
+    $setuphold(posedge CLK_A2_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_A2_i, FLUSH2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, WEN_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, REN_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, BE_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, ADDR_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, WDATA_A2_i, 0, 0);
+    $setuphold(posedge CLK_B2_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_B2_i, WEN_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, REN_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, BE_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, ADDR_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, WDATA_B2_i, 0, 0);
+	endspecify
+`endif
+
+endmodule
+
+module TDP36K_FIFO_SYNC_WR_X9_RD_X9_nonsplit (
+    RESET_ni,
+    WEN_A1_i,   WEN_B1_i,
+    REN_A1_i,   REN_B1_i,
+    CLK_A1_i,   CLK_B1_i,
+    BE_A1_i,    BE_B1_i,
+    ADDR_A1_i,  ADDR_B1_i,
+    WDATA_A1_i, WDATA_B1_i,
+    RDATA_A1_o, RDATA_B1_o,
+    FLUSH1_i,
+    WEN_A2_i,   WEN_B2_i,
+    REN_A2_i,   REN_B2_i,
+    CLK_A2_i,   CLK_B2_i,
+    BE_A2_i,    BE_B2_i,
+    ADDR_A2_i,  ADDR_B2_i,
+    WDATA_A2_i, WDATA_B2_i,
+    RDATA_A2_o, RDATA_B2_o,
+    FLUSH2_i
+);
+    parameter [80:0] MODE_BITS = 81'd0;
+
+    input wire  RESET_ni;
+    input wire  WEN_A1_i, WEN_B1_i;
+    input wire  REN_A1_i, REN_B1_i;
+    input wire  WEN_A2_i, WEN_B2_i;
+    input wire  REN_A2_i, REN_B2_i;
+
+    (* clkbuf_sink *)
+    input wire  CLK_A1_i;
+    (* clkbuf_sink *)
+    input wire  CLK_B1_i;
+    (* clkbuf_sink *)
+    input wire  CLK_A2_i;
+    (* clkbuf_sink *)
+    input wire  CLK_B2_i;
+
+    input wire  [ 1:0] BE_A1_i,    BE_B1_i;
+    input wire  [14:0] ADDR_A1_i,  ADDR_B1_i;
+    input wire  [17:0] WDATA_A1_i, WDATA_B1_i;
+    output wire [17:0] RDATA_A1_o, RDATA_B1_o;
+
+    input wire  FLUSH1_i;
+
+    input wire  [ 1:0] BE_A2_i,    BE_B2_i;
+    input wire  [13:0] ADDR_A2_i,  ADDR_B2_i;
+    input wire  [17:0] WDATA_A2_i, WDATA_B2_i;
+    output wire [17:0] RDATA_A2_o, RDATA_B2_o;
+
+    input wire  FLUSH2_i;
+
+    TDP36K #(.MODE_BITS(MODE_BITS)) bram (
+        .RESET_ni   (RESET_ni),   
+        .WEN_A1_i   (WEN_A1_i),   .WEN_B1_i   (WEN_B1_i),
+        .REN_A1_i   (REN_A1_i),   .REN_B1_i   (REN_B1_i),
+        .CLK_A1_i   (CLK_A1_i),   .CLK_B1_i   (CLK_B1_i),
+        .BE_A1_i    (BE_A1_i),    .BE_B1_i    (BE_B1_i),
+        .ADDR_A1_i  (ADDR_A1_i),  .ADDR_B1_i  (ADDR_B1_i),
+        .WDATA_A1_i (WDATA_A1_i), .WDATA_B1_i (WDATA_B1_i),
+        .RDATA_A1_o (RDATA_A1_o), .RDATA_B1_o (RDATA_B1_o),
+        .FLUSH1_i   (FLUSH1_i),
+        .WEN_A2_i   (WEN_A2_i),   .WEN_B2_i   (WEN_B2_i),
+        .REN_A2_i   (REN_A2_i),   .REN_B2_i   (REN_B2_i),
+        .CLK_A2_i   (CLK_A2_i),   .CLK_B2_i   (CLK_B2_i),
+        .BE_A2_i    (BE_A2_i),    .BE_B2_i    (BE_B2_i),
+        .ADDR_A2_i  (ADDR_A2_i),  .ADDR_B2_i  (ADDR_B2_i),
+        .WDATA_A2_i (WDATA_A2_i), .WDATA_B2_i (WDATA_B2_i),
+        .RDATA_A2_o (RDATA_A2_o), .RDATA_B2_o (RDATA_B2_o),
+        .FLUSH2_i   (FLUSH2_i)
+    );
+    
+`ifdef SDF_SIM
+	specify
+    (FLUSH1_i => RDATA_A1_o[0]) = 0;
+    (FLUSH1_i => RDATA_A1_o[1]) = 0;
+    (FLUSH1_i => RDATA_A1_o[2]) = 0;
+    (FLUSH1_i => RDATA_A1_o[3]) = 0;
+    (FLUSH1_i => RDATA_A1_o[4]) = 0;
+    (FLUSH1_i => RDATA_A1_o[5]) = 0;
+    (FLUSH1_i => RDATA_A1_o[6]) = 0;
+    (FLUSH1_i => RDATA_A1_o[7]) = 0;
+    (FLUSH2_i => RDATA_A2_o[0]) = 0;
+    (FLUSH2_i => RDATA_A2_o[1]) = 0;
+    (FLUSH2_i => RDATA_A2_o[2]) = 0;
+    (FLUSH2_i => RDATA_A2_o[3]) = 0;
+    (FLUSH2_i => RDATA_A2_o[4]) = 0;
+    (FLUSH2_i => RDATA_A2_o[5]) = 0;
+    (FLUSH2_i => RDATA_A2_o[6]) = 0;
+    (FLUSH2_i => RDATA_A2_o[7]) = 0;    
+		(negedge RESET_ni => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+		(negedge RESET_ni => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+		(negedge RESET_ni => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+		(negedge RESET_ni => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+		(posedge CLK_A1_i => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+		(posedge CLK_B1_i => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+		(posedge CLK_A2_i => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+		(posedge CLK_B2_i => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+    $setuphold(posedge CLK_A1_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_A1_i, FLUSH1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, WEN_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, REN_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, BE_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, ADDR_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, WDATA_A1_i, 0, 0);
+    $setuphold(posedge CLK_B1_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_B1_i, WEN_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, REN_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, BE_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, ADDR_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, WDATA_B1_i, 0, 0);
+    $setuphold(posedge CLK_A2_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_A2_i, FLUSH2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, WEN_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, REN_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, BE_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, ADDR_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, WDATA_A2_i, 0, 0);
+    $setuphold(posedge CLK_B2_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_B2_i, WEN_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, REN_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, BE_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, ADDR_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, WDATA_B2_i, 0, 0);
+	endspecify
+`endif
+
+endmodule
+
+module TDP36K_FIFO_SYNC_WR_X9_RD_X18_nonsplit (
+    RESET_ni,
+    WEN_A1_i,   WEN_B1_i,
+    REN_A1_i,   REN_B1_i,
+    CLK_A1_i,   CLK_B1_i,
+    BE_A1_i,    BE_B1_i,
+    ADDR_A1_i,  ADDR_B1_i,
+    WDATA_A1_i, WDATA_B1_i,
+    RDATA_A1_o, RDATA_B1_o,
+    FLUSH1_i,
+    WEN_A2_i,   WEN_B2_i,
+    REN_A2_i,   REN_B2_i,
+    CLK_A2_i,   CLK_B2_i,
+    BE_A2_i,    BE_B2_i,
+    ADDR_A2_i,  ADDR_B2_i,
+    WDATA_A2_i, WDATA_B2_i,
+    RDATA_A2_o, RDATA_B2_o,
+    FLUSH2_i
+);
+    parameter [80:0] MODE_BITS = 81'd0;
+
+    input wire  RESET_ni;
+    input wire  WEN_A1_i, WEN_B1_i;
+    input wire  REN_A1_i, REN_B1_i;
+    input wire  WEN_A2_i, WEN_B2_i;
+    input wire  REN_A2_i, REN_B2_i;
+
+    (* clkbuf_sink *)
+    input wire  CLK_A1_i;
+    (* clkbuf_sink *)
+    input wire  CLK_B1_i;
+    (* clkbuf_sink *)
+    input wire  CLK_A2_i;
+    (* clkbuf_sink *)
+    input wire  CLK_B2_i;
+
+    input wire  [ 1:0] BE_A1_i,    BE_B1_i;
+    input wire  [14:0] ADDR_A1_i,  ADDR_B1_i;
+    input wire  [17:0] WDATA_A1_i, WDATA_B1_i;
+    output wire [17:0] RDATA_A1_o, RDATA_B1_o;
+
+    input wire  FLUSH1_i;
+
+    input wire  [ 1:0] BE_A2_i,    BE_B2_i;
+    input wire  [13:0] ADDR_A2_i,  ADDR_B2_i;
+    input wire  [17:0] WDATA_A2_i, WDATA_B2_i;
+    output wire [17:0] RDATA_A2_o, RDATA_B2_o;
+
+    input wire  FLUSH2_i;
+
+    TDP36K #(.MODE_BITS(MODE_BITS)) bram (
+        .RESET_ni   (RESET_ni),   
+        .WEN_A1_i   (WEN_A1_i),   .WEN_B1_i   (WEN_B1_i),
+        .REN_A1_i   (REN_A1_i),   .REN_B1_i   (REN_B1_i),
+        .CLK_A1_i   (CLK_A1_i),   .CLK_B1_i   (CLK_B1_i),
+        .BE_A1_i    (BE_A1_i),    .BE_B1_i    (BE_B1_i),
+        .ADDR_A1_i  (ADDR_A1_i),  .ADDR_B1_i  (ADDR_B1_i),
+        .WDATA_A1_i (WDATA_A1_i), .WDATA_B1_i (WDATA_B1_i),
+        .RDATA_A1_o (RDATA_A1_o), .RDATA_B1_o (RDATA_B1_o),
+        .FLUSH1_i   (FLUSH1_i),
+        .WEN_A2_i   (WEN_A2_i),   .WEN_B2_i   (WEN_B2_i),
+        .REN_A2_i   (REN_A2_i),   .REN_B2_i   (REN_B2_i),
+        .CLK_A2_i   (CLK_A2_i),   .CLK_B2_i   (CLK_B2_i),
+        .BE_A2_i    (BE_A2_i),    .BE_B2_i    (BE_B2_i),
+        .ADDR_A2_i  (ADDR_A2_i),  .ADDR_B2_i  (ADDR_B2_i),
+        .WDATA_A2_i (WDATA_A2_i), .WDATA_B2_i (WDATA_B2_i),
+        .RDATA_A2_o (RDATA_A2_o), .RDATA_B2_o (RDATA_B2_o),
+        .FLUSH2_i   (FLUSH2_i)
+    );
+
+`ifdef SDF_SIM
+	specify
+    (FLUSH1_i => RDATA_A1_o[0]) = 0;
+    (FLUSH1_i => RDATA_A1_o[1]) = 0;
+    (FLUSH1_i => RDATA_A1_o[2]) = 0;
+    (FLUSH1_i => RDATA_A1_o[3]) = 0;
+    (FLUSH1_i => RDATA_A1_o[4]) = 0;
+    (FLUSH1_i => RDATA_A1_o[5]) = 0;
+    (FLUSH1_i => RDATA_A1_o[6]) = 0;
+    (FLUSH1_i => RDATA_A1_o[7]) = 0;
+    (FLUSH2_i => RDATA_A2_o[0]) = 0;
+    (FLUSH2_i => RDATA_A2_o[1]) = 0;
+    (FLUSH2_i => RDATA_A2_o[2]) = 0;
+    (FLUSH2_i => RDATA_A2_o[3]) = 0;
+    (FLUSH2_i => RDATA_A2_o[4]) = 0;
+    (FLUSH2_i => RDATA_A2_o[5]) = 0;
+    (FLUSH2_i => RDATA_A2_o[6]) = 0;
+    (FLUSH2_i => RDATA_A2_o[7]) = 0;    
+		(negedge RESET_ni => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+		(negedge RESET_ni => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+		(negedge RESET_ni => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+		(negedge RESET_ni => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+		(posedge CLK_A1_i => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+		(posedge CLK_B1_i => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+		(posedge CLK_A2_i => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+		(posedge CLK_B2_i => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+    $setuphold(posedge CLK_A1_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_A1_i, FLUSH1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, WEN_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, REN_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, BE_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, ADDR_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, WDATA_A1_i, 0, 0);
+    $setuphold(posedge CLK_B1_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_B1_i, WEN_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, REN_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, BE_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, ADDR_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, WDATA_B1_i, 0, 0);
+    $setuphold(posedge CLK_A2_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_A2_i, FLUSH2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, WEN_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, REN_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, BE_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, ADDR_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, WDATA_A2_i, 0, 0);
+    $setuphold(posedge CLK_B2_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_B2_i, WEN_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, REN_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, BE_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, ADDR_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, WDATA_B2_i, 0, 0);
+	endspecify
+`endif
+
+endmodule
+
+module TDP36K_FIFO_SYNC_WR_X9_RD_X36_nonsplit (
+    RESET_ni,
+    WEN_A1_i,   WEN_B1_i,
+    REN_A1_i,   REN_B1_i,
+    CLK_A1_i,   CLK_B1_i,
+    BE_A1_i,    BE_B1_i,
+    ADDR_A1_i,  ADDR_B1_i,
+    WDATA_A1_i, WDATA_B1_i,
+    RDATA_A1_o, RDATA_B1_o,
+    FLUSH1_i,
+    WEN_A2_i,   WEN_B2_i,
+    REN_A2_i,   REN_B2_i,
+    CLK_A2_i,   CLK_B2_i,
+    BE_A2_i,    BE_B2_i,
+    ADDR_A2_i,  ADDR_B2_i,
+    WDATA_A2_i, WDATA_B2_i,
+    RDATA_A2_o, RDATA_B2_o,
+    FLUSH2_i
+);
+    parameter [80:0] MODE_BITS = 81'd0;
+
+    input wire  RESET_ni;
+    input wire  WEN_A1_i, WEN_B1_i;
+    input wire  REN_A1_i, REN_B1_i;
+    input wire  WEN_A2_i, WEN_B2_i;
+    input wire  REN_A2_i, REN_B2_i;
+
+    (* clkbuf_sink *)
+    input wire  CLK_A1_i;
+    (* clkbuf_sink *)
+    input wire  CLK_B1_i;
+    (* clkbuf_sink *)
+    input wire  CLK_A2_i;
+    (* clkbuf_sink *)
+    input wire  CLK_B2_i;
+
+    input wire  [ 1:0] BE_A1_i,    BE_B1_i;
+    input wire  [14:0] ADDR_A1_i,  ADDR_B1_i;
+    input wire  [17:0] WDATA_A1_i, WDATA_B1_i;
+    output wire [17:0] RDATA_A1_o, RDATA_B1_o;
+
+    input wire  FLUSH1_i;
+
+    input wire  [ 1:0] BE_A2_i,    BE_B2_i;
+    input wire  [13:0] ADDR_A2_i,  ADDR_B2_i;
+    input wire  [17:0] WDATA_A2_i, WDATA_B2_i;
+    output wire [17:0] RDATA_A2_o, RDATA_B2_o;
+
+    input wire  FLUSH2_i;
+
+    TDP36K #(.MODE_BITS(MODE_BITS)) bram (
+        .RESET_ni   (RESET_ni),   
+        .WEN_A1_i   (WEN_A1_i),   .WEN_B1_i   (WEN_B1_i),
+        .REN_A1_i   (REN_A1_i),   .REN_B1_i   (REN_B1_i),
+        .CLK_A1_i   (CLK_A1_i),   .CLK_B1_i   (CLK_B1_i),
+        .BE_A1_i    (BE_A1_i),    .BE_B1_i    (BE_B1_i),
+        .ADDR_A1_i  (ADDR_A1_i),  .ADDR_B1_i  (ADDR_B1_i),
+        .WDATA_A1_i (WDATA_A1_i), .WDATA_B1_i (WDATA_B1_i),
+        .RDATA_A1_o (RDATA_A1_o), .RDATA_B1_o (RDATA_B1_o),
+        .FLUSH1_i   (FLUSH1_i),
+        .WEN_A2_i   (WEN_A2_i),   .WEN_B2_i   (WEN_B2_i),
+        .REN_A2_i   (REN_A2_i),   .REN_B2_i   (REN_B2_i),
+        .CLK_A2_i   (CLK_A2_i),   .CLK_B2_i   (CLK_B2_i),
+        .BE_A2_i    (BE_A2_i),    .BE_B2_i    (BE_B2_i),
+        .ADDR_A2_i  (ADDR_A2_i),  .ADDR_B2_i  (ADDR_B2_i),
+        .WDATA_A2_i (WDATA_A2_i), .WDATA_B2_i (WDATA_B2_i),
+        .RDATA_A2_o (RDATA_A2_o), .RDATA_B2_o (RDATA_B2_o),
+        .FLUSH2_i   (FLUSH2_i)
+    );
+
+`ifdef SDF_SIM
+	specify
+    (FLUSH1_i => RDATA_A1_o[0]) = 0;
+    (FLUSH1_i => RDATA_A1_o[1]) = 0;
+    (FLUSH1_i => RDATA_A1_o[2]) = 0;
+    (FLUSH1_i => RDATA_A1_o[3]) = 0;
+    (FLUSH1_i => RDATA_A1_o[4]) = 0;
+    (FLUSH1_i => RDATA_A1_o[5]) = 0;
+    (FLUSH1_i => RDATA_A1_o[6]) = 0;
+    (FLUSH1_i => RDATA_A1_o[7]) = 0;
+    (FLUSH2_i => RDATA_A2_o[0]) = 0;
+    (FLUSH2_i => RDATA_A2_o[1]) = 0;
+    (FLUSH2_i => RDATA_A2_o[2]) = 0;
+    (FLUSH2_i => RDATA_A2_o[3]) = 0;
+    (FLUSH2_i => RDATA_A2_o[4]) = 0;
+    (FLUSH2_i => RDATA_A2_o[5]) = 0;
+    (FLUSH2_i => RDATA_A2_o[6]) = 0;
+    (FLUSH2_i => RDATA_A2_o[7]) = 0;    
+		(negedge RESET_ni => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+		(negedge RESET_ni => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+		(negedge RESET_ni => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+		(negedge RESET_ni => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+		(posedge CLK_A1_i => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+		(posedge CLK_B1_i => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+		(posedge CLK_A2_i => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+		(posedge CLK_B2_i => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+    $setuphold(posedge CLK_A1_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_A1_i, FLUSH1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, WEN_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, REN_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, BE_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, ADDR_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, WDATA_A1_i, 0, 0);
+    $setuphold(posedge CLK_B1_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_B1_i, WEN_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, REN_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, BE_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, ADDR_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, WDATA_B1_i, 0, 0);
+    $setuphold(posedge CLK_A2_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_A2_i, FLUSH2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, WEN_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, REN_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, BE_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, ADDR_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, WDATA_A2_i, 0, 0);
+    $setuphold(posedge CLK_B2_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_B2_i, WEN_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, REN_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, BE_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, ADDR_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, WDATA_B2_i, 0, 0);
+	endspecify
+`endif
+
+endmodule
+
+module TDP36K_FIFO_SYNC_WR_X18_RD_X9_nonsplit (
+    RESET_ni,
+    WEN_A1_i,   WEN_B1_i,
+    REN_A1_i,   REN_B1_i,
+    CLK_A1_i,   CLK_B1_i,
+    BE_A1_i,    BE_B1_i,
+    ADDR_A1_i,  ADDR_B1_i,
+    WDATA_A1_i, WDATA_B1_i,
+    RDATA_A1_o, RDATA_B1_o,
+    FLUSH1_i,
+    WEN_A2_i,   WEN_B2_i,
+    REN_A2_i,   REN_B2_i,
+    CLK_A2_i,   CLK_B2_i,
+    BE_A2_i,    BE_B2_i,
+    ADDR_A2_i,  ADDR_B2_i,
+    WDATA_A2_i, WDATA_B2_i,
+    RDATA_A2_o, RDATA_B2_o,
+    FLUSH2_i
+);
+    parameter [80:0] MODE_BITS = 81'd0;
+
+    input wire  RESET_ni;
+    input wire  WEN_A1_i, WEN_B1_i;
+    input wire  REN_A1_i, REN_B1_i;
+    input wire  WEN_A2_i, WEN_B2_i;
+    input wire  REN_A2_i, REN_B2_i;
+
+    (* clkbuf_sink *)
+    input wire  CLK_A1_i;
+    (* clkbuf_sink *)
+    input wire  CLK_B1_i;
+    (* clkbuf_sink *)
+    input wire  CLK_A2_i;
+    (* clkbuf_sink *)
+    input wire  CLK_B2_i;
+
+    input wire  [ 1:0] BE_A1_i,    BE_B1_i;
+    input wire  [14:0] ADDR_A1_i,  ADDR_B1_i;
+    input wire  [17:0] WDATA_A1_i, WDATA_B1_i;
+    output wire [17:0] RDATA_A1_o, RDATA_B1_o;
+
+    input wire  FLUSH1_i;
+
+    input wire  [ 1:0] BE_A2_i,    BE_B2_i;
+    input wire  [13:0] ADDR_A2_i,  ADDR_B2_i;
+    input wire  [17:0] WDATA_A2_i, WDATA_B2_i;
+    output wire [17:0] RDATA_A2_o, RDATA_B2_o;
+
+    input wire  FLUSH2_i;
+
+    TDP36K #(.MODE_BITS(MODE_BITS)) bram (
+        .RESET_ni   (RESET_ni),   
+        .WEN_A1_i   (WEN_A1_i),   .WEN_B1_i   (WEN_B1_i),
+        .REN_A1_i   (REN_A1_i),   .REN_B1_i   (REN_B1_i),
+        .CLK_A1_i   (CLK_A1_i),   .CLK_B1_i   (CLK_B1_i),
+        .BE_A1_i    (BE_A1_i),    .BE_B1_i    (BE_B1_i),
+        .ADDR_A1_i  (ADDR_A1_i),  .ADDR_B1_i  (ADDR_B1_i),
+        .WDATA_A1_i (WDATA_A1_i), .WDATA_B1_i (WDATA_B1_i),
+        .RDATA_A1_o (RDATA_A1_o), .RDATA_B1_o (RDATA_B1_o),
+        .FLUSH1_i   (FLUSH1_i),
+        .WEN_A2_i   (WEN_A2_i),   .WEN_B2_i   (WEN_B2_i),
+        .REN_A2_i   (REN_A2_i),   .REN_B2_i   (REN_B2_i),
+        .CLK_A2_i   (CLK_A2_i),   .CLK_B2_i   (CLK_B2_i),
+        .BE_A2_i    (BE_A2_i),    .BE_B2_i    (BE_B2_i),
+        .ADDR_A2_i  (ADDR_A2_i),  .ADDR_B2_i  (ADDR_B2_i),
+        .WDATA_A2_i (WDATA_A2_i), .WDATA_B2_i (WDATA_B2_i),
+        .RDATA_A2_o (RDATA_A2_o), .RDATA_B2_o (RDATA_B2_o),
+        .FLUSH2_i   (FLUSH2_i)
+    );
+
+`ifdef SDF_SIM
+	specify
+    (FLUSH1_i => RDATA_A1_o[0]) = 0;
+    (FLUSH1_i => RDATA_A1_o[1]) = 0;
+    (FLUSH1_i => RDATA_A1_o[2]) = 0;
+    (FLUSH1_i => RDATA_A1_o[3]) = 0;
+    (FLUSH1_i => RDATA_A1_o[4]) = 0;
+    (FLUSH1_i => RDATA_A1_o[5]) = 0;
+    (FLUSH1_i => RDATA_A1_o[6]) = 0;
+    (FLUSH1_i => RDATA_A1_o[7]) = 0;
+    (FLUSH2_i => RDATA_A2_o[0]) = 0;
+    (FLUSH2_i => RDATA_A2_o[1]) = 0;
+    (FLUSH2_i => RDATA_A2_o[2]) = 0;
+    (FLUSH2_i => RDATA_A2_o[3]) = 0;
+    (FLUSH2_i => RDATA_A2_o[4]) = 0;
+    (FLUSH2_i => RDATA_A2_o[5]) = 0;
+    (FLUSH2_i => RDATA_A2_o[6]) = 0;
+    (FLUSH2_i => RDATA_A2_o[7]) = 0;    
+		(negedge RESET_ni => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+		(negedge RESET_ni => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+		(negedge RESET_ni => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+		(negedge RESET_ni => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+		(posedge CLK_A1_i => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+		(posedge CLK_B1_i => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+		(posedge CLK_A2_i => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+		(posedge CLK_B2_i => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+    $setuphold(posedge CLK_A1_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_A1_i, FLUSH1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, WEN_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, REN_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, BE_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, ADDR_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, WDATA_A1_i, 0, 0);
+    $setuphold(posedge CLK_B1_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_B1_i, WEN_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, REN_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, BE_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, ADDR_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, WDATA_B1_i, 0, 0);
+    $setuphold(posedge CLK_A2_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_A2_i, FLUSH2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, WEN_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, REN_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, BE_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, ADDR_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, WDATA_A2_i, 0, 0);
+    $setuphold(posedge CLK_B2_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_B2_i, WEN_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, REN_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, BE_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, ADDR_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, WDATA_B2_i, 0, 0);
+	endspecify
+`endif
+
+endmodule
+
+module TDP36K_FIFO_SYNC_WR_X18_RD_X18_nonsplit (
+    RESET_ni,
+    WEN_A1_i,   WEN_B1_i,
+    REN_A1_i,   REN_B1_i,
+    CLK_A1_i,   CLK_B1_i,
+    BE_A1_i,    BE_B1_i,
+    ADDR_A1_i,  ADDR_B1_i,
+    WDATA_A1_i, WDATA_B1_i,
+    RDATA_A1_o, RDATA_B1_o,
+    FLUSH1_i,
+    WEN_A2_i,   WEN_B2_i,
+    REN_A2_i,   REN_B2_i,
+    CLK_A2_i,   CLK_B2_i,
+    BE_A2_i,    BE_B2_i,
+    ADDR_A2_i,  ADDR_B2_i,
+    WDATA_A2_i, WDATA_B2_i,
+    RDATA_A2_o, RDATA_B2_o,
+    FLUSH2_i
+);
+    parameter [80:0] MODE_BITS = 81'd0;
+
+    input wire  RESET_ni;
+    input wire  WEN_A1_i, WEN_B1_i;
+    input wire  REN_A1_i, REN_B1_i;
+    input wire  WEN_A2_i, WEN_B2_i;
+    input wire  REN_A2_i, REN_B2_i;
+
+    (* clkbuf_sink *)
+    input wire  CLK_A1_i;
+    (* clkbuf_sink *)
+    input wire  CLK_B1_i;
+    (* clkbuf_sink *)
+    input wire  CLK_A2_i;
+    (* clkbuf_sink *)
+    input wire  CLK_B2_i;
+
+    input wire  [ 1:0] BE_A1_i,    BE_B1_i;
+    input wire  [14:0] ADDR_A1_i,  ADDR_B1_i;
+    input wire  [17:0] WDATA_A1_i, WDATA_B1_i;
+    output wire [17:0] RDATA_A1_o, RDATA_B1_o;
+
+    input wire  FLUSH1_i;
+
+    input wire  [ 1:0] BE_A2_i,    BE_B2_i;
+    input wire  [13:0] ADDR_A2_i,  ADDR_B2_i;
+    input wire  [17:0] WDATA_A2_i, WDATA_B2_i;
+    output wire [17:0] RDATA_A2_o, RDATA_B2_o;
+
+    input wire  FLUSH2_i;
+
+    TDP36K #(.MODE_BITS(MODE_BITS)) bram (
+        .RESET_ni   (RESET_ni),   
+        .WEN_A1_i   (WEN_A1_i),   .WEN_B1_i   (WEN_B1_i),
+        .REN_A1_i   (REN_A1_i),   .REN_B1_i   (REN_B1_i),
+        .CLK_A1_i   (CLK_A1_i),   .CLK_B1_i   (CLK_B1_i),
+        .BE_A1_i    (BE_A1_i),    .BE_B1_i    (BE_B1_i),
+        .ADDR_A1_i  (ADDR_A1_i),  .ADDR_B1_i  (ADDR_B1_i),
+        .WDATA_A1_i (WDATA_A1_i), .WDATA_B1_i (WDATA_B1_i),
+        .RDATA_A1_o (RDATA_A1_o), .RDATA_B1_o (RDATA_B1_o),
+        .FLUSH1_i   (FLUSH1_i),
+        .WEN_A2_i   (WEN_A2_i),   .WEN_B2_i   (WEN_B2_i),
+        .REN_A2_i   (REN_A2_i),   .REN_B2_i   (REN_B2_i),
+        .CLK_A2_i   (CLK_A2_i),   .CLK_B2_i   (CLK_B2_i),
+        .BE_A2_i    (BE_A2_i),    .BE_B2_i    (BE_B2_i),
+        .ADDR_A2_i  (ADDR_A2_i),  .ADDR_B2_i  (ADDR_B2_i),
+        .WDATA_A2_i (WDATA_A2_i), .WDATA_B2_i (WDATA_B2_i),
+        .RDATA_A2_o (RDATA_A2_o), .RDATA_B2_o (RDATA_B2_o),
+        .FLUSH2_i   (FLUSH2_i)
+    );
+
+`ifdef SDF_SIM
+	specify
+    (FLUSH1_i => RDATA_A1_o[0]) = 0;
+    (FLUSH1_i => RDATA_A1_o[1]) = 0;
+    (FLUSH1_i => RDATA_A1_o[2]) = 0;
+    (FLUSH1_i => RDATA_A1_o[3]) = 0;
+    (FLUSH1_i => RDATA_A1_o[4]) = 0;
+    (FLUSH1_i => RDATA_A1_o[5]) = 0;
+    (FLUSH1_i => RDATA_A1_o[6]) = 0;
+    (FLUSH1_i => RDATA_A1_o[7]) = 0;
+    (FLUSH2_i => RDATA_A2_o[0]) = 0;
+    (FLUSH2_i => RDATA_A2_o[1]) = 0;
+    (FLUSH2_i => RDATA_A2_o[2]) = 0;
+    (FLUSH2_i => RDATA_A2_o[3]) = 0;
+    (FLUSH2_i => RDATA_A2_o[4]) = 0;
+    (FLUSH2_i => RDATA_A2_o[5]) = 0;
+    (FLUSH2_i => RDATA_A2_o[6]) = 0;
+    (FLUSH2_i => RDATA_A2_o[7]) = 0;    
+		(negedge RESET_ni => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+		(negedge RESET_ni => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+		(negedge RESET_ni => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+		(negedge RESET_ni => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+		(posedge CLK_A1_i => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+		(posedge CLK_B1_i => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+		(posedge CLK_A2_i => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+		(posedge CLK_B2_i => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+    $setuphold(posedge CLK_A1_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_A1_i, FLUSH1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, WEN_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, REN_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, BE_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, ADDR_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, WDATA_A1_i, 0, 0);
+    $setuphold(posedge CLK_B1_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_B1_i, WEN_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, REN_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, BE_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, ADDR_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, WDATA_B1_i, 0, 0);
+    $setuphold(posedge CLK_A2_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_A2_i, FLUSH2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, WEN_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, REN_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, BE_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, ADDR_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, WDATA_A2_i, 0, 0);
+    $setuphold(posedge CLK_B2_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_B2_i, WEN_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, REN_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, BE_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, ADDR_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, WDATA_B2_i, 0, 0);
+	endspecify
+`endif
+
+endmodule
+
+module TDP36K_FIFO_SYNC_WR_X18_RD_X36_nonsplit (
+    RESET_ni,
+    WEN_A1_i,   WEN_B1_i,
+    REN_A1_i,   REN_B1_i,
+    CLK_A1_i,   CLK_B1_i,
+    BE_A1_i,    BE_B1_i,
+    ADDR_A1_i,  ADDR_B1_i,
+    WDATA_A1_i, WDATA_B1_i,
+    RDATA_A1_o, RDATA_B1_o,
+    FLUSH1_i,
+    WEN_A2_i,   WEN_B2_i,
+    REN_A2_i,   REN_B2_i,
+    CLK_A2_i,   CLK_B2_i,
+    BE_A2_i,    BE_B2_i,
+    ADDR_A2_i,  ADDR_B2_i,
+    WDATA_A2_i, WDATA_B2_i,
+    RDATA_A2_o, RDATA_B2_o,
+    FLUSH2_i
+);
+    parameter [80:0] MODE_BITS = 81'd0;
+
+    input wire  RESET_ni;
+    input wire  WEN_A1_i, WEN_B1_i;
+    input wire  REN_A1_i, REN_B1_i;
+    input wire  WEN_A2_i, WEN_B2_i;
+    input wire  REN_A2_i, REN_B2_i;
+
+    (* clkbuf_sink *)
+    input wire  CLK_A1_i;
+    (* clkbuf_sink *)
+    input wire  CLK_B1_i;
+    (* clkbuf_sink *)
+    input wire  CLK_A2_i;
+    (* clkbuf_sink *)
+    input wire  CLK_B2_i;
+
+    input wire  [ 1:0] BE_A1_i,    BE_B1_i;
+    input wire  [14:0] ADDR_A1_i,  ADDR_B1_i;
+    input wire  [17:0] WDATA_A1_i, WDATA_B1_i;
+    output wire [17:0] RDATA_A1_o, RDATA_B1_o;
+
+    input wire  FLUSH1_i;
+
+    input wire  [ 1:0] BE_A2_i,    BE_B2_i;
+    input wire  [13:0] ADDR_A2_i,  ADDR_B2_i;
+    input wire  [17:0] WDATA_A2_i, WDATA_B2_i;
+    output wire [17:0] RDATA_A2_o, RDATA_B2_o;
+
+    input wire  FLUSH2_i;
+
+    TDP36K #(.MODE_BITS(MODE_BITS)) bram (
+        .RESET_ni   (RESET_ni),   
+        .WEN_A1_i   (WEN_A1_i),   .WEN_B1_i   (WEN_B1_i),
+        .REN_A1_i   (REN_A1_i),   .REN_B1_i   (REN_B1_i),
+        .CLK_A1_i   (CLK_A1_i),   .CLK_B1_i   (CLK_B1_i),
+        .BE_A1_i    (BE_A1_i),    .BE_B1_i    (BE_B1_i),
+        .ADDR_A1_i  (ADDR_A1_i),  .ADDR_B1_i  (ADDR_B1_i),
+        .WDATA_A1_i (WDATA_A1_i), .WDATA_B1_i (WDATA_B1_i),
+        .RDATA_A1_o (RDATA_A1_o), .RDATA_B1_o (RDATA_B1_o),
+        .FLUSH1_i   (FLUSH1_i),
+        .WEN_A2_i   (WEN_A2_i),   .WEN_B2_i   (WEN_B2_i),
+        .REN_A2_i   (REN_A2_i),   .REN_B2_i   (REN_B2_i),
+        .CLK_A2_i   (CLK_A2_i),   .CLK_B2_i   (CLK_B2_i),
+        .BE_A2_i    (BE_A2_i),    .BE_B2_i    (BE_B2_i),
+        .ADDR_A2_i  (ADDR_A2_i),  .ADDR_B2_i  (ADDR_B2_i),
+        .WDATA_A2_i (WDATA_A2_i), .WDATA_B2_i (WDATA_B2_i),
+        .RDATA_A2_o (RDATA_A2_o), .RDATA_B2_o (RDATA_B2_o),
+        .FLUSH2_i   (FLUSH2_i)
+    );
+
+`ifdef SDF_SIM
+	specify
+    (FLUSH1_i => RDATA_A1_o[0]) = 0;
+    (FLUSH1_i => RDATA_A1_o[1]) = 0;
+    (FLUSH1_i => RDATA_A1_o[2]) = 0;
+    (FLUSH1_i => RDATA_A1_o[3]) = 0;
+    (FLUSH1_i => RDATA_A1_o[4]) = 0;
+    (FLUSH1_i => RDATA_A1_o[5]) = 0;
+    (FLUSH1_i => RDATA_A1_o[6]) = 0;
+    (FLUSH1_i => RDATA_A1_o[7]) = 0;
+    (FLUSH2_i => RDATA_A2_o[0]) = 0;
+    (FLUSH2_i => RDATA_A2_o[1]) = 0;
+    (FLUSH2_i => RDATA_A2_o[2]) = 0;
+    (FLUSH2_i => RDATA_A2_o[3]) = 0;
+    (FLUSH2_i => RDATA_A2_o[4]) = 0;
+    (FLUSH2_i => RDATA_A2_o[5]) = 0;
+    (FLUSH2_i => RDATA_A2_o[6]) = 0;
+    (FLUSH2_i => RDATA_A2_o[7]) = 0;    
+		(negedge RESET_ni => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+		(negedge RESET_ni => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+		(negedge RESET_ni => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+		(negedge RESET_ni => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+		(posedge CLK_A1_i => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+		(posedge CLK_B1_i => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+		(posedge CLK_A2_i => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+		(posedge CLK_B2_i => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+    $setuphold(posedge CLK_A1_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_A1_i, FLUSH1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, WEN_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, REN_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, BE_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, ADDR_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, WDATA_A1_i, 0, 0);
+    $setuphold(posedge CLK_B1_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_B1_i, WEN_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, REN_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, BE_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, ADDR_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, WDATA_B1_i, 0, 0);
+    $setuphold(posedge CLK_A2_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_A2_i, FLUSH2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, WEN_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, REN_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, BE_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, ADDR_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, WDATA_A2_i, 0, 0);
+    $setuphold(posedge CLK_B2_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_B2_i, WEN_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, REN_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, BE_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, ADDR_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, WDATA_B2_i, 0, 0);
+	endspecify
+`endif
+
+endmodule
+
+module TDP36K_FIFO_SYNC_WR_X36_RD_X9_nonsplit (
+    RESET_ni,
+    WEN_A1_i,   WEN_B1_i,
+    REN_A1_i,   REN_B1_i,
+    CLK_A1_i,   CLK_B1_i,
+    BE_A1_i,    BE_B1_i,
+    ADDR_A1_i,  ADDR_B1_i,
+    WDATA_A1_i, WDATA_B1_i,
+    RDATA_A1_o, RDATA_B1_o,
+    FLUSH1_i,
+    WEN_A2_i,   WEN_B2_i,
+    REN_A2_i,   REN_B2_i,
+    CLK_A2_i,   CLK_B2_i,
+    BE_A2_i,    BE_B2_i,
+    ADDR_A2_i,  ADDR_B2_i,
+    WDATA_A2_i, WDATA_B2_i,
+    RDATA_A2_o, RDATA_B2_o,
+    FLUSH2_i
+);
+    parameter [80:0] MODE_BITS = 81'd0;
+
+    input wire  RESET_ni;
+    input wire  WEN_A1_i, WEN_B1_i;
+    input wire  REN_A1_i, REN_B1_i;
+    input wire  WEN_A2_i, WEN_B2_i;
+    input wire  REN_A2_i, REN_B2_i;
+
+    (* clkbuf_sink *)
+    input wire  CLK_A1_i;
+    (* clkbuf_sink *)
+    input wire  CLK_B1_i;
+    (* clkbuf_sink *)
+    input wire  CLK_A2_i;
+    (* clkbuf_sink *)
+    input wire  CLK_B2_i;
+
+    input wire  [ 1:0] BE_A1_i,    BE_B1_i;
+    input wire  [14:0] ADDR_A1_i,  ADDR_B1_i;
+    input wire  [17:0] WDATA_A1_i, WDATA_B1_i;
+    output wire [17:0] RDATA_A1_o, RDATA_B1_o;
+
+    input wire  FLUSH1_i;
+
+    input wire  [ 1:0] BE_A2_i,    BE_B2_i;
+    input wire  [13:0] ADDR_A2_i,  ADDR_B2_i;
+    input wire  [17:0] WDATA_A2_i, WDATA_B2_i;
+    output wire [17:0] RDATA_A2_o, RDATA_B2_o;
+
+    input wire  FLUSH2_i;
+
+    TDP36K #(.MODE_BITS(MODE_BITS)) bram (
+        .RESET_ni   (RESET_ni),   
+        .WEN_A1_i   (WEN_A1_i),   .WEN_B1_i   (WEN_B1_i),
+        .REN_A1_i   (REN_A1_i),   .REN_B1_i   (REN_B1_i),
+        .CLK_A1_i   (CLK_A1_i),   .CLK_B1_i   (CLK_B1_i),
+        .BE_A1_i    (BE_A1_i),    .BE_B1_i    (BE_B1_i),
+        .ADDR_A1_i  (ADDR_A1_i),  .ADDR_B1_i  (ADDR_B1_i),
+        .WDATA_A1_i (WDATA_A1_i), .WDATA_B1_i (WDATA_B1_i),
+        .RDATA_A1_o (RDATA_A1_o), .RDATA_B1_o (RDATA_B1_o),
+        .FLUSH1_i   (FLUSH1_i),
+        .WEN_A2_i   (WEN_A2_i),   .WEN_B2_i   (WEN_B2_i),
+        .REN_A2_i   (REN_A2_i),   .REN_B2_i   (REN_B2_i),
+        .CLK_A2_i   (CLK_A2_i),   .CLK_B2_i   (CLK_B2_i),
+        .BE_A2_i    (BE_A2_i),    .BE_B2_i    (BE_B2_i),
+        .ADDR_A2_i  (ADDR_A2_i),  .ADDR_B2_i  (ADDR_B2_i),
+        .WDATA_A2_i (WDATA_A2_i), .WDATA_B2_i (WDATA_B2_i),
+        .RDATA_A2_o (RDATA_A2_o), .RDATA_B2_o (RDATA_B2_o),
+        .FLUSH2_i   (FLUSH2_i)
+    );
+
+`ifdef SDF_SIM
+	specify
+    (FLUSH1_i => RDATA_A1_o[0]) = 0;
+    (FLUSH1_i => RDATA_A1_o[1]) = 0;
+    (FLUSH1_i => RDATA_A1_o[2]) = 0;
+    (FLUSH1_i => RDATA_A1_o[3]) = 0;
+    (FLUSH1_i => RDATA_A1_o[4]) = 0;
+    (FLUSH1_i => RDATA_A1_o[5]) = 0;
+    (FLUSH1_i => RDATA_A1_o[6]) = 0;
+    (FLUSH1_i => RDATA_A1_o[7]) = 0;
+    (FLUSH2_i => RDATA_A2_o[0]) = 0;
+    (FLUSH2_i => RDATA_A2_o[1]) = 0;
+    (FLUSH2_i => RDATA_A2_o[2]) = 0;
+    (FLUSH2_i => RDATA_A2_o[3]) = 0;
+    (FLUSH2_i => RDATA_A2_o[4]) = 0;
+    (FLUSH2_i => RDATA_A2_o[5]) = 0;
+    (FLUSH2_i => RDATA_A2_o[6]) = 0;
+    (FLUSH2_i => RDATA_A2_o[7]) = 0;    
+		(negedge RESET_ni => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+		(negedge RESET_ni => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+		(negedge RESET_ni => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+		(negedge RESET_ni => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+		(posedge CLK_A1_i => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+		(posedge CLK_B1_i => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+		(posedge CLK_A2_i => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+		(posedge CLK_B2_i => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+    $setuphold(posedge CLK_A1_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_A1_i, FLUSH1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, WEN_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, REN_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, BE_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, ADDR_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, WDATA_A1_i, 0, 0);
+    $setuphold(posedge CLK_B1_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_B1_i, WEN_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, REN_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, BE_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, ADDR_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, WDATA_B1_i, 0, 0);
+    $setuphold(posedge CLK_A2_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_A2_i, FLUSH2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, WEN_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, REN_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, BE_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, ADDR_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, WDATA_A2_i, 0, 0);
+    $setuphold(posedge CLK_B2_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_B2_i, WEN_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, REN_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, BE_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, ADDR_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, WDATA_B2_i, 0, 0);
+	endspecify
+`endif
+
+endmodule
+
+module TDP36K_FIFO_SYNC_WR_X36_RD_X18_nonsplit (
+    RESET_ni,
+    WEN_A1_i,   WEN_B1_i,
+    REN_A1_i,   REN_B1_i,
+    CLK_A1_i,   CLK_B1_i,
+    BE_A1_i,    BE_B1_i,
+    ADDR_A1_i,  ADDR_B1_i,
+    WDATA_A1_i, WDATA_B1_i,
+    RDATA_A1_o, RDATA_B1_o,
+    FLUSH1_i,
+    WEN_A2_i,   WEN_B2_i,
+    REN_A2_i,   REN_B2_i,
+    CLK_A2_i,   CLK_B2_i,
+    BE_A2_i,    BE_B2_i,
+    ADDR_A2_i,  ADDR_B2_i,
+    WDATA_A2_i, WDATA_B2_i,
+    RDATA_A2_o, RDATA_B2_o,
+    FLUSH2_i
+);
+    parameter [80:0] MODE_BITS = 81'd0;
+
+    input wire  RESET_ni;
+    input wire  WEN_A1_i, WEN_B1_i;
+    input wire  REN_A1_i, REN_B1_i;
+    input wire  WEN_A2_i, WEN_B2_i;
+    input wire  REN_A2_i, REN_B2_i;
+
+    (* clkbuf_sink *)
+    input wire  CLK_A1_i;
+    (* clkbuf_sink *)
+    input wire  CLK_B1_i;
+    (* clkbuf_sink *)
+    input wire  CLK_A2_i;
+    (* clkbuf_sink *)
+    input wire  CLK_B2_i;
+
+    input wire  [ 1:0] BE_A1_i,    BE_B1_i;
+    input wire  [14:0] ADDR_A1_i,  ADDR_B1_i;
+    input wire  [17:0] WDATA_A1_i, WDATA_B1_i;
+    output wire [17:0] RDATA_A1_o, RDATA_B1_o;
+
+    input wire  FLUSH1_i;
+
+    input wire  [ 1:0] BE_A2_i,    BE_B2_i;
+    input wire  [13:0] ADDR_A2_i,  ADDR_B2_i;
+    input wire  [17:0] WDATA_A2_i, WDATA_B2_i;
+    output wire [17:0] RDATA_A2_o, RDATA_B2_o;
+
+    input wire  FLUSH2_i;
+
+    TDP36K #(.MODE_BITS(MODE_BITS)) bram (
+        .RESET_ni   (RESET_ni),   
+        .WEN_A1_i   (WEN_A1_i),   .WEN_B1_i   (WEN_B1_i),
+        .REN_A1_i   (REN_A1_i),   .REN_B1_i   (REN_B1_i),
+        .CLK_A1_i   (CLK_A1_i),   .CLK_B1_i   (CLK_B1_i),
+        .BE_A1_i    (BE_A1_i),    .BE_B1_i    (BE_B1_i),
+        .ADDR_A1_i  (ADDR_A1_i),  .ADDR_B1_i  (ADDR_B1_i),
+        .WDATA_A1_i (WDATA_A1_i), .WDATA_B1_i (WDATA_B1_i),
+        .RDATA_A1_o (RDATA_A1_o), .RDATA_B1_o (RDATA_B1_o),
+        .FLUSH1_i   (FLUSH1_i),
+        .WEN_A2_i   (WEN_A2_i),   .WEN_B2_i   (WEN_B2_i),
+        .REN_A2_i   (REN_A2_i),   .REN_B2_i   (REN_B2_i),
+        .CLK_A2_i   (CLK_A2_i),   .CLK_B2_i   (CLK_B2_i),
+        .BE_A2_i    (BE_A2_i),    .BE_B2_i    (BE_B2_i),
+        .ADDR_A2_i  (ADDR_A2_i),  .ADDR_B2_i  (ADDR_B2_i),
+        .WDATA_A2_i (WDATA_A2_i), .WDATA_B2_i (WDATA_B2_i),
+        .RDATA_A2_o (RDATA_A2_o), .RDATA_B2_o (RDATA_B2_o),
+        .FLUSH2_i   (FLUSH2_i)
+    );
+
+`ifdef SDF_SIM
+	specify
+    (FLUSH1_i => RDATA_A1_o[0]) = 0;
+    (FLUSH1_i => RDATA_A1_o[1]) = 0;
+    (FLUSH1_i => RDATA_A1_o[2]) = 0;
+    (FLUSH1_i => RDATA_A1_o[3]) = 0;
+    (FLUSH1_i => RDATA_A1_o[4]) = 0;
+    (FLUSH1_i => RDATA_A1_o[5]) = 0;
+    (FLUSH1_i => RDATA_A1_o[6]) = 0;
+    (FLUSH1_i => RDATA_A1_o[7]) = 0;
+    (FLUSH2_i => RDATA_A2_o[0]) = 0;
+    (FLUSH2_i => RDATA_A2_o[1]) = 0;
+    (FLUSH2_i => RDATA_A2_o[2]) = 0;
+    (FLUSH2_i => RDATA_A2_o[3]) = 0;
+    (FLUSH2_i => RDATA_A2_o[4]) = 0;
+    (FLUSH2_i => RDATA_A2_o[5]) = 0;
+    (FLUSH2_i => RDATA_A2_o[6]) = 0;
+    (FLUSH2_i => RDATA_A2_o[7]) = 0;    
+		(negedge RESET_ni => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+		(negedge RESET_ni => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+		(negedge RESET_ni => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+		(negedge RESET_ni => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+		(posedge CLK_A1_i => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+		(posedge CLK_B1_i => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+		(posedge CLK_A2_i => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+		(posedge CLK_B2_i => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+    $setuphold(posedge CLK_A1_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_A1_i, FLUSH1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, WEN_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, REN_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, BE_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, ADDR_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, WDATA_A1_i, 0, 0);
+    $setuphold(posedge CLK_B1_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_B1_i, WEN_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, REN_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, BE_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, ADDR_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, WDATA_B1_i, 0, 0);
+    $setuphold(posedge CLK_A2_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_A2_i, FLUSH2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, WEN_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, REN_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, BE_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, ADDR_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, WDATA_A2_i, 0, 0);
+    $setuphold(posedge CLK_B2_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_B2_i, WEN_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, REN_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, BE_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, ADDR_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, WDATA_B2_i, 0, 0);
+	endspecify
+`endif
+
+endmodule
+
+module TDP36K_FIFO_SYNC_WR_X36_RD_X36_nonsplit (
+    RESET_ni,
+    WEN_A1_i,   WEN_B1_i,
+    REN_A1_i,   REN_B1_i,
+    CLK_A1_i,   CLK_B1_i,
+    BE_A1_i,    BE_B1_i,
+    ADDR_A1_i,  ADDR_B1_i,
+    WDATA_A1_i, WDATA_B1_i,
+    RDATA_A1_o, RDATA_B1_o,
+    FLUSH1_i,
+    WEN_A2_i,   WEN_B2_i,
+    REN_A2_i,   REN_B2_i,
+    CLK_A2_i,   CLK_B2_i,
+    BE_A2_i,    BE_B2_i,
+    ADDR_A2_i,  ADDR_B2_i,
+    WDATA_A2_i, WDATA_B2_i,
+    RDATA_A2_o, RDATA_B2_o,
+    FLUSH2_i
+);
+    parameter [80:0] MODE_BITS = 81'd0;
+
+    input wire  RESET_ni;
+    input wire  WEN_A1_i, WEN_B1_i;
+    input wire  REN_A1_i, REN_B1_i;
+    input wire  WEN_A2_i, WEN_B2_i;
+    input wire  REN_A2_i, REN_B2_i;
+
+    (* clkbuf_sink *)
+    input wire  CLK_A1_i;
+    (* clkbuf_sink *)
+    input wire  CLK_B1_i;
+    (* clkbuf_sink *)
+    input wire  CLK_A2_i;
+    (* clkbuf_sink *)
+    input wire  CLK_B2_i;
+
+    input wire  [ 1:0] BE_A1_i,    BE_B1_i;
+    input wire  [14:0] ADDR_A1_i,  ADDR_B1_i;
+    input wire  [17:0] WDATA_A1_i, WDATA_B1_i;
+    output wire [17:0] RDATA_A1_o, RDATA_B1_o;
+
+    input wire  FLUSH1_i;
+
+    input wire  [ 1:0] BE_A2_i,    BE_B2_i;
+    input wire  [13:0] ADDR_A2_i,  ADDR_B2_i;
+    input wire  [17:0] WDATA_A2_i, WDATA_B2_i;
+    output wire [17:0] RDATA_A2_o, RDATA_B2_o;
+
+    input wire  FLUSH2_i;
+
+    TDP36K #(.MODE_BITS(MODE_BITS)) bram (
+        .RESET_ni   (RESET_ni),   
+        .WEN_A1_i   (WEN_A1_i),   .WEN_B1_i   (WEN_B1_i),
+        .REN_A1_i   (REN_A1_i),   .REN_B1_i   (REN_B1_i),
+        .CLK_A1_i   (CLK_A1_i),   .CLK_B1_i   (CLK_B1_i),
+        .BE_A1_i    (BE_A1_i),    .BE_B1_i    (BE_B1_i),
+        .ADDR_A1_i  (ADDR_A1_i),  .ADDR_B1_i  (ADDR_B1_i),
+        .WDATA_A1_i (WDATA_A1_i), .WDATA_B1_i (WDATA_B1_i),
+        .RDATA_A1_o (RDATA_A1_o), .RDATA_B1_o (RDATA_B1_o),
+        .FLUSH1_i   (FLUSH1_i),
+        .WEN_A2_i   (WEN_A2_i),   .WEN_B2_i   (WEN_B2_i),
+        .REN_A2_i   (REN_A2_i),   .REN_B2_i   (REN_B2_i),
+        .CLK_A2_i   (CLK_A2_i),   .CLK_B2_i   (CLK_B2_i),
+        .BE_A2_i    (BE_A2_i),    .BE_B2_i    (BE_B2_i),
+        .ADDR_A2_i  (ADDR_A2_i),  .ADDR_B2_i  (ADDR_B2_i),
+        .WDATA_A2_i (WDATA_A2_i), .WDATA_B2_i (WDATA_B2_i),
+        .RDATA_A2_o (RDATA_A2_o), .RDATA_B2_o (RDATA_B2_o),
+        .FLUSH2_i   (FLUSH2_i)
+    );
+
+`ifdef SDF_SIM
+	specify
+    (FLUSH1_i => RDATA_A1_o[0]) = 0;
+    (FLUSH1_i => RDATA_A1_o[1]) = 0;
+    (FLUSH1_i => RDATA_A1_o[2]) = 0;
+    (FLUSH1_i => RDATA_A1_o[3]) = 0;
+    (FLUSH1_i => RDATA_A1_o[4]) = 0;
+    (FLUSH1_i => RDATA_A1_o[5]) = 0;
+    (FLUSH1_i => RDATA_A1_o[6]) = 0;
+    (FLUSH1_i => RDATA_A1_o[7]) = 0;
+    (FLUSH2_i => RDATA_A2_o[0]) = 0;
+    (FLUSH2_i => RDATA_A2_o[1]) = 0;
+    (FLUSH2_i => RDATA_A2_o[2]) = 0;
+    (FLUSH2_i => RDATA_A2_o[3]) = 0;
+    (FLUSH2_i => RDATA_A2_o[4]) = 0;
+    (FLUSH2_i => RDATA_A2_o[5]) = 0;
+    (FLUSH2_i => RDATA_A2_o[6]) = 0;
+    (FLUSH2_i => RDATA_A2_o[7]) = 0;    
+		(negedge RESET_ni => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+		(negedge RESET_ni => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+		(negedge RESET_ni => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+		(negedge RESET_ni => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+		(posedge CLK_A1_i => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+		(posedge CLK_B1_i => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+		(posedge CLK_A2_i => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+		(posedge CLK_B2_i => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+    $setuphold(posedge CLK_A1_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_A1_i, FLUSH1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, WEN_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, REN_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, BE_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, ADDR_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, WDATA_A1_i, 0, 0);
+    $setuphold(posedge CLK_B1_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_B1_i, WEN_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, REN_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, BE_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, ADDR_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, WDATA_B1_i, 0, 0);
+    $setuphold(posedge CLK_A2_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_A2_i, FLUSH2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, WEN_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, REN_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, BE_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, ADDR_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, WDATA_A2_i, 0, 0);
+    $setuphold(posedge CLK_B2_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_B2_i, WEN_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, REN_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, BE_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, ADDR_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, WDATA_B2_i, 0, 0);
+	endspecify
+`endif
+
+endmodule
+
+
+module TDP36K_FIFO_SYNC_WR_X9_RD_X9_split (
+    RESET_ni,
+    WEN_A1_i,   WEN_B1_i,
+    REN_A1_i,   REN_B1_i,
+    CLK_A1_i,   CLK_B1_i,
+    BE_A1_i,    BE_B1_i,
+    ADDR_A1_i,  ADDR_B1_i,
+    WDATA_A1_i, WDATA_B1_i,
+    RDATA_A1_o, RDATA_B1_o,
+    FLUSH1_i,
+    WEN_A2_i,   WEN_B2_i,
+    REN_A2_i,   REN_B2_i,
+    CLK_A2_i,   CLK_B2_i,
+    BE_A2_i,    BE_B2_i,
+    ADDR_A2_i,  ADDR_B2_i,
+    WDATA_A2_i, WDATA_B2_i,
+    RDATA_A2_o, RDATA_B2_o,
+    FLUSH2_i
+);
+    parameter [80:0] MODE_BITS = 81'd0;
+
+    input wire  RESET_ni;
+    input wire  WEN_A1_i, WEN_B1_i;
+    input wire  REN_A1_i, REN_B1_i;
+    input wire  WEN_A2_i, WEN_B2_i;
+    input wire  REN_A2_i, REN_B2_i;
+
+    (* clkbuf_sink *)
+    input wire  CLK_A1_i;
+    (* clkbuf_sink *)
+    input wire  CLK_B1_i;
+    (* clkbuf_sink *)
+    input wire  CLK_A2_i;
+    (* clkbuf_sink *)
+    input wire  CLK_B2_i;
+
+    input wire  [ 1:0] BE_A1_i,    BE_B1_i;
+    input wire  [14:0] ADDR_A1_i,  ADDR_B1_i;
+    input wire  [17:0] WDATA_A1_i, WDATA_B1_i;
+    output wire [17:0] RDATA_A1_o, RDATA_B1_o;
+
+    input wire  FLUSH1_i;
+
+    input wire  [ 1:0] BE_A2_i,    BE_B2_i;
+    input wire  [13:0] ADDR_A2_i,  ADDR_B2_i;
+    input wire  [17:0] WDATA_A2_i, WDATA_B2_i;
+    output wire [17:0] RDATA_A2_o, RDATA_B2_o;
+
+    input wire  FLUSH2_i;
+
+    TDP36K #(.MODE_BITS(MODE_BITS)) bram (
+        .RESET_ni   (RESET_ni),   
+        .WEN_A1_i   (WEN_A1_i),   .WEN_B1_i   (WEN_B1_i),
+        .REN_A1_i   (REN_A1_i),   .REN_B1_i   (REN_B1_i),
+        .CLK_A1_i   (CLK_A1_i),   .CLK_B1_i   (CLK_B1_i),
+        .BE_A1_i    (BE_A1_i),    .BE_B1_i    (BE_B1_i),
+        .ADDR_A1_i  (ADDR_A1_i),  .ADDR_B1_i  (ADDR_B1_i),
+        .WDATA_A1_i (WDATA_A1_i), .WDATA_B1_i (WDATA_B1_i),
+        .RDATA_A1_o (RDATA_A1_o), .RDATA_B1_o (RDATA_B1_o),
+        .FLUSH1_i   (FLUSH1_i),
+        .WEN_A2_i   (WEN_A2_i),   .WEN_B2_i   (WEN_B2_i),
+        .REN_A2_i   (REN_A2_i),   .REN_B2_i   (REN_B2_i),
+        .CLK_A2_i   (CLK_A2_i),   .CLK_B2_i   (CLK_B2_i),
+        .BE_A2_i    (BE_A2_i),    .BE_B2_i    (BE_B2_i),
+        .ADDR_A2_i  (ADDR_A2_i),  .ADDR_B2_i  (ADDR_B2_i),
+        .WDATA_A2_i (WDATA_A2_i), .WDATA_B2_i (WDATA_B2_i),
+        .RDATA_A2_o (RDATA_A2_o), .RDATA_B2_o (RDATA_B2_o),
+        .FLUSH2_i   (FLUSH2_i)
+    );
+
+`ifdef SDF_SIM
+	specify
+    (FLUSH1_i => RDATA_A1_o[0]) = 0;
+    (FLUSH1_i => RDATA_A1_o[1]) = 0;
+    (FLUSH1_i => RDATA_A1_o[2]) = 0;
+    (FLUSH1_i => RDATA_A1_o[3]) = 0;
+    (FLUSH1_i => RDATA_A1_o[4]) = 0;
+    (FLUSH1_i => RDATA_A1_o[5]) = 0;
+    (FLUSH1_i => RDATA_A1_o[6]) = 0;
+    (FLUSH1_i => RDATA_A1_o[7]) = 0;
+    (FLUSH2_i => RDATA_A2_o[0]) = 0;
+    (FLUSH2_i => RDATA_A2_o[1]) = 0;
+    (FLUSH2_i => RDATA_A2_o[2]) = 0;
+    (FLUSH2_i => RDATA_A2_o[3]) = 0;
+    (FLUSH2_i => RDATA_A2_o[4]) = 0;
+    (FLUSH2_i => RDATA_A2_o[5]) = 0;
+    (FLUSH2_i => RDATA_A2_o[6]) = 0;
+    (FLUSH2_i => RDATA_A2_o[7]) = 0;    
+		(negedge RESET_ni => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+		(negedge RESET_ni => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+		(negedge RESET_ni => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+		(negedge RESET_ni => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+		(posedge CLK_A1_i => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+		(posedge CLK_B1_i => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+		(posedge CLK_A2_i => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+		(posedge CLK_B2_i => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+    $setuphold(posedge CLK_A1_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_A1_i, FLUSH1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, WEN_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, REN_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, BE_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, ADDR_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, WDATA_A1_i, 0, 0);
+    $setuphold(posedge CLK_B1_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_B1_i, WEN_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, REN_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, BE_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, ADDR_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, WDATA_B1_i, 0, 0);
+    $setuphold(posedge CLK_A2_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_A2_i, FLUSH2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, WEN_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, REN_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, BE_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, ADDR_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, WDATA_A2_i, 0, 0);
+    $setuphold(posedge CLK_B2_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_B2_i, WEN_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, REN_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, BE_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, ADDR_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, WDATA_B2_i, 0, 0);
+	endspecify
+`endif
+
+endmodule
+
+module TDP36K_FIFO_SYNC_WR_X9_RD_X18_split (
+    RESET_ni,
+    WEN_A1_i,   WEN_B1_i,
+    REN_A1_i,   REN_B1_i,
+    CLK_A1_i,   CLK_B1_i,
+    BE_A1_i,    BE_B1_i,
+    ADDR_A1_i,  ADDR_B1_i,
+    WDATA_A1_i, WDATA_B1_i,
+    RDATA_A1_o, RDATA_B1_o,
+    FLUSH1_i,
+    WEN_A2_i,   WEN_B2_i,
+    REN_A2_i,   REN_B2_i,
+    CLK_A2_i,   CLK_B2_i,
+    BE_A2_i,    BE_B2_i,
+    ADDR_A2_i,  ADDR_B2_i,
+    WDATA_A2_i, WDATA_B2_i,
+    RDATA_A2_o, RDATA_B2_o,
+    FLUSH2_i
+);
+    parameter [80:0] MODE_BITS = 81'd0;
+
+    input wire  RESET_ni;
+    input wire  WEN_A1_i, WEN_B1_i;
+    input wire  REN_A1_i, REN_B1_i;
+    input wire  WEN_A2_i, WEN_B2_i;
+    input wire  REN_A2_i, REN_B2_i;
+
+    (* clkbuf_sink *)
+    input wire  CLK_A1_i;
+    (* clkbuf_sink *)
+    input wire  CLK_B1_i;
+    (* clkbuf_sink *)
+    input wire  CLK_A2_i;
+    (* clkbuf_sink *)
+    input wire  CLK_B2_i;
+
+    input wire  [ 1:0] BE_A1_i,    BE_B1_i;
+    input wire  [14:0] ADDR_A1_i,  ADDR_B1_i;
+    input wire  [17:0] WDATA_A1_i, WDATA_B1_i;
+    output wire [17:0] RDATA_A1_o, RDATA_B1_o;
+
+    input wire  FLUSH1_i;
+
+    input wire  [ 1:0] BE_A2_i,    BE_B2_i;
+    input wire  [13:0] ADDR_A2_i,  ADDR_B2_i;
+    input wire  [17:0] WDATA_A2_i, WDATA_B2_i;
+    output wire [17:0] RDATA_A2_o, RDATA_B2_o;
+
+    input wire  FLUSH2_i;
+
+    TDP36K #(.MODE_BITS(MODE_BITS)) bram (
+        .RESET_ni   (RESET_ni),   
+        .WEN_A1_i   (WEN_A1_i),   .WEN_B1_i   (WEN_B1_i),
+        .REN_A1_i   (REN_A1_i),   .REN_B1_i   (REN_B1_i),
+        .CLK_A1_i   (CLK_A1_i),   .CLK_B1_i   (CLK_B1_i),
+        .BE_A1_i    (BE_A1_i),    .BE_B1_i    (BE_B1_i),
+        .ADDR_A1_i  (ADDR_A1_i),  .ADDR_B1_i  (ADDR_B1_i),
+        .WDATA_A1_i (WDATA_A1_i), .WDATA_B1_i (WDATA_B1_i),
+        .RDATA_A1_o (RDATA_A1_o), .RDATA_B1_o (RDATA_B1_o),
+        .FLUSH1_i   (FLUSH1_i),
+        .WEN_A2_i   (WEN_A2_i),   .WEN_B2_i   (WEN_B2_i),
+        .REN_A2_i   (REN_A2_i),   .REN_B2_i   (REN_B2_i),
+        .CLK_A2_i   (CLK_A2_i),   .CLK_B2_i   (CLK_B2_i),
+        .BE_A2_i    (BE_A2_i),    .BE_B2_i    (BE_B2_i),
+        .ADDR_A2_i  (ADDR_A2_i),  .ADDR_B2_i  (ADDR_B2_i),
+        .WDATA_A2_i (WDATA_A2_i), .WDATA_B2_i (WDATA_B2_i),
+        .RDATA_A2_o (RDATA_A2_o), .RDATA_B2_o (RDATA_B2_o),
+        .FLUSH2_i   (FLUSH2_i)
+    );
+
+`ifdef SDF_SIM
+	specify
+    (FLUSH1_i => RDATA_A1_o[0]) = 0;
+    (FLUSH1_i => RDATA_A1_o[1]) = 0;
+    (FLUSH1_i => RDATA_A1_o[2]) = 0;
+    (FLUSH1_i => RDATA_A1_o[3]) = 0;
+    (FLUSH1_i => RDATA_A1_o[4]) = 0;
+    (FLUSH1_i => RDATA_A1_o[5]) = 0;
+    (FLUSH1_i => RDATA_A1_o[6]) = 0;
+    (FLUSH1_i => RDATA_A1_o[7]) = 0;
+    (FLUSH2_i => RDATA_A2_o[0]) = 0;
+    (FLUSH2_i => RDATA_A2_o[1]) = 0;
+    (FLUSH2_i => RDATA_A2_o[2]) = 0;
+    (FLUSH2_i => RDATA_A2_o[3]) = 0;
+    (FLUSH2_i => RDATA_A2_o[4]) = 0;
+    (FLUSH2_i => RDATA_A2_o[5]) = 0;
+    (FLUSH2_i => RDATA_A2_o[6]) = 0;
+    (FLUSH2_i => RDATA_A2_o[7]) = 0;    
+		(negedge RESET_ni => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+		(negedge RESET_ni => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+		(negedge RESET_ni => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+		(negedge RESET_ni => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+		(posedge CLK_A1_i => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+		(posedge CLK_B1_i => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+		(posedge CLK_A2_i => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+		(posedge CLK_B2_i => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+    $setuphold(posedge CLK_A1_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_A1_i, FLUSH1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, WEN_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, REN_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, BE_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, ADDR_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, WDATA_A1_i, 0, 0);
+    $setuphold(posedge CLK_B1_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_B1_i, WEN_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, REN_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, BE_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, ADDR_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, WDATA_B1_i, 0, 0);
+    $setuphold(posedge CLK_A2_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_A2_i, FLUSH2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, WEN_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, REN_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, BE_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, ADDR_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, WDATA_A2_i, 0, 0);
+    $setuphold(posedge CLK_B2_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_B2_i, WEN_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, REN_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, BE_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, ADDR_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, WDATA_B2_i, 0, 0);
+	endspecify
+`endif
+
+endmodule
+
+module TDP36K_FIFO_SYNC_WR_X18_RD_X9_split (
+    RESET_ni,
+    WEN_A1_i,   WEN_B1_i,
+    REN_A1_i,   REN_B1_i,
+    CLK_A1_i,   CLK_B1_i,
+    BE_A1_i,    BE_B1_i,
+    ADDR_A1_i,  ADDR_B1_i,
+    WDATA_A1_i, WDATA_B1_i,
+    RDATA_A1_o, RDATA_B1_o,
+    FLUSH1_i,
+    WEN_A2_i,   WEN_B2_i,
+    REN_A2_i,   REN_B2_i,
+    CLK_A2_i,   CLK_B2_i,
+    BE_A2_i,    BE_B2_i,
+    ADDR_A2_i,  ADDR_B2_i,
+    WDATA_A2_i, WDATA_B2_i,
+    RDATA_A2_o, RDATA_B2_o,
+    FLUSH2_i
+);
+    parameter [80:0] MODE_BITS = 81'd0;
+
+    input wire  RESET_ni;
+    input wire  WEN_A1_i, WEN_B1_i;
+    input wire  REN_A1_i, REN_B1_i;
+    input wire  WEN_A2_i, WEN_B2_i;
+    input wire  REN_A2_i, REN_B2_i;
+
+    (* clkbuf_sink *)
+    input wire  CLK_A1_i;
+    (* clkbuf_sink *)
+    input wire  CLK_B1_i;
+    (* clkbuf_sink *)
+    input wire  CLK_A2_i;
+    (* clkbuf_sink *)
+    input wire  CLK_B2_i;
+
+    input wire  [ 1:0] BE_A1_i,    BE_B1_i;
+    input wire  [14:0] ADDR_A1_i,  ADDR_B1_i;
+    input wire  [17:0] WDATA_A1_i, WDATA_B1_i;
+    output wire [17:0] RDATA_A1_o, RDATA_B1_o;
+
+    input wire  FLUSH1_i;
+
+    input wire  [ 1:0] BE_A2_i,    BE_B2_i;
+    input wire  [13:0] ADDR_A2_i,  ADDR_B2_i;
+    input wire  [17:0] WDATA_A2_i, WDATA_B2_i;
+    output wire [17:0] RDATA_A2_o, RDATA_B2_o;
+
+    input wire  FLUSH2_i;
+
+    TDP36K #(.MODE_BITS(MODE_BITS)) bram (
+        .RESET_ni   (RESET_ni),   
+        .WEN_A1_i   (WEN_A1_i),   .WEN_B1_i   (WEN_B1_i),
+        .REN_A1_i   (REN_A1_i),   .REN_B1_i   (REN_B1_i),
+        .CLK_A1_i   (CLK_A1_i),   .CLK_B1_i   (CLK_B1_i),
+        .BE_A1_i    (BE_A1_i),    .BE_B1_i    (BE_B1_i),
+        .ADDR_A1_i  (ADDR_A1_i),  .ADDR_B1_i  (ADDR_B1_i),
+        .WDATA_A1_i (WDATA_A1_i), .WDATA_B1_i (WDATA_B1_i),
+        .RDATA_A1_o (RDATA_A1_o), .RDATA_B1_o (RDATA_B1_o),
+        .FLUSH1_i   (FLUSH1_i),
+        .WEN_A2_i   (WEN_A2_i),   .WEN_B2_i   (WEN_B2_i),
+        .REN_A2_i   (REN_A2_i),   .REN_B2_i   (REN_B2_i),
+        .CLK_A2_i   (CLK_A2_i),   .CLK_B2_i   (CLK_B2_i),
+        .BE_A2_i    (BE_A2_i),    .BE_B2_i    (BE_B2_i),
+        .ADDR_A2_i  (ADDR_A2_i),  .ADDR_B2_i  (ADDR_B2_i),
+        .WDATA_A2_i (WDATA_A2_i), .WDATA_B2_i (WDATA_B2_i),
+        .RDATA_A2_o (RDATA_A2_o), .RDATA_B2_o (RDATA_B2_o),
+        .FLUSH2_i   (FLUSH2_i)
+    );
+
+`ifdef SDF_SIM
+	specify
+    (FLUSH1_i => RDATA_A1_o[0]) = 0;
+    (FLUSH1_i => RDATA_A1_o[1]) = 0;
+    (FLUSH1_i => RDATA_A1_o[2]) = 0;
+    (FLUSH1_i => RDATA_A1_o[3]) = 0;
+    (FLUSH1_i => RDATA_A1_o[4]) = 0;
+    (FLUSH1_i => RDATA_A1_o[5]) = 0;
+    (FLUSH1_i => RDATA_A1_o[6]) = 0;
+    (FLUSH1_i => RDATA_A1_o[7]) = 0;
+    (FLUSH2_i => RDATA_A2_o[0]) = 0;
+    (FLUSH2_i => RDATA_A2_o[1]) = 0;
+    (FLUSH2_i => RDATA_A2_o[2]) = 0;
+    (FLUSH2_i => RDATA_A2_o[3]) = 0;
+    (FLUSH2_i => RDATA_A2_o[4]) = 0;
+    (FLUSH2_i => RDATA_A2_o[5]) = 0;
+    (FLUSH2_i => RDATA_A2_o[6]) = 0;
+    (FLUSH2_i => RDATA_A2_o[7]) = 0;    
+		(negedge RESET_ni => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+		(negedge RESET_ni => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+		(negedge RESET_ni => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+		(negedge RESET_ni => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+		(posedge CLK_A1_i => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+		(posedge CLK_B1_i => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+		(posedge CLK_A2_i => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+		(posedge CLK_B2_i => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+    $setuphold(posedge CLK_A1_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_A1_i, FLUSH1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, WEN_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, REN_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, BE_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, ADDR_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, WDATA_A1_i, 0, 0);
+    $setuphold(posedge CLK_B1_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_B1_i, WEN_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, REN_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, BE_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, ADDR_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, WDATA_B1_i, 0, 0);
+    $setuphold(posedge CLK_A2_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_A2_i, FLUSH2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, WEN_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, REN_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, BE_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, ADDR_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, WDATA_A2_i, 0, 0);
+    $setuphold(posedge CLK_B2_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_B2_i, WEN_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, REN_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, BE_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, ADDR_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, WDATA_B2_i, 0, 0);
+	endspecify
+`endif
+
+endmodule
+
+module TDP36K_FIFO_SYNC_WR_X18_RD_X18_split (
+    RESET_ni,
+    WEN_A1_i,   WEN_B1_i,
+    REN_A1_i,   REN_B1_i,
+    CLK_A1_i,   CLK_B1_i,
+    BE_A1_i,    BE_B1_i,
+    ADDR_A1_i,  ADDR_B1_i,
+    WDATA_A1_i, WDATA_B1_i,
+    RDATA_A1_o, RDATA_B1_o,
+    FLUSH1_i,
+    WEN_A2_i,   WEN_B2_i,
+    REN_A2_i,   REN_B2_i,
+    CLK_A2_i,   CLK_B2_i,
+    BE_A2_i,    BE_B2_i,
+    ADDR_A2_i,  ADDR_B2_i,
+    WDATA_A2_i, WDATA_B2_i,
+    RDATA_A2_o, RDATA_B2_o,
+    FLUSH2_i
+);
+    parameter [80:0] MODE_BITS = 81'd0;
+
+    input wire  RESET_ni;
+    input wire  WEN_A1_i, WEN_B1_i;
+    input wire  REN_A1_i, REN_B1_i;
+    input wire  WEN_A2_i, WEN_B2_i;
+    input wire  REN_A2_i, REN_B2_i;
+
+    (* clkbuf_sink *)
+    input wire  CLK_A1_i;
+    (* clkbuf_sink *)
+    input wire  CLK_B1_i;
+    (* clkbuf_sink *)
+    input wire  CLK_A2_i;
+    (* clkbuf_sink *)
+    input wire  CLK_B2_i;
+
+    input wire  [ 1:0] BE_A1_i,    BE_B1_i;
+    input wire  [14:0] ADDR_A1_i,  ADDR_B1_i;
+    input wire  [17:0] WDATA_A1_i, WDATA_B1_i;
+    output wire [17:0] RDATA_A1_o, RDATA_B1_o;
+
+    input wire  FLUSH1_i;
+
+    input wire  [ 1:0] BE_A2_i,    BE_B2_i;
+    input wire  [13:0] ADDR_A2_i,  ADDR_B2_i;
+    input wire  [17:0] WDATA_A2_i, WDATA_B2_i;
+    output wire [17:0] RDATA_A2_o, RDATA_B2_o;
+
+    input wire  FLUSH2_i;
+
+    TDP36K #(.MODE_BITS(MODE_BITS)) bram (
+        .RESET_ni   (RESET_ni),   
+        .WEN_A1_i   (WEN_A1_i),   .WEN_B1_i   (WEN_B1_i),
+        .REN_A1_i   (REN_A1_i),   .REN_B1_i   (REN_B1_i),
+        .CLK_A1_i   (CLK_A1_i),   .CLK_B1_i   (CLK_B1_i),
+        .BE_A1_i    (BE_A1_i),    .BE_B1_i    (BE_B1_i),
+        .ADDR_A1_i  (ADDR_A1_i),  .ADDR_B1_i  (ADDR_B1_i),
+        .WDATA_A1_i (WDATA_A1_i), .WDATA_B1_i (WDATA_B1_i),
+        .RDATA_A1_o (RDATA_A1_o), .RDATA_B1_o (RDATA_B1_o),
+        .FLUSH1_i   (FLUSH1_i),
+        .WEN_A2_i   (WEN_A2_i),   .WEN_B2_i   (WEN_B2_i),
+        .REN_A2_i   (REN_A2_i),   .REN_B2_i   (REN_B2_i),
+        .CLK_A2_i   (CLK_A2_i),   .CLK_B2_i   (CLK_B2_i),
+        .BE_A2_i    (BE_A2_i),    .BE_B2_i    (BE_B2_i),
+        .ADDR_A2_i  (ADDR_A2_i),  .ADDR_B2_i  (ADDR_B2_i),
+        .WDATA_A2_i (WDATA_A2_i), .WDATA_B2_i (WDATA_B2_i),
+        .RDATA_A2_o (RDATA_A2_o), .RDATA_B2_o (RDATA_B2_o),
+        .FLUSH2_i   (FLUSH2_i)
+    );
+
+`ifdef SDF_SIM
+	specify
+    (FLUSH1_i => RDATA_A1_o[0]) = 0;
+    (FLUSH1_i => RDATA_A1_o[1]) = 0;
+    (FLUSH1_i => RDATA_A1_o[2]) = 0;
+    (FLUSH1_i => RDATA_A1_o[3]) = 0;
+    (FLUSH1_i => RDATA_A1_o[4]) = 0;
+    (FLUSH1_i => RDATA_A1_o[5]) = 0;
+    (FLUSH1_i => RDATA_A1_o[6]) = 0;
+    (FLUSH1_i => RDATA_A1_o[7]) = 0;
+    (FLUSH2_i => RDATA_A2_o[0]) = 0;
+    (FLUSH2_i => RDATA_A2_o[1]) = 0;
+    (FLUSH2_i => RDATA_A2_o[2]) = 0;
+    (FLUSH2_i => RDATA_A2_o[3]) = 0;
+    (FLUSH2_i => RDATA_A2_o[4]) = 0;
+    (FLUSH2_i => RDATA_A2_o[5]) = 0;
+    (FLUSH2_i => RDATA_A2_o[6]) = 0;
+    (FLUSH2_i => RDATA_A2_o[7]) = 0;    
+		(negedge RESET_ni => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+		(negedge RESET_ni => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+		(negedge RESET_ni => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+		(negedge RESET_ni => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+		(posedge CLK_A1_i => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+		(posedge CLK_B1_i => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+		(posedge CLK_A2_i => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+		(posedge CLK_B2_i => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+    $setuphold(posedge CLK_A1_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_A1_i, FLUSH1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, WEN_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, REN_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, BE_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, ADDR_A1_i, 0, 0);
+		$setuphold(posedge CLK_A1_i, WDATA_A1_i, 0, 0);
+    $setuphold(posedge CLK_B1_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_B1_i, WEN_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, REN_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, BE_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, ADDR_B1_i, 0, 0);
+		$setuphold(posedge CLK_B1_i, WDATA_B1_i, 0, 0);
+    $setuphold(posedge CLK_A2_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_A2_i, FLUSH2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, WEN_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, REN_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, BE_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, ADDR_A2_i, 0, 0);
+		$setuphold(posedge CLK_A2_i, WDATA_A2_i, 0, 0);
+    $setuphold(posedge CLK_B2_i, RESET_ni, 0, 0);
+		$setuphold(posedge CLK_B2_i, WEN_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, REN_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, BE_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, ADDR_B2_i, 0, 0);
+		$setuphold(posedge CLK_B2_i, WDATA_B2_i, 0, 0);
+	endspecify
+`endif
+
+endmodule
\ No newline at end of file
diff --git a/ql-qlf-plugin/qlf_k6n10f/cells_sim.v b/ql-qlf-plugin/qlf_k6n10f/cells_sim.v
index 26ac9ae..d2fc0a7 100644
--- a/ql-qlf-plugin/qlf_k6n10f/cells_sim.v
+++ b/ql-qlf-plugin/qlf_k6n10f/cells_sim.v
@@ -14,6 +14,8 @@
 //
 // SPDX-License-Identifier: Apache-2.0
 
+`timescale 1ps/1ps
+
 `default_nettype none
 
 (* abc9_flop, lib_whitebox *)
@@ -27,6 +29,11 @@
     initial Q <= 1'b0;
     always @(posedge C)
         Q <= D;
+		
+    specify
+      (posedge C => (Q +: D)) = 0;
+      $setuphold(posedge C, D, 0, 0);
+    endspecify
 
 endmodule
 
@@ -40,87 +47,15 @@
 );
     assign sumout = p ^ cin;
     assign cout = p ? cin : g;
-
-endmodule
-
-(* abc9_box, lib_whitebox *)
-module adder_lut5(
-   output wire lut5_out,
-   (* abc9_carry *)
-   output wire cout,
-   input wire [0:4] in,
-   (* abc9_carry *)
-   input wire cin
-);
-    parameter [0:15] LUT=0;
-    parameter IN2_IS_CIN = 0;
-
-    wire [0:4] li = (IN2_IS_CIN) ? {in[0], in[1], cin, in[3], in[4]} : {in[0], in[1], in[2], in[3],in[4]};
-
-    // Output function
-    wire [0:15] s1 = li[0] ?
-        {LUT[0], LUT[2], LUT[4], LUT[6], LUT[8], LUT[10], LUT[12], LUT[14], LUT[16], LUT[18], LUT[20], LUT[22], LUT[24], LUT[26], LUT[28], LUT[30]}:
-        {LUT[1], LUT[3], LUT[5], LUT[7], LUT[9], LUT[11], LUT[13], LUT[15], LUT[17], LUT[19], LUT[21], LUT[23], LUT[25], LUT[27], LUT[29], LUT[31]};
-
-    wire [0:7] s2 = li[1] ? {s1[0], s1[2], s1[4], s1[6], s1[8], s1[10], s1[12], s1[14]} :
-                            {s1[1], s1[3], s1[5], s1[7], s1[9], s1[11], s1[13], s1[15]};
-
-    wire [0:3] s3 = li[2] ? {s2[0], s2[2], s2[4], s2[6]} : {s2[1], s2[3], s2[5], s2[7]};
-    wire [0:1] s4 = li[3] ? {s3[0], s3[2]} : {s3[1], s3[3]};
-
-    assign lut5_out = li[4] ? s4[0] : s4[1];
-
-    // Carry out function
-    assign cout = (s3[2]) ? cin : s3[3];
-
-endmodule
-
-(* abc9_lut=1, lib_whitebox *)
-module frac_lut6(
-    input wire [0:5] in,
-    output wire [0:3] lut4_out,
-    output wire [0:1] lut5_out,
-    output wire lut6_out
-);
-    parameter [0:63] LUT = 0;
-    // Effective LUT input
-    wire [0:5] li = in;
-
-    // Output function
-    wire [0:31] s1 = li[0] ?
-    {LUT[0] , LUT[2] , LUT[4] , LUT[6] , LUT[8] , LUT[10], LUT[12], LUT[14], 
-     LUT[16], LUT[18], LUT[20], LUT[22], LUT[24], LUT[26], LUT[28], LUT[30],
-     LUT[32], LUT[34], LUT[36], LUT[38], LUT[40], LUT[42], LUT[44], LUT[46],
-     LUT[48], LUT[50], LUT[52], LUT[54], LUT[56], LUT[58], LUT[60], LUT[62]}:
-    {LUT[1] , LUT[3] , LUT[5] , LUT[7] , LUT[9] , LUT[11], LUT[13], LUT[15], 
-     LUT[17], LUT[19], LUT[21], LUT[23], LUT[25], LUT[27], LUT[29], LUT[31],
-     LUT[33], LUT[35], LUT[37], LUT[39], LUT[41], LUT[43], LUT[45], LUT[47],
-     LUT[49], LUT[51], LUT[53], LUT[55], LUT[57], LUT[59], LUT[61], LUT[63]};
-
-    wire [0:15] s2 = li[1] ?
-    {s1[0] , s1[2] , s1[4] , s1[6] , s1[8] , s1[10], s1[12], s1[14],
-     s1[16], s1[18], s1[20], s1[22], s1[24], s1[26], s1[28], s1[30]}:
-    {s1[1] , s1[3] , s1[5] , s1[7] , s1[9] , s1[11], s1[13], s1[15],
-     s1[17], s1[19], s1[21], s1[23], s1[25], s1[27], s1[29], s1[31]};
-
-    wire [0:7] s3 = li[2] ?
-    {s2[0], s2[2], s2[4], s2[6], s2[8], s2[10], s2[12], s2[14]}:
-    {s2[1], s2[3], s2[5], s2[7], s2[9], s2[11], s2[13], s2[15]};
-
-    wire [0:3] s4 = li[3] ? {s3[0], s3[2], s3[4], s3[6]}:
-                            {s3[1], s3[3], s3[5], s3[7]};
-
-    wire [0:1] s5 = li[4] ? {s4[0], s4[2]} : {s4[1], s4[3]};
-
-    assign lut4_out[0] = s4[0];
-    assign lut4_out[1] = s4[1];
-    assign lut4_out[2] = s4[2];
-    assign lut4_out[3] = s4[3];
-
-    assign lut5_out[0] = s5[0];
-    assign lut5_out[1] = s5[1];
-
-    assign lut6_out = li[5] ? s5[0] : s5[1];
+	
+    specify
+        (p => sumout) = 0;
+        (g => sumout) = 0;
+        (cin => sumout) = 0;
+        (p => cout) = 0;
+        (g => cout) = 0;
+        (cin => cout) = 0;
+    endspecify
 
 endmodule
 
@@ -136,6 +71,11 @@
     always @(posedge C)
       Q <= D;
 
+    specify
+	    (posedge C=>(Q+:D)) = 0;
+	    $setuphold(posedge C, D, 0, 0);
+    endspecify
+
 endmodule
 
 (* abc9_flop, lib_whitebox *)
@@ -149,6 +89,11 @@
 
     always @(negedge C)
       Q <= D;
+	  
+    specify
+	    (negedge C=>(Q+:D)) = 0;
+	    $setuphold(negedge C, D, 0, 0);
+    endspecify
 
 endmodule
 
@@ -172,6 +117,18 @@
       else if (E)
         Q <= D;
 
+    specify
+      (posedge C => (Q +: D)) = 0;
+      (R => Q) = 0;
+      (S => Q) = 0;
+      $setuphold(posedge C, D, 0, 0);
+      $setuphold(posedge C, E, 0, 0);
+      $setuphold(posedge C, R, 0, 0);
+      $setuphold(posedge C, S, 0, 0);
+      $recrem(posedge R, posedge C, 0, 0);
+      $recrem(posedge S, posedge C, 0, 0);
+    endspecify
+
 endmodule
 
 (* abc9_flop, lib_whitebox *)
@@ -193,6 +150,18 @@
         Q <= 1'b1;
       else if (E)
         Q <= D;
+		
+    specify
+      (negedge C => (Q +: D)) = 0;
+      (R => Q) = 0;
+      (S => Q) = 0;
+      $setuphold(negedge C, D, 0, 0);
+      $setuphold(negedge C, E, 0, 0);
+      $setuphold(negedge C, R, 0, 0);
+      $setuphold(negedge C, S, 0, 0);
+      $recrem(posedge R, negedge C, 0, 0);
+      $recrem(posedge S, negedge C, 0, 0);
+    endspecify
 
 endmodule
 
@@ -215,6 +184,14 @@
         Q <= 1'b1;
       else if (E)
         Q <= D;
+		
+    specify
+        (posedge C => (Q +: D)) = 0;
+        $setuphold(posedge C, D, 0, 0);
+        $setuphold(posedge C, R, 0, 0);
+        $setuphold(posedge C, S, 0, 0);
+        $setuphold(posedge C, E, 0, 0);
+    endspecify
 
 endmodule
 
@@ -237,6 +214,14 @@
         Q <= 1'b1;
       else if (E)
         Q <= D;
+		
+    specify
+        (negedge C => (Q +: D)) = 0;
+        $setuphold(negedge C, D, 0, 0);
+        $setuphold(negedge C, R, 0, 0);
+        $setuphold(negedge C, S, 0, 0);
+        $setuphold(negedge C, E, 0, 0);
+    endspecify
 
 endmodule
 
@@ -260,6 +245,14 @@
         else if (E && G)
           Q <= D;
       end
+	  
+    specify
+      (posedge G => (Q +: D)) = 0;
+      $setuphold(posedge G, D, 0, 0);
+      $setuphold(posedge G, E, 0, 0);
+      $setuphold(posedge G, R, 0, 0);
+      $setuphold(posedge G, S, 0, 0);
+    endspecify      
 
 endmodule
 
@@ -283,1409 +276,14 @@
         else if (E && !G)
           Q <= D;
       end
+	  
+    specify
+      (negedge G => (Q +: D)) = 0;
+      $setuphold(negedge G, D, 0, 0);
+      $setuphold(negedge G, E, 0, 0);
+      $setuphold(negedge G, R, 0, 0);
+      $setuphold(negedge G, S, 0, 0);
+    endspecify 
 
 endmodule
 
-
-module TDP_BRAM18 (
-    (* clkbuf_sink *)
-    input wire CLOCKA,
-    (* clkbuf_sink *)
-    input wire CLOCKB,
-    input wire READENABLEA,
-    input wire READENABLEB,
-    input wire [13:0] ADDRA,
-    input wire [13:0] ADDRB,
-    input wire [15:0] WRITEDATAA,
-    input wire [15:0] WRITEDATAB,
-    input wire [1:0] WRITEDATAAP,
-    input wire [1:0] WRITEDATABP,
-    input wire WRITEENABLEA,
-    input wire WRITEENABLEB,
-    input wire [1:0] BYTEENABLEA,
-    input wire [1:0] BYTEENABLEB,
-    //input wire [2:0] WRITEDATAWIDTHA,
-    //input wire [2:0] WRITEDATAWIDTHB,
-    //input wire [2:0] READDATAWIDTHA,
-    //input wire [2:0] READDATAWIDTHB,
-    output wire [15:0] READDATAA,
-    output wire [15:0] READDATAB,
-    output wire [1:0] READDATAAP,
-    output wire [1:0] READDATABP
-);
-    parameter INITP_00 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INITP_01 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INITP_02 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INITP_03 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INITP_04 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INITP_05 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INITP_06 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INITP_07 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INIT_00 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INIT_01 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INIT_02 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INIT_03 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INIT_04 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INIT_05 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INIT_06 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INIT_07 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INIT_08 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INIT_09 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INIT_0A = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INIT_0B = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INIT_0C = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INIT_0D = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INIT_0E = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INIT_0F = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INIT_10 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INIT_11 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INIT_12 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INIT_13 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INIT_14 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INIT_15 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INIT_16 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INIT_17 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INIT_18 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INIT_19 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INIT_1A = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INIT_1B = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INIT_1C = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INIT_1D = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INIT_1E = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INIT_1F = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INIT_20 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INIT_21 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INIT_22 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INIT_23 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INIT_24 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INIT_25 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INIT_26 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INIT_27 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INIT_28 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INIT_29 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INIT_2A = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INIT_2B = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INIT_2C = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INIT_2D = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INIT_2E = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INIT_2F = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INIT_30 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INIT_31 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INIT_32 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INIT_33 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INIT_34 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INIT_35 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INIT_36 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INIT_37 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INIT_38 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INIT_39 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INIT_3A = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INIT_3B = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INIT_3C = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INIT_3D = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INIT_3E = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INIT_3F = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter integer READ_WIDTH_A = 0;
-    parameter integer READ_WIDTH_B = 0;
-    parameter integer WRITE_WIDTH_A = 0;
-    parameter integer WRITE_WIDTH_B = 0;
-
-endmodule
-
-module TDP36K (
-    RESET_ni,
-    WEN_A1_i,
-    WEN_B1_i,
-    REN_A1_i,
-    REN_B1_i,
-    CLK_A1_i,
-    CLK_B1_i,
-    BE_A1_i,
-    BE_B1_i,
-    ADDR_A1_i,
-    ADDR_B1_i,
-    WDATA_A1_i,
-    WDATA_B1_i,
-    RDATA_A1_o,
-    RDATA_B1_o,
-    FLUSH1_i,
-    WEN_A2_i,
-    WEN_B2_i,
-    REN_A2_i,
-    REN_B2_i,
-    CLK_A2_i,
-    CLK_B2_i,
-    BE_A2_i,
-    BE_B2_i,
-    ADDR_A2_i,
-    ADDR_B2_i,
-    WDATA_A2_i,
-    WDATA_B2_i,
-    RDATA_A2_o,
-    RDATA_B2_o,
-    FLUSH2_i
-);
-    parameter [80:0] MODE_BITS = 81'd0;
-
-    // First 18K RAMFIFO (41 bits)
-    localparam [ 0:0] SYNC_FIFO1_i  = MODE_BITS[0];
-    localparam [ 2:0] RMODE_A1_i    = MODE_BITS[3 : 1];
-    localparam [ 2:0] RMODE_B1_i    = MODE_BITS[6 : 4];
-    localparam [ 2:0] WMODE_A1_i    = MODE_BITS[9 : 7];
-    localparam [ 2:0] WMODE_B1_i    = MODE_BITS[12:10];
-    localparam [ 0:0] FMODE1_i      = MODE_BITS[13];
-    localparam [ 0:0] POWERDN1_i    = MODE_BITS[14];
-    localparam [ 0:0] SLEEP1_i      = MODE_BITS[15];
-    localparam [ 0:0] PROTECT1_i    = MODE_BITS[16];
-    localparam [11:0] UPAE1_i       = MODE_BITS[28:17];
-    localparam [11:0] UPAF1_i       = MODE_BITS[40:29];
-
-    // Second 18K RAMFIFO (39 bits)
-    localparam [ 0:0] SYNC_FIFO2_i  = MODE_BITS[41];
-    localparam [ 2:0] RMODE_A2_i    = MODE_BITS[44:42];
-    localparam [ 2:0] RMODE_B2_i    = MODE_BITS[47:45];
-    localparam [ 2:0] WMODE_A2_i    = MODE_BITS[50:48];
-    localparam [ 2:0] WMODE_B2_i    = MODE_BITS[53:51];
-    localparam [ 0:0] FMODE2_i      = MODE_BITS[54];
-    localparam [ 0:0] POWERDN2_i    = MODE_BITS[55];
-    localparam [ 0:0] SLEEP2_i      = MODE_BITS[56];
-    localparam [ 0:0] PROTECT2_i    = MODE_BITS[57];
-    localparam [10:0] UPAE2_i       = MODE_BITS[68:58];
-    localparam [10:0] UPAF2_i       = MODE_BITS[79:69];
-
-    // Split (1 bit)
-    localparam [ 0:0] SPLIT_i       = MODE_BITS[80];
-
-    parameter INITP_00 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INITP_01 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INITP_02 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INITP_03 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INITP_04 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INITP_05 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INITP_06 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INITP_07 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INITP_08 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INITP_09 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INITP_0A = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INITP_0B = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INITP_0C = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INITP_0D = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INITP_0E = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INITP_0F = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INIT_00 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INIT_01 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INIT_02 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INIT_03 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INIT_04 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INIT_05 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INIT_06 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INIT_07 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INIT_08 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INIT_09 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INIT_0A = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INIT_0B = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INIT_0C = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INIT_0D = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INIT_0E = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INIT_0F = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INIT_10 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INIT_11 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INIT_12 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INIT_13 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INIT_14 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INIT_15 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INIT_16 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INIT_17 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INIT_18 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INIT_19 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INIT_1A = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INIT_1B = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INIT_1C = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INIT_1D = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INIT_1E = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INIT_1F = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INIT_20 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INIT_21 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INIT_22 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INIT_23 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INIT_24 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INIT_25 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INIT_26 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INIT_27 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INIT_28 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INIT_29 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INIT_2A = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INIT_2B = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INIT_2C = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INIT_2D = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INIT_2E = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INIT_2F = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INIT_30 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INIT_31 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INIT_32 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INIT_33 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INIT_34 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INIT_35 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INIT_36 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INIT_37 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INIT_38 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INIT_39 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INIT_3A = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INIT_3B = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INIT_3C = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INIT_3D = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INIT_3E = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INIT_3F = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INIT_40 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INIT_41 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INIT_42 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INIT_43 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INIT_44 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INIT_45 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INIT_46 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INIT_47 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INIT_48 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INIT_49 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INIT_4A = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INIT_4B = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INIT_4C = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INIT_4D = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INIT_4E = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INIT_4F = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INIT_50 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INIT_51 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INIT_52 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INIT_53 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INIT_54 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INIT_55 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INIT_56 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INIT_57 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INIT_58 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INIT_59 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INIT_5A = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INIT_5B = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INIT_5C = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INIT_5D = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INIT_5E = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INIT_5F = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INIT_60 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INIT_61 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INIT_62 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INIT_63 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INIT_64 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INIT_65 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INIT_66 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INIT_67 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INIT_68 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INIT_69 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INIT_6A = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INIT_6B = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INIT_6C = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INIT_6D = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INIT_6E = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INIT_6F = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INIT_70 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INIT_71 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INIT_72 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INIT_73 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INIT_74 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INIT_75 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INIT_76 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INIT_77 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INIT_78 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INIT_79 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INIT_7A = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INIT_7B = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INIT_7C = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INIT_7D = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INIT_7E = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-    parameter INIT_7F = 256'h0000000000000000000000000000000000000000000000000000000000000000;
-
-    input wire RESET_ni;
-    input wire WEN_A1_i;
-    input wire WEN_B1_i;
-    input wire REN_A1_i;
-    input wire REN_B1_i;
-    (* clkbuf_sink *)
-    input wire CLK_A1_i;
-    (* clkbuf_sink *)
-    input wire CLK_B1_i;
-    input wire [1:0] BE_A1_i;
-    input wire [1:0] BE_B1_i;
-    input wire [14:0] ADDR_A1_i;
-    input wire [14:0] ADDR_B1_i;
-    input wire [17:0] WDATA_A1_i;
-    input wire [17:0] WDATA_B1_i;
-    output reg [17:0] RDATA_A1_o;
-    output reg [17:0] RDATA_B1_o;
-    input wire FLUSH1_i;
-    input wire WEN_A2_i;
-    input wire WEN_B2_i;
-    input wire REN_A2_i;
-    input wire REN_B2_i;
-    (* clkbuf_sink *)
-    input wire CLK_A2_i;
-    (* clkbuf_sink *)
-    input wire CLK_B2_i;
-    input wire [1:0] BE_A2_i;
-    input wire [1:0] BE_B2_i;
-    input wire [13:0] ADDR_A2_i;
-    input wire [13:0] ADDR_B2_i;
-    input wire [17:0] WDATA_A2_i;
-    input wire [17:0] WDATA_B2_i;
-    output reg [17:0] RDATA_A2_o;
-    output reg [17:0] RDATA_B2_o;
-    input wire FLUSH2_i;
-    wire EMPTY2;
-    wire EPO2;
-    wire EWM2;
-    wire FULL2;
-    wire FMO2;
-    wire FWM2;
-    wire EMPTY1;
-    wire EPO1;
-    wire EWM1;
-    wire FULL1;
-    wire FMO1;
-    wire FWM1;
-    wire UNDERRUN1;
-    wire OVERRUN1;
-    wire UNDERRUN2;
-    wire OVERRUN2;
-    wire UNDERRUN3;
-    wire OVERRUN3;
-    wire EMPTY3;
-    wire EPO3;
-    wire EWM3;
-    wire FULL3;
-    wire FMO3;
-    wire FWM3;
-    wire ram_fmode1;
-    wire ram_fmode2;
-    wire [17:0] ram_rdata_a1;
-    wire [17:0] ram_rdata_b1;
-    wire [17:0] ram_rdata_a2;
-    wire [17:0] ram_rdata_b2;
-    reg [17:0] ram_wdata_a1;
-    reg [17:0] ram_wdata_b1;
-    reg [17:0] ram_wdata_a2;
-    reg [17:0] ram_wdata_b2;
-    reg [14:0] laddr_a1;
-    reg [14:0] laddr_b1;
-    wire [13:0] ram_addr_a1;
-    wire [13:0] ram_addr_b1;
-    wire [13:0] ram_addr_a2;
-    wire [13:0] ram_addr_b2;
-    wire smux_clk_a1;
-    wire smux_clk_b1;
-    wire smux_clk_a2;
-    wire smux_clk_b2;
-    reg [1:0] ram_be_a1;
-    reg [1:0] ram_be_a2;
-    reg [1:0] ram_be_b1;
-    reg [1:0] ram_be_b2;
-    wire [2:0] ram_rmode_a1;
-    wire [2:0] ram_wmode_a1;
-    wire [2:0] ram_rmode_b1;
-    wire [2:0] ram_wmode_b1;
-    wire [2:0] ram_rmode_a2;
-    wire [2:0] ram_wmode_a2;
-    wire [2:0] ram_rmode_b2;
-    wire [2:0] ram_wmode_b2;
-    wire ram_ren_a1;
-    wire ram_ren_b1;
-    wire ram_ren_a2;
-    wire ram_ren_b2;
-    wire ram_wen_a1;
-    wire ram_wen_b1;
-    wire ram_wen_a2;
-    wire ram_wen_b2;
-    wire ren_o;
-    wire [11:0] ff_raddr;
-    wire [11:0] ff_waddr;
-    reg [35:0] fifo_rdata;
-    wire [1:0] fifo_rmode;
-    wire [1:0] fifo_wmode;
-    wire [1:0] bwl;
-    wire [17:0] pl_dout0;
-    wire [17:0] pl_dout1;
-    wire sclk_a1;
-    wire sclk_b1;
-    wire sclk_a2;
-    wire sclk_b2;
-    wire sreset;
-    wire flush1;
-    wire flush2;
-    assign sreset = RESET_ni;
-    assign flush1 = ~FLUSH1_i;
-    assign flush2 = ~FLUSH2_i;
-    assign ram_fmode1 = FMODE1_i & SPLIT_i;
-    assign ram_fmode2 = FMODE2_i & SPLIT_i;
-    assign smux_clk_a1 = CLK_A1_i;
-    assign smux_clk_b1 = (FMODE1_i ? (SYNC_FIFO1_i ? CLK_A1_i : CLK_B1_i) : CLK_B1_i);
-    assign smux_clk_a2 = (SPLIT_i ? CLK_A2_i : CLK_A1_i);
-    assign smux_clk_b2 = (SPLIT_i ? (FMODE2_i ? (SYNC_FIFO2_i ? CLK_A2_i : CLK_B2_i) : CLK_B2_i) : (FMODE1_i ? (SYNC_FIFO1_i ? CLK_A1_i : CLK_B1_i) : CLK_B1_i));
-    assign sclk_a1 = smux_clk_a1;
-    assign sclk_a2 = smux_clk_a2;
-    assign sclk_b1 = smux_clk_b1;
-    assign sclk_b2 = smux_clk_b2;
-    assign ram_ren_a1 = (SPLIT_i ? REN_A1_i : (FMODE1_i ? 0 : REN_A1_i));
-    assign ram_ren_a2 = (SPLIT_i ? REN_A2_i : (FMODE1_i ? 0 : REN_A1_i));
-    assign ram_ren_b1 = (SPLIT_i ? REN_B1_i : (FMODE1_i ? ren_o : REN_B1_i));
-    assign ram_ren_b2 = (SPLIT_i ? REN_B2_i : (FMODE1_i ? ren_o : REN_B1_i));
-    localparam MODE_36 = 3'b011;
-    assign ram_wen_a1 = (SPLIT_i ? WEN_A1_i : (FMODE1_i ? ~FULL3 & WEN_A1_i : (WMODE_A1_i == MODE_36 ? WEN_A1_i : WEN_A1_i & ~ADDR_A1_i[4])));
-    assign ram_wen_a2 = (SPLIT_i ? WEN_A2_i : (FMODE1_i ? ~FULL3 & WEN_A1_i : (WMODE_A1_i == MODE_36 ? WEN_A1_i : WEN_A1_i & ADDR_A1_i[4])));
-    assign ram_wen_b1 = (SPLIT_i ? WEN_B1_i : (WMODE_B1_i == MODE_36 ? WEN_B1_i : WEN_B1_i & ~ADDR_B1_i[4]));
-    assign ram_wen_b2 = (SPLIT_i ? WEN_B2_i : (WMODE_B1_i == MODE_36 ? WEN_B1_i : WEN_B1_i & ADDR_B1_i[4]));
-    assign ram_addr_a1 = (SPLIT_i ? ADDR_A1_i[13:0] : (FMODE1_i ? {ff_waddr[11:2], ff_waddr[0], 3'b000} : {ADDR_A1_i[14:5], ADDR_A1_i[3:0]}));
-    assign ram_addr_b1 = (SPLIT_i ? ADDR_B1_i[13:0] : (FMODE1_i ? {ff_raddr[11:2], ff_raddr[0], 3'b000} : {ADDR_B1_i[14:5], ADDR_B1_i[3:0]}));
-    assign ram_addr_a2 = (SPLIT_i ? ADDR_A2_i[13:0] : (FMODE1_i ? {ff_waddr[11:2], ff_waddr[0], 3'b000} : {ADDR_A1_i[14:5], ADDR_A1_i[3:0]}));
-    assign ram_addr_b2 = (SPLIT_i ? ADDR_B2_i[13:0] : (FMODE1_i ? {ff_raddr[11:2], ff_raddr[0], 3'b000} : {ADDR_B1_i[14:5], ADDR_B1_i[3:0]}));
-    assign bwl = (SPLIT_i ? ADDR_A1_i[4:3] : (FMODE1_i ? ff_waddr[1:0] : ADDR_A1_i[4:3]));
-    localparam MODE_18 = 3'b010;
-    localparam MODE_9 = 3'b001;
-    always @(*) begin : WDATA_SEL
-        case (SPLIT_i)
-            1: begin
-                ram_wdata_a1 = WDATA_A1_i;
-                ram_wdata_a2 = WDATA_A2_i;
-                ram_wdata_b1 = WDATA_B1_i;
-                ram_wdata_b2 = WDATA_B2_i;
-                ram_be_a2 = BE_A2_i;
-                ram_be_b2 = BE_B2_i;
-                ram_be_a1 = BE_A1_i;
-                ram_be_b1 = BE_B1_i;
-            end
-            0: begin
-                case (WMODE_A1_i)
-                    MODE_36: begin
-                        ram_wdata_a1 = WDATA_A1_i;
-                        ram_wdata_a2 = WDATA_A2_i;
-                        ram_be_a2 = (FMODE1_i ? 2'b11 : BE_A2_i);
-                        ram_be_a1 = (FMODE1_i ? 2'b11 : BE_A1_i);
-                    end
-                    MODE_18: begin
-                        ram_wdata_a1 = WDATA_A1_i;
-                        ram_wdata_a2 = WDATA_A1_i;
-                        ram_be_a1 = (FMODE1_i ? (ff_waddr[1] ? 2'b00 : 2'b11) : BE_A1_i);
-                        ram_be_a2 = (FMODE1_i ? (ff_waddr[1] ? 2'b11 : 2'b00) : BE_A1_i);
-                    end
-                    MODE_9: begin
-                        ram_wdata_a1[7:0] = WDATA_A1_i[7:0];
-                        ram_wdata_a1[16] = WDATA_A1_i[16];
-                        ram_wdata_a1[15:8] = WDATA_A1_i[7:0];
-                        ram_wdata_a1[17] = WDATA_A1_i[16];
-                        ram_wdata_a2[7:0] = WDATA_A1_i[7:0];
-                        ram_wdata_a2[16] = WDATA_A1_i[16];
-                        ram_wdata_a2[15:8] = WDATA_A1_i[7:0];
-                        ram_wdata_a2[17] = WDATA_A1_i[16];
-                        case (bwl)
-                            0: {ram_be_a2, ram_be_a1} = 4'b0001;
-                            1: {ram_be_a2, ram_be_a1} = 4'b0010;
-                            2: {ram_be_a2, ram_be_a1} = 4'b0100;
-                            3: {ram_be_a2, ram_be_a1} = 4'b1000;
-                        endcase
-                    end
-                    default: begin
-                        ram_wdata_a1 = WDATA_A1_i;
-                        ram_wdata_a2 = WDATA_A1_i;
-                        ram_be_a2 = (FMODE1_i ? 2'b11 : BE_A1_i);
-                        ram_be_a1 = (FMODE1_i ? 2'b11 : BE_A1_i);
-                    end
-                endcase
-                case (WMODE_B1_i)
-                    MODE_36: begin
-                        ram_wdata_b1 = (FMODE1_i ? 18'b000000000000000000 : WDATA_B1_i);
-                        ram_wdata_b2 = (FMODE1_i ? 18'b000000000000000000 : WDATA_B2_i);
-                        ram_be_b2 = BE_B2_i;
-                        ram_be_b1 = BE_B1_i;
-                    end
-                    MODE_18: begin
-                        ram_wdata_b1 = (FMODE1_i ? 18'b000000000000000000 : WDATA_B1_i);
-                        ram_wdata_b2 = (FMODE1_i ? 18'b000000000000000000 : WDATA_B1_i);
-                        ram_be_b1 = BE_B1_i;
-                        ram_be_b2 = BE_B1_i;
-                    end
-                    MODE_9: begin
-                        ram_wdata_b1[7:0] = WDATA_B1_i[7:0];
-                        ram_wdata_b1[16] = WDATA_B1_i[16];
-                        ram_wdata_b1[15:8] = WDATA_B1_i[7:0];
-                        ram_wdata_b1[17] = WDATA_B1_i[16];
-                        ram_wdata_b2[7:0] = WDATA_B1_i[7:0];
-                        ram_wdata_b2[16] = WDATA_B1_i[16];
-                        ram_wdata_b2[15:8] = WDATA_B1_i[7:0];
-                        ram_wdata_b2[17] = WDATA_B1_i[16];
-                        case (ADDR_B1_i[4:3])
-                            0: {ram_be_b2, ram_be_b1} = 4'b0001;
-                            1: {ram_be_b2, ram_be_b1} = 4'b0010;
-                            2: {ram_be_b2, ram_be_b1} = 4'b0100;
-                            3: {ram_be_b2, ram_be_b1} = 4'b1000;
-                        endcase
-                    end
-                    default: begin
-                        ram_wdata_b1 = (FMODE1_i ? 18'b000000000000000000 : WDATA_B1_i);
-                        ram_wdata_b2 = (FMODE1_i ? 18'b000000000000000000 : WDATA_B1_i);
-                        ram_be_b2 = BE_B1_i;
-                        ram_be_b1 = BE_B1_i;
-                    end
-                endcase
-            end
-        endcase
-    end
-    assign ram_rmode_a1 = (SPLIT_i ? (RMODE_A1_i == MODE_36 ? MODE_18 : RMODE_A1_i) : (RMODE_A1_i == MODE_36 ? MODE_18 : RMODE_A1_i));
-    assign ram_rmode_a2 = (SPLIT_i ? (RMODE_A2_i == MODE_36 ? MODE_18 : RMODE_A2_i) : (RMODE_A1_i == MODE_36 ? MODE_18 : RMODE_A1_i));
-    assign ram_wmode_a1 = (SPLIT_i ? (WMODE_A1_i == MODE_36 ? MODE_18 : WMODE_A1_i) : (WMODE_A1_i == MODE_36 ? MODE_18 : (FMODE1_i ? MODE_18 : WMODE_A1_i)));
-    assign ram_wmode_a2 = (SPLIT_i ? (WMODE_A2_i == MODE_36 ? MODE_18 : WMODE_A2_i) : (WMODE_A1_i == MODE_36 ? MODE_18 : (FMODE1_i ? MODE_18 : WMODE_A1_i)));
-    assign ram_rmode_b1 = (SPLIT_i ? (RMODE_B1_i == MODE_36 ? MODE_18 : RMODE_B1_i) : (RMODE_B1_i == MODE_36 ? MODE_18 : (FMODE1_i ? MODE_18 : RMODE_B1_i)));
-    assign ram_rmode_b2 = (SPLIT_i ? (RMODE_B2_i == MODE_36 ? MODE_18 : RMODE_B2_i) : (RMODE_B1_i == MODE_36 ? MODE_18 : (FMODE1_i ? MODE_18 : RMODE_B1_i)));
-    assign ram_wmode_b1 = (SPLIT_i ? (WMODE_B1_i == MODE_36 ? MODE_18 : WMODE_B1_i) : (WMODE_B1_i == MODE_36 ? MODE_18 : WMODE_B1_i));
-    assign ram_wmode_b2 = (SPLIT_i ? (WMODE_B2_i == MODE_36 ? MODE_18 : WMODE_B2_i) : (WMODE_B1_i == MODE_36 ? MODE_18 : WMODE_B1_i));
-    always @(*) begin : FIFO_READ_SEL
-        case (RMODE_B1_i)
-            MODE_36: fifo_rdata = {ram_rdata_b2[17:16], ram_rdata_b1[17:16], ram_rdata_b2[15:0], ram_rdata_b1[15:0]};
-            MODE_18: fifo_rdata = (ff_raddr[1] ? {18'b000000000000000000, ram_rdata_b2} : {18'b000000000000000000, ram_rdata_b1});
-            MODE_9:
-                case (ff_raddr[1:0])
-                    0: fifo_rdata = {19'b0000000000000000000, ram_rdata_b1[16], 8'b00000000, ram_rdata_b1[7:0]};
-                    1: fifo_rdata = {19'b0000000000000000000, ram_rdata_b1[17], 8'b00000000, ram_rdata_b1[15:8]};
-                    2: fifo_rdata = {19'b0000000000000000000, ram_rdata_b2[16], 8'b00000000, ram_rdata_b2[7:0]};
-                    3: fifo_rdata = {19'b0000000000000000000, ram_rdata_b2[17], 8'b00000000, ram_rdata_b2[15:8]};
-                endcase
-            default: fifo_rdata = {ram_rdata_b2, ram_rdata_b1};
-        endcase
-    end
-    localparam MODE_1 = 3'b101;
-    localparam MODE_2 = 3'b110;
-    localparam MODE_4 = 3'b100;
-    always @(*) begin : RDATA_SEL
-        case (SPLIT_i)
-            1: begin
-                RDATA_A1_o = (FMODE1_i ? {10'b0000000000, EMPTY1, EPO1, EWM1, UNDERRUN1, FULL1, FMO1, FWM1, OVERRUN1} : ram_rdata_a1);
-                RDATA_B1_o = ram_rdata_b1;
-                RDATA_A2_o = (FMODE2_i ? {10'b0000000000, EMPTY2, EPO2, EWM2, UNDERRUN2, FULL2, FMO2, FWM2, OVERRUN2} : ram_rdata_a2);
-                RDATA_B2_o = ram_rdata_b2;
-            end
-            0: begin
-                if (FMODE1_i) begin
-                    RDATA_A1_o = {10'b0000000000, EMPTY3, EPO3, EWM3, UNDERRUN3, FULL3, FMO3, FWM3, OVERRUN3};
-                    RDATA_A2_o = 18'b000000000000000000;
-                end
-                else
-                    case (RMODE_A1_i)
-                        MODE_36: begin
-                            RDATA_A1_o = {ram_rdata_a1[17:0]};
-                            RDATA_A2_o = {ram_rdata_a2[17:0]};
-                        end
-                        MODE_18: begin
-                            RDATA_A1_o = (laddr_a1[4] ? ram_rdata_a2 : ram_rdata_a1);
-                            RDATA_A2_o = 18'b000000000000000000;
-                        end
-                        MODE_9: begin
-                            RDATA_A1_o = (laddr_a1[4] ? {{2 {ram_rdata_a2[16]}}, {2 {ram_rdata_a2[7:0]}}} : {{2 {ram_rdata_a1[16]}}, {2 {ram_rdata_a1[7:0]}}});
-                            RDATA_A2_o = 18'b000000000000000000;
-                        end
-                        MODE_4: begin
-                            RDATA_A2_o = 18'b000000000000000000;
-                            RDATA_A1_o[17:4] = 14'b00000000000000;
-                            RDATA_A1_o[3:0] = (laddr_a1[4] ? ram_rdata_a2[3:0] : ram_rdata_a1[3:0]);
-                        end
-                        MODE_2: begin
-                            RDATA_A2_o = 18'b000000000000000000;
-                            RDATA_A1_o[17:2] = 16'b0000000000000000;
-                            RDATA_A1_o[1:0] = (laddr_a1[4] ? ram_rdata_a2[1:0] : ram_rdata_a1[1:0]);
-                        end
-                        MODE_1: begin
-                            RDATA_A2_o = 18'b000000000000000000;
-                            RDATA_A1_o[17:1] = 17'b00000000000000000;
-                            RDATA_A1_o[0] = (laddr_a1[4] ? ram_rdata_a2[0] : ram_rdata_a1[0]);
-                        end
-                        default: begin
-                            RDATA_A1_o = {ram_rdata_a2[1:0], ram_rdata_a1[15:0]};
-                            RDATA_A2_o = {ram_rdata_a2[17:16], ram_rdata_a1[17:16], ram_rdata_a2[15:2]};
-                        end
-                    endcase
-                case (RMODE_B1_i)
-                    MODE_36: begin
-                        RDATA_B1_o = {ram_rdata_b1};
-                        RDATA_B2_o = {ram_rdata_b2};
-                    end
-                    MODE_18: begin
-                        RDATA_B1_o = (FMODE1_i ? fifo_rdata[17:0] : (laddr_b1[4] ? ram_rdata_b2 : ram_rdata_b1));
-                        RDATA_B2_o = 18'b000000000000000000;
-                    end
-                    MODE_9: begin
-                        RDATA_B1_o = (FMODE1_i ? {fifo_rdata[17:0]} : (laddr_b1[4] ? {1'b0, ram_rdata_b2[16], 8'b00000000, ram_rdata_b2[7:0]} : {1'b0, ram_rdata_b1[16], 8'b00000000, ram_rdata_b1[7:0]}));
-                        RDATA_B2_o = 18'b000000000000000000;
-                    end
-                    MODE_4: begin
-                        RDATA_B2_o = 18'b000000000000000000;
-                        RDATA_B1_o[17:4] = 14'b00000000000000;
-                        RDATA_B1_o[3:0] = (laddr_b1[4] ? ram_rdata_b2[3:0] : ram_rdata_b1[3:0]);
-                    end
-                    MODE_2: begin
-                        RDATA_B2_o = 18'b000000000000000000;
-                        RDATA_B1_o[17:2] = 16'b0000000000000000;
-                        RDATA_B1_o[1:0] = (laddr_b1[4] ? ram_rdata_b2[1:0] : ram_rdata_b1[1:0]);
-                    end
-                    MODE_1: begin
-                        RDATA_B2_o = 18'b000000000000000000;
-                        RDATA_B1_o[17:1] = 17'b00000000000000000;
-                        RDATA_B1_o[0] = (laddr_b1[4] ? ram_rdata_b2[0] : ram_rdata_b1[0]);
-                    end
-                    default: begin
-                        RDATA_B1_o = ram_rdata_b1;
-                        RDATA_B2_o = ram_rdata_b2;
-                    end
-                endcase
-            end
-        endcase
-    end
-    always @(posedge sclk_a1 or negedge sreset)
-        if (sreset == 0)
-            laddr_a1 <= 1'sb0;
-        else
-            laddr_a1 <= ADDR_A1_i;
-    always @(posedge sclk_b1 or negedge sreset)
-        if (sreset == 0)
-            laddr_b1 <= 1'sb0;
-        else
-            laddr_b1 <= ADDR_B1_i;
-    assign fifo_wmode = ((WMODE_A1_i == MODE_36) ? 2'b00 : ((WMODE_A1_i == MODE_18) ? 2'b01 : ((WMODE_A1_i == MODE_9) ? 2'b10 : 2'b00)));
-    assign fifo_rmode = ((RMODE_B1_i == MODE_36) ? 2'b00 : ((RMODE_B1_i == MODE_18) ? 2'b01 : ((RMODE_B1_i == MODE_9) ? 2'b10 : 2'b00)));
-    fifo_ctl #(
-        .ADDR_WIDTH(12),
-        .FIFO_WIDTH(3'd4),
-        .DEPTH(7)
-    ) fifo36_ctl(
-        .rclk(sclk_b1),
-        .rst_R_n(flush1),
-        .wclk(sclk_a1),
-        .rst_W_n(flush1),
-        .ren(REN_B1_i),
-        .wen(ram_wen_a1),
-        .sync(SYNC_FIFO1_i),
-        .rmode(fifo_rmode),
-        .wmode(fifo_wmode),
-        .ren_o(ren_o),
-        .fflags({FULL3, FMO3, FWM3, OVERRUN3, EMPTY3, EPO3, EWM3, UNDERRUN3}),
-        .raddr(ff_raddr),
-        .waddr(ff_waddr),
-        .upaf(UPAF1_i),
-        .upae(UPAE1_i)
-    );
-    TDP18K_FIFO #(
-        .UPAF_i(UPAF1_i[10:0]),
-        .UPAE_i(UPAE1_i[10:0]),
-        .SYNC_FIFO_i(SYNC_FIFO1_i),
-        .POWERDN_i(POWERDN1_i),
-        .SLEEP_i(SLEEP1_i),
-        .PROTECT_i(PROTECT1_i)
-    )u1(
-        .RMODE_A_i(ram_rmode_a1),
-        .RMODE_B_i(ram_rmode_b1),
-        .WMODE_A_i(ram_wmode_a1),
-        .WMODE_B_i(ram_wmode_b1),
-        .WEN_A_i(ram_wen_a1),
-        .WEN_B_i(ram_wen_b1),
-        .REN_A_i(ram_ren_a1),
-        .REN_B_i(ram_ren_b1),
-        .CLK_A_i(sclk_a1),
-        .CLK_B_i(sclk_b1),
-        .BE_A_i(ram_be_a1),
-        .BE_B_i(ram_be_b1),
-        .ADDR_A_i(ram_addr_a1),
-        .ADDR_B_i(ram_addr_b1),
-        .WDATA_A_i(ram_wdata_a1),
-        .WDATA_B_i(ram_wdata_b1),
-        .RDATA_A_o(ram_rdata_a1),
-        .RDATA_B_o(ram_rdata_b1),
-        .EMPTY_o(EMPTY1),
-        .EPO_o(EPO1),
-        .EWM_o(EWM1),
-        .UNDERRUN_o(UNDERRUN1),
-        .FULL_o(FULL1),
-        .FMO_o(FMO1),
-        .FWM_o(FWM1),
-        .OVERRUN_o(OVERRUN1),
-        .FLUSH_ni(flush1),
-        .FMODE_i(ram_fmode1)
-    );
-    TDP18K_FIFO #(
-        .UPAF_i(UPAF2_i),
-        .UPAE_i(UPAE2_i),
-        .SYNC_FIFO_i(SYNC_FIFO2_i),
-        .POWERDN_i(POWERDN2_i),
-        .SLEEP_i(SLEEP2_i),
-        .PROTECT_i(PROTECT2_i)
-    )u2(
-        .RMODE_A_i(ram_rmode_a2),
-        .RMODE_B_i(ram_rmode_b2),
-        .WMODE_A_i(ram_wmode_a2),
-        .WMODE_B_i(ram_wmode_b2),
-        .WEN_A_i(ram_wen_a2),
-        .WEN_B_i(ram_wen_b2),
-        .REN_A_i(ram_ren_a2),
-        .REN_B_i(ram_ren_b2),
-        .CLK_A_i(sclk_a2),
-        .CLK_B_i(sclk_b2),
-        .BE_A_i(ram_be_a2),
-        .BE_B_i(ram_be_b2),
-        .ADDR_A_i(ram_addr_a2),
-        .ADDR_B_i(ram_addr_b2),
-        .WDATA_A_i(ram_wdata_a2),
-        .WDATA_B_i(ram_wdata_b2),
-        .RDATA_A_o(ram_rdata_a2),
-        .RDATA_B_o(ram_rdata_b2),
-        .EMPTY_o(EMPTY2),
-        .EPO_o(EPO2),
-        .EWM_o(EWM2),
-        .UNDERRUN_o(UNDERRUN2),
-        .FULL_o(FULL2),
-        .FMO_o(FMO2),
-        .FWM_o(FWM2),
-        .OVERRUN_o(OVERRUN2),
-        .FLUSH_ni(flush2),
-        .FMODE_i(ram_fmode2)
-    );
-endmodule
-
-module BRAM2x18_TDP (A1ADDR, A1DATA, A1EN, B1ADDR, B1DATA, B1EN, C1ADDR, C1DATA, C1EN, CLK1, CLK2, CLK3, CLK4, D1ADDR, D1DATA, D1EN, E1ADDR, E1DATA, E1EN, F1ADDR, F1DATA, F1EN, G1ADDR, G1DATA, G1EN, H1ADDR, H1DATA, H1EN);
-    parameter CFG_ABITS = 11;
-    parameter CFG_DBITS = 18;
-    parameter CFG_ENABLE_B = 4;
-    parameter CFG_ENABLE_D = 4;
-    parameter CFG_ENABLE_F = 4;
-    parameter CFG_ENABLE_H = 4;
-
-    parameter CLKPOL2 = 1;
-    parameter CLKPOL3 = 1;
-    parameter [18431:0] INIT0 = 18432'bx;
-    parameter [18431:0] INIT1 = 18432'bx;
-
-    localparam MODE_36 = 3'b011; // 36- or 32-bit
-    localparam MODE_18 = 3'b010; // 18- or 16-bit
-    localparam MODE_9 = 3'b001; // 9- or 8-bit
-    localparam MODE_4 = 3'b100; // 4-bit
-    localparam MODE_2 = 3'b110; // 2-bit
-    localparam MODE_1 = 3'b101; // 1-bit
-
-    input CLK1;
-    input CLK2;
-    input CLK3;
-    input CLK4;
-
-    input [CFG_ABITS-1:0] A1ADDR;
-    output [CFG_DBITS-1:0] A1DATA;
-    input A1EN;
-
-    input [CFG_ABITS-1:0] B1ADDR;
-    input [CFG_DBITS-1:0] B1DATA;
-    input [CFG_ENABLE_B-1:0] B1EN;
-
-    input [CFG_ABITS-1:0] C1ADDR;
-    output [CFG_DBITS-1:0] C1DATA;
-    input C1EN;
-
-    input [CFG_ABITS-1:0] D1ADDR;
-    input [CFG_DBITS-1:0] D1DATA;
-    input [CFG_ENABLE_D-1:0] D1EN;
-
-    input [CFG_ABITS-1:0] E1ADDR;
-    output [CFG_DBITS-1:0] E1DATA;
-    input E1EN;
-
-    input [CFG_ABITS-1:0] F1ADDR;
-    input [CFG_DBITS-1:0] F1DATA;
-    input [CFG_ENABLE_F-1:0] F1EN;
-
-    input [CFG_ABITS-1:0] G1ADDR;
-    output [CFG_DBITS-1:0] G1DATA;
-    input G1EN;
-
-    input [CFG_ABITS-1:0] H1ADDR;
-    input [CFG_DBITS-1:0] H1DATA;
-    input [CFG_ENABLE_H-1:0] H1EN;
-
-    wire FLUSH1;
-    wire FLUSH2;
-    wire SPLIT;
-
-    wire [13:CFG_ABITS] A1ADDR_CMPL = {14-CFG_ABITS{1'b0}};
-    wire [13:CFG_ABITS] B1ADDR_CMPL = {14-CFG_ABITS{1'b0}};
-    wire [13:CFG_ABITS] C1ADDR_CMPL = {14-CFG_ABITS{1'b0}};
-    wire [13:CFG_ABITS] D1ADDR_CMPL = {14-CFG_ABITS{1'b0}};
-    wire [13:CFG_ABITS] E1ADDR_CMPL = {14-CFG_ABITS{1'b0}};
-    wire [13:CFG_ABITS] F1ADDR_CMPL = {14-CFG_ABITS{1'b0}};
-    wire [13:CFG_ABITS] G1ADDR_CMPL = {14-CFG_ABITS{1'b0}};
-    wire [13:CFG_ABITS] H1ADDR_CMPL = {14-CFG_ABITS{1'b0}};
-
-    wire [13:0] A1ADDR_TOTAL = {A1ADDR_CMPL, A1ADDR};
-    wire [13:0] B1ADDR_TOTAL = {B1ADDR_CMPL, B1ADDR};
-    wire [13:0] C1ADDR_TOTAL = {C1ADDR_CMPL, C1ADDR};
-    wire [13:0] D1ADDR_TOTAL = {D1ADDR_CMPL, D1ADDR};
-    wire [13:0] E1ADDR_TOTAL = {E1ADDR_CMPL, E1ADDR};
-    wire [13:0] F1ADDR_TOTAL = {F1ADDR_CMPL, F1ADDR};
-    wire [13:0] G1ADDR_TOTAL = {G1ADDR_CMPL, G1ADDR};
-    wire [13:0] H1ADDR_TOTAL = {H1ADDR_CMPL, H1ADDR};
-
-    wire [17:CFG_DBITS] A1_RDATA_CMPL;
-    wire [17:CFG_DBITS] C1_RDATA_CMPL;
-    wire [17:CFG_DBITS] E1_RDATA_CMPL;
-    wire [17:CFG_DBITS] G1_RDATA_CMPL;
-
-    wire [17:CFG_DBITS] B1_WDATA_CMPL;
-    wire [17:CFG_DBITS] D1_WDATA_CMPL;
-    wire [17:CFG_DBITS] F1_WDATA_CMPL;
-    wire [17:CFG_DBITS] H1_WDATA_CMPL;
-
-    wire [13:0] PORT_A1_ADDR;
-    wire [13:0] PORT_A2_ADDR;
-    wire [13:0] PORT_B1_ADDR;
-    wire [13:0] PORT_B2_ADDR;
-
-    case (CFG_DBITS)
-        1: begin
-            assign PORT_A1_ADDR = A1EN ? A1ADDR_TOTAL : (B1EN ? B1ADDR_TOTAL : 14'd0);
-            assign PORT_B1_ADDR = C1EN ? C1ADDR_TOTAL : (D1EN ? D1ADDR_TOTAL : 14'd0);
-            assign PORT_A2_ADDR = E1EN ? E1ADDR_TOTAL : (F1EN ? F1ADDR_TOTAL : 14'd0);
-            assign PORT_B2_ADDR = G1EN ? G1ADDR_TOTAL : (H1EN ? H1ADDR_TOTAL : 14'd0);
-            defparam bram_2x18k.MODE_BITS = { 1'b1,
-                11'd10, 11'd10, 4'd0, MODE_1, MODE_1, MODE_1, MODE_1, 1'd0,
-                12'd10, 12'd10, 4'd0, MODE_1, MODE_1, MODE_1, MODE_1, 1'd0
-            };
-        end
-
-        2: begin
-            assign PORT_A1_ADDR = A1EN ? (A1ADDR_TOTAL << 1) : (B1EN ? (B1ADDR_TOTAL << 1) : 14'd0);
-            assign PORT_B1_ADDR = C1EN ? (C1ADDR_TOTAL << 1) : (D1EN ? (D1ADDR_TOTAL << 1) : 14'd0);
-            assign PORT_A2_ADDR = E1EN ? (E1ADDR_TOTAL << 1) : (F1EN ? (F1ADDR_TOTAL << 1) : 14'd0);
-            assign PORT_B2_ADDR = G1EN ? (G1ADDR_TOTAL << 1) : (H1EN ? (H1ADDR_TOTAL << 1) : 14'd0);
-            defparam bram_2x18k.MODE_BITS = { 1'b1,
-                11'd10, 11'd10, 4'd0, MODE_2, MODE_2, MODE_2, MODE_2, 1'd0,
-                12'd10, 12'd10, 4'd0, MODE_2, MODE_2, MODE_2, MODE_2, 1'd0
-            };
-        end
-
-        4: begin
-            assign PORT_A1_ADDR = A1EN ? (A1ADDR_TOTAL << 2) : (B1EN ? (B1ADDR_TOTAL << 2) : 14'd0);
-            assign PORT_B1_ADDR = C1EN ? (C1ADDR_TOTAL << 2) : (D1EN ? (D1ADDR_TOTAL << 2) : 14'd0);
-            assign PORT_A2_ADDR = E1EN ? (E1ADDR_TOTAL << 2) : (F1EN ? (F1ADDR_TOTAL << 2) : 14'd0);
-            assign PORT_B2_ADDR = G1EN ? (G1ADDR_TOTAL << 2) : (H1EN ? (H1ADDR_TOTAL << 2) : 14'd0);
-            defparam bram_2x18k.MODE_BITS = { 1'b1,
-                11'd10, 11'd10, 4'd0, MODE_4, MODE_4, MODE_4, MODE_4, 1'd0,
-                12'd10, 12'd10, 4'd0, MODE_4, MODE_4, MODE_4, MODE_4, 1'd0
-            };
-        end
-
-        8, 9: begin
-            assign PORT_A1_ADDR = A1EN ? (A1ADDR_TOTAL << 3) : (B1EN ? (B1ADDR_TOTAL << 3) : 14'd0);
-            assign PORT_B1_ADDR = C1EN ? (C1ADDR_TOTAL << 3) : (D1EN ? (D1ADDR_TOTAL << 3) : 14'd0);
-            assign PORT_A2_ADDR = E1EN ? (E1ADDR_TOTAL << 3) : (F1EN ? (F1ADDR_TOTAL << 3) : 14'd0);
-            assign PORT_B2_ADDR = G1EN ? (G1ADDR_TOTAL << 3) : (H1EN ? (H1ADDR_TOTAL << 3) : 14'd0);
-            defparam bram_2x18k.MODE_BITS = { 1'b1,
-                11'd10, 11'd10, 4'd0, MODE_9, MODE_9, MODE_9, MODE_9, 1'd0,
-                12'd10, 12'd10, 4'd0, MODE_9, MODE_9, MODE_9, MODE_9, 1'd0
-            };
-        end
-
-        16, 18: begin
-            assign PORT_A1_ADDR = A1EN ? (A1ADDR_TOTAL << 4) : (B1EN ? (B1ADDR_TOTAL << 4) : 14'd0);
-            assign PORT_B1_ADDR = C1EN ? (C1ADDR_TOTAL << 4) : (D1EN ? (D1ADDR_TOTAL << 4) : 14'd0);
-            assign PORT_A2_ADDR = E1EN ? (E1ADDR_TOTAL << 4) : (F1EN ? (F1ADDR_TOTAL << 4) : 14'd0);
-            assign PORT_B2_ADDR = G1EN ? (G1ADDR_TOTAL << 4) : (H1EN ? (H1ADDR_TOTAL << 4) : 14'd0);
-            defparam bram_2x18k.MODE_BITS = { 1'b1,
-                11'd10, 11'd10, 4'd0, MODE_18, MODE_18, MODE_18, MODE_18, 1'd0,
-                12'd10, 12'd10, 4'd0, MODE_18, MODE_18, MODE_18, MODE_18, 1'd0
-            };
-        end
-
-        default: begin
-            assign PORT_A1_ADDR = A1EN ? A1ADDR_TOTAL : (B1EN ? B1ADDR_TOTAL : 14'd0);
-            assign PORT_B1_ADDR = C1EN ? C1ADDR_TOTAL : (D1EN ? D1ADDR_TOTAL : 14'd0);
-            assign PORT_A2_ADDR = E1EN ? E1ADDR_TOTAL : (F1EN ? F1ADDR_TOTAL : 14'd0);
-            assign PORT_B2_ADDR = G1EN ? G1ADDR_TOTAL : (H1EN ? H1ADDR_TOTAL : 14'd0);
-            defparam bram_2x18k.MODE_BITS = { 1'b1,
-                11'd10, 11'd10, 4'd0, MODE_36, MODE_36, MODE_36, MODE_36, 1'd0,
-                12'd10, 12'd10, 4'd0, MODE_36, MODE_36, MODE_36, MODE_36, 1'd0
-            };
-        end
-    endcase
-
-    assign FLUSH1 = 1'b0;
-    assign FLUSH2 = 1'b0;
-
-    wire [17:0] PORT_A1_RDATA = {A1_RDATA_CMPL, A1DATA};
-    wire [17:0] PORT_B1_RDATA = {C1_RDATA_CMPL, C1DATA};
-    wire [17:0] PORT_A2_RDATA = {E1_RDATA_CMPL, E1DATA};
-    wire [17:0] PORT_B2_RDATA = {G1_RDATA_CMPL, G1DATA};
-
-    wire [17:0] PORT_A1_WDATA = {B1_WDATA_CMPL, B1DATA};
-    wire [17:0] PORT_B1_WDATA = {D1_WDATA_CMPL, D1DATA};
-    wire [17:0] PORT_A2_WDATA = {F1_WDATA_CMPL, F1DATA};
-    wire [17:0] PORT_B2_WDATA = {H1_WDATA_CMPL, H1DATA};
-
-    wire PORT_A1_CLK = CLK1;
-    wire PORT_A2_CLK = CLK3;
-    wire PORT_B1_CLK = CLK2;
-    wire PORT_B2_CLK = CLK4;
-
-    wire PORT_A1_REN = A1EN;
-    wire PORT_A1_WEN = B1EN[0];
-    wire [CFG_ENABLE_B-1:0] PORT_A1_BE = {B1EN[1],B1EN[0]};
-
-    wire PORT_A2_REN = E1EN;
-    wire PORT_A2_WEN = F1EN[0];
-    wire [CFG_ENABLE_F-1:0] PORT_A2_BE = {F1EN[1],F1EN[0]};
-
-    wire PORT_B1_REN = C1EN;
-    wire PORT_B1_WEN = D1EN[0];
-    wire [CFG_ENABLE_D-1:0] PORT_B1_BE = {D1EN[1],D1EN[0]};
-
-    wire PORT_B2_REN = G1EN;
-    wire PORT_B2_WEN = H1EN[0];
-    wire [CFG_ENABLE_H-1:0] PORT_B2_BE = {H1EN[1],H1EN[0]};
-
-    TDP36K bram_2x18k (
-        .WDATA_A1_i(PORT_A1_WDATA),
-        .RDATA_A1_o(PORT_A1_RDATA),
-        .ADDR_A1_i(PORT_A1_ADDR),
-        .CLK_A1_i(PORT_A1_CLK),
-        .REN_A1_i(PORT_A1_REN),
-        .WEN_A1_i(PORT_A1_WEN),
-        .BE_A1_i(PORT_A1_BE),
-
-        .WDATA_A2_i(PORT_A2_WDATA),
-        .RDATA_A2_o(PORT_A2_RDATA),
-        .ADDR_A2_i(PORT_A2_ADDR),
-        .CLK_A2_i(PORT_A2_CLK),
-        .REN_A2_i(PORT_A2_REN),
-        .WEN_A2_i(PORT_A2_WEN),
-        .BE_A2_i(PORT_A2_BE),
-
-        .WDATA_B1_i(PORT_B1_WDATA),
-        .RDATA_B1_o(PORT_B1_RDATA),
-        .ADDR_B1_i(PORT_B1_ADDR),
-        .CLK_B1_i(PORT_B1_CLK),
-        .REN_B1_i(PORT_B1_REN),
-        .WEN_B1_i(PORT_B1_WEN),
-        .BE_B1_i(PORT_B1_BE),
-
-        .WDATA_B2_i(PORT_B2_WDATA),
-        .RDATA_B2_o(PORT_B2_RDATA),
-        .ADDR_B2_i(PORT_B2_ADDR),
-        .CLK_B2_i(PORT_B2_CLK),
-        .REN_B2_i(PORT_B2_REN),
-        .WEN_B2_i(PORT_B2_WEN),
-        .BE_B2_i(PORT_B2_BE),
-
-        .FLUSH1_i(FLUSH1),
-        .FLUSH2_i(FLUSH2)
-    );
-endmodule
-
-module BRAM2x18_SDP (A1ADDR, A1DATA, A1EN, B1ADDR, B1DATA, B1EN, C1ADDR, C1DATA, C1EN, CLK1, CLK2, D1ADDR, D1DATA, D1EN);
-    parameter CFG_ABITS = 11;
-    parameter CFG_DBITS = 18;
-    parameter CFG_ENABLE_B = 4;
-    parameter CFG_ENABLE_D = 4;
-
-    parameter CLKPOL2 = 1;
-    parameter CLKPOL3 = 1;
-    parameter [18431:0] INIT0 = 18432'bx;
-    parameter [18431:0] INIT1 = 18432'bx;
-
-    localparam MODE_36 = 3'b011; // 36- or 32-bit
-    localparam MODE_18 = 3'b010; // 18- or 16-bit
-    localparam MODE_9 = 3'b001; // 9- or 8-bit
-    localparam MODE_4 = 3'b100; // 4-bit
-    localparam MODE_2 = 3'b110; // 2-bit
-    localparam MODE_1 = 3'b101; // 1-bit
-
-    input CLK1;
-    input CLK2;
-
-    input [CFG_ABITS-1:0] A1ADDR;
-    output [CFG_DBITS-1:0] A1DATA;
-    input A1EN;
-
-    input [CFG_ABITS-1:0] B1ADDR;
-    input [CFG_DBITS-1:0] B1DATA;
-    input [CFG_ENABLE_B-1:0] B1EN;
-
-    input [CFG_ABITS-1:0] C1ADDR;
-    output [CFG_DBITS-1:0] C1DATA;
-    input C1EN;
-
-    input [CFG_ABITS-1:0] D1ADDR;
-    input [CFG_DBITS-1:0] D1DATA;
-    input [CFG_ENABLE_D-1:0] D1EN;
-
-    wire FLUSH1;
-    wire FLUSH2;
-
-    wire [13:CFG_ABITS] A1ADDR_CMPL = {14-CFG_ABITS{1'b0}};
-    wire [13:CFG_ABITS] B1ADDR_CMPL = {14-CFG_ABITS{1'b0}};
-    wire [13:CFG_ABITS] C1ADDR_CMPL = {14-CFG_ABITS{1'b0}};
-    wire [13:CFG_ABITS] D1ADDR_CMPL = {14-CFG_ABITS{1'b0}};
-
-    wire [13:0] A1ADDR_TOTAL = {A1ADDR_CMPL, A1ADDR};
-    wire [13:0] B1ADDR_TOTAL = {B1ADDR_CMPL, B1ADDR};
-    wire [13:0] C1ADDR_TOTAL = {C1ADDR_CMPL, C1ADDR};
-    wire [13:0] D1ADDR_TOTAL = {D1ADDR_CMPL, D1ADDR};
-
-    wire [17:CFG_DBITS] A1_RDATA_CMPL;
-    wire [17:CFG_DBITS] C1_RDATA_CMPL;
-
-    wire [17:CFG_DBITS] B1_WDATA_CMPL;
-    wire [17:CFG_DBITS] D1_WDATA_CMPL;
-
-    wire [13:0] PORT_A1_ADDR;
-    wire [13:0] PORT_A2_ADDR;
-    wire [13:0] PORT_B1_ADDR;
-    wire [13:0] PORT_B2_ADDR;
-
-    case (CFG_DBITS)
-        1: begin
-            assign PORT_A1_ADDR = A1ADDR_TOTAL;
-            assign PORT_B1_ADDR = B1ADDR_TOTAL;
-            assign PORT_A2_ADDR = C1ADDR_TOTAL;
-            assign PORT_B2_ADDR = D1ADDR_TOTAL;
-            defparam bram_2x18k.MODE_BITS = { 1'b1,
-                11'd10, 11'd10, 4'd0, MODE_1, MODE_1, MODE_1, MODE_1, 1'd0,
-                12'd10, 12'd10, 4'd0, MODE_1, MODE_1, MODE_1, MODE_1, 1'd0
-            };
-        end
-
-        2: begin
-            assign PORT_A1_ADDR = A1ADDR_TOTAL << 1;
-            assign PORT_B1_ADDR = B1ADDR_TOTAL << 1;
-            assign PORT_A2_ADDR = C1ADDR_TOTAL << 1;
-            assign PORT_B2_ADDR = D1ADDR_TOTAL << 1;
-            defparam bram_2x18k.MODE_BITS = { 1'b1,
-                11'd10, 11'd10, 4'd0, MODE_2, MODE_2, MODE_2, MODE_2, 1'd0,
-                12'd10, 12'd10, 4'd0, MODE_2, MODE_2, MODE_2, MODE_2, 1'd0
-            };
-        end
-
-        4: begin
-            assign PORT_A1_ADDR = A1ADDR_TOTAL << 2;
-            assign PORT_B1_ADDR = B1ADDR_TOTAL << 2;
-            assign PORT_A2_ADDR = C1ADDR_TOTAL << 2;
-            assign PORT_B2_ADDR = D1ADDR_TOTAL << 2;
-            defparam bram_2x18k.MODE_BITS = { 1'b1,
-                11'd10, 11'd10, 4'd0, MODE_4, MODE_4, MODE_4, MODE_4, 1'd0,
-                12'd10, 12'd10, 4'd0, MODE_4, MODE_4, MODE_4, MODE_4, 1'd0
-            };
-        end
-
-        8, 9: begin
-            assign PORT_A1_ADDR = A1ADDR_TOTAL << 3;
-            assign PORT_B1_ADDR = B1ADDR_TOTAL << 3;
-            assign PORT_A2_ADDR = C1ADDR_TOTAL << 3;
-            assign PORT_B2_ADDR = D1ADDR_TOTAL << 3;
-            defparam bram_2x18k.MODE_BITS = { 1'b1,
-                11'd10, 11'd10, 4'd0, MODE_9, MODE_9, MODE_9, MODE_9, 1'd0,
-                12'd10, 12'd10, 4'd0, MODE_9, MODE_9, MODE_9, MODE_9, 1'd0
-            };
-        end
-
-        16, 18: begin
-            assign PORT_A1_ADDR = A1ADDR_TOTAL << 4;
-            assign PORT_B1_ADDR = B1ADDR_TOTAL << 4;
-            assign PORT_A2_ADDR = C1ADDR_TOTAL << 4;
-            assign PORT_B2_ADDR = D1ADDR_TOTAL << 4;
-            defparam bram_2x18k.MODE_BITS = { 1'b1,
-                11'd10, 11'd10, 4'd0, MODE_18, MODE_18, MODE_18, MODE_18, 1'd0,
-                12'd10, 12'd10, 4'd0, MODE_18, MODE_18, MODE_18, MODE_18, 1'd0
-            };
-        end
-
-        default: begin
-            assign PORT_A1_ADDR = A1ADDR_TOTAL;
-            assign PORT_B1_ADDR = B1ADDR_TOTAL;
-            assign PORT_A2_ADDR = D1ADDR_TOTAL;
-            assign PORT_B2_ADDR = C1ADDR_TOTAL;
-            defparam bram_2x18k.MODE_BITS = { 1'b1,
-                11'd10, 11'd10, 4'd0, MODE_36, MODE_36, MODE_36, MODE_36, 1'd0,
-                12'd10, 12'd10, 4'd0, MODE_36, MODE_36, MODE_36, MODE_36, 1'd0
-            };
-        end
-    endcase
-
-    assign FLUSH1 = 1'b0;
-    assign FLUSH2 = 1'b0;
-
-    wire [17:0] PORT_A1_RDATA;
-    wire [17:0] PORT_B1_RDATA;
-    wire [17:0] PORT_A2_RDATA;
-    wire [17:0] PORT_B2_RDATA;
-
-    wire [17:0] PORT_A1_WDATA;
-    wire [17:0] PORT_B1_WDATA;
-    wire [17:0] PORT_A2_WDATA;
-    wire [17:0] PORT_B2_WDATA;
-
-    // Assign read/write data - handle special case for 9bit mode
-    // parity bit for 9bit mode is placed in R/W port on bit #16
-    case (CFG_DBITS)
-        9: begin
-            assign A1DATA = {PORT_A1_RDATA[16], PORT_A1_RDATA[7:0]};
-            assign C1DATA = {PORT_A2_RDATA[16], PORT_A2_RDATA[7:0]};
-            assign PORT_A1_WDATA = {18{1'b0}};
-            assign PORT_B1_WDATA = {B1_WDATA_CMPL[17], B1DATA[8], B1_WDATA_CMPL[16:9], B1DATA[7:0]};
-            assign PORT_A2_WDATA = {18{1'b0}};
-            assign PORT_B2_WDATA = {D1_WDATA_CMPL[17], D1DATA[8], D1_WDATA_CMPL[16:9], D1DATA[7:0]};
-        end
-        default: begin
-            assign A1DATA = PORT_A1_RDATA[CFG_DBITS-1:0];
-            assign C1DATA = PORT_A2_RDATA[CFG_DBITS-1:0];
-            assign PORT_A1_WDATA = {18{1'b1}};
-            assign PORT_B1_WDATA = {B1_WDATA_CMPL, B1DATA};
-            assign PORT_A2_WDATA = {18{1'b1}};
-            assign PORT_B2_WDATA = {D1_WDATA_CMPL, D1DATA};
-
-        end
-    endcase
-
-    wire PORT_A1_CLK = CLK1;
-    wire PORT_A2_CLK = CLK2;
-    wire PORT_B1_CLK = CLK1;
-    wire PORT_B2_CLK = CLK2;
-
-    wire PORT_A1_REN = A1EN;
-    wire PORT_A1_WEN = 1'b0;
-    wire [CFG_ENABLE_B-1:0] PORT_A1_BE = {PORT_A1_WEN,PORT_A1_WEN};
-
-    wire PORT_A2_REN = C1EN;
-    wire PORT_A2_WEN = 1'b0;
-    wire [CFG_ENABLE_D-1:0] PORT_A2_BE = {PORT_A2_WEN,PORT_A2_WEN};
-
-    wire PORT_B1_REN = 1'b0;
-    wire PORT_B1_WEN = B1EN[0];
-    wire [CFG_ENABLE_B-1:0] PORT_B1_BE = {B1EN[1],B1EN[0]};
-
-    wire PORT_B2_REN = 1'b0;
-    wire PORT_B2_WEN = D1EN[0];
-    wire [CFG_ENABLE_D-1:0] PORT_B2_BE = {D1EN[1],D1EN[0]};
-
-    TDP36K  bram_2x18k (
-        .WDATA_A1_i(PORT_A1_WDATA),
-        .RDATA_A1_o(PORT_A1_RDATA),
-        .ADDR_A1_i(PORT_A1_ADDR),
-        .CLK_A1_i(PORT_A1_CLK),
-        .REN_A1_i(PORT_A1_REN),
-        .WEN_A1_i(PORT_A1_WEN),
-        .BE_A1_i(PORT_A1_BE),
-
-        .WDATA_A2_i(PORT_A2_WDATA),
-        .RDATA_A2_o(PORT_A2_RDATA),
-        .ADDR_A2_i(PORT_A2_ADDR),
-        .CLK_A2_i(PORT_A2_CLK),
-        .REN_A2_i(PORT_A2_REN),
-        .WEN_A2_i(PORT_A2_WEN),
-        .BE_A2_i(PORT_A2_BE),
-
-        .WDATA_B1_i(PORT_B1_WDATA),
-        .RDATA_B1_o(PORT_B1_RDATA),
-        .ADDR_B1_i(PORT_B1_ADDR),
-        .CLK_B1_i(PORT_B1_CLK),
-        .REN_B1_i(PORT_B1_REN),
-        .WEN_B1_i(PORT_B1_WEN),
-        .BE_B1_i(PORT_B1_BE),
-
-        .WDATA_B2_i(PORT_B2_WDATA),
-        .RDATA_B2_o(PORT_B2_RDATA),
-        .ADDR_B2_i(PORT_B2_ADDR),
-        .CLK_B2_i(PORT_B2_CLK),
-        .REN_B2_i(PORT_B2_REN),
-        .WEN_B2_i(PORT_B2_WEN),
-        .BE_B2_i(PORT_B2_BE),
-
-        .FLUSH1_i(FLUSH1),
-        .FLUSH2_i(FLUSH2)
-    );
-endmodule
-
-module \_$_mem_v2_asymmetric (RD_ADDR, RD_ARST, RD_CLK, RD_DATA, RD_EN, RD_SRST, WR_ADDR, WR_CLK, WR_DATA, WR_EN);
-    localparam CFG_ABITS = 10;
-    localparam CFG_DBITS = 36;
-    localparam CFG_ENABLE_B = 4;
-
-    localparam CLKPOL2 = 1;
-    localparam CLKPOL3 = 1;
-
-    parameter READ_ADDR_WIDTH = 11;
-    parameter READ_DATA_WIDTH = 16;
-    parameter WRITE_ADDR_WIDTH = 10;
-    parameter WRITE_DATA_WIDTH = 32;
-    parameter ABITS = 0;
-    parameter MEMID = 0;
-    parameter [36863:0] INIT = 36864'bx;
-    parameter OFFSET = 0;
-    parameter RD_ARST_VALUE = 0;
-    parameter RD_CE_OVER_SRST = 0;
-    parameter RD_CLK_ENABLE = 0;
-    parameter RD_CLK_POLARITY = 0;
-    parameter RD_COLLISION_X_MASK = 0;
-    parameter RD_INIT_VALUE = 0;
-    parameter RD_PORTS = 0;
-    parameter RD_SRST_VALUE = 0;
-    parameter RD_TRANSPARENCY_MASK = 0;
-    parameter RD_WIDE_CONTINUATION = 0;
-    parameter SIZE = 0;
-    parameter WIDTH = 0;
-    parameter WR_CLK_ENABLE = 0;
-    parameter WR_CLK_POLARITY = 0;
-    parameter WR_PORTS = 0;
-    parameter WR_PRIORITY_MASK = 0;
-    parameter WR_WIDE_CONTINUATION = 0;
-
-    localparam MODE_36  = 3'b111;   // 36 or 32-bit
-    localparam MODE_18  = 3'b110;   // 18 or 16-bit
-    localparam MODE_9   = 3'b101;   // 9 or 8-bit
-    localparam MODE_4   = 3'b100;   // 4-bit
-    localparam MODE_2   = 3'b010;   // 32-bit
-    localparam MODE_1   = 3'b001;   // 32-bit
-
-    input RD_CLK;
-    input WR_CLK;
-    input RD_ARST;
-    input RD_SRST;
-
-    input [CFG_ABITS-1:0] RD_ADDR;
-    output [CFG_DBITS-1:0] RD_DATA;
-    input RD_EN;
-
-    input [CFG_ABITS-1:0] WR_ADDR;
-    input [CFG_DBITS-1:0] WR_DATA;
-    input [CFG_ENABLE_B-1:0] WR_EN;
-
-    wire [14:0] RD_ADDR_15;
-    wire [14:0] WR_ADDR_15;
-
-    wire [35:0] DOBDO;
-
-    wire [14:CFG_ABITS] RD_ADDR_CMPL;
-    wire [14:CFG_ABITS] WR_ADDR_CMPL;
-    wire [35:CFG_DBITS] RD_DATA_CMPL;
-    wire [35:CFG_DBITS] WR_DATA_CMPL;
-
-    wire [14:0] RD_ADDR_TOTAL;
-    wire [14:0] WR_ADDR_TOTAL;
-    wire [35:0] RD_DATA_TOTAL;
-    wire [35:0] WR_DATA_TOTAL;
-
-    wire FLUSH1;
-    wire FLUSH2;
-
-    assign RD_ADDR_CMPL = {15-CFG_ABITS{1'b0}};
-    assign WR_ADDR_CMPL = {15-CFG_ABITS{1'b0}};
-
-    assign RD_ADDR_TOTAL = {RD_ADDR_CMPL, RD_ADDR};
-    assign WR_ADDR_TOTAL = {WR_ADDR_CMPL, WR_ADDR};
-
-    assign RD_DATA_TOTAL = {RD_DATA_CMPL, RD_DATA};
-    assign WR_DATA_TOTAL = {WR_DATA_CMPL, WR_DATA};
-
-    case (CFG_DBITS)
-        1: begin
-            assign RD_ADDR_15 = RD_ADDR_TOTAL;
-            assign WR_ADDR_15 = WR_ADDR_TOTAL;
-            defparam bram_asymmetric.MODE_BITS = { 1'b0,
-                11'd10, 11'd10, 4'd0, MODE_1, MODE_1, MODE_1, MODE_1, 1'd0,
-                12'd10, 12'd10, 4'd0, MODE_1, MODE_1, MODE_1, MODE_1, 1'd0
-            };
-        end
-
-        2: begin
-            assign RD_ADDR_15 = RD_ADDR_TOTAL << 1;
-            assign WR_ADDR_15 = WR_ADDR_TOTAL << 1;
-            defparam bram_asymmetric.MODE_BITS = { 1'b0,
-                11'd10, 11'd10, 4'd0, MODE_2, MODE_2, MODE_2, MODE_2, 1'd0,
-                12'd10, 12'd10, 4'd0, MODE_2, MODE_2, MODE_2, MODE_2, 1'd0
-            };
-        end
-
-        4: begin
-            assign RD_ADDR_15 = RD_ADDR_TOTAL << 2;
-            assign WR_ADDR_15 = WR_ADDR_TOTAL << 2;
-            defparam bram_asymmetric.MODE_BITS = { 1'b0,
-                11'd10, 11'd10, 4'd0, MODE_4, MODE_4, MODE_4, MODE_4, 1'd0,
-                12'd10, 12'd10, 4'd0, MODE_4, MODE_4, MODE_4, MODE_4, 1'd0
-            };
-        end
-        8, 9: begin
-            assign RD_ADDR_15 = RD_ADDR_TOTAL << 3;
-            assign WR_ADDR_15 = WR_ADDR_TOTAL << 3;
-            defparam bram_asymmetric.MODE_BITS = { 1'b0,
-                11'd10, 11'd10, 4'd0, MODE_9, MODE_9, MODE_9, MODE_9, 1'd0,
-                12'd10, 12'd10, 4'd0, MODE_9, MODE_9, MODE_9, MODE_9, 1'd0
-            };
-        end
-
-        16, 18: begin
-            assign RD_ADDR_15 = RD_ADDR_TOTAL << 4;
-            assign WR_ADDR_15 = WR_ADDR_TOTAL << 4;
-            defparam bram_asymmetric.MODE_BITS = { 1'b0,
-                11'd10, 11'd10, 4'd0, MODE_18, MODE_18, MODE_18, MODE_18, 1'd0,
-                12'd10, 12'd10, 4'd0, MODE_18, MODE_18, MODE_18, MODE_18, 1'd0
-            };
-        end
-        32, 36: begin
-            assign RD_ADDR_15 = RD_ADDR_TOTAL << 5;
-            assign WR_ADDR_15 = WR_ADDR_TOTAL << 5;
-            defparam bram_asymmetric.MODE_BITS = { 1'b0,
-                11'd10, 11'd10, 4'd0, MODE_36, MODE_36, MODE_36, MODE_36, 1'd0,
-                12'd10, 12'd10, 4'd0, MODE_36, MODE_36, MODE_36, MODE_36, 1'd0
-            };
-        end
-        default: begin
-            assign RD_ADDR_15 = RD_ADDR_TOTAL;
-            assign WR_ADDR_15 = WR_ADDR_TOTAL;
-            defparam bram_asymmetric.MODE_BITS = { 1'b0,
-                11'd10, 11'd10, 4'd0, MODE_36, MODE_36, MODE_36, MODE_36, 1'd0,
-                12'd10, 12'd10, 4'd0, MODE_36, MODE_36, MODE_36, MODE_36, 1'd0
-            };
-        end
-    endcase
-
-    assign FLUSH1 = 1'b0;
-    assign FLUSH2 = 1'b0;
-
-    TDP36K bram_asymmetric (
-        .RESET_ni(1'b1),
-        .WDATA_A1_i(18'h3FFFF),
-        .WDATA_A2_i(18'h3FFFF),
-        .RDATA_A1_o(RD_DATA_TOTAL[17:0]),
-        .RDATA_A2_o(RD_DATA_TOTAL[35:18]),
-        .ADDR_A1_i(RD_ADDR_15),
-        .ADDR_A2_i(RD_ADDR_15),
-        .CLK_A1_i(RD_CLK),
-        .CLK_A2_i(RD_CLK),
-        .REN_A1_i(RD_EN),
-        .REN_A2_i(RD_EN),
-        .WEN_A1_i(1'b0),
-        .WEN_A2_i(1'b0),
-        .BE_A1_i({RD_EN, RD_EN}),
-        .BE_A2_i({RD_EN, RD_EN}),
-
-        .WDATA_B1_i(WR_DATA[17:0]),
-        .WDATA_B2_i(WR_DATA[35:18]),
-        .RDATA_B1_o(DOBDO[17:0]),
-        .RDATA_B2_o(DOBDO[35:18]),
-        .ADDR_B1_i(WR_ADDR_15),
-        .ADDR_B2_i(WR_ADDR_15),
-        .CLK_B1_i(WR_CLK),
-        .CLK_B2_i(WR_CLK),
-        .REN_B1_i(1'b0),
-        .REN_B2_i(1'b0),
-        .WEN_B1_i(WR_EN[0]),
-        .WEN_B2_i(WR_EN[0]),
-        .BE_B1_i(WR_EN[1:0]),
-        .BE_B2_i(WR_EN[3:2]),
-
-        .FLUSH1_i(FLUSH1),
-        .FLUSH2_i(FLUSH2)
-    );
-endmodule
diff --git a/ql-qlf-plugin/qlf_k6n10f/dsp_sim.v b/ql-qlf-plugin/qlf_k6n10f/dsp_sim.v
index 14ec751..cdaa81b 100644
--- a/ql-qlf-plugin/qlf_k6n10f/dsp_sim.v
+++ b/ql-qlf-plugin/qlf_k6n10f/dsp_sim.v
@@ -14,6 +14,8 @@
 //
 // SPDX-License-Identifier: Apache-2.0
 
+`timescale 1ps/1ps
+
 `default_nettype none
 
 (* blackbox *)
@@ -221,20 +223,1478 @@
     ) dsp (
         .a(a),
         .b(b),
+        .acc_fir(6'b0),
         .z(z),
+        .dly_b(),
 
+        .clk(1'b0),
         .reset(reset),
 
         .f_mode(f_mode),
 
         .feedback(feedback),
+        .load_acc(1'b0),
 
         .unsigned_a(unsigned_a),
         .unsigned_b(unsigned_b),
 
         .output_select(output_select),      // unregistered output: a * b (0)
+        .saturate_enable(1'b0),
+        .shift_right(6'b0),
+        .round(1'b0),
+        .subtract(1'b0),
         .register_inputs(register_inputs)   // unregistered inputs
     );
+	
+`ifdef SDF_SIM	
+	specify
+        (a[0] => z[0]) = 0;
+        (a[1] => z[0]) = 0;
+        (a[2] => z[0]) = 0;
+        (a[3] => z[0]) = 0;
+        (a[4] => z[0]) = 0;
+        (a[5] => z[0]) = 0;
+        (a[6] => z[0]) = 0;
+        (a[7] => z[0]) = 0;
+        (a[8] => z[0]) = 0;
+        (a[9] => z[0]) = 0;
+        (a[10] => z[0]) = 0;
+        (a[11] => z[0]) = 0;
+        (a[12] => z[0]) = 0;
+        (a[13] => z[0]) = 0;
+        (a[14] => z[0]) = 0;
+        (a[15] => z[0]) = 0;
+        (a[16] => z[0]) = 0;
+        (a[17] => z[0]) = 0;
+        (a[18] => z[0]) = 0;
+        (a[19] => z[0]) = 0;
+        (b[0] => z[0]) = 0;
+        (b[1] => z[0]) = 0;
+        (b[2] => z[0]) = 0;
+        (b[3] => z[0]) = 0;
+        (b[4] => z[0]) = 0;
+        (b[5] => z[0]) = 0;
+        (b[6] => z[0]) = 0;
+        (b[7] => z[0]) = 0;
+        (b[8] => z[0]) = 0;
+        (b[9] => z[0]) = 0;
+        (b[10] => z[0]) = 0;
+        (b[11] => z[0]) = 0;
+        (b[12] => z[0]) = 0;
+        (b[13] => z[0]) = 0;
+        (b[14] => z[0]) = 0;
+        (b[15] => z[0]) = 0;
+        (b[16] => z[0]) = 0;
+        (b[17] => z[0]) = 0;
+        (a[0] => z[1]) = 0;
+        (a[1] => z[1]) = 0;
+        (a[2] => z[1]) = 0;
+        (a[3] => z[1]) = 0;
+        (a[4] => z[1]) = 0;
+        (a[5] => z[1]) = 0;
+        (a[6] => z[1]) = 0;
+        (a[7] => z[1]) = 0;
+        (a[8] => z[1]) = 0;
+        (a[9] => z[1]) = 0;
+        (a[10] => z[1]) = 0;
+        (a[11] => z[1]) = 0;
+        (a[12] => z[1]) = 0;
+        (a[13] => z[1]) = 0;
+        (a[14] => z[1]) = 0;
+        (a[15] => z[1]) = 0;
+        (a[16] => z[1]) = 0;
+        (a[17] => z[1]) = 0;
+        (a[18] => z[1]) = 0;
+        (a[19] => z[1]) = 0;
+        (b[0] => z[1]) = 0;
+        (b[1] => z[1]) = 0;
+        (b[2] => z[1]) = 0;
+        (b[3] => z[1]) = 0;
+        (b[4] => z[1]) = 0;
+        (b[5] => z[1]) = 0;
+        (b[6] => z[1]) = 0;
+        (b[7] => z[1]) = 0;
+        (b[8] => z[1]) = 0;
+        (b[9] => z[1]) = 0;
+        (b[10] => z[1]) = 0;
+        (b[11] => z[1]) = 0;
+        (b[12] => z[1]) = 0;
+        (b[13] => z[1]) = 0;
+        (b[14] => z[1]) = 0;
+        (b[15] => z[1]) = 0;
+        (b[16] => z[1]) = 0;
+        (b[17] => z[1]) = 0;
+        (a[0] => z[2]) = 0;
+        (a[1] => z[2]) = 0;
+        (a[2] => z[2]) = 0;
+        (a[3] => z[2]) = 0;
+        (a[4] => z[2]) = 0;
+        (a[5] => z[2]) = 0;
+        (a[6] => z[2]) = 0;
+        (a[7] => z[2]) = 0;
+        (a[8] => z[2]) = 0;
+        (a[9] => z[2]) = 0;
+        (a[10] => z[2]) = 0;
+        (a[11] => z[2]) = 0;
+        (a[12] => z[2]) = 0;
+        (a[13] => z[2]) = 0;
+        (a[14] => z[2]) = 0;
+        (a[15] => z[2]) = 0;
+        (a[16] => z[2]) = 0;
+        (a[17] => z[2]) = 0;
+        (a[18] => z[2]) = 0;
+        (a[19] => z[2]) = 0;
+        (b[0] => z[2]) = 0;
+        (b[1] => z[2]) = 0;
+        (b[2] => z[2]) = 0;
+        (b[3] => z[2]) = 0;
+        (b[4] => z[2]) = 0;
+        (b[5] => z[2]) = 0;
+        (b[6] => z[2]) = 0;
+        (b[7] => z[2]) = 0;
+        (b[8] => z[2]) = 0;
+        (b[9] => z[2]) = 0;
+        (b[10] => z[2]) = 0;
+        (b[11] => z[2]) = 0;
+        (b[12] => z[2]) = 0;
+        (b[13] => z[2]) = 0;
+        (b[14] => z[2]) = 0;
+        (b[15] => z[2]) = 0;
+        (b[16] => z[2]) = 0;
+        (b[17] => z[2]) = 0;
+        (a[0] => z[3]) = 0;
+        (a[1] => z[3]) = 0;
+        (a[2] => z[3]) = 0;
+        (a[3] => z[3]) = 0;
+        (a[4] => z[3]) = 0;
+        (a[5] => z[3]) = 0;
+        (a[6] => z[3]) = 0;
+        (a[7] => z[3]) = 0;
+        (a[8] => z[3]) = 0;
+        (a[9] => z[3]) = 0;
+        (a[10] => z[3]) = 0;
+        (a[11] => z[3]) = 0;
+        (a[12] => z[3]) = 0;
+        (a[13] => z[3]) = 0;
+        (a[14] => z[3]) = 0;
+        (a[15] => z[3]) = 0;
+        (a[16] => z[3]) = 0;
+        (a[17] => z[3]) = 0;
+        (a[18] => z[3]) = 0;
+        (a[19] => z[3]) = 0;
+        (b[0] => z[3]) = 0;
+        (b[1] => z[3]) = 0;
+        (b[2] => z[3]) = 0;
+        (b[3] => z[3]) = 0;
+        (b[4] => z[3]) = 0;
+        (b[5] => z[3]) = 0;
+        (b[6] => z[3]) = 0;
+        (b[7] => z[3]) = 0;
+        (b[8] => z[3]) = 0;
+        (b[9] => z[3]) = 0;
+        (b[10] => z[3]) = 0;
+        (b[11] => z[3]) = 0;
+        (b[12] => z[3]) = 0;
+        (b[13] => z[3]) = 0;
+        (b[14] => z[3]) = 0;
+        (b[15] => z[3]) = 0;
+        (b[16] => z[3]) = 0;
+        (b[17] => z[3]) = 0;
+        (a[0] => z[4]) = 0;
+        (a[1] => z[4]) = 0;
+        (a[2] => z[4]) = 0;
+        (a[3] => z[4]) = 0;
+        (a[4] => z[4]) = 0;
+        (a[5] => z[4]) = 0;
+        (a[6] => z[4]) = 0;
+        (a[7] => z[4]) = 0;
+        (a[8] => z[4]) = 0;
+        (a[9] => z[4]) = 0;
+        (a[10] => z[4]) = 0;
+        (a[11] => z[4]) = 0;
+        (a[12] => z[4]) = 0;
+        (a[13] => z[4]) = 0;
+        (a[14] => z[4]) = 0;
+        (a[15] => z[4]) = 0;
+        (a[16] => z[4]) = 0;
+        (a[17] => z[4]) = 0;
+        (a[18] => z[4]) = 0;
+        (a[19] => z[4]) = 0;
+        (b[0] => z[4]) = 0;
+        (b[1] => z[4]) = 0;
+        (b[2] => z[4]) = 0;
+        (b[3] => z[4]) = 0;
+        (b[4] => z[4]) = 0;
+        (b[5] => z[4]) = 0;
+        (b[6] => z[4]) = 0;
+        (b[7] => z[4]) = 0;
+        (b[8] => z[4]) = 0;
+        (b[9] => z[4]) = 0;
+        (b[10] => z[4]) = 0;
+        (b[11] => z[4]) = 0;
+        (b[12] => z[4]) = 0;
+        (b[13] => z[4]) = 0;
+        (b[14] => z[4]) = 0;
+        (b[15] => z[4]) = 0;
+        (b[16] => z[4]) = 0;
+        (b[17] => z[4]) = 0;
+        (a[0] => z[5]) = 0;
+        (a[1] => z[5]) = 0;
+        (a[2] => z[5]) = 0;
+        (a[3] => z[5]) = 0;
+        (a[4] => z[5]) = 0;
+        (a[5] => z[5]) = 0;
+        (a[6] => z[5]) = 0;
+        (a[7] => z[5]) = 0;
+        (a[8] => z[5]) = 0;
+        (a[9] => z[5]) = 0;
+        (a[10] => z[5]) = 0;
+        (a[11] => z[5]) = 0;
+        (a[12] => z[5]) = 0;
+        (a[13] => z[5]) = 0;
+        (a[14] => z[5]) = 0;
+        (a[15] => z[5]) = 0;
+        (a[16] => z[5]) = 0;
+        (a[17] => z[5]) = 0;
+        (a[18] => z[5]) = 0;
+        (a[19] => z[5]) = 0;
+        (b[0] => z[5]) = 0;
+        (b[1] => z[5]) = 0;
+        (b[2] => z[5]) = 0;
+        (b[3] => z[5]) = 0;
+        (b[4] => z[5]) = 0;
+        (b[5] => z[5]) = 0;
+        (b[6] => z[5]) = 0;
+        (b[7] => z[5]) = 0;
+        (b[8] => z[5]) = 0;
+        (b[9] => z[5]) = 0;
+        (b[10] => z[5]) = 0;
+        (b[11] => z[5]) = 0;
+        (b[12] => z[5]) = 0;
+        (b[13] => z[5]) = 0;
+        (b[14] => z[5]) = 0;
+        (b[15] => z[5]) = 0;
+        (b[16] => z[5]) = 0;
+        (b[17] => z[5]) = 0;
+        (a[0] => z[6]) = 0;
+        (a[1] => z[6]) = 0;
+        (a[2] => z[6]) = 0;
+        (a[3] => z[6]) = 0;
+        (a[4] => z[6]) = 0;
+        (a[5] => z[6]) = 0;
+        (a[6] => z[6]) = 0;
+        (a[7] => z[6]) = 0;
+        (a[8] => z[6]) = 0;
+        (a[9] => z[6]) = 0;
+        (a[10] => z[6]) = 0;
+        (a[11] => z[6]) = 0;
+        (a[12] => z[6]) = 0;
+        (a[13] => z[6]) = 0;
+        (a[14] => z[6]) = 0;
+        (a[15] => z[6]) = 0;
+        (a[16] => z[6]) = 0;
+        (a[17] => z[6]) = 0;
+        (a[18] => z[6]) = 0;
+        (a[19] => z[6]) = 0;
+        (b[0] => z[6]) = 0;
+        (b[1] => z[6]) = 0;
+        (b[2] => z[6]) = 0;
+        (b[3] => z[6]) = 0;
+        (b[4] => z[6]) = 0;
+        (b[5] => z[6]) = 0;
+        (b[6] => z[6]) = 0;
+        (b[7] => z[6]) = 0;
+        (b[8] => z[6]) = 0;
+        (b[9] => z[6]) = 0;
+        (b[10] => z[6]) = 0;
+        (b[11] => z[6]) = 0;
+        (b[12] => z[6]) = 0;
+        (b[13] => z[6]) = 0;
+        (b[14] => z[6]) = 0;
+        (b[15] => z[6]) = 0;
+        (b[16] => z[6]) = 0;
+        (b[17] => z[6]) = 0;
+        (a[0] => z[7]) = 0;
+        (a[1] => z[7]) = 0;
+        (a[2] => z[7]) = 0;
+        (a[3] => z[7]) = 0;
+        (a[4] => z[7]) = 0;
+        (a[5] => z[7]) = 0;
+        (a[6] => z[7]) = 0;
+        (a[7] => z[7]) = 0;
+        (a[8] => z[7]) = 0;
+        (a[9] => z[7]) = 0;
+        (a[10] => z[7]) = 0;
+        (a[11] => z[7]) = 0;
+        (a[12] => z[7]) = 0;
+        (a[13] => z[7]) = 0;
+        (a[14] => z[7]) = 0;
+        (a[15] => z[7]) = 0;
+        (a[16] => z[7]) = 0;
+        (a[17] => z[7]) = 0;
+        (a[18] => z[7]) = 0;
+        (a[19] => z[7]) = 0;
+        (b[0] => z[7]) = 0;
+        (b[1] => z[7]) = 0;
+        (b[2] => z[7]) = 0;
+        (b[3] => z[7]) = 0;
+        (b[4] => z[7]) = 0;
+        (b[5] => z[7]) = 0;
+        (b[6] => z[7]) = 0;
+        (b[7] => z[7]) = 0;
+        (b[8] => z[7]) = 0;
+        (b[9] => z[7]) = 0;
+        (b[10] => z[7]) = 0;
+        (b[11] => z[7]) = 0;
+        (b[12] => z[7]) = 0;
+        (b[13] => z[7]) = 0;
+        (b[14] => z[7]) = 0;
+        (b[15] => z[7]) = 0;
+        (b[16] => z[7]) = 0;
+        (b[17] => z[7]) = 0;
+        (a[0] => z[8]) = 0;
+        (a[1] => z[8]) = 0;
+        (a[2] => z[8]) = 0;
+        (a[3] => z[8]) = 0;
+        (a[4] => z[8]) = 0;
+        (a[5] => z[8]) = 0;
+        (a[6] => z[8]) = 0;
+        (a[7] => z[8]) = 0;
+        (a[8] => z[8]) = 0;
+        (a[9] => z[8]) = 0;
+        (a[10] => z[8]) = 0;
+        (a[11] => z[8]) = 0;
+        (a[12] => z[8]) = 0;
+        (a[13] => z[8]) = 0;
+        (a[14] => z[8]) = 0;
+        (a[15] => z[8]) = 0;
+        (a[16] => z[8]) = 0;
+        (a[17] => z[8]) = 0;
+        (a[18] => z[8]) = 0;
+        (a[19] => z[8]) = 0;
+        (b[0] => z[8]) = 0;
+        (b[1] => z[8]) = 0;
+        (b[2] => z[8]) = 0;
+        (b[3] => z[8]) = 0;
+        (b[4] => z[8]) = 0;
+        (b[5] => z[8]) = 0;
+        (b[6] => z[8]) = 0;
+        (b[7] => z[8]) = 0;
+        (b[8] => z[8]) = 0;
+        (b[9] => z[8]) = 0;
+        (b[10] => z[8]) = 0;
+        (b[11] => z[8]) = 0;
+        (b[12] => z[8]) = 0;
+        (b[13] => z[8]) = 0;
+        (b[14] => z[8]) = 0;
+        (b[15] => z[8]) = 0;
+        (b[16] => z[8]) = 0;
+        (b[17] => z[8]) = 0;
+        (a[0] => z[9]) = 0;
+        (a[1] => z[9]) = 0;
+        (a[2] => z[9]) = 0;
+        (a[3] => z[9]) = 0;
+        (a[4] => z[9]) = 0;
+        (a[5] => z[9]) = 0;
+        (a[6] => z[9]) = 0;
+        (a[7] => z[9]) = 0;
+        (a[8] => z[9]) = 0;
+        (a[9] => z[9]) = 0;
+        (a[10] => z[9]) = 0;
+        (a[11] => z[9]) = 0;
+        (a[12] => z[9]) = 0;
+        (a[13] => z[9]) = 0;
+        (a[14] => z[9]) = 0;
+        (a[15] => z[9]) = 0;
+        (a[16] => z[9]) = 0;
+        (a[17] => z[9]) = 0;
+        (a[18] => z[9]) = 0;
+        (a[19] => z[9]) = 0;
+        (b[0] => z[9]) = 0;
+        (b[1] => z[9]) = 0;
+        (b[2] => z[9]) = 0;
+        (b[3] => z[9]) = 0;
+        (b[4] => z[9]) = 0;
+        (b[5] => z[9]) = 0;
+        (b[6] => z[9]) = 0;
+        (b[7] => z[9]) = 0;
+        (b[8] => z[9]) = 0;
+        (b[9] => z[9]) = 0;
+        (b[10] => z[9]) = 0;
+        (b[11] => z[9]) = 0;
+        (b[12] => z[9]) = 0;
+        (b[13] => z[9]) = 0;
+        (b[14] => z[9]) = 0;
+        (b[15] => z[9]) = 0;
+        (b[16] => z[9]) = 0;
+        (b[17] => z[9]) = 0;
+        (a[0] => z[10]) = 0;
+        (a[1] => z[10]) = 0;
+        (a[2] => z[10]) = 0;
+        (a[3] => z[10]) = 0;
+        (a[4] => z[10]) = 0;
+        (a[5] => z[10]) = 0;
+        (a[6] => z[10]) = 0;
+        (a[7] => z[10]) = 0;
+        (a[8] => z[10]) = 0;
+        (a[9] => z[10]) = 0;
+        (a[10] => z[10]) = 0;
+        (a[11] => z[10]) = 0;
+        (a[12] => z[10]) = 0;
+        (a[13] => z[10]) = 0;
+        (a[14] => z[10]) = 0;
+        (a[15] => z[10]) = 0;
+        (a[16] => z[10]) = 0;
+        (a[17] => z[10]) = 0;
+        (a[18] => z[10]) = 0;
+        (a[19] => z[10]) = 0;
+        (b[0] => z[10]) = 0;
+        (b[1] => z[10]) = 0;
+        (b[2] => z[10]) = 0;
+        (b[3] => z[10]) = 0;
+        (b[4] => z[10]) = 0;
+        (b[5] => z[10]) = 0;
+        (b[6] => z[10]) = 0;
+        (b[7] => z[10]) = 0;
+        (b[8] => z[10]) = 0;
+        (b[9] => z[10]) = 0;
+        (b[10] => z[10]) = 0;
+        (b[11] => z[10]) = 0;
+        (b[12] => z[10]) = 0;
+        (b[13] => z[10]) = 0;
+        (b[14] => z[10]) = 0;
+        (b[15] => z[10]) = 0;
+        (b[16] => z[10]) = 0;
+        (b[17] => z[10]) = 0;
+        (a[0] => z[11]) = 0;
+        (a[1] => z[11]) = 0;
+        (a[2] => z[11]) = 0;
+        (a[3] => z[11]) = 0;
+        (a[4] => z[11]) = 0;
+        (a[5] => z[11]) = 0;
+        (a[6] => z[11]) = 0;
+        (a[7] => z[11]) = 0;
+        (a[8] => z[11]) = 0;
+        (a[9] => z[11]) = 0;
+        (a[10] => z[11]) = 0;
+        (a[11] => z[11]) = 0;
+        (a[12] => z[11]) = 0;
+        (a[13] => z[11]) = 0;
+        (a[14] => z[11]) = 0;
+        (a[15] => z[11]) = 0;
+        (a[16] => z[11]) = 0;
+        (a[17] => z[11]) = 0;
+        (a[18] => z[11]) = 0;
+        (a[19] => z[11]) = 0;
+        (b[0] => z[11]) = 0;
+        (b[1] => z[11]) = 0;
+        (b[2] => z[11]) = 0;
+        (b[3] => z[11]) = 0;
+        (b[4] => z[11]) = 0;
+        (b[5] => z[11]) = 0;
+        (b[6] => z[11]) = 0;
+        (b[7] => z[11]) = 0;
+        (b[8] => z[11]) = 0;
+        (b[9] => z[11]) = 0;
+        (b[10] => z[11]) = 0;
+        (b[11] => z[11]) = 0;
+        (b[12] => z[11]) = 0;
+        (b[13] => z[11]) = 0;
+        (b[14] => z[11]) = 0;
+        (b[15] => z[11]) = 0;
+        (b[16] => z[11]) = 0;
+        (b[17] => z[11]) = 0;
+        (a[0] => z[12]) = 0;
+        (a[1] => z[12]) = 0;
+        (a[2] => z[12]) = 0;
+        (a[3] => z[12]) = 0;
+        (a[4] => z[12]) = 0;
+        (a[5] => z[12]) = 0;
+        (a[6] => z[12]) = 0;
+        (a[7] => z[12]) = 0;
+        (a[8] => z[12]) = 0;
+        (a[9] => z[12]) = 0;
+        (a[10] => z[12]) = 0;
+        (a[11] => z[12]) = 0;
+        (a[12] => z[12]) = 0;
+        (a[13] => z[12]) = 0;
+        (a[14] => z[12]) = 0;
+        (a[15] => z[12]) = 0;
+        (a[16] => z[12]) = 0;
+        (a[17] => z[12]) = 0;
+        (a[18] => z[12]) = 0;
+        (a[19] => z[12]) = 0;
+        (b[0] => z[12]) = 0;
+        (b[1] => z[12]) = 0;
+        (b[2] => z[12]) = 0;
+        (b[3] => z[12]) = 0;
+        (b[4] => z[12]) = 0;
+        (b[5] => z[12]) = 0;
+        (b[6] => z[12]) = 0;
+        (b[7] => z[12]) = 0;
+        (b[8] => z[12]) = 0;
+        (b[9] => z[12]) = 0;
+        (b[10] => z[12]) = 0;
+        (b[11] => z[12]) = 0;
+        (b[12] => z[12]) = 0;
+        (b[13] => z[12]) = 0;
+        (b[14] => z[12]) = 0;
+        (b[15] => z[12]) = 0;
+        (b[16] => z[12]) = 0;
+        (b[17] => z[12]) = 0;
+        (a[0] => z[13]) = 0;
+        (a[1] => z[13]) = 0;
+        (a[2] => z[13]) = 0;
+        (a[3] => z[13]) = 0;
+        (a[4] => z[13]) = 0;
+        (a[5] => z[13]) = 0;
+        (a[6] => z[13]) = 0;
+        (a[7] => z[13]) = 0;
+        (a[8] => z[13]) = 0;
+        (a[9] => z[13]) = 0;
+        (a[10] => z[13]) = 0;
+        (a[11] => z[13]) = 0;
+        (a[12] => z[13]) = 0;
+        (a[13] => z[13]) = 0;
+        (a[14] => z[13]) = 0;
+        (a[15] => z[13]) = 0;
+        (a[16] => z[13]) = 0;
+        (a[17] => z[13]) = 0;
+        (a[18] => z[13]) = 0;
+        (a[19] => z[13]) = 0;
+        (b[0] => z[13]) = 0;
+        (b[1] => z[13]) = 0;
+        (b[2] => z[13]) = 0;
+        (b[3] => z[13]) = 0;
+        (b[4] => z[13]) = 0;
+        (b[5] => z[13]) = 0;
+        (b[6] => z[13]) = 0;
+        (b[7] => z[13]) = 0;
+        (b[8] => z[13]) = 0;
+        (b[9] => z[13]) = 0;
+        (b[10] => z[13]) = 0;
+        (b[11] => z[13]) = 0;
+        (b[12] => z[13]) = 0;
+        (b[13] => z[13]) = 0;
+        (b[14] => z[13]) = 0;
+        (b[15] => z[13]) = 0;
+        (b[16] => z[13]) = 0;
+        (b[17] => z[13]) = 0;
+        (a[0] => z[14]) = 0;
+        (a[1] => z[14]) = 0;
+        (a[2] => z[14]) = 0;
+        (a[3] => z[14]) = 0;
+        (a[4] => z[14]) = 0;
+        (a[5] => z[14]) = 0;
+        (a[6] => z[14]) = 0;
+        (a[7] => z[14]) = 0;
+        (a[8] => z[14]) = 0;
+        (a[9] => z[14]) = 0;
+        (a[10] => z[14]) = 0;
+        (a[11] => z[14]) = 0;
+        (a[12] => z[14]) = 0;
+        (a[13] => z[14]) = 0;
+        (a[14] => z[14]) = 0;
+        (a[15] => z[14]) = 0;
+        (a[16] => z[14]) = 0;
+        (a[17] => z[14]) = 0;
+        (a[18] => z[14]) = 0;
+        (a[19] => z[14]) = 0;
+        (b[0] => z[14]) = 0;
+        (b[1] => z[14]) = 0;
+        (b[2] => z[14]) = 0;
+        (b[3] => z[14]) = 0;
+        (b[4] => z[14]) = 0;
+        (b[5] => z[14]) = 0;
+        (b[6] => z[14]) = 0;
+        (b[7] => z[14]) = 0;
+        (b[8] => z[14]) = 0;
+        (b[9] => z[14]) = 0;
+        (b[10] => z[14]) = 0;
+        (b[11] => z[14]) = 0;
+        (b[12] => z[14]) = 0;
+        (b[13] => z[14]) = 0;
+        (b[14] => z[14]) = 0;
+        (b[15] => z[14]) = 0;
+        (b[16] => z[14]) = 0;
+        (b[17] => z[14]) = 0;
+        (a[0] => z[15]) = 0;
+        (a[1] => z[15]) = 0;
+        (a[2] => z[15]) = 0;
+        (a[3] => z[15]) = 0;
+        (a[4] => z[15]) = 0;
+        (a[5] => z[15]) = 0;
+        (a[6] => z[15]) = 0;
+        (a[7] => z[15]) = 0;
+        (a[8] => z[15]) = 0;
+        (a[9] => z[15]) = 0;
+        (a[10] => z[15]) = 0;
+        (a[11] => z[15]) = 0;
+        (a[12] => z[15]) = 0;
+        (a[13] => z[15]) = 0;
+        (a[14] => z[15]) = 0;
+        (a[15] => z[15]) = 0;
+        (a[16] => z[15]) = 0;
+        (a[17] => z[15]) = 0;
+        (a[18] => z[15]) = 0;
+        (a[19] => z[15]) = 0;
+        (b[0] => z[15]) = 0;
+        (b[1] => z[15]) = 0;
+        (b[2] => z[15]) = 0;
+        (b[3] => z[15]) = 0;
+        (b[4] => z[15]) = 0;
+        (b[5] => z[15]) = 0;
+        (b[6] => z[15]) = 0;
+        (b[7] => z[15]) = 0;
+        (b[8] => z[15]) = 0;
+        (b[9] => z[15]) = 0;
+        (b[10] => z[15]) = 0;
+        (b[11] => z[15]) = 0;
+        (b[12] => z[15]) = 0;
+        (b[13] => z[15]) = 0;
+        (b[14] => z[15]) = 0;
+        (b[15] => z[15]) = 0;
+        (b[16] => z[15]) = 0;
+        (b[17] => z[15]) = 0;
+        (a[0] => z[16]) = 0;
+        (a[1] => z[16]) = 0;
+        (a[2] => z[16]) = 0;
+        (a[3] => z[16]) = 0;
+        (a[4] => z[16]) = 0;
+        (a[5] => z[16]) = 0;
+        (a[6] => z[16]) = 0;
+        (a[7] => z[16]) = 0;
+        (a[8] => z[16]) = 0;
+        (a[9] => z[16]) = 0;
+        (a[10] => z[16]) = 0;
+        (a[11] => z[16]) = 0;
+        (a[12] => z[16]) = 0;
+        (a[13] => z[16]) = 0;
+        (a[14] => z[16]) = 0;
+        (a[15] => z[16]) = 0;
+        (a[16] => z[16]) = 0;
+        (a[17] => z[16]) = 0;
+        (a[18] => z[16]) = 0;
+        (a[19] => z[16]) = 0;
+        (b[0] => z[16]) = 0;
+        (b[1] => z[16]) = 0;
+        (b[2] => z[16]) = 0;
+        (b[3] => z[16]) = 0;
+        (b[4] => z[16]) = 0;
+        (b[5] => z[16]) = 0;
+        (b[6] => z[16]) = 0;
+        (b[7] => z[16]) = 0;
+        (b[8] => z[16]) = 0;
+        (b[9] => z[16]) = 0;
+        (b[10] => z[16]) = 0;
+        (b[11] => z[16]) = 0;
+        (b[12] => z[16]) = 0;
+        (b[13] => z[16]) = 0;
+        (b[14] => z[16]) = 0;
+        (b[15] => z[16]) = 0;
+        (b[16] => z[16]) = 0;
+        (b[17] => z[16]) = 0;
+        (a[0] => z[17]) = 0;
+        (a[1] => z[17]) = 0;
+        (a[2] => z[17]) = 0;
+        (a[3] => z[17]) = 0;
+        (a[4] => z[17]) = 0;
+        (a[5] => z[17]) = 0;
+        (a[6] => z[17]) = 0;
+        (a[7] => z[17]) = 0;
+        (a[8] => z[17]) = 0;
+        (a[9] => z[17]) = 0;
+        (a[10] => z[17]) = 0;
+        (a[11] => z[17]) = 0;
+        (a[12] => z[17]) = 0;
+        (a[13] => z[17]) = 0;
+        (a[14] => z[17]) = 0;
+        (a[15] => z[17]) = 0;
+        (a[16] => z[17]) = 0;
+        (a[17] => z[17]) = 0;
+        (a[18] => z[17]) = 0;
+        (a[19] => z[17]) = 0;
+        (b[0] => z[17]) = 0;
+        (b[1] => z[17]) = 0;
+        (b[2] => z[17]) = 0;
+        (b[3] => z[17]) = 0;
+        (b[4] => z[17]) = 0;
+        (b[5] => z[17]) = 0;
+        (b[6] => z[17]) = 0;
+        (b[7] => z[17]) = 0;
+        (b[8] => z[17]) = 0;
+        (b[9] => z[17]) = 0;
+        (b[10] => z[17]) = 0;
+        (b[11] => z[17]) = 0;
+        (b[12] => z[17]) = 0;
+        (b[13] => z[17]) = 0;
+        (b[14] => z[17]) = 0;
+        (b[15] => z[17]) = 0;
+        (b[16] => z[17]) = 0;
+        (b[17] => z[17]) = 0;
+        (a[0] => z[18]) = 0;
+        (a[1] => z[18]) = 0;
+        (a[2] => z[18]) = 0;
+        (a[3] => z[18]) = 0;
+        (a[4] => z[18]) = 0;
+        (a[5] => z[18]) = 0;
+        (a[6] => z[18]) = 0;
+        (a[7] => z[18]) = 0;
+        (a[8] => z[18]) = 0;
+        (a[9] => z[18]) = 0;
+        (a[10] => z[18]) = 0;
+        (a[11] => z[18]) = 0;
+        (a[12] => z[18]) = 0;
+        (a[13] => z[18]) = 0;
+        (a[14] => z[18]) = 0;
+        (a[15] => z[18]) = 0;
+        (a[16] => z[18]) = 0;
+        (a[17] => z[18]) = 0;
+        (a[18] => z[18]) = 0;
+        (a[19] => z[18]) = 0;
+        (b[0] => z[18]) = 0;
+        (b[1] => z[18]) = 0;
+        (b[2] => z[18]) = 0;
+        (b[3] => z[18]) = 0;
+        (b[4] => z[18]) = 0;
+        (b[5] => z[18]) = 0;
+        (b[6] => z[18]) = 0;
+        (b[7] => z[18]) = 0;
+        (b[8] => z[18]) = 0;
+        (b[9] => z[18]) = 0;
+        (b[10] => z[18]) = 0;
+        (b[11] => z[18]) = 0;
+        (b[12] => z[18]) = 0;
+        (b[13] => z[18]) = 0;
+        (b[14] => z[18]) = 0;
+        (b[15] => z[18]) = 0;
+        (b[16] => z[18]) = 0;
+        (b[17] => z[18]) = 0;
+        (a[0] => z[19]) = 0;
+        (a[1] => z[19]) = 0;
+        (a[2] => z[19]) = 0;
+        (a[3] => z[19]) = 0;
+        (a[4] => z[19]) = 0;
+        (a[5] => z[19]) = 0;
+        (a[6] => z[19]) = 0;
+        (a[7] => z[19]) = 0;
+        (a[8] => z[19]) = 0;
+        (a[9] => z[19]) = 0;
+        (a[10] => z[19]) = 0;
+        (a[11] => z[19]) = 0;
+        (a[12] => z[19]) = 0;
+        (a[13] => z[19]) = 0;
+        (a[14] => z[19]) = 0;
+        (a[15] => z[19]) = 0;
+        (a[16] => z[19]) = 0;
+        (a[17] => z[19]) = 0;
+        (a[18] => z[19]) = 0;
+        (a[19] => z[19]) = 0;
+        (b[0] => z[19]) = 0;
+        (b[1] => z[19]) = 0;
+        (b[2] => z[19]) = 0;
+        (b[3] => z[19]) = 0;
+        (b[4] => z[19]) = 0;
+        (b[5] => z[19]) = 0;
+        (b[6] => z[19]) = 0;
+        (b[7] => z[19]) = 0;
+        (b[8] => z[19]) = 0;
+        (b[9] => z[19]) = 0;
+        (b[10] => z[19]) = 0;
+        (b[11] => z[19]) = 0;
+        (b[12] => z[19]) = 0;
+        (b[13] => z[19]) = 0;
+        (b[14] => z[19]) = 0;
+        (b[15] => z[19]) = 0;
+        (b[16] => z[19]) = 0;
+        (b[17] => z[19]) = 0;
+        (a[0] => z[20]) = 0;
+        (a[1] => z[20]) = 0;
+        (a[2] => z[20]) = 0;
+        (a[3] => z[20]) = 0;
+        (a[4] => z[20]) = 0;
+        (a[5] => z[20]) = 0;
+        (a[6] => z[20]) = 0;
+        (a[7] => z[20]) = 0;
+        (a[8] => z[20]) = 0;
+        (a[9] => z[20]) = 0;
+        (a[10] => z[20]) = 0;
+        (a[11] => z[20]) = 0;
+        (a[12] => z[20]) = 0;
+        (a[13] => z[20]) = 0;
+        (a[14] => z[20]) = 0;
+        (a[15] => z[20]) = 0;
+        (a[16] => z[20]) = 0;
+        (a[17] => z[20]) = 0;
+        (a[18] => z[20]) = 0;
+        (a[19] => z[20]) = 0;
+        (b[0] => z[20]) = 0;
+        (b[1] => z[20]) = 0;
+        (b[2] => z[20]) = 0;
+        (b[3] => z[20]) = 0;
+        (b[4] => z[20]) = 0;
+        (b[5] => z[20]) = 0;
+        (b[6] => z[20]) = 0;
+        (b[7] => z[20]) = 0;
+        (b[8] => z[20]) = 0;
+        (b[9] => z[20]) = 0;
+        (b[10] => z[20]) = 0;
+        (b[11] => z[20]) = 0;
+        (b[12] => z[20]) = 0;
+        (b[13] => z[20]) = 0;
+        (b[14] => z[20]) = 0;
+        (b[15] => z[20]) = 0;
+        (b[16] => z[20]) = 0;
+        (b[17] => z[20]) = 0;
+        (a[0] => z[21]) = 0;
+        (a[1] => z[21]) = 0;
+        (a[2] => z[21]) = 0;
+        (a[3] => z[21]) = 0;
+        (a[4] => z[21]) = 0;
+        (a[5] => z[21]) = 0;
+        (a[6] => z[21]) = 0;
+        (a[7] => z[21]) = 0;
+        (a[8] => z[21]) = 0;
+        (a[9] => z[21]) = 0;
+        (a[10] => z[21]) = 0;
+        (a[11] => z[21]) = 0;
+        (a[12] => z[21]) = 0;
+        (a[13] => z[21]) = 0;
+        (a[14] => z[21]) = 0;
+        (a[15] => z[21]) = 0;
+        (a[16] => z[21]) = 0;
+        (a[17] => z[21]) = 0;
+        (a[18] => z[21]) = 0;
+        (a[19] => z[21]) = 0;
+        (b[0] => z[21]) = 0;
+        (b[1] => z[21]) = 0;
+        (b[2] => z[21]) = 0;
+        (b[3] => z[21]) = 0;
+        (b[4] => z[21]) = 0;
+        (b[5] => z[21]) = 0;
+        (b[6] => z[21]) = 0;
+        (b[7] => z[21]) = 0;
+        (b[8] => z[21]) = 0;
+        (b[9] => z[21]) = 0;
+        (b[10] => z[21]) = 0;
+        (b[11] => z[21]) = 0;
+        (b[12] => z[21]) = 0;
+        (b[13] => z[21]) = 0;
+        (b[14] => z[21]) = 0;
+        (b[15] => z[21]) = 0;
+        (b[16] => z[21]) = 0;
+        (b[17] => z[21]) = 0;
+        (a[0] => z[22]) = 0;
+        (a[1] => z[22]) = 0;
+        (a[2] => z[22]) = 0;
+        (a[3] => z[22]) = 0;
+        (a[4] => z[22]) = 0;
+        (a[5] => z[22]) = 0;
+        (a[6] => z[22]) = 0;
+        (a[7] => z[22]) = 0;
+        (a[8] => z[22]) = 0;
+        (a[9] => z[22]) = 0;
+        (a[10] => z[22]) = 0;
+        (a[11] => z[22]) = 0;
+        (a[12] => z[22]) = 0;
+        (a[13] => z[22]) = 0;
+        (a[14] => z[22]) = 0;
+        (a[15] => z[22]) = 0;
+        (a[16] => z[22]) = 0;
+        (a[17] => z[22]) = 0;
+        (a[18] => z[22]) = 0;
+        (a[19] => z[22]) = 0;
+        (b[0] => z[22]) = 0;
+        (b[1] => z[22]) = 0;
+        (b[2] => z[22]) = 0;
+        (b[3] => z[22]) = 0;
+        (b[4] => z[22]) = 0;
+        (b[5] => z[22]) = 0;
+        (b[6] => z[22]) = 0;
+        (b[7] => z[22]) = 0;
+        (b[8] => z[22]) = 0;
+        (b[9] => z[22]) = 0;
+        (b[10] => z[22]) = 0;
+        (b[11] => z[22]) = 0;
+        (b[12] => z[22]) = 0;
+        (b[13] => z[22]) = 0;
+        (b[14] => z[22]) = 0;
+        (b[15] => z[22]) = 0;
+        (b[16] => z[22]) = 0;
+        (b[17] => z[22]) = 0;
+        (a[0] => z[23]) = 0;
+        (a[1] => z[23]) = 0;
+        (a[2] => z[23]) = 0;
+        (a[3] => z[23]) = 0;
+        (a[4] => z[23]) = 0;
+        (a[5] => z[23]) = 0;
+        (a[6] => z[23]) = 0;
+        (a[7] => z[23]) = 0;
+        (a[8] => z[23]) = 0;
+        (a[9] => z[23]) = 0;
+        (a[10] => z[23]) = 0;
+        (a[11] => z[23]) = 0;
+        (a[12] => z[23]) = 0;
+        (a[13] => z[23]) = 0;
+        (a[14] => z[23]) = 0;
+        (a[15] => z[23]) = 0;
+        (a[16] => z[23]) = 0;
+        (a[17] => z[23]) = 0;
+        (a[18] => z[23]) = 0;
+        (a[19] => z[23]) = 0;
+        (b[0] => z[23]) = 0;
+        (b[1] => z[23]) = 0;
+        (b[2] => z[23]) = 0;
+        (b[3] => z[23]) = 0;
+        (b[4] => z[23]) = 0;
+        (b[5] => z[23]) = 0;
+        (b[6] => z[23]) = 0;
+        (b[7] => z[23]) = 0;
+        (b[8] => z[23]) = 0;
+        (b[9] => z[23]) = 0;
+        (b[10] => z[23]) = 0;
+        (b[11] => z[23]) = 0;
+        (b[12] => z[23]) = 0;
+        (b[13] => z[23]) = 0;
+        (b[14] => z[23]) = 0;
+        (b[15] => z[23]) = 0;
+        (b[16] => z[23]) = 0;
+        (b[17] => z[23]) = 0;
+        (a[0] => z[24]) = 0;
+        (a[1] => z[24]) = 0;
+        (a[2] => z[24]) = 0;
+        (a[3] => z[24]) = 0;
+        (a[4] => z[24]) = 0;
+        (a[5] => z[24]) = 0;
+        (a[6] => z[24]) = 0;
+        (a[7] => z[24]) = 0;
+        (a[8] => z[24]) = 0;
+        (a[9] => z[24]) = 0;
+        (a[10] => z[24]) = 0;
+        (a[11] => z[24]) = 0;
+        (a[12] => z[24]) = 0;
+        (a[13] => z[24]) = 0;
+        (a[14] => z[24]) = 0;
+        (a[15] => z[24]) = 0;
+        (a[16] => z[24]) = 0;
+        (a[17] => z[24]) = 0;
+        (a[18] => z[24]) = 0;
+        (a[19] => z[24]) = 0;
+        (b[0] => z[24]) = 0;
+        (b[1] => z[24]) = 0;
+        (b[2] => z[24]) = 0;
+        (b[3] => z[24]) = 0;
+        (b[4] => z[24]) = 0;
+        (b[5] => z[24]) = 0;
+        (b[6] => z[24]) = 0;
+        (b[7] => z[24]) = 0;
+        (b[8] => z[24]) = 0;
+        (b[9] => z[24]) = 0;
+        (b[10] => z[24]) = 0;
+        (b[11] => z[24]) = 0;
+        (b[12] => z[24]) = 0;
+        (b[13] => z[24]) = 0;
+        (b[14] => z[24]) = 0;
+        (b[15] => z[24]) = 0;
+        (b[16] => z[24]) = 0;
+        (b[17] => z[24]) = 0;
+        (a[0] => z[25]) = 0;
+        (a[1] => z[25]) = 0;
+        (a[2] => z[25]) = 0;
+        (a[3] => z[25]) = 0;
+        (a[4] => z[25]) = 0;
+        (a[5] => z[25]) = 0;
+        (a[6] => z[25]) = 0;
+        (a[7] => z[25]) = 0;
+        (a[8] => z[25]) = 0;
+        (a[9] => z[25]) = 0;
+        (a[10] => z[25]) = 0;
+        (a[11] => z[25]) = 0;
+        (a[12] => z[25]) = 0;
+        (a[13] => z[25]) = 0;
+        (a[14] => z[25]) = 0;
+        (a[15] => z[25]) = 0;
+        (a[16] => z[25]) = 0;
+        (a[17] => z[25]) = 0;
+        (a[18] => z[25]) = 0;
+        (a[19] => z[25]) = 0;
+        (b[0] => z[25]) = 0;
+        (b[1] => z[25]) = 0;
+        (b[2] => z[25]) = 0;
+        (b[3] => z[25]) = 0;
+        (b[4] => z[25]) = 0;
+        (b[5] => z[25]) = 0;
+        (b[6] => z[25]) = 0;
+        (b[7] => z[25]) = 0;
+        (b[8] => z[25]) = 0;
+        (b[9] => z[25]) = 0;
+        (b[10] => z[25]) = 0;
+        (b[11] => z[25]) = 0;
+        (b[12] => z[25]) = 0;
+        (b[13] => z[25]) = 0;
+        (b[14] => z[25]) = 0;
+        (b[15] => z[25]) = 0;
+        (b[16] => z[25]) = 0;
+        (b[17] => z[25]) = 0;
+        (a[0] => z[26]) = 0;
+        (a[1] => z[26]) = 0;
+        (a[2] => z[26]) = 0;
+        (a[3] => z[26]) = 0;
+        (a[4] => z[26]) = 0;
+        (a[5] => z[26]) = 0;
+        (a[6] => z[26]) = 0;
+        (a[7] => z[26]) = 0;
+        (a[8] => z[26]) = 0;
+        (a[9] => z[26]) = 0;
+        (a[10] => z[26]) = 0;
+        (a[11] => z[26]) = 0;
+        (a[12] => z[26]) = 0;
+        (a[13] => z[26]) = 0;
+        (a[14] => z[26]) = 0;
+        (a[15] => z[26]) = 0;
+        (a[16] => z[26]) = 0;
+        (a[17] => z[26]) = 0;
+        (a[18] => z[26]) = 0;
+        (a[19] => z[26]) = 0;
+        (b[0] => z[26]) = 0;
+        (b[1] => z[26]) = 0;
+        (b[2] => z[26]) = 0;
+        (b[3] => z[26]) = 0;
+        (b[4] => z[26]) = 0;
+        (b[5] => z[26]) = 0;
+        (b[6] => z[26]) = 0;
+        (b[7] => z[26]) = 0;
+        (b[8] => z[26]) = 0;
+        (b[9] => z[26]) = 0;
+        (b[10] => z[26]) = 0;
+        (b[11] => z[26]) = 0;
+        (b[12] => z[26]) = 0;
+        (b[13] => z[26]) = 0;
+        (b[14] => z[26]) = 0;
+        (b[15] => z[26]) = 0;
+        (b[16] => z[26]) = 0;
+        (b[17] => z[26]) = 0;
+        (a[0] => z[27]) = 0;
+        (a[1] => z[27]) = 0;
+        (a[2] => z[27]) = 0;
+        (a[3] => z[27]) = 0;
+        (a[4] => z[27]) = 0;
+        (a[5] => z[27]) = 0;
+        (a[6] => z[27]) = 0;
+        (a[7] => z[27]) = 0;
+        (a[8] => z[27]) = 0;
+        (a[9] => z[27]) = 0;
+        (a[10] => z[27]) = 0;
+        (a[11] => z[27]) = 0;
+        (a[12] => z[27]) = 0;
+        (a[13] => z[27]) = 0;
+        (a[14] => z[27]) = 0;
+        (a[15] => z[27]) = 0;
+        (a[16] => z[27]) = 0;
+        (a[17] => z[27]) = 0;
+        (a[18] => z[27]) = 0;
+        (a[19] => z[27]) = 0;
+        (b[0] => z[27]) = 0;
+        (b[1] => z[27]) = 0;
+        (b[2] => z[27]) = 0;
+        (b[3] => z[27]) = 0;
+        (b[4] => z[27]) = 0;
+        (b[5] => z[27]) = 0;
+        (b[6] => z[27]) = 0;
+        (b[7] => z[27]) = 0;
+        (b[8] => z[27]) = 0;
+        (b[9] => z[27]) = 0;
+        (b[10] => z[27]) = 0;
+        (b[11] => z[27]) = 0;
+        (b[12] => z[27]) = 0;
+        (b[13] => z[27]) = 0;
+        (b[14] => z[27]) = 0;
+        (b[15] => z[27]) = 0;
+        (b[16] => z[27]) = 0;
+        (b[17] => z[27]) = 0;
+        (a[0] => z[28]) = 0;
+        (a[1] => z[28]) = 0;
+        (a[2] => z[28]) = 0;
+        (a[3] => z[28]) = 0;
+        (a[4] => z[28]) = 0;
+        (a[5] => z[28]) = 0;
+        (a[6] => z[28]) = 0;
+        (a[7] => z[28]) = 0;
+        (a[8] => z[28]) = 0;
+        (a[9] => z[28]) = 0;
+        (a[10] => z[28]) = 0;
+        (a[11] => z[28]) = 0;
+        (a[12] => z[28]) = 0;
+        (a[13] => z[28]) = 0;
+        (a[14] => z[28]) = 0;
+        (a[15] => z[28]) = 0;
+        (a[16] => z[28]) = 0;
+        (a[17] => z[28]) = 0;
+        (a[18] => z[28]) = 0;
+        (a[19] => z[28]) = 0;
+        (b[0] => z[28]) = 0;
+        (b[1] => z[28]) = 0;
+        (b[2] => z[28]) = 0;
+        (b[3] => z[28]) = 0;
+        (b[4] => z[28]) = 0;
+        (b[5] => z[28]) = 0;
+        (b[6] => z[28]) = 0;
+        (b[7] => z[28]) = 0;
+        (b[8] => z[28]) = 0;
+        (b[9] => z[28]) = 0;
+        (b[10] => z[28]) = 0;
+        (b[11] => z[28]) = 0;
+        (b[12] => z[28]) = 0;
+        (b[13] => z[28]) = 0;
+        (b[14] => z[28]) = 0;
+        (b[15] => z[28]) = 0;
+        (b[16] => z[28]) = 0;
+        (b[17] => z[28]) = 0;
+        (a[0] => z[29]) = 0;
+        (a[1] => z[29]) = 0;
+        (a[2] => z[29]) = 0;
+        (a[3] => z[29]) = 0;
+        (a[4] => z[29]) = 0;
+        (a[5] => z[29]) = 0;
+        (a[6] => z[29]) = 0;
+        (a[7] => z[29]) = 0;
+        (a[8] => z[29]) = 0;
+        (a[9] => z[29]) = 0;
+        (a[10] => z[29]) = 0;
+        (a[11] => z[29]) = 0;
+        (a[12] => z[29]) = 0;
+        (a[13] => z[29]) = 0;
+        (a[14] => z[29]) = 0;
+        (a[15] => z[29]) = 0;
+        (a[16] => z[29]) = 0;
+        (a[17] => z[29]) = 0;
+        (a[18] => z[29]) = 0;
+        (a[19] => z[29]) = 0;
+        (b[0] => z[29]) = 0;
+        (b[1] => z[29]) = 0;
+        (b[2] => z[29]) = 0;
+        (b[3] => z[29]) = 0;
+        (b[4] => z[29]) = 0;
+        (b[5] => z[29]) = 0;
+        (b[6] => z[29]) = 0;
+        (b[7] => z[29]) = 0;
+        (b[8] => z[29]) = 0;
+        (b[9] => z[29]) = 0;
+        (b[10] => z[29]) = 0;
+        (b[11] => z[29]) = 0;
+        (b[12] => z[29]) = 0;
+        (b[13] => z[29]) = 0;
+        (b[14] => z[29]) = 0;
+        (b[15] => z[29]) = 0;
+        (b[16] => z[29]) = 0;
+        (b[17] => z[29]) = 0;
+        (a[0] => z[30]) = 0;
+        (a[1] => z[30]) = 0;
+        (a[2] => z[30]) = 0;
+        (a[3] => z[30]) = 0;
+        (a[4] => z[30]) = 0;
+        (a[5] => z[30]) = 0;
+        (a[6] => z[30]) = 0;
+        (a[7] => z[30]) = 0;
+        (a[8] => z[30]) = 0;
+        (a[9] => z[30]) = 0;
+        (a[10] => z[30]) = 0;
+        (a[11] => z[30]) = 0;
+        (a[12] => z[30]) = 0;
+        (a[13] => z[30]) = 0;
+        (a[14] => z[30]) = 0;
+        (a[15] => z[30]) = 0;
+        (a[16] => z[30]) = 0;
+        (a[17] => z[30]) = 0;
+        (a[18] => z[30]) = 0;
+        (a[19] => z[30]) = 0;
+        (b[0] => z[30]) = 0;
+        (b[1] => z[30]) = 0;
+        (b[2] => z[30]) = 0;
+        (b[3] => z[30]) = 0;
+        (b[4] => z[30]) = 0;
+        (b[5] => z[30]) = 0;
+        (b[6] => z[30]) = 0;
+        (b[7] => z[30]) = 0;
+        (b[8] => z[30]) = 0;
+        (b[9] => z[30]) = 0;
+        (b[10] => z[30]) = 0;
+        (b[11] => z[30]) = 0;
+        (b[12] => z[30]) = 0;
+        (b[13] => z[30]) = 0;
+        (b[14] => z[30]) = 0;
+        (b[15] => z[30]) = 0;
+        (b[16] => z[30]) = 0;
+        (b[17] => z[30]) = 0;
+        (a[0] => z[31]) = 0;
+        (a[1] => z[31]) = 0;
+        (a[2] => z[31]) = 0;
+        (a[3] => z[31]) = 0;
+        (a[4] => z[31]) = 0;
+        (a[5] => z[31]) = 0;
+        (a[6] => z[31]) = 0;
+        (a[7] => z[31]) = 0;
+        (a[8] => z[31]) = 0;
+        (a[9] => z[31]) = 0;
+        (a[10] => z[31]) = 0;
+        (a[11] => z[31]) = 0;
+        (a[12] => z[31]) = 0;
+        (a[13] => z[31]) = 0;
+        (a[14] => z[31]) = 0;
+        (a[15] => z[31]) = 0;
+        (a[16] => z[31]) = 0;
+        (a[17] => z[31]) = 0;
+        (a[18] => z[31]) = 0;
+        (a[19] => z[31]) = 0;
+        (b[0] => z[31]) = 0;
+        (b[1] => z[31]) = 0;
+        (b[2] => z[31]) = 0;
+        (b[3] => z[31]) = 0;
+        (b[4] => z[31]) = 0;
+        (b[5] => z[31]) = 0;
+        (b[6] => z[31]) = 0;
+        (b[7] => z[31]) = 0;
+        (b[8] => z[31]) = 0;
+        (b[9] => z[31]) = 0;
+        (b[10] => z[31]) = 0;
+        (b[11] => z[31]) = 0;
+        (b[12] => z[31]) = 0;
+        (b[13] => z[31]) = 0;
+        (b[14] => z[31]) = 0;
+        (b[15] => z[31]) = 0;
+        (b[16] => z[31]) = 0;
+        (b[17] => z[31]) = 0;
+        (a[0] => z[32]) = 0;
+        (a[1] => z[32]) = 0;
+        (a[2] => z[32]) = 0;
+        (a[3] => z[32]) = 0;
+        (a[4] => z[32]) = 0;
+        (a[5] => z[32]) = 0;
+        (a[6] => z[32]) = 0;
+        (a[7] => z[32]) = 0;
+        (a[8] => z[32]) = 0;
+        (a[9] => z[32]) = 0;
+        (a[10] => z[32]) = 0;
+        (a[11] => z[32]) = 0;
+        (a[12] => z[32]) = 0;
+        (a[13] => z[32]) = 0;
+        (a[14] => z[32]) = 0;
+        (a[15] => z[32]) = 0;
+        (a[16] => z[32]) = 0;
+        (a[17] => z[32]) = 0;
+        (a[18] => z[32]) = 0;
+        (a[19] => z[32]) = 0;
+        (b[0] => z[32]) = 0;
+        (b[1] => z[32]) = 0;
+        (b[2] => z[32]) = 0;
+        (b[3] => z[32]) = 0;
+        (b[4] => z[32]) = 0;
+        (b[5] => z[32]) = 0;
+        (b[6] => z[32]) = 0;
+        (b[7] => z[32]) = 0;
+        (b[8] => z[32]) = 0;
+        (b[9] => z[32]) = 0;
+        (b[10] => z[32]) = 0;
+        (b[11] => z[32]) = 0;
+        (b[12] => z[32]) = 0;
+        (b[13] => z[32]) = 0;
+        (b[14] => z[32]) = 0;
+        (b[15] => z[32]) = 0;
+        (b[16] => z[32]) = 0;
+        (b[17] => z[32]) = 0;
+        (a[0] => z[33]) = 0;
+        (a[1] => z[33]) = 0;
+        (a[2] => z[33]) = 0;
+        (a[3] => z[33]) = 0;
+        (a[4] => z[33]) = 0;
+        (a[5] => z[33]) = 0;
+        (a[6] => z[33]) = 0;
+        (a[7] => z[33]) = 0;
+        (a[8] => z[33]) = 0;
+        (a[9] => z[33]) = 0;
+        (a[10] => z[33]) = 0;
+        (a[11] => z[33]) = 0;
+        (a[12] => z[33]) = 0;
+        (a[13] => z[33]) = 0;
+        (a[14] => z[33]) = 0;
+        (a[15] => z[33]) = 0;
+        (a[16] => z[33]) = 0;
+        (a[17] => z[33]) = 0;
+        (a[18] => z[33]) = 0;
+        (a[19] => z[33]) = 0;
+        (b[0] => z[33]) = 0;
+        (b[1] => z[33]) = 0;
+        (b[2] => z[33]) = 0;
+        (b[3] => z[33]) = 0;
+        (b[4] => z[33]) = 0;
+        (b[5] => z[33]) = 0;
+        (b[6] => z[33]) = 0;
+        (b[7] => z[33]) = 0;
+        (b[8] => z[33]) = 0;
+        (b[9] => z[33]) = 0;
+        (b[10] => z[33]) = 0;
+        (b[11] => z[33]) = 0;
+        (b[12] => z[33]) = 0;
+        (b[13] => z[33]) = 0;
+        (b[14] => z[33]) = 0;
+        (b[15] => z[33]) = 0;
+        (b[16] => z[33]) = 0;
+        (b[17] => z[33]) = 0;
+        (a[0] => z[34]) = 0;
+        (a[1] => z[34]) = 0;
+        (a[2] => z[34]) = 0;
+        (a[3] => z[34]) = 0;
+        (a[4] => z[34]) = 0;
+        (a[5] => z[34]) = 0;
+        (a[6] => z[34]) = 0;
+        (a[7] => z[34]) = 0;
+        (a[8] => z[34]) = 0;
+        (a[9] => z[34]) = 0;
+        (a[10] => z[34]) = 0;
+        (a[11] => z[34]) = 0;
+        (a[12] => z[34]) = 0;
+        (a[13] => z[34]) = 0;
+        (a[14] => z[34]) = 0;
+        (a[15] => z[34]) = 0;
+        (a[16] => z[34]) = 0;
+        (a[17] => z[34]) = 0;
+        (a[18] => z[34]) = 0;
+        (a[19] => z[34]) = 0;
+        (b[0] => z[34]) = 0;
+        (b[1] => z[34]) = 0;
+        (b[2] => z[34]) = 0;
+        (b[3] => z[34]) = 0;
+        (b[4] => z[34]) = 0;
+        (b[5] => z[34]) = 0;
+        (b[6] => z[34]) = 0;
+        (b[7] => z[34]) = 0;
+        (b[8] => z[34]) = 0;
+        (b[9] => z[34]) = 0;
+        (b[10] => z[34]) = 0;
+        (b[11] => z[34]) = 0;
+        (b[12] => z[34]) = 0;
+        (b[13] => z[34]) = 0;
+        (b[14] => z[34]) = 0;
+        (b[15] => z[34]) = 0;
+        (b[16] => z[34]) = 0;
+        (b[17] => z[34]) = 0;
+        (a[0] => z[35]) = 0;
+        (a[1] => z[35]) = 0;
+        (a[2] => z[35]) = 0;
+        (a[3] => z[35]) = 0;
+        (a[4] => z[35]) = 0;
+        (a[5] => z[35]) = 0;
+        (a[6] => z[35]) = 0;
+        (a[7] => z[35]) = 0;
+        (a[8] => z[35]) = 0;
+        (a[9] => z[35]) = 0;
+        (a[10] => z[35]) = 0;
+        (a[11] => z[35]) = 0;
+        (a[12] => z[35]) = 0;
+        (a[13] => z[35]) = 0;
+        (a[14] => z[35]) = 0;
+        (a[15] => z[35]) = 0;
+        (a[16] => z[35]) = 0;
+        (a[17] => z[35]) = 0;
+        (a[18] => z[35]) = 0;
+        (a[19] => z[35]) = 0;
+        (b[0] => z[35]) = 0;
+        (b[1] => z[35]) = 0;
+        (b[2] => z[35]) = 0;
+        (b[3] => z[35]) = 0;
+        (b[4] => z[35]) = 0;
+        (b[5] => z[35]) = 0;
+        (b[6] => z[35]) = 0;
+        (b[7] => z[35]) = 0;
+        (b[8] => z[35]) = 0;
+        (b[9] => z[35]) = 0;
+        (b[10] => z[35]) = 0;
+        (b[11] => z[35]) = 0;
+        (b[12] => z[35]) = 0;
+        (b[13] => z[35]) = 0;
+        (b[14] => z[35]) = 0;
+        (b[15] => z[35]) = 0;
+        (b[16] => z[35]) = 0;
+        (b[17] => z[35]) = 0;
+        (a[0] => z[36]) = 0;
+        (a[1] => z[36]) = 0;
+        (a[2] => z[36]) = 0;
+        (a[3] => z[36]) = 0;
+        (a[4] => z[36]) = 0;
+        (a[5] => z[36]) = 0;
+        (a[6] => z[36]) = 0;
+        (a[7] => z[36]) = 0;
+        (a[8] => z[36]) = 0;
+        (a[9] => z[36]) = 0;
+        (a[10] => z[36]) = 0;
+        (a[11] => z[36]) = 0;
+        (a[12] => z[36]) = 0;
+        (a[13] => z[36]) = 0;
+        (a[14] => z[36]) = 0;
+        (a[15] => z[36]) = 0;
+        (a[16] => z[36]) = 0;
+        (a[17] => z[36]) = 0;
+        (a[18] => z[36]) = 0;
+        (a[19] => z[36]) = 0;
+        (b[0] => z[36]) = 0;
+        (b[1] => z[36]) = 0;
+        (b[2] => z[36]) = 0;
+        (b[3] => z[36]) = 0;
+        (b[4] => z[36]) = 0;
+        (b[5] => z[36]) = 0;
+        (b[6] => z[36]) = 0;
+        (b[7] => z[36]) = 0;
+        (b[8] => z[36]) = 0;
+        (b[9] => z[36]) = 0;
+        (b[10] => z[36]) = 0;
+        (b[11] => z[36]) = 0;
+        (b[12] => z[36]) = 0;
+        (b[13] => z[36]) = 0;
+        (b[14] => z[36]) = 0;
+        (b[15] => z[36]) = 0;
+        (b[16] => z[36]) = 0;
+        (b[17] => z[36]) = 0;
+        (a[0] => z[37]) = 0;
+        (a[1] => z[37]) = 0;
+        (a[2] => z[37]) = 0;
+        (a[3] => z[37]) = 0;
+        (a[4] => z[37]) = 0;
+        (a[5] => z[37]) = 0;
+        (a[6] => z[37]) = 0;
+        (a[7] => z[37]) = 0;
+        (a[8] => z[37]) = 0;
+        (a[9] => z[37]) = 0;
+        (a[10] => z[37]) = 0;
+        (a[11] => z[37]) = 0;
+        (a[12] => z[37]) = 0;
+        (a[13] => z[37]) = 0;
+        (a[14] => z[37]) = 0;
+        (a[15] => z[37]) = 0;
+        (a[16] => z[37]) = 0;
+        (a[17] => z[37]) = 0;
+        (a[18] => z[37]) = 0;
+        (a[19] => z[37]) = 0;
+        (b[0] => z[37]) = 0;
+        (b[1] => z[37]) = 0;
+        (b[2] => z[37]) = 0;
+        (b[3] => z[37]) = 0;
+        (b[4] => z[37]) = 0;
+        (b[5] => z[37]) = 0;
+        (b[6] => z[37]) = 0;
+        (b[7] => z[37]) = 0;
+        (b[8] => z[37]) = 0;
+        (b[9] => z[37]) = 0;
+        (b[10] => z[37]) = 0;
+        (b[11] => z[37]) = 0;
+        (b[12] => z[37]) = 0;
+        (b[13] => z[37]) = 0;
+        (b[14] => z[37]) = 0;
+        (b[15] => z[37]) = 0;
+        (b[16] => z[37]) = 0;
+        (b[17] => z[37]) = 0;
+	endspecify
+`endif
+	
 endmodule
 
 module QL_DSP2_MULT_REGIN ( // TODO: Name subject to change
@@ -267,11 +1727,14 @@
     ) dsp (
         .a(a),
         .b(b),
+        .acc_fir(6'b0),
         .z(z),
+        .dly_b(),
 
         .f_mode(f_mode),
 
         .feedback(feedback),
+        .load_acc(1'b0),
 
         .unsigned_a(unsigned_a),
         .unsigned_b(unsigned_b),
@@ -280,8 +1743,23 @@
         .reset(reset),
 
         .output_select(output_select),      // unregistered output: a * b (0)
+        .saturate_enable(1'b0),
+        .shift_right(6'b0),
+        .round(1'b0),
+        .subtract(1'b0),
         .register_inputs(register_inputs)   // registered inputs
     );
+
+`ifdef SDF_SIM	
+	specify
+		(posedge clk => (z +: a)) = 0;
+		(posedge clk => (z +: b)) = 0;
+		$setuphold(posedge clk, a, 0, 0);
+		$setuphold(posedge clk, b, 0, 0);
+		$setuphold(posedge clk, feedback, 0, 0);
+	endspecify
+`endif
+
 endmodule
 
 module QL_DSP2_MULT_REGOUT ( // TODO: Name subject to change
@@ -313,11 +1791,14 @@
     ) dsp (
         .a(a),
         .b(b),
+        .acc_fir(6'b0),
         .z(z),
+        .dly_b(),
 
         .f_mode(f_mode),
 
         .feedback(feedback),
+        .load_acc(1'b0),
 
         .unsigned_a(unsigned_a),
         .unsigned_b(unsigned_b),
@@ -326,8 +1807,23 @@
         .reset(reset),
 
         .output_select(output_select),      // registered output: a * b (4)
+        .saturate_enable(1'b0),
+        .shift_right(6'b0),
+        .round(1'b0),
+        .subtract(1'b0),
         .register_inputs(register_inputs)   // unregistered inputs
     );
+
+`ifdef SDF_SIM
+	specify
+		(posedge clk => (z +: a)) = 0;
+		(posedge clk => (z +: b)) = 0;
+		$setuphold(posedge clk, a, 0, 0);
+		$setuphold(posedge clk, b, 0, 0);
+		$setuphold(posedge clk, feedback, 0, 0);
+	endspecify
+`endif
+	
 endmodule
 
 module QL_DSP2_MULT_REGIN_REGOUT ( // TODO: Name subject to change
@@ -359,11 +1855,14 @@
     ) dsp (
         .a(a),
         .b(b),
+        .acc_fir(6'b0),
         .z(z),
+        .dly_b(),
 
         .f_mode(f_mode),
 
         .feedback(feedback),
+        .load_acc(1'b0),
 
         .unsigned_a(unsigned_a),
         .unsigned_b(unsigned_b),
@@ -372,8 +1871,23 @@
         .reset(reset),
 
         .output_select(output_select),      // registered output: a * b (4)
+        .saturate_enable(1'b0),
+        .shift_right(6'b0),
+        .round(1'b0),
+        .subtract(1'b0),
         .register_inputs(register_inputs)   // registered inputs
     );
+
+`ifdef SDF_SIM	
+	specify
+		(posedge clk => (z +: a)) = 0;
+		(posedge clk => (z +: b)) = 0;
+		$setuphold(posedge clk, a, 0, 0);
+		$setuphold(posedge clk, b, 0, 0);
+		$setuphold(posedge clk, feedback, 0, 0);
+	endspecify
+`endif
+	
 endmodule
 
 module QL_DSP2_MULTADD (
@@ -410,6 +1924,7 @@
     ) dsp (
         .a(a),
         .b(b),
+        .dly_b(),
         .z(z),
 
         .f_mode(f_mode),
@@ -421,6 +1936,7 @@
         .unsigned_a(unsigned_a),
         .unsigned_b(unsigned_b),
 
+        //.clk(1'b0),
         .reset(reset),
 
         .output_select(output_select),      // unregistered output: ACCin (2, 3)
@@ -430,6 +1946,1722 @@
         .subtract(subtract),
         .register_inputs(register_inputs)   // unregistered inputs
     );
+
+`ifdef SDF_SIM	
+	specify
+        (a[0] => z[0]) = 0;
+        (a[1] => z[0]) = 0;
+        (a[2] => z[0]) = 0;
+        (a[3] => z[0]) = 0;
+        (a[4] => z[0]) = 0;
+        (a[5] => z[0]) = 0;
+        (a[6] => z[0]) = 0;
+        (a[7] => z[0]) = 0;
+        (a[8] => z[0]) = 0;
+        (a[9] => z[0]) = 0;
+        (a[10] => z[0]) = 0;
+        (a[11] => z[0]) = 0;
+        (a[12] => z[0]) = 0;
+        (a[13] => z[0]) = 0;
+        (a[14] => z[0]) = 0;
+        (a[15] => z[0]) = 0;
+        (a[16] => z[0]) = 0;
+        (a[17] => z[0]) = 0;
+        (a[18] => z[0]) = 0;
+        (a[19] => z[0]) = 0;
+        (b[0] => z[0]) = 0;
+        (b[1] => z[0]) = 0;
+        (b[2] => z[0]) = 0;
+        (b[3] => z[0]) = 0;
+        (b[4] => z[0]) = 0;
+        (b[5] => z[0]) = 0;
+        (b[6] => z[0]) = 0;
+        (b[7] => z[0]) = 0;
+        (b[8] => z[0]) = 0;
+        (b[9] => z[0]) = 0;
+        (b[10] => z[0]) = 0;
+        (b[11] => z[0]) = 0;
+        (b[12] => z[0]) = 0;
+        (b[13] => z[0]) = 0;
+        (b[14] => z[0]) = 0;
+        (b[15] => z[0]) = 0;
+        (b[16] => z[0]) = 0;
+        (b[17] => z[0]) = 0;
+        (a[0] => z[1]) = 0;
+        (a[1] => z[1]) = 0;
+        (a[2] => z[1]) = 0;
+        (a[3] => z[1]) = 0;
+        (a[4] => z[1]) = 0;
+        (a[5] => z[1]) = 0;
+        (a[6] => z[1]) = 0;
+        (a[7] => z[1]) = 0;
+        (a[8] => z[1]) = 0;
+        (a[9] => z[1]) = 0;
+        (a[10] => z[1]) = 0;
+        (a[11] => z[1]) = 0;
+        (a[12] => z[1]) = 0;
+        (a[13] => z[1]) = 0;
+        (a[14] => z[1]) = 0;
+        (a[15] => z[1]) = 0;
+        (a[16] => z[1]) = 0;
+        (a[17] => z[1]) = 0;
+        (a[18] => z[1]) = 0;
+        (a[19] => z[1]) = 0;
+        (b[0] => z[1]) = 0;
+        (b[1] => z[1]) = 0;
+        (b[2] => z[1]) = 0;
+        (b[3] => z[1]) = 0;
+        (b[4] => z[1]) = 0;
+        (b[5] => z[1]) = 0;
+        (b[6] => z[1]) = 0;
+        (b[7] => z[1]) = 0;
+        (b[8] => z[1]) = 0;
+        (b[9] => z[1]) = 0;
+        (b[10] => z[1]) = 0;
+        (b[11] => z[1]) = 0;
+        (b[12] => z[1]) = 0;
+        (b[13] => z[1]) = 0;
+        (b[14] => z[1]) = 0;
+        (b[15] => z[1]) = 0;
+        (b[16] => z[1]) = 0;
+        (b[17] => z[1]) = 0;
+        (a[0] => z[2]) = 0;
+        (a[1] => z[2]) = 0;
+        (a[2] => z[2]) = 0;
+        (a[3] => z[2]) = 0;
+        (a[4] => z[2]) = 0;
+        (a[5] => z[2]) = 0;
+        (a[6] => z[2]) = 0;
+        (a[7] => z[2]) = 0;
+        (a[8] => z[2]) = 0;
+        (a[9] => z[2]) = 0;
+        (a[10] => z[2]) = 0;
+        (a[11] => z[2]) = 0;
+        (a[12] => z[2]) = 0;
+        (a[13] => z[2]) = 0;
+        (a[14] => z[2]) = 0;
+        (a[15] => z[2]) = 0;
+        (a[16] => z[2]) = 0;
+        (a[17] => z[2]) = 0;
+        (a[18] => z[2]) = 0;
+        (a[19] => z[2]) = 0;
+        (b[0] => z[2]) = 0;
+        (b[1] => z[2]) = 0;
+        (b[2] => z[2]) = 0;
+        (b[3] => z[2]) = 0;
+        (b[4] => z[2]) = 0;
+        (b[5] => z[2]) = 0;
+        (b[6] => z[2]) = 0;
+        (b[7] => z[2]) = 0;
+        (b[8] => z[2]) = 0;
+        (b[9] => z[2]) = 0;
+        (b[10] => z[2]) = 0;
+        (b[11] => z[2]) = 0;
+        (b[12] => z[2]) = 0;
+        (b[13] => z[2]) = 0;
+        (b[14] => z[2]) = 0;
+        (b[15] => z[2]) = 0;
+        (b[16] => z[2]) = 0;
+        (b[17] => z[2]) = 0;
+        (a[0] => z[3]) = 0;
+        (a[1] => z[3]) = 0;
+        (a[2] => z[3]) = 0;
+        (a[3] => z[3]) = 0;
+        (a[4] => z[3]) = 0;
+        (a[5] => z[3]) = 0;
+        (a[6] => z[3]) = 0;
+        (a[7] => z[3]) = 0;
+        (a[8] => z[3]) = 0;
+        (a[9] => z[3]) = 0;
+        (a[10] => z[3]) = 0;
+        (a[11] => z[3]) = 0;
+        (a[12] => z[3]) = 0;
+        (a[13] => z[3]) = 0;
+        (a[14] => z[3]) = 0;
+        (a[15] => z[3]) = 0;
+        (a[16] => z[3]) = 0;
+        (a[17] => z[3]) = 0;
+        (a[18] => z[3]) = 0;
+        (a[19] => z[3]) = 0;
+        (b[0] => z[3]) = 0;
+        (b[1] => z[3]) = 0;
+        (b[2] => z[3]) = 0;
+        (b[3] => z[3]) = 0;
+        (b[4] => z[3]) = 0;
+        (b[5] => z[3]) = 0;
+        (b[6] => z[3]) = 0;
+        (b[7] => z[3]) = 0;
+        (b[8] => z[3]) = 0;
+        (b[9] => z[3]) = 0;
+        (b[10] => z[3]) = 0;
+        (b[11] => z[3]) = 0;
+        (b[12] => z[3]) = 0;
+        (b[13] => z[3]) = 0;
+        (b[14] => z[3]) = 0;
+        (b[15] => z[3]) = 0;
+        (b[16] => z[3]) = 0;
+        (b[17] => z[3]) = 0;
+        (a[0] => z[4]) = 0;
+        (a[1] => z[4]) = 0;
+        (a[2] => z[4]) = 0;
+        (a[3] => z[4]) = 0;
+        (a[4] => z[4]) = 0;
+        (a[5] => z[4]) = 0;
+        (a[6] => z[4]) = 0;
+        (a[7] => z[4]) = 0;
+        (a[8] => z[4]) = 0;
+        (a[9] => z[4]) = 0;
+        (a[10] => z[4]) = 0;
+        (a[11] => z[4]) = 0;
+        (a[12] => z[4]) = 0;
+        (a[13] => z[4]) = 0;
+        (a[14] => z[4]) = 0;
+        (a[15] => z[4]) = 0;
+        (a[16] => z[4]) = 0;
+        (a[17] => z[4]) = 0;
+        (a[18] => z[4]) = 0;
+        (a[19] => z[4]) = 0;
+        (b[0] => z[4]) = 0;
+        (b[1] => z[4]) = 0;
+        (b[2] => z[4]) = 0;
+        (b[3] => z[4]) = 0;
+        (b[4] => z[4]) = 0;
+        (b[5] => z[4]) = 0;
+        (b[6] => z[4]) = 0;
+        (b[7] => z[4]) = 0;
+        (b[8] => z[4]) = 0;
+        (b[9] => z[4]) = 0;
+        (b[10] => z[4]) = 0;
+        (b[11] => z[4]) = 0;
+        (b[12] => z[4]) = 0;
+        (b[13] => z[4]) = 0;
+        (b[14] => z[4]) = 0;
+        (b[15] => z[4]) = 0;
+        (b[16] => z[4]) = 0;
+        (b[17] => z[4]) = 0;
+        (a[0] => z[5]) = 0;
+        (a[1] => z[5]) = 0;
+        (a[2] => z[5]) = 0;
+        (a[3] => z[5]) = 0;
+        (a[4] => z[5]) = 0;
+        (a[5] => z[5]) = 0;
+        (a[6] => z[5]) = 0;
+        (a[7] => z[5]) = 0;
+        (a[8] => z[5]) = 0;
+        (a[9] => z[5]) = 0;
+        (a[10] => z[5]) = 0;
+        (a[11] => z[5]) = 0;
+        (a[12] => z[5]) = 0;
+        (a[13] => z[5]) = 0;
+        (a[14] => z[5]) = 0;
+        (a[15] => z[5]) = 0;
+        (a[16] => z[5]) = 0;
+        (a[17] => z[5]) = 0;
+        (a[18] => z[5]) = 0;
+        (a[19] => z[5]) = 0;
+        (b[0] => z[5]) = 0;
+        (b[1] => z[5]) = 0;
+        (b[2] => z[5]) = 0;
+        (b[3] => z[5]) = 0;
+        (b[4] => z[5]) = 0;
+        (b[5] => z[5]) = 0;
+        (b[6] => z[5]) = 0;
+        (b[7] => z[5]) = 0;
+        (b[8] => z[5]) = 0;
+        (b[9] => z[5]) = 0;
+        (b[10] => z[5]) = 0;
+        (b[11] => z[5]) = 0;
+        (b[12] => z[5]) = 0;
+        (b[13] => z[5]) = 0;
+        (b[14] => z[5]) = 0;
+        (b[15] => z[5]) = 0;
+        (b[16] => z[5]) = 0;
+        (b[17] => z[5]) = 0;
+        (a[0] => z[6]) = 0;
+        (a[1] => z[6]) = 0;
+        (a[2] => z[6]) = 0;
+        (a[3] => z[6]) = 0;
+        (a[4] => z[6]) = 0;
+        (a[5] => z[6]) = 0;
+        (a[6] => z[6]) = 0;
+        (a[7] => z[6]) = 0;
+        (a[8] => z[6]) = 0;
+        (a[9] => z[6]) = 0;
+        (a[10] => z[6]) = 0;
+        (a[11] => z[6]) = 0;
+        (a[12] => z[6]) = 0;
+        (a[13] => z[6]) = 0;
+        (a[14] => z[6]) = 0;
+        (a[15] => z[6]) = 0;
+        (a[16] => z[6]) = 0;
+        (a[17] => z[6]) = 0;
+        (a[18] => z[6]) = 0;
+        (a[19] => z[6]) = 0;
+        (b[0] => z[6]) = 0;
+        (b[1] => z[6]) = 0;
+        (b[2] => z[6]) = 0;
+        (b[3] => z[6]) = 0;
+        (b[4] => z[6]) = 0;
+        (b[5] => z[6]) = 0;
+        (b[6] => z[6]) = 0;
+        (b[7] => z[6]) = 0;
+        (b[8] => z[6]) = 0;
+        (b[9] => z[6]) = 0;
+        (b[10] => z[6]) = 0;
+        (b[11] => z[6]) = 0;
+        (b[12] => z[6]) = 0;
+        (b[13] => z[6]) = 0;
+        (b[14] => z[6]) = 0;
+        (b[15] => z[6]) = 0;
+        (b[16] => z[6]) = 0;
+        (b[17] => z[6]) = 0;
+        (a[0] => z[7]) = 0;
+        (a[1] => z[7]) = 0;
+        (a[2] => z[7]) = 0;
+        (a[3] => z[7]) = 0;
+        (a[4] => z[7]) = 0;
+        (a[5] => z[7]) = 0;
+        (a[6] => z[7]) = 0;
+        (a[7] => z[7]) = 0;
+        (a[8] => z[7]) = 0;
+        (a[9] => z[7]) = 0;
+        (a[10] => z[7]) = 0;
+        (a[11] => z[7]) = 0;
+        (a[12] => z[7]) = 0;
+        (a[13] => z[7]) = 0;
+        (a[14] => z[7]) = 0;
+        (a[15] => z[7]) = 0;
+        (a[16] => z[7]) = 0;
+        (a[17] => z[7]) = 0;
+        (a[18] => z[7]) = 0;
+        (a[19] => z[7]) = 0;
+        (b[0] => z[7]) = 0;
+        (b[1] => z[7]) = 0;
+        (b[2] => z[7]) = 0;
+        (b[3] => z[7]) = 0;
+        (b[4] => z[7]) = 0;
+        (b[5] => z[7]) = 0;
+        (b[6] => z[7]) = 0;
+        (b[7] => z[7]) = 0;
+        (b[8] => z[7]) = 0;
+        (b[9] => z[7]) = 0;
+        (b[10] => z[7]) = 0;
+        (b[11] => z[7]) = 0;
+        (b[12] => z[7]) = 0;
+        (b[13] => z[7]) = 0;
+        (b[14] => z[7]) = 0;
+        (b[15] => z[7]) = 0;
+        (b[16] => z[7]) = 0;
+        (b[17] => z[7]) = 0;
+        (a[0] => z[8]) = 0;
+        (a[1] => z[8]) = 0;
+        (a[2] => z[8]) = 0;
+        (a[3] => z[8]) = 0;
+        (a[4] => z[8]) = 0;
+        (a[5] => z[8]) = 0;
+        (a[6] => z[8]) = 0;
+        (a[7] => z[8]) = 0;
+        (a[8] => z[8]) = 0;
+        (a[9] => z[8]) = 0;
+        (a[10] => z[8]) = 0;
+        (a[11] => z[8]) = 0;
+        (a[12] => z[8]) = 0;
+        (a[13] => z[8]) = 0;
+        (a[14] => z[8]) = 0;
+        (a[15] => z[8]) = 0;
+        (a[16] => z[8]) = 0;
+        (a[17] => z[8]) = 0;
+        (a[18] => z[8]) = 0;
+        (a[19] => z[8]) = 0;
+        (b[0] => z[8]) = 0;
+        (b[1] => z[8]) = 0;
+        (b[2] => z[8]) = 0;
+        (b[3] => z[8]) = 0;
+        (b[4] => z[8]) = 0;
+        (b[5] => z[8]) = 0;
+        (b[6] => z[8]) = 0;
+        (b[7] => z[8]) = 0;
+        (b[8] => z[8]) = 0;
+        (b[9] => z[8]) = 0;
+        (b[10] => z[8]) = 0;
+        (b[11] => z[8]) = 0;
+        (b[12] => z[8]) = 0;
+        (b[13] => z[8]) = 0;
+        (b[14] => z[8]) = 0;
+        (b[15] => z[8]) = 0;
+        (b[16] => z[8]) = 0;
+        (b[17] => z[8]) = 0;
+        (a[0] => z[9]) = 0;
+        (a[1] => z[9]) = 0;
+        (a[2] => z[9]) = 0;
+        (a[3] => z[9]) = 0;
+        (a[4] => z[9]) = 0;
+        (a[5] => z[9]) = 0;
+        (a[6] => z[9]) = 0;
+        (a[7] => z[9]) = 0;
+        (a[8] => z[9]) = 0;
+        (a[9] => z[9]) = 0;
+        (a[10] => z[9]) = 0;
+        (a[11] => z[9]) = 0;
+        (a[12] => z[9]) = 0;
+        (a[13] => z[9]) = 0;
+        (a[14] => z[9]) = 0;
+        (a[15] => z[9]) = 0;
+        (a[16] => z[9]) = 0;
+        (a[17] => z[9]) = 0;
+        (a[18] => z[9]) = 0;
+        (a[19] => z[9]) = 0;
+        (b[0] => z[9]) = 0;
+        (b[1] => z[9]) = 0;
+        (b[2] => z[9]) = 0;
+        (b[3] => z[9]) = 0;
+        (b[4] => z[9]) = 0;
+        (b[5] => z[9]) = 0;
+        (b[6] => z[9]) = 0;
+        (b[7] => z[9]) = 0;
+        (b[8] => z[9]) = 0;
+        (b[9] => z[9]) = 0;
+        (b[10] => z[9]) = 0;
+        (b[11] => z[9]) = 0;
+        (b[12] => z[9]) = 0;
+        (b[13] => z[9]) = 0;
+        (b[14] => z[9]) = 0;
+        (b[15] => z[9]) = 0;
+        (b[16] => z[9]) = 0;
+        (b[17] => z[9]) = 0;
+        (a[0] => z[10]) = 0;
+        (a[1] => z[10]) = 0;
+        (a[2] => z[10]) = 0;
+        (a[3] => z[10]) = 0;
+        (a[4] => z[10]) = 0;
+        (a[5] => z[10]) = 0;
+        (a[6] => z[10]) = 0;
+        (a[7] => z[10]) = 0;
+        (a[8] => z[10]) = 0;
+        (a[9] => z[10]) = 0;
+        (a[10] => z[10]) = 0;
+        (a[11] => z[10]) = 0;
+        (a[12] => z[10]) = 0;
+        (a[13] => z[10]) = 0;
+        (a[14] => z[10]) = 0;
+        (a[15] => z[10]) = 0;
+        (a[16] => z[10]) = 0;
+        (a[17] => z[10]) = 0;
+        (a[18] => z[10]) = 0;
+        (a[19] => z[10]) = 0;
+        (b[0] => z[10]) = 0;
+        (b[1] => z[10]) = 0;
+        (b[2] => z[10]) = 0;
+        (b[3] => z[10]) = 0;
+        (b[4] => z[10]) = 0;
+        (b[5] => z[10]) = 0;
+        (b[6] => z[10]) = 0;
+        (b[7] => z[10]) = 0;
+        (b[8] => z[10]) = 0;
+        (b[9] => z[10]) = 0;
+        (b[10] => z[10]) = 0;
+        (b[11] => z[10]) = 0;
+        (b[12] => z[10]) = 0;
+        (b[13] => z[10]) = 0;
+        (b[14] => z[10]) = 0;
+        (b[15] => z[10]) = 0;
+        (b[16] => z[10]) = 0;
+        (b[17] => z[10]) = 0;
+        (a[0] => z[11]) = 0;
+        (a[1] => z[11]) = 0;
+        (a[2] => z[11]) = 0;
+        (a[3] => z[11]) = 0;
+        (a[4] => z[11]) = 0;
+        (a[5] => z[11]) = 0;
+        (a[6] => z[11]) = 0;
+        (a[7] => z[11]) = 0;
+        (a[8] => z[11]) = 0;
+        (a[9] => z[11]) = 0;
+        (a[10] => z[11]) = 0;
+        (a[11] => z[11]) = 0;
+        (a[12] => z[11]) = 0;
+        (a[13] => z[11]) = 0;
+        (a[14] => z[11]) = 0;
+        (a[15] => z[11]) = 0;
+        (a[16] => z[11]) = 0;
+        (a[17] => z[11]) = 0;
+        (a[18] => z[11]) = 0;
+        (a[19] => z[11]) = 0;
+        (b[0] => z[11]) = 0;
+        (b[1] => z[11]) = 0;
+        (b[2] => z[11]) = 0;
+        (b[3] => z[11]) = 0;
+        (b[4] => z[11]) = 0;
+        (b[5] => z[11]) = 0;
+        (b[6] => z[11]) = 0;
+        (b[7] => z[11]) = 0;
+        (b[8] => z[11]) = 0;
+        (b[9] => z[11]) = 0;
+        (b[10] => z[11]) = 0;
+        (b[11] => z[11]) = 0;
+        (b[12] => z[11]) = 0;
+        (b[13] => z[11]) = 0;
+        (b[14] => z[11]) = 0;
+        (b[15] => z[11]) = 0;
+        (b[16] => z[11]) = 0;
+        (b[17] => z[11]) = 0;
+        (a[0] => z[12]) = 0;
+        (a[1] => z[12]) = 0;
+        (a[2] => z[12]) = 0;
+        (a[3] => z[12]) = 0;
+        (a[4] => z[12]) = 0;
+        (a[5] => z[12]) = 0;
+        (a[6] => z[12]) = 0;
+        (a[7] => z[12]) = 0;
+        (a[8] => z[12]) = 0;
+        (a[9] => z[12]) = 0;
+        (a[10] => z[12]) = 0;
+        (a[11] => z[12]) = 0;
+        (a[12] => z[12]) = 0;
+        (a[13] => z[12]) = 0;
+        (a[14] => z[12]) = 0;
+        (a[15] => z[12]) = 0;
+        (a[16] => z[12]) = 0;
+        (a[17] => z[12]) = 0;
+        (a[18] => z[12]) = 0;
+        (a[19] => z[12]) = 0;
+        (b[0] => z[12]) = 0;
+        (b[1] => z[12]) = 0;
+        (b[2] => z[12]) = 0;
+        (b[3] => z[12]) = 0;
+        (b[4] => z[12]) = 0;
+        (b[5] => z[12]) = 0;
+        (b[6] => z[12]) = 0;
+        (b[7] => z[12]) = 0;
+        (b[8] => z[12]) = 0;
+        (b[9] => z[12]) = 0;
+        (b[10] => z[12]) = 0;
+        (b[11] => z[12]) = 0;
+        (b[12] => z[12]) = 0;
+        (b[13] => z[12]) = 0;
+        (b[14] => z[12]) = 0;
+        (b[15] => z[12]) = 0;
+        (b[16] => z[12]) = 0;
+        (b[17] => z[12]) = 0;
+        (a[0] => z[13]) = 0;
+        (a[1] => z[13]) = 0;
+        (a[2] => z[13]) = 0;
+        (a[3] => z[13]) = 0;
+        (a[4] => z[13]) = 0;
+        (a[5] => z[13]) = 0;
+        (a[6] => z[13]) = 0;
+        (a[7] => z[13]) = 0;
+        (a[8] => z[13]) = 0;
+        (a[9] => z[13]) = 0;
+        (a[10] => z[13]) = 0;
+        (a[11] => z[13]) = 0;
+        (a[12] => z[13]) = 0;
+        (a[13] => z[13]) = 0;
+        (a[14] => z[13]) = 0;
+        (a[15] => z[13]) = 0;
+        (a[16] => z[13]) = 0;
+        (a[17] => z[13]) = 0;
+        (a[18] => z[13]) = 0;
+        (a[19] => z[13]) = 0;
+        (b[0] => z[13]) = 0;
+        (b[1] => z[13]) = 0;
+        (b[2] => z[13]) = 0;
+        (b[3] => z[13]) = 0;
+        (b[4] => z[13]) = 0;
+        (b[5] => z[13]) = 0;
+        (b[6] => z[13]) = 0;
+        (b[7] => z[13]) = 0;
+        (b[8] => z[13]) = 0;
+        (b[9] => z[13]) = 0;
+        (b[10] => z[13]) = 0;
+        (b[11] => z[13]) = 0;
+        (b[12] => z[13]) = 0;
+        (b[13] => z[13]) = 0;
+        (b[14] => z[13]) = 0;
+        (b[15] => z[13]) = 0;
+        (b[16] => z[13]) = 0;
+        (b[17] => z[13]) = 0;
+        (a[0] => z[14]) = 0;
+        (a[1] => z[14]) = 0;
+        (a[2] => z[14]) = 0;
+        (a[3] => z[14]) = 0;
+        (a[4] => z[14]) = 0;
+        (a[5] => z[14]) = 0;
+        (a[6] => z[14]) = 0;
+        (a[7] => z[14]) = 0;
+        (a[8] => z[14]) = 0;
+        (a[9] => z[14]) = 0;
+        (a[10] => z[14]) = 0;
+        (a[11] => z[14]) = 0;
+        (a[12] => z[14]) = 0;
+        (a[13] => z[14]) = 0;
+        (a[14] => z[14]) = 0;
+        (a[15] => z[14]) = 0;
+        (a[16] => z[14]) = 0;
+        (a[17] => z[14]) = 0;
+        (a[18] => z[14]) = 0;
+        (a[19] => z[14]) = 0;
+        (b[0] => z[14]) = 0;
+        (b[1] => z[14]) = 0;
+        (b[2] => z[14]) = 0;
+        (b[3] => z[14]) = 0;
+        (b[4] => z[14]) = 0;
+        (b[5] => z[14]) = 0;
+        (b[6] => z[14]) = 0;
+        (b[7] => z[14]) = 0;
+        (b[8] => z[14]) = 0;
+        (b[9] => z[14]) = 0;
+        (b[10] => z[14]) = 0;
+        (b[11] => z[14]) = 0;
+        (b[12] => z[14]) = 0;
+        (b[13] => z[14]) = 0;
+        (b[14] => z[14]) = 0;
+        (b[15] => z[14]) = 0;
+        (b[16] => z[14]) = 0;
+        (b[17] => z[14]) = 0;
+        (a[0] => z[15]) = 0;
+        (a[1] => z[15]) = 0;
+        (a[2] => z[15]) = 0;
+        (a[3] => z[15]) = 0;
+        (a[4] => z[15]) = 0;
+        (a[5] => z[15]) = 0;
+        (a[6] => z[15]) = 0;
+        (a[7] => z[15]) = 0;
+        (a[8] => z[15]) = 0;
+        (a[9] => z[15]) = 0;
+        (a[10] => z[15]) = 0;
+        (a[11] => z[15]) = 0;
+        (a[12] => z[15]) = 0;
+        (a[13] => z[15]) = 0;
+        (a[14] => z[15]) = 0;
+        (a[15] => z[15]) = 0;
+        (a[16] => z[15]) = 0;
+        (a[17] => z[15]) = 0;
+        (a[18] => z[15]) = 0;
+        (a[19] => z[15]) = 0;
+        (b[0] => z[15]) = 0;
+        (b[1] => z[15]) = 0;
+        (b[2] => z[15]) = 0;
+        (b[3] => z[15]) = 0;
+        (b[4] => z[15]) = 0;
+        (b[5] => z[15]) = 0;
+        (b[6] => z[15]) = 0;
+        (b[7] => z[15]) = 0;
+        (b[8] => z[15]) = 0;
+        (b[9] => z[15]) = 0;
+        (b[10] => z[15]) = 0;
+        (b[11] => z[15]) = 0;
+        (b[12] => z[15]) = 0;
+        (b[13] => z[15]) = 0;
+        (b[14] => z[15]) = 0;
+        (b[15] => z[15]) = 0;
+        (b[16] => z[15]) = 0;
+        (b[17] => z[15]) = 0;
+        (a[0] => z[16]) = 0;
+        (a[1] => z[16]) = 0;
+        (a[2] => z[16]) = 0;
+        (a[3] => z[16]) = 0;
+        (a[4] => z[16]) = 0;
+        (a[5] => z[16]) = 0;
+        (a[6] => z[16]) = 0;
+        (a[7] => z[16]) = 0;
+        (a[8] => z[16]) = 0;
+        (a[9] => z[16]) = 0;
+        (a[10] => z[16]) = 0;
+        (a[11] => z[16]) = 0;
+        (a[12] => z[16]) = 0;
+        (a[13] => z[16]) = 0;
+        (a[14] => z[16]) = 0;
+        (a[15] => z[16]) = 0;
+        (a[16] => z[16]) = 0;
+        (a[17] => z[16]) = 0;
+        (a[18] => z[16]) = 0;
+        (a[19] => z[16]) = 0;
+        (b[0] => z[16]) = 0;
+        (b[1] => z[16]) = 0;
+        (b[2] => z[16]) = 0;
+        (b[3] => z[16]) = 0;
+        (b[4] => z[16]) = 0;
+        (b[5] => z[16]) = 0;
+        (b[6] => z[16]) = 0;
+        (b[7] => z[16]) = 0;
+        (b[8] => z[16]) = 0;
+        (b[9] => z[16]) = 0;
+        (b[10] => z[16]) = 0;
+        (b[11] => z[16]) = 0;
+        (b[12] => z[16]) = 0;
+        (b[13] => z[16]) = 0;
+        (b[14] => z[16]) = 0;
+        (b[15] => z[16]) = 0;
+        (b[16] => z[16]) = 0;
+        (b[17] => z[16]) = 0;
+        (a[0] => z[17]) = 0;
+        (a[1] => z[17]) = 0;
+        (a[2] => z[17]) = 0;
+        (a[3] => z[17]) = 0;
+        (a[4] => z[17]) = 0;
+        (a[5] => z[17]) = 0;
+        (a[6] => z[17]) = 0;
+        (a[7] => z[17]) = 0;
+        (a[8] => z[17]) = 0;
+        (a[9] => z[17]) = 0;
+        (a[10] => z[17]) = 0;
+        (a[11] => z[17]) = 0;
+        (a[12] => z[17]) = 0;
+        (a[13] => z[17]) = 0;
+        (a[14] => z[17]) = 0;
+        (a[15] => z[17]) = 0;
+        (a[16] => z[17]) = 0;
+        (a[17] => z[17]) = 0;
+        (a[18] => z[17]) = 0;
+        (a[19] => z[17]) = 0;
+        (b[0] => z[17]) = 0;
+        (b[1] => z[17]) = 0;
+        (b[2] => z[17]) = 0;
+        (b[3] => z[17]) = 0;
+        (b[4] => z[17]) = 0;
+        (b[5] => z[17]) = 0;
+        (b[6] => z[17]) = 0;
+        (b[7] => z[17]) = 0;
+        (b[8] => z[17]) = 0;
+        (b[9] => z[17]) = 0;
+        (b[10] => z[17]) = 0;
+        (b[11] => z[17]) = 0;
+        (b[12] => z[17]) = 0;
+        (b[13] => z[17]) = 0;
+        (b[14] => z[17]) = 0;
+        (b[15] => z[17]) = 0;
+        (b[16] => z[17]) = 0;
+        (b[17] => z[17]) = 0;
+        (a[0] => z[18]) = 0;
+        (a[1] => z[18]) = 0;
+        (a[2] => z[18]) = 0;
+        (a[3] => z[18]) = 0;
+        (a[4] => z[18]) = 0;
+        (a[5] => z[18]) = 0;
+        (a[6] => z[18]) = 0;
+        (a[7] => z[18]) = 0;
+        (a[8] => z[18]) = 0;
+        (a[9] => z[18]) = 0;
+        (a[10] => z[18]) = 0;
+        (a[11] => z[18]) = 0;
+        (a[12] => z[18]) = 0;
+        (a[13] => z[18]) = 0;
+        (a[14] => z[18]) = 0;
+        (a[15] => z[18]) = 0;
+        (a[16] => z[18]) = 0;
+        (a[17] => z[18]) = 0;
+        (a[18] => z[18]) = 0;
+        (a[19] => z[18]) = 0;
+        (b[0] => z[18]) = 0;
+        (b[1] => z[18]) = 0;
+        (b[2] => z[18]) = 0;
+        (b[3] => z[18]) = 0;
+        (b[4] => z[18]) = 0;
+        (b[5] => z[18]) = 0;
+        (b[6] => z[18]) = 0;
+        (b[7] => z[18]) = 0;
+        (b[8] => z[18]) = 0;
+        (b[9] => z[18]) = 0;
+        (b[10] => z[18]) = 0;
+        (b[11] => z[18]) = 0;
+        (b[12] => z[18]) = 0;
+        (b[13] => z[18]) = 0;
+        (b[14] => z[18]) = 0;
+        (b[15] => z[18]) = 0;
+        (b[16] => z[18]) = 0;
+        (b[17] => z[18]) = 0;
+        (a[0] => z[19]) = 0;
+        (a[1] => z[19]) = 0;
+        (a[2] => z[19]) = 0;
+        (a[3] => z[19]) = 0;
+        (a[4] => z[19]) = 0;
+        (a[5] => z[19]) = 0;
+        (a[6] => z[19]) = 0;
+        (a[7] => z[19]) = 0;
+        (a[8] => z[19]) = 0;
+        (a[9] => z[19]) = 0;
+        (a[10] => z[19]) = 0;
+        (a[11] => z[19]) = 0;
+        (a[12] => z[19]) = 0;
+        (a[13] => z[19]) = 0;
+        (a[14] => z[19]) = 0;
+        (a[15] => z[19]) = 0;
+        (a[16] => z[19]) = 0;
+        (a[17] => z[19]) = 0;
+        (a[18] => z[19]) = 0;
+        (a[19] => z[19]) = 0;
+        (b[0] => z[19]) = 0;
+        (b[1] => z[19]) = 0;
+        (b[2] => z[19]) = 0;
+        (b[3] => z[19]) = 0;
+        (b[4] => z[19]) = 0;
+        (b[5] => z[19]) = 0;
+        (b[6] => z[19]) = 0;
+        (b[7] => z[19]) = 0;
+        (b[8] => z[19]) = 0;
+        (b[9] => z[19]) = 0;
+        (b[10] => z[19]) = 0;
+        (b[11] => z[19]) = 0;
+        (b[12] => z[19]) = 0;
+        (b[13] => z[19]) = 0;
+        (b[14] => z[19]) = 0;
+        (b[15] => z[19]) = 0;
+        (b[16] => z[19]) = 0;
+        (b[17] => z[19]) = 0;
+        (a[0] => z[20]) = 0;
+        (a[1] => z[20]) = 0;
+        (a[2] => z[20]) = 0;
+        (a[3] => z[20]) = 0;
+        (a[4] => z[20]) = 0;
+        (a[5] => z[20]) = 0;
+        (a[6] => z[20]) = 0;
+        (a[7] => z[20]) = 0;
+        (a[8] => z[20]) = 0;
+        (a[9] => z[20]) = 0;
+        (a[10] => z[20]) = 0;
+        (a[11] => z[20]) = 0;
+        (a[12] => z[20]) = 0;
+        (a[13] => z[20]) = 0;
+        (a[14] => z[20]) = 0;
+        (a[15] => z[20]) = 0;
+        (a[16] => z[20]) = 0;
+        (a[17] => z[20]) = 0;
+        (a[18] => z[20]) = 0;
+        (a[19] => z[20]) = 0;
+        (b[0] => z[20]) = 0;
+        (b[1] => z[20]) = 0;
+        (b[2] => z[20]) = 0;
+        (b[3] => z[20]) = 0;
+        (b[4] => z[20]) = 0;
+        (b[5] => z[20]) = 0;
+        (b[6] => z[20]) = 0;
+        (b[7] => z[20]) = 0;
+        (b[8] => z[20]) = 0;
+        (b[9] => z[20]) = 0;
+        (b[10] => z[20]) = 0;
+        (b[11] => z[20]) = 0;
+        (b[12] => z[20]) = 0;
+        (b[13] => z[20]) = 0;
+        (b[14] => z[20]) = 0;
+        (b[15] => z[20]) = 0;
+        (b[16] => z[20]) = 0;
+        (b[17] => z[20]) = 0;
+        (a[0] => z[21]) = 0;
+        (a[1] => z[21]) = 0;
+        (a[2] => z[21]) = 0;
+        (a[3] => z[21]) = 0;
+        (a[4] => z[21]) = 0;
+        (a[5] => z[21]) = 0;
+        (a[6] => z[21]) = 0;
+        (a[7] => z[21]) = 0;
+        (a[8] => z[21]) = 0;
+        (a[9] => z[21]) = 0;
+        (a[10] => z[21]) = 0;
+        (a[11] => z[21]) = 0;
+        (a[12] => z[21]) = 0;
+        (a[13] => z[21]) = 0;
+        (a[14] => z[21]) = 0;
+        (a[15] => z[21]) = 0;
+        (a[16] => z[21]) = 0;
+        (a[17] => z[21]) = 0;
+        (a[18] => z[21]) = 0;
+        (a[19] => z[21]) = 0;
+        (b[0] => z[21]) = 0;
+        (b[1] => z[21]) = 0;
+        (b[2] => z[21]) = 0;
+        (b[3] => z[21]) = 0;
+        (b[4] => z[21]) = 0;
+        (b[5] => z[21]) = 0;
+        (b[6] => z[21]) = 0;
+        (b[7] => z[21]) = 0;
+        (b[8] => z[21]) = 0;
+        (b[9] => z[21]) = 0;
+        (b[10] => z[21]) = 0;
+        (b[11] => z[21]) = 0;
+        (b[12] => z[21]) = 0;
+        (b[13] => z[21]) = 0;
+        (b[14] => z[21]) = 0;
+        (b[15] => z[21]) = 0;
+        (b[16] => z[21]) = 0;
+        (b[17] => z[21]) = 0;
+        (a[0] => z[22]) = 0;
+        (a[1] => z[22]) = 0;
+        (a[2] => z[22]) = 0;
+        (a[3] => z[22]) = 0;
+        (a[4] => z[22]) = 0;
+        (a[5] => z[22]) = 0;
+        (a[6] => z[22]) = 0;
+        (a[7] => z[22]) = 0;
+        (a[8] => z[22]) = 0;
+        (a[9] => z[22]) = 0;
+        (a[10] => z[22]) = 0;
+        (a[11] => z[22]) = 0;
+        (a[12] => z[22]) = 0;
+        (a[13] => z[22]) = 0;
+        (a[14] => z[22]) = 0;
+        (a[15] => z[22]) = 0;
+        (a[16] => z[22]) = 0;
+        (a[17] => z[22]) = 0;
+        (a[18] => z[22]) = 0;
+        (a[19] => z[22]) = 0;
+        (b[0] => z[22]) = 0;
+        (b[1] => z[22]) = 0;
+        (b[2] => z[22]) = 0;
+        (b[3] => z[22]) = 0;
+        (b[4] => z[22]) = 0;
+        (b[5] => z[22]) = 0;
+        (b[6] => z[22]) = 0;
+        (b[7] => z[22]) = 0;
+        (b[8] => z[22]) = 0;
+        (b[9] => z[22]) = 0;
+        (b[10] => z[22]) = 0;
+        (b[11] => z[22]) = 0;
+        (b[12] => z[22]) = 0;
+        (b[13] => z[22]) = 0;
+        (b[14] => z[22]) = 0;
+        (b[15] => z[22]) = 0;
+        (b[16] => z[22]) = 0;
+        (b[17] => z[22]) = 0;
+        (a[0] => z[23]) = 0;
+        (a[1] => z[23]) = 0;
+        (a[2] => z[23]) = 0;
+        (a[3] => z[23]) = 0;
+        (a[4] => z[23]) = 0;
+        (a[5] => z[23]) = 0;
+        (a[6] => z[23]) = 0;
+        (a[7] => z[23]) = 0;
+        (a[8] => z[23]) = 0;
+        (a[9] => z[23]) = 0;
+        (a[10] => z[23]) = 0;
+        (a[11] => z[23]) = 0;
+        (a[12] => z[23]) = 0;
+        (a[13] => z[23]) = 0;
+        (a[14] => z[23]) = 0;
+        (a[15] => z[23]) = 0;
+        (a[16] => z[23]) = 0;
+        (a[17] => z[23]) = 0;
+        (a[18] => z[23]) = 0;
+        (a[19] => z[23]) = 0;
+        (b[0] => z[23]) = 0;
+        (b[1] => z[23]) = 0;
+        (b[2] => z[23]) = 0;
+        (b[3] => z[23]) = 0;
+        (b[4] => z[23]) = 0;
+        (b[5] => z[23]) = 0;
+        (b[6] => z[23]) = 0;
+        (b[7] => z[23]) = 0;
+        (b[8] => z[23]) = 0;
+        (b[9] => z[23]) = 0;
+        (b[10] => z[23]) = 0;
+        (b[11] => z[23]) = 0;
+        (b[12] => z[23]) = 0;
+        (b[13] => z[23]) = 0;
+        (b[14] => z[23]) = 0;
+        (b[15] => z[23]) = 0;
+        (b[16] => z[23]) = 0;
+        (b[17] => z[23]) = 0;
+        (a[0] => z[24]) = 0;
+        (a[1] => z[24]) = 0;
+        (a[2] => z[24]) = 0;
+        (a[3] => z[24]) = 0;
+        (a[4] => z[24]) = 0;
+        (a[5] => z[24]) = 0;
+        (a[6] => z[24]) = 0;
+        (a[7] => z[24]) = 0;
+        (a[8] => z[24]) = 0;
+        (a[9] => z[24]) = 0;
+        (a[10] => z[24]) = 0;
+        (a[11] => z[24]) = 0;
+        (a[12] => z[24]) = 0;
+        (a[13] => z[24]) = 0;
+        (a[14] => z[24]) = 0;
+        (a[15] => z[24]) = 0;
+        (a[16] => z[24]) = 0;
+        (a[17] => z[24]) = 0;
+        (a[18] => z[24]) = 0;
+        (a[19] => z[24]) = 0;
+        (b[0] => z[24]) = 0;
+        (b[1] => z[24]) = 0;
+        (b[2] => z[24]) = 0;
+        (b[3] => z[24]) = 0;
+        (b[4] => z[24]) = 0;
+        (b[5] => z[24]) = 0;
+        (b[6] => z[24]) = 0;
+        (b[7] => z[24]) = 0;
+        (b[8] => z[24]) = 0;
+        (b[9] => z[24]) = 0;
+        (b[10] => z[24]) = 0;
+        (b[11] => z[24]) = 0;
+        (b[12] => z[24]) = 0;
+        (b[13] => z[24]) = 0;
+        (b[14] => z[24]) = 0;
+        (b[15] => z[24]) = 0;
+        (b[16] => z[24]) = 0;
+        (b[17] => z[24]) = 0;
+        (a[0] => z[25]) = 0;
+        (a[1] => z[25]) = 0;
+        (a[2] => z[25]) = 0;
+        (a[3] => z[25]) = 0;
+        (a[4] => z[25]) = 0;
+        (a[5] => z[25]) = 0;
+        (a[6] => z[25]) = 0;
+        (a[7] => z[25]) = 0;
+        (a[8] => z[25]) = 0;
+        (a[9] => z[25]) = 0;
+        (a[10] => z[25]) = 0;
+        (a[11] => z[25]) = 0;
+        (a[12] => z[25]) = 0;
+        (a[13] => z[25]) = 0;
+        (a[14] => z[25]) = 0;
+        (a[15] => z[25]) = 0;
+        (a[16] => z[25]) = 0;
+        (a[17] => z[25]) = 0;
+        (a[18] => z[25]) = 0;
+        (a[19] => z[25]) = 0;
+        (b[0] => z[25]) = 0;
+        (b[1] => z[25]) = 0;
+        (b[2] => z[25]) = 0;
+        (b[3] => z[25]) = 0;
+        (b[4] => z[25]) = 0;
+        (b[5] => z[25]) = 0;
+        (b[6] => z[25]) = 0;
+        (b[7] => z[25]) = 0;
+        (b[8] => z[25]) = 0;
+        (b[9] => z[25]) = 0;
+        (b[10] => z[25]) = 0;
+        (b[11] => z[25]) = 0;
+        (b[12] => z[25]) = 0;
+        (b[13] => z[25]) = 0;
+        (b[14] => z[25]) = 0;
+        (b[15] => z[25]) = 0;
+        (b[16] => z[25]) = 0;
+        (b[17] => z[25]) = 0;
+        (a[0] => z[26]) = 0;
+        (a[1] => z[26]) = 0;
+        (a[2] => z[26]) = 0;
+        (a[3] => z[26]) = 0;
+        (a[4] => z[26]) = 0;
+        (a[5] => z[26]) = 0;
+        (a[6] => z[26]) = 0;
+        (a[7] => z[26]) = 0;
+        (a[8] => z[26]) = 0;
+        (a[9] => z[26]) = 0;
+        (a[10] => z[26]) = 0;
+        (a[11] => z[26]) = 0;
+        (a[12] => z[26]) = 0;
+        (a[13] => z[26]) = 0;
+        (a[14] => z[26]) = 0;
+        (a[15] => z[26]) = 0;
+        (a[16] => z[26]) = 0;
+        (a[17] => z[26]) = 0;
+        (a[18] => z[26]) = 0;
+        (a[19] => z[26]) = 0;
+        (b[0] => z[26]) = 0;
+        (b[1] => z[26]) = 0;
+        (b[2] => z[26]) = 0;
+        (b[3] => z[26]) = 0;
+        (b[4] => z[26]) = 0;
+        (b[5] => z[26]) = 0;
+        (b[6] => z[26]) = 0;
+        (b[7] => z[26]) = 0;
+        (b[8] => z[26]) = 0;
+        (b[9] => z[26]) = 0;
+        (b[10] => z[26]) = 0;
+        (b[11] => z[26]) = 0;
+        (b[12] => z[26]) = 0;
+        (b[13] => z[26]) = 0;
+        (b[14] => z[26]) = 0;
+        (b[15] => z[26]) = 0;
+        (b[16] => z[26]) = 0;
+        (b[17] => z[26]) = 0;
+        (a[0] => z[27]) = 0;
+        (a[1] => z[27]) = 0;
+        (a[2] => z[27]) = 0;
+        (a[3] => z[27]) = 0;
+        (a[4] => z[27]) = 0;
+        (a[5] => z[27]) = 0;
+        (a[6] => z[27]) = 0;
+        (a[7] => z[27]) = 0;
+        (a[8] => z[27]) = 0;
+        (a[9] => z[27]) = 0;
+        (a[10] => z[27]) = 0;
+        (a[11] => z[27]) = 0;
+        (a[12] => z[27]) = 0;
+        (a[13] => z[27]) = 0;
+        (a[14] => z[27]) = 0;
+        (a[15] => z[27]) = 0;
+        (a[16] => z[27]) = 0;
+        (a[17] => z[27]) = 0;
+        (a[18] => z[27]) = 0;
+        (a[19] => z[27]) = 0;
+        (b[0] => z[27]) = 0;
+        (b[1] => z[27]) = 0;
+        (b[2] => z[27]) = 0;
+        (b[3] => z[27]) = 0;
+        (b[4] => z[27]) = 0;
+        (b[5] => z[27]) = 0;
+        (b[6] => z[27]) = 0;
+        (b[7] => z[27]) = 0;
+        (b[8] => z[27]) = 0;
+        (b[9] => z[27]) = 0;
+        (b[10] => z[27]) = 0;
+        (b[11] => z[27]) = 0;
+        (b[12] => z[27]) = 0;
+        (b[13] => z[27]) = 0;
+        (b[14] => z[27]) = 0;
+        (b[15] => z[27]) = 0;
+        (b[16] => z[27]) = 0;
+        (b[17] => z[27]) = 0;
+        (a[0] => z[28]) = 0;
+        (a[1] => z[28]) = 0;
+        (a[2] => z[28]) = 0;
+        (a[3] => z[28]) = 0;
+        (a[4] => z[28]) = 0;
+        (a[5] => z[28]) = 0;
+        (a[6] => z[28]) = 0;
+        (a[7] => z[28]) = 0;
+        (a[8] => z[28]) = 0;
+        (a[9] => z[28]) = 0;
+        (a[10] => z[28]) = 0;
+        (a[11] => z[28]) = 0;
+        (a[12] => z[28]) = 0;
+        (a[13] => z[28]) = 0;
+        (a[14] => z[28]) = 0;
+        (a[15] => z[28]) = 0;
+        (a[16] => z[28]) = 0;
+        (a[17] => z[28]) = 0;
+        (a[18] => z[28]) = 0;
+        (a[19] => z[28]) = 0;
+        (b[0] => z[28]) = 0;
+        (b[1] => z[28]) = 0;
+        (b[2] => z[28]) = 0;
+        (b[3] => z[28]) = 0;
+        (b[4] => z[28]) = 0;
+        (b[5] => z[28]) = 0;
+        (b[6] => z[28]) = 0;
+        (b[7] => z[28]) = 0;
+        (b[8] => z[28]) = 0;
+        (b[9] => z[28]) = 0;
+        (b[10] => z[28]) = 0;
+        (b[11] => z[28]) = 0;
+        (b[12] => z[28]) = 0;
+        (b[13] => z[28]) = 0;
+        (b[14] => z[28]) = 0;
+        (b[15] => z[28]) = 0;
+        (b[16] => z[28]) = 0;
+        (b[17] => z[28]) = 0;
+        (a[0] => z[29]) = 0;
+        (a[1] => z[29]) = 0;
+        (a[2] => z[29]) = 0;
+        (a[3] => z[29]) = 0;
+        (a[4] => z[29]) = 0;
+        (a[5] => z[29]) = 0;
+        (a[6] => z[29]) = 0;
+        (a[7] => z[29]) = 0;
+        (a[8] => z[29]) = 0;
+        (a[9] => z[29]) = 0;
+        (a[10] => z[29]) = 0;
+        (a[11] => z[29]) = 0;
+        (a[12] => z[29]) = 0;
+        (a[13] => z[29]) = 0;
+        (a[14] => z[29]) = 0;
+        (a[15] => z[29]) = 0;
+        (a[16] => z[29]) = 0;
+        (a[17] => z[29]) = 0;
+        (a[18] => z[29]) = 0;
+        (a[19] => z[29]) = 0;
+        (b[0] => z[29]) = 0;
+        (b[1] => z[29]) = 0;
+        (b[2] => z[29]) = 0;
+        (b[3] => z[29]) = 0;
+        (b[4] => z[29]) = 0;
+        (b[5] => z[29]) = 0;
+        (b[6] => z[29]) = 0;
+        (b[7] => z[29]) = 0;
+        (b[8] => z[29]) = 0;
+        (b[9] => z[29]) = 0;
+        (b[10] => z[29]) = 0;
+        (b[11] => z[29]) = 0;
+        (b[12] => z[29]) = 0;
+        (b[13] => z[29]) = 0;
+        (b[14] => z[29]) = 0;
+        (b[15] => z[29]) = 0;
+        (b[16] => z[29]) = 0;
+        (b[17] => z[29]) = 0;
+        (a[0] => z[30]) = 0;
+        (a[1] => z[30]) = 0;
+        (a[2] => z[30]) = 0;
+        (a[3] => z[30]) = 0;
+        (a[4] => z[30]) = 0;
+        (a[5] => z[30]) = 0;
+        (a[6] => z[30]) = 0;
+        (a[7] => z[30]) = 0;
+        (a[8] => z[30]) = 0;
+        (a[9] => z[30]) = 0;
+        (a[10] => z[30]) = 0;
+        (a[11] => z[30]) = 0;
+        (a[12] => z[30]) = 0;
+        (a[13] => z[30]) = 0;
+        (a[14] => z[30]) = 0;
+        (a[15] => z[30]) = 0;
+        (a[16] => z[30]) = 0;
+        (a[17] => z[30]) = 0;
+        (a[18] => z[30]) = 0;
+        (a[19] => z[30]) = 0;
+        (b[0] => z[30]) = 0;
+        (b[1] => z[30]) = 0;
+        (b[2] => z[30]) = 0;
+        (b[3] => z[30]) = 0;
+        (b[4] => z[30]) = 0;
+        (b[5] => z[30]) = 0;
+        (b[6] => z[30]) = 0;
+        (b[7] => z[30]) = 0;
+        (b[8] => z[30]) = 0;
+        (b[9] => z[30]) = 0;
+        (b[10] => z[30]) = 0;
+        (b[11] => z[30]) = 0;
+        (b[12] => z[30]) = 0;
+        (b[13] => z[30]) = 0;
+        (b[14] => z[30]) = 0;
+        (b[15] => z[30]) = 0;
+        (b[16] => z[30]) = 0;
+        (b[17] => z[30]) = 0;
+        (a[0] => z[31]) = 0;
+        (a[1] => z[31]) = 0;
+        (a[2] => z[31]) = 0;
+        (a[3] => z[31]) = 0;
+        (a[4] => z[31]) = 0;
+        (a[5] => z[31]) = 0;
+        (a[6] => z[31]) = 0;
+        (a[7] => z[31]) = 0;
+        (a[8] => z[31]) = 0;
+        (a[9] => z[31]) = 0;
+        (a[10] => z[31]) = 0;
+        (a[11] => z[31]) = 0;
+        (a[12] => z[31]) = 0;
+        (a[13] => z[31]) = 0;
+        (a[14] => z[31]) = 0;
+        (a[15] => z[31]) = 0;
+        (a[16] => z[31]) = 0;
+        (a[17] => z[31]) = 0;
+        (a[18] => z[31]) = 0;
+        (a[19] => z[31]) = 0;
+        (b[0] => z[31]) = 0;
+        (b[1] => z[31]) = 0;
+        (b[2] => z[31]) = 0;
+        (b[3] => z[31]) = 0;
+        (b[4] => z[31]) = 0;
+        (b[5] => z[31]) = 0;
+        (b[6] => z[31]) = 0;
+        (b[7] => z[31]) = 0;
+        (b[8] => z[31]) = 0;
+        (b[9] => z[31]) = 0;
+        (b[10] => z[31]) = 0;
+        (b[11] => z[31]) = 0;
+        (b[12] => z[31]) = 0;
+        (b[13] => z[31]) = 0;
+        (b[14] => z[31]) = 0;
+        (b[15] => z[31]) = 0;
+        (b[16] => z[31]) = 0;
+        (b[17] => z[31]) = 0;
+        (a[0] => z[32]) = 0;
+        (a[1] => z[32]) = 0;
+        (a[2] => z[32]) = 0;
+        (a[3] => z[32]) = 0;
+        (a[4] => z[32]) = 0;
+        (a[5] => z[32]) = 0;
+        (a[6] => z[32]) = 0;
+        (a[7] => z[32]) = 0;
+        (a[8] => z[32]) = 0;
+        (a[9] => z[32]) = 0;
+        (a[10] => z[32]) = 0;
+        (a[11] => z[32]) = 0;
+        (a[12] => z[32]) = 0;
+        (a[13] => z[32]) = 0;
+        (a[14] => z[32]) = 0;
+        (a[15] => z[32]) = 0;
+        (a[16] => z[32]) = 0;
+        (a[17] => z[32]) = 0;
+        (a[18] => z[32]) = 0;
+        (a[19] => z[32]) = 0;
+        (b[0] => z[32]) = 0;
+        (b[1] => z[32]) = 0;
+        (b[2] => z[32]) = 0;
+        (b[3] => z[32]) = 0;
+        (b[4] => z[32]) = 0;
+        (b[5] => z[32]) = 0;
+        (b[6] => z[32]) = 0;
+        (b[7] => z[32]) = 0;
+        (b[8] => z[32]) = 0;
+        (b[9] => z[32]) = 0;
+        (b[10] => z[32]) = 0;
+        (b[11] => z[32]) = 0;
+        (b[12] => z[32]) = 0;
+        (b[13] => z[32]) = 0;
+        (b[14] => z[32]) = 0;
+        (b[15] => z[32]) = 0;
+        (b[16] => z[32]) = 0;
+        (b[17] => z[32]) = 0;
+        (a[0] => z[33]) = 0;
+        (a[1] => z[33]) = 0;
+        (a[2] => z[33]) = 0;
+        (a[3] => z[33]) = 0;
+        (a[4] => z[33]) = 0;
+        (a[5] => z[33]) = 0;
+        (a[6] => z[33]) = 0;
+        (a[7] => z[33]) = 0;
+        (a[8] => z[33]) = 0;
+        (a[9] => z[33]) = 0;
+        (a[10] => z[33]) = 0;
+        (a[11] => z[33]) = 0;
+        (a[12] => z[33]) = 0;
+        (a[13] => z[33]) = 0;
+        (a[14] => z[33]) = 0;
+        (a[15] => z[33]) = 0;
+        (a[16] => z[33]) = 0;
+        (a[17] => z[33]) = 0;
+        (a[18] => z[33]) = 0;
+        (a[19] => z[33]) = 0;
+        (b[0] => z[33]) = 0;
+        (b[1] => z[33]) = 0;
+        (b[2] => z[33]) = 0;
+        (b[3] => z[33]) = 0;
+        (b[4] => z[33]) = 0;
+        (b[5] => z[33]) = 0;
+        (b[6] => z[33]) = 0;
+        (b[7] => z[33]) = 0;
+        (b[8] => z[33]) = 0;
+        (b[9] => z[33]) = 0;
+        (b[10] => z[33]) = 0;
+        (b[11] => z[33]) = 0;
+        (b[12] => z[33]) = 0;
+        (b[13] => z[33]) = 0;
+        (b[14] => z[33]) = 0;
+        (b[15] => z[33]) = 0;
+        (b[16] => z[33]) = 0;
+        (b[17] => z[33]) = 0;
+        (a[0] => z[34]) = 0;
+        (a[1] => z[34]) = 0;
+        (a[2] => z[34]) = 0;
+        (a[3] => z[34]) = 0;
+        (a[4] => z[34]) = 0;
+        (a[5] => z[34]) = 0;
+        (a[6] => z[34]) = 0;
+        (a[7] => z[34]) = 0;
+        (a[8] => z[34]) = 0;
+        (a[9] => z[34]) = 0;
+        (a[10] => z[34]) = 0;
+        (a[11] => z[34]) = 0;
+        (a[12] => z[34]) = 0;
+        (a[13] => z[34]) = 0;
+        (a[14] => z[34]) = 0;
+        (a[15] => z[34]) = 0;
+        (a[16] => z[34]) = 0;
+        (a[17] => z[34]) = 0;
+        (a[18] => z[34]) = 0;
+        (a[19] => z[34]) = 0;
+        (b[0] => z[34]) = 0;
+        (b[1] => z[34]) = 0;
+        (b[2] => z[34]) = 0;
+        (b[3] => z[34]) = 0;
+        (b[4] => z[34]) = 0;
+        (b[5] => z[34]) = 0;
+        (b[6] => z[34]) = 0;
+        (b[7] => z[34]) = 0;
+        (b[8] => z[34]) = 0;
+        (b[9] => z[34]) = 0;
+        (b[10] => z[34]) = 0;
+        (b[11] => z[34]) = 0;
+        (b[12] => z[34]) = 0;
+        (b[13] => z[34]) = 0;
+        (b[14] => z[34]) = 0;
+        (b[15] => z[34]) = 0;
+        (b[16] => z[34]) = 0;
+        (b[17] => z[34]) = 0;
+        (a[0] => z[35]) = 0;
+        (a[1] => z[35]) = 0;
+        (a[2] => z[35]) = 0;
+        (a[3] => z[35]) = 0;
+        (a[4] => z[35]) = 0;
+        (a[5] => z[35]) = 0;
+        (a[6] => z[35]) = 0;
+        (a[7] => z[35]) = 0;
+        (a[8] => z[35]) = 0;
+        (a[9] => z[35]) = 0;
+        (a[10] => z[35]) = 0;
+        (a[11] => z[35]) = 0;
+        (a[12] => z[35]) = 0;
+        (a[13] => z[35]) = 0;
+        (a[14] => z[35]) = 0;
+        (a[15] => z[35]) = 0;
+        (a[16] => z[35]) = 0;
+        (a[17] => z[35]) = 0;
+        (a[18] => z[35]) = 0;
+        (a[19] => z[35]) = 0;
+        (b[0] => z[35]) = 0;
+        (b[1] => z[35]) = 0;
+        (b[2] => z[35]) = 0;
+        (b[3] => z[35]) = 0;
+        (b[4] => z[35]) = 0;
+        (b[5] => z[35]) = 0;
+        (b[6] => z[35]) = 0;
+        (b[7] => z[35]) = 0;
+        (b[8] => z[35]) = 0;
+        (b[9] => z[35]) = 0;
+        (b[10] => z[35]) = 0;
+        (b[11] => z[35]) = 0;
+        (b[12] => z[35]) = 0;
+        (b[13] => z[35]) = 0;
+        (b[14] => z[35]) = 0;
+        (b[15] => z[35]) = 0;
+        (b[16] => z[35]) = 0;
+        (b[17] => z[35]) = 0;
+        (a[0] => z[36]) = 0;
+        (a[1] => z[36]) = 0;
+        (a[2] => z[36]) = 0;
+        (a[3] => z[36]) = 0;
+        (a[4] => z[36]) = 0;
+        (a[5] => z[36]) = 0;
+        (a[6] => z[36]) = 0;
+        (a[7] => z[36]) = 0;
+        (a[8] => z[36]) = 0;
+        (a[9] => z[36]) = 0;
+        (a[10] => z[36]) = 0;
+        (a[11] => z[36]) = 0;
+        (a[12] => z[36]) = 0;
+        (a[13] => z[36]) = 0;
+        (a[14] => z[36]) = 0;
+        (a[15] => z[36]) = 0;
+        (a[16] => z[36]) = 0;
+        (a[17] => z[36]) = 0;
+        (a[18] => z[36]) = 0;
+        (a[19] => z[36]) = 0;
+        (b[0] => z[36]) = 0;
+        (b[1] => z[36]) = 0;
+        (b[2] => z[36]) = 0;
+        (b[3] => z[36]) = 0;
+        (b[4] => z[36]) = 0;
+        (b[5] => z[36]) = 0;
+        (b[6] => z[36]) = 0;
+        (b[7] => z[36]) = 0;
+        (b[8] => z[36]) = 0;
+        (b[9] => z[36]) = 0;
+        (b[10] => z[36]) = 0;
+        (b[11] => z[36]) = 0;
+        (b[12] => z[36]) = 0;
+        (b[13] => z[36]) = 0;
+        (b[14] => z[36]) = 0;
+        (b[15] => z[36]) = 0;
+        (b[16] => z[36]) = 0;
+        (b[17] => z[36]) = 0;
+        (a[0] => z[37]) = 0;
+        (a[1] => z[37]) = 0;
+        (a[2] => z[37]) = 0;
+        (a[3] => z[37]) = 0;
+        (a[4] => z[37]) = 0;
+        (a[5] => z[37]) = 0;
+        (a[6] => z[37]) = 0;
+        (a[7] => z[37]) = 0;
+        (a[8] => z[37]) = 0;
+        (a[9] => z[37]) = 0;
+        (a[10] => z[37]) = 0;
+        (a[11] => z[37]) = 0;
+        (a[12] => z[37]) = 0;
+        (a[13] => z[37]) = 0;
+        (a[14] => z[37]) = 0;
+        (a[15] => z[37]) = 0;
+        (a[16] => z[37]) = 0;
+        (a[17] => z[37]) = 0;
+        (a[18] => z[37]) = 0;
+        (a[19] => z[37]) = 0;
+        (b[0] => z[37]) = 0;
+        (b[1] => z[37]) = 0;
+        (b[2] => z[37]) = 0;
+        (b[3] => z[37]) = 0;
+        (b[4] => z[37]) = 0;
+        (b[5] => z[37]) = 0;
+        (b[6] => z[37]) = 0;
+        (b[7] => z[37]) = 0;
+        (b[8] => z[37]) = 0;
+        (b[9] => z[37]) = 0;
+        (b[10] => z[37]) = 0;
+        (b[11] => z[37]) = 0;
+        (b[12] => z[37]) = 0;
+        (b[13] => z[37]) = 0;
+        (b[14] => z[37]) = 0;
+        (b[15] => z[37]) = 0;
+        (b[16] => z[37]) = 0;
+        (b[17] => z[37]) = 0;
+		(subtract => z[0]) = 0;
+		(subtract => z[1]) = 0;
+		(subtract => z[2]) = 0;
+		(subtract => z[3]) = 0;
+		(subtract => z[4]) = 0;
+		(subtract => z[5]) = 0;
+		(subtract => z[6]) = 0;
+		(subtract => z[7]) = 0;
+		(subtract => z[8]) = 0;
+		(subtract => z[9]) = 0;
+		(subtract => z[10]) = 0;
+		(subtract => z[11]) = 0;
+		(subtract => z[12]) = 0;
+		(subtract => z[13]) = 0;
+		(subtract => z[14]) = 0;
+		(subtract => z[15]) = 0;
+		(subtract => z[16]) = 0;
+		(subtract => z[17]) = 0;
+		(subtract => z[18]) = 0;
+		(subtract => z[19]) = 0;
+		(subtract => z[20]) = 0;
+		(subtract => z[21]) = 0;
+		(subtract => z[22]) = 0;
+		(subtract => z[23]) = 0;
+		(subtract => z[24]) = 0;
+		(subtract => z[25]) = 0;
+		(subtract => z[26]) = 0;
+		(subtract => z[27]) = 0;
+		(subtract => z[28]) = 0;
+		(subtract => z[29]) = 0;
+		(subtract => z[30]) = 0;
+		(subtract => z[31]) = 0;
+		(subtract => z[32]) = 0;
+		(subtract => z[33]) = 0;
+		(subtract => z[34]) = 0;
+		(subtract => z[35]) = 0;
+		(subtract => z[36]) = 0;
+		(subtract => z[37]) = 0;
+		(acc_fir[0] => z[0]) = 0;
+        (acc_fir[1] => z[0]) = 0;
+        (acc_fir[2] => z[0]) = 0;
+        (acc_fir[3] => z[0]) = 0;
+        (acc_fir[4] => z[0]) = 0;
+		(acc_fir[5] => z[0]) = 0;
+		(acc_fir[0] => z[1]) = 0;
+        (acc_fir[1] => z[1]) = 0;
+        (acc_fir[2] => z[1]) = 0;
+        (acc_fir[3] => z[1]) = 0;
+        (acc_fir[4] => z[1]) = 0;
+		(acc_fir[5] => z[1]) = 0;
+		(acc_fir[0] => z[2]) = 0;
+        (acc_fir[1] => z[2]) = 0;
+        (acc_fir[2] => z[2]) = 0;
+        (acc_fir[3] => z[2]) = 0;
+        (acc_fir[4] => z[2]) = 0;
+		(acc_fir[5] => z[2]) = 0;
+		(acc_fir[0] => z[3]) = 0;
+        (acc_fir[1] => z[3]) = 0;
+        (acc_fir[2] => z[3]) = 0;
+        (acc_fir[3] => z[3]) = 0;
+        (acc_fir[4] => z[3]) = 0;
+		(acc_fir[5] => z[3]) = 0;
+		(acc_fir[0] => z[4]) = 0;
+        (acc_fir[1] => z[4]) = 0;
+        (acc_fir[2] => z[4]) = 0;
+        (acc_fir[3] => z[4]) = 0;
+        (acc_fir[4] => z[4]) = 0;
+		(acc_fir[5] => z[4]) = 0;
+		(acc_fir[0] => z[5]) = 0;
+        (acc_fir[1] => z[5]) = 0;
+        (acc_fir[2] => z[5]) = 0;
+        (acc_fir[3] => z[5]) = 0;
+        (acc_fir[4] => z[5]) = 0;
+		(acc_fir[5] => z[5]) = 0;
+		(acc_fir[0] => z[6]) = 0;
+        (acc_fir[1] => z[6]) = 0;
+        (acc_fir[2] => z[6]) = 0;
+        (acc_fir[3] => z[6]) = 0;
+        (acc_fir[4] => z[6]) = 0;
+		(acc_fir[5] => z[6]) = 0;
+		(acc_fir[0] => z[7]) = 0;
+        (acc_fir[1] => z[7]) = 0;
+        (acc_fir[2] => z[7]) = 0;
+        (acc_fir[3] => z[7]) = 0;
+        (acc_fir[4] => z[7]) = 0;
+		(acc_fir[5] => z[7]) = 0;
+		(acc_fir[0] => z[8]) = 0;
+        (acc_fir[1] => z[8]) = 0;
+        (acc_fir[2] => z[8]) = 0;
+        (acc_fir[3] => z[8]) = 0;
+        (acc_fir[4] => z[8]) = 0;
+		(acc_fir[5] => z[8]) = 0;
+		(acc_fir[0] => z[9]) = 0;
+        (acc_fir[1] => z[9]) = 0;
+        (acc_fir[2] => z[9]) = 0;
+        (acc_fir[3] => z[9]) = 0;
+        (acc_fir[4] => z[9]) = 0;
+		(acc_fir[5] => z[9]) = 0;
+		(acc_fir[0] => z[10]) = 0;
+        (acc_fir[1] => z[10]) = 0;
+        (acc_fir[2] => z[10]) = 0;
+        (acc_fir[3] => z[10]) = 0;
+        (acc_fir[4] => z[10]) = 0;
+		(acc_fir[5] => z[10]) = 0;
+		(acc_fir[0] => z[11]) = 0;
+        (acc_fir[1] => z[11]) = 0;
+        (acc_fir[2] => z[11]) = 0;
+        (acc_fir[3] => z[11]) = 0;
+        (acc_fir[4] => z[11]) = 0;
+		(acc_fir[5] => z[11]) = 0;
+		(acc_fir[0] => z[12]) = 0;
+        (acc_fir[1] => z[12]) = 0;
+        (acc_fir[2] => z[12]) = 0;
+        (acc_fir[3] => z[12]) = 0;
+        (acc_fir[4] => z[12]) = 0;
+		(acc_fir[5] => z[12]) = 0;
+		(acc_fir[0] => z[13]) = 0;
+        (acc_fir[1] => z[13]) = 0;
+        (acc_fir[2] => z[13]) = 0;
+        (acc_fir[3] => z[13]) = 0;
+        (acc_fir[4] => z[13]) = 0;
+		(acc_fir[5] => z[13]) = 0;
+		(acc_fir[0] => z[14]) = 0;
+        (acc_fir[1] => z[14]) = 0;
+        (acc_fir[2] => z[14]) = 0;
+        (acc_fir[3] => z[14]) = 0;
+        (acc_fir[4] => z[14]) = 0;
+		(acc_fir[5] => z[14]) = 0;
+		(acc_fir[0] => z[15]) = 0;
+        (acc_fir[1] => z[15]) = 0;
+        (acc_fir[2] => z[15]) = 0;
+        (acc_fir[3] => z[15]) = 0;
+        (acc_fir[4] => z[15]) = 0;
+		(acc_fir[5] => z[15]) = 0;
+		(acc_fir[0] => z[16]) = 0;
+        (acc_fir[1] => z[16]) = 0;
+        (acc_fir[2] => z[16]) = 0;
+        (acc_fir[3] => z[16]) = 0;
+        (acc_fir[4] => z[16]) = 0;
+		(acc_fir[5] => z[16]) = 0;
+		(acc_fir[0] => z[17]) = 0;
+        (acc_fir[1] => z[17]) = 0;
+        (acc_fir[2] => z[17]) = 0;
+        (acc_fir[3] => z[17]) = 0;
+        (acc_fir[4] => z[17]) = 0;
+		(acc_fir[5] => z[17]) = 0;
+		(acc_fir[0] => z[18]) = 0;
+        (acc_fir[1] => z[18]) = 0;
+        (acc_fir[2] => z[18]) = 0;
+        (acc_fir[3] => z[18]) = 0;
+        (acc_fir[4] => z[18]) = 0;
+		(acc_fir[5] => z[18]) = 0;
+		(acc_fir[0] => z[19]) = 0;
+        (acc_fir[1] => z[19]) = 0;
+        (acc_fir[2] => z[19]) = 0;
+        (acc_fir[3] => z[19]) = 0;
+        (acc_fir[4] => z[19]) = 0;
+		(acc_fir[5] => z[19]) = 0;
+		(acc_fir[0] => z[20]) = 0;
+        (acc_fir[1] => z[20]) = 0;
+        (acc_fir[2] => z[20]) = 0;
+        (acc_fir[3] => z[20]) = 0;
+        (acc_fir[4] => z[20]) = 0;
+		(acc_fir[5] => z[20]) = 0;
+		(acc_fir[0] => z[21]) = 0;
+        (acc_fir[1] => z[21]) = 0;
+        (acc_fir[2] => z[21]) = 0;
+        (acc_fir[3] => z[21]) = 0;
+        (acc_fir[4] => z[21]) = 0;
+		(acc_fir[5] => z[21]) = 0;
+		(acc_fir[0] => z[22]) = 0;
+        (acc_fir[1] => z[22]) = 0;
+        (acc_fir[2] => z[22]) = 0;
+        (acc_fir[3] => z[22]) = 0;
+        (acc_fir[4] => z[22]) = 0;
+		(acc_fir[5] => z[22]) = 0;
+		(acc_fir[0] => z[23]) = 0;
+        (acc_fir[1] => z[23]) = 0;
+        (acc_fir[2] => z[23]) = 0;
+        (acc_fir[3] => z[23]) = 0;
+        (acc_fir[4] => z[23]) = 0;
+		(acc_fir[5] => z[23]) = 0;
+		(acc_fir[0] => z[24]) = 0;
+        (acc_fir[1] => z[24]) = 0;
+        (acc_fir[2] => z[24]) = 0;
+        (acc_fir[3] => z[24]) = 0;
+        (acc_fir[4] => z[24]) = 0;
+		(acc_fir[5] => z[24]) = 0;
+		(acc_fir[0] => z[25]) = 0;
+        (acc_fir[1] => z[25]) = 0;
+        (acc_fir[2] => z[25]) = 0;
+        (acc_fir[3] => z[25]) = 0;
+        (acc_fir[4] => z[25]) = 0;
+		(acc_fir[5] => z[25]) = 0;
+		(acc_fir[0] => z[26]) = 0;
+        (acc_fir[1] => z[26]) = 0;
+        (acc_fir[2] => z[26]) = 0;
+        (acc_fir[3] => z[26]) = 0;
+        (acc_fir[4] => z[26]) = 0;
+		(acc_fir[5] => z[26]) = 0;
+		(acc_fir[0] => z[27]) = 0;
+        (acc_fir[1] => z[27]) = 0;
+        (acc_fir[2] => z[27]) = 0;
+        (acc_fir[3] => z[27]) = 0;
+        (acc_fir[4] => z[27]) = 0;
+		(acc_fir[5] => z[27]) = 0;
+		(acc_fir[0] => z[28]) = 0;
+        (acc_fir[1] => z[28]) = 0;
+        (acc_fir[2] => z[28]) = 0;
+        (acc_fir[3] => z[28]) = 0;
+        (acc_fir[4] => z[28]) = 0;
+		(acc_fir[5] => z[28]) = 0;
+		(acc_fir[0] => z[29]) = 0;
+        (acc_fir[1] => z[29]) = 0;
+        (acc_fir[2] => z[29]) = 0;
+        (acc_fir[3] => z[29]) = 0;
+        (acc_fir[4] => z[29]) = 0;
+		(acc_fir[5] => z[29]) = 0;
+		(acc_fir[0] => z[30]) = 0;
+        (acc_fir[1] => z[30]) = 0;
+        (acc_fir[2] => z[30]) = 0;
+        (acc_fir[3] => z[30]) = 0;
+        (acc_fir[4] => z[30]) = 0;
+		(acc_fir[5] => z[30]) = 0;
+		(acc_fir[0] => z[31]) = 0;
+        (acc_fir[1] => z[31]) = 0;
+        (acc_fir[2] => z[31]) = 0;
+        (acc_fir[3] => z[31]) = 0;
+        (acc_fir[4] => z[31]) = 0;
+		(acc_fir[5] => z[31]) = 0;
+		(acc_fir[0] => z[32]) = 0;
+        (acc_fir[1] => z[32]) = 0;
+        (acc_fir[2] => z[32]) = 0;
+        (acc_fir[3] => z[32]) = 0;
+        (acc_fir[4] => z[32]) = 0;
+		(acc_fir[5] => z[32]) = 0;
+		(acc_fir[0] => z[33]) = 0;
+        (acc_fir[1] => z[33]) = 0;
+        (acc_fir[2] => z[33]) = 0;
+        (acc_fir[3] => z[33]) = 0;
+        (acc_fir[4] => z[33]) = 0;
+		(acc_fir[5] => z[33]) = 0;
+		(acc_fir[0] => z[34]) = 0;
+        (acc_fir[1] => z[34]) = 0;
+        (acc_fir[2] => z[34]) = 0;
+        (acc_fir[3] => z[34]) = 0;
+        (acc_fir[4] => z[34]) = 0;
+		(acc_fir[5] => z[34]) = 0;
+		(acc_fir[0] => z[35]) = 0;
+        (acc_fir[1] => z[35]) = 0;
+        (acc_fir[2] => z[35]) = 0;
+        (acc_fir[3] => z[35]) = 0;
+        (acc_fir[4] => z[35]) = 0;
+		(acc_fir[5] => z[35]) = 0;
+		(acc_fir[0] => z[36]) = 0;
+        (acc_fir[1] => z[36]) = 0;
+        (acc_fir[2] => z[36]) = 0;
+        (acc_fir[3] => z[36]) = 0;
+        (acc_fir[4] => z[36]) = 0;
+		(acc_fir[5] => z[36]) = 0;
+		(acc_fir[0] => z[37]) = 0;
+        (acc_fir[1] => z[37]) = 0;
+        (acc_fir[2] => z[37]) = 0;
+        (acc_fir[3] => z[37]) = 0;
+        (acc_fir[4] => z[37]) = 0;
+		(acc_fir[5] => z[37]) = 0;
+	endspecify
+`endif
+	
 endmodule
 
 module QL_DSP2_MULTADD_REGIN (
@@ -468,6 +3700,7 @@
     ) dsp (
         .a(a),
         .b(b),
+        .dly_b(),
         .z(z),
 
         .f_mode(f_mode),
@@ -489,6 +3722,20 @@
         .subtract(subtract),
         .register_inputs(register_inputs)   // registered inputs
     );
+
+`ifdef SDF_SIM	
+	specify
+		(posedge clk => (z +: a)) = 0;
+		(posedge clk => (z +: b)) = 0;
+		$setuphold(posedge clk, a, 0, 0);
+		$setuphold(posedge clk, b, 0, 0);
+		$setuphold(posedge clk, feedback, 0, 0);
+		$setuphold(posedge clk, load_acc, 0, 0);
+		$setuphold(posedge clk, subtract, 0, 0);
+		$setuphold(posedge clk, acc_fir, 0, 0);
+	endspecify
+`endif
+	
 endmodule
 
 module QL_DSP2_MULTADD_REGOUT (
@@ -527,6 +3774,7 @@
     ) dsp (
         .a(a),
         .b(b),
+        .dly_b(),
         .z(z),
 
         .f_mode(f_mode),
@@ -548,6 +3796,20 @@
         .subtract(subtract),
         .register_inputs(register_inputs)   // unregistered inputs
     );
+
+`ifdef SDF_SIM	
+	specify
+		(posedge clk => (z +: a)) = 0;
+		(posedge clk => (z +: b)) = 0;
+		$setuphold(posedge clk, a, 0, 0);
+		$setuphold(posedge clk, b, 0, 0);
+		$setuphold(posedge clk, feedback, 0, 0);
+		$setuphold(posedge clk, load_acc, 0, 0);
+		$setuphold(posedge clk, subtract, 0, 0);
+		$setuphold(posedge clk, acc_fir, 0, 0);
+	endspecify
+`endif
+
 endmodule
 
 module QL_DSP2_MULTADD_REGIN_REGOUT (
@@ -586,6 +3848,7 @@
     ) dsp (
         .a(a),
         .b(b),
+        .dly_b(),
         .z(z),
 
         .f_mode(f_mode),
@@ -607,6 +3870,20 @@
         .subtract(subtract),
         .register_inputs(register_inputs)   // registered inputs
     );
+
+`ifdef SDF_SIM	
+	specify
+		(posedge clk => (z +: a)) = 0;
+		(posedge clk => (z +: b)) = 0;
+		$setuphold(posedge clk, a, 0, 0);
+		$setuphold(posedge clk, b, 0, 0);
+		$setuphold(posedge clk, feedback, 0, 0);
+		$setuphold(posedge clk, load_acc, 0, 0);
+		$setuphold(posedge clk, subtract, 0, 0);
+		$setuphold(posedge clk, acc_fir, 0, 0);
+	endspecify
+`endif
+
 endmodule
 
 module QL_DSP2_MULTACC (
@@ -644,7 +3921,9 @@
     ) dsp (
         .a(a),
         .b(b),
+        .acc_fir(6'b0),
         .z(z),
+        .dly_b(),
 
         .f_mode(f_mode),
 
@@ -664,6 +3943,19 @@
         .subtract(subtract),
         .register_inputs(register_inputs)   // unregistered inputs
     );
+
+`ifdef SDF_SIM	
+	specify
+		(posedge clk => (z +: a)) = 0;
+		(posedge clk => (z +: b)) = 0;
+		$setuphold(posedge clk, a, 0, 0);
+		$setuphold(posedge clk, b, 0, 0);
+		$setuphold(posedge clk, feedback, 0, 0);
+		$setuphold(posedge clk, load_acc, 0, 0);
+		$setuphold(posedge clk, subtract, 0, 0);
+	endspecify
+`endif
+	
 endmodule
 
 module QL_DSP2_MULTACC_REGIN (
@@ -701,7 +3993,9 @@
     ) dsp (
         .a(a),
         .b(b),
+        .acc_fir(6'b0),
         .z(z),
+        .dly_b(),
 
         .f_mode(f_mode),
 
@@ -721,6 +4015,19 @@
         .subtract(subtract),
         .register_inputs(register_inputs)   // registered inputs
     );
+
+`ifdef SDF_SIM	
+	specify
+		(posedge clk => (z +: a)) = 0;
+		(posedge clk => (z +: b)) = 0;
+		$setuphold(posedge clk, a, 0, 0);
+		$setuphold(posedge clk, b, 0, 0);
+		$setuphold(posedge clk, feedback, 0, 0);
+		$setuphold(posedge clk, load_acc, 0, 0);
+		$setuphold(posedge clk, subtract, 0, 0);
+	endspecify
+`endif
+	
 endmodule
 
 module QL_DSP2_MULTACC_REGOUT (
@@ -758,7 +4065,9 @@
     ) dsp (
         .a(a),
         .b(b),
+        .acc_fir(6'b0),
         .z(z),
+        .dly_b(),
 
         .f_mode(f_mode),
 
@@ -778,6 +4087,19 @@
         .subtract(subtract),
         .register_inputs(register_inputs)   // unregistered inputs
     );
+
+`ifdef SDF_SIM
+	specify
+		(posedge clk => (z +: a)) = 0;
+		(posedge clk => (z +: b)) = 0;
+		$setuphold(posedge clk, a, 0, 0);
+		$setuphold(posedge clk, b, 0, 0);
+		$setuphold(posedge clk, feedback, 0, 0);
+		$setuphold(posedge clk, load_acc, 0, 0);
+		$setuphold(posedge clk, subtract, 0, 0);
+	endspecify
+`endif
+	
 endmodule
 
 module QL_DSP2_MULTACC_REGIN_REGOUT (
@@ -815,7 +4137,9 @@
     ) dsp (
         .a(a),
         .b(b),
+        .acc_fir(6'b0),
         .z(z),
+        .dly_b(),
 
         .f_mode(f_mode),
 
@@ -835,6 +4159,19 @@
         .subtract(subtract),
         .register_inputs(register_inputs)   // registered inputs
     );
+
+`ifdef SDF_SIM	
+	specify
+		(posedge clk => (z +: a)) = 0;
+		(posedge clk => (z +: b)) = 0;
+		$setuphold(posedge clk, a, 0, 0);
+		$setuphold(posedge clk, b, 0, 0);
+		$setuphold(posedge clk, feedback, 0, 0);
+		$setuphold(posedge clk, load_acc, 0, 0);
+		$setuphold(posedge clk, subtract, 0, 0);
+	endspecify
+`endif
+	
 endmodule
 
 module dsp_t1_20x18x64_cfg_ports (
@@ -994,10 +4331,7 @@
 
 // FIXME: The version of Icarus Verilog from Conda seems not to recognize the
 // $error macro. Disable this sanity check for now because of that.
-`ifndef __ICARUS__
-    if (NBITS_ACC < NBITS_A + NBITS_B)
-        $error("NBITS_ACC must be > NBITS_A + NBITS_B");
-`endif
+
 
     // Input registers
     reg  [NBITS_A-1:0]  r_a;
@@ -2224,10 +5558,6 @@
 
 // FIXME: The version of Icarus Verilog from Conda seems not to recognize the
 // $error macro. Disable this sanity check for now because of that.
-`ifndef __ICARUS__
-    if (NBITS_ACC < NBITS_A + NBITS_B)
-        $error("NBITS_ACC must be > NBITS_A + NBITS_B");
-`endif
 
     // Input registers
     reg  [NBITS_A-1:0]  r_a;
diff --git a/ql-qlf-plugin/qlf_k6n10f/primitives_sim.v b/ql-qlf-plugin/qlf_k6n10f/primitives_sim.v
new file mode 100644
index 0000000..e8cc011
--- /dev/null
+++ b/ql-qlf-plugin/qlf_k6n10f/primitives_sim.v
@@ -0,0 +1,79 @@
+// Copyright 2020-2022 F4PGA Authors
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+// SPDX-License-Identifier: Apache-2.0
+
+`timescale 1ps/1ps
+
+`default_nettype none
+
+module fpga_interconnect(datain, dataout);
+    input  wire datain;
+    output wire dataout;
+
+    assign dataout = datain;
+
+    specify
+        (datain => dataout) = 0;
+    endspecify
+
+endmodule
+
+module LUT_K #(
+    //The Look-up Table size (number of inputs)
+    // supports 1<=K<=6
+    parameter K = 5, 
+
+    //The lut mask.  
+    //Left-most (MSB) bit corresponds to all inputs logic one. 
+    //Defaults to always false.
+    parameter LUT_MASK={2**K{1'b0}} 
+) (
+    //input  wire [K-1:0] in,
+    input  wire [5:0] in,
+    output wire out
+);
+
+    wire    [63:0]  LUT_MASK_full;
+    assign LUT_MASK_full =  (K == 6) ?  LUT_MASK[63:0] :
+                            (K == 5) ?  {32'b0, LUT_MASK[31:0]} :
+                            (K == 4) ?  {48'b0, LUT_MASK[15:0]} :
+                            (K == 3) ?  {56'b0, LUT_MASK[7:0]} :
+                            (K == 2) ?  {60'b0, LUT_MASK[3:0]} :
+                                        {62'b0, LUT_MASK[1:0]} ;
+    
+    reg     [5:0]   in_full;
+    always @(*)
+        case(K)
+            6:          in_full <= in[5:0];
+            5:          in_full <= {1'b0, in[4:0]};
+            4:          in_full <= {2'b0, in[3:0]};
+            3:          in_full <= {3'b0, in[2:0]};
+            2:          in_full <= {4'b0, in[1:0]};
+            1:          in_full <= {5'b0, in[0]};
+            default:    in_full <= in[5:0];
+        endcase
+
+    assign out = LUT_MASK_full[in_full];
+
+    specify
+        (in[0] => out) = 0;
+        (in[1] => out) = 0;
+        (in[2] => out) = 0;
+        (in[3] => out) = 0;
+        (in[4] => out) = 0;
+        (in[5] => out) = 0;
+    endspecify    
+
+endmodule
\ No newline at end of file
diff --git a/ql-qlf-plugin/synth_quicklogic.cc b/ql-qlf-plugin/synth_quicklogic.cc
index 2816daa..b6b475e 100644
--- a/ql-qlf-plugin/synth_quicklogic.cc
+++ b/ql-qlf-plugin/synth_quicklogic.cc
@@ -85,6 +85,9 @@
         log("        By default use Block RAM in output netlist.\n");
         log("        Specifying this switch turns it off.\n");
         log("\n");
+        log("    -bram_types\n");
+        log("        Emit specialized BRAM cells for particular address and data width configurations \n");
+        log("\n");
         log("    -no_ff_map\n");
         log("        By default ff techmap is turned on. Specifying this switch turns it off.\n");
         log("\n");
@@ -103,6 +106,7 @@
     bool nodsp;
     bool inferAdder;
     bool inferBram;
+    bool bramTypes;
     bool abcOpt;
     bool abc9;
     bool noffmap;
@@ -118,6 +122,7 @@
         family = "qlf_k4n8";
         inferAdder = true;
         inferBram = true;
+        bramTypes = false;
         abcOpt = true;
         abc9 = true;
         noffmap = false;
@@ -181,6 +186,10 @@
                 inferBram = false;
                 continue;
             }
+            if (args[argidx] == "-bram_types") {
+                bramTypes = true;
+                continue;
+            }
             if (args[argidx] == "-no_abc_opt") {
                 abcOpt = false;
                 continue;
@@ -237,8 +246,10 @@
 
             // Read simulation library
             readVelArgs = family_path + "/cells_sim.v";
-            if (family == "qlf_k6n10f")
+            if (family == "qlf_k6n10f") {
                 readVelArgs += family_path + "/dsp_sim.v";
+                readVelArgs += family_path + "/brams_sim.v";
+            }
 
             // Use -nomem2reg here to prevent Yosys from complaining about
             // some block ram cell models. After all the only part of the cells
@@ -368,6 +379,54 @@
             if (family == "qlf_k6n10f") {
                 run("techmap -map +/quicklogic/" + family + "/brams_final_map.v");
             }
+
+            // Data width to specialized cell type width map
+            const std::unordered_map<int, int> dataWidth36 = {{36, 36}, {32, 36}, {18, 18}, {16, 18}, {9, 9}, {8, 9}, {4, 4}, {2, 2}, {1, 1}};
+            const std::unordered_map<int, int> dataWidth18 = {{18, 18}, {16, 18}, {9, 9}, {8, 9}, {4, 4}, {2, 2}, {1, 1}};
+
+            // Perform a series of 'chtype' passess
+            if (bramTypes) {
+                for (const auto &ww : dataWidth18) {
+                    for (const auto &rw : dataWidth18) {
+                        auto cmd =
+                          stringf("chtype -set TDP36K_BRAM_WR_X%d_RD_X%d_split t:TDP36K a:is_inferred=1 %%i a:is_split=1 %%i a:wr_data_width=%d "
+                                  "%%i a:rd_data_width=%d %%i",
+                                  ww.second, rw.second, ww.first, rw.first);
+                        run(cmd);
+
+                        auto cmd1 = stringf("chtype -set TDP36K_FIFO_ASYNC_WR_X%d_RD_X%d_split t:TDP36K a:is_fifo=1 %%i a:sync_fifo=0 %%i "
+                                            "a:is_split=1 %%i a:wr_data_width=%d "
+                                            "%%i a:rd_data_width=%d %%i",
+                                            ww.second, rw.second, ww.first, rw.first);
+                        run(cmd1);
+
+                        auto cmd2 = stringf("chtype -set TDP36K_FIFO_SYNC_WR_X%d_RD_X%d_split t:TDP36K a:is_fifo=1 %%i a:sync_fifo=1 %%i "
+                                            "a:is_split=1 %%i a:wr_data_width=%d "
+                                            "%%i a:rd_data_width=%d %%i",
+                                            ww.second, rw.second, ww.first, rw.first);
+                        run(cmd2);
+                    }
+                }
+
+                for (const auto &ww : dataWidth36) {
+                    for (const auto &rw : dataWidth36) {
+                        auto cmd = stringf(
+                          "chtype -set TDP36K_BRAM_WR_X%d_RD_X%d_nonsplit t:TDP36K a:is_inferred=1 %%i a:wr_data_width=%d %%i a:rd_data_width=%d %%i",
+                          ww.second, rw.second, ww.first, rw.first);
+                        run(cmd);
+
+                        auto cmd1 = stringf("chtype -set TDP36K_FIFO_ASYNC_WR_X%d_RD_X%d_nonsplit t:TDP36K a:is_fifo=1 %%i a:sync_fifo=0 %%i "
+                                            "a:wr_data_width=%d %%i a:rd_data_width=%d %%i",
+                                            ww.second, rw.second, ww.first, rw.first);
+                        run(cmd1);
+
+                        auto cmd2 = stringf("chtype -set TDP36K_FIFO_SYNC_WR_X%d_RD_X%d_nonsplit t:TDP36K a:is_fifo=1 %%i a:sync_fifo=1 %%i "
+                                            "a:wr_data_width=%d %%i a:rd_data_width=%d %%i",
+                                            ww.second, rw.second, ww.first, rw.first);
+                        run(cmd2);
+                    }
+                }
+            }
         }
 
         if (check_label("map_ffram")) {
@@ -495,11 +554,7 @@
 
         if (check_label("blif")) {
             if (!blif_file.empty()) {
-                if (inferAdder) {
-                    run(stringf("write_blif -param %s", help_mode ? "<file-name>" : blif_file.c_str()));
-                } else {
-                    run(stringf("write_blif %s", help_mode ? "<file-name>" : blif_file.c_str()));
-                }
+                run(stringf("write_blif -param %s", help_mode ? "<file-name>" : blif_file.c_str()));
             }
         }
 
diff --git a/ql-qlf-plugin/tests/Makefile b/ql-qlf-plugin/tests/Makefile
index 661e92e..cd1c7e1 100644
--- a/ql-qlf-plugin/tests/Makefile
+++ b/ql-qlf-plugin/tests/Makefile
@@ -37,26 +37,39 @@
 #	qlf_k6n10_bram \
 
 SIM_TESTS = \
-    qlf_k6n10f/sim_dsp_mult_cfg_ports \
-    qlf_k6n10f/sim_dsp_mult_cfg_params \
-    qlf_k6n10f/sim_dsp_mult_r_cfg_ports \
-    qlf_k6n10f/sim_dsp_mult_r_cfg_params \
-    qlf_k6n10f/sim_dsp_fir_cfg_ports \
-    qlf_k6n10f/sim_dsp_fir_cfg_params \
-    qlf_k6n10f/sim_dsp_simd_cfg_ports \
-    qlf_k6n10f/sim_dsp_simd_cfg_params \
-    qlf_k6n10f/sim_tc36fifo
+     qlf_k6n10f/sim_dsp_mult_cfg_ports \
+     qlf_k6n10f/sim_dsp_mult_cfg_ports \
+     qlf_k6n10f/sim_dsp_mult_cfg_params \
+     qlf_k6n10f/sim_dsp_mult_r_cfg_ports \
+     qlf_k6n10f/sim_dsp_mult_r_cfg_params \
+     qlf_k6n10f/sim_dsp_fir_cfg_ports \
+     qlf_k6n10f/sim_dsp_fir_cfg_params \
+     qlf_k6n10f/sim_dsp_simd_cfg_ports \
+     qlf_k6n10f/sim_dsp_simd_cfg_params \
+     qlf_k6n10f/sim_tc36fifo
 
 # Those tests perform synthesis and simulation of synthesis results
 POST_SYNTH_SIM_TESTS = \
-    qlf_k6n10f/bram_tdp \
-    qlf_k6n10f/bram_sdp \
-    qlf_k6n10f/bram_tdp_split \
-    qlf_k6n10f/bram_sdp_split \
-    qlf_k6n10f/dsp_mult_post_synth_sim \
-    qlf_k6n10f/dsp_simd_post_synth_sim \
-    qlf_k6n10f/bram_asymmetric_wider_write \
-    qlf_k6n10f/bram_asymmetric_wider_read
+     qlf_k6n10f/asymmetric_bram36k_sfifo \
+     qlf_k6n10f/asymmetric_bram36k_afifo \
+     qlf_k6n10f/bram36k_sfifo \
+     qlf_k6n10f/bram36k_afifo \
+     qlf_k6n10f/bram18k_afifo \
+     qlf_k6n10f/bram18k_sfifo \
+     qlf_k6n10f/bram18k_tdp \
+     qlf_k6n10f/bram36k_tdp \
+     qlf_k6n10f/bram18k_sdp \
+     qlf_k6n10f/bram36k_sdp \
+     qlf_k6n10f/asymmetric_bram36k_sdp \
+     qlf_k6n10f/asymmetric_bram18k_sdp \
+     qlf_k6n10f/bram_tdp \
+     qlf_k6n10f/bram_sdp \
+     qlf_k6n10f/bram_tdp_split \
+     qlf_k6n10f/bram_sdp_split \
+     qlf_k6n10f/dsp_mult_post_synth_sim \
+     qlf_k6n10f/dsp_simd_post_synth_sim \
+     qlf_k6n10f/bram_asymmetric_wider_write \
+     qlf_k6n10f/bram_asymmetric_wider_read
 
 include $(shell pwd)/../../Makefile_test.common
 
diff --git a/ql-qlf-plugin/tests/qlf_k6n10f/asymmetric_bram18k_sdp/asymmetric_bram18k_sdp.tcl b/ql-qlf-plugin/tests/qlf_k6n10f/asymmetric_bram18k_sdp/asymmetric_bram18k_sdp.tcl
new file mode 100644
index 0000000..0579462
--- /dev/null
+++ b/ql-qlf-plugin/tests/qlf_k6n10f/asymmetric_bram18k_sdp/asymmetric_bram18k_sdp.tcl
@@ -0,0 +1,27 @@
+yosys -import
+
+if { [info procs ql-qlf-k6n10f] == {} } { plugin -i ql-qlf }
+yosys -import  ;
+
+read_verilog $::env(DESIGN_TOP).v
+design -save asymmetric_bram18k_sdp
+
+select spram_9x2048_18x1024
+select *
+synth_quicklogic -family qlf_k6n10f -top spram_9x2048_18x1024 -bram_types
+opt_expr -undriven
+opt_clean
+stat
+write_verilog sim/spram_9x2048_18x1024_post_synth.v
+select -assert-count 1 t:TDP36K_BRAM_WR_X9_RD_X18_split
+
+select -clear
+design -load asymmetric_bram18k_sdp
+select spram_18x1024_9x2048
+select *
+synth_quicklogic -family qlf_k6n10f -top spram_18x1024_9x2048 -bram_types
+opt_expr -undriven
+opt_clean
+stat
+write_verilog sim/spram_18x1024_9x2048_post_synth.v
+select -assert-count 1 t:TDP36K_BRAM_WR_X18_RD_X9_split
\ No newline at end of file
diff --git a/ql-qlf-plugin/tests/qlf_k6n10f/asymmetric_bram18k_sdp/asymmetric_bram18k_sdp.v b/ql-qlf-plugin/tests/qlf_k6n10f/asymmetric_bram18k_sdp/asymmetric_bram18k_sdp.v
new file mode 100644
index 0000000..10fb3b3
--- /dev/null
+++ b/ql-qlf-plugin/tests/qlf_k6n10f/asymmetric_bram18k_sdp/asymmetric_bram18k_sdp.v
@@ -0,0 +1,109 @@
+// Copyright 2020-2022 F4PGA Authors
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+// SPDX-License-Identifier: Apache-2.0
+
+module spram_9x2048_18x1024 (
+    WEN_i,
+    REN_i,
+    clock0,
+    clock1,
+    WR_ADDR_i,
+    RD_ADDR_i,
+    WDATA_i,
+    RDATA_o
+);
+
+parameter WR_ADDR_WIDTH = 11;
+parameter RD_ADDR_WIDTH = 10;
+parameter WR_DATA_WIDTH = 9;
+parameter RD_DATA_WIDTH = 18;
+parameter BE_WIDTH = 1;
+
+input wire WEN_i;
+input wire REN_i;
+input wire clock0;
+input wire clock1;
+input wire [WR_ADDR_WIDTH-1 :0] WR_ADDR_i;
+input wire [RD_ADDR_WIDTH-1 :0] RD_ADDR_i;
+input wire [WR_DATA_WIDTH-1 :0] WDATA_i;
+output wire [RD_DATA_WIDTH-1 :0] RDATA_o;
+
+RAM_18K_BLK #(
+              .WR_ADDR_WIDTH(WR_ADDR_WIDTH),
+              .RD_ADDR_WIDTH(RD_ADDR_WIDTH),
+              .WR_DATA_WIDTH(WR_DATA_WIDTH),
+              .RD_DATA_WIDTH(RD_DATA_WIDTH),
+              .BE_WIDTH(BE_WIDTH)
+              ) spram_x18_inst (
+              
+              .WEN_i(WEN_i),
+              .WR_BE_i(1'b1),
+              .REN_i(REN_i),              
+              .WR_CLK_i(clock0),
+              .RD_CLK_i(clock1),
+              .WR_ADDR_i(WR_ADDR_i),
+              .RD_ADDR_i(RD_ADDR_i),
+              .WDATA_i(WDATA_i),
+              .RDATA_o(RDATA_o)
+              );
+              
+endmodule    
+
+module spram_18x1024_9x2048 (
+    WEN_i,
+    REN_i,
+    clock0,
+    clock1,
+    WR_ADDR_i,
+    RD_ADDR_i,
+    WDATA_i,
+    RDATA_o
+);
+
+parameter WR_ADDR_WIDTH = 10;
+parameter RD_ADDR_WIDTH = 11;
+parameter WR_DATA_WIDTH = 18;
+parameter RD_DATA_WIDTH = 9;
+parameter BE_WIDTH = 2;
+
+input wire WEN_i;
+input wire REN_i;
+input wire clock0;
+input wire clock1;
+input wire [WR_ADDR_WIDTH-1 :0] WR_ADDR_i;
+input wire [RD_ADDR_WIDTH-1 :0] RD_ADDR_i;
+input wire [WR_DATA_WIDTH-1 :0] WDATA_i;
+output wire [RD_DATA_WIDTH-1 :0] RDATA_o;
+
+RAM_18K_BLK #(
+              .WR_ADDR_WIDTH(WR_ADDR_WIDTH),
+              .RD_ADDR_WIDTH(RD_ADDR_WIDTH),
+              .WR_DATA_WIDTH(WR_DATA_WIDTH),
+              .RD_DATA_WIDTH(RD_DATA_WIDTH),
+              .BE_WIDTH(BE_WIDTH)
+              ) spram_x18_inst (
+              
+              .WEN_i(WEN_i),
+              .WR_BE_i(2'b11),
+              .REN_i(REN_i),              
+              .WR_CLK_i(clock0),
+              .RD_CLK_i(clock1),
+              .WR_ADDR_i(WR_ADDR_i),
+              .RD_ADDR_i(RD_ADDR_i),
+              .WDATA_i(WDATA_i),
+              .RDATA_o(RDATA_o)
+              );
+              
+endmodule    
\ No newline at end of file
diff --git a/ql-qlf-plugin/tests/qlf_k6n10f/asymmetric_bram18k_sdp/sim/Makefile b/ql-qlf-plugin/tests/qlf_k6n10f/asymmetric_bram18k_sdp/sim/Makefile
new file mode 100644
index 0000000..0cce75d
--- /dev/null
+++ b/ql-qlf-plugin/tests/qlf_k6n10f/asymmetric_bram18k_sdp/sim/Makefile
@@ -0,0 +1,46 @@
+# Copyright 2020-2022 F4PGA Authors
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+# SPDX-License-Identifier: Apache-2.0
+
+TESTBENCH = asymmetric_bram18k_sdp_tb.v
+POST_SYNTH = spram_9x2048_18x1024_post_synth spram_18x1024_9x2048_post_synth
+ADDR_WIDTH0 = 11 10
+DATA_WIDTH0 = 9 18
+ADDR_WIDTH1 = 10 11
+DATA_WIDTH1 = 18 9
+TOP = spram_9x2048_18x1024 spram_18x1024_9x2048
+ADDR0_DEFINES = $(foreach awidth0, $(ADDR_WIDTH0),-DADDR_WIDTH0="$(awidth0)")
+ADDR1_DEFINES = $(foreach awidth1, $(ADDR_WIDTH1),-DADDR_WIDTH1="$(awidth1)")
+DATA0_DEFINES = $(foreach dwidth0, $(DATA_WIDTH0),-DDATA_WIDTH0="$(dwidth0)")
+DATA1_DEFINES = $(foreach dwidth1, $(DATA_WIDTH1),-DDATA_WIDTH1="$(dwidth1)")
+TOP_DEFINES = $(foreach top, $(TOP),-DTOP="$(top)")
+VCD_DEFINES = $(foreach vcd, $(POST_SYNTH),-DVCD="$(vcd).vcd")
+
+SIM_LIBS = $(shell find ../../../../qlf_k6n10f -name "*.v" -not -name "*_map.v")
+
+define simulate_post_synth
+	@iverilog  -vvvv -g2005 $(word $(1),$(ADDR0_DEFINES)) $(word $(1),$(ADDR1_DEFINES)) $(word $(1),$(DATA0_DEFINES)) $(word $(1),$(DATA1_DEFINES)) $(word $(1),$(TOP_DEFINES)) $(word $(1),$(VCD_DEFINES)) -o $(word $(1),$(POST_SYNTH)).vvp $(word $(1),$(POST_SYNTH)).v $(SIM_LIBS) $(TESTBENCH) > $(word $(1),$(POST_SYNTH)).vvp.log 2>&1
+	@vvp -vvvv $(word $(1),$(POST_SYNTH)).vvp > $(word $(1),$(POST_SYNTH)).vcd.log 2>&1
+endef
+
+define clean_post_synth_sim
+	@rm -rf  $(word $(1),$(POST_SYNTH)).vcd $(word $(1),$(POST_SYNTH)).vvp $(word $(1),$(POST_SYNTH)).vvp.log $(word $(1),$(POST_SYNTH)).vcd.log
+endef
+
+sim:
+	$(call simulate_post_synth,1)
+	$(call clean_post_synth_sim,1)
+	$(call simulate_post_synth,2)
+	$(call clean_post_synth_sim,2)
\ No newline at end of file
diff --git a/ql-qlf-plugin/tests/qlf_k6n10f/asymmetric_bram18k_sdp/sim/asymmetric_bram18k_sdp_tb.v b/ql-qlf-plugin/tests/qlf_k6n10f/asymmetric_bram18k_sdp/sim/asymmetric_bram18k_sdp_tb.v
new file mode 100644
index 0000000..e8ffaa5
--- /dev/null
+++ b/ql-qlf-plugin/tests/qlf_k6n10f/asymmetric_bram18k_sdp/sim/asymmetric_bram18k_sdp_tb.v
@@ -0,0 +1,177 @@
+// Copyright 2020-2022 F4PGA Authors
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//		 http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+// SPDX-License-Identifier: Apache-2.0
+
+`timescale 1ns/1ps
+
+`define STRINGIFY(x) `"x`"
+
+module TB;
+	localparam PERIOD = 50;
+	localparam ADDR_INCR = 1;
+
+	reg clk_0;
+	reg clk_1;
+	reg rce;
+	reg [`ADDR_WIDTH1-1:0] ra;
+	wire [`DATA_WIDTH1-1:0] rq;
+	reg wce;
+	reg [`ADDR_WIDTH0-1:0] wa;
+	reg [`DATA_WIDTH0-1:0] wd;
+
+	initial clk_0 = 0;
+	initial clk_1 = 0;
+	initial ra = 0;
+	initial wa = 0;
+	initial wd = 0;
+	initial rce = 0;
+	initial wce = 0;
+	initial forever #(PERIOD / 2.0) clk_0 = ~clk_0;
+	initial begin
+		#(PERIOD / 4.0);
+		forever #(PERIOD / 2.0) clk_1 = ~clk_1;
+	end
+	initial begin
+		$dumpfile(`STRINGIFY(`VCD));
+		$dumpvars;
+	end
+
+	integer a;
+	integer b;
+
+	reg done_0;
+	initial done_0 = 1'b0;
+	wire done_sim = done_0;
+
+	reg [`DATA_WIDTH1-1:0] expected_0;
+
+	reg read_test_0;
+	initial read_test_0 = 0;
+
+
+	wire error_0 = (read_test_0) ? (rq !== expected_0) : 0;
+
+	integer error_0_cnt = 0;
+
+	always @ (posedge clk_1)
+	begin
+		if (error_0)
+			error_0_cnt <= error_0_cnt + 1'b1;
+	end
+
+	case (`STRINGIFY(`TOP))
+	"spram_9x2048_18x1024": begin
+		initial #(1) begin
+			// Write data
+			for (a = 0; a < (1<<`ADDR_WIDTH0) ; a = a + ADDR_INCR) begin
+				@(negedge clk_0) begin
+					wa = a[`ADDR_WIDTH0-1:0];
+					wd = a[9:1];
+					wce = 1;
+				end
+				@(posedge clk_0) begin
+					#(PERIOD/10) wce = 0;
+				end
+			end
+			// Read data
+			read_test_0 = 1;
+			for (a = 0; a < (1<<`ADDR_WIDTH1); a = a + ADDR_INCR) begin
+				@(negedge clk_1) begin
+					ra = a;
+					rce = 1;
+				end
+				@(posedge clk_1) begin
+					expected_0 <= {a[8],a[8],a[7:0],a[7:0]};				
+					#(PERIOD/10) rce = 0;
+					if ( rq !== expected_0) begin
+						$display("%d: PORT 0: FAIL: mismatch act=%x exp=%x at %x", $time, rq, expected_0, a);
+					end else begin
+						$display("%d: PORT 0: OK: act=%x exp=%x at %x", $time, rq, expected_0, a);
+					end
+				end
+			end
+			done_0 = 1'b1;
+			a = 0;		
+		end
+	end
+	"spram_18x1024_9x2048": begin
+		initial #(1) begin
+			// Write data
+			for (a = 0; a < (1<<`ADDR_WIDTH0) ; a = a + ADDR_INCR) begin
+				@(negedge clk_0) begin
+					wa = a[`ADDR_WIDTH0-1:0];
+					wd = {a[8],a[8],a[7:0],a[7:0]};
+					wce = 1;
+				end
+				@(posedge clk_0) begin
+					#(PERIOD/10) wce = 0;
+				end
+			end
+			// Read data
+			read_test_0 = 1;
+			for (a = 0; a < (1<<`ADDR_WIDTH1); a = a + ADDR_INCR) begin
+				@(negedge clk_1) begin
+					ra = a;
+					rce = 1;
+				end
+				@(posedge clk_1) begin				
+					expected_0 <= {a[9:1]};
+					#(PERIOD/10) rce = 0;
+					if ( rq !== expected_0) begin
+						$display("%d: PORT 0: FAIL: mismatch act=%x exp=%x at %x", $time, rq, expected_0, a);
+					end else begin
+						$display("%d: PORT 0: OK: act=%x exp=%x at %x", $time, rq, expected_0, a);
+					end
+				end
+			end
+			done_0 = 1'b1;
+			a = 0;		
+		end
+	end	 
+	endcase
+
+	// Scan for simulation finish
+	always @(posedge clk_1) begin
+		if (done_sim)
+			$finish_and_return( (error_0_cnt == 0) ? 0 : -1 );
+	end
+
+	case (`STRINGIFY(`TOP))
+		"spram_9x2048_18x1024": begin
+			spram_9x2048_18x1024 #() bram (
+				.clock0(clk_0),
+				.clock1(clk_1),			
+				.REN_i(rce),
+				.RD_ADDR_i(ra),
+				.RDATA_o(rq),
+				.WEN_i(wce),
+				.WR_ADDR_i(wa),
+				.WDATA_i(wd)
+			);
+		end
+		"spram_18x1024_9x2048": begin
+			spram_18x1024_9x2048 #() bram (
+				.clock0(clk_0),
+				.clock1(clk_1),			
+				.REN_i(rce),
+				.RD_ADDR_i(ra),
+				.RDATA_o(rq),
+				.WEN_i(wce),
+				.WR_ADDR_i(wa),
+				.WDATA_i(wd)
+			);
+		end
+	endcase
+endmodule
diff --git a/ql-qlf-plugin/tests/qlf_k6n10f/asymmetric_bram36k_afifo/asymmetric_bram36k_afifo.tcl b/ql-qlf-plugin/tests/qlf_k6n10f/asymmetric_bram36k_afifo/asymmetric_bram36k_afifo.tcl
new file mode 100644
index 0000000..66e2686
--- /dev/null
+++ b/ql-qlf-plugin/tests/qlf_k6n10f/asymmetric_bram36k_afifo/asymmetric_bram36k_afifo.tcl
@@ -0,0 +1,49 @@
+yosys -import
+
+if { [info procs ql-qlf-k6n10f] == {} } { plugin -i ql-qlf }
+yosys -import  ;
+
+read_verilog $::env(DESIGN_TOP).v
+design -save asymmetric_bram36k_afifo
+
+select af4096x9_1024x36
+select *
+synth_quicklogic -family qlf_k6n10f -top af4096x9_1024x36 -bram_types
+opt_expr -undriven
+opt_clean
+stat
+write_verilog sim/af4096x9_1024x36_post_synth.v
+select -assert-count 1 t:TDP36K_FIFO_ASYNC_WR_X9_RD_X36_nonsplit
+
+select -clear
+design -load asymmetric_bram36k_afifo
+select af2048x18_1024x36
+select *
+synth_quicklogic -family qlf_k6n10f -top af2048x18_1024x36 -bram_types
+opt_expr -undriven
+opt_clean
+stat
+write_verilog sim/af2048x18_1024x36_post_synth.v
+select -assert-count 1 t:TDP36K_FIFO_ASYNC_WR_X18_RD_X36_nonsplit
+
+select -clear
+design -load asymmetric_bram36k_afifo
+select af2048x18_4098x9
+select *
+synth_quicklogic -family qlf_k6n10f -top af2048x18_4098x9 -bram_types
+opt_expr -undriven
+opt_clean
+stat
+write_verilog sim/af2048x18_4098x9_post_synth.v
+select -assert-count 1 t:TDP36K_FIFO_ASYNC_WR_X18_RD_X9_nonsplit
+
+select -clear
+design -load asymmetric_bram36k_afifo
+select af1024x36_4098x9
+select *
+synth_quicklogic -family qlf_k6n10f -top af1024x36_4098x9 -bram_types
+opt_expr -undriven
+opt_clean
+stat
+write_verilog sim/af1024x36_4098x9_post_synth.v
+select -assert-count 1 t:TDP36K_FIFO_ASYNC_WR_X36_RD_X9_nonsplit
\ No newline at end of file
diff --git a/ql-qlf-plugin/tests/qlf_k6n10f/asymmetric_bram36k_afifo/asymmetric_bram36k_afifo.v b/ql-qlf-plugin/tests/qlf_k6n10f/asymmetric_bram36k_afifo/asymmetric_bram36k_afifo.v
new file mode 100644
index 0000000..6cef5f5
--- /dev/null
+++ b/ql-qlf-plugin/tests/qlf_k6n10f/asymmetric_bram36k_afifo/asymmetric_bram36k_afifo.v
@@ -0,0 +1,180 @@
+// Copyright 2020-2022 F4PGA Authors
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+// SPDX-License-Identifier: Apache-2.0
+
+module af4096x9_1024x36 (DIN,PUSH,POP,clock0,clock1,Async_Flush,Almost_Full,Almost_Empty,Full,Empty,Full_Watermark,Empty_Watermark,Overrun_Error,Underrun_Error,DOUT);
+
+parameter WR_DATA_WIDTH = 9;
+parameter RD_DATA_WIDTH = 36;
+parameter UPAE_DBITS = 12'd10;
+parameter UPAF_DBITS = 12'd10;
+
+input clock0,clock1;
+input PUSH,POP;
+input [WR_DATA_WIDTH-1:0] DIN;
+input Async_Flush;
+output [RD_DATA_WIDTH-1:0] DOUT;
+output Almost_Full,Almost_Empty;
+output Full, Empty;
+output Full_Watermark, Empty_Watermark;
+output Overrun_Error, Underrun_Error;
+
+
+AFIFO_36K_BLK  # (.WR_DATA_WIDTH(WR_DATA_WIDTH),.RD_DATA_WIDTH(RD_DATA_WIDTH),.UPAE_DBITS(UPAE_DBITS),.UPAF_DBITS(UPAF_DBITS)
+                 )
+  FIFO_INST    (
+                .DIN(DIN),
+                .PUSH(PUSH),
+                .POP(POP),
+                .Push_Clk(clock0),
+                .Pop_Clk(clock1),
+                .Async_Flush(Async_Flush),
+                
+                .Overrun_Error(Overrun_Error),
+                .Full_Watermark(Full_Watermark),
+                .Almost_Full(Almost_Full),
+                .Full(Full),
+                
+                .Underrun_Error(Underrun_Error),
+                .Empty_Watermark(Empty_Watermark),
+                .Almost_Empty(Almost_Empty),
+                .Empty(Empty),
+
+                .DOUT(DOUT)
+                );
+endmodule
+
+module af2048x18_1024x36 (DIN,PUSH,POP,clock0,clock1,Async_Flush,Almost_Full,Almost_Empty,Full,Empty,Full_Watermark,Empty_Watermark,Overrun_Error,Underrun_Error,DOUT);
+
+parameter WR_DATA_WIDTH = 18;
+parameter RD_DATA_WIDTH = 36;
+parameter UPAE_DBITS = 12'd10;
+parameter UPAF_DBITS = 12'd10;
+
+input clock0,clock1;
+input PUSH,POP;
+input [WR_DATA_WIDTH-1:0] DIN;
+input Async_Flush;
+output [RD_DATA_WIDTH-1:0] DOUT;
+output Almost_Full,Almost_Empty;
+output Full, Empty;
+output Full_Watermark, Empty_Watermark;
+output Overrun_Error, Underrun_Error;
+
+AFIFO_36K_BLK  # (.WR_DATA_WIDTH(WR_DATA_WIDTH),.RD_DATA_WIDTH(RD_DATA_WIDTH),.UPAE_DBITS(UPAE_DBITS),.UPAF_DBITS(UPAF_DBITS)
+                  )
+  FIFO_INST    (
+                .DIN(DIN),
+                .PUSH(PUSH),
+                .POP(POP),
+                .Push_Clk(clock0),
+                .Pop_Clk(clock1),
+                .Async_Flush(Async_Flush),
+                
+                .Overrun_Error(Overrun_Error),
+                .Full_Watermark(Full_Watermark),
+                .Almost_Full(Almost_Full),
+                .Full(Full),
+                
+                .Underrun_Error(Underrun_Error),
+                .Empty_Watermark(Empty_Watermark),
+                .Almost_Empty(Almost_Empty),
+                .Empty(Empty),
+
+                .DOUT(DOUT)
+                );
+endmodule
+
+module af2048x18_4098x9 (DIN,PUSH,POP,clock0,clock1,Async_Flush,Almost_Full,Almost_Empty,Full,Empty,Full_Watermark,Empty_Watermark,Overrun_Error,Underrun_Error,DOUT);
+
+parameter WR_DATA_WIDTH = 18;
+parameter RD_DATA_WIDTH = 9;
+parameter UPAE_DBITS = 12'd10;
+parameter UPAF_DBITS = 12'd10;
+
+input clock0,clock1;
+input PUSH,POP;
+input [WR_DATA_WIDTH-1:0] DIN;
+input Async_Flush;
+output [RD_DATA_WIDTH-1:0] DOUT;
+output Almost_Full,Almost_Empty;
+output Full, Empty;
+output Full_Watermark, Empty_Watermark;
+output Overrun_Error, Underrun_Error;
+
+AFIFO_36K_BLK  # (.WR_DATA_WIDTH(WR_DATA_WIDTH),.RD_DATA_WIDTH(RD_DATA_WIDTH),.UPAE_DBITS(UPAE_DBITS),.UPAF_DBITS(UPAF_DBITS)
+                  )
+  FIFO_INST    (
+                .DIN(DIN),
+                .PUSH(PUSH),
+                .POP(POP),
+                .Push_Clk(clock0),
+                .Pop_Clk(clock1),
+                .Async_Flush(Async_Flush),
+                
+                .Overrun_Error(Overrun_Error),
+                .Full_Watermark(Full_Watermark),
+                .Almost_Full(Almost_Full),
+                .Full(Full),
+                
+                .Underrun_Error(Underrun_Error),
+                .Empty_Watermark(Empty_Watermark),
+                .Almost_Empty(Almost_Empty),
+                .Empty(Empty),
+
+                .DOUT(DOUT)
+                );
+endmodule
+
+module af1024x36_4098x9 (DIN,PUSH,POP,clock0,clock1,Async_Flush,Almost_Full,Almost_Empty,Full,Empty,Full_Watermark,Empty_Watermark,Overrun_Error,Underrun_Error,DOUT);
+
+parameter WR_DATA_WIDTH = 36;
+parameter RD_DATA_WIDTH = 9;
+parameter UPAE_DBITS = 12'd10;
+parameter UPAF_DBITS = 12'd10;
+
+input clock0,clock1;
+input PUSH,POP;
+input [WR_DATA_WIDTH-1:0] DIN;
+input Async_Flush;
+output [RD_DATA_WIDTH-1:0] DOUT;
+output Almost_Full,Almost_Empty;
+output Full, Empty;
+output Full_Watermark, Empty_Watermark;
+output Overrun_Error, Underrun_Error;
+
+AFIFO_36K_BLK  # (.WR_DATA_WIDTH(WR_DATA_WIDTH),.RD_DATA_WIDTH(RD_DATA_WIDTH),.UPAE_DBITS(UPAE_DBITS),.UPAF_DBITS(UPAF_DBITS)
+                  )
+  FIFO_INST    (
+                .DIN(DIN),
+                .PUSH(PUSH),
+                .POP(POP),
+                .Push_Clk(clock0),
+                .Pop_Clk(clock1),
+                .Async_Flush(Async_Flush),
+                
+                .Overrun_Error(Overrun_Error),
+                .Full_Watermark(Full_Watermark),
+                .Almost_Full(Almost_Full),
+                .Full(Full),
+                
+                .Underrun_Error(Underrun_Error),
+                .Empty_Watermark(Empty_Watermark),
+                .Almost_Empty(Almost_Empty),
+                .Empty(Empty),
+
+                .DOUT(DOUT)
+                );
+endmodule
\ No newline at end of file
diff --git a/ql-qlf-plugin/tests/qlf_k6n10f/asymmetric_bram36k_afifo/sim/Makefile b/ql-qlf-plugin/tests/qlf_k6n10f/asymmetric_bram36k_afifo/sim/Makefile
new file mode 100644
index 0000000..76bc1c7
--- /dev/null
+++ b/ql-qlf-plugin/tests/qlf_k6n10f/asymmetric_bram36k_afifo/sim/Makefile
@@ -0,0 +1,50 @@
+# Copyright 2020-2022 F4PGA Authors
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+# SPDX-License-Identifier: Apache-2.0
+
+TESTBENCH = asymmetric_bram36k_afifo_tb.v
+POST_SYNTH = af4096x9_1024x36_post_synth af2048x18_1024x36_post_synth af2048x18_4098x9_post_synth af1024x36_4098x9_post_synth
+ADDR_WIDTH0 = 12 11 11 10
+DATA_WIDTH0 = 9 18 18 36
+ADDR_WIDTH1 = 10 10 12 12
+DATA_WIDTH1 = 36 36 9 9
+TOP = af4096x9_1024x36 af2048x18_1024x36 af2048x18_4098x9 af1024x36_4098x9
+ADDR0_DEFINES = $(foreach awidth0, $(ADDR_WIDTH0),-DADDR_WIDTH0="$(awidth0)")
+ADDR1_DEFINES = $(foreach awidth1, $(ADDR_WIDTH1),-DADDR_WIDTH1="$(awidth1)")
+DATA0_DEFINES = $(foreach dwidth0, $(DATA_WIDTH0),-DDATA_WIDTH0="$(dwidth0)")
+DATA1_DEFINES = $(foreach dwidth1, $(DATA_WIDTH1),-DDATA_WIDTH1="$(dwidth1)")
+TOP_DEFINES = $(foreach top, $(TOP),-DTOP="$(top)")
+VCD_DEFINES = $(foreach vcd, $(POST_SYNTH),-DVCD="$(vcd).vcd")
+
+SIM_LIBS = $(shell find ../../../../qlf_k6n10f -name "*.v" -not -name "*_map.v")
+
+define simulate_post_synth
+	@iverilog  -vvvv -g2005 $(word $(1),$(ADDR0_DEFINES)) $(word $(1),$(ADDR1_DEFINES)) $(word $(1),$(DATA0_DEFINES)) $(word $(1),$(DATA1_DEFINES)) $(word $(1),$(TOP_DEFINES)) $(word $(1),$(VCD_DEFINES)) -o $(word $(1),$(POST_SYNTH)).vvp $(word $(1),$(POST_SYNTH)).v $(SIM_LIBS) $(TESTBENCH) > $(word $(1),$(POST_SYNTH)).vvp.log 2>&1
+	@vvp -vvvv $(word $(1),$(POST_SYNTH)).vvp > $(word $(1),$(POST_SYNTH)).vcd.log 2>&1
+endef
+
+define clean_post_synth_sim
+	@rm -rf  $(word $(1),$(POST_SYNTH)).vcd $(word $(1),$(POST_SYNTH)).vvp $(word $(1),$(POST_SYNTH)).vvp.log $(word $(1),$(POST_SYNTH)).vcd.log
+endef
+
+sim:
+	$(call simulate_post_synth,1)
+	$(call clean_post_synth_sim,1)
+	$(call simulate_post_synth,2)
+	$(call clean_post_synth_sim,2)
+	$(call simulate_post_synth,3)
+	$(call clean_post_synth_sim,3)
+	$(call simulate_post_synth,4)
+	$(call clean_post_synth_sim,4)
\ No newline at end of file
diff --git a/ql-qlf-plugin/tests/qlf_k6n10f/asymmetric_bram36k_afifo/sim/asymmetric_bram36k_afifo_tb.v b/ql-qlf-plugin/tests/qlf_k6n10f/asymmetric_bram36k_afifo/sim/asymmetric_bram36k_afifo_tb.v
new file mode 100644
index 0000000..dd40a5a
--- /dev/null
+++ b/ql-qlf-plugin/tests/qlf_k6n10f/asymmetric_bram36k_afifo/sim/asymmetric_bram36k_afifo_tb.v
@@ -0,0 +1,292 @@
+// Copyright 2020-2022 F4PGA Authors
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//	http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+// SPDX-License-Identifier: Apache-2.0
+
+`timescale 1ns/1ps
+
+`define STRINGIFY(x) `"x`"
+
+module TB;
+	localparam PERIOD = 30;
+	localparam ADDR_INCR = 1;
+
+	reg clk0;
+	reg clk1;
+	reg flush;
+	reg pop;
+	wire [`DATA_WIDTH1-1:0] dout;
+	reg push;
+	reg [`DATA_WIDTH0-1:0] din;	 
+	wire almost_full,almost_empty;
+	wire full, empty;
+	wire full_watermark, empty_watermark;
+	wire overrun_error, underrun_error;
+
+	initial 
+	begin
+		clk0 = 0;
+		clk1 = 0;
+		pop = 0;
+		push = 0;
+		flush = 1;
+		din = 0;
+		#40
+		flush = 0;
+	end
+	
+	initial forever #(PERIOD / 3.0) clk0 = ~clk0;
+	initial forever #(PERIOD / 2.0) clk1 = ~clk1;
+	
+	initial begin
+		$dumpfile(`STRINGIFY(`VCD));
+		$dumpvars;
+	end
+
+	integer a;
+
+	reg done;
+	initial done = 1'b0;
+	
+	reg read_test;
+	initial read_test = 0;
+
+	reg [`DATA_WIDTH1-1:0] expected;
+	initial expected = 0;
+
+	wire error = (read_test) ? dout !== expected : 0;
+
+	integer error_cnt = 0;
+	always @ (posedge clk1)
+	begin
+		if (error)
+			error_cnt <= error_cnt + 1'b1; 
+	end
+
+	case (`STRINGIFY(`TOP))
+	"af4096x9_1024x36": begin
+		initial #(50) begin
+			// Write data
+			for (a = 0; a < (1<<`ADDR_WIDTH0) ; a = a + ADDR_INCR) begin
+				@(negedge clk0) begin
+					din = a[10:2];
+					push = 1;
+				end
+				@(posedge clk0) begin
+					#(PERIOD/10) push = 0;
+				end
+			end
+			// Read data
+			read_test = 1;
+			for (a = 0; a < (1<<`ADDR_WIDTH1); a = a + ADDR_INCR) begin
+				@(posedge clk1) begin
+					expected <= {a[8],a[8],a[7:0],a[7:0],a[8],a[8],a[7:0],a[7:0]};
+					#(PERIOD/10) pop = 0;
+					if ( dout !== expected) begin
+						$display("%d: PORT 0: FAIL: mismatch act=%x exp=%x at %x", $time, dout, expected, a);
+					end else begin
+						$display("%d: PORT 0: OK: act=%x exp=%x at %x", $time, dout, expected, a);
+					end
+				end
+				@(negedge clk1) begin
+					pop = 1;
+				end
+			end
+			done = 1'b1;
+			a = 0;
+		end
+	end
+	"af2048x18_1024x36": begin
+		initial #(50) begin
+			// Write data
+			for (a = 0; a < (1<<`ADDR_WIDTH0) ; a = a + ADDR_INCR) begin
+				@(negedge clk0) begin
+					din = a[18:1];
+					push = 1;
+				end
+				@(posedge clk0) begin
+					#(PERIOD/10) push = 0;
+				end
+			end
+			// Read data
+			read_test = 1;
+			for (a = 0; a < (1<<`ADDR_WIDTH1); a = a + ADDR_INCR) begin
+				@(posedge clk1) begin
+					expected <= {a[17:0],a[17:0]};
+					#(PERIOD/10) pop = 0;
+					if ( dout !== expected) begin
+						$display("%d: PORT 0: FAIL: mismatch act=%x exp=%x at %x", $time, dout, expected, a);
+					end else begin
+						$display("%d: PORT 0: OK: act=%x exp=%x at %x", $time, dout, expected, a);
+					end
+				end
+				@(negedge clk1) begin
+					pop = 1;
+				end
+			end
+			done = 1'b1;
+			a = 0;
+		end
+	end	 
+	"af2048x18_4098x9": begin
+		initial #(50) begin
+			// Write data
+			for (a = 0; a < (1<<`ADDR_WIDTH0) ; a = a + ADDR_INCR) begin
+				@(negedge clk0) begin
+					din = {a[8],a[8],a[7:0],a[7:0]};
+					push = 1;
+				end
+				@(posedge clk0) begin
+					#(PERIOD/10) push = 0;
+				end
+			end
+			// Read data
+			read_test = 1;
+			for (a = 0; a < (1<<`ADDR_WIDTH1); a = a + ADDR_INCR) begin
+				@(posedge clk1) begin
+					expected <= {a[9:1]};
+					#(PERIOD/10) pop = 0;
+					if ( dout !== expected) begin
+						$display("%d: PORT 0: FAIL: mismatch act=%x exp=%x at %x", $time, dout, expected, a);
+					end else begin
+						$display("%d: PORT 0: OK: act=%x exp=%x at %x", $time, dout, expected, a);
+					end
+				end
+				@(negedge clk1) begin
+					pop = 1;
+				end
+			end
+			done = 1'b1;
+			a = 0;
+		end
+	end
+	"af1024x36_4098x9": begin
+		initial #(50) begin
+			// Write data
+			for (a = 0; a < (1<<`ADDR_WIDTH0) ; a = a + ADDR_INCR) begin
+				@(negedge clk0) begin
+					din = {a[8],a[8],a[7:0],a[7:0],a[8],a[8],a[7:0],a[7:0]};
+					push = 1;
+				end
+				@(posedge clk0) begin
+					#(PERIOD/10) push = 0;
+				end
+			end
+			// Read data
+			read_test = 1;
+			for (a = 0; a < (1<<`ADDR_WIDTH1); a = a + ADDR_INCR) begin
+				@(posedge clk1) begin
+					expected <= {a[10:2]};
+					#(PERIOD/10) pop = 0;
+					if ( dout !== expected) begin
+						$display("%d: PORT 0: FAIL: mismatch act=%x exp=%x at %x", $time, dout, expected, a);
+					end else begin
+						$display("%d: PORT 0: OK: act=%x exp=%x at %x", $time, dout, expected, a);
+					end
+				end
+				@(negedge clk1) begin
+					pop = 1;
+				end
+			end
+			done = 1'b1;
+			a = 0;
+		end
+	end
+	endcase
+
+	// Scan for simulation finish
+	always @(posedge clk1) begin
+		if (done)
+			$finish_and_return( (error_cnt == 0) ? 0 : -1 );
+	end
+
+	case (`STRINGIFY(`TOP))
+		"af4096x9_1024x36": begin
+			af4096x9_1024x36 #() afifo (
+				.DIN(din),
+				.PUSH(push),
+				.POP(pop),
+				.clock0(clk0),
+				.clock1(clk1),
+				.Async_Flush(flush),
+				.Almost_Full(almost_full),
+				.Almost_Empty(almost_empty),
+				.Full(full),
+				.Empty(empty),
+				.Full_Watermark(full_watermark),
+				.Empty_Watermark(empty_watermark),
+				.Overrun_Error(overrun_error),
+				.Underrun_Error(underrun_error),
+				.DOUT(dout)
+			);
+		end
+		"af2048x18_1024x36": begin
+			af2048x18_1024x36 #() afifo (
+				.DIN(din),
+				.PUSH(push),
+				.POP(pop),
+				.clock0(clk0),
+				.clock1(clk1),
+				.Async_Flush(flush),
+				.Almost_Full(almost_full),
+				.Almost_Empty(almost_empty),
+				.Full(full),
+				.Empty(empty),
+				.Full_Watermark(full_watermark),
+				.Empty_Watermark(empty_watermark),
+				.Overrun_Error(overrun_error),
+				.Underrun_Error(underrun_error),
+				.DOUT(dout)
+			);
+		end
+		"af2048x18_4098x9": begin
+			af2048x18_4098x9 #() afifo (
+				.DIN(din),
+				.PUSH(push),
+				.POP(pop),
+				.clock0(clk0),
+				.clock1(clk1),
+				.Async_Flush(flush),
+				.Almost_Full(almost_full),
+				.Almost_Empty(almost_empty),
+				.Full(full),
+				.Empty(empty),
+				.Full_Watermark(full_watermark),
+				.Empty_Watermark(empty_watermark),
+				.Overrun_Error(overrun_error),
+				.Underrun_Error(underrun_error),
+				.DOUT(dout)
+			);
+		end
+		"af1024x36_4098x9": begin
+			af1024x36_4098x9 #() afifo (
+				.DIN(din),
+				.PUSH(push),
+				.POP(pop),
+				.clock0(clk0),
+				.clock1(clk1),
+				.Async_Flush(flush),
+				.Almost_Full(almost_full),
+				.Almost_Empty(almost_empty),
+				.Full(full),
+				.Empty(empty),
+				.Full_Watermark(full_watermark),
+				.Empty_Watermark(empty_watermark),
+				.Overrun_Error(overrun_error),
+				.Underrun_Error(underrun_error),
+				.DOUT(dout)
+			);
+		end
+	endcase
+endmodule
diff --git a/ql-qlf-plugin/tests/qlf_k6n10f/asymmetric_bram36k_sdp/asymmetric_bram36k_sdp.tcl b/ql-qlf-plugin/tests/qlf_k6n10f/asymmetric_bram36k_sdp/asymmetric_bram36k_sdp.tcl
new file mode 100644
index 0000000..827914a
--- /dev/null
+++ b/ql-qlf-plugin/tests/qlf_k6n10f/asymmetric_bram36k_sdp/asymmetric_bram36k_sdp.tcl
@@ -0,0 +1,49 @@
+yosys -import
+
+if { [info procs ql-qlf-k6n10f] == {} } { plugin -i ql-qlf }
+yosys -import  ;
+
+read_verilog $::env(DESIGN_TOP).v
+design -save asymmetric_bram36k_sdp
+
+select spram_9x4096_36x1024
+select *
+synth_quicklogic -family qlf_k6n10f -top spram_9x4096_36x1024 -bram_types
+opt_expr -undriven
+opt_clean
+stat
+write_verilog sim/spram_9x4096_36x1024_post_synth.v
+select -assert-count 1 t:TDP36K_BRAM_WR_X9_RD_X36_nonsplit
+
+select -clear
+design -load asymmetric_bram36k_sdp
+select spram_18x2048_36x1024
+select *
+synth_quicklogic -family qlf_k6n10f -top spram_18x2048_36x1024 -bram_types
+opt_expr -undriven
+opt_clean
+stat
+write_verilog sim/spram_18x2048_36x1024_post_synth.v
+select -assert-count 1 t:TDP36K_BRAM_WR_X18_RD_X36_nonsplit
+
+select -clear
+design -load asymmetric_bram36k_sdp
+select spram_18x2048_9x4096
+select *
+synth_quicklogic -family qlf_k6n10f -top spram_18x2048_9x4096 -bram_types
+opt_expr -undriven
+opt_clean
+stat
+write_verilog sim/spram_18x2048_9x4096_post_synth.v
+select -assert-count 1 t:TDP36K_BRAM_WR_X18_RD_X9_nonsplit
+
+select -clear
+design -load asymmetric_bram36k_sdp
+select spram_36x1024_18x2048
+select *
+synth_quicklogic -family qlf_k6n10f -top spram_36x1024_18x2048 -bram_types
+opt_expr -undriven
+opt_clean
+stat
+write_verilog sim/spram_36x1024_18x2048_post_synth.v
+select -assert-count 1 t:TDP36K_BRAM_WR_X36_RD_X18_nonsplit
\ No newline at end of file
diff --git a/ql-qlf-plugin/tests/qlf_k6n10f/asymmetric_bram36k_sdp/asymmetric_bram36k_sdp.v b/ql-qlf-plugin/tests/qlf_k6n10f/asymmetric_bram36k_sdp/asymmetric_bram36k_sdp.v
new file mode 100644
index 0000000..1a274f5
--- /dev/null
+++ b/ql-qlf-plugin/tests/qlf_k6n10f/asymmetric_bram36k_sdp/asymmetric_bram36k_sdp.v
@@ -0,0 +1,203 @@
+// Copyright 2020-2022 F4PGA Authors
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+// SPDX-License-Identifier: Apache-2.0
+
+module spram_9x4096_36x1024 (
+    WEN_i,
+    REN_i,
+    clock0,
+    clock1,
+    WR_ADDR_i,
+    RD_ADDR_i,
+    WDATA_i,
+    RDATA_o
+);
+
+parameter WR_ADDR_WIDTH = 12;
+parameter RD_ADDR_WIDTH = 10;
+parameter WR_DATA_WIDTH = 9;
+parameter RD_DATA_WIDTH = 36;
+parameter BE_WIDTH = 1;
+
+input wire WEN_i;
+input wire REN_i;
+input wire clock0;
+input wire clock1;
+input wire [WR_ADDR_WIDTH-1 :0] WR_ADDR_i;
+input wire [RD_ADDR_WIDTH-1 :0] RD_ADDR_i;
+input wire [WR_DATA_WIDTH-1 :0] WDATA_i;
+output wire [RD_DATA_WIDTH-1 :0] RDATA_o;
+
+RAM_36K_BLK #(
+              .WR_ADDR_WIDTH(WR_ADDR_WIDTH),
+              .RD_ADDR_WIDTH(RD_ADDR_WIDTH),
+              .WR_DATA_WIDTH(WR_DATA_WIDTH),
+              .RD_DATA_WIDTH(RD_DATA_WIDTH),
+              .BE_WIDTH(BE_WIDTH)
+              ) spram_x36_inst (
+              
+              .WEN_i(WEN_i),
+              .WR_BE_i(1'b1),
+              .REN_i(REN_i),              
+              .WR_CLK_i(clock0),
+              .RD_CLK_i(clock1),
+              .WR_ADDR_i(WR_ADDR_i),
+              .RD_ADDR_i(RD_ADDR_i),
+              .WDATA_i(WDATA_i),
+              .RDATA_o(RDATA_o)
+              );
+              
+endmodule    
+
+module spram_18x2048_36x1024 (
+    WEN_i,
+    REN_i,
+    clock0,
+    clock1,
+    WR_ADDR_i,
+    RD_ADDR_i,
+    WDATA_i,
+    RDATA_o
+);
+
+parameter WR_ADDR_WIDTH = 11;
+parameter RD_ADDR_WIDTH = 10;
+parameter WR_DATA_WIDTH = 18;
+parameter RD_DATA_WIDTH = 36;
+parameter BE_WIDTH = 2;
+
+input wire WEN_i;
+input wire REN_i;
+input wire clock0;
+input wire clock1;
+input wire [WR_ADDR_WIDTH-1 :0] WR_ADDR_i;
+input wire [RD_ADDR_WIDTH-1 :0] RD_ADDR_i;
+input wire [WR_DATA_WIDTH-1 :0] WDATA_i;
+output wire [RD_DATA_WIDTH-1 :0] RDATA_o;
+
+RAM_36K_BLK #(
+              .WR_ADDR_WIDTH(WR_ADDR_WIDTH),
+              .RD_ADDR_WIDTH(RD_ADDR_WIDTH),
+              .WR_DATA_WIDTH(WR_DATA_WIDTH),
+              .RD_DATA_WIDTH(RD_DATA_WIDTH),
+              .BE_WIDTH(BE_WIDTH)
+              ) spram_x36_inst (
+              
+              .WEN_i(WEN_i),
+              .WR_BE_i(2'b11),
+              .REN_i(REN_i),              
+              .WR_CLK_i(clock0),
+              .RD_CLK_i(clock1),
+              .WR_ADDR_i(WR_ADDR_i),
+              .RD_ADDR_i(RD_ADDR_i),
+              .WDATA_i(WDATA_i),
+              .RDATA_o(RDATA_o)
+              );
+              
+endmodule   
+
+module spram_18x2048_9x4096 (
+    WEN_i,
+    REN_i,
+    clock0,
+    clock1,
+    WR_ADDR_i,
+    RD_ADDR_i,
+    WDATA_i,
+    RDATA_o
+);
+
+parameter WR_ADDR_WIDTH = 11;
+parameter RD_ADDR_WIDTH = 12;
+parameter WR_DATA_WIDTH = 18;
+parameter RD_DATA_WIDTH = 9;
+parameter BE_WIDTH = 2;
+
+input wire WEN_i;
+input wire REN_i;
+input wire clock0;
+input wire clock1;
+input wire [WR_ADDR_WIDTH-1 :0] WR_ADDR_i;
+input wire [RD_ADDR_WIDTH-1 :0] RD_ADDR_i;
+input wire [WR_DATA_WIDTH-1 :0] WDATA_i;
+output wire [RD_DATA_WIDTH-1 :0] RDATA_o;
+
+RAM_36K_BLK #(
+              .WR_ADDR_WIDTH(WR_ADDR_WIDTH),
+              .RD_ADDR_WIDTH(RD_ADDR_WIDTH),
+              .WR_DATA_WIDTH(WR_DATA_WIDTH),
+              .RD_DATA_WIDTH(RD_DATA_WIDTH),
+              .BE_WIDTH(BE_WIDTH)
+              ) spram_x36_inst (
+              
+              .WEN_i(WEN_i),
+              .WR_BE_i(2'b11),
+              .REN_i(REN_i),              
+              .WR_CLK_i(clock0),
+              .RD_CLK_i(clock1),
+              .WR_ADDR_i(WR_ADDR_i),
+              .RD_ADDR_i(RD_ADDR_i),
+              .WDATA_i(WDATA_i),
+              .RDATA_o(RDATA_o)
+              );
+              
+endmodule    
+
+module spram_36x1024_18x2048 (
+    WEN_i,
+    REN_i,
+    clock0,
+    clock1,
+    WR_ADDR_i,
+    RD_ADDR_i,
+    WDATA_i,
+    RDATA_o
+);
+
+parameter WR_ADDR_WIDTH = 10;
+parameter RD_ADDR_WIDTH = 11;
+parameter WR_DATA_WIDTH = 36;
+parameter RD_DATA_WIDTH = 18;
+parameter BE_WIDTH = 4;
+
+input wire WEN_i;
+input wire REN_i;
+input wire clock0;
+input wire clock1;
+input wire [WR_ADDR_WIDTH-1 :0] WR_ADDR_i;
+input wire [RD_ADDR_WIDTH-1 :0] RD_ADDR_i;
+input wire [WR_DATA_WIDTH-1 :0] WDATA_i;
+output wire [RD_DATA_WIDTH-1 :0] RDATA_o;
+
+RAM_36K_BLK #(
+              .WR_ADDR_WIDTH(WR_ADDR_WIDTH),
+              .RD_ADDR_WIDTH(RD_ADDR_WIDTH),
+              .WR_DATA_WIDTH(WR_DATA_WIDTH),
+              .RD_DATA_WIDTH(RD_DATA_WIDTH),
+              .BE_WIDTH(BE_WIDTH)
+              ) spram_x36_inst (
+              
+              .WEN_i(WEN_i),
+              .WR_BE_i(4'b1111),
+              .REN_i(REN_i),              
+              .WR_CLK_i(clock0),
+              .RD_CLK_i(clock1),
+              .WR_ADDR_i(WR_ADDR_i),
+              .RD_ADDR_i(RD_ADDR_i),
+              .WDATA_i(WDATA_i),
+              .RDATA_o(RDATA_o)
+              );
+              
+endmodule     
\ No newline at end of file
diff --git a/ql-qlf-plugin/tests/qlf_k6n10f/asymmetric_bram36k_sdp/sim/Makefile b/ql-qlf-plugin/tests/qlf_k6n10f/asymmetric_bram36k_sdp/sim/Makefile
new file mode 100644
index 0000000..88ba3d5
--- /dev/null
+++ b/ql-qlf-plugin/tests/qlf_k6n10f/asymmetric_bram36k_sdp/sim/Makefile
@@ -0,0 +1,50 @@
+# Copyright 2020-2022 F4PGA Authors
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+# SPDX-License-Identifier: Apache-2.0
+
+TESTBENCH = asymmetric_bram36k_sdp_tb.v
+POST_SYNTH = spram_9x4096_36x1024_post_synth spram_18x2048_36x1024_post_synth spram_18x2048_9x4096_post_synth spram_36x1024_18x2048_post_synth
+ADDR_WIDTH0 = 12 11 11 10
+DATA_WIDTH0 = 9 18 18 36
+ADDR_WIDTH1 = 10 10 12 11
+DATA_WIDTH1 = 36 36 9 18
+TOP = spram_9x4096_36x1024 spram_18x2048_36x1024 spram_18x2048_9x4096 spram_36x1024_18x2048
+ADDR0_DEFINES = $(foreach awidth0, $(ADDR_WIDTH0),-DADDR_WIDTH0="$(awidth0)")
+ADDR1_DEFINES = $(foreach awidth1, $(ADDR_WIDTH1),-DADDR_WIDTH1="$(awidth1)")
+DATA0_DEFINES = $(foreach dwidth0, $(DATA_WIDTH0),-DDATA_WIDTH0="$(dwidth0)")
+DATA1_DEFINES = $(foreach dwidth1, $(DATA_WIDTH1),-DDATA_WIDTH1="$(dwidth1)")
+TOP_DEFINES = $(foreach top, $(TOP),-DTOP="$(top)")
+VCD_DEFINES = $(foreach vcd, $(POST_SYNTH),-DVCD="$(vcd).vcd")
+
+SIM_LIBS = $(shell find ../../../../qlf_k6n10f -name "*.v" -not -name "*_map.v")
+
+define simulate_post_synth
+	@iverilog  -vvvv -g2005 $(word $(1),$(ADDR0_DEFINES)) $(word $(1),$(ADDR1_DEFINES)) $(word $(1),$(DATA0_DEFINES)) $(word $(1),$(DATA1_DEFINES)) $(word $(1),$(TOP_DEFINES)) $(word $(1),$(VCD_DEFINES)) -o $(word $(1),$(POST_SYNTH)).vvp $(word $(1),$(POST_SYNTH)).v $(SIM_LIBS) $(TESTBENCH) > $(word $(1),$(POST_SYNTH)).vvp.log 2>&1
+	@vvp -vvvv $(word $(1),$(POST_SYNTH)).vvp > $(word $(1),$(POST_SYNTH)).vcd.log 2>&1
+endef
+
+define clean_post_synth_sim
+	@rm -rf  $(word $(1),$(POST_SYNTH)).vcd $(word $(1),$(POST_SYNTH)).vvp $(word $(1),$(POST_SYNTH)).vvp.log $(word $(1),$(POST_SYNTH)).vcd.log
+endef
+
+sim:
+	$(call simulate_post_synth,1)
+	$(call clean_post_synth_sim,1)
+	$(call simulate_post_synth,2)
+	$(call clean_post_synth_sim,2)
+	$(call simulate_post_synth,3)
+	$(call clean_post_synth_sim,3)
+	$(call simulate_post_synth,4)
+	$(call clean_post_synth_sim,4)
\ No newline at end of file
diff --git a/ql-qlf-plugin/tests/qlf_k6n10f/asymmetric_bram36k_sdp/sim/asymmetric_bram36k_sdp_tb.v b/ql-qlf-plugin/tests/qlf_k6n10f/asymmetric_bram36k_sdp/sim/asymmetric_bram36k_sdp_tb.v
new file mode 100644
index 0000000..38064a3
--- /dev/null
+++ b/ql-qlf-plugin/tests/qlf_k6n10f/asymmetric_bram36k_sdp/sim/asymmetric_bram36k_sdp_tb.v
@@ -0,0 +1,269 @@
+// Copyright 2020-2022 F4PGA Authors
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//		 http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+// SPDX-License-Identifier: Apache-2.0
+
+`timescale 1ns/1ps
+
+`define STRINGIFY(x) `"x`"
+
+module TB;
+	localparam PERIOD = 50;
+	localparam ADDR_INCR = 1;
+
+	reg clk_0;
+	reg clk_1;
+	reg rce;
+	reg [`ADDR_WIDTH1-1:0] ra;
+	wire [`DATA_WIDTH1-1:0] rq;
+	reg wce;
+	reg [`ADDR_WIDTH0-1:0] wa;
+	reg [`DATA_WIDTH0-1:0] wd;
+
+	initial clk_0 = 0;
+	initial clk_1 = 0;
+	initial ra = 0;
+	initial wa = 0;
+	initial wd = 0;
+	initial rce = 0;
+	initial wce = 0;
+	initial forever #(PERIOD / 2.0) clk_0 = ~clk_0;
+	initial begin
+		#(PERIOD / 4.0);
+		forever #(PERIOD / 2.0) clk_1 = ~clk_1;
+	end
+	initial begin
+		$dumpfile(`STRINGIFY(`VCD));
+		$dumpvars;
+	end
+
+	integer a;
+	integer b;
+
+	reg done_0;
+	initial done_0 = 1'b0;
+	wire done_sim = done_0;
+
+	reg [`DATA_WIDTH1-1:0] expected_0;
+
+	reg read_test_0;
+	initial read_test_0 = 0;
+
+
+	wire error_0 = (read_test_0) ? (rq !== expected_0) : 0;
+
+	integer error_0_cnt = 0;
+
+	always @ (posedge clk_1)
+	begin
+		if (error_0)
+			error_0_cnt <= error_0_cnt + 1'b1;
+	end
+
+	case (`STRINGIFY(`TOP))
+	"spram_9x4096_36x1024": begin
+		initial #(1) begin
+			// Write data
+			for (a = 0; a < (1<<`ADDR_WIDTH0) ; a = a + ADDR_INCR) begin
+				@(negedge clk_0) begin
+					wa = a[`ADDR_WIDTH0-1:0];
+					wd = a[10:2];
+					wce = 1;
+				end
+				@(posedge clk_0) begin
+					#(PERIOD/10) wce = 0;
+				end
+			end
+			// Read data
+			read_test_0 = 1;
+			for (a = 0; a < (1<<`ADDR_WIDTH1); a = a + ADDR_INCR) begin
+				@(negedge clk_1) begin
+					ra = a;
+					rce = 1;
+				end
+				@(posedge clk_1) begin
+					expected_0 <= {a[8],a[8],a[7:0],a[7:0],a[8],a[8],a[7:0],a[7:0]};
+					#(PERIOD/10) rce = 0;
+					if ( rq !== expected_0) begin
+						$display("%d: PORT 0: FAIL: mismatch act=%x exp=%x at %x", $time, rq, expected_0, a);
+					end else begin
+						$display("%d: PORT 0: OK: act=%x exp=%x at %x", $time, rq, expected_0, a);
+					end
+				end
+			end
+			done_0 = 1'b1;
+			a = 0;
+		end
+	end
+	"spram_18x2048_36x1024": begin
+		initial #(1) begin
+			// Write data
+			for (a = 0; a < (1<<`ADDR_WIDTH0) ; a = a + ADDR_INCR) begin
+				@(negedge clk_0) begin
+					wa = a[`ADDR_WIDTH0-1:0];
+					wd = a[18:1];
+					wce = 1;
+				end
+				@(posedge clk_0) begin
+					#(PERIOD/10) wce = 0;
+				end
+			end
+			// Read data
+			read_test_0 = 1;
+			for (a = 0; a < (1<<`ADDR_WIDTH1); a = a + ADDR_INCR) begin
+				@(negedge clk_1) begin
+					ra = a;
+					rce = 1;
+				end
+				@(posedge clk_1) begin
+					expected_0 <= {a[17:0],a[17:0]};
+					#(PERIOD/10) rce = 0;
+					if ( rq !== expected_0) begin
+						$display("%d: PORT 0: FAIL: mismatch act=%x exp=%x at %x", $time, rq, expected_0, a);
+					end else begin
+						$display("%d: PORT 0: OK: act=%x exp=%x at %x", $time, rq, expected_0, a);
+					end
+				end
+			end
+			done_0 = 1'b1;
+			a = 0;
+		end
+	end	 
+	"spram_18x2048_9x4096": begin
+		initial #(1) begin
+			// Write data
+			for (a = 0; a < (1<<`ADDR_WIDTH0) ; a = a + ADDR_INCR) begin
+				@(negedge clk_0) begin
+					wa = a[`ADDR_WIDTH0-1:0];
+					wd = {a[8],a[8],a[7:0],a[7:0]};
+					wce = 1;
+				end
+				@(posedge clk_0) begin
+					#(PERIOD/10) wce = 0;
+				end
+			end
+			// Read data
+			read_test_0 = 1;
+			for (a = 0; a < (1<<`ADDR_WIDTH1); a = a + ADDR_INCR) begin
+				@(negedge clk_1) begin
+					ra = a;
+					rce = 1;
+				end
+				@(posedge clk_1) begin
+					expected_0 <= {a[9:1]};
+					#(PERIOD/10) rce = 0;
+					if ( rq !== expected_0) begin
+						$display("%d: PORT 0: FAIL: mismatch act=%x exp=%x at %x", $time, rq, expected_0, a);
+					end else begin
+						$display("%d: PORT 0: OK: act=%x exp=%x at %x", $time, rq, expected_0, a);
+					end
+				end
+			end
+			done_0 = 1'b1;
+			a = 0;
+		end
+	end
+	"spram_36x1024_18x2048": begin
+		initial #(1) begin
+			// Write data
+			for (a = 0; a < (1<<`ADDR_WIDTH0) ; a = a + ADDR_INCR) begin
+				@(negedge clk_0) begin
+					wa = a[`ADDR_WIDTH0-1:0];
+					wd = {a[17:0],a[17:0]};
+					wce = 1;
+				end
+				@(posedge clk_0) begin
+					#(PERIOD/10) wce = 0;
+				end
+			end
+			// Read data
+			read_test_0 = 1;
+			for (a = 0; a < (1<<`ADDR_WIDTH1); a = a + ADDR_INCR) begin
+				@(negedge clk_1) begin
+					ra = a;
+					rce = 1;
+				end
+				@(posedge clk_1) begin
+					expected_0 <= {a[18:1]};
+					#(PERIOD/10) rce = 0;
+					if ( rq !== expected_0) begin
+						$display("%d: PORT 0: FAIL: mismatch act=%x exp=%x at %x", $time, rq, expected_0, a);
+					end else begin
+						$display("%d: PORT 0: OK: act=%x exp=%x at %x", $time, rq, expected_0, a);
+					end
+				end
+			end
+			done_0 = 1'b1;
+			a = 0;
+		end
+	end
+	endcase
+
+	// Scan for simulation finish
+	always @(posedge clk_1) begin
+		if (done_sim)
+			$finish_and_return( (error_0_cnt == 0) ? 0 : -1 );
+	end
+
+	case (`STRINGIFY(`TOP))
+		"spram_9x4096_36x1024": begin
+			spram_9x4096_36x1024 #() bram (
+				.clock0(clk_0),
+				.clock1(clk_1),				 
+				.REN_i(rce),
+				.RD_ADDR_i(ra),
+				.RDATA_o(rq),
+				.WEN_i(wce),
+				.WR_ADDR_i(wa),
+				.WDATA_i(wd)
+			);
+		end
+		"spram_18x2048_36x1024": begin
+			spram_18x2048_36x1024 #() bram (
+				.clock0(clk_0),
+				.clock1(clk_1),				 
+				.REN_i(rce),
+				.RD_ADDR_i(ra),
+				.RDATA_o(rq),
+				.WEN_i(wce),
+				.WR_ADDR_i(wa),
+				.WDATA_i(wd)
+			);
+		end
+		"spram_18x2048_9x4096": begin
+			spram_18x2048_9x4096 #() bram (
+				.clock0(clk_0),
+				.clock1(clk_1),				 
+				.REN_i(rce),
+				.RD_ADDR_i(ra),
+				.RDATA_o(rq),
+				.WEN_i(wce),
+				.WR_ADDR_i(wa),
+				.WDATA_i(wd)
+			);
+		end
+		"spram_36x1024_18x2048": begin
+			spram_36x1024_18x2048 #() bram (
+				.clock0(clk_0),
+				.clock1(clk_1),				 
+				.REN_i(rce),
+				.RD_ADDR_i(ra),
+				.RDATA_o(rq),
+				.WEN_i(wce),
+				.WR_ADDR_i(wa),
+				.WDATA_i(wd)
+			);
+		end
+	endcase
+endmodule
diff --git a/ql-qlf-plugin/tests/qlf_k6n10f/asymmetric_bram36k_sfifo/asymmetric_bram36k_sfifo.tcl b/ql-qlf-plugin/tests/qlf_k6n10f/asymmetric_bram36k_sfifo/asymmetric_bram36k_sfifo.tcl
new file mode 100644
index 0000000..4b24470
--- /dev/null
+++ b/ql-qlf-plugin/tests/qlf_k6n10f/asymmetric_bram36k_sfifo/asymmetric_bram36k_sfifo.tcl
@@ -0,0 +1,49 @@
+yosys -import
+
+if { [info procs ql-qlf-k6n10f] == {} } { plugin -i ql-qlf }
+yosys -import  ;
+
+read_verilog $::env(DESIGN_TOP).v
+design -save asymmetric_bram36k_sfifo
+
+select f4096x9_1024x36
+select *
+synth_quicklogic -family qlf_k6n10f -top f4096x9_1024x36 -bram_types
+opt_expr -undriven
+opt_clean
+stat
+write_verilog sim/f4096x9_1024x36_post_synth.v
+select -assert-count 1 t:TDP36K_FIFO_SYNC_WR_X9_RD_X36_nonsplit
+
+select -clear
+design -load asymmetric_bram36k_sfifo
+select f2048x18_1024x36
+select *
+synth_quicklogic -family qlf_k6n10f -top f2048x18_1024x36 -bram_types
+opt_expr -undriven
+opt_clean
+stat
+write_verilog sim/f2048x18_1024x36_post_synth.v
+select -assert-count 1 t:TDP36K_FIFO_SYNC_WR_X18_RD_X36_nonsplit
+
+select -clear
+design -load asymmetric_bram36k_sfifo
+select f2048x18_4098x9
+select *
+synth_quicklogic -family qlf_k6n10f -top f2048x18_4098x9 -bram_types
+opt_expr -undriven
+opt_clean
+stat
+write_verilog sim/f2048x18_4098x9_post_synth.v
+select -assert-count 1 t:TDP36K_FIFO_SYNC_WR_X18_RD_X9_nonsplit
+
+select -clear
+design -load asymmetric_bram36k_sfifo
+select f1024x36_2048x18
+select *
+synth_quicklogic -family qlf_k6n10f -top f1024x36_2048x18 -bram_types
+opt_expr -undriven
+opt_clean
+stat
+write_verilog sim/f1024x36_2048x18_post_synth.v
+select -assert-count 1 t:TDP36K_FIFO_SYNC_WR_X36_RD_X18_nonsplit
\ No newline at end of file
diff --git a/ql-qlf-plugin/tests/qlf_k6n10f/asymmetric_bram36k_sfifo/asymmetric_bram36k_sfifo.v b/ql-qlf-plugin/tests/qlf_k6n10f/asymmetric_bram36k_sfifo/asymmetric_bram36k_sfifo.v
new file mode 100644
index 0000000..c0b6507
--- /dev/null
+++ b/ql-qlf-plugin/tests/qlf_k6n10f/asymmetric_bram36k_sfifo/asymmetric_bram36k_sfifo.v
@@ -0,0 +1,175 @@
+// Copyright 2020-2022 F4PGA Authors
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+// SPDX-License-Identifier: Apache-2.0
+
+module f4096x9_1024x36 (DIN,PUSH,POP,clock0,Async_Flush,Almost_Full,Almost_Empty,Full,Empty,Full_Watermark,Empty_Watermark,Overrun_Error,Underrun_Error,DOUT);
+
+parameter WR_DATA_WIDTH = 9;
+parameter RD_DATA_WIDTH = 36;
+parameter UPAE_DBITS = 12'd10;
+parameter UPAF_DBITS = 12'd10;
+
+input clock0;
+input PUSH,POP;
+input [WR_DATA_WIDTH-1:0] DIN;
+input Async_Flush;
+output [RD_DATA_WIDTH-1:0] DOUT;
+output Almost_Full,Almost_Empty;
+output Full, Empty;
+output Full_Watermark, Empty_Watermark;
+output Overrun_Error, Underrun_Error;
+
+SFIFO_36K_BLK  # (.WR_DATA_WIDTH(WR_DATA_WIDTH),.RD_DATA_WIDTH(RD_DATA_WIDTH),.UPAE_DBITS(UPAE_DBITS),.UPAF_DBITS(UPAF_DBITS)
+                  )
+  FIFO_INST    (
+                .DIN(DIN),
+                .PUSH(PUSH),
+                .POP(POP),
+                .CLK(clock0),
+                .Async_Flush(Async_Flush),
+                
+                .Overrun_Error(Overrun_Error),
+                .Full_Watermark(Full_Watermark),
+                .Almost_Full(Almost_Full),
+                .Full(Full),
+                
+                .Underrun_Error(Underrun_Error),
+                .Empty_Watermark(Empty_Watermark),
+                .Almost_Empty(Almost_Empty),
+                .Empty(Empty),
+
+                .DOUT(DOUT)
+                );
+endmodule
+
+module f2048x18_1024x36 (DIN,PUSH,POP,clock0,Async_Flush,Almost_Full,Almost_Empty,Full,Empty,Full_Watermark,Empty_Watermark,Overrun_Error,Underrun_Error,DOUT);
+
+parameter WR_DATA_WIDTH = 18;
+parameter RD_DATA_WIDTH = 36;
+parameter UPAE_DBITS = 12'd10;
+parameter UPAF_DBITS = 12'd10;
+
+input clock0;
+input PUSH,POP;
+input [WR_DATA_WIDTH-1:0] DIN;
+input Async_Flush;
+output [RD_DATA_WIDTH-1:0] DOUT;
+output Almost_Full,Almost_Empty;
+output Full, Empty;
+output Full_Watermark, Empty_Watermark;
+output Overrun_Error, Underrun_Error;
+
+SFIFO_36K_BLK  # (.WR_DATA_WIDTH(WR_DATA_WIDTH),.RD_DATA_WIDTH(RD_DATA_WIDTH),.UPAE_DBITS(UPAE_DBITS),.UPAF_DBITS(UPAF_DBITS)
+                  )
+  FIFO_INST    (
+                .DIN(DIN),
+                .PUSH(PUSH),
+                .POP(POP),
+                .CLK(clock0),
+                .Async_Flush(Async_Flush),
+                
+                .Overrun_Error(Overrun_Error),
+                .Full_Watermark(Full_Watermark),
+                .Almost_Full(Almost_Full),
+                .Full(Full),
+                
+                .Underrun_Error(Underrun_Error),
+                .Empty_Watermark(Empty_Watermark),
+                .Almost_Empty(Almost_Empty),
+                .Empty(Empty),
+
+                .DOUT(DOUT)
+                );
+endmodule
+
+module f2048x18_4098x9 (DIN,PUSH,POP,clock0,Async_Flush,Almost_Full,Almost_Empty,Full,Empty,Full_Watermark,Empty_Watermark,Overrun_Error,Underrun_Error,DOUT);
+
+parameter WR_DATA_WIDTH = 18;
+parameter RD_DATA_WIDTH = 9;
+parameter UPAE_DBITS = 12'd10;
+parameter UPAF_DBITS = 12'd10;
+
+input clock0;
+input PUSH,POP;
+input [WR_DATA_WIDTH-1:0] DIN;
+input Async_Flush;
+output [RD_DATA_WIDTH-1:0] DOUT;
+output Almost_Full,Almost_Empty;
+output Full, Empty;
+output Full_Watermark, Empty_Watermark;
+output Overrun_Error, Underrun_Error;
+
+SFIFO_36K_BLK  # (.WR_DATA_WIDTH(WR_DATA_WIDTH),.RD_DATA_WIDTH(RD_DATA_WIDTH),.UPAE_DBITS(UPAE_DBITS),.UPAF_DBITS(UPAF_DBITS)
+                  )
+  FIFO_INST    (
+                .DIN(DIN),
+                .PUSH(PUSH),
+                .POP(POP),
+                .CLK(clock0),
+                .Async_Flush(Async_Flush),
+                
+                .Overrun_Error(Overrun_Error),
+                .Full_Watermark(Full_Watermark),
+                .Almost_Full(Almost_Full),
+                .Full(Full),
+                
+                .Underrun_Error(Underrun_Error),
+                .Empty_Watermark(Empty_Watermark),
+                .Almost_Empty(Almost_Empty),
+                .Empty(Empty),
+
+                .DOUT(DOUT)
+                );
+endmodule
+
+module f1024x36_2048x18 (DIN,PUSH,POP,clock0,Async_Flush,Almost_Full,Almost_Empty,Full,Empty,Full_Watermark,Empty_Watermark,Overrun_Error,Underrun_Error,DOUT);
+
+parameter WR_DATA_WIDTH = 36;
+parameter RD_DATA_WIDTH = 18;
+parameter UPAE_DBITS = 12'd10;
+parameter UPAF_DBITS = 12'd10;
+
+input clock0;
+input PUSH,POP;
+input [WR_DATA_WIDTH-1:0] DIN;
+input Async_Flush;
+output [RD_DATA_WIDTH-1:0] DOUT;
+output Almost_Full,Almost_Empty;
+output Full, Empty;
+output Full_Watermark, Empty_Watermark;
+output Overrun_Error, Underrun_Error;
+
+SFIFO_36K_BLK  # (.WR_DATA_WIDTH(WR_DATA_WIDTH),.RD_DATA_WIDTH(RD_DATA_WIDTH),.UPAE_DBITS(UPAE_DBITS),.UPAF_DBITS(UPAF_DBITS)
+                  )
+  FIFO_INST    (
+                .DIN(DIN),
+                .PUSH(PUSH),
+                .POP(POP),
+                .CLK(clock0),
+                .Async_Flush(Async_Flush),
+                
+                .Overrun_Error(Overrun_Error),
+                .Full_Watermark(Full_Watermark),
+                .Almost_Full(Almost_Full),
+                .Full(Full),
+                
+                .Underrun_Error(Underrun_Error),
+                .Empty_Watermark(Empty_Watermark),
+                .Almost_Empty(Almost_Empty),
+                .Empty(Empty),
+
+                .DOUT(DOUT)
+                );
+endmodule
\ No newline at end of file
diff --git a/ql-qlf-plugin/tests/qlf_k6n10f/asymmetric_bram36k_sfifo/sim/Makefile b/ql-qlf-plugin/tests/qlf_k6n10f/asymmetric_bram36k_sfifo/sim/Makefile
new file mode 100644
index 0000000..e13baa3
--- /dev/null
+++ b/ql-qlf-plugin/tests/qlf_k6n10f/asymmetric_bram36k_sfifo/sim/Makefile
@@ -0,0 +1,50 @@
+# Copyright 2020-2022 F4PGA Authors
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+# SPDX-License-Identifier: Apache-2.0
+
+TESTBENCH = asymmetric_bram36k_sfifo_tb.v
+POST_SYNTH = f4096x9_1024x36_post_synth f2048x18_1024x36_post_synth f2048x18_4098x9_post_synth f1024x36_2048x18_post_synth
+ADDR_WIDTH0 = 12 11 11 10
+DATA_WIDTH0 = 9 18 18 36
+ADDR_WIDTH1 = 10 10 12 11
+DATA_WIDTH1 = 36 36 9 18
+TOP = f4096x9_1024x36 f2048x18_1024x36 f2048x18_4098x9 f1024x36_2048x18
+ADDR0_DEFINES = $(foreach awidth0, $(ADDR_WIDTH0),-DADDR_WIDTH0="$(awidth0)")
+ADDR1_DEFINES = $(foreach awidth1, $(ADDR_WIDTH1),-DADDR_WIDTH1="$(awidth1)")
+DATA0_DEFINES = $(foreach dwidth0, $(DATA_WIDTH0),-DDATA_WIDTH0="$(dwidth0)")
+DATA1_DEFINES = $(foreach dwidth1, $(DATA_WIDTH1),-DDATA_WIDTH1="$(dwidth1)")
+TOP_DEFINES = $(foreach top, $(TOP),-DTOP="$(top)")
+VCD_DEFINES = $(foreach vcd, $(POST_SYNTH),-DVCD="$(vcd).vcd")
+
+SIM_LIBS = $(shell find ../../../../qlf_k6n10f -name "*.v" -not -name "*_map.v")
+
+define simulate_post_synth
+	@iverilog  -vvvv -g2005 $(word $(1),$(ADDR0_DEFINES)) $(word $(1),$(ADDR1_DEFINES)) $(word $(1),$(DATA0_DEFINES)) $(word $(1),$(DATA1_DEFINES)) $(word $(1),$(TOP_DEFINES)) $(word $(1),$(VCD_DEFINES)) -o $(word $(1),$(POST_SYNTH)).vvp $(word $(1),$(POST_SYNTH)).v $(SIM_LIBS) $(TESTBENCH) > $(word $(1),$(POST_SYNTH)).vvp.log 2>&1
+	@vvp -vvvv $(word $(1),$(POST_SYNTH)).vvp > $(word $(1),$(POST_SYNTH)).vcd.log 2>&1
+endef
+
+define clean_post_synth_sim
+	@rm -rf  $(word $(1),$(POST_SYNTH)).vcd $(word $(1),$(POST_SYNTH)).vvp $(word $(1),$(POST_SYNTH)).vvp.log $(word $(1),$(POST_SYNTH)).vcd.log
+endef
+
+sim:
+	$(call simulate_post_synth,1)
+	$(call clean_post_synth_sim,1)
+	$(call simulate_post_synth,2)
+	$(call clean_post_synth_sim,2)
+	$(call simulate_post_synth,3)
+	$(call clean_post_synth_sim,3)
+	$(call simulate_post_synth,4)
+	$(call clean_post_synth_sim,4)
\ No newline at end of file
diff --git a/ql-qlf-plugin/tests/qlf_k6n10f/asymmetric_bram36k_sfifo/sim/asymmetric_bram36k_sfifo_tb.v b/ql-qlf-plugin/tests/qlf_k6n10f/asymmetric_bram36k_sfifo/sim/asymmetric_bram36k_sfifo_tb.v
new file mode 100644
index 0000000..b1c753c
--- /dev/null
+++ b/ql-qlf-plugin/tests/qlf_k6n10f/asymmetric_bram36k_sfifo/sim/asymmetric_bram36k_sfifo_tb.v
@@ -0,0 +1,285 @@
+// Copyright 2020-2022 F4PGA Authors
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//		 http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+// SPDX-License-Identifier: Apache-2.0
+
+`timescale 1ns/1ps
+
+`define STRINGIFY(x) `"x`"
+
+module TB;
+	localparam PERIOD = 30;
+	localparam ADDR_INCR = 1;
+
+	reg clk0;
+	reg flush;
+	reg pop;
+	wire [`DATA_WIDTH1-1:0] dout;
+	reg push;
+	reg [`DATA_WIDTH0-1:0] din;
+	wire almost_full,almost_empty;
+	wire full, empty;
+	wire full_watermark, empty_watermark;
+	wire overrun_error, underrun_error;
+
+	initial 
+	begin
+		clk0 = 0;
+		pop = 0;
+		push = 0;
+		flush = 1;
+		din = 0;
+		#40
+		flush = 0;
+	end
+	
+	initial forever #(PERIOD / 3.0) clk0 = ~clk0;
+	
+	initial begin
+		$dumpfile(`STRINGIFY(`VCD));
+		$dumpvars;
+	end
+
+	integer a;
+
+	reg done;
+	initial done = 1'b0;
+	
+	reg read_test;
+	initial read_test = 0;
+
+	reg [`DATA_WIDTH1-1:0] expected;
+	initial expected = 0;
+
+	wire error = (read_test) ? dout !== expected : 0;
+
+	integer error_cnt = 0;
+	always @ (posedge clk0)
+	begin
+		if (error)
+			error_cnt <= error_cnt + 1'b1; 
+	end
+
+	case (`STRINGIFY(`TOP))
+	"f4096x9_1024x36": begin
+		initial #(50) begin
+			// Write data
+			for (a = 0; a < (1<<`ADDR_WIDTH0) ; a = a + ADDR_INCR) begin
+				@(negedge clk0) begin
+					din = a[10:2];
+					push = 1;
+				end
+				@(posedge clk0) begin
+					#(PERIOD/10) push = 0;
+				end
+			end
+			// Read data
+			read_test = 1;
+			for (a = 0; a < (1<<`ADDR_WIDTH1); a = a + ADDR_INCR) begin
+				@(posedge clk0) begin
+					expected <= {a[8],a[8],a[7:0],a[7:0],a[8],a[8],a[7:0],a[7:0]};
+					#(PERIOD/10) pop = 0;
+					if ( dout !== expected) begin
+						$display("%d: PORT 0: FAIL: mismatch act=%x exp=%x at %x", $time, dout, expected, a);
+					end else begin
+						$display("%d: PORT 0: OK: act=%x exp=%x at %x", $time, dout, expected, a);
+					end
+				end
+				@(negedge clk0) begin
+					pop = 1;
+				end
+			end
+			done = 1'b1;
+			a = 0;
+		end
+	end
+	"f2048x18_1024x36": begin
+		initial #(50) begin
+			// Write data
+			for (a = 0; a < (1<<`ADDR_WIDTH0) ; a = a + ADDR_INCR) begin
+				@(negedge clk0) begin
+					din = a[18:1];
+					push = 1;
+				end
+				@(posedge clk0) begin
+					#(PERIOD/10) push = 0;
+				end
+			end
+			// Read data
+			read_test = 1;
+			for (a = 0; a < (1<<`ADDR_WIDTH1); a = a + ADDR_INCR) begin
+				@(posedge clk0) begin
+					expected <= {a[17:0],a[17:0]};
+					#(PERIOD/10) pop = 0;
+					if ( dout !== expected) begin
+						$display("%d: PORT 0: FAIL: mismatch act=%x exp=%x at %x", $time, dout, expected, a);
+					end else begin
+						$display("%d: PORT 0: OK: act=%x exp=%x at %x", $time, dout, expected, a);
+					end
+				end
+				@(negedge clk0) begin
+					pop = 1;
+				end
+			end
+			done = 1'b1;
+			a = 0;
+		end
+	end	 
+	"f2048x18_4098x9": begin
+		initial #(50) begin
+			// Write data
+			for (a = 0; a < (1<<`ADDR_WIDTH0) ; a = a + ADDR_INCR) begin
+				@(negedge clk0) begin
+					din = {a[8],a[8],a[7:0],a[7:0]};
+					push = 1;
+				end
+				@(posedge clk0) begin
+					#(PERIOD/10) push = 0;
+				end
+			end
+			// Read data
+			read_test = 1;
+			for (a = 0; a < (1<<`ADDR_WIDTH1); a = a + ADDR_INCR) begin
+				@(posedge clk0) begin
+					expected <= {a[9:1]};
+					#(PERIOD/10) pop = 0;
+					if ( dout !== expected) begin
+						$display("%d: PORT 0: FAIL: mismatch act=%x exp=%x at %x", $time, dout, expected, a);
+					end else begin
+						$display("%d: PORT 0: OK: act=%x exp=%x at %x", $time, dout, expected, a);
+					end
+				end
+				@(negedge clk0) begin
+					pop = 1;
+				end
+			end
+			done = 1'b1;
+			a = 0;
+		end
+	end
+	"f1024x36_2048x18": begin
+		initial #(50) begin
+			// Write data
+			for (a = 0; a < (1<<`ADDR_WIDTH0) ; a = a + ADDR_INCR) begin
+				@(negedge clk0) begin
+					din = {a[17:0],a[17:0]};
+					push = 1;
+				end
+				@(posedge clk0) begin
+					#(PERIOD/10) push = 0;
+				end
+			end
+			// Read data
+			read_test = 1;
+			for (a = 0; a < (1<<`ADDR_WIDTH1); a = a + ADDR_INCR) begin
+				@(posedge clk0) begin
+					expected <= {a[18:1]};
+					#(PERIOD/10) pop = 0;
+					if ( dout !== expected) begin
+						$display("%d: PORT 0: FAIL: mismatch act=%x exp=%x at %x", $time, dout, expected, a);
+					end else begin
+						$display("%d: PORT 0: OK: act=%x exp=%x at %x", $time, dout, expected, a);
+					end
+				end
+				@(negedge clk0) begin
+					pop = 1;
+				end
+			end
+			done = 1'b1;
+			a = 0;
+		end
+	end
+	endcase
+
+	// Scan for simulation finish
+	always @(posedge clk0) begin
+		if (done)
+			$finish_and_return( (error_cnt == 0) ? 0 : -1 );
+	end
+
+	case (`STRINGIFY(`TOP))
+		"f4096x9_1024x36": begin
+			f4096x9_1024x36 #() afifo (
+				.DIN(din),
+				.PUSH(push),
+				.POP(pop),
+				.clock0(clk0),
+				.Async_Flush(flush),
+				.Almost_Full(almost_full),
+				.Almost_Empty(almost_empty),
+				.Full(full),
+				.Empty(empty),
+				.Full_Watermark(full_watermark),
+				.Empty_Watermark(empty_watermark),
+				.Overrun_Error(overrun_error),
+				.Underrun_Error(underrun_error),
+				.DOUT(dout)
+			);
+		end
+		"f2048x18_1024x36": begin
+			f2048x18_1024x36 #() afifo (
+				.DIN(din),
+				.PUSH(push),
+				.POP(pop),
+				.clock0(clk0),
+				.Async_Flush(flush),
+				.Almost_Full(almost_full),
+				.Almost_Empty(almost_empty),
+				.Full(full),
+				.Empty(empty),
+				.Full_Watermark(full_watermark),
+				.Empty_Watermark(empty_watermark),
+				.Overrun_Error(overrun_error),
+				.Underrun_Error(underrun_error),
+				.DOUT(dout)
+			);
+		end
+		"f2048x18_4098x9": begin
+			f2048x18_4098x9 #() afifo (
+				.DIN(din),
+				.PUSH(push),
+				.POP(pop),
+				.clock0(clk0),
+				.Async_Flush(flush),
+				.Almost_Full(almost_full),
+				.Almost_Empty(almost_empty),
+				.Full(full),
+				.Empty(empty),
+				.Full_Watermark(full_watermark),
+				.Empty_Watermark(empty_watermark),
+				.Overrun_Error(overrun_error),
+				.Underrun_Error(underrun_error),
+				.DOUT(dout)
+			);
+		end
+		"f1024x36_2048x18": begin
+			f1024x36_2048x18 #() afifo (
+				.DIN(din),
+				.PUSH(push),
+				.POP(pop),
+				.clock0(clk0),
+				.Async_Flush(flush),
+				.Almost_Full(almost_full),
+				.Almost_Empty(almost_empty),
+				.Full(full),
+				.Empty(empty),
+				.Full_Watermark(full_watermark),
+				.Empty_Watermark(empty_watermark),
+				.Overrun_Error(overrun_error),
+				.Underrun_Error(underrun_error),
+				.DOUT(dout)
+			);
+		end
+	endcase
+endmodule
diff --git a/ql-qlf-plugin/tests/qlf_k6n10f/bram18k_afifo/bram18k_afifo.tcl b/ql-qlf-plugin/tests/qlf_k6n10f/bram18k_afifo/bram18k_afifo.tcl
new file mode 100644
index 0000000..99c7405
--- /dev/null
+++ b/ql-qlf-plugin/tests/qlf_k6n10f/bram18k_afifo/bram18k_afifo.tcl
@@ -0,0 +1,49 @@
+yosys -import
+
+if { [info procs ql-qlf-k6n10f] == {} } { plugin -i ql-qlf }
+yosys -import  ;
+
+read_verilog $::env(DESIGN_TOP).v
+design -save bram18k_afifo
+
+select af1024x18_1024x18
+select *
+synth_quicklogic -family qlf_k6n10f -top af1024x18_1024x18 -bram_types
+opt_expr -undriven
+opt_clean
+stat
+write_verilog sim/af1024x18_1024x18_post_synth.v
+select -assert-count 1 t:TDP36K_FIFO_ASYNC_WR_X18_RD_X18_split
+
+select -clear
+design -load bram18k_afifo
+select af1024x16_1024x16
+select *
+synth_quicklogic -family qlf_k6n10f -top af1024x16_1024x16 -bram_types
+opt_expr -undriven
+opt_clean
+stat
+write_verilog sim/af1024x16_1024x16_post_synth.v
+select -assert-count 1 t:TDP36K_FIFO_ASYNC_WR_X18_RD_X18_split
+
+select -clear
+design -load bram18k_afifo
+select af2048x9_2048x9
+select *
+synth_quicklogic -family qlf_k6n10f -top af2048x9_2048x9 -bram_types
+opt_expr -undriven
+opt_clean
+stat
+write_verilog sim/af2048x9_2048x9_post_synth.v
+select -assert-count 1 t:TDP36K_FIFO_ASYNC_WR_X9_RD_X9_split
+
+select -clear
+design -load bram18k_afifo
+select af2048x8_2048x8
+select *
+synth_quicklogic -family qlf_k6n10f -top af2048x8_2048x8 -bram_types
+opt_expr -undriven
+opt_clean
+stat
+write_verilog sim/af2048x8_2048x8_post_synth.v
+select -assert-count 1 t:TDP36K_FIFO_ASYNC_WR_X9_RD_X9_split
diff --git a/ql-qlf-plugin/tests/qlf_k6n10f/bram18k_afifo/bram18k_afifo.v b/ql-qlf-plugin/tests/qlf_k6n10f/bram18k_afifo/bram18k_afifo.v
new file mode 100644
index 0000000..bd1fa13
--- /dev/null
+++ b/ql-qlf-plugin/tests/qlf_k6n10f/bram18k_afifo/bram18k_afifo.v
@@ -0,0 +1,179 @@
+// Copyright 2020-2022 F4PGA Authors
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+// SPDX-License-Identifier: Apache-2.0
+
+module af1024x18_1024x18 (DIN,PUSH,POP,clock0,clock1,Async_Flush,Almost_Full,Almost_Empty,Full,Empty,Full_Watermark,Empty_Watermark,Overrun_Error,Underrun_Error,DOUT);
+
+parameter WR_DATA_WIDTH = 18;
+parameter RD_DATA_WIDTH = 18;
+parameter UPAE_DBITS = 11'd10;
+parameter UPAF_DBITS = 11'd10;
+
+input clock0,clock1;
+input PUSH,POP;
+input [WR_DATA_WIDTH-1:0] DIN;
+input Async_Flush;
+output [RD_DATA_WIDTH-1:0] DOUT;
+output Almost_Full,Almost_Empty;
+output Full, Empty;
+output Full_Watermark, Empty_Watermark;
+output Overrun_Error, Underrun_Error;
+
+AFIFO_18K_BLK  # (.WR_DATA_WIDTH(WR_DATA_WIDTH),.RD_DATA_WIDTH(RD_DATA_WIDTH),.UPAE_DBITS(UPAE_DBITS),.UPAF_DBITS(UPAF_DBITS)
+                  )
+  FIFO_INST    (
+                .DIN(DIN),
+                .PUSH(PUSH),
+                .POP(POP),
+                .Push_Clk(clock0),
+                .Pop_Clk(clock1),
+                .Async_Flush(Async_Flush),
+                
+                .Overrun_Error(Overrun_Error),
+                .Full_Watermark(Full_Watermark),
+                .Almost_Full(Almost_Full),
+                .Full(Full),
+                
+                .Underrun_Error(Underrun_Error),
+                .Empty_Watermark(Empty_Watermark),
+                .Almost_Empty(Almost_Empty),
+                .Empty(Empty),
+
+                .DOUT(DOUT)
+                );
+endmodule
+
+module af1024x16_1024x16 (DIN,PUSH,POP,clock0,clock1,Async_Flush,Almost_Full,Almost_Empty,Full,Empty,Full_Watermark,Empty_Watermark,Overrun_Error,Underrun_Error,DOUT);
+
+parameter WR_DATA_WIDTH = 16;
+parameter RD_DATA_WIDTH = 16;
+parameter UPAE_DBITS = 11'd10;
+parameter UPAF_DBITS = 11'd10;
+
+input clock0,clock1;
+input PUSH,POP;
+input [WR_DATA_WIDTH-1:0] DIN;
+input Async_Flush;
+output [RD_DATA_WIDTH-1:0] DOUT;
+output Almost_Full,Almost_Empty;
+output Full, Empty;
+output Full_Watermark, Empty_Watermark;
+output Overrun_Error, Underrun_Error;
+
+AFIFO_18K_BLK  # (.WR_DATA_WIDTH(WR_DATA_WIDTH),.RD_DATA_WIDTH(RD_DATA_WIDTH),.UPAE_DBITS(UPAE_DBITS),.UPAF_DBITS(UPAF_DBITS)
+                  )
+  FIFO_INST    (
+                .DIN(DIN),
+                .PUSH(PUSH),
+                .POP(POP),
+                .Push_Clk(clock0),
+                .Pop_Clk(clock1),
+                .Async_Flush(Async_Flush),
+                
+                .Overrun_Error(Overrun_Error),
+                .Full_Watermark(Full_Watermark),
+                .Almost_Full(Almost_Full),
+                .Full(Full),
+                
+                .Underrun_Error(Underrun_Error),
+                .Empty_Watermark(Empty_Watermark),
+                .Almost_Empty(Almost_Empty),
+                .Empty(Empty),
+
+                .DOUT(DOUT)
+                );
+endmodule
+
+module af2048x9_2048x9 (DIN,PUSH,POP,clock0,clock1,Async_Flush,Almost_Full,Almost_Empty,Full,Empty,Full_Watermark,Empty_Watermark,Overrun_Error,Underrun_Error,DOUT);
+
+parameter WR_DATA_WIDTH = 9;
+parameter RD_DATA_WIDTH = 9;
+parameter UPAE_DBITS = 11'd10;
+parameter UPAF_DBITS = 11'd10;
+
+input clock0,clock1;
+input PUSH,POP;
+input [WR_DATA_WIDTH-1:0] DIN;
+input Async_Flush;
+output [RD_DATA_WIDTH-1:0] DOUT;
+output Almost_Full,Almost_Empty;
+output Full, Empty;
+output Full_Watermark, Empty_Watermark;
+output Overrun_Error, Underrun_Error;
+
+AFIFO_18K_BLK  # (.WR_DATA_WIDTH(WR_DATA_WIDTH),.RD_DATA_WIDTH(RD_DATA_WIDTH),.UPAE_DBITS(UPAE_DBITS),.UPAF_DBITS(UPAF_DBITS)
+                  )
+  FIFO_INST    (
+                .DIN(DIN),
+                .PUSH(PUSH),
+                .POP(POP),
+                .Push_Clk(clock0),
+                .Pop_Clk(clock1),
+                .Async_Flush(Async_Flush),
+                
+                .Overrun_Error(Overrun_Error),
+                .Full_Watermark(Full_Watermark),
+                .Almost_Full(Almost_Full),
+                .Full(Full),
+                
+                .Underrun_Error(Underrun_Error),
+                .Empty_Watermark(Empty_Watermark),
+                .Almost_Empty(Almost_Empty),
+                .Empty(Empty),
+
+                .DOUT(DOUT)
+                );
+endmodule
+
+module af2048x8_2048x8 (DIN,PUSH,POP,clock0,clock1,Async_Flush,Almost_Full,Almost_Empty,Full,Empty,Full_Watermark,Empty_Watermark,Overrun_Error,Underrun_Error,DOUT);
+
+parameter WR_DATA_WIDTH = 8;
+parameter RD_DATA_WIDTH = 8;
+parameter UPAE_DBITS = 11'd10;
+parameter UPAF_DBITS = 11'd10;
+
+input clock0,clock1;
+input PUSH,POP;
+input [WR_DATA_WIDTH-1:0] DIN;
+input Async_Flush;
+output [RD_DATA_WIDTH-1:0] DOUT;
+output Almost_Full,Almost_Empty;
+output Full, Empty;
+output Full_Watermark, Empty_Watermark;
+output Overrun_Error, Underrun_Error;
+
+AFIFO_18K_BLK  # (.WR_DATA_WIDTH(WR_DATA_WIDTH),.RD_DATA_WIDTH(RD_DATA_WIDTH),.UPAE_DBITS(UPAE_DBITS),.UPAF_DBITS(UPAF_DBITS)
+                  )
+  FIFO_INST    (
+                .DIN(DIN),
+                .PUSH(PUSH),
+                .POP(POP),
+                .Push_Clk(clock0),
+                .Pop_Clk(clock1),
+                .Async_Flush(Async_Flush),
+                
+                .Overrun_Error(Overrun_Error),
+                .Full_Watermark(Full_Watermark),
+                .Almost_Full(Almost_Full),
+                .Full(Full),
+                
+                .Underrun_Error(Underrun_Error),
+                .Empty_Watermark(Empty_Watermark),
+                .Almost_Empty(Almost_Empty),
+                .Empty(Empty),
+
+                .DOUT(DOUT)
+                );
+endmodule
\ No newline at end of file
diff --git a/ql-qlf-plugin/tests/qlf_k6n10f/bram18k_afifo/sim/Makefile b/ql-qlf-plugin/tests/qlf_k6n10f/bram18k_afifo/sim/Makefile
new file mode 100644
index 0000000..3c2bce7
--- /dev/null
+++ b/ql-qlf-plugin/tests/qlf_k6n10f/bram18k_afifo/sim/Makefile
@@ -0,0 +1,50 @@
+# Copyright 2020-2022 F4PGA Authors
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+# SPDX-License-Identifier: Apache-2.0
+
+TESTBENCH = bram18k_afifo_tb.v
+POST_SYNTH = af1024x18_1024x18_post_synth af1024x16_1024x16_post_synth af2048x9_2048x9_post_synth af2048x8_2048x8_post_synth
+ADDR_WIDTH0 = 10 10 11 11
+DATA_WIDTH0 = 18 16 9 8
+ADDR_WIDTH1 = 10 10 11 11
+DATA_WIDTH1 = 18 16 9 8
+TOP = af1024x18_1024x18 af1024x16_1024x16 af2048x9_2048x9 af2048x8_2048x8
+ADDR0_DEFINES = $(foreach awidth0, $(ADDR_WIDTH0),-DADDR_WIDTH0="$(awidth0)")
+ADDR1_DEFINES = $(foreach awidth1, $(ADDR_WIDTH1),-DADDR_WIDTH1="$(awidth1)")
+DATA0_DEFINES = $(foreach dwidth0, $(DATA_WIDTH0),-DDATA_WIDTH0="$(dwidth0)")
+DATA1_DEFINES = $(foreach dwidth1, $(DATA_WIDTH1),-DDATA_WIDTH1="$(dwidth1)")
+TOP_DEFINES = $(foreach top, $(TOP),-DTOP="$(top)")
+VCD_DEFINES = $(foreach vcd, $(POST_SYNTH),-DVCD="$(vcd).vcd")
+
+SIM_LIBS = $(shell find ../../../../qlf_k6n10f -name "*.v" -not -name "*_map.v")
+
+define simulate_post_synth
+	@iverilog  -vvvv -g2005 $(word $(1),$(ADDR0_DEFINES)) $(word $(1),$(ADDR1_DEFINES)) $(word $(1),$(DATA0_DEFINES)) $(word $(1),$(DATA1_DEFINES)) $(word $(1),$(TOP_DEFINES)) $(word $(1),$(VCD_DEFINES)) -o $(word $(1),$(POST_SYNTH)).vvp $(word $(1),$(POST_SYNTH)).v $(SIM_LIBS) $(TESTBENCH) > $(word $(1),$(POST_SYNTH)).vvp.log 2>&1
+	@vvp -vvvv $(word $(1),$(POST_SYNTH)).vvp > $(word $(1),$(POST_SYNTH)).vcd.log 2>&1
+endef
+
+define clean_post_synth_sim
+	@rm -rf  $(word $(1),$(POST_SYNTH)).vcd $(word $(1),$(POST_SYNTH)).vvp $(word $(1),$(POST_SYNTH)).vvp.log $(word $(1),$(POST_SYNTH)).vcd.log
+endef
+
+sim:
+	$(call simulate_post_synth,1)
+	$(call clean_post_synth_sim,1)
+	$(call simulate_post_synth,2)
+	$(call clean_post_synth_sim,2)
+	$(call simulate_post_synth,3)
+	$(call clean_post_synth_sim,3)
+	$(call simulate_post_synth,4)
+	$(call clean_post_synth_sim,4)
\ No newline at end of file
diff --git a/ql-qlf-plugin/tests/qlf_k6n10f/bram18k_afifo/sim/bram18k_afifo_tb.v b/ql-qlf-plugin/tests/qlf_k6n10f/bram18k_afifo/sim/bram18k_afifo_tb.v
new file mode 100644
index 0000000..1795312
--- /dev/null
+++ b/ql-qlf-plugin/tests/qlf_k6n10f/bram18k_afifo/sim/bram18k_afifo_tb.v
@@ -0,0 +1,195 @@
+// Copyright 2020-2022 F4PGA Authors
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//		 http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+// SPDX-License-Identifier: Apache-2.0
+
+`timescale 1ns/1ps
+
+`define STRINGIFY(x) `"x`"
+
+module TB;
+	localparam PERIOD = 30;
+	localparam ADDR_INCR = 1;
+
+	reg clk0;
+	reg clk1;
+	reg flush;
+	reg pop;
+	wire [`DATA_WIDTH1-1:0] dout;
+	reg push;
+	reg [`DATA_WIDTH0-1:0] din;
+	wire almost_full,almost_empty;
+	wire full, empty;
+	wire full_watermark, empty_watermark;
+	wire overrun_error, underrun_error;
+
+	initial 
+	begin
+		clk0 = 0;
+		clk1 = 0;
+		pop = 0;
+		push = 0;
+		flush = 1;
+		din = 0;
+		#40
+		flush = 0;
+	end
+	
+	initial forever #(PERIOD / 3.0) clk0 = ~clk0;
+	initial forever #(PERIOD / 2.0) clk1 = ~clk1;
+	
+	initial begin
+		$dumpfile(`STRINGIFY(`VCD));
+		$dumpvars;
+	end
+
+	integer a;
+
+	reg done;
+	initial done = 1'b0;
+ 
+	reg read_test;
+	initial read_test = 0;
+
+	reg [`DATA_WIDTH1-1:0] expected;
+	initial expected = 0;
+
+	always @(posedge clk1) begin
+		expected <= (a | (a << 20) | 20'h55000) & {`DATA_WIDTH1{1'b1}};
+	end
+
+	wire error = ((a != 0) && read_test) ? dout !== expected : 0;
+
+	integer error_cnt = 0;
+	always @ (posedge clk1)
+	begin
+		if (error)
+			error_cnt <= error_cnt + 1'b1; 
+	end
+
+	initial #(50) begin
+		@(posedge clk0)
+		// Write data
+		for (a = 0; a < (1<<`ADDR_WIDTH0); a = a + ADDR_INCR) begin
+			@(negedge clk0) begin
+				din = a | (a << 20) | 20'h55000;
+				push = 1;
+			end
+			@(posedge clk0) begin
+				#(PERIOD/10) push = 0;
+			end
+		end
+		// Read data
+		read_test = 1;
+		for (a = 0; a < (1<<`ADDR_WIDTH1); a = a + ADDR_INCR) begin
+			@(posedge clk1) begin
+				#(PERIOD/10) pop = 0;
+				if ( dout !== expected) begin
+					$display("%d: FAIL: mismatch act=%x exp=%x at %x", $time, dout, expected, a);
+				end else begin
+					$display("%d: OK: act=%x exp=%x at %x", $time, dout, expected, a);
+				end
+			end
+			@(negedge clk1) begin
+				pop = 1;
+			end
+		end
+		done = 1'b1;
+	end
+
+	// Scan for simulation finish
+	always @(posedge clk1) begin
+		if (done)
+			$finish_and_return( (error_cnt == 0) ? 0 : -1 );
+	end
+
+	case (`STRINGIFY(`TOP))
+		"af1024x18_1024x18": begin
+			af1024x18_1024x18 #() afifo (
+				.DIN(din),
+				.PUSH(push),
+				.POP(pop),
+				.clock0(clk0),
+				.clock1(clk1),
+				.Async_Flush(flush),
+				.Almost_Full(almost_full),
+				.Almost_Empty(almost_empty),
+				.Full(full),
+				.Empty(empty),
+				.Full_Watermark(full_watermark),
+				.Empty_Watermark(empty_watermark),
+				.Overrun_Error(overrun_error),
+				.Underrun_Error(underrun_error),
+				.DOUT(dout)
+			);
+		end
+		"af1024x16_1024x16": begin
+			af1024x16_1024x16 #() afifo (
+				.DIN(din),
+				.PUSH(push),
+				.POP(pop),
+				.clock0(clk0),
+				.clock1(clk1),
+				.Async_Flush(flush),
+				.Almost_Full(almost_full),
+				.Almost_Empty(almost_empty),
+				.Full(full),
+				.Empty(empty),
+				.Full_Watermark(full_watermark),
+				.Empty_Watermark(empty_watermark),
+				.Overrun_Error(overrun_error),
+				.Underrun_Error(underrun_error),
+				.DOUT(dout)
+			);
+		end
+		"af2048x9_2048x9": begin
+			af2048x9_2048x9 #() afifo (
+				.DIN(din),
+				.PUSH(push),
+				.POP(pop),
+				.clock0(clk0),
+				.clock1(clk1),
+				.Async_Flush(flush),
+				.Almost_Full(almost_full),
+				.Almost_Empty(almost_empty),
+				.Full(full),
+				.Empty(empty),
+				.Full_Watermark(full_watermark),
+				.Empty_Watermark(empty_watermark),
+				.Overrun_Error(overrun_error),
+				.Underrun_Error(underrun_error),
+				.DOUT(dout)
+			);
+		end		
+		"af2048x8_2048x8": begin
+			af2048x8_2048x8 #() afifo (
+				.DIN(din),
+				.PUSH(push),
+				.POP(pop),
+				.clock0(clk0),
+				.clock1(clk1),
+				.Async_Flush(flush),
+				.Almost_Full(almost_full),
+				.Almost_Empty(almost_empty),
+				.Full(full),
+				.Empty(empty),
+				.Full_Watermark(full_watermark),
+				.Empty_Watermark(empty_watermark),
+				.Overrun_Error(overrun_error),
+				.Underrun_Error(underrun_error),
+				.DOUT(dout)
+			);
+		end	
+	endcase
+endmodule
diff --git a/ql-qlf-plugin/tests/qlf_k6n10f/bram18k_sdp/bram18k_sdp.tcl b/ql-qlf-plugin/tests/qlf_k6n10f/bram18k_sdp/bram18k_sdp.tcl
new file mode 100644
index 0000000..092d4c2
--- /dev/null
+++ b/ql-qlf-plugin/tests/qlf_k6n10f/bram18k_sdp/bram18k_sdp.tcl
@@ -0,0 +1,39 @@
+yosys -import
+
+if { [info procs ql-qlf-k6n10f] == {} } { plugin -i ql-qlf }
+yosys -import  ;
+
+read_verilog $::env(DESIGN_TOP).v
+design -save bram18k_sdp
+
+select spram_18x1024_2x
+select *
+synth_quicklogic -family qlf_k6n10f -top spram_18x1024_2x -bram_types
+opt_expr -undriven
+opt_clean
+stat
+write_verilog sim/spram_18x1024_2x_post_synth.v
+select -assert-count 2 t:TDP36K_BRAM_WR_X18_RD_X18_split
+
+select -clear
+design -load bram18k_sdp
+select spram_9x2048_x2
+select *
+synth_quicklogic -family qlf_k6n10f -top spram_9x2048_x2 -bram_types
+opt_expr -undriven
+opt_clean
+stat
+write_verilog sim/spram_9x2048_x2_post_synth.v
+select -assert-count 2 t:TDP36K_BRAM_WR_X9_RD_X9_split
+
+select -clear
+design -load bram18k_sdp
+select spram_9x2048_18x1024
+select *
+synth_quicklogic -family qlf_k6n10f -top spram_9x2048_18x1024 -bram_types
+opt_expr -undriven
+opt_clean
+stat
+write_verilog sim/spram_9x2048_18x1024_post_synth.v
+select -assert-count 1 t:TDP36K_BRAM_WR_X9_RD_X9_split
+select -assert-count 1 t:TDP36K_BRAM_WR_X18_RD_X18_split
\ No newline at end of file
diff --git a/ql-qlf-plugin/tests/qlf_k6n10f/bram18k_sdp/bram18k_sdp.v b/ql-qlf-plugin/tests/qlf_k6n10f/bram18k_sdp/bram18k_sdp.v
new file mode 100644
index 0000000..a8ea0a2
--- /dev/null
+++ b/ql-qlf-plugin/tests/qlf_k6n10f/bram18k_sdp/bram18k_sdp.v
@@ -0,0 +1,276 @@
+// Copyright 2020-2022 F4PGA Authors
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+// SPDX-License-Identifier: Apache-2.0
+
+module spram_18x1024_2x (   
+    WEN0_i,
+    REN0_i,
+    clock0,
+    WR_ADDR0_i,
+    RD_ADDR0_i,
+    WDATA0_i,
+    RDATA0_o,
+    
+    WEN1_i,
+    REN1_i,
+    clock1,
+    WR_ADDR1_i,
+    RD_ADDR1_i,
+    WDATA1_i,
+    RDATA1_o
+);
+
+parameter WR_ADDR_WIDTH0 = 10;
+parameter RD_ADDR_WIDTH0 = 10;
+parameter WR_DATA_WIDTH0 = 18;
+parameter RD_DATA_WIDTH0 = 18;
+parameter BE_WIDTH0 = 2;
+
+parameter WR_ADDR_WIDTH1 = 10;
+parameter RD_ADDR_WIDTH1 = 10;
+parameter WR_DATA_WIDTH1 = 18;
+parameter RD_DATA_WIDTH1 = 18;
+parameter BE_WIDTH1 = 2;
+
+input wire WEN0_i;
+input wire REN0_i;
+input wire clock0;
+input wire [WR_ADDR_WIDTH0-1 :0] WR_ADDR0_i;
+input wire [RD_ADDR_WIDTH0-1 :0] RD_ADDR0_i;
+input wire [WR_DATA_WIDTH0-1 :0] WDATA0_i;
+output wire [RD_DATA_WIDTH0-1 :0] RDATA0_o;
+
+input wire WEN1_i;
+input wire REN1_i;
+input wire clock1;
+input wire [WR_ADDR_WIDTH0-1 :0] WR_ADDR1_i;
+input wire [RD_ADDR_WIDTH0-1 :0] RD_ADDR1_i;
+input wire [WR_DATA_WIDTH0-1 :0] WDATA1_i;
+output wire [RD_DATA_WIDTH0-1 :0] RDATA1_o;
+
+
+RAM_18K_BLK #(
+              .WR_ADDR_WIDTH(WR_ADDR_WIDTH0),
+              .RD_ADDR_WIDTH(RD_ADDR_WIDTH0),
+              .WR_DATA_WIDTH(WR_DATA_WIDTH0),
+              .RD_DATA_WIDTH(RD_DATA_WIDTH0),
+              .BE_WIDTH(BE_WIDTH0)
+              ) spram_x18_inst1 (
+              
+              .WEN_i(WEN0_i),
+              .WR_BE_i(2'b11),
+              .REN_i(REN0_i),              
+              .WR_CLK_i(clock0),
+              .RD_CLK_i(clock0),
+              .WR_ADDR_i(WR_ADDR0_i),
+              .RD_ADDR_i(RD_ADDR0_i),
+              .WDATA_i(WDATA0_i),
+              .RDATA_o(RDATA0_o)
+              );
+              
+RAM_18K_BLK #(
+              .WR_ADDR_WIDTH(WR_ADDR_WIDTH1),
+              .RD_ADDR_WIDTH(RD_ADDR_WIDTH1),
+              .WR_DATA_WIDTH(WR_DATA_WIDTH1),
+              .RD_DATA_WIDTH(RD_DATA_WIDTH1),
+              .BE_WIDTH(BE_WIDTH1)
+              ) spram_x18_inst2 (
+              
+              .WEN_i(WEN1_i),
+              .WR_BE_i(2'b11),
+              .REN_i(REN1_i),              
+              .WR_CLK_i(clock1),
+              .RD_CLK_i(clock1),
+              .WR_ADDR_i(WR_ADDR1_i),
+              .RD_ADDR_i(RD_ADDR1_i),
+              .WDATA_i(WDATA1_i),
+              .RDATA_o(RDATA1_o)
+              );
+              
+endmodule    
+
+module spram_9x2048_x2 (
+    WEN0_i,
+    REN0_i,
+    clock0,
+    WR_ADDR0_i,
+    RD_ADDR0_i,
+    WDATA0_i,
+    RDATA0_o,
+    
+    WEN1_i,
+    REN1_i,
+    clock1,
+    WR_ADDR1_i,
+    RD_ADDR1_i,
+    WDATA1_i,
+    RDATA1_o
+);
+
+parameter WR_ADDR_WIDTH0 = 11;
+parameter RD_ADDR_WIDTH0 = 11;
+parameter WR_DATA_WIDTH0 = 9;
+parameter RD_DATA_WIDTH0 = 9;
+parameter BE_WIDTH0 = 1;
+
+parameter WR_ADDR_WIDTH1 = 11;
+parameter RD_ADDR_WIDTH1 = 11;
+parameter WR_DATA_WIDTH1 = 9;
+parameter RD_DATA_WIDTH1 = 9;
+parameter BE_WIDTH1 = 1;
+
+input wire WEN0_i;
+input wire REN0_i;
+input wire clock0;
+input wire [WR_ADDR_WIDTH0-1 :0] WR_ADDR0_i;
+input wire [RD_ADDR_WIDTH0-1 :0] RD_ADDR0_i;
+input wire [WR_DATA_WIDTH0-1 :0] WDATA0_i;
+output wire [RD_DATA_WIDTH0-1 :0] RDATA0_o;
+
+input wire WEN1_i;
+input wire REN1_i;
+input wire clock1;
+input wire [WR_ADDR_WIDTH1-1 :0] WR_ADDR1_i;
+input wire [RD_ADDR_WIDTH1-1 :0] RD_ADDR1_i;
+input wire [WR_DATA_WIDTH1-1 :0] WDATA1_i;
+output wire [RD_DATA_WIDTH1-1 :0] RDATA1_o;
+
+
+RAM_18K_BLK #(
+              .WR_ADDR_WIDTH(WR_ADDR_WIDTH0),
+              .RD_ADDR_WIDTH(RD_ADDR_WIDTH0),
+              .WR_DATA_WIDTH(WR_DATA_WIDTH0),
+              .RD_DATA_WIDTH(RD_DATA_WIDTH0),
+              .BE_WIDTH(BE_WIDTH0)
+              ) spram_x18_inst1 (
+              
+              .WEN_i(WEN0_i),
+              .WR_BE_i(2'b11),
+              .REN_i(REN0_i),              
+              .WR_CLK_i(clock0),
+              .RD_CLK_i(clock0),
+              .WR_ADDR_i(WR_ADDR0_i),
+              .RD_ADDR_i(RD_ADDR0_i),
+              .WDATA_i(WDATA0_i),
+              .RDATA_o(RDATA0_o)
+              );
+              
+RAM_18K_BLK #(
+              .WR_ADDR_WIDTH(WR_ADDR_WIDTH1),
+              .RD_ADDR_WIDTH(RD_ADDR_WIDTH1),
+              .WR_DATA_WIDTH(WR_DATA_WIDTH1),
+              .RD_DATA_WIDTH(RD_DATA_WIDTH1),
+              .BE_WIDTH(BE_WIDTH1)
+              ) spram_x18_inst2 (
+              
+              .WEN_i(WEN1_i),
+              .WR_BE_i(2'b11),
+              .REN_i(REN1_i),              
+              .WR_CLK_i(clock1),
+              .RD_CLK_i(clock1),
+              .WR_ADDR_i(WR_ADDR1_i),
+              .RD_ADDR_i(RD_ADDR1_i),
+              .WDATA_i(WDATA1_i),
+              .RDATA_o(RDATA1_o)
+              );
+              
+endmodule    
+
+module spram_9x2048_18x1024 (
+    WEN0_i,
+    REN0_i,
+    clock0,
+    WR_ADDR0_i,
+    RD_ADDR0_i,
+    WDATA0_i,
+    RDATA0_o,
+    
+    WEN1_i,
+    REN1_i,
+    clock1,
+    WR_ADDR1_i,
+    RD_ADDR1_i,
+    WDATA1_i,
+    RDATA1_o
+);
+
+parameter WR_ADDR_WIDTH0 = 11;
+parameter RD_ADDR_WIDTH0 = 11;
+parameter WR_DATA_WIDTH0 = 9;
+parameter RD_DATA_WIDTH0 = 9;
+parameter BE_WIDTH0 = 1;
+
+parameter WR_ADDR_WIDTH1 = 10;
+parameter RD_ADDR_WIDTH1 = 10;
+parameter WR_DATA_WIDTH1 = 18;
+parameter RD_DATA_WIDTH1 = 18;
+parameter BE_WIDTH1 = 2;
+
+input wire WEN0_i;
+input wire REN0_i;
+input wire clock0;
+input wire [WR_ADDR_WIDTH0-1 :0] WR_ADDR0_i;
+input wire [RD_ADDR_WIDTH0-1 :0] RD_ADDR0_i;
+input wire [WR_DATA_WIDTH0-1 :0] WDATA0_i;
+output wire [RD_DATA_WIDTH0-1 :0] RDATA0_o;
+
+input wire WEN1_i;
+input wire REN1_i;
+input wire clock1;
+input wire [WR_ADDR_WIDTH1-1 :0] WR_ADDR1_i;
+input wire [RD_ADDR_WIDTH1-1 :0] RD_ADDR1_i;
+input wire [WR_DATA_WIDTH1-1 :0] WDATA1_i;
+output wire [RD_DATA_WIDTH1-1 :0] RDATA1_o;
+
+
+RAM_18K_BLK #(
+              .WR_ADDR_WIDTH(WR_ADDR_WIDTH0),
+              .RD_ADDR_WIDTH(RD_ADDR_WIDTH0),
+              .WR_DATA_WIDTH(WR_DATA_WIDTH0),
+              .RD_DATA_WIDTH(RD_DATA_WIDTH0),
+              .BE_WIDTH(BE_WIDTH0)
+              ) spram_x18_inst1 (
+              
+              .WEN_i(WEN0_i),
+              .WR_BE_i(1'b1),
+              .REN_i(REN0_i),              
+              .WR_CLK_i(clock0),
+              .RD_CLK_i(clock0),
+              .WR_ADDR_i(WR_ADDR0_i),
+              .RD_ADDR_i(RD_ADDR0_i),
+              .WDATA_i(WDATA0_i),
+              .RDATA_o(RDATA0_o)
+              );
+              
+RAM_18K_BLK #(
+              .WR_ADDR_WIDTH(WR_ADDR_WIDTH1),
+              .RD_ADDR_WIDTH(RD_ADDR_WIDTH1),
+              .WR_DATA_WIDTH(WR_DATA_WIDTH1),
+              .RD_DATA_WIDTH(RD_DATA_WIDTH1),
+              .BE_WIDTH(BE_WIDTH1)
+              ) spram_x18_inst2 (
+              
+              .WEN_i(WEN1_i),
+              .WR_BE_i(2'b11),
+              .REN_i(REN1_i),              
+              .WR_CLK_i(clock1),
+              .RD_CLK_i(clock1),
+              .WR_ADDR_i(WR_ADDR1_i),
+              .RD_ADDR_i(RD_ADDR1_i),
+              .WDATA_i(WDATA1_i),
+              .RDATA_o(RDATA1_o)
+              );
+              
+endmodule    
\ No newline at end of file
diff --git a/ql-qlf-plugin/tests/qlf_k6n10f/bram18k_sdp/sim/Makefile b/ql-qlf-plugin/tests/qlf_k6n10f/bram18k_sdp/sim/Makefile
new file mode 100644
index 0000000..aeb9aec
--- /dev/null
+++ b/ql-qlf-plugin/tests/qlf_k6n10f/bram18k_sdp/sim/Makefile
@@ -0,0 +1,48 @@
+# Copyright 2020-2022 F4PGA Authors
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+# SPDX-License-Identifier: Apache-2.0
+
+TESTBENCH = bram18k_sdp_tb.v
+POST_SYNTH = spram_18x1024_2x_post_synth spram_9x2048_x2_post_synth spram_9x2048_18x1024_post_synth
+ADDR_WIDTH0 = 10 11 11
+DATA_WIDTH0 = 18 9 9
+ADDR_WIDTH1 = 10 11 10
+DATA_WIDTH1 = 18 9 18
+TOP = spram_18x1024_2x spram_9x2048_x2 spram_9x2048_18x1024
+ADDR0_DEFINES = $(foreach awidth0, $(ADDR_WIDTH0),-DADDR_WIDTH0="$(awidth0)")
+ADDR1_DEFINES = $(foreach awidth1, $(ADDR_WIDTH1),-DADDR_WIDTH1="$(awidth1)")
+DATA0_DEFINES = $(foreach dwidth0, $(DATA_WIDTH0),-DDATA_WIDTH0="$(dwidth0)")
+DATA1_DEFINES = $(foreach dwidth1, $(DATA_WIDTH1),-DDATA_WIDTH1="$(dwidth1)")
+TOP_DEFINES = $(foreach top, $(TOP),-DTOP="$(top)")
+VCD_DEFINES = $(foreach vcd, $(POST_SYNTH),-DVCD="$(vcd).vcd")
+
+SIM_LIBS = $(shell find ../../../../qlf_k6n10f -name "*.v" -not -name "*_map.v")
+
+define simulate_post_synth
+	@iverilog  -vvvv -g2005 $(word $(1),$(ADDR0_DEFINES)) $(word $(1),$(ADDR1_DEFINES)) $(word $(1),$(DATA0_DEFINES)) $(word $(1),$(DATA1_DEFINES)) $(word $(1),$(TOP_DEFINES)) $(word $(1),$(VCD_DEFINES)) -o $(word $(1),$(POST_SYNTH)).vvp $(word $(1),$(POST_SYNTH)).v $(SIM_LIBS) $(TESTBENCH) > $(word $(1),$(POST_SYNTH)).vvp.log 2>&1
+	@vvp -vvvv $(word $(1),$(POST_SYNTH)).vvp > $(word $(1),$(POST_SYNTH)).vcd.log 2>&1
+endef
+
+define clean_post_synth_sim
+	@rm -rf  $(word $(1),$(POST_SYNTH)).vcd $(word $(1),$(POST_SYNTH)).vvp $(word $(1),$(POST_SYNTH)).vvp.log $(word $(1),$(POST_SYNTH)).vcd.log
+endef
+
+sim:
+	$(call simulate_post_synth,1)
+	$(call clean_post_synth_sim,1)
+	$(call simulate_post_synth,2)
+	$(call clean_post_synth_sim,2)
+	$(call simulate_post_synth,3)
+	$(call clean_post_synth_sim,3)
\ No newline at end of file
diff --git a/ql-qlf-plugin/tests/qlf_k6n10f/bram18k_sdp/sim/bram18k_sdp_tb.v b/ql-qlf-plugin/tests/qlf_k6n10f/bram18k_sdp/sim/bram18k_sdp_tb.v
new file mode 100644
index 0000000..8d91922
--- /dev/null
+++ b/ql-qlf-plugin/tests/qlf_k6n10f/bram18k_sdp/sim/bram18k_sdp_tb.v
@@ -0,0 +1,230 @@
+// Copyright 2020-2022 F4PGA Authors
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//		 http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+// SPDX-License-Identifier: Apache-2.0
+
+`timescale 1ns/1ps
+
+`define STRINGIFY(x) `"x`"
+
+module TB;
+	localparam PERIOD = 50;
+	localparam ADDR_INCR = 1;
+
+	reg clk_0;
+	reg rce_0;
+	reg [`ADDR_WIDTH0-1:0] ra_0;
+	wire [`DATA_WIDTH0-1:0] rq_0;
+	reg wce_0;
+	reg [`ADDR_WIDTH0-1:0] wa_0;
+	reg [`DATA_WIDTH0-1:0] wd_0;
+
+	reg clk_1;
+	reg rce_1;
+	reg [`ADDR_WIDTH1-1:0] ra_1;
+	wire [`DATA_WIDTH1-1:0] rq_1;
+	reg wce_1;
+	reg [`ADDR_WIDTH1-1:0] wa_1;
+	reg [`DATA_WIDTH1-1:0] wd_1;
+
+
+	initial clk_0 = 0;
+	initial clk_1 = 0;
+	initial ra_0 = 0;
+	initial ra_1 = 0;
+	initial rce_0 = 0;
+	initial rce_1 = 0;
+	initial forever #(PERIOD / 2.0) clk_0 = ~clk_0;
+	initial begin
+		#(PERIOD / 4.0);
+		forever #(PERIOD / 2.0) clk_1 = ~clk_1;
+	end
+	initial begin
+		$dumpfile(`STRINGIFY(`VCD));
+		$dumpvars;
+	end
+
+	integer a;
+	integer b;
+
+	reg done_0;
+	reg done_1;
+	initial done_0 = 1'b0;
+	initial done_1 = 1'b0;
+	wire done_sim = done_0 & done_1;
+
+	reg [`DATA_WIDTH0-1:0] expected_0;
+	reg [`DATA_WIDTH1-1:0] expected_1;
+
+	reg read_test_0;
+	reg read_test_1;
+	initial read_test_0 = 0;
+	initial read_test_1 = 0;
+
+	always @(posedge clk_0) begin
+		expected_0 <= (a | (a << 20) | 20'h55000) & {`DATA_WIDTH0{1'b1}};
+	end
+	always @(posedge clk_1) begin
+		expected_1 <= ((b+1) | ((b+1) << 20) | 20'h55000) & {`DATA_WIDTH1{1'b1}};
+	end
+
+	wire error_0 = ((a != 0) && read_test_0) ? (rq_0 !== expected_0) : 0;
+	wire error_1 = ((b != (1<<`ADDR_WIDTH1) / 2) && read_test_1) ? (rq_1 !== expected_1) : 0;
+
+	integer error_0_cnt = 0;
+	integer error_1_cnt = 0;
+
+	always @ (posedge clk_0)
+	begin
+		if (error_0)
+			error_0_cnt <= error_0_cnt + 1'b1;
+	end
+	always @ (posedge clk_1)
+	begin
+		if (error_1)
+			error_1_cnt <= error_1_cnt + 1'b1;
+	end
+
+	// PART 0
+	initial #(1) begin
+		// Write data
+		for (a = 0; a < (1<<`ADDR_WIDTH0) / 2; a = a + ADDR_INCR) begin
+			@(negedge clk_0) begin
+				wa_0 = a;
+				wd_0 = a | (a << 20) | 20'h55000;
+				wce_0 = 1;
+			end
+			@(posedge clk_0) begin
+				#(PERIOD/10) wce_0 = 0;
+			end
+		end
+		// Read data
+		read_test_0 = 1;
+		for (a = 0; a < (1<<`ADDR_WIDTH0) / 2; a = a + ADDR_INCR) begin
+			@(negedge clk_0) begin
+				ra_0 = a;
+				rce_0 = 1;
+			end
+			@(posedge clk_0) begin
+				#(PERIOD/10) rce_0 = 0;
+				if ( rq_0 !== expected_0) begin
+					$display("%d: PORT 0: FAIL: mismatch act=%x exp=%x at %x", $time, rq_0, expected_0, a);
+				end else begin
+					$display("%d: PORT 0: OK: act=%x exp=%x at %x", $time, rq_0, expected_0, a);
+				end
+			end
+		end
+		done_0 = 1'b1;
+		a = 0;
+	end
+
+	// PART 1
+	initial #(1) begin
+		// Write data
+		for (b = (1<<`ADDR_WIDTH1) / 2; b < (1<<`ADDR_WIDTH1); b = b + ADDR_INCR) begin
+			@(negedge clk_1) begin
+				wa_1 = b;
+				wd_1 = (b+1) | ((b+1) << 20) | 20'h55000;
+				wce_1 = 1;
+			end
+			@(posedge clk_1) begin
+				#(PERIOD/10) wce_1 = 0;
+			end
+		end
+		// Read data
+		read_test_1 = 1;
+		for (b = (1<<`ADDR_WIDTH1) / 2; b < (1<<`ADDR_WIDTH1); b = b + ADDR_INCR) begin
+			@(negedge clk_1) begin
+				ra_1 = b;
+				rce_1 = 1;
+			end
+			@(posedge clk_1) begin
+				#(PERIOD/10) rce_1 = 0;
+				if ( rq_1 !== expected_1) begin
+					$display("%d: PORT 1: FAIL: mismatch act=%x exp=%x at %x", $time, rq_1, expected_1, b);
+				end else begin
+					$display("%d: PORT 1: OK: act=%x exp=%x at %x", $time, rq_1, expected_1, b);
+				end
+			end
+		end
+		done_1 = 1'b1;
+		b = (1<<`ADDR_WIDTH1) / 2;
+	end
+
+	// Scan for simulation finish
+	always @(posedge clk_0, posedge clk_1) begin
+		if (done_sim)
+			$finish_and_return( (error_0_cnt == 0 & error_1_cnt == 0) ? 0 : -1 );
+	end
+
+	case (`STRINGIFY(`TOP))
+		"spram_18x1024_2x": begin
+			spram_18x1024_2x #() bram (
+				.clock0(clk_0),
+				.REN0_i(rce_0),
+				.RD_ADDR0_i(ra_0),
+				.RDATA0_o(rq_0),
+				.WEN0_i(wce_0),
+				.WR_ADDR0_i(wa_0),
+				.WDATA0_i(wd_0),
+
+				.clock1(clk_1),
+				.REN1_i(rce_1),
+				.RD_ADDR1_i(ra_1),
+				.RDATA1_o(rq_1),
+				.WEN1_i(wce_1),
+				.WR_ADDR1_i(wa_1),
+				.WDATA1_i(wd_1)
+			);
+		end
+		"spram_9x2048_x2": begin
+			spram_9x2048_x2 #() bram (
+				.clock0(clk_0),
+				.REN0_i(rce_0),
+				.RD_ADDR0_i(ra_0),
+				.RDATA0_o(rq_0),
+				.WEN0_i(wce_0),
+				.WR_ADDR0_i(wa_0),
+				.WDATA0_i(wd_0),
+
+				.clock1(clk_1),
+				.REN1_i(rce_1),
+				.RD_ADDR1_i(ra_1),
+				.RDATA1_o(rq_1),
+				.WEN1_i(wce_1),
+				.WR_ADDR1_i(wa_1),
+				.WDATA1_i(wd_1)
+			);
+		end
+		"spram_9x2048_18x1024": begin
+			spram_9x2048_18x1024 #() bram (
+				.clock0(clk_0),
+				.REN0_i(rce_0),
+				.RD_ADDR0_i(ra_0),
+				.RDATA0_o(rq_0),
+				.WEN0_i(wce_0),
+				.WR_ADDR0_i(wa_0),
+				.WDATA0_i(wd_0),
+
+				.clock1(clk_1),
+				.REN1_i(rce_1),
+				.RD_ADDR1_i(ra_1),
+				.RDATA1_o(rq_1),
+				.WEN1_i(wce_1),
+				.WR_ADDR1_i(wa_1),
+				.WDATA1_i(wd_1)
+			);
+		end
+	endcase
+endmodule
diff --git a/ql-qlf-plugin/tests/qlf_k6n10f/bram18k_sfifo/bram18k_sfifo.tcl b/ql-qlf-plugin/tests/qlf_k6n10f/bram18k_sfifo/bram18k_sfifo.tcl
new file mode 100644
index 0000000..a5ff276
--- /dev/null
+++ b/ql-qlf-plugin/tests/qlf_k6n10f/bram18k_sfifo/bram18k_sfifo.tcl
@@ -0,0 +1,49 @@
+yosys -import
+
+if { [info procs ql-qlf-k6n10f] == {} } { plugin -i ql-qlf }
+yosys -import  ;
+
+read_verilog $::env(DESIGN_TOP).v
+design -save bram18k_sfifo
+
+select f1024x18_1024x18
+select *
+synth_quicklogic -family qlf_k6n10f -top f1024x18_1024x18 -bram_types
+opt_expr -undriven
+opt_clean
+stat
+write_verilog sim/f1024x18_1024x18_post_synth.v
+select -assert-count 1 t:TDP36K_FIFO_SYNC_WR_X18_RD_X18_split
+
+select -clear
+design -load bram18k_sfifo
+select f1024x16_1024x16
+select *
+synth_quicklogic -family qlf_k6n10f -top f1024x16_1024x16 -bram_types
+opt_expr -undriven
+opt_clean
+stat
+write_verilog sim/f1024x16_1024x16_post_synth.v
+select -assert-count 1 t:TDP36K_FIFO_SYNC_WR_X18_RD_X18_split
+
+select -clear
+design -load bram18k_sfifo
+select f2048x9_2048x9
+select *
+synth_quicklogic -family qlf_k6n10f -top f2048x9_2048x9 -bram_types
+opt_expr -undriven
+opt_clean
+stat
+write_verilog sim/f2048x9_2048x9_post_synth.v
+select -assert-count 1 t:TDP36K_FIFO_SYNC_WR_X9_RD_X9_split
+
+select -clear
+design -load bram18k_sfifo
+select f2048x8_2048x8
+select *
+synth_quicklogic -family qlf_k6n10f -top f2048x8_2048x8 -bram_types
+opt_expr -undriven
+opt_clean
+stat
+write_verilog sim/f2048x8_2048x8_post_synth.v
+select -assert-count 1 t:TDP36K_FIFO_SYNC_WR_X9_RD_X9_split
diff --git a/ql-qlf-plugin/tests/qlf_k6n10f/bram18k_sfifo/bram18k_sfifo.v b/ql-qlf-plugin/tests/qlf_k6n10f/bram18k_sfifo/bram18k_sfifo.v
new file mode 100644
index 0000000..c559134
--- /dev/null
+++ b/ql-qlf-plugin/tests/qlf_k6n10f/bram18k_sfifo/bram18k_sfifo.v
@@ -0,0 +1,175 @@
+// Copyright 2020-2022 F4PGA Authors
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+// SPDX-License-Identifier: Apache-2.0
+
+module f1024x18_1024x18 (DIN,PUSH,POP,clock0,Async_Flush,Almost_Full,Almost_Empty,Full,Empty,Full_Watermark,Empty_Watermark,Overrun_Error,Underrun_Error,DOUT);
+
+parameter WR_DATA_WIDTH = 18;
+parameter RD_DATA_WIDTH = 18;
+parameter UPAE_DBITS = 11'd10;
+parameter UPAF_DBITS = 11'd10;
+
+input clock0;
+input PUSH,POP;
+input [WR_DATA_WIDTH-1:0] DIN;
+input Async_Flush;
+output [RD_DATA_WIDTH-1:0] DOUT;
+output Almost_Full,Almost_Empty;
+output Full, Empty;
+output Full_Watermark, Empty_Watermark;
+output Overrun_Error, Underrun_Error;
+
+SFIFO_18K_BLK  # (.WR_DATA_WIDTH(WR_DATA_WIDTH),.RD_DATA_WIDTH(RD_DATA_WIDTH),.UPAE_DBITS(UPAE_DBITS),.UPAF_DBITS(UPAF_DBITS)
+                  )
+  FIFO_INST    (
+                .DIN(DIN),
+                .PUSH(PUSH),
+                .POP(POP),
+                .CLK(clock0),
+                .Async_Flush(Async_Flush),
+                
+                .Overrun_Error(Overrun_Error),
+                .Full_Watermark(Full_Watermark),
+                .Almost_Full(Almost_Full),
+                .Full(Full),
+                
+                .Underrun_Error(Underrun_Error),
+                .Empty_Watermark(Empty_Watermark),
+                .Almost_Empty(Almost_Empty),
+                .Empty(Empty),
+
+                .DOUT(DOUT)
+                );
+endmodule
+
+module f1024x16_1024x16 (DIN,PUSH,POP,clock0,Async_Flush,Almost_Full,Almost_Empty,Full,Empty,Full_Watermark,Empty_Watermark,Overrun_Error,Underrun_Error,DOUT);
+
+parameter WR_DATA_WIDTH = 16;
+parameter RD_DATA_WIDTH = 16;
+parameter UPAE_DBITS = 11'd10;
+parameter UPAF_DBITS = 11'd10;
+
+input clock0;
+input PUSH,POP;
+input [WR_DATA_WIDTH-1:0] DIN;
+input Async_Flush;
+output [RD_DATA_WIDTH-1:0] DOUT;
+output Almost_Full,Almost_Empty;
+output Full, Empty;
+output Full_Watermark, Empty_Watermark;
+output Overrun_Error, Underrun_Error;
+
+SFIFO_18K_BLK  # (.WR_DATA_WIDTH(WR_DATA_WIDTH),.RD_DATA_WIDTH(RD_DATA_WIDTH),.UPAE_DBITS(UPAE_DBITS),.UPAF_DBITS(UPAF_DBITS)
+                  )
+  FIFO_INST    (
+                .DIN(DIN),
+                .PUSH(PUSH),
+                .POP(POP),
+                .CLK(clock0),
+                .Async_Flush(Async_Flush),
+                
+                .Overrun_Error(Overrun_Error),
+                .Full_Watermark(Full_Watermark),
+                .Almost_Full(Almost_Full),
+                .Full(Full),
+                
+                .Underrun_Error(Underrun_Error),
+                .Empty_Watermark(Empty_Watermark),
+                .Almost_Empty(Almost_Empty),
+                .Empty(Empty),
+
+                .DOUT(DOUT)
+                );
+endmodule
+
+module f2048x9_2048x9 (DIN,PUSH,POP,clock0,Async_Flush,Almost_Full,Almost_Empty,Full,Empty,Full_Watermark,Empty_Watermark,Overrun_Error,Underrun_Error,DOUT);
+
+parameter WR_DATA_WIDTH = 9;
+parameter RD_DATA_WIDTH = 9;
+parameter UPAE_DBITS = 11'd10;
+parameter UPAF_DBITS = 11'd10;
+
+input clock0;
+input PUSH,POP;
+input [WR_DATA_WIDTH-1:0] DIN;
+input Async_Flush;
+output [RD_DATA_WIDTH-1:0] DOUT;
+output Almost_Full,Almost_Empty;
+output Full, Empty;
+output Full_Watermark, Empty_Watermark;
+output Overrun_Error, Underrun_Error;
+
+SFIFO_18K_BLK  # (.WR_DATA_WIDTH(WR_DATA_WIDTH),.RD_DATA_WIDTH(RD_DATA_WIDTH),.UPAE_DBITS(UPAE_DBITS),.UPAF_DBITS(UPAF_DBITS)
+                  )
+  FIFO_INST    (
+                .DIN(DIN),
+                .PUSH(PUSH),
+                .POP(POP),
+                .CLK(clock0),
+                .Async_Flush(Async_Flush),
+                
+                .Overrun_Error(Overrun_Error),
+                .Full_Watermark(Full_Watermark),
+                .Almost_Full(Almost_Full),
+                .Full(Full),
+                
+                .Underrun_Error(Underrun_Error),
+                .Empty_Watermark(Empty_Watermark),
+                .Almost_Empty(Almost_Empty),
+                .Empty(Empty),
+
+                .DOUT(DOUT)
+                );
+endmodule
+
+module f2048x8_2048x8 (DIN,PUSH,POP,clock0,Async_Flush,Almost_Full,Almost_Empty,Full,Empty,Full_Watermark,Empty_Watermark,Overrun_Error,Underrun_Error,DOUT);
+
+parameter WR_DATA_WIDTH = 8;
+parameter RD_DATA_WIDTH = 8;
+parameter UPAE_DBITS = 11'd10;
+parameter UPAF_DBITS = 11'd10;
+
+input clock0;
+input PUSH,POP;
+input [WR_DATA_WIDTH-1:0] DIN;
+input Async_Flush;
+output [RD_DATA_WIDTH-1:0] DOUT;
+output Almost_Full,Almost_Empty;
+output Full, Empty;
+output Full_Watermark, Empty_Watermark;
+output Overrun_Error, Underrun_Error;
+
+SFIFO_18K_BLK  # (.WR_DATA_WIDTH(WR_DATA_WIDTH),.RD_DATA_WIDTH(RD_DATA_WIDTH),.UPAE_DBITS(UPAE_DBITS),.UPAF_DBITS(UPAF_DBITS)
+                  )
+  FIFO_INST    (
+                .DIN(DIN),
+                .PUSH(PUSH),
+                .POP(POP),
+                .CLK(clock0),
+                .Async_Flush(Async_Flush),
+                
+                .Overrun_Error(Overrun_Error),
+                .Full_Watermark(Full_Watermark),
+                .Almost_Full(Almost_Full),
+                .Full(Full),
+                
+                .Underrun_Error(Underrun_Error),
+                .Empty_Watermark(Empty_Watermark),
+                .Almost_Empty(Almost_Empty),
+                .Empty(Empty),
+
+                .DOUT(DOUT)
+                );
+endmodule
\ No newline at end of file
diff --git a/ql-qlf-plugin/tests/qlf_k6n10f/bram18k_sfifo/sim/Makefile b/ql-qlf-plugin/tests/qlf_k6n10f/bram18k_sfifo/sim/Makefile
new file mode 100644
index 0000000..86a1b10
--- /dev/null
+++ b/ql-qlf-plugin/tests/qlf_k6n10f/bram18k_sfifo/sim/Makefile
@@ -0,0 +1,50 @@
+# Copyright 2020-2022 F4PGA Authors
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+# SPDX-License-Identifier: Apache-2.0
+
+TESTBENCH = bram18k_sfifo_tb.v
+POST_SYNTH = f1024x18_1024x18_post_synth f1024x16_1024x16_post_synth f2048x9_2048x9_post_synth f2048x8_2048x8_post_synth
+ADDR_WIDTH0 = 10 10 11 11
+DATA_WIDTH0 = 18 16 9 8
+ADDR_WIDTH1 = 10 10 11 11
+DATA_WIDTH1 = 18 16 9 8
+TOP = f1024x18_1024x18 f1024x16_1024x16 f2048x9_2048x9 f2048x8_2048x8
+ADDR0_DEFINES = $(foreach awidth0, $(ADDR_WIDTH0),-DADDR_WIDTH0="$(awidth0)")
+ADDR1_DEFINES = $(foreach awidth1, $(ADDR_WIDTH1),-DADDR_WIDTH1="$(awidth1)")
+DATA0_DEFINES = $(foreach dwidth0, $(DATA_WIDTH0),-DDATA_WIDTH0="$(dwidth0)")
+DATA1_DEFINES = $(foreach dwidth1, $(DATA_WIDTH1),-DDATA_WIDTH1="$(dwidth1)")
+TOP_DEFINES = $(foreach top, $(TOP),-DTOP="$(top)")
+VCD_DEFINES = $(foreach vcd, $(POST_SYNTH),-DVCD="$(vcd).vcd")
+
+SIM_LIBS = $(shell find ../../../../qlf_k6n10f -name "*.v" -not -name "*_map.v")
+
+define simulate_post_synth
+	@iverilog  -vvvv -g2005 $(word $(1),$(ADDR0_DEFINES)) $(word $(1),$(ADDR1_DEFINES)) $(word $(1),$(DATA0_DEFINES)) $(word $(1),$(DATA1_DEFINES)) $(word $(1),$(TOP_DEFINES)) $(word $(1),$(VCD_DEFINES)) -o $(word $(1),$(POST_SYNTH)).vvp $(word $(1),$(POST_SYNTH)).v $(SIM_LIBS) $(TESTBENCH) > $(word $(1),$(POST_SYNTH)).vvp.log 2>&1
+	@vvp -vvvv $(word $(1),$(POST_SYNTH)).vvp > $(word $(1),$(POST_SYNTH)).vcd.log 2>&1
+endef
+
+define clean_post_synth_sim
+	@rm -rf  $(word $(1),$(POST_SYNTH)).vcd $(word $(1),$(POST_SYNTH)).vvp $(word $(1),$(POST_SYNTH)).vvp.log $(word $(1),$(POST_SYNTH)).vcd.log
+endef
+
+sim:
+	$(call simulate_post_synth,1)
+	$(call clean_post_synth_sim,1)
+	$(call simulate_post_synth,2)
+	$(call clean_post_synth_sim,2)
+	$(call simulate_post_synth,3)
+	$(call clean_post_synth_sim,3)
+	$(call simulate_post_synth,4)
+	$(call clean_post_synth_sim,4)
\ No newline at end of file
diff --git a/ql-qlf-plugin/tests/qlf_k6n10f/bram18k_sfifo/sim/bram18k_sfifo_tb.v b/ql-qlf-plugin/tests/qlf_k6n10f/bram18k_sfifo/sim/bram18k_sfifo_tb.v
new file mode 100644
index 0000000..579d881
--- /dev/null
+++ b/ql-qlf-plugin/tests/qlf_k6n10f/bram18k_sfifo/sim/bram18k_sfifo_tb.v
@@ -0,0 +1,188 @@
+// Copyright 2020-2022 F4PGA Authors
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//		 http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+// SPDX-License-Identifier: Apache-2.0
+
+`timescale 1ns/1ps
+
+`define STRINGIFY(x) `"x`"
+
+module TB;
+	localparam PERIOD = 30;
+	localparam ADDR_INCR = 1;
+
+	reg clk;
+	reg flush;
+	reg pop;
+	wire [`DATA_WIDTH1-1:0] dout;
+	reg push;
+	reg [`DATA_WIDTH0-1:0] din;
+	wire almost_full,almost_empty;
+	wire full, empty;
+	wire full_watermark, empty_watermark;
+	wire overrun_error, underrun_error;
+
+	initial 
+	begin
+		clk = 0;
+		pop = 0;
+		push = 0;
+		flush = 1;
+		din = 0;
+		#40
+		flush = 0;
+	end
+	
+	initial forever #(PERIOD / 3.0) clk = ~clk;
+	
+	initial begin
+		$dumpfile(`STRINGIFY(`VCD));
+		$dumpvars;
+	end
+
+	integer a;
+
+	reg done;
+	initial done = 1'b0;
+	
+	reg read_test;
+	initial read_test = 0;
+
+	reg [`DATA_WIDTH1-1:0] expected;
+	initial expected = 0;
+
+	always @(posedge clk) begin
+		expected <= (a | (a << 20) | 20'h55000) & {`DATA_WIDTH1{1'b1}};
+	end
+
+	wire error = ((a != 0) && read_test) ? dout !== expected : 0;
+
+	integer error_cnt = 0;
+	always @ (posedge clk)
+	begin
+		if (error)
+			error_cnt <= error_cnt + 1'b1; 
+	end
+
+	initial #(50) begin
+		@(posedge clk)
+		// Write data
+		for (a = 0; a < (1<<`ADDR_WIDTH0); a = a + ADDR_INCR) begin
+			@(negedge clk) begin
+				din = a | (a << 20) | 20'h55000;
+				push = 1;
+			end
+			@(posedge clk) begin
+				#(PERIOD/10) push = 0;
+			end
+		end
+		// Read data
+		read_test = 1;
+		for (a = 0; a < (1<<`ADDR_WIDTH1); a = a + ADDR_INCR) begin
+			@(posedge clk) begin
+				#(PERIOD/10) pop = 0;
+				if ( dout !== expected) begin
+					$display("%d: FAIL: mismatch act=%x exp=%x at %x", $time, dout, expected, a);
+				end else begin
+					$display("%d: OK: act=%x exp=%x at %x", $time, dout, expected, a);
+				end
+			end
+			@(negedge clk) begin
+				pop = 1;
+			end
+		end
+		done = 1'b1;
+	end
+
+	// Scan for simulation finish
+	always @(posedge clk) begin
+		if (done)
+			$finish_and_return( (error_cnt == 0) ? 0 : -1 );
+	end
+
+	case (`STRINGIFY(`TOP))
+		"f1024x18_1024x18": begin
+			f1024x18_1024x18 #() afifo (
+				.DIN(din),
+				.PUSH(push),
+				.POP(pop),
+				.clock0(clk),
+				.Async_Flush(flush),
+				.Almost_Full(almost_full),
+				.Almost_Empty(almost_empty),
+				.Full(full),
+				.Empty(empty),
+				.Full_Watermark(full_watermark),
+				.Empty_Watermark(empty_watermark),
+				.Overrun_Error(overrun_error),
+				.Underrun_Error(underrun_error),
+				.DOUT(dout)
+			);
+		end
+		"f1024x16_1024x16": begin
+			f1024x16_1024x16 #() afifo (
+				.DIN(din),
+				.PUSH(push),
+				.POP(pop),
+				.clock0(clk),
+				.Async_Flush(flush),
+				.Almost_Full(almost_full),
+				.Almost_Empty(almost_empty),
+				.Full(full),
+				.Empty(empty),
+				.Full_Watermark(full_watermark),
+				.Empty_Watermark(empty_watermark),
+				.Overrun_Error(overrun_error),
+				.Underrun_Error(underrun_error),
+				.DOUT(dout)
+			);
+		end
+		"f2048x9_2048x9": begin
+			f2048x9_2048x9 #() afifo (
+				.DIN(din),
+				.PUSH(push),
+				.POP(pop),
+				.clock0(clk),
+				.Async_Flush(flush),
+				.Almost_Full(almost_full),
+				.Almost_Empty(almost_empty),
+				.Full(full),
+				.Empty(empty),
+				.Full_Watermark(full_watermark),
+				.Empty_Watermark(empty_watermark),
+				.Overrun_Error(overrun_error),
+				.Underrun_Error(underrun_error),
+				.DOUT(dout)
+			);
+		end	
+		"f2048x8_2048x8": begin
+			f2048x8_2048x8 #() afifo (
+				.DIN(din),
+				.PUSH(push),
+				.POP(pop),
+				.clock0(clk),
+				.Async_Flush(flush),
+				.Almost_Full(almost_full),
+				.Almost_Empty(almost_empty),
+				.Full(full),
+				.Empty(empty),
+				.Full_Watermark(full_watermark),
+				.Empty_Watermark(empty_watermark),
+				.Overrun_Error(overrun_error),
+				.Underrun_Error(underrun_error),
+				.DOUT(dout)
+			);
+		end			
+	endcase
+endmodule
diff --git a/ql-qlf-plugin/tests/qlf_k6n10f/bram18k_tdp/bram18k_tdp.tcl b/ql-qlf-plugin/tests/qlf_k6n10f/bram18k_tdp/bram18k_tdp.tcl
new file mode 100644
index 0000000..e42cd16
--- /dev/null
+++ b/ql-qlf-plugin/tests/qlf_k6n10f/bram18k_tdp/bram18k_tdp.tcl
@@ -0,0 +1,39 @@
+yosys -import
+
+if { [info procs ql-qlf-k6n10f] == {} } { plugin -i ql-qlf }
+yosys -import  ;
+
+read_verilog $::env(DESIGN_TOP).v
+design -save bram18k_tdp
+
+select dpram_18x1024_x2
+select *
+synth_quicklogic -family qlf_k6n10f -top dpram_18x1024_x2 -bram_types
+opt_expr -undriven
+opt_clean
+stat
+write_verilog sim/dpram_18x1024_x2_post_synth.v
+select -assert-count 2 t:TDP36K_BRAM_WR_X18_RD_X18_split
+
+select -clear
+design -load bram18k_tdp
+select dpram_9x2048_x2
+select *
+synth_quicklogic -family qlf_k6n10f -top dpram_9x2048_x2 -bram_types
+opt_expr -undriven
+opt_clean
+stat
+write_verilog sim/dpram_9x2048_x2_post_synth.v
+select -assert-count 2 t:TDP36K_BRAM_WR_X9_RD_X9_split
+
+select -clear
+design -load bram18k_tdp
+select dpram_18x1024_9x2048
+select *
+synth_quicklogic -family qlf_k6n10f -top dpram_18x1024_9x2048 -bram_types
+opt_expr -undriven
+opt_clean
+stat
+write_verilog sim/dpram_18x1024_9x2048_post_synth.v
+select -assert-count 1 t:TDP36K_BRAM_WR_X18_RD_X18_split
+select -assert-count 1 t:TDP36K_BRAM_WR_X9_RD_X9_split
diff --git a/ql-qlf-plugin/tests/qlf_k6n10f/bram18k_tdp/bram18k_tdp.v b/ql-qlf-plugin/tests/qlf_k6n10f/bram18k_tdp/bram18k_tdp.v
new file mode 100644
index 0000000..5151eeb
--- /dev/null
+++ b/ql-qlf-plugin/tests/qlf_k6n10f/bram18k_tdp/bram18k_tdp.v
@@ -0,0 +1,396 @@
+// Copyright 2020-2022 F4PGA Authors
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+// SPDX-License-Identifier: Apache-2.0
+
+module dpram_18x1024_x2 (   
+    clk_a_0,
+    WEN_a_0,
+    REN_a_0,
+    WR_ADDR_a_0,
+    RD_ADDR_a_0,
+    WDATA_a_0,
+    RDATA_a_0,
+    
+    clk_b_0,
+    WEN_b_0,
+    REN_b_0,
+    WR_ADDR_b_0,
+    RD_ADDR_b_0,
+    WDATA_b_0,
+    RDATA_b_0,
+    
+    clk_a_1,
+    WEN_a_1,
+    REN_a_1,
+    WR_ADDR_a_1,
+    RD_ADDR_a_1,
+    WDATA_a_1,
+    RDATA_a_1,
+    
+    clk_b_1,
+    WEN_b_1,
+    REN_b_1,
+    WR_ADDR_b_1,
+    RD_ADDR_b_1,
+    WDATA_b_1,
+    RDATA_b_1
+);
+
+parameter ADDR_WIDTH0 = 10;
+parameter DATA_WIDTH0 = 18;
+parameter BE1_WIDTH0 = 2;
+parameter BE2_WIDTH0 = 2;
+
+parameter ADDR_WIDTH1 = 10;
+parameter DATA_WIDTH1 = 18;
+parameter BE1_WIDTH1 = 2;
+parameter BE2_WIDTH1 = 2;
+
+input wire clk_a_0;
+input wire WEN_a_0;
+input wire REN_a_0;
+input wire [ADDR_WIDTH0-1 :0] WR_ADDR_a_0;
+input wire [ADDR_WIDTH0-1 :0] RD_ADDR_a_0;
+input wire [DATA_WIDTH0-1 :0] WDATA_a_0;
+output wire [DATA_WIDTH0-1 :0] RDATA_a_0;
+
+input wire clk_b_0;
+input wire WEN_b_0;
+input wire REN_b_0;
+input wire [ADDR_WIDTH0-1 :0] WR_ADDR_b_0;
+input wire [ADDR_WIDTH0-1 :0] RD_ADDR_b_0;
+input wire [DATA_WIDTH0-1 :0] WDATA_b_0;
+output wire [DATA_WIDTH0-1 :0] RDATA_b_0;
+
+input wire clk_a_1;
+input wire WEN_a_1;
+input wire REN_a_1;
+input wire [ADDR_WIDTH1-1 :0] WR_ADDR_a_1;
+input wire [ADDR_WIDTH1-1 :0] RD_ADDR_a_1;
+input wire [DATA_WIDTH1-1 :0] WDATA_a_1;
+output wire [DATA_WIDTH1-1 :0] RDATA_a_1;
+
+input wire clk_b_1;
+input wire WEN_b_1;
+input wire REN_b_1;
+input wire [ADDR_WIDTH1-1 :0] WR_ADDR_b_1;
+input wire [ADDR_WIDTH1-1 :0] RD_ADDR_b_1;
+input wire [DATA_WIDTH1-1 :0] WDATA_b_1;
+output wire [DATA_WIDTH1-1 :0] RDATA_b_1;
+ 
+DPRAM_18K_BLK #(
+              .ADDR_WIDTH(ADDR_WIDTH0),
+              .DATA_WIDTH(DATA_WIDTH0),
+              .BE1_WIDTH(BE1_WIDTH0),
+              .BE2_WIDTH(BE2_WIDTH0)
+              ) dpram_x18_inst0 ( 
+              
+              .CLK1_i(clk_a_0),
+              .WEN1_i(WEN_a_0),
+              .REN1_i(REN_a_0),
+              .WR1_ADDR_i(WR_ADDR_a_0),
+              .RD1_ADDR_i(RD_ADDR_a_0),
+              .WDATA1_i(WDATA_a_0),
+              .RDATA1_o(RDATA_a_0),
+              
+              .CLK2_i(clk_b_0),
+              .WEN2_i(WEN_b_0),
+              .REN2_i(REN_b_0),
+              .WR2_ADDR_i(WR_ADDR_b_0),
+              .RD2_ADDR_i(RD_ADDR_b_0),
+              .WDATA2_i(WDATA_b_0),
+              .RDATA2_o(RDATA_b_0)
+              );
+              
+ 
+DPRAM_18K_BLK #(
+              .ADDR_WIDTH(ADDR_WIDTH1),
+              .DATA_WIDTH(DATA_WIDTH1),
+              .BE1_WIDTH(BE1_WIDTH1),
+              .BE2_WIDTH(BE2_WIDTH1)
+              ) dpram_x18_inst1 ( 
+              
+              .CLK1_i(clk_a_1),
+              .WEN1_i(WEN_a_1),
+              .REN1_i(REN_a_1),
+              .WR1_ADDR_i(WR_ADDR_a_1),
+              .RD1_ADDR_i(RD_ADDR_a_1),
+              .WDATA1_i(WDATA_a_1),
+              .RDATA1_o(RDATA_a_1),
+              
+              .CLK2_i(clk_b_1),
+              .WEN2_i(WEN_b_1),
+              .REN2_i(REN_b_1),
+              .WR2_ADDR_i(WR_ADDR_b_1),
+              .RD2_ADDR_i(RD_ADDR_b_1),
+              .WDATA2_i(WDATA_b_1),
+              .RDATA2_o(RDATA_b_1)
+              );
+              
+endmodule    
+
+module dpram_9x2048_x2 (   
+    clk_a_0,
+    WEN_a_0,
+    REN_a_0,
+    WR_ADDR_a_0,
+    RD_ADDR_a_0,
+    WDATA_a_0,
+    RDATA_a_0,
+    
+    clk_b_0,
+    WEN_b_0,
+    REN_b_0,
+    WR_ADDR_b_0,
+    RD_ADDR_b_0,
+    WDATA_b_0,
+    RDATA_b_0,
+    
+    clk_a_1,
+    WEN_a_1,
+    REN_a_1,
+    WR_ADDR_a_1,
+    RD_ADDR_a_1,
+    WDATA_a_1,
+    RDATA_a_1,
+    
+    clk_b_1,
+    WEN_b_1,
+    REN_b_1,
+    WR_ADDR_b_1,
+    RD_ADDR_b_1,
+    WDATA_b_1,
+    RDATA_b_1
+);
+
+parameter ADDR_WIDTH0 = 11;
+parameter DATA_WIDTH0 = 9;
+parameter BE1_WIDTH0 = 1;
+parameter BE2_WIDTH0 = 1;
+
+parameter ADDR_WIDTH1 = 11;
+parameter DATA_WIDTH1 = 9;
+parameter BE1_WIDTH1 = 1;
+parameter BE2_WIDTH1 = 1;
+
+input wire clk_a_0;
+input wire WEN_a_0;
+input wire REN_a_0;
+input wire [ADDR_WIDTH0-1 :0] WR_ADDR_a_0;
+input wire [ADDR_WIDTH0-1 :0] RD_ADDR_a_0;
+input wire [DATA_WIDTH0-1 :0] WDATA_a_0;
+output wire [DATA_WIDTH0-1 :0] RDATA_a_0;
+
+input wire clk_b_0;
+input wire WEN_b_0;
+input wire REN_b_0;
+input wire [ADDR_WIDTH0-1 :0] WR_ADDR_b_0;
+input wire [ADDR_WIDTH0-1 :0] RD_ADDR_b_0;
+input wire [DATA_WIDTH0-1 :0] WDATA_b_0;
+output wire [DATA_WIDTH0-1 :0] RDATA_b_0;
+
+input wire clk_a_1;
+input wire WEN_a_1;
+input wire REN_a_1;
+input wire [ADDR_WIDTH1-1 :0] WR_ADDR_a_1;
+input wire [ADDR_WIDTH1-1 :0] RD_ADDR_a_1;
+input wire [DATA_WIDTH1-1 :0] WDATA_a_1;
+output wire [DATA_WIDTH1-1 :0] RDATA_a_1;
+
+input wire clk_b_1;
+input wire WEN_b_1;
+input wire REN_b_1;
+input wire [ADDR_WIDTH1-1 :0] WR_ADDR_b_1;
+input wire [ADDR_WIDTH1-1 :0] RD_ADDR_b_1;
+input wire [DATA_WIDTH1-1 :0] WDATA_b_1;
+output wire [DATA_WIDTH1-1 :0] RDATA_b_1;
+ 
+DPRAM_18K_BLK #(
+              .ADDR_WIDTH(ADDR_WIDTH0),
+              .DATA_WIDTH(DATA_WIDTH0),
+              .BE1_WIDTH(BE1_WIDTH0),
+              .BE2_WIDTH(BE2_WIDTH0)
+              ) dpram_x18_inst0 ( 
+              
+              .CLK1_i(clk_a_0),
+              .WEN1_i(WEN_a_0),
+              .REN1_i(REN_a_0),
+              .WR1_ADDR_i(WR_ADDR_a_0),
+              .RD1_ADDR_i(RD_ADDR_a_0),
+              .WDATA1_i(WDATA_a_0),
+              .RDATA1_o(RDATA_a_0),
+              
+              .CLK2_i(clk_b_0),
+              .WEN2_i(WEN_b_0),
+              .REN2_i(REN_b_0),
+              .WR2_ADDR_i(WR_ADDR_b_0),
+              .RD2_ADDR_i(RD_ADDR_b_0),
+              .WDATA2_i(WDATA_b_0),
+              .RDATA2_o(RDATA_b_0)
+              );
+              
+ 
+DPRAM_18K_BLK #(
+              .ADDR_WIDTH(ADDR_WIDTH1),
+              .DATA_WIDTH(DATA_WIDTH1),
+              .BE1_WIDTH(BE1_WIDTH1),
+              .BE2_WIDTH(BE2_WIDTH1)
+              ) dpram_x18_inst1 ( 
+              
+              .CLK1_i(clk_a_1),
+              .WEN1_i(WEN_a_1),
+              .REN1_i(REN_a_1),
+              .WR1_ADDR_i(WR_ADDR_a_1),
+              .RD1_ADDR_i(RD_ADDR_a_1),
+              .WDATA1_i(WDATA_a_1),
+              .RDATA1_o(RDATA_a_1),
+              
+              .CLK2_i(clk_b_1),
+              .WEN2_i(WEN_b_1),
+              .REN2_i(REN_b_1),
+              .WR2_ADDR_i(WR_ADDR_b_1),
+              .RD2_ADDR_i(RD_ADDR_b_1),
+              .WDATA2_i(WDATA_b_1),
+              .RDATA2_o(RDATA_b_1)
+              );
+              
+endmodule    
+
+module dpram_18x1024_9x2048 (   
+    clk_a_0,
+    WEN_a_0,
+    REN_a_0,
+    WR_ADDR_a_0,
+    RD_ADDR_a_0,
+    WDATA_a_0,
+    RDATA_a_0,
+    
+    clk_b_0,
+    WEN_b_0,
+    REN_b_0,
+    WR_ADDR_b_0,
+    RD_ADDR_b_0,
+    WDATA_b_0,
+    RDATA_b_0,
+    
+    clk_a_1,
+    WEN_a_1,
+    REN_a_1,
+    WR_ADDR_a_1,
+    RD_ADDR_a_1,
+    WDATA_a_1,
+    RDATA_a_1,
+    
+    clk_b_1,
+    WEN_b_1,
+    REN_b_1,
+    WR_ADDR_b_1,
+    RD_ADDR_b_1,
+    WDATA_b_1,
+    RDATA_b_1
+);
+
+parameter ADDR_WIDTH0 = 10;
+parameter DATA_WIDTH0 = 18;
+parameter BE1_WIDTH0 = 2;
+parameter BE2_WIDTH0 = 2;
+
+parameter ADDR_WIDTH1 = 11;
+parameter DATA_WIDTH1 = 9;
+parameter BE1_WIDTH1 = 1;
+parameter BE2_WIDTH1 = 1;
+
+input wire clk_a_0;
+input wire WEN_a_0;
+input wire REN_a_0;
+input wire [ADDR_WIDTH0-1 :0] WR_ADDR_a_0;
+input wire [ADDR_WIDTH0-1 :0] RD_ADDR_a_0;
+input wire [DATA_WIDTH0-1 :0] WDATA_a_0;
+output wire [DATA_WIDTH0-1 :0] RDATA_a_0;
+
+input wire clk_b_0;
+input wire WEN_b_0;
+input wire REN_b_0;
+input wire [ADDR_WIDTH0-1 :0] WR_ADDR_b_0;
+input wire [ADDR_WIDTH0-1 :0] RD_ADDR_b_0;
+input wire [DATA_WIDTH0-1 :0] WDATA_b_0;
+output wire [DATA_WIDTH0-1 :0] RDATA_b_0;
+
+input wire clk_a_1;
+input wire WEN_a_1;
+input wire REN_a_1;
+input wire [ADDR_WIDTH1-1 :0] WR_ADDR_a_1;
+input wire [ADDR_WIDTH1-1 :0] RD_ADDR_a_1;
+input wire [DATA_WIDTH1-1 :0] WDATA_a_1;
+output wire [DATA_WIDTH1-1 :0] RDATA_a_1;
+
+input wire clk_b_1;
+input wire WEN_b_1;
+input wire REN_b_1;
+input wire [ADDR_WIDTH1-1 :0] WR_ADDR_b_1;
+input wire [ADDR_WIDTH1-1 :0] RD_ADDR_b_1;
+input wire [DATA_WIDTH1-1 :0] WDATA_b_1;
+output wire [DATA_WIDTH1-1 :0] RDATA_b_1;
+ 
+DPRAM_18K_BLK #(
+              .ADDR_WIDTH(ADDR_WIDTH0),
+              .DATA_WIDTH(DATA_WIDTH0),
+              .BE1_WIDTH(BE1_WIDTH0),
+              .BE2_WIDTH(BE2_WIDTH0)
+              ) dpram_x18_inst0 ( 
+              
+              .CLK1_i(clk_a_0),
+              .WEN1_i(WEN_a_0),
+              .REN1_i(REN_a_0),
+              .WR1_ADDR_i(WR_ADDR_a_0),
+              .RD1_ADDR_i(RD_ADDR_a_0),
+              .WDATA1_i(WDATA_a_0),
+              .RDATA1_o(RDATA_a_0),
+              
+              .CLK2_i(clk_b_0),
+              .WEN2_i(WEN_b_0),
+              .REN2_i(REN_b_0),
+              .WR2_ADDR_i(WR_ADDR_b_0),
+              .RD2_ADDR_i(RD_ADDR_b_0),
+              .WDATA2_i(WDATA_b_0),
+              .RDATA2_o(RDATA_b_0)
+              );
+              
+ 
+DPRAM_18K_BLK #(
+              .ADDR_WIDTH(ADDR_WIDTH1),
+              .DATA_WIDTH(DATA_WIDTH1),
+              .BE1_WIDTH(BE1_WIDTH1),
+              .BE2_WIDTH(BE2_WIDTH1)
+              ) dpram_x18_inst1 ( 
+              
+              .CLK1_i(clk_a_1),
+              .WEN1_i(WEN_a_1),
+              .REN1_i(REN_a_1),
+              .WR1_ADDR_i(WR_ADDR_a_1),
+              .RD1_ADDR_i(RD_ADDR_a_1),
+              .WDATA1_i(WDATA_a_1),
+              .RDATA1_o(RDATA_a_1),
+              
+              .CLK2_i(clk_b_1),
+              .WEN2_i(WEN_b_1),
+              .REN2_i(REN_b_1),
+              .WR2_ADDR_i(WR_ADDR_b_1),
+              .RD2_ADDR_i(RD_ADDR_b_1),
+              .WDATA2_i(WDATA_b_1),
+              .RDATA2_o(RDATA_b_1)
+              );
+              
+endmodule    
\ No newline at end of file
diff --git a/ql-qlf-plugin/tests/qlf_k6n10f/bram18k_tdp/sim/Makefile b/ql-qlf-plugin/tests/qlf_k6n10f/bram18k_tdp/sim/Makefile
new file mode 100644
index 0000000..b9883eb
--- /dev/null
+++ b/ql-qlf-plugin/tests/qlf_k6n10f/bram18k_tdp/sim/Makefile
@@ -0,0 +1,48 @@
+# Copyright 2020-2022 F4PGA Authors
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+# SPDX-License-Identifier: Apache-2.0
+
+TESTBENCH = bram18k_tdp_tb.v
+POST_SYNTH = dpram_18x1024_9x2048_post_synth dpram_9x2048_x2_post_synth dpram_18x1024_x2_post_synth   
+ADDR_WIDTH0 = 10 11 10
+DATA_WIDTH0 = 18 9 18
+ADDR_WIDTH1 = 11 11 10
+DATA_WIDTH1 = 9 9 18
+TOP = dpram_18x1024_9x2048 dpram_9x2048_x2 dpram_18x1024_x2
+ADDR_DEFINES0 = $(foreach awidth0, $(ADDR_WIDTH0),-DADDR_WIDTH0="$(awidth0)")
+ADDR_DEFINES1 = $(foreach awidth1, $(ADDR_WIDTH1),-DADDR_WIDTH1="$(awidth1)")
+DATA_DEFINES0 = $(foreach dwidth0, $(DATA_WIDTH0),-DDATA_WIDTH0="$(dwidth0)")
+DATA_DEFINES1 = $(foreach dwidth1, $(DATA_WIDTH1),-DDATA_WIDTH1="$(dwidth1)")
+TOP_DEFINES = $(foreach top, $(TOP),-DTOP="$(top)")
+VCD_DEFINES = $(foreach vcd, $(POST_SYNTH),-DVCD="$(vcd).vcd")
+
+SIM_LIBS = $(shell find ../../../../qlf_k6n10f -name "*.v" -not -name "*_map.v")
+
+define simulate_post_synth
+	@iverilog  -vvvv -g2005 $(word $(1),$(ADDR_DEFINES0)) $(word $(1),$(ADDR_DEFINES1)) $(word $(1),$(DATA_DEFINES0)) $(word $(1),$(DATA_DEFINES1)) $(word $(1),$(TOP_DEFINES)) $(word $(1),$(VCD_DEFINES)) -o $(word $(1),$(POST_SYNTH)).vvp $(word $(1),$(POST_SYNTH)).v $(SIM_LIBS) $(TESTBENCH) > $(word $(1),$(POST_SYNTH)).vvp.log 2>&1
+	@vvp -vvvv $(word $(1),$(POST_SYNTH)).vvp > $(word $(1),$(POST_SYNTH)).vcd.log 2>&1
+endef
+
+define clean_post_synth_sim
+	@rm -rf  $(word $(1),$(POST_SYNTH)).vcd $(word $(1),$(POST_SYNTH)).vvp $(word $(1),$(POST_SYNTH)).vvp.log $(word $(1),$(POST_SYNTH)).vcd.log
+endef
+
+sim:
+	$(call simulate_post_synth,1)
+	$(call clean_post_synth_sim,1)
+	$(call simulate_post_synth,2)
+	$(call clean_post_synth_sim,2)
+	$(call simulate_post_synth,3)
+	$(call clean_post_synth_sim,3)
\ No newline at end of file
diff --git a/ql-qlf-plugin/tests/qlf_k6n10f/bram18k_tdp/sim/bram18k_tdp_tb.v b/ql-qlf-plugin/tests/qlf_k6n10f/bram18k_tdp/sim/bram18k_tdp_tb.v
new file mode 100644
index 0000000..004f32c
--- /dev/null
+++ b/ql-qlf-plugin/tests/qlf_k6n10f/bram18k_tdp/sim/bram18k_tdp_tb.v
@@ -0,0 +1,364 @@
+// Copyright 2020-2022 F4PGA Authors
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//		 http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+// SPDX-License-Identifier: Apache-2.0
+
+`timescale 1ns/1ps
+
+`define STRINGIFY(x) `"x`"
+
+module TB;
+	localparam PERIOD = 50;
+	localparam ADDR_INCR = 1;
+
+	reg clk_a;
+	reg rce_a_0;
+	reg rce_a_1;
+	reg [`ADDR_WIDTH0-1:0] ra_a_0;
+	reg [`ADDR_WIDTH1-1:0] ra_a_1;
+	wire [`DATA_WIDTH0-1:0] rq_a_0;
+	wire [`DATA_WIDTH1-1:0] rq_a_1;
+	reg wce_a_0;
+	reg wce_a_1;
+	reg [`ADDR_WIDTH0-1:0] wa_a_0;
+	reg [`ADDR_WIDTH1-1:0] wa_a_1;
+	reg [`DATA_WIDTH0-1:0] wd_a_0;
+	reg [`DATA_WIDTH1-1:0] wd_a_1;
+
+	reg clk_b;
+	reg rce_b_0;
+	reg rce_b_1;
+	reg [`ADDR_WIDTH0-1:0] ra_b_0;
+	reg [`ADDR_WIDTH1-1:0] ra_b_1;
+	wire [`DATA_WIDTH0-1:0] rq_b_0;
+	wire [`DATA_WIDTH1-1:0] rq_b_1;
+	reg wce_b_0;
+	reg wce_b_1;
+	reg [`ADDR_WIDTH0-1:0] wa_b_0;
+	reg [`ADDR_WIDTH1-1:0] wa_b_1;
+	reg [`DATA_WIDTH0-1:0] wd_b_0;
+	reg [`DATA_WIDTH1-1:0] wd_b_1;
+
+
+	initial clk_a = 0;
+	initial clk_b = 0;
+	initial ra_a_0 = 0;
+	initial ra_a_1 = 0;
+	initial ra_b_0 = 0;
+	initial ra_b_1 = 0;
+	initial rce_a_0 = 0;
+	initial rce_a_1 = 0;
+	initial rce_b_0 = 0;
+	initial rce_b_1 = 0;
+	initial wce_a_0 = 0;
+	initial wce_a_1 = 0;
+	initial wce_b_0 = 0;
+	initial wce_b_1 = 0;
+	initial forever #(PERIOD / 2.0) clk_a = ~clk_a;
+	initial begin
+		#(PERIOD / 4.0);
+		forever #(PERIOD / 2.0) clk_b = ~clk_b;
+	end	 
+	initial begin
+		$dumpfile(`STRINGIFY(`VCD));
+		$dumpvars;
+	end
+
+	integer a0;
+	integer b0;
+	integer a1;
+	integer b1;
+
+	reg done_a0;
+	reg done_b0;
+	reg done_a1;
+	reg done_b1;
+	initial done_a0 = 1'b0;
+	initial done_b0 = 1'b0;
+	initial done_a1 = 1'b0;
+	initial done_b1 = 1'b0;
+	wire done_sim = done_a0 & done_b0 & done_a1 & done_b1;
+
+	reg [`DATA_WIDTH0-1:0] expected_a_0;
+	reg [`DATA_WIDTH1-1:0] expected_a_1;
+	reg [`DATA_WIDTH0-1:0] expected_b_0;
+	reg [`DATA_WIDTH1-1:0] expected_b_1;
+
+	always @(posedge clk_a) begin
+			expected_a_0 <= (a0 | (a0 << 20) | 20'h55000) & {`DATA_WIDTH0{1'b1}};
+			expected_a_1 <= ((a1+1) | ((a1+1) << 20) | 20'h55000) & {`DATA_WIDTH1{1'b1}};
+	end
+	always @(posedge clk_b) begin
+			expected_b_0 <= ((b0+2) | ((b0+2) << 20) | 20'h55000) & {`DATA_WIDTH0{1'b1}};
+			expected_b_1 <= ((b1+3) | ((b1+3) << 20) | 20'h55000) & {`DATA_WIDTH1{1'b1}};
+	end
+
+	wire error_a_0 = a0 != 0 ? (rq_a_0 !== expected_a_0) : 0;
+	wire error_a_1 = a1 != 0 ? (rq_a_1 !== expected_a_1) : 0;
+	wire error_b_0 = b0 != (1<<`ADDR_WIDTH0) / 2 ? (rq_b_0 !== expected_b_0) : 0;
+	wire error_b_1 = b1 != (1<<`ADDR_WIDTH1) / 2 ? (rq_b_1 !== expected_b_1) : 0;
+
+	integer error_a_0_cnt = 0;
+	integer error_a_1_cnt = 0;
+	integer error_b_0_cnt = 0;
+	integer error_b_1_cnt = 0;
+
+	always @ (posedge clk_a)
+	begin
+		if (error_a_0)
+			error_a_0_cnt <= error_a_0_cnt + 1'b1;
+		if (error_a_1)
+			error_a_1_cnt <= error_a_1_cnt + 1'b1;
+	end
+	always @ (posedge clk_b)
+	begin
+		if (error_b_0)
+			error_b_0_cnt <= error_b_0_cnt + 1'b1;
+		if (error_b_1)
+			error_b_1_cnt <= error_b_1_cnt + 1'b1;
+	end
+
+	// PORTs A0
+	initial #(1) begin
+		// Write data
+		for (a0 = 0; a0 < (1<<`ADDR_WIDTH0) / 2; a0 = a0 + ADDR_INCR) begin
+			@(negedge clk_a) begin
+				wa_a_0 = a0;
+				wd_a_0 = a0 | (a0 << 20) | 20'h55000;
+				wce_a_0 = 1;
+			end
+			@(posedge clk_a) begin
+				#(PERIOD/10) wce_a_0 = 0;
+			end
+		end
+		// Read data
+		for (a0 = 0; a0 < (1<<`ADDR_WIDTH0) / 2; a0 = a0 + ADDR_INCR) begin
+			@(negedge clk_a) begin
+				ra_a_0 = a0;
+				rce_a_0 = 1;
+			end
+			@(posedge clk_a) begin
+				#(PERIOD/10) rce_a_0 = 0;
+				if ( rq_a_0 !== expected_a_0) begin
+					$display("%d: PORT A0: FAIL: mismatch act=%x exp=%x at %x", $time, rq_a_0, expected_a_0, a0);
+				end else begin
+					$display("%d: PORT A0: OK: act=%x exp=%x at %x", $time, rq_a_0, expected_a_0, a0);
+				end
+			end
+		end
+		done_a0 = 1'b1;
+		a0 = 0;
+		// PORTs B0
+		@(posedge clk_b)
+		#2;
+		// Write data
+		for (b0 = (1<<`ADDR_WIDTH0) / 2; b0 < (1<<`ADDR_WIDTH0); b0 = b0 + ADDR_INCR) begin
+			@(negedge clk_b) begin
+				wa_b_0 = b0;
+				wd_b_0 = (b0+2) | ((b0+2) << 20) | 20'h55000;
+				wce_b_0 = 1;
+			end
+			@(posedge clk_b) begin
+				#(PERIOD/10) wce_b_0 = 0;
+			end
+		end
+		// Read data
+		for (b0 = (1<<`ADDR_WIDTH0) / 2; b0 < (1<<`ADDR_WIDTH0); b0 = b0 + ADDR_INCR) begin
+			@(negedge clk_b) begin
+				ra_b_0 = b0;
+				rce_b_0 = 1;
+			end
+			@(posedge clk_b) begin
+				#(PERIOD/10) rce_b_0 = 0;
+				if ( rq_b_0 !== expected_b_0) begin
+					$display("%d: PORT B0: FAIL: mismatch act=%x exp=%x at %x", $time, rq_b_0, expected_b_0, b0);
+				end else begin
+					$display("%d: PORT B0: OK: act=%x exp=%x at %x", $time, rq_b_0, expected_b_0, b0);
+				end
+			end
+		end
+		done_b0 = 1'b1;
+		b0 = (1<<`ADDR_WIDTH0) / 2;
+		// PORTs A1
+		@(posedge clk_a)
+		#2;
+		// Write data
+		for (a1 = 0; a1 < (1<<`ADDR_WIDTH1) / 2; a1 = a1 + ADDR_INCR) begin
+			@(negedge clk_a) begin
+				wa_a_1 = a1;
+				wd_a_1 = (a1+1) | ((a1+1) << 20) | 20'h55000;
+				wce_a_1 = 1;
+			end
+			@(posedge clk_a) begin
+				#(PERIOD/10) wce_a_1 = 0;
+			end
+		end
+		// Read data
+		for (a1 = 0; a1 < (1<<`ADDR_WIDTH1) / 2; a1 = a1 + ADDR_INCR) begin
+			@(negedge clk_a) begin
+				ra_a_1 = a1;
+				rce_a_1 = 1;
+			end
+			@(posedge clk_a) begin
+				#(PERIOD/10) rce_a_1 = 0;
+				if ( rq_a_1 !== expected_a_1) begin
+					$display("%d: PORT A1: FAIL: mismatch act=%x exp=%x at %x", $time, rq_a_1, expected_a_1, a1);
+				end else begin
+					$display("%d: PORT A1: OK: act=%x exp=%x at %x", $time, rq_a_1, expected_a_1, a1);
+				end
+			end
+		end
+		done_a1 = 1'b1;
+		a1 = 0;
+		// PORTs B1
+		@(posedge clk_b)
+		#2;
+		// Write data
+		for (b1 = (1<<`ADDR_WIDTH1) / 2; b1 < (1<<`ADDR_WIDTH1); b1 = b1 + ADDR_INCR) begin
+			@(negedge clk_b) begin
+				wa_b_1 = b1;
+				wd_b_1 = (b1+3) | ((b1+3) << 20) | 20'h55000;
+				wce_b_1 = 1;
+			end
+			@(posedge clk_b) begin
+				#(PERIOD/10) wce_b_1 = 0;
+			end
+		end
+		// Read data
+		for (b1 = (1<<`ADDR_WIDTH1) / 2; b1 < (1<<`ADDR_WIDTH1); b1 = b1 + ADDR_INCR) begin
+			@(negedge clk_b) begin
+				ra_b_1 = b1;
+				rce_b_1 = 1;
+			end
+			@(posedge clk_b) begin
+				#(PERIOD/10) rce_b_1 = 0;
+				if ( rq_b_1 !== expected_b_1) begin
+					$display("%d: PORT B1: FAIL: mismatch act=%x exp=%x at %x", $time, rq_b_1, expected_b_1, b1);
+				end else begin
+					$display("%d: PORT B1: OK: act=%x exp=%x at %x", $time, rq_b_1, expected_b_1, b1);
+				end
+			end
+		end
+		done_b1 = 1'b1;
+		b1 = (1<<`ADDR_WIDTH1) / 2;
+	end
+
+	// Scan for simulation finish
+	always @(posedge clk_a, posedge clk_b) begin
+		if (done_sim)
+			$finish_and_return( (error_a_0_cnt == 0 & error_b_0_cnt == 0 & error_a_1_cnt == 0 & error_b_1_cnt == 0) ? 0 : -1 );
+	end
+	
+	case (`STRINGIFY(`TOP))
+		"dpram_18x1024_9x2048": begin
+			dpram_18x1024_9x2048 #() bram (
+				.clk_a_0(clk_a),
+				.REN_a_0(rce_a_0),
+				.RD_ADDR_a_0(ra_a_0),
+				.RDATA_a_0(rq_a_0),
+				.WEN_a_0(wce_a_0),
+				.WR_ADDR_a_0(wa_a_0),
+				.WDATA_a_0(wd_a_0),
+				.clk_b_0(clk_b),
+				.REN_b_0(rce_b_0),
+				.RD_ADDR_b_0(ra_b_0),
+				.RDATA_b_0(rq_b_0),
+				.WEN_b_0(wce_b_0),
+				.WR_ADDR_b_0(wa_b_0),
+				.WDATA_b_0(wd_b_0),
+
+				.clk_a_1(clk_a),
+				.REN_a_1(rce_a_1),
+				.RD_ADDR_a_1(ra_a_1),
+				.RDATA_a_1(rq_a_1),
+				.WEN_a_1(wce_a_1),
+				.WR_ADDR_a_1(wa_a_1),
+				.WDATA_a_1(wd_a_1),
+				.clk_b_1(clk_b),
+				.REN_b_1(rce_b_1),
+				.RD_ADDR_b_1(ra_b_1),
+				.RDATA_b_1(rq_b_1),
+				.WEN_b_1(wce_b_1),
+				.WR_ADDR_b_1(wa_b_1),
+				.WDATA_b_1(wd_b_1)
+			);
+		end
+		"dpram_9x2048_x2": begin
+			dpram_9x2048_x2 #() bram (
+				.clk_a_0(clk_a),
+				.REN_a_0(rce_a_0),
+				.RD_ADDR_a_0(ra_a_0),
+				.RDATA_a_0(rq_a_0),
+				.WEN_a_0(wce_a_0),
+				.WR_ADDR_a_0(wa_a_0),
+				.WDATA_a_0(wd_a_0),
+				.clk_b_0(clk_b),
+				.REN_b_0(rce_b_0),
+				.RD_ADDR_b_0(ra_b_0),
+				.RDATA_b_0(rq_b_0),
+				.WEN_b_0(wce_b_0),
+				.WR_ADDR_b_0(wa_b_0),
+				.WDATA_b_0(wd_b_0),
+
+				.clk_a_1(clk_a),
+				.REN_a_1(rce_a_1),
+				.RD_ADDR_a_1(ra_a_1),
+				.RDATA_a_1(rq_a_1),
+				.WEN_a_1(wce_a_1),
+				.WR_ADDR_a_1(wa_a_1),
+				.WDATA_a_1(wd_a_1),
+				.clk_b_1(clk_b),
+				.REN_b_1(rce_b_1),
+				.RD_ADDR_b_1(ra_b_1),
+				.RDATA_b_1(rq_b_1),
+				.WEN_b_1(wce_b_1),
+				.WR_ADDR_b_1(wa_b_1),
+				.WDATA_b_1(wd_b_1)
+			);
+		end
+		"dpram_18x1024_x2": begin
+			dpram_18x1024_x2 #() bram (
+				.clk_a_0(clk_a),
+				.REN_a_0(rce_a_0),
+				.RD_ADDR_a_0(ra_a_0),
+				.RDATA_a_0(rq_a_0),
+				.WEN_a_0(wce_a_0),
+				.WR_ADDR_a_0(wa_a_0),
+				.WDATA_a_0(wd_a_0),
+				.clk_b_0(clk_b),
+				.REN_b_0(rce_b_0),
+				.RD_ADDR_b_0(ra_b_0),
+				.RDATA_b_0(rq_b_0),
+				.WEN_b_0(wce_b_0),
+				.WR_ADDR_b_0(wa_b_0),
+				.WDATA_b_0(wd_b_0),
+
+				.clk_a_1(clk_a),
+				.REN_a_1(rce_a_1),
+				.RD_ADDR_a_1(ra_a_1),
+				.RDATA_a_1(rq_a_1),
+				.WEN_a_1(wce_a_1),
+				.WR_ADDR_a_1(wa_a_1),
+				.WDATA_a_1(wd_a_1),
+				.clk_b_1(clk_b),
+				.REN_b_1(rce_b_1),
+				.RD_ADDR_b_1(ra_b_1),
+				.RDATA_b_1(rq_b_1),
+				.WEN_b_1(wce_b_1),
+				.WR_ADDR_b_1(wa_b_1),
+				.WDATA_b_1(wd_b_1)
+			);
+		end
+	endcase
+endmodule
diff --git a/ql-qlf-plugin/tests/qlf_k6n10f/bram36k_afifo/bram36k_afifo.tcl b/ql-qlf-plugin/tests/qlf_k6n10f/bram36k_afifo/bram36k_afifo.tcl
new file mode 100644
index 0000000..dacbe77
--- /dev/null
+++ b/ql-qlf-plugin/tests/qlf_k6n10f/bram36k_afifo/bram36k_afifo.tcl
@@ -0,0 +1,38 @@
+yosys -import
+
+if { [info procs ql-qlf-k6n10f] == {} } { plugin -i ql-qlf }
+yosys -import  ;
+
+read_verilog $::env(DESIGN_TOP).v
+design -save bram36k_afifo
+
+select af1024x36_1024x36
+select *
+synth_quicklogic -family qlf_k6n10f -top af1024x36_1024x36 -bram_types
+opt_expr -undriven
+opt_clean
+stat
+write_verilog sim/af1024x36_1024x36_post_synth.v
+select -assert-count 1 t:TDP36K_FIFO_ASYNC_WR_X36_RD_X36_nonsplit
+
+select -clear
+design -load bram36k_afifo
+select af2048x18_2048x18
+select *
+synth_quicklogic -family qlf_k6n10f -top af2048x18_2048x18 -bram_types
+opt_expr -undriven
+opt_clean
+stat
+write_verilog sim/af2048x18_2048x18_post_synth.v
+select -assert-count 1 t:TDP36K_FIFO_ASYNC_WR_X18_RD_X18_nonsplit
+
+select -clear
+design -load bram36k_afifo
+select af4096x9_4096x9
+select *
+synth_quicklogic -family qlf_k6n10f -top af4096x9_4096x9 -bram_types
+opt_expr -undriven
+opt_clean
+stat
+write_verilog sim/af4096x9_4096x9_post_synth.v
+select -assert-count 1 t:TDP36K_FIFO_ASYNC_WR_X9_RD_X9_nonsplit
diff --git a/ql-qlf-plugin/tests/qlf_k6n10f/bram36k_afifo/bram36k_afifo.v b/ql-qlf-plugin/tests/qlf_k6n10f/bram36k_afifo/bram36k_afifo.v
new file mode 100644
index 0000000..2fc55ee
--- /dev/null
+++ b/ql-qlf-plugin/tests/qlf_k6n10f/bram36k_afifo/bram36k_afifo.v
@@ -0,0 +1,138 @@
+// Copyright 2020-2022 F4PGA Authors
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+// SPDX-License-Identifier: Apache-2.0
+
+module af1024x36_1024x36 (DIN,PUSH,POP,clock0,clock1,Async_Flush,Almost_Full,Almost_Empty,Full,Empty,Full_Watermark,Empty_Watermark,Overrun_Error,Underrun_Error,DOUT);
+
+parameter WR_DATA_WIDTH = 36;
+parameter RD_DATA_WIDTH = 36;
+parameter UPAE_DBITS = 12'd10;
+parameter UPAF_DBITS = 12'd10;
+
+input clock0,clock1;
+input PUSH,POP;
+input [WR_DATA_WIDTH-1:0] DIN;
+input Async_Flush;
+output [RD_DATA_WIDTH-1:0] DOUT;
+output Almost_Full,Almost_Empty;
+output Full, Empty;
+output Full_Watermark, Empty_Watermark;
+output Overrun_Error, Underrun_Error;
+
+AFIFO_36K_BLK  # (.WR_DATA_WIDTH(WR_DATA_WIDTH),.RD_DATA_WIDTH(RD_DATA_WIDTH),.UPAE_DBITS(UPAE_DBITS),.UPAF_DBITS(UPAF_DBITS)
+                  )
+  FIFO_INST    (
+                .DIN(DIN),
+                .PUSH(PUSH),
+                .POP(POP),
+                .Push_Clk(clock0),
+                .Pop_Clk(clock1),
+                .Async_Flush(Async_Flush),
+                
+                .Overrun_Error(Overrun_Error),
+                .Full_Watermark(Full_Watermark),
+                .Almost_Full(Almost_Full),
+                .Full(Full),
+                
+                .Underrun_Error(Underrun_Error),
+                .Empty_Watermark(Empty_Watermark),
+                .Almost_Empty(Almost_Empty),
+                .Empty(Empty),
+
+                .DOUT(DOUT)
+                );
+endmodule
+
+module af2048x18_2048x18 (DIN,PUSH,POP,clock0,clock1,Async_Flush,Almost_Full,Almost_Empty,Full,Empty,Full_Watermark,Empty_Watermark,Overrun_Error,Underrun_Error,DOUT);
+
+parameter WR_DATA_WIDTH = 18;
+parameter RD_DATA_WIDTH = 18;
+parameter UPAE_DBITS = 12'd10;
+parameter UPAF_DBITS = 12'd10;
+
+input clock0,clock1;
+input PUSH,POP;
+input [WR_DATA_WIDTH-1:0] DIN;
+input Async_Flush;
+output [RD_DATA_WIDTH-1:0] DOUT;
+output Almost_Full,Almost_Empty;
+output Full, Empty;
+output Full_Watermark, Empty_Watermark;
+output Overrun_Error, Underrun_Error;
+
+AFIFO_36K_BLK  # (.WR_DATA_WIDTH(WR_DATA_WIDTH),.RD_DATA_WIDTH(RD_DATA_WIDTH),.UPAE_DBITS(UPAE_DBITS),.UPAF_DBITS(UPAF_DBITS)
+                  )
+  FIFO_INST    (
+                .DIN(DIN),
+                .PUSH(PUSH),
+                .POP(POP),
+                .Push_Clk(clock0),
+                .Pop_Clk(clock1),
+                .Async_Flush(Async_Flush),
+                
+                .Overrun_Error(Overrun_Error),
+                .Full_Watermark(Full_Watermark),
+                .Almost_Full(Almost_Full),
+                .Full(Full),
+                
+                .Underrun_Error(Underrun_Error),
+                .Empty_Watermark(Empty_Watermark),
+                .Almost_Empty(Almost_Empty),
+                .Empty(Empty),
+
+                .DOUT(DOUT)
+                );
+endmodule
+
+module af4096x9_4096x9 (DIN,PUSH,POP,clock0,clock1,Async_Flush,Almost_Full,Almost_Empty,Full,Empty,Full_Watermark,Empty_Watermark,Overrun_Error,Underrun_Error,DOUT);
+
+parameter WR_DATA_WIDTH = 9;
+parameter RD_DATA_WIDTH = 9;
+parameter UPAE_DBITS = 12'd10;
+parameter UPAF_DBITS = 12'd10;
+
+input clock0,clock1;
+input PUSH,POP;
+input [WR_DATA_WIDTH-1:0] DIN;
+input Async_Flush;
+output [RD_DATA_WIDTH-1:0] DOUT;
+output Almost_Full,Almost_Empty;
+output Full, Empty;
+output Full_Watermark, Empty_Watermark;
+output Overrun_Error, Underrun_Error;
+
+AFIFO_36K_BLK  # (.WR_DATA_WIDTH(WR_DATA_WIDTH),.RD_DATA_WIDTH(RD_DATA_WIDTH),.UPAE_DBITS(UPAE_DBITS),.UPAF_DBITS(UPAF_DBITS)
+                  )
+  FIFO_INST    (
+                .DIN(DIN),
+                .PUSH(PUSH),
+                .POP(POP),
+                .Push_Clk(clock0),
+                .Pop_Clk(clock1),
+                .Async_Flush(Async_Flush),
+                
+                .Overrun_Error(Overrun_Error),
+                .Full_Watermark(Full_Watermark),
+                .Almost_Full(Almost_Full),
+                .Full(Full),
+                
+                .Underrun_Error(Underrun_Error),
+                .Empty_Watermark(Empty_Watermark),
+                .Almost_Empty(Almost_Empty),
+                .Empty(Empty),
+
+                .DOUT(DOUT)
+                );
+endmodule
\ No newline at end of file
diff --git a/ql-qlf-plugin/tests/qlf_k6n10f/bram36k_afifo/sim/Makefile b/ql-qlf-plugin/tests/qlf_k6n10f/bram36k_afifo/sim/Makefile
new file mode 100644
index 0000000..7c93214
--- /dev/null
+++ b/ql-qlf-plugin/tests/qlf_k6n10f/bram36k_afifo/sim/Makefile
@@ -0,0 +1,48 @@
+# Copyright 2020-2022 F4PGA Authors
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+# SPDX-License-Identifier: Apache-2.0
+
+TESTBENCH = bram36k_afifo_tb.v
+POST_SYNTH = af1024x36_1024x36_post_synth af2048x18_2048x18_post_synth af4096x9_4096x9_post_synth
+ADDR_WIDTH0 = 10 11 12
+DATA_WIDTH0 = 36 18 9
+ADDR_WIDTH1 = 10 11 12
+DATA_WIDTH1 = 36 18 9
+TOP = af1024x36_1024x36 af2048x18_2048x18 af4096x9_4096x9
+ADDR0_DEFINES = $(foreach awidth0, $(ADDR_WIDTH0),-DADDR_WIDTH0="$(awidth0)")
+ADDR1_DEFINES = $(foreach awidth1, $(ADDR_WIDTH1),-DADDR_WIDTH1="$(awidth1)")
+DATA0_DEFINES = $(foreach dwidth0, $(DATA_WIDTH0),-DDATA_WIDTH0="$(dwidth0)")
+DATA1_DEFINES = $(foreach dwidth1, $(DATA_WIDTH1),-DDATA_WIDTH1="$(dwidth1)")
+TOP_DEFINES = $(foreach top, $(TOP),-DTOP="$(top)")
+VCD_DEFINES = $(foreach vcd, $(POST_SYNTH),-DVCD="$(vcd).vcd")
+
+SIM_LIBS = $(shell find ../../../../qlf_k6n10f -name "*.v" -not -name "*_map.v")
+
+define simulate_post_synth
+	@iverilog  -vvvv -g2005 $(word $(1),$(ADDR0_DEFINES)) $(word $(1),$(ADDR1_DEFINES)) $(word $(1),$(DATA0_DEFINES)) $(word $(1),$(DATA1_DEFINES)) $(word $(1),$(TOP_DEFINES)) $(word $(1),$(VCD_DEFINES)) -o $(word $(1),$(POST_SYNTH)).vvp $(word $(1),$(POST_SYNTH)).v $(SIM_LIBS) $(TESTBENCH) > $(word $(1),$(POST_SYNTH)).vvp.log 2>&1
+	@vvp -vvvv $(word $(1),$(POST_SYNTH)).vvp > $(word $(1),$(POST_SYNTH)).vcd.log 2>&1
+endef
+
+define clean_post_synth_sim
+	@rm -rf  $(word $(1),$(POST_SYNTH)).vcd $(word $(1),$(POST_SYNTH)).vvp $(word $(1),$(POST_SYNTH)).vvp.log $(word $(1),$(POST_SYNTH)).vcd.log
+endef
+
+sim:
+	$(call simulate_post_synth,1)
+	$(call clean_post_synth_sim,1)
+	$(call simulate_post_synth,2)
+	$(call clean_post_synth_sim,2)
+	$(call simulate_post_synth,3)
+	$(call clean_post_synth_sim,3)
\ No newline at end of file
diff --git a/ql-qlf-plugin/tests/qlf_k6n10f/bram36k_afifo/sim/bram36k_afifo_tb.v b/ql-qlf-plugin/tests/qlf_k6n10f/bram36k_afifo/sim/bram36k_afifo_tb.v
new file mode 100644
index 0000000..48424fc
--- /dev/null
+++ b/ql-qlf-plugin/tests/qlf_k6n10f/bram36k_afifo/sim/bram36k_afifo_tb.v
@@ -0,0 +1,177 @@
+// Copyright 2020-2022 F4PGA Authors
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//		 http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+// SPDX-License-Identifier: Apache-2.0
+
+`timescale 1ns/1ps
+
+`define STRINGIFY(x) `"x`"
+
+module TB;
+	localparam PERIOD = 30;
+	localparam ADDR_INCR = 1;
+
+	reg clk0;
+	reg clk1;
+	reg flush;
+	reg pop;
+	wire [`DATA_WIDTH1-1:0] dout;
+	reg push;
+	reg [`DATA_WIDTH0-1:0] din;
+	wire almost_full,almost_empty;
+	wire full, empty;
+	wire full_watermark, empty_watermark;
+	wire overrun_error, underrun_error;
+
+	initial 
+	begin
+		clk0 = 0;
+		clk1 = 0;
+		pop = 0;
+		push = 0;
+		flush = 1;
+		din = 0;
+		#40
+		flush = 0;
+	end
+	
+	initial forever #(PERIOD / 3.0) clk0 = ~clk0;
+	initial forever #(PERIOD / 2.0) clk1 = ~clk1;
+	
+	initial begin
+		$dumpfile(`STRINGIFY(`VCD));
+		$dumpvars;
+	end
+
+	integer a;
+
+	reg done;
+	initial done = 1'b0;
+	
+	reg read_test;
+	initial read_test = 0;
+
+	reg [`DATA_WIDTH1-1:0] expected;
+	initial expected = 0;
+
+	always @(posedge clk1) begin
+		expected <= (a | (a << 20) | 20'h55000) & {`DATA_WIDTH1{1'b1}};
+	end
+
+	wire error = ((a != 0) && read_test) ? dout !== expected : 0;
+
+	integer error_cnt = 0;
+	always @ (posedge clk1)
+	begin
+		if (error)
+			error_cnt <= error_cnt + 1'b1; 
+	end
+
+
+	initial #(50) begin
+		@(posedge clk0)
+		// Write data
+		for (a = 0; a < (1<<`ADDR_WIDTH0); a = a + ADDR_INCR) begin
+			@(negedge clk0) begin
+				din = a | (a << 20) | 20'h55000;
+				push = 1;
+			end
+			@(posedge clk0) begin
+				#(PERIOD/10) push = 0;
+			end
+		end
+		// Read data
+		read_test = 1;
+		for (a = 0; a < (1<<`ADDR_WIDTH1); a = a + ADDR_INCR) begin
+			@(posedge clk1) begin
+				#(PERIOD/10) pop = 0;
+				if ( dout !== expected) begin
+					$display("%d: FAIL: mismatch act=%x exp=%x at %x", $time, dout, expected, a);
+				end else begin
+					$display("%d: OK: act=%x exp=%x at %x", $time, dout, expected, a);
+				end
+			end
+			@(negedge clk1) begin
+				pop = 1;
+			end
+		end
+		done = 1'b1;
+	end
+
+	// Scan for simulation finish
+	always @(posedge clk1) begin
+		if (done)
+			$finish_and_return( (error_cnt == 0) ? 0 : -1 );
+	end
+
+	case (`STRINGIFY(`TOP))
+		"af1024x36_1024x36": begin
+			af1024x36_1024x36 #() afifo (
+				.DIN(din),
+				.PUSH(push),
+				.POP(pop),
+				.clock0(clk0),
+				.clock1(clk1),
+				.Async_Flush(flush),
+				.Almost_Full(almost_full),
+				.Almost_Empty(almost_empty),
+				.Full(full),
+				.Empty(empty),
+				.Full_Watermark(full_watermark),
+				.Empty_Watermark(empty_watermark),
+				.Overrun_Error(overrun_error),
+				.Underrun_Error(underrun_error),
+				.DOUT(dout)
+			);
+		end
+		"af2048x18_2048x18": begin
+			af2048x18_2048x18 #() afifo (
+				.DIN(din),
+				.PUSH(push),
+				.POP(pop),
+				.clock0(clk0),
+				.clock1(clk1),
+				.Async_Flush(flush),
+				.Almost_Full(almost_full),
+				.Almost_Empty(almost_empty),
+				.Full(full),
+				.Empty(empty),
+				.Full_Watermark(full_watermark),
+				.Empty_Watermark(empty_watermark),
+				.Overrun_Error(overrun_error),
+				.Underrun_Error(underrun_error),
+				.DOUT(dout)
+			);
+		end
+		"af4096x9_4096x9": begin
+			af4096x9_4096x9 #() afifo (
+				.DIN(din),
+				.PUSH(push),
+				.POP(pop),
+				.clock0(clk0),
+				.clock1(clk1),
+				.Async_Flush(flush),
+				.Almost_Full(almost_full),
+				.Almost_Empty(almost_empty),
+				.Full(full),
+				.Empty(empty),
+				.Full_Watermark(full_watermark),
+				.Empty_Watermark(empty_watermark),
+				.Overrun_Error(overrun_error),
+				.Underrun_Error(underrun_error),
+				.DOUT(dout)
+			);
+		end		
+	endcase
+endmodule
diff --git a/ql-qlf-plugin/tests/qlf_k6n10f/bram36k_sdp/bram36k_sdp.tcl b/ql-qlf-plugin/tests/qlf_k6n10f/bram36k_sdp/bram36k_sdp.tcl
new file mode 100644
index 0000000..b5d38b0
--- /dev/null
+++ b/ql-qlf-plugin/tests/qlf_k6n10f/bram36k_sdp/bram36k_sdp.tcl
@@ -0,0 +1,71 @@
+yosys -import
+
+if { [info procs ql-qlf-k6n10f] == {} } { plugin -i ql-qlf }
+yosys -import  ;
+
+read_verilog $::env(DESIGN_TOP).v
+design -save bram36_sdp
+
+select spram_36x1024
+select *
+synth_quicklogic -family qlf_k6n10f -top spram_36x1024 -bram_types
+opt_expr -undriven
+opt_clean
+stat
+write_verilog sim/spram_36x1024_post_synth.v
+select -assert-count 1 t:TDP36K_BRAM_WR_X36_RD_X36_nonsplit
+
+select -clear
+design -load bram36_sdp
+select spram_32x1024
+select *
+synth_quicklogic -family qlf_k6n10f -top spram_32x1024 -bram_types
+opt_expr -undriven
+opt_clean
+stat
+write_verilog sim/spram_32x1024_post_synth.v
+select -assert-count 1 t:TDP36K_BRAM_WR_X36_RD_X36_nonsplit
+
+select -clear
+design -load bram36_sdp
+select spram_18x2048
+select *
+synth_quicklogic -family qlf_k6n10f -top spram_18x2048 -bram_types
+opt_expr -undriven
+opt_clean
+stat
+write_verilog sim/spram_18x2048_post_synth.v
+select -assert-count 1 t:TDP36K_BRAM_WR_X18_RD_X18_nonsplit
+
+select -clear
+design -load bram36_sdp
+select spram_16x2048
+select *
+synth_quicklogic -family qlf_k6n10f -top spram_16x2048 -bram_types
+opt_expr -undriven
+opt_clean
+stat
+write_verilog sim/spram_16x2048_post_synth.v
+select -assert-count 1 t:TDP36K_BRAM_WR_X18_RD_X18_nonsplit
+
+select -clear
+design -load bram36_sdp
+select spram_9x4096
+select *
+synth_quicklogic -family qlf_k6n10f -top spram_9x4096 -bram_types
+opt_expr -undriven
+opt_clean
+stat
+write_verilog sim/spram_9x4096_post_synth.v
+select -assert-count 1 t:TDP36K_BRAM_WR_X9_RD_X9_nonsplit
+
+select -clear
+design -load bram36_sdp
+select spram_8x4096
+select *
+synth_quicklogic -family qlf_k6n10f -top spram_8x4096 -bram_types
+opt_expr -undriven
+opt_clean
+stat
+write_verilog sim/spram_8x4096_post_synth.v
+select -assert-count 1 t:TDP36K_BRAM_WR_X9_RD_X9_nonsplit
diff --git a/ql-qlf-plugin/tests/qlf_k6n10f/bram36k_sdp/bram36k_sdp.v b/ql-qlf-plugin/tests/qlf_k6n10f/bram36k_sdp/bram36k_sdp.v
new file mode 100644
index 0000000..783bc36
--- /dev/null
+++ b/ql-qlf-plugin/tests/qlf_k6n10f/bram36k_sdp/bram36k_sdp.v
@@ -0,0 +1,297 @@
+// Copyright 2020-2022 F4PGA Authors
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+// SPDX-License-Identifier: Apache-2.0
+
+module spram_36x1024 (
+    WEN_i,
+    REN_i,
+    clock0,
+    clock1,
+    WR_ADDR_i,
+    RD_ADDR_i,
+    WDATA_i,
+    RDATA_o
+);
+
+parameter WR_ADDR_WIDTH = 10;
+parameter RD_ADDR_WIDTH = 10;
+parameter WR_DATA_WIDTH = 36;
+parameter RD_DATA_WIDTH = 36;
+parameter BE_WIDTH = 4;
+
+input wire WEN_i;
+input wire REN_i;
+input wire clock0;
+input wire clock1;
+input wire [WR_ADDR_WIDTH-1 :0] WR_ADDR_i;
+input wire [RD_ADDR_WIDTH-1 :0] RD_ADDR_i;
+input wire [WR_DATA_WIDTH-1 :0] WDATA_i;
+output wire [RD_DATA_WIDTH-1 :0] RDATA_o;
+
+RAM_36K_BLK #(
+              .WR_ADDR_WIDTH(WR_ADDR_WIDTH),
+              .RD_ADDR_WIDTH(RD_ADDR_WIDTH),
+              .WR_DATA_WIDTH(WR_DATA_WIDTH),
+              .RD_DATA_WIDTH(RD_DATA_WIDTH),
+              .BE_WIDTH(BE_WIDTH)
+              ) spram_x36_inst (
+              
+              .WEN_i(WEN_i),
+              .WR_BE_i(4'b1111),
+              .REN_i(REN_i),              
+              .WR_CLK_i(clock0),
+              .RD_CLK_i(clock1),
+              .WR_ADDR_i(WR_ADDR_i),
+              .RD_ADDR_i(RD_ADDR_i),
+              .WDATA_i(WDATA_i),
+              .RDATA_o(RDATA_o)
+              );
+              
+endmodule    
+
+module spram_32x1024 (
+    WEN_i,
+    REN_i,
+    clock0,
+    clock1,
+    WR_ADDR_i,
+    RD_ADDR_i,
+    WDATA_i,
+    RDATA_o
+);
+
+parameter WR_ADDR_WIDTH = 10;
+parameter RD_ADDR_WIDTH = 10;
+parameter WR_DATA_WIDTH = 32;
+parameter RD_DATA_WIDTH = 32;
+parameter BE_WIDTH = 4;
+
+input wire WEN_i;
+input wire REN_i;
+input wire clock0;
+input wire clock1;
+input wire [WR_ADDR_WIDTH-1 :0] WR_ADDR_i;
+input wire [RD_ADDR_WIDTH-1 :0] RD_ADDR_i;
+input wire [WR_DATA_WIDTH-1 :0] WDATA_i;
+output wire [RD_DATA_WIDTH-1 :0] RDATA_o;
+
+RAM_36K_BLK #(
+              .WR_ADDR_WIDTH(WR_ADDR_WIDTH),
+              .RD_ADDR_WIDTH(RD_ADDR_WIDTH),
+              .WR_DATA_WIDTH(WR_DATA_WIDTH),
+              .RD_DATA_WIDTH(RD_DATA_WIDTH),
+              .BE_WIDTH(BE_WIDTH)
+              ) spram_x36_inst (
+              
+              .WEN_i(WEN_i),
+              .WR_BE_i(4'b1111),
+              .REN_i(REN_i),              
+              .WR_CLK_i(clock0),
+              .RD_CLK_i(clock1),
+              .WR_ADDR_i(WR_ADDR_i),
+              .RD_ADDR_i(RD_ADDR_i),
+              .WDATA_i(WDATA_i),
+              .RDATA_o(RDATA_o)
+              );
+              
+endmodule   
+
+module spram_18x2048 (
+    WEN_i,
+    REN_i,
+    clock0,
+    clock1,
+    WR_ADDR_i,
+    RD_ADDR_i,
+    WDATA_i,
+    RDATA_o
+);
+
+parameter WR_ADDR_WIDTH = 11;
+parameter RD_ADDR_WIDTH = 11;
+parameter WR_DATA_WIDTH = 18;
+parameter RD_DATA_WIDTH = 18;
+parameter BE_WIDTH = 2;
+
+input wire WEN_i;
+input wire REN_i;
+input wire clock0;
+input wire clock1;
+input wire [WR_ADDR_WIDTH-1 :0] WR_ADDR_i;
+input wire [RD_ADDR_WIDTH-1 :0] RD_ADDR_i;
+input wire [WR_DATA_WIDTH-1 :0] WDATA_i;
+output wire [RD_DATA_WIDTH-1 :0] RDATA_o;
+
+RAM_36K_BLK #(
+              .WR_ADDR_WIDTH(WR_ADDR_WIDTH),
+              .RD_ADDR_WIDTH(RD_ADDR_WIDTH),
+              .WR_DATA_WIDTH(WR_DATA_WIDTH),
+              .RD_DATA_WIDTH(RD_DATA_WIDTH),
+              .BE_WIDTH(BE_WIDTH)
+              ) spram_x36_inst (
+              
+              .WEN_i(WEN_i),
+              .WR_BE_i(2'b11),
+              .REN_i(REN_i),              
+              .WR_CLK_i(clock0),
+              .RD_CLK_i(clock1),
+              .WR_ADDR_i(WR_ADDR_i),
+              .RD_ADDR_i(RD_ADDR_i),
+              .WDATA_i(WDATA_i),
+              .RDATA_o(RDATA_o)
+              );
+              
+endmodule    
+
+module spram_16x2048 (
+    WEN_i,
+    REN_i,
+    clock0,
+    clock1,
+    WR_ADDR_i,
+    RD_ADDR_i,
+    WDATA_i,
+    RDATA_o
+);
+
+parameter WR_ADDR_WIDTH = 11;
+parameter RD_ADDR_WIDTH = 11;
+parameter WR_DATA_WIDTH = 16;
+parameter RD_DATA_WIDTH = 16;
+parameter BE_WIDTH = 2;
+
+input wire WEN_i;
+input wire REN_i;
+input wire clock0;
+input wire clock1;
+input wire [WR_ADDR_WIDTH-1 :0] WR_ADDR_i;
+input wire [RD_ADDR_WIDTH-1 :0] RD_ADDR_i;
+input wire [WR_DATA_WIDTH-1 :0] WDATA_i;
+output wire [RD_DATA_WIDTH-1 :0] RDATA_o;
+
+RAM_36K_BLK #(
+              .WR_ADDR_WIDTH(WR_ADDR_WIDTH),
+              .RD_ADDR_WIDTH(RD_ADDR_WIDTH),
+              .WR_DATA_WIDTH(WR_DATA_WIDTH),
+              .RD_DATA_WIDTH(RD_DATA_WIDTH),
+              .BE_WIDTH(BE_WIDTH)
+              ) spram_x36_inst (
+              
+              .WEN_i(WEN_i),
+              .WR_BE_i(2'b11),
+              .REN_i(REN_i),              
+              .WR_CLK_i(clock0),
+              .RD_CLK_i(clock1),
+              .WR_ADDR_i(WR_ADDR_i),
+              .RD_ADDR_i(RD_ADDR_i),
+              .WDATA_i(WDATA_i),
+              .RDATA_o(RDATA_o)
+              );
+              
+endmodule    
+
+module spram_9x4096 (
+    WEN_i,
+    REN_i,
+    clock0,
+    clock1,
+    WR_ADDR_i,
+    RD_ADDR_i,
+    WDATA_i,
+    RDATA_o
+);
+
+parameter WR_ADDR_WIDTH = 12;
+parameter RD_ADDR_WIDTH = 12;
+parameter WR_DATA_WIDTH = 9;
+parameter RD_DATA_WIDTH = 9;
+parameter BE_WIDTH = 1;
+
+input wire WEN_i;
+input wire REN_i;
+input wire clock0;
+input wire clock1;
+input wire [WR_ADDR_WIDTH-1 :0] WR_ADDR_i;
+input wire [RD_ADDR_WIDTH-1 :0] RD_ADDR_i;
+input wire [WR_DATA_WIDTH-1 :0] WDATA_i;
+output wire [RD_DATA_WIDTH-1 :0] RDATA_o;
+
+RAM_36K_BLK #(
+              .WR_ADDR_WIDTH(WR_ADDR_WIDTH),
+              .RD_ADDR_WIDTH(RD_ADDR_WIDTH),
+              .WR_DATA_WIDTH(WR_DATA_WIDTH),
+              .RD_DATA_WIDTH(RD_DATA_WIDTH),
+              .BE_WIDTH(BE_WIDTH)
+              ) spram_x36_inst (
+              
+              .WEN_i(WEN_i),
+              .WR_BE_i(1'b1),
+              .REN_i(REN_i),              
+              .WR_CLK_i(clock0),
+              .RD_CLK_i(clock1),
+              .WR_ADDR_i(WR_ADDR_i),
+              .RD_ADDR_i(RD_ADDR_i),
+              .WDATA_i(WDATA_i),
+              .RDATA_o(RDATA_o)
+              );
+              
+endmodule    
+
+module spram_8x4096 (
+    WEN_i,
+    REN_i,
+    clock0,
+    clock1,
+    WR_ADDR_i,
+    RD_ADDR_i,
+    WDATA_i,
+    RDATA_o
+);
+
+parameter WR_ADDR_WIDTH = 12;
+parameter RD_ADDR_WIDTH = 12;
+parameter WR_DATA_WIDTH = 8;
+parameter RD_DATA_WIDTH = 8;
+parameter BE_WIDTH = 1;
+
+input wire WEN_i;
+input wire REN_i;
+input wire clock0;
+input wire clock1;
+input wire [WR_ADDR_WIDTH-1 :0] WR_ADDR_i;
+input wire [RD_ADDR_WIDTH-1 :0] RD_ADDR_i;
+input wire [WR_DATA_WIDTH-1 :0] WDATA_i;
+output wire [RD_DATA_WIDTH-1 :0] RDATA_o;
+
+RAM_36K_BLK #(
+              .WR_ADDR_WIDTH(WR_ADDR_WIDTH),
+              .RD_ADDR_WIDTH(RD_ADDR_WIDTH),
+              .WR_DATA_WIDTH(WR_DATA_WIDTH),
+              .RD_DATA_WIDTH(RD_DATA_WIDTH),
+              .BE_WIDTH(BE_WIDTH)
+              ) spram_x36_inst (
+              
+              .WEN_i(WEN_i),
+              .WR_BE_i(1'b1),
+              .REN_i(REN_i),              
+              .WR_CLK_i(clock0),
+              .RD_CLK_i(clock1),
+              .WR_ADDR_i(WR_ADDR_i),
+              .RD_ADDR_i(RD_ADDR_i),
+              .WDATA_i(WDATA_i),
+              .RDATA_o(RDATA_o)
+              );
+              
+endmodule    
\ No newline at end of file
diff --git a/ql-qlf-plugin/tests/qlf_k6n10f/bram36k_sdp/sim/Makefile b/ql-qlf-plugin/tests/qlf_k6n10f/bram36k_sdp/sim/Makefile
new file mode 100644
index 0000000..05b231f
--- /dev/null
+++ b/ql-qlf-plugin/tests/qlf_k6n10f/bram36k_sdp/sim/Makefile
@@ -0,0 +1,50 @@
+# Copyright 2020-2022 F4PGA Authors
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+# SPDX-License-Identifier: Apache-2.0
+
+TESTBENCH = bram36k_sdp_tb.v
+POST_SYNTH = spram_36x1024_post_synth spram_32x1024_post_synth spram_18x2048_post_synth spram_16x2048_post_synth spram_9x4096_post_synth spram_8x4096_post_synth
+ADDR_WIDTH = 10 10 11 11 12 12
+DATA_WIDTH = 36 32 18 16 9 8
+TOP = spram_36x1024 spram_32x1024 spram_18x2048 spram_16x2048 spram_9x4096 spram_8x4096
+ADDR_DEFINES = $(foreach awidth, $(ADDR_WIDTH),-DADDR_WIDTH="$(awidth)")
+DATA_DEFINES = $(foreach dwidth, $(DATA_WIDTH),-DDATA_WIDTH="$(dwidth)")
+TOP_DEFINES = $(foreach top, $(TOP),-DTOP="$(top)")
+VCD_DEFINES = $(foreach vcd, $(POST_SYNTH),-DVCD="$(vcd).vcd")
+
+SIM_LIBS = $(shell find ../../../../qlf_k6n10f -name "*.v" -not -name "*_map.v")
+
+define simulate_post_synth
+	@iverilog  -vvvv -g2005 $(word $(1),$(ADDR_DEFINES)) $(word $(1),$(DATA_DEFINES)) $(word $(1),$(TOP_DEFINES)) $(word $(1),$(VCD_DEFINES)) -o $(word $(1),$(POST_SYNTH)).vvp $(word $(1),$(POST_SYNTH)).v $(SIM_LIBS) $(TESTBENCH) > $(word $(1),$(POST_SYNTH)).vvp.log 2>&1
+	@vvp -vvvv $(word $(1),$(POST_SYNTH)).vvp > $(word $(1),$(POST_SYNTH)).vcd.log 2>&1
+endef
+
+define clean_post_synth_sim
+	@rm -rf  $(word $(1),$(POST_SYNTH)).vcd $(word $(1),$(POST_SYNTH)).vvp $(word $(1),$(POST_SYNTH)).vvp.log $(word $(1),$(POST_SYNTH)).vcd.log
+endef
+
+sim:
+	$(call simulate_post_synth,1)
+	$(call clean_post_synth_sim,1)
+	$(call simulate_post_synth,2)
+	$(call clean_post_synth_sim,2)
+	$(call simulate_post_synth,3)
+	$(call clean_post_synth_sim,3)
+	$(call simulate_post_synth,4)
+	$(call clean_post_synth_sim,4)
+	$(call simulate_post_synth,5)
+	$(call clean_post_synth_sim,5)
+	$(call simulate_post_synth,6)
+	$(call clean_post_synth_sim,6)
\ No newline at end of file
diff --git a/ql-qlf-plugin/tests/qlf_k6n10f/bram36k_sdp/sim/bram36k_sdp_tb.v b/ql-qlf-plugin/tests/qlf_k6n10f/bram36k_sdp/sim/bram36k_sdp_tb.v
new file mode 100644
index 0000000..c47b873
--- /dev/null
+++ b/ql-qlf-plugin/tests/qlf_k6n10f/bram36k_sdp/sim/bram36k_sdp_tb.v
@@ -0,0 +1,176 @@
+// Copyright 2020-2022 F4PGA Authors
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//		 http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+// SPDX-License-Identifier: Apache-2.0
+
+`timescale 1ns/1ps
+
+`define STRINGIFY(x) `"x`"
+
+module TB;
+	localparam PERIOD = 50;
+	localparam ADDR_INCR = 1;
+
+	reg clk;
+	reg rce;
+	reg [`ADDR_WIDTH-1:0] ra;
+	wire [`DATA_WIDTH-1:0] rq;
+	reg wce;
+	reg [`ADDR_WIDTH-1:0] wa;
+	reg [`DATA_WIDTH-1:0] wd;
+
+	initial clk = 0;
+	initial ra = 0;
+	initial rce = 0;
+	initial forever #(PERIOD / 2.0) clk = ~clk;
+	initial begin
+		$dumpfile(`STRINGIFY(`VCD));
+		$dumpvars;
+	end
+
+	integer a;
+
+	reg done;
+	initial done = 1'b0;
+
+	reg [`DATA_WIDTH-1:0] expected;
+
+	always @(posedge clk) begin
+		expected <= (a | (a << 20) | 20'h55000) & {`DATA_WIDTH{1'b1}};
+	end
+
+	wire error = ((a != 0) && read_test) ? rq !== expected : 0;
+
+	integer error_cnt = 0;
+	always @ (posedge clk)
+	begin
+		if (error)
+			error_cnt <= error_cnt + 1'b1;
+	end
+
+	reg read_test;
+	initial read_test = 0;
+
+	initial #(1) begin
+		// Write data
+		for (a = 0; a < (1<<`ADDR_WIDTH); a = a + ADDR_INCR) begin
+			@(negedge clk) begin
+				wa = a;
+				wd = a | (a << 20) | 20'h55000;
+				wce = 1;
+			end
+			@(posedge clk) begin
+				#(PERIOD/10) wce = 0;
+			end
+		end
+		// Read data
+		read_test = 1;
+		for (a = 0; a < (1<<`ADDR_WIDTH); a = a + ADDR_INCR) begin
+			@(negedge clk) begin
+				ra = a;
+				rce = 1;
+			end
+			@(posedge clk) begin
+				#(PERIOD/10) rce = 0;
+				if ( rq !== expected) begin
+					$display("%d: FAIL: mismatch act=%x exp=%x at %x", $time, rq, expected, a);
+				end else begin
+					$display("%d: OK: act=%x exp=%x at %x", $time, rq, expected, a);
+				end
+			end
+		end
+		done = 1'b1;
+	end
+
+	// Scan for simulation finish
+	always @(posedge clk) begin
+		if (done)
+			$finish_and_return( (error_cnt == 0) ? 0 : -1 );
+	end
+
+	case (`STRINGIFY(`TOP))
+		"spram_36x1024": begin
+			spram_36x1024 #() bram (
+				.clock0(clk),
+				.clock1(clk),				 
+				.REN_i(rce),
+				.RD_ADDR_i(ra),
+				.RDATA_o(rq),
+				.WEN_i(wce),
+				.WR_ADDR_i(wa),
+				.WDATA_i(wd)
+			);
+		end
+		"spram_32x1024": begin
+			spram_32x1024 #() bram (
+				.clock0(clk),
+				.clock1(clk),				 
+				.REN_i(rce),
+				.RD_ADDR_i(ra),
+				.RDATA_o(rq),
+				.WEN_i(wce),
+				.WR_ADDR_i(wa),
+				.WDATA_i(wd)
+			);
+		end
+		"spram_18x2048": begin
+			spram_18x2048 #() bram (
+				.clock0(clk),
+				.clock1(clk),				 
+				.REN_i(rce),
+				.RD_ADDR_i(ra),
+				.RDATA_o(rq),
+				.WEN_i(wce),
+				.WR_ADDR_i(wa),
+				.WDATA_i(wd)
+			);
+		end
+		"spram_16x2048": begin
+			spram_16x2048 #() bram (
+				.clock0(clk),
+				.clock1(clk),				 
+				.REN_i(rce),
+				.RD_ADDR_i(ra),
+				.RDATA_o(rq),
+				.WEN_i(wce),
+				.WR_ADDR_i(wa),
+				.WDATA_i(wd)
+			);
+		end
+		"spram_9x4096": begin
+			spram_9x4096 #() bram (
+				.clock0(clk),
+				.clock1(clk),				 
+				.REN_i(rce),
+				.RD_ADDR_i(ra),
+				.RDATA_o(rq),
+				.WEN_i(wce),
+				.WR_ADDR_i(wa),
+				.WDATA_i(wd)
+			);
+		end
+		"spram_8x4096": begin
+			spram_8x4096 #() bram (
+				.clock0(clk),
+				.clock1(clk),				 
+				.REN_i(rce),
+				.RD_ADDR_i(ra),
+				.RDATA_o(rq),
+				.WEN_i(wce),
+				.WR_ADDR_i(wa),
+				.WDATA_i(wd)
+			);
+		end
+	endcase
+endmodule
diff --git a/ql-qlf-plugin/tests/qlf_k6n10f/bram36k_sfifo/bram36k_sfifo.tcl b/ql-qlf-plugin/tests/qlf_k6n10f/bram36k_sfifo/bram36k_sfifo.tcl
new file mode 100644
index 0000000..8ffd95f
--- /dev/null
+++ b/ql-qlf-plugin/tests/qlf_k6n10f/bram36k_sfifo/bram36k_sfifo.tcl
@@ -0,0 +1,38 @@
+yosys -import
+
+if { [info procs ql-qlf-k6n10f] == {} } { plugin -i ql-qlf }
+yosys -import  ;
+
+read_verilog $::env(DESIGN_TOP).v
+design -save bram36k_sfifo
+
+select f1024x36_1024x36
+select *
+synth_quicklogic -family qlf_k6n10f -top f1024x36_1024x36 -bram_types
+opt_expr -undriven
+opt_clean
+stat
+write_verilog sim/f1024x36_1024x36_post_synth.v
+select -assert-count 1 t:TDP36K_FIFO_SYNC_WR_X36_RD_X36_nonsplit
+
+select -clear
+design -load bram36k_sfifo
+select f2048x18_2048x18
+select *
+synth_quicklogic -family qlf_k6n10f -top f2048x18_2048x18 -bram_types
+opt_expr -undriven
+opt_clean
+stat
+write_verilog sim/f2048x18_2048x18_post_synth.v
+select -assert-count 1 t:TDP36K_FIFO_SYNC_WR_X18_RD_X18_nonsplit
+
+select -clear
+design -load bram36k_sfifo
+select f4096x9_4096x9
+select *
+synth_quicklogic -family qlf_k6n10f -top f4096x9_4096x9 -bram_types
+opt_expr -undriven
+opt_clean
+stat
+write_verilog sim/f4096x9_4096x9_post_synth.v
+select -assert-count 1 t:TDP36K_FIFO_SYNC_WR_X9_RD_X9_nonsplit
diff --git a/ql-qlf-plugin/tests/qlf_k6n10f/bram36k_sfifo/bram36k_sfifo.v b/ql-qlf-plugin/tests/qlf_k6n10f/bram36k_sfifo/bram36k_sfifo.v
new file mode 100644
index 0000000..d3bf2d6
--- /dev/null
+++ b/ql-qlf-plugin/tests/qlf_k6n10f/bram36k_sfifo/bram36k_sfifo.v
@@ -0,0 +1,135 @@
+// Copyright 2020-2022 F4PGA Authors
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+// SPDX-License-Identifier: Apache-2.0
+
+module f1024x36_1024x36 (DIN,PUSH,POP,clock0,Async_Flush,Almost_Full,Almost_Empty,Full,Empty,Full_Watermark,Empty_Watermark,Overrun_Error,Underrun_Error,DOUT);
+
+parameter WR_DATA_WIDTH = 36;
+parameter RD_DATA_WIDTH = 36;
+parameter UPAE_DBITS = 12'd10;
+parameter UPAF_DBITS = 12'd10;
+
+input clock0;
+input PUSH,POP;
+input [WR_DATA_WIDTH-1:0] DIN;
+input Async_Flush;
+output [RD_DATA_WIDTH-1:0] DOUT;
+output Almost_Full,Almost_Empty;
+output Full, Empty;
+output Full_Watermark, Empty_Watermark;
+output Overrun_Error, Underrun_Error;
+
+SFIFO_36K_BLK  # (.WR_DATA_WIDTH(WR_DATA_WIDTH),.RD_DATA_WIDTH(RD_DATA_WIDTH),.UPAE_DBITS(UPAE_DBITS),.UPAF_DBITS(UPAF_DBITS)
+                  )
+  FIFO_INST    (
+                .DIN(DIN),
+                .PUSH(PUSH),
+                .POP(POP),
+                .CLK(clock0),
+                .Async_Flush(Async_Flush),
+                
+                .Overrun_Error(Overrun_Error),
+                .Full_Watermark(Full_Watermark),
+                .Almost_Full(Almost_Full),
+                .Full(Full),
+                
+                .Underrun_Error(Underrun_Error),
+                .Empty_Watermark(Empty_Watermark),
+                .Almost_Empty(Almost_Empty),
+                .Empty(Empty),
+
+                .DOUT(DOUT)
+                );
+endmodule
+
+module f2048x18_2048x18 (DIN,PUSH,POP,clock0,Async_Flush,Almost_Full,Almost_Empty,Full,Empty,Full_Watermark,Empty_Watermark,Overrun_Error,Underrun_Error,DOUT);
+
+parameter WR_DATA_WIDTH = 18;
+parameter RD_DATA_WIDTH = 18;
+parameter UPAE_DBITS = 12'd10;
+parameter UPAF_DBITS = 12'd10;
+
+input clock0;
+input PUSH,POP;
+input [WR_DATA_WIDTH-1:0] DIN;
+input Async_Flush;
+output [RD_DATA_WIDTH-1:0] DOUT;
+output Almost_Full,Almost_Empty;
+output Full, Empty;
+output Full_Watermark, Empty_Watermark;
+output Overrun_Error, Underrun_Error;
+
+SFIFO_36K_BLK  # (.WR_DATA_WIDTH(WR_DATA_WIDTH),.RD_DATA_WIDTH(RD_DATA_WIDTH),.UPAE_DBITS(UPAE_DBITS),.UPAF_DBITS(UPAF_DBITS)
+                  )
+  FIFO_INST    (
+                .DIN(DIN),
+                .PUSH(PUSH),
+                .POP(POP),
+                .CLK(clock0),
+                .Async_Flush(Async_Flush),
+                
+                .Overrun_Error(Overrun_Error),
+                .Full_Watermark(Full_Watermark),
+                .Almost_Full(Almost_Full),
+                .Full(Full),
+                
+                .Underrun_Error(Underrun_Error),
+                .Empty_Watermark(Empty_Watermark),
+                .Almost_Empty(Almost_Empty),
+                .Empty(Empty),
+
+                .DOUT(DOUT)
+                );
+endmodule
+
+module f4096x9_4096x9 (DIN,PUSH,POP,clock0,Async_Flush,Almost_Full,Almost_Empty,Full,Empty,Full_Watermark,Empty_Watermark,Overrun_Error,Underrun_Error,DOUT);
+
+parameter WR_DATA_WIDTH = 9;
+parameter RD_DATA_WIDTH = 9;
+parameter UPAE_DBITS = 12'd10;
+parameter UPAF_DBITS = 12'd10;
+
+input clock0;
+input PUSH,POP;
+input [WR_DATA_WIDTH-1:0] DIN;
+input Async_Flush;
+output [RD_DATA_WIDTH-1:0] DOUT;
+output Almost_Full,Almost_Empty;
+output Full, Empty;
+output Full_Watermark, Empty_Watermark;
+output Overrun_Error, Underrun_Error;
+
+SFIFO_36K_BLK  # (.WR_DATA_WIDTH(WR_DATA_WIDTH),.RD_DATA_WIDTH(RD_DATA_WIDTH),.UPAE_DBITS(UPAE_DBITS),.UPAF_DBITS(UPAF_DBITS)
+                  )
+  FIFO_INST    (
+                .DIN(DIN),
+                .PUSH(PUSH),
+                .POP(POP),
+                .CLK(clock0),
+                .Async_Flush(Async_Flush),
+                
+                .Overrun_Error(Overrun_Error),
+                .Full_Watermark(Full_Watermark),
+                .Almost_Full(Almost_Full),
+                .Full(Full),
+                
+                .Underrun_Error(Underrun_Error),
+                .Empty_Watermark(Empty_Watermark),
+                .Almost_Empty(Almost_Empty),
+                .Empty(Empty),
+
+                .DOUT(DOUT)
+                );
+endmodule
\ No newline at end of file
diff --git a/ql-qlf-plugin/tests/qlf_k6n10f/bram36k_sfifo/sim/Makefile b/ql-qlf-plugin/tests/qlf_k6n10f/bram36k_sfifo/sim/Makefile
new file mode 100644
index 0000000..e31e1d0
--- /dev/null
+++ b/ql-qlf-plugin/tests/qlf_k6n10f/bram36k_sfifo/sim/Makefile
@@ -0,0 +1,48 @@
+# Copyright 2020-2022 F4PGA Authors
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+# SPDX-License-Identifier: Apache-2.0
+
+TESTBENCH = bram36k_sfifo_tb.v
+POST_SYNTH = f1024x36_1024x36_post_synth f2048x18_2048x18_post_synth f4096x9_4096x9_post_synth
+ADDR_WIDTH0 = 10 11 12
+DATA_WIDTH0 = 36 18 9
+ADDR_WIDTH1 = 10 11 12
+DATA_WIDTH1 = 36 18 9
+TOP = f1024x36_1024x36 f2048x18_2048x18 f4096x9_4096x9
+ADDR0_DEFINES = $(foreach awidth0, $(ADDR_WIDTH0),-DADDR_WIDTH0="$(awidth0)")
+ADDR1_DEFINES = $(foreach awidth1, $(ADDR_WIDTH1),-DADDR_WIDTH1="$(awidth1)")
+DATA0_DEFINES = $(foreach dwidth0, $(DATA_WIDTH0),-DDATA_WIDTH0="$(dwidth0)")
+DATA1_DEFINES = $(foreach dwidth1, $(DATA_WIDTH1),-DDATA_WIDTH1="$(dwidth1)")
+TOP_DEFINES = $(foreach top, $(TOP),-DTOP="$(top)")
+VCD_DEFINES = $(foreach vcd, $(POST_SYNTH),-DVCD="$(vcd).vcd")
+
+SIM_LIBS = $(shell find ../../../../qlf_k6n10f -name "*.v" -not -name "*_map.v")
+
+define simulate_post_synth
+	@iverilog  -vvvv -g2005 $(word $(1),$(ADDR0_DEFINES)) $(word $(1),$(ADDR1_DEFINES)) $(word $(1),$(DATA0_DEFINES)) $(word $(1),$(DATA1_DEFINES)) $(word $(1),$(TOP_DEFINES)) $(word $(1),$(VCD_DEFINES)) -o $(word $(1),$(POST_SYNTH)).vvp $(word $(1),$(POST_SYNTH)).v $(SIM_LIBS) $(TESTBENCH) > $(word $(1),$(POST_SYNTH)).vvp.log 2>&1
+	@vvp -vvvv $(word $(1),$(POST_SYNTH)).vvp > $(word $(1),$(POST_SYNTH)).vcd.log 2>&1
+endef
+
+define clean_post_synth_sim
+	@rm -rf  $(word $(1),$(POST_SYNTH)).vcd $(word $(1),$(POST_SYNTH)).vvp $(word $(1),$(POST_SYNTH)).vvp.log $(word $(1),$(POST_SYNTH)).vcd.log
+endef
+
+sim:
+	$(call simulate_post_synth,1)
+	$(call clean_post_synth_sim,1)
+	$(call simulate_post_synth,2)
+	$(call clean_post_synth_sim,2)
+	$(call simulate_post_synth,3)
+	$(call clean_post_synth_sim,3)
\ No newline at end of file
diff --git a/ql-qlf-plugin/tests/qlf_k6n10f/bram36k_sfifo/sim/bram36k_sfifo_tb.v b/ql-qlf-plugin/tests/qlf_k6n10f/bram36k_sfifo/sim/bram36k_sfifo_tb.v
new file mode 100644
index 0000000..76be519
--- /dev/null
+++ b/ql-qlf-plugin/tests/qlf_k6n10f/bram36k_sfifo/sim/bram36k_sfifo_tb.v
@@ -0,0 +1,170 @@
+// Copyright 2020-2022 F4PGA Authors
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//		 http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+// SPDX-License-Identifier: Apache-2.0
+
+`timescale 1ns/1ps
+
+`define STRINGIFY(x) `"x`"
+
+module TB;
+	localparam PERIOD = 30;
+	localparam ADDR_INCR = 1;
+
+	reg clk;
+	reg flush;
+	reg pop;
+	wire [`DATA_WIDTH1-1:0] dout;
+	reg push;
+	reg [`DATA_WIDTH0-1:0] din;
+	wire almost_full,almost_empty;
+	wire full, empty;
+	wire full_watermark, empty_watermark;
+	wire overrun_error, underrun_error;
+
+	initial 
+	begin
+		clk = 0;
+		pop = 0;
+		push = 0;
+		flush = 1;
+		din = 0;
+		#40
+		flush = 0;
+	end
+	
+	initial forever #(PERIOD / 3.0) clk = ~clk;
+	
+	initial begin
+		$dumpfile(`STRINGIFY(`VCD));
+		$dumpvars;
+	end
+
+	integer a;
+
+	reg done;
+	initial done = 1'b0;
+	
+	reg read_test;
+	initial read_test = 0;
+
+	reg [`DATA_WIDTH1-1:0] expected;
+	initial expected = 0;
+
+	always @(posedge clk) begin
+		expected <= (a | (a << 20) | 20'h55000) & {`DATA_WIDTH1{1'b1}};
+	end
+
+	wire error = ((a != 0) && read_test) ? dout !== expected : 0;
+
+	integer error_cnt = 0;
+	always @ (posedge clk)
+	begin
+		if (error)
+			error_cnt <= error_cnt + 1'b1; 
+	end
+
+	initial #(50) begin
+		@(posedge clk)
+		// Write data
+		for (a = 0; a < (1<<`ADDR_WIDTH0); a = a + ADDR_INCR) begin
+			@(negedge clk) begin
+				din = a | (a << 20) | 20'h55000;
+				push = 1;
+			end
+			@(posedge clk) begin
+				#(PERIOD/10) push = 0;
+			end
+		end
+		// Read data
+		read_test = 1;
+		for (a = 0; a < (1<<`ADDR_WIDTH1); a = a + ADDR_INCR) begin
+			@(posedge clk) begin
+				#(PERIOD/10) pop = 0;
+				if ( dout !== expected) begin
+					$display("%d: FAIL: mismatch act=%x exp=%x at %x", $time, dout, expected, a);
+				end else begin
+					$display("%d: OK: act=%x exp=%x at %x", $time, dout, expected, a);
+				end
+			end
+			@(negedge clk) begin
+				pop = 1;
+			end
+		end
+		done = 1'b1;
+	end
+
+	// Scan for simulation finish
+	always @(posedge clk) begin
+		if (done)
+			$finish_and_return( (error_cnt == 0) ? 0 : -1 );
+	end
+
+	case (`STRINGIFY(`TOP))
+		"f1024x36_1024x36": begin
+			f1024x36_1024x36 #() afifo (
+				.DIN(din),
+				.PUSH(push),
+				.POP(pop),
+				.clock0(clk),
+				.Async_Flush(flush),
+				.Almost_Full(almost_full),
+				.Almost_Empty(almost_empty),
+				.Full(full),
+				.Empty(empty),
+				.Full_Watermark(full_watermark),
+				.Empty_Watermark(empty_watermark),
+				.Overrun_Error(overrun_error),
+				.Underrun_Error(underrun_error),
+				.DOUT(dout)
+			);
+		end
+		"f2048x18_2048x18": begin
+			f2048x18_2048x18 #() afifo (
+				.DIN(din),
+				.PUSH(push),
+				.POP(pop),
+				.clock0(clk),
+				.Async_Flush(flush),
+				.Almost_Full(almost_full),
+				.Almost_Empty(almost_empty),
+				.Full(full),
+				.Empty(empty),
+				.Full_Watermark(full_watermark),
+				.Empty_Watermark(empty_watermark),
+				.Overrun_Error(overrun_error),
+				.Underrun_Error(underrun_error),
+				.DOUT(dout)
+			);
+		end
+		"f4096x9_4096x9": begin
+			f4096x9_4096x9 #() afifo (
+				.DIN(din),
+				.PUSH(push),
+				.POP(pop),
+				.clock0(clk),
+				.Async_Flush(flush),
+				.Almost_Full(almost_full),
+				.Almost_Empty(almost_empty),
+				.Full(full),
+				.Empty(empty),
+				.Full_Watermark(full_watermark),
+				.Empty_Watermark(empty_watermark),
+				.Overrun_Error(overrun_error),
+				.Underrun_Error(underrun_error),
+				.DOUT(dout)
+			);
+		end		
+	endcase
+endmodule
diff --git a/ql-qlf-plugin/tests/qlf_k6n10f/bram36k_tdp/bram36k_tdp.tcl b/ql-qlf-plugin/tests/qlf_k6n10f/bram36k_tdp/bram36k_tdp.tcl
new file mode 100644
index 0000000..df4591e
--- /dev/null
+++ b/ql-qlf-plugin/tests/qlf_k6n10f/bram36k_tdp/bram36k_tdp.tcl
@@ -0,0 +1,38 @@
+yosys -import
+
+if { [info procs ql-qlf-k6n10f] == {} } { plugin -i ql-qlf }
+yosys -import  ;
+
+read_verilog $::env(DESIGN_TOP).v
+design -save bram36k_tdp
+
+select dpram_36x1024
+select *
+synth_quicklogic -family qlf_k6n10f -top dpram_36x1024 -bram_types
+opt_expr -undriven
+opt_clean
+stat
+write_verilog sim/dpram_36x1024_post_synth.v
+select -assert-count 1 t:TDP36K_BRAM_WR_X36_RD_X36_nonsplit
+
+select -clear
+design -load bram36k_tdp
+select dpram_18x2048
+select *
+synth_quicklogic -family qlf_k6n10f -top dpram_18x2048 -bram_types
+opt_expr -undriven
+opt_clean
+stat
+write_verilog sim/dpram_18x2048_post_synth.v
+select -assert-count 1 t:TDP36K_BRAM_WR_X18_RD_X18_nonsplit
+
+select -clear
+design -load bram36k_tdp
+select dpram_9x4096
+select *
+synth_quicklogic -family qlf_k6n10f -top dpram_9x4096 -bram_types
+opt_expr -undriven
+opt_clean
+stat
+write_verilog sim/dpram_9x4096_post_synth.v
+select -assert-count 1 t:TDP36K_BRAM_WR_X9_RD_X9_nonsplit
\ No newline at end of file
diff --git a/ql-qlf-plugin/tests/qlf_k6n10f/bram36k_tdp/bram36k_tdp.v b/ql-qlf-plugin/tests/qlf_k6n10f/bram36k_tdp/bram36k_tdp.v
new file mode 100644
index 0000000..89fdbec
--- /dev/null
+++ b/ql-qlf-plugin/tests/qlf_k6n10f/bram36k_tdp/bram36k_tdp.v
@@ -0,0 +1,213 @@
+// Copyright 2020-2022 F4PGA Authors
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+// SPDX-License-Identifier: Apache-2.0
+
+module dpram_36x1024 (
+    clock0,
+    WEN1_i,
+    REN1_i,
+    WR1_ADDR_i,
+    RD1_ADDR_i,
+    WDATA1_i,
+    RDATA1_o,
+    
+    clock1,
+    WEN2_i,
+    REN2_i,
+    WR2_ADDR_i,
+    RD2_ADDR_i,
+    WDATA2_i,
+    RDATA2_o
+);
+
+parameter ADDR_WIDTH = 10;
+parameter DATA_WIDTH = 36;
+parameter BE1_WIDTH = 4;
+parameter BE2_WIDTH = 4;
+
+input wire clock0;
+input wire WEN1_i;
+input wire REN1_i;
+input wire [ADDR_WIDTH-1 :0] WR1_ADDR_i;
+input wire [ADDR_WIDTH-1 :0] RD1_ADDR_i;
+input wire [DATA_WIDTH-1 :0] WDATA1_i;
+output wire [DATA_WIDTH-1 :0] RDATA1_o;
+
+input wire clock1;
+input wire WEN2_i;
+input wire REN2_i;
+input wire [ADDR_WIDTH-1 :0] WR2_ADDR_i;
+input wire [ADDR_WIDTH-1 :0] RD2_ADDR_i;
+input wire [DATA_WIDTH-1 :0] WDATA2_i;
+output wire [DATA_WIDTH-1 :0] RDATA2_o;
+
+DPRAM_36K_BLK #(
+              .ADDR_WIDTH(ADDR_WIDTH),
+              .DATA_WIDTH(DATA_WIDTH),
+              .BE1_WIDTH(BE1_WIDTH),
+              .BE2_WIDTH(BE2_WIDTH)
+              ) dpram_x36_inst (             
+              .CLK1_i(clock0),
+              .WEN1_i(WEN1_i),
+              .WR1_BE_i(4'b1111),
+              .REN1_i(REN1_i),
+              .WR1_ADDR_i(WR1_ADDR_i),
+              .RD1_ADDR_i(RD1_ADDR_i),
+              .WDATA1_i(WDATA1_i),
+              .RDATA1_o(RDATA1_o),
+              
+              .CLK2_i(clock1),
+              .WEN2_i(WEN2_i),
+              .WR2_BE_i(4'b1111),
+              .REN2_i(REN2_i),
+              .WR2_ADDR_i(WR2_ADDR_i),
+              .RD2_ADDR_i(RD2_ADDR_i),
+              .WDATA2_i(WDATA2_i),
+              .RDATA2_o(RDATA2_o)
+              );
+
+endmodule
+
+module dpram_18x2048 (
+    clock0,
+    WEN1_i,
+    REN1_i,
+    WR1_ADDR_i,
+    RD1_ADDR_i,
+    WDATA1_i,
+    RDATA1_o,
+    
+    clock1,
+    WEN2_i,
+    REN2_i,
+    WR2_ADDR_i,
+    RD2_ADDR_i,
+    WDATA2_i,
+    RDATA2_o
+);
+
+parameter ADDR_WIDTH = 11;
+parameter DATA_WIDTH = 18;
+parameter BE1_WIDTH = 2;
+parameter BE2_WIDTH = 2;
+
+input wire clock0;
+input wire WEN1_i;
+input wire REN1_i;
+input wire [ADDR_WIDTH-1 :0] WR1_ADDR_i;
+input wire [ADDR_WIDTH-1 :0] RD1_ADDR_i;
+input wire [DATA_WIDTH-1 :0] WDATA1_i;
+output wire [DATA_WIDTH-1 :0] RDATA1_o;
+
+input wire clock1;
+input wire WEN2_i;
+input wire REN2_i;
+input wire [ADDR_WIDTH-1 :0] WR2_ADDR_i;
+input wire [ADDR_WIDTH-1 :0] RD2_ADDR_i;
+input wire [DATA_WIDTH-1 :0] WDATA2_i;
+output wire [DATA_WIDTH-1 :0] RDATA2_o;
+
+DPRAM_36K_BLK #(
+              .ADDR_WIDTH(ADDR_WIDTH),
+              .DATA_WIDTH(DATA_WIDTH),
+              .BE1_WIDTH(BE1_WIDTH),
+              .BE2_WIDTH(BE2_WIDTH)
+              ) dpram_x36_inst (             
+              .CLK1_i(clock0),
+              .WEN1_i(WEN1_i),
+              .WR1_BE_i(2'b11),
+              .REN1_i(REN1_i),
+              .WR1_ADDR_i(WR1_ADDR_i),
+              .RD1_ADDR_i(RD1_ADDR_i),
+              .WDATA1_i(WDATA1_i),
+              .RDATA1_o(RDATA1_o),
+              
+              .CLK2_i(clock1),
+              .WEN2_i(WEN2_i),
+              .WR2_BE_i(2'b11),
+              .REN2_i(REN2_i),
+              .WR2_ADDR_i(WR2_ADDR_i),
+              .RD2_ADDR_i(RD2_ADDR_i),
+              .WDATA2_i(WDATA2_i),
+              .RDATA2_o(RDATA2_o)
+              );
+
+endmodule
+
+module dpram_9x4096 (
+    clock0,
+    WEN1_i,
+    REN1_i,
+    WR1_ADDR_i,
+    RD1_ADDR_i,
+    WDATA1_i,
+    RDATA1_o,
+    
+    clock1,
+    WEN2_i,
+    REN2_i,
+    WR2_ADDR_i,
+    RD2_ADDR_i,
+    WDATA2_i,
+    RDATA2_o
+);
+
+parameter ADDR_WIDTH = 12;
+parameter DATA_WIDTH = 9;
+parameter BE1_WIDTH = 1;
+parameter BE2_WIDTH = 1;
+
+input wire clock0;
+input wire WEN1_i;
+input wire REN1_i;
+input wire [ADDR_WIDTH-1 :0] WR1_ADDR_i;
+input wire [ADDR_WIDTH-1 :0] RD1_ADDR_i;
+input wire [DATA_WIDTH-1 :0] WDATA1_i;
+output wire [DATA_WIDTH-1 :0] RDATA1_o;
+
+input wire clock1;
+input wire WEN2_i;
+input wire REN2_i;
+input wire [ADDR_WIDTH-1 :0] WR2_ADDR_i;
+input wire [ADDR_WIDTH-1 :0] RD2_ADDR_i;
+input wire [DATA_WIDTH-1 :0] WDATA2_i;
+output wire [DATA_WIDTH-1 :0] RDATA2_o;
+
+DPRAM_36K_BLK #(
+              .ADDR_WIDTH(ADDR_WIDTH),
+              .DATA_WIDTH(DATA_WIDTH),
+              .BE1_WIDTH(BE1_WIDTH),
+              .BE2_WIDTH(BE2_WIDTH)
+              ) dpram_x36_inst (             
+              .CLK1_i(clock0),
+              .WEN1_i(WEN1_i),
+              .WR1_BE_i(1'b1),
+              .REN1_i(REN1_i),
+              .WR1_ADDR_i(WR1_ADDR_i),
+              .RD1_ADDR_i(RD1_ADDR_i),
+              .WDATA1_i(WDATA1_i),
+              .RDATA1_o(RDATA1_o),
+              
+              .CLK2_i(clock1),
+              .WEN2_i(WEN2_i),
+              .WR2_BE_i(1'b1),
+              .REN2_i(REN2_i),
+              .WR2_ADDR_i(WR2_ADDR_i),
+              .RD2_ADDR_i(RD2_ADDR_i),
+              .WDATA2_i(WDATA2_i),
+              .RDATA2_o(RDATA2_o)
+              );
+
+endmodule
diff --git a/ql-qlf-plugin/tests/qlf_k6n10f/bram36k_tdp/sim/Makefile b/ql-qlf-plugin/tests/qlf_k6n10f/bram36k_tdp/sim/Makefile
new file mode 100644
index 0000000..6ce8344
--- /dev/null
+++ b/ql-qlf-plugin/tests/qlf_k6n10f/bram36k_tdp/sim/Makefile
@@ -0,0 +1,44 @@
+# Copyright 2020-2022 F4PGA Authors
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+# SPDX-License-Identifier: Apache-2.0
+
+TESTBENCH = bram36k_tdp_tb.v
+POST_SYNTH = dpram_36x1024_post_synth dpram_18x2048_post_synth dpram_9x4096_post_synth
+ADDR_WIDTH = 10 11 12
+DATA_WIDTH = 36 18 9
+TOP = dpram_36x1024 dpram_18x2048 dpram_9x4096
+ADDR_DEFINES = $(foreach awidth, $(ADDR_WIDTH),-DADDR_WIDTH="$(awidth)")
+DATA_DEFINES = $(foreach dwidth, $(DATA_WIDTH),-DDATA_WIDTH="$(dwidth)")
+TOP_DEFINES = $(foreach top, $(TOP),-DTOP="$(top)")
+VCD_DEFINES = $(foreach vcd, $(POST_SYNTH),-DVCD="$(vcd).vcd")
+
+SIM_LIBS = $(shell find ../../../../qlf_k6n10f -name "*.v" -not -name "*_map.v")
+
+define simulate_post_synth
+	@iverilog  -vvvv -g2005 $(word $(1),$(ADDR_DEFINES)) $(word $(1),$(DATA_DEFINES)) $(word $(1),$(TOP_DEFINES)) $(word $(1),$(VCD_DEFINES)) -o $(word $(1),$(POST_SYNTH)).vvp $(word $(1),$(POST_SYNTH)).v $(SIM_LIBS) $(TESTBENCH) > $(word $(1),$(POST_SYNTH)).vvp.log 2>&1
+	@vvp -vvvv $(word $(1),$(POST_SYNTH)).vvp > $(word $(1),$(POST_SYNTH)).vcd.log 2>&1
+endef
+
+define clean_post_synth_sim
+	@rm -rf  $(word $(1),$(POST_SYNTH)).vcd $(word $(1),$(POST_SYNTH)).vvp $(word $(1),$(POST_SYNTH)).vvp.log $(word $(1),$(POST_SYNTH)).vcd.log
+endef
+
+sim:
+	$(call simulate_post_synth,1)
+	$(call clean_post_synth_sim,1)
+	$(call simulate_post_synth,2)
+	$(call clean_post_synth_sim,2)
+	$(call simulate_post_synth,3)
+	$(call clean_post_synth_sim,3)
diff --git a/ql-qlf-plugin/tests/qlf_k6n10f/bram36k_tdp/sim/bram36k_tdp_tb.v b/ql-qlf-plugin/tests/qlf_k6n10f/bram36k_tdp/sim/bram36k_tdp_tb.v
new file mode 100644
index 0000000..646561a
--- /dev/null
+++ b/ql-qlf-plugin/tests/qlf_k6n10f/bram36k_tdp/sim/bram36k_tdp_tb.v
@@ -0,0 +1,220 @@
+// Copyright 2020-2022 F4PGA Authors
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//		 http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+// SPDX-License-Identifier: Apache-2.0
+
+`timescale 1ns/1ps
+
+`define STRINGIFY(x) `"x`"
+
+module TB;
+	localparam PERIOD = 50;
+	localparam ADDR_INCR = 1;
+
+	reg clk_a;
+	reg rce_a;
+	reg [`ADDR_WIDTH-1:0] ra_a;
+	wire [`DATA_WIDTH-1:0] rq_a;
+	reg wce_a;
+	reg [`ADDR_WIDTH-1:0] wa_a;
+	reg [`DATA_WIDTH-1:0] wd_a;
+
+	reg clk_b;
+	reg rce_b;
+	reg [`ADDR_WIDTH-1:0] ra_b;
+	wire [`DATA_WIDTH-1:0] rq_b;
+	reg wce_b;
+	reg [`ADDR_WIDTH-1:0] wa_b;
+	reg [`DATA_WIDTH-1:0] wd_b;
+
+
+	initial clk_a = 0;
+	initial clk_b = 0;
+	initial ra_a = 0;
+	initial ra_b = 0;
+	initial rce_a = 0;
+	initial rce_b = 0;
+	initial forever #(PERIOD / 2.0) clk_a = ~clk_a;
+	initial begin
+		#(PERIOD / 4.0);
+		forever #(PERIOD / 2.0) clk_b = ~clk_b;
+	end
+	initial begin
+		$dumpfile(`STRINGIFY(`VCD));
+		$dumpvars;
+	end
+
+	integer a;
+	integer b;
+
+	reg done_a;
+	reg done_b;
+	initial done_a = 1'b0;
+	initial done_b = 1'b0;
+	wire done_sim = done_a & done_b;
+
+	reg [`DATA_WIDTH-1:0] expected_a;
+	reg [`DATA_WIDTH-1:0] expected_b;
+
+	always @(posedge clk_a) begin
+		expected_a <= (a | (a << 20) | 20'h55000) & {`DATA_WIDTH{1'b1}};
+	end
+	always @(posedge clk_b) begin
+		expected_b <= (b | (b << 20) | 20'h55000) & {`DATA_WIDTH{1'b1}};
+	end
+
+	wire error_a = a != 0 ? rq_a !== expected_a : 0;
+	wire error_b = b != (1<<`ADDR_WIDTH) / 2 ? rq_b !== expected_b : 0;
+
+	integer error_a_cnt = 0;
+	integer error_b_cnt = 0;
+
+	always @ (posedge clk_a)
+	begin
+		if (error_a)
+			error_a_cnt <= error_a_cnt + 1'b1;
+	end
+	always @ (posedge clk_b)
+	begin
+		if (error_b)
+			error_b_cnt <= error_b_cnt + 1'b1;
+	end
+	// PORT A
+	initial #(1) begin
+		// Write data
+		for (a = 0; a < (1<<`ADDR_WIDTH) / 2; a = a + ADDR_INCR) begin
+			@(negedge clk_a) begin
+				wa_a = a;
+				wd_a = a | (a << 20) | 20'h55000;
+				wce_a = 1;
+			end
+			@(posedge clk_a) begin
+				#(PERIOD/10) wce_a = 0;
+			end
+		end
+		// Read data
+		for (a = 0; a < (1<<`ADDR_WIDTH) / 2; a = a + ADDR_INCR) begin
+			@(negedge clk_a) begin
+				ra_a = a;
+				rce_a = 1;
+			end
+			@(posedge clk_a) begin
+				#(PERIOD/10) rce_a = 0;
+				if ( rq_a !== expected_a) begin
+					$display("%d: PORT A: FAIL: mismatch act=%x exp=%x at %x", $time, rq_a, expected_a, a);
+				end else begin
+					$display("%d: PORT A: OK: act=%x exp=%x at %x", $time, rq_a, expected_a, a);
+				end
+			end
+		end
+		done_a = 1'b1;
+	end
+
+	// PORT B
+	initial #(1) begin
+		// Write data
+		for (b = (1<<`ADDR_WIDTH) / 2; b < (1<<`ADDR_WIDTH); b = b + ADDR_INCR) begin
+			@(negedge clk_b) begin
+				wa_b = b;
+				wd_b = b | (b << 20) | 20'h55000;
+				wce_b = 1;
+			end
+			@(posedge clk_b) begin
+				#(PERIOD/10) wce_b = 0;
+			end
+		end
+		// Read data
+		for (b = (1<<`ADDR_WIDTH) / 2; b < (1<<`ADDR_WIDTH); b = b + ADDR_INCR) begin
+			@(negedge clk_b) begin
+				ra_b = b;
+				rce_b = 1;
+			end
+			@(posedge clk_b) begin
+				#(PERIOD/10) rce_b = 0;
+				if ( rq_b !== expected_b) begin
+					$display("%d: PORT B: FAIL: mismatch act=%x exp=%x at %x", $time, rq_b, expected_b, b);
+				end else begin
+					$display("%d: PORT B: OK: act=%x exp=%x at %x", $time, rq_b, expected_b, b);
+				end
+			end
+		end
+		done_b = 1'b1;
+	end
+
+	// Scan for simulation finish
+	always @(posedge clk_a, posedge clk_b) begin
+		if (done_sim)
+			$finish_and_return( (error_a_cnt == 0 & error_b_cnt == 0) ? 0 : -1 );
+	end
+	
+	case (`STRINGIFY(`TOP))
+		"dpram_36x1024": begin
+			dpram_36x1024 #() bram (
+				.clock0(clk_a),
+				.REN1_i(rce_a),
+				.RD1_ADDR_i(ra_a),
+				.RDATA1_o(rq_a),
+				.WEN1_i(wce_a),
+				.WR1_ADDR_i(wa_a),
+				.WDATA1_i(wd_a),
+				
+				.clock1(clk_b),
+				.REN2_i(rce_b),
+				.RD2_ADDR_i(ra_b),
+				.RDATA2_o(rq_b),
+				.WEN2_i(wce_b),
+				.WR2_ADDR_i(wa_b),
+				.WDATA2_i(wd_b)
+			);
+		end
+		"dpram_18x2048": begin
+			dpram_18x2048 #() bram (
+				.clock0(clk_a),
+				.REN1_i(rce_a),
+				.RD1_ADDR_i(ra_a),
+				.RDATA1_o(rq_a),
+				.WEN1_i(wce_a),
+				.WR1_ADDR_i(wa_a),
+				.WDATA1_i(wd_a),
+				
+				.clock1(clk_b),
+				.REN2_i(rce_b),
+				.RD2_ADDR_i(ra_b),
+				.RDATA2_o(rq_b),
+				.WEN2_i(wce_b),
+				.WR2_ADDR_i(wa_b),
+				.WDATA2_i(wd_b)
+			);
+		end
+		"dpram_9x4096": begin
+			dpram_9x4096 #() bram (
+				.clock0(clk_a),
+				.REN1_i(rce_a),
+				.RD1_ADDR_i(ra_a),
+				.RDATA1_o(rq_a),
+				.WEN1_i(wce_a),
+				.WR1_ADDR_i(wa_a),
+				.WDATA1_i(wd_a),
+				
+				.clock1(clk_b),
+				.REN2_i(rce_b),
+				.RD2_ADDR_i(ra_b),
+				.RDATA2_o(rq_b),
+				.WEN2_i(wce_b),
+				.WR2_ADDR_i(wa_b),
+				.WDATA2_i(wd_b)
+			);
+		end
+	endcase
+endmodule
diff --git a/ql-qlf-plugin/tests/qlf_k6n10f/bram_asymmetric_wider_read/bram_asymmetric_wider_read.tcl b/ql-qlf-plugin/tests/qlf_k6n10f/bram_asymmetric_wider_read/bram_asymmetric_wider_read.tcl
index b413b43..1ae531a 100644
--- a/ql-qlf-plugin/tests/qlf_k6n10f/bram_asymmetric_wider_read/bram_asymmetric_wider_read.tcl
+++ b/ql-qlf-plugin/tests/qlf_k6n10f/bram_asymmetric_wider_read/bram_asymmetric_wider_read.tcl
@@ -8,46 +8,46 @@
 
 select spram_16x2048_32x1024
 select *
-synth_quicklogic -family qlf_k6n10f -top spram_16x2048_32x1024
+synth_quicklogic -family qlf_k6n10f -top spram_16x2048_32x1024 -bram_types
 opt_expr -undriven
 opt_clean
 stat
 write_verilog sim/spram_16x2048_32x1024_post_synth.v
-select -assert-count 1 t:TDP36K
+select -assert-count 1 t:TDP36K_BRAM_WR_X18_RD_X36_nonsplit
 select -assert-count 1 t:*
 
 select -clear
 design -load bram_tdp
 select spram_8x4096_16x2048
 select *
-synth_quicklogic -family qlf_k6n10f -top spram_8x4096_16x2048
+synth_quicklogic -family qlf_k6n10f -top spram_8x4096_16x2048 -bram_types
 opt_expr -undriven
 opt_clean
 stat
 write_verilog sim/spram_8x4096_16x2048_post_synth.v
-select -assert-count 1 t:TDP36K
+select -assert-count 1 t:TDP36K_BRAM_WR_X9_RD_X18_nonsplit
 select -assert-count 1 t:*
 
 select -clear
 design -load bram_tdp
 select spram_8x2048_16x1024
 select *
-synth_quicklogic -family qlf_k6n10f -top spram_8x2048_16x1024
+synth_quicklogic -family qlf_k6n10f -top spram_8x2048_16x1024 -bram_types
 opt_expr -undriven
 opt_clean
 stat
 write_verilog sim/spram_8x2048_16x1024_post_synth.v
-select -assert-count 1 t:TDP36K
+select -assert-count 1 t:TDP36K_BRAM_WR_X9_RD_X18_nonsplit
 select -assert-count 1 t:*
 
 select -clear
 design -load bram_tdp
 select spram_8x4096_32x1024
 select *
-synth_quicklogic -family qlf_k6n10f -top spram_8x4096_32x1024
+synth_quicklogic -family qlf_k6n10f -top spram_8x4096_32x1024 -bram_types
 opt_expr -undriven
 opt_clean
 stat
 write_verilog sim/spram_8x4096_32x1024_post_synth.v
-select -assert-count 1 t:TDP36K
+select -assert-count 1 t:TDP36K_BRAM_WR_X9_RD_X36_nonsplit
 select -assert-count 1 t:*
diff --git a/ql-qlf-plugin/tests/qlf_k6n10f/bram_asymmetric_wider_write/bram_asymmetric_wider_write.tcl b/ql-qlf-plugin/tests/qlf_k6n10f/bram_asymmetric_wider_write/bram_asymmetric_wider_write.tcl
index 9d086bb..254c2ea 100644
--- a/ql-qlf-plugin/tests/qlf_k6n10f/bram_asymmetric_wider_write/bram_asymmetric_wider_write.tcl
+++ b/ql-qlf-plugin/tests/qlf_k6n10f/bram_asymmetric_wider_write/bram_asymmetric_wider_write.tcl
@@ -8,46 +8,46 @@
 
 select spram_16x1024_8x2048
 select *
-synth_quicklogic -family qlf_k6n10f -top spram_16x1024_8x2048
+synth_quicklogic -family qlf_k6n10f -top spram_16x1024_8x2048 -bram_types
 opt_expr -undriven
 opt_clean
 stat
 write_verilog sim/spram_16x1024_8x2048_post_synth.v
-select -assert-count 1 t:TDP36K
+select -assert-count 1 t:TDP36K_BRAM_WR_X18_RD_X9_nonsplit
 select -assert-count 1 t:*
 
 select -clear
 design -load bram_tdp
 select spram_16x2048_8x4096
 select *
-synth_quicklogic -family qlf_k6n10f -top spram_16x2048_8x4096
+synth_quicklogic -family qlf_k6n10f -top spram_16x2048_8x4096 -bram_types
 opt_expr -undriven
 opt_clean
 stat
 write_verilog sim/spram_16x2048_8x4096_post_synth.v
-select -assert-count 1 t:TDP36K
+select -assert-count 1 t:TDP36K_BRAM_WR_X18_RD_X9_nonsplit
 select -assert-count 1 t:*
 
 select -clear
 design -load bram_tdp
 select spram_32x1024_16x2048
 select *
-synth_quicklogic -family qlf_k6n10f -top spram_32x1024_16x2048
+synth_quicklogic -family qlf_k6n10f -top spram_32x1024_16x2048 -bram_types
 opt_expr -undriven
 opt_clean
 stat
 write_verilog sim/spram_32x1024_16x2048_post_synth.v
-select -assert-count 1 t:TDP36K
+select -assert-count 1 t:TDP36K_BRAM_WR_X36_RD_X18_nonsplit
 select -assert-count 1 t:*
 
 select -clear
 design -load bram_tdp
 select spram_32x1024_8x4096
 select *
-synth_quicklogic -family qlf_k6n10f -top spram_32x1024_8x4096
+synth_quicklogic -family qlf_k6n10f -top spram_32x1024_8x4096 -bram_types
 opt_expr -undriven
 opt_clean
 stat
 write_verilog sim/spram_32x1024_8x4096_post_synth.v
-select -assert-count 1 t:TDP36K
+select -assert-count 1 t:TDP36K_BRAM_WR_X36_RD_X9_nonsplit
 select -assert-count 1 t:*
diff --git a/ql-qlf-plugin/tests/qlf_k6n10f/bram_sdp/bram_sdp.tcl b/ql-qlf-plugin/tests/qlf_k6n10f/bram_sdp/bram_sdp.tcl
index f8567ce..4e98585 100644
--- a/ql-qlf-plugin/tests/qlf_k6n10f/bram_sdp/bram_sdp.tcl
+++ b/ql-qlf-plugin/tests/qlf_k6n10f/bram_sdp/bram_sdp.tcl
@@ -8,98 +8,98 @@
 
 select BRAM_SDP_36x1024
 select *
-synth_quicklogic -family qlf_k6n10f -top BRAM_SDP_36x1024
+synth_quicklogic -family qlf_k6n10f -top BRAM_SDP_36x1024 -bram_types
 opt_expr -undriven
 opt_clean
 stat
 write_verilog sim/bram_sdp_36x1024_post_synth.v
-select -assert-count 1 t:TDP36K
+select -assert-count 1 t:TDP36K_BRAM_WR_X36_RD_X36_nonsplit
 
 select -clear
 design -load bram_sdp
 select BRAM_SDP_32x1024
 select *
-synth_quicklogic -family qlf_k6n10f -top BRAM_SDP_32x1024
+synth_quicklogic -family qlf_k6n10f -top BRAM_SDP_32x1024 -bram_types
 opt_expr -undriven
 opt_clean
 stat
 write_verilog sim/bram_sdp_32x1024_post_synth.v
-select -assert-count 1 t:TDP36K
+select -assert-count 1 t:TDP36K_BRAM_WR_X36_RD_X36_nonsplit
 
 select -clear
 design -load bram_sdp
 select BRAM_SDP_18x2048
 select *
-synth_quicklogic -family qlf_k6n10f -top BRAM_SDP_18x2048
+synth_quicklogic -family qlf_k6n10f -top BRAM_SDP_18x2048 -bram_types
 opt_expr -undriven
 opt_clean
 stat
 write_verilog sim/bram_sdp_18x2048_post_synth.v
-select -assert-count 1 t:TDP36K
+select -assert-count 1 t:TDP36K_BRAM_WR_X18_RD_X18_nonsplit
 
 select -clear
 design -load bram_sdp
 select BRAM_SDP_16x2048
 select *
-synth_quicklogic -family qlf_k6n10f -top BRAM_SDP_16x2048
+synth_quicklogic -family qlf_k6n10f -top BRAM_SDP_16x2048 -bram_types
 opt_expr -undriven
 opt_clean
 stat
 write_verilog sim/bram_sdp_16x2048_post_synth.v
-select -assert-count 1 t:TDP36K
+select -assert-count 1 t:TDP36K_BRAM_WR_X18_RD_X18_nonsplit
 
 select -clear
 design -load bram_sdp
 select BRAM_SDP_9x4096
 select *
-synth_quicklogic -family qlf_k6n10f -top BRAM_SDP_9x4096
+synth_quicklogic -family qlf_k6n10f -top BRAM_SDP_9x4096 -bram_types
 opt_expr -undriven
 opt_clean
 stat
 write_verilog sim/bram_sdp_9x4096_post_synth.v
-select -assert-count 1 t:TDP36K
+select -assert-count 1 t:TDP36K_BRAM_WR_X9_RD_X9_nonsplit
 
 select -clear
 design -load bram_sdp
 select BRAM_SDP_8x4096
 select *
-synth_quicklogic -family qlf_k6n10f -top BRAM_SDP_8x4096
+synth_quicklogic -family qlf_k6n10f -top BRAM_SDP_8x4096 -bram_types
 opt_expr -undriven
 opt_clean
 stat
 write_verilog sim/bram_sdp_8x4096_post_synth.v
-select -assert-count 1 t:TDP36K
+select -assert-count 1 t:TDP36K_BRAM_WR_X9_RD_X9_nonsplit
 
 select -clear
 design -load bram_sdp
 select BRAM_SDP_4x8192
 select *
-synth_quicklogic -family qlf_k6n10f -top BRAM_SDP_4x8192
+synth_quicklogic -family qlf_k6n10f -top BRAM_SDP_4x8192 -bram_types
 opt_expr -undriven
 opt_clean
 stat
 write_verilog sim/bram_sdp_4x8192_post_synth.v
-select -assert-count 1 t:TDP36K
+select -assert-count 1 t:TDP36K_BRAM_WR_X4_RD_X4_nonsplit
 
 select -clear
 design -load bram_sdp
 select BRAM_SDP_2x16384
 select *
-synth_quicklogic -family qlf_k6n10f -top BRAM_SDP_2x16384
+synth_quicklogic -family qlf_k6n10f -top BRAM_SDP_2x16384 -bram_types
 opt_expr -undriven
 opt_clean
 stat
 write_verilog sim/bram_sdp_2x16384_post_synth.v
-select -assert-count 1 t:TDP36K
+select -assert-count 1 t:TDP36K_BRAM_WR_X2_RD_X2_nonsplit
 
 select -clear
 design -load bram_sdp
 select BRAM_SDP_1x32768
 select *
-synth_quicklogic -family qlf_k6n10f -top BRAM_SDP_1x32768
+synth_quicklogic -family qlf_k6n10f -top BRAM_SDP_1x32768 -bram_types
 opt_expr -undriven
 opt_clean
 stat
 write_verilog sim/bram_sdp_1x32768_post_synth.v
-select -assert-count 1 t:TDP36K
+select -assert-count 1 t:TDP36K_BRAM_WR_X1_RD_X1_nonsplit
 
diff --git a/ql-qlf-plugin/tests/qlf_k6n10f/bram_sdp_split/bram_sdp_split.tcl b/ql-qlf-plugin/tests/qlf_k6n10f/bram_sdp_split/bram_sdp_split.tcl
index a296d8c..fcf9acd 100644
--- a/ql-qlf-plugin/tests/qlf_k6n10f/bram_sdp_split/bram_sdp_split.tcl
+++ b/ql-qlf-plugin/tests/qlf_k6n10f/bram_sdp_split/bram_sdp_split.tcl
@@ -8,76 +8,76 @@
 
 select BRAM_SDP_SPLIT_2x18x1024
 select *
-synth_quicklogic -family qlf_k6n10f -top BRAM_SDP_SPLIT_2x18x1024
+synth_quicklogic -family qlf_k6n10f -top BRAM_SDP_SPLIT_2x18x1024 -bram_types
 opt_expr -undriven
 opt_clean
 stat
 write_verilog sim/bram_sdp_split_2x18x1024_post_synth.v
-select -assert-count 1 t:TDP36K
+select -assert-count 1 t:TDP36K_BRAM_WR_X18_RD_X18_split
 
 select -clear
 design -load bram_sdp_split
 select BRAM_SDP_SPLIT_2x16x1024
 select *
-synth_quicklogic -family qlf_k6n10f -top BRAM_SDP_SPLIT_2x16x1024
+synth_quicklogic -family qlf_k6n10f -top BRAM_SDP_SPLIT_2x16x1024 -bram_types
 opt_expr -undriven
 opt_clean
 stat
 write_verilog sim/bram_sdp_split_2x16x1024_post_synth.v
-select -assert-count 1 t:TDP36K
+select -assert-count 1 t:TDP36K_BRAM_WR_X18_RD_X18_split
 
 select -clear
 design -load bram_sdp_split
 select BRAM_SDP_SPLIT_2x9x2048
 select *
-synth_quicklogic -family qlf_k6n10f -top BRAM_SDP_SPLIT_2x9x2048
+synth_quicklogic -family qlf_k6n10f -top BRAM_SDP_SPLIT_2x9x2048 -bram_types
 opt_expr -undriven
 opt_clean
 stat
 write_verilog sim/bram_sdp_split_2x9x2048_post_synth.v
-select -assert-count 1 t:TDP36K
+select -assert-count 1 t:TDP36K_BRAM_WR_X9_RD_X9_split
 
 select -clear
 design -load bram_sdp_split
 select BRAM_SDP_SPLIT_2x8x2048
 select *
-synth_quicklogic -family qlf_k6n10f -top BRAM_SDP_SPLIT_2x8x2048
+synth_quicklogic -family qlf_k6n10f -top BRAM_SDP_SPLIT_2x8x2048 -bram_types
 opt_expr -undriven
 opt_clean
 stat
 write_verilog sim/bram_sdp_split_2x8x2048_post_synth.v
-select -assert-count 1 t:TDP36K
+select -assert-count 1 t:TDP36K_BRAM_WR_X9_RD_X9_split
 
 select -clear
 design -load bram_sdp_split
 select BRAM_SDP_SPLIT_2x4x4096
 select *
-synth_quicklogic -family qlf_k6n10f -top BRAM_SDP_SPLIT_2x4x4096
+synth_quicklogic -family qlf_k6n10f -top BRAM_SDP_SPLIT_2x4x4096 -bram_types
 opt_expr -undriven
 opt_clean
 stat
 write_verilog sim/bram_sdp_split_2x4x4096_post_synth.v
-select -assert-count 1 t:TDP36K
+select -assert-count 1 t:TDP36K_BRAM_WR_X4_RD_X4_split
 
 select -clear
 design -load bram_sdp_split
 select BRAM_SDP_SPLIT_2x2x8192
 select *
-synth_quicklogic -family qlf_k6n10f -top BRAM_SDP_SPLIT_2x2x8192
+synth_quicklogic -family qlf_k6n10f -top BRAM_SDP_SPLIT_2x2x8192 -bram_types
 opt_expr -undriven
 opt_clean
 stat
 write_verilog sim/bram_sdp_split_2x2x8192_post_synth.v
-select -assert-count 1 t:TDP36K
+select -assert-count 1 t:TDP36K_BRAM_WR_X2_RD_X2_split
 
 select -clear
 design -load bram_sdp_split
 select BRAM_SDP_SPLIT_2x1x16384
 select *
-synth_quicklogic -family qlf_k6n10f -top BRAM_SDP_SPLIT_2x1x16384
+synth_quicklogic -family qlf_k6n10f -top BRAM_SDP_SPLIT_2x1x16384 -bram_types
 opt_expr -undriven
 opt_clean
 stat
 write_verilog sim/bram_sdp_split_2x1x16384_post_synth.v
-select -assert-count 1 t:TDP36K
+select -assert-count 1 t:TDP36K_BRAM_WR_X1_RD_X1_split
 
diff --git a/ql-qlf-plugin/tests/qlf_k6n10f/bram_tdp/bram_tdp.tcl b/ql-qlf-plugin/tests/qlf_k6n10f/bram_tdp/bram_tdp.tcl
index 8ef0e9d..ea5ae8e 100644
--- a/ql-qlf-plugin/tests/qlf_k6n10f/bram_tdp/bram_tdp.tcl
+++ b/ql-qlf-plugin/tests/qlf_k6n10f/bram_tdp/bram_tdp.tcl
@@ -8,98 +8,98 @@
 
 select BRAM_TDP_36x1024
 select *
-synth_quicklogic -family qlf_k6n10f -top BRAM_TDP_36x1024
+synth_quicklogic -family qlf_k6n10f -top BRAM_TDP_36x1024 -bram_types
 opt_expr -undriven
 opt_clean
 stat
 write_verilog sim/bram_tdp_36x1024_post_synth.v
-select -assert-count 1 t:TDP36K
+select -assert-count 1 t:TDP36K_BRAM_WR_X36_RD_X36_nonsplit
 
 select -clear
 design -load bram_tdp
 select BRAM_TDP_32x1024
 select *
-synth_quicklogic -family qlf_k6n10f -top BRAM_TDP_32x1024
+synth_quicklogic -family qlf_k6n10f -top BRAM_TDP_32x1024 -bram_types
 opt_expr -undriven
 opt_clean
 stat
 write_verilog sim/bram_tdp_32x1024_post_synth.v
-select -assert-count 1 t:TDP36K
+select -assert-count 1 t:TDP36K_BRAM_WR_X36_RD_X36_nonsplit
 
 select -clear
 design -load bram_tdp
 select BRAM_TDP_18x2048
 select *
-synth_quicklogic -family qlf_k6n10f -top BRAM_TDP_18x2048
+synth_quicklogic -family qlf_k6n10f -top BRAM_TDP_18x2048 -bram_types
 opt_expr -undriven
 opt_clean
 stat
 write_verilog sim/bram_tdp_18x2048_post_synth.v
-select -assert-count 1 t:TDP36K
+select -assert-count 1 t:TDP36K_BRAM_WR_X18_RD_X18_nonsplit
 
 select -clear
 design -load bram_tdp
 select BRAM_TDP_16x2048
 select *
-synth_quicklogic -family qlf_k6n10f -top BRAM_TDP_16x2048
+synth_quicklogic -family qlf_k6n10f -top BRAM_TDP_16x2048 -bram_types
 opt_expr -undriven
 opt_clean
 stat
 write_verilog sim/bram_tdp_16x2048_post_synth.v
-select -assert-count 1 t:TDP36K
+select -assert-count 1 t:TDP36K_BRAM_WR_X18_RD_X18_nonsplit
 
 select -clear
 design -load bram_tdp
 select BRAM_TDP_9x4096
 select *
-synth_quicklogic -family qlf_k6n10f -top BRAM_TDP_9x4096
+synth_quicklogic -family qlf_k6n10f -top BRAM_TDP_9x4096 -bram_types
 opt_expr -undriven
 opt_clean
 stat
 write_verilog sim/bram_tdp_9x4096_post_synth.v
-select -assert-count 1 t:TDP36K
+select -assert-count 1 t:TDP36K_BRAM_WR_X9_RD_X9_nonsplit
 
 select -clear
 design -load bram_tdp
 select BRAM_TDP_8x4096
 select *
-synth_quicklogic -family qlf_k6n10f -top BRAM_TDP_8x4096
+synth_quicklogic -family qlf_k6n10f -top BRAM_TDP_8x4096 -bram_types
 opt_expr -undriven
 opt_clean
 stat
 write_verilog sim/bram_tdp_8x4096_post_synth.v
-select -assert-count 1 t:TDP36K
+select -assert-count 1 t:TDP36K_BRAM_WR_X9_RD_X9_nonsplit
 
 select -clear
 design -load bram_tdp
 select BRAM_TDP_4x8192
 select *
-synth_quicklogic -family qlf_k6n10f -top BRAM_TDP_4x8192
+synth_quicklogic -family qlf_k6n10f -top BRAM_TDP_4x8192 -bram_types
 opt_expr -undriven
 opt_clean
 stat
 write_verilog sim/bram_tdp_4x8192_post_synth.v
-select -assert-count 1 t:TDP36K
+select -assert-count 1 t:TDP36K_BRAM_WR_X4_RD_X4_nonsplit
 
 select -clear
 design -load bram_tdp
 select BRAM_TDP_2x16384
 select *
-synth_quicklogic -family qlf_k6n10f -top BRAM_TDP_2x16384
+synth_quicklogic -family qlf_k6n10f -top BRAM_TDP_2x16384 -bram_types
 opt_expr -undriven
 opt_clean
 stat
 write_verilog sim/bram_tdp_2x16384_post_synth.v
-select -assert-count 1 t:TDP36K
+select -assert-count 1 t:TDP36K_BRAM_WR_X2_RD_X2_nonsplit
 
 select -clear
 design -load bram_tdp
 select BRAM_TDP_1x32768
 select *
-synth_quicklogic -family qlf_k6n10f -top BRAM_TDP_1x32768
+synth_quicklogic -family qlf_k6n10f -top BRAM_TDP_1x32768 -bram_types
 opt_expr -undriven
 opt_clean
 stat
 write_verilog sim/bram_tdp_1x32768_post_synth.v
-select -assert-count 1 t:TDP36K
+select -assert-count 1 t:TDP36K_BRAM_WR_X1_RD_X1_nonsplit
 
diff --git a/ql-qlf-plugin/tests/qlf_k6n10f/bram_tdp_split/bram_tdp_split.tcl b/ql-qlf-plugin/tests/qlf_k6n10f/bram_tdp_split/bram_tdp_split.tcl
index 9a8921e..7b56e8d 100644
--- a/ql-qlf-plugin/tests/qlf_k6n10f/bram_tdp_split/bram_tdp_split.tcl
+++ b/ql-qlf-plugin/tests/qlf_k6n10f/bram_tdp_split/bram_tdp_split.tcl
@@ -8,76 +8,76 @@
 
 select BRAM_TDP_SPLIT_2x18x1024
 select *
-synth_quicklogic -family qlf_k6n10f -top BRAM_TDP_SPLIT_2x18x1024
+synth_quicklogic -family qlf_k6n10f -top BRAM_TDP_SPLIT_2x18x1024 -bram_types
 opt_expr -undriven
 opt_clean
 stat
 write_verilog sim/bram_tdp_split_2x18x1024_post_synth.v
-select -assert-count 1 t:TDP36K
+select -assert-count 1 t:TDP36K_BRAM_WR_X18_RD_X18_split
 
 select -clear
 design -load bram_tdp_split
 select BRAM_TDP_SPLIT_2x16x1024
 select *
-synth_quicklogic -family qlf_k6n10f -top BRAM_TDP_SPLIT_2x16x1024
+synth_quicklogic -family qlf_k6n10f -top BRAM_TDP_SPLIT_2x16x1024 -bram_types
 opt_expr -undriven
 opt_clean
 stat
 write_verilog sim/bram_tdp_split_2x16x1024_post_synth.v
-select -assert-count 1 t:TDP36K
+select -assert-count 1 t:TDP36K_BRAM_WR_X18_RD_X18_split
 
 select -clear
 design -load bram_tdp_split
 select BRAM_TDP_SPLIT_2x9x2048
 select *
-synth_quicklogic -family qlf_k6n10f -top BRAM_TDP_SPLIT_2x9x2048
+synth_quicklogic -family qlf_k6n10f -top BRAM_TDP_SPLIT_2x9x2048 -bram_types
 opt_expr -undriven
 opt_clean
 stat
 write_verilog sim/bram_tdp_split_2x9x2048_post_synth.v
-select -assert-count 1 t:TDP36K
+select -assert-count 1 t:TDP36K_BRAM_WR_X9_RD_X9_split
 
 select -clear
 design -load bram_tdp_split
 select BRAM_TDP_SPLIT_2x8x2048
 select *
-synth_quicklogic -family qlf_k6n10f -top BRAM_TDP_SPLIT_2x8x2048
+synth_quicklogic -family qlf_k6n10f -top BRAM_TDP_SPLIT_2x8x2048 -bram_types
 opt_expr -undriven
 opt_clean
 stat
 write_verilog sim/bram_tdp_split_2x8x2048_post_synth.v
-select -assert-count 1 t:TDP36K
+select -assert-count 1 t:TDP36K_BRAM_WR_X9_RD_X9_split
 
 select -clear
 design -load bram_tdp_split
 select BRAM_TDP_SPLIT_2x4x4096
 select *
-synth_quicklogic -family qlf_k6n10f -top BRAM_TDP_SPLIT_2x4x4096
+synth_quicklogic -family qlf_k6n10f -top BRAM_TDP_SPLIT_2x4x4096 -bram_types
 opt_expr -undriven
 opt_clean
 stat
 write_verilog sim/bram_tdp_split_2x4x4096_post_synth.v
-select -assert-count 1 t:TDP36K
+select -assert-count 1 t:TDP36K_BRAM_WR_X4_RD_X4_split
 
 select -clear
 design -load bram_tdp_split
 select BRAM_TDP_SPLIT_2x2x8192
 select *
-synth_quicklogic -family qlf_k6n10f -top BRAM_TDP_SPLIT_2x2x8192
+synth_quicklogic -family qlf_k6n10f -top BRAM_TDP_SPLIT_2x2x8192 -bram_types
 opt_expr -undriven
 opt_clean
 stat
 write_verilog sim/bram_tdp_split_2x2x8192_post_synth.v
-select -assert-count 1 t:TDP36K
+select -assert-count 1 t:TDP36K_BRAM_WR_X2_RD_X2_split
 
 select -clear
 design -load bram_tdp_split
 select BRAM_TDP_SPLIT_2x1x16384
 select *
-synth_quicklogic -family qlf_k6n10f -top BRAM_TDP_SPLIT_2x1x16384
+synth_quicklogic -family qlf_k6n10f -top BRAM_TDP_SPLIT_2x1x16384 -bram_types
 opt_expr -undriven
 opt_clean
 stat
 write_verilog sim/bram_tdp_split_2x1x16384_post_synth.v
-select -assert-count 1 t:TDP36K
+select -assert-count 1 t:TDP36K_BRAM_WR_X1_RD_X1_split
 
diff --git a/sdc-plugin/Makefile b/sdc-plugin/Makefile
index 3ae63e0..871c9bc 100644
--- a/sdc-plugin/Makefile
+++ b/sdc-plugin/Makefile
@@ -14,6 +14,8 @@
 #
 # SPDX-License-Identifier: Apache-2.0
 
+PLUGIN_DIR := $(abspath $(dir $(lastword $(MAKEFILE_LIST))))
+
 NAME = sdc
 SOURCES = buffers.cc \
           clocks.cc \
diff --git a/systemverilog-plugin/Makefile b/systemverilog-plugin/Makefile
index 1b162be..af5320d 100644
--- a/systemverilog-plugin/Makefile
+++ b/systemverilog-plugin/Makefile
@@ -14,24 +14,44 @@
 #
 # SPDX-License-Identifier: Apache-2.0
 
+PLUGIN_DIR := $(abspath $(dir $(lastword $(MAKEFILE_LIST))))
+
 NAME = systemverilog
 SOURCES = UhdmAst.cc \
-	  uhdmastfrontend.cc \
-	  uhdmcommonfrontend.cc \
-	  uhdmsurelogastfrontend.cc \
-	  uhdmastreport.cc
+          uhdmastfrontend.cc \
+          uhdmcommonfrontend.cc \
+          uhdmsurelogastfrontend.cc \
+          uhdmastreport.cc \
+          third_party/yosys/const2ast.cc
 
 # Directory to search for Surelog and UHDM libraries
 UHDM_INSTALL_DIR ?= /usr/local
 
 include ../Makefile_plugin.common
 
-CPPFLAGS += -std=c++17 -Wall -W -Wextra \
-              -Wno-deprecated-declarations \
-              -Wno-unused-parameter \
-              -I${UHDM_INSTALL_DIR}/include \
-	      -I${UHDM_INSTALL_DIR}/include/Surelog
+CXXFLAGS += -std=c++17 -Wall -W -Wextra \
+            -Wno-deprecated-declarations \
+            -Wno-unused-parameter \
+            -I${UHDM_INSTALL_DIR}/include \
+            -I${UHDM_INSTALL_DIR}/include/Surelog
 
-CXXFLAGS += -Wno-unused-parameter
-LDFLAGS += -L${UHDM_INSTALL_DIR}/lib/uhdm -L${UHDM_INSTALL_DIR}/lib/surelog -L${UHDM_INSTALL_DIR}/lib -L${UHDM_INSTALL_DIR}/lib64/uhdm -L${UHDM_INSTALL_DIR}/lib64/surelog -L${UHDM_INSTALL_DIR}/lib64
-LDLIBS += -Wl,--whole-archive -luhdm -Wl,--no-whole-archive -lsurelog -lantlr4-runtime -lflatbuffers -lcapnp -lkj -ldl -lutil -lm -lrt -lpthread
+LDFLAGS += -L${UHDM_INSTALL_DIR}/lib/uhdm \
+           -L${UHDM_INSTALL_DIR}/lib/surelog \
+           -L${UHDM_INSTALL_DIR}/lib \
+           -L${UHDM_INSTALL_DIR}/lib64/uhdm \
+           -L${UHDM_INSTALL_DIR}/lib64/surelog \
+           -L${UHDM_INSTALL_DIR}/lib64
+
+LDLIBS += -Wl,--whole-archive \
+          -luhdm \
+          -Wl,--no-whole-archive \
+          -lsurelog \
+          -lantlr4-runtime \
+          -lflatbuffers \
+          -lcapnp \
+          -lkj \
+          -ldl \
+          -lutil \
+          -lm \
+          -lrt \
+          -lpthread
diff --git a/systemverilog-plugin/UhdmAst.cc b/systemverilog-plugin/UhdmAst.cc
index 6580d0d..3936d03 100644
--- a/systemverilog-plugin/UhdmAst.cc
+++ b/systemverilog-plugin/UhdmAst.cc
@@ -1,6 +1,7 @@
 #include <algorithm>
 #include <cstring>
 #include <functional>
+#include <limits>
 #include <regex>
 #include <string>
 #include <vector>
@@ -13,7 +14,33 @@
 #include <uhdm/uhdm.h>
 #include <uhdm/vpi_user.h>
 
+#include "third_party/yosys/const2ast.h"
+
 YOSYS_NAMESPACE_BEGIN
+namespace VERILOG_FRONTEND
+{
+extern bool sv_mode;
+}
+YOSYS_NAMESPACE_END
+
+namespace systemverilog_plugin
+{
+
+using namespace ::Yosys;
+
+namespace AST
+{
+using namespace ::Yosys::AST;
+
+namespace Extended
+{
+enum AstNodeTypeExtended {
+    AST_DOT = ::Yosys::AST::AST_BIND + 1, // here we always want to point to the last element of yosys' AstNodeType
+    AST_BREAK,
+    AST_CONTINUE
+};
+}
+} // namespace AST
 
 /*static*/ const IdString &UhdmAst::partial()
 {
@@ -40,6 +67,11 @@
     static const IdString id("\\is_imported");
     return id;
 }
+/*static*/ const IdString &UhdmAst::is_simplified_wire()
+{
+    static const IdString id("\\is_simplified_wire");
+    return id;
+}
 
 static void sanitize_symbol_name(std::string &name)
 {
@@ -93,6 +125,13 @@
     return objectName;
 }
 
+static AST::AstNode *mkconst_real(double d)
+{
+    AST::AstNode *node = new AST::AstNode(AST::AST_REALVALUE);
+    node->realvalue = d;
+    return node;
+}
+
 static AST::AstNode *make_range(int left, int right, bool is_signed = false)
 {
     // generate a pre-validated range node for a fixed signal range.
@@ -124,8 +163,6 @@
     }
 }
 
-#include "UhdmAstUpstream.cc"
-
 static int get_max_offset_struct(AST::AstNode *node)
 {
     // get the width from the MS member in the struct
@@ -303,7 +340,7 @@
     log_assert(AST_INTERNAL::current_scope.count(wiretype_node->str));
     wiretype_ast = AST_INTERNAL::current_scope[wiretype_node->str];
     // we need to setup current top ast as this simplify
-    // needs to have access to all already definied ids
+    // needs to have access to all already defined ids
     while (wire_node->simplify(true, false, false, 1, -1, false, false)) {
     }
     if (wiretype_ast->children[0]->type == AST::AST_STRUCT && wire_node->type == AST::AST_WIRE) {
@@ -413,11 +450,27 @@
     size_t packed_size = 1;
     size_t unpacked_size = 1;
     std::vector<AST::AstNode *> ranges;
-    bool convert_node = packed_ranges.size() > 1 || unpacked_ranges.size() > 1 || wire_node->attributes.count(ID::wiretype) ||
-                        wire_node->type == AST::AST_PARAMETER || wire_node->type == AST::AST_LOCALPARAM ||
-                        ((wire_node->is_input || wire_node->is_output) && ((packed_ranges.size() > 0 || unpacked_ranges.size() > 0))) ||
-                        (wire_node->attributes.count(UhdmAst::force_convert()) && wire_node->attributes[UhdmAst::force_convert()]->integer == 1);
-    // Convert only when atleast 1 of the ranges has more then 1 range
+
+    // Convert only when node is not a memory and at least 1 of the ranges has more than 1 range
+    const bool convert_node = [&]() {
+        if (wire_node->type == AST::AST_MEMORY)
+            return false;
+        if (packed_ranges.size() > 1)
+            return true;
+        if (unpacked_ranges.size() > 1)
+            return true;
+        if (wire_node->attributes.count(ID::wiretype))
+            return true;
+        if (wire_node->type == AST::AST_PARAMETER)
+            return true;
+        if (wire_node->type == AST::AST_LOCALPARAM)
+            return true;
+        if ((wire_node->is_input || wire_node->is_output) && (packed_ranges.size() > 0 || unpacked_ranges.size() > 0))
+            return true;
+        if (wire_node->attributes.count(UhdmAst::force_convert()) && wire_node->attributes[UhdmAst::force_convert()]->integer == 1)
+            return true;
+        return false;
+    }();
     if (convert_node) {
         if (wire_node->multirange_dimensions.empty()) {
             packed_size = add_multirange_attribute(wire_node, packed_ranges);
@@ -437,6 +490,7 @@
         if (wire_node->type == AST::AST_WIRE && packed_ranges.size() == 1 && unpacked_ranges.size() == 1 && !wire_node->is_input &&
             !wire_node->is_output) {
             wire_node->type = AST::AST_MEMORY;
+            wire_node->is_logic = true;
         }
     }
 
@@ -470,10 +524,13 @@
         // we get left range for first children, and right range for last children
         left = AST::AstNode::mkconst_int(current_struct_elem->children.front()->range_left, true);
         right = AST::AstNode::mkconst_int(current_struct_elem->children.back()->range_right, true);
+    } else if (current_struct_elem->type == AST::AST_UNION) {
+        left = AST::AstNode::mkconst_int(current_struct_elem->range_left, true);
+        right = AST::AstNode::mkconst_int(current_struct_elem->range_right, true);
     } else {
-        // Structs currently can only have AST_STRUCT or AST_STRUCT_ITEM
-        // so, it should never happen
-        log_error("Found %s elem in struct that is currently unsupported!\n", type2str(current_struct_elem->type).c_str());
+        // Structs currently can only have AST_STRUCT, AST_STRUCT_ITEM, or AST_UNION.
+        log_file_error(current_struct_elem->filename, current_struct_elem->location.first_line,
+                       "Accessing struct member of type %s is unsupported.\n", type2str(current_struct_elem->type).c_str());
     }
 
     auto elem_size =
@@ -482,7 +539,7 @@
     AST::AstNode *struct_range = nullptr;
 
     for (auto c : search_node->children) {
-        if (c->type == static_cast<int>(AST::AST_DOT)) {
+        if (c->type == static_cast<int>(AST::Extended::AST_DOT)) {
             // There should be only 1 AST_DOT node children
             log_assert(!sub_dot);
             sub_dot = expand_dot(current_struct_elem, c);
@@ -549,7 +606,8 @@
                 log_error("Unhandled range select (AST_STRUCT) in AST_DOT!\n");
             }
         } else {
-            log_error("Found %s elem in struct that is currently unsupported!\n", type2str(current_struct_elem->type).c_str());
+            log_file_error(current_struct_elem->filename, current_struct_elem->location.first_line,
+                           "Accessing member of a slice of type %s is unsupported.\n", type2str(current_struct_elem->type).c_str());
         }
     }
     // Return range from the begining of *current* struct
@@ -561,11 +619,13 @@
 static AST::AstNode *convert_dot(AST::AstNode *wire_node, AST::AstNode *node, AST::AstNode *dot)
 {
     AST::AstNode *struct_node = nullptr;
-    if (wire_node->type == AST::AST_STRUCT) {
+    if (wire_node->type == AST::AST_STRUCT || wire_node->type == AST::AST_UNION) {
         struct_node = wire_node;
     } else if (wire_node->attributes.count(ID::wiretype)) {
         log_assert(wire_node->attributes[ID::wiretype]->id2ast);
         struct_node = wire_node->attributes[ID::wiretype]->id2ast;
+    } else {
+        log_file_error(wire_node->filename, wire_node->location.first_line, "Unsupported node type: %s\n", type2str(wire_node->type).c_str());
     }
     log_assert(struct_node);
     auto expanded = expand_dot(struct_node, dot);
@@ -844,8 +904,8 @@
 
 static void simplify(AST::AstNode *current_node, AST::AstNode *parent_node)
 {
-    auto dot_it =
-      std::find_if(current_node->children.begin(), current_node->children.end(), [](auto c) { return c->type == static_cast<int>(AST::AST_DOT); });
+    auto dot_it = std::find_if(current_node->children.begin(), current_node->children.end(),
+                               [](auto c) { return c->type == static_cast<int>(AST::Extended::AST_DOT); });
     AST::AstNode *dot = (dot_it != current_node->children.end()) ? *dot_it : nullptr;
 
     AST::AstNode *expanded = nullptr;
@@ -868,8 +928,8 @@
                     break;
                 } else {
                     current_node->str += "." + dot->str.substr(1);
-                    dot_it =
-                      std::find_if(dot->children.begin(), dot->children.end(), [](auto c) { return c->type == static_cast<int>(AST::AST_DOT); });
+                    dot_it = std::find_if(dot->children.begin(), dot->children.end(),
+                                          [](auto c) { return c->type == static_cast<int>(AST::Extended::AST_DOT); });
                     parent_node = dot;
                     dot = (dot_it != dot->children.end()) ? *dot_it : nullptr;
                 }
@@ -906,6 +966,8 @@
         AST_INTERNAL::current_scope[current_node->str] = current_node;
         break;
     case AST::AST_WIRE:
+        current_node->attributes[UhdmAst::is_simplified_wire()] = AST::AstNode::mkconst_int(1, true);
+        [[fallthrough]];
     case AST::AST_PARAMETER:
     case AST::AST_LOCALPARAM:
         AST_INTERNAL::current_scope[current_node->str] = current_node;
@@ -918,7 +980,11 @@
                 break;
             }
             AST::AstNode *wire_node = AST_INTERNAL::current_scope[current_node->str];
-            simplify(wire_node, nullptr);
+
+            // if a wire is simplified multiple times, its ranges may be added multiple times and be redundant as a result
+            if (!wire_node->attributes.count(UhdmAst::is_simplified_wire())) {
+                simplify(wire_node, nullptr);
+            }
             const std::vector<AST::AstNode *> packed_ranges = wire_node->attributes.count(UhdmAst::packed_ranges())
                                                                 ? wire_node->attributes[UhdmAst::packed_ranges()]->children
                                                                 : std::vector<AST::AstNode *>();
@@ -1064,33 +1130,54 @@
 {
     s_vpi_value val;
     vpi_get_value(obj_h, &val);
-    std::string strValType;
+    std::string strValType = "'";
+    bool is_signed = false;
+    if (vpiHandle typespec_h = vpi_handle(vpiTypespec, obj_h)) {
+        is_signed = vpi_get(vpiSigned, typespec_h);
+        if (is_signed) {
+            strValType += "s";
+        }
+    }
     if (val.format) { // Needed to handle parameter nodes without typespecs and constants
         switch (val.format) {
         case vpiScalarVal:
             return AST::AstNode::mkconst_int(val.value.scalar, false, 1);
         case vpiBinStrVal: {
-            strValType = "'b";
+            strValType += "b";
             break;
         }
         case vpiDecStrVal: {
-            strValType = "'d";
+            strValType += "d";
             break;
         }
         case vpiHexStrVal: {
-            strValType = "'h";
+            strValType += "h";
             break;
         }
         case vpiOctStrVal: {
-            strValType = "'o";
+            strValType += "o";
             break;
         }
         // Surelog reports constant integers as a unsigned, but by default int is signed
         // so we are treating here UInt in the same way as if they would be Int
         case vpiUIntVal:
+            if (val.value.uint > std::numeric_limits<std::uint32_t>::max()) {
+                // an integer is by default signed, so use 'sd despite the variant vpiUIntVal
+                strValType = "'sd";
+                string str_value = std::to_string(val.value.uint);
+                val.value.str = strdup(str_value.c_str());
+                break;
+            }
+            [[fallthrough]];
         case vpiIntVal: {
+            if (val.value.integer > std::numeric_limits<std::int32_t>::max()) {
+                strValType = "'sd";
+                string str_value = std::to_string(val.value.integer);
+                val.value.str = strdup(str_value.c_str());
+                break;
+            }
+
             int size = -1;
-            bool is_signed = false;
             // Surelog sometimes report size as part of vpiTypespec (e.g. int_typespec)
             // if it is the case, we need to set size to the left_range of first packed range
             visit_one_to_one({vpiTypespec}, obj_h, [&](AST::AstNode *node) {
@@ -1110,7 +1197,7 @@
                 size = 32;
                 is_signed = true;
             }
-            auto c = AST::AstNode::mkconst_int(val.value.integer, is_signed, size > 0 ? size : 32);
+            auto c = AST::AstNode::mkconst_int(val.format == vpiUIntVal ? val.value.uint : val.value.integer, is_signed, size > 0 ? size : 32);
             if (size == 0 || size == -1)
                 c->is_unsized = true;
             return c;
@@ -1122,12 +1209,13 @@
         default: {
             const uhdm_handle *const handle = (const uhdm_handle *)obj_h;
             const UHDM::BaseClass *const object = (const UHDM::BaseClass *)handle->object;
-            report_error("%s:%d: Encountered unhandled constant format %d\n", object->VpiFile().c_str(), object->VpiLineNo(), val.format);
+            report_error("%.*s:%d: Encountered unhandled constant format %d\n", (int)object->VpiFile().length(), object->VpiFile().data(),
+                         object->VpiLineNo(), val.format);
         }
         }
         // handle vpiBinStrVal, vpiDecStrVal and vpiHexStrVal
         if (std::strchr(val.value.str, '\'')) {
-            return VERILOG_FRONTEND::const2ast(val.value.str, 0, false);
+            return ::systemverilog_plugin::const2ast(val.value.str, 0, false);
         } else {
             auto size = vpi_get(vpiSize, obj_h);
             if (size == 0) {
@@ -1135,7 +1223,7 @@
                 c->is_unsized = true;
                 return c;
             } else {
-                return VERILOG_FRONTEND::const2ast(std::to_string(size) + strValType + val.value.str, 0, false);
+                return ::systemverilog_plugin::const2ast(std::to_string(size) + strValType + val.value.str, 0, false);
             }
         }
     }
@@ -1205,15 +1293,15 @@
                 }
                 break;
             }
-            case AST::AST_BREAK:
-            case AST::AST_CONTINUE: {
+            case AST::Extended::AST_BREAK:
+            case AST::Extended::AST_CONTINUE: {
                 std::for_each(it, block->children.end(), [](auto *node) { delete node; });
                 block->children.erase(it, block->children.end());
                 if (!continue_wire)
                     continue_wire = make_cond_var("$continue");
                 auto *continue_id = make_identifier(continue_wire->str);
                 block->children.push_back(make_ast_node(AST::AST_ASSIGN_EQ, {continue_id, AST::AstNode::mkconst_int(1, false)}));
-                if (type == AST::AST_BREAK) {
+                if (type == AST::Extended::AST_BREAK) {
                     if (!break_wire)
                         break_wire = make_cond_var("$break");
                     auto *break_id = make_identifier(break_wire->str);
@@ -1271,8 +1359,21 @@
     if (auto filename = vpi_get_str(vpiFile, obj_h)) {
         node->filename = filename;
     }
-    if (unsigned int line = vpi_get(vpiLineNo, obj_h)) {
-        node->location.first_line = node->location.last_line = line;
+    if (unsigned int first_line = vpi_get(vpiLineNo, obj_h)) {
+        node->location.first_line = first_line;
+    }
+    if (unsigned int last_line = vpi_get(vpiEndLineNo, obj_h)) {
+        node->location.last_line = last_line;
+    } else {
+        node->location.last_line = node->location.first_line;
+    }
+    if (unsigned int first_col = vpi_get(vpiColumnNo, obj_h)) {
+        node->location.first_column = first_col;
+    }
+    if (unsigned int last_col = vpi_get(vpiEndColumnNo, obj_h)) {
+        node->location.last_column = last_col;
+    } else {
+        node->location.last_column = node->location.first_column;
     }
     node->children = children;
     return node;
@@ -1325,6 +1426,7 @@
                 if (child->type == AST::AST_MEMORY)
                     child->type = AST::AST_WIRE;
             }
+            child->is_signed = child->is_signed || (*it)->is_signed;
             if (!(*it)->children.empty() && child->children.empty()) {
                 // This is a bit ugly, but if the child we're replacing has children and
                 // our node doesn't, we copy its children to not lose any information
@@ -1508,17 +1610,20 @@
 void UhdmAst::process_design()
 {
     current_node = make_ast_node(AST::AST_DESIGN);
-    visit_one_to_many({UHDM::uhdmallInterfaces, UHDM::uhdmallPackages, UHDM::uhdmtopPackages, UHDM::uhdmallModules, UHDM::uhdmtopModules}, obj_h,
-                      [&](AST::AstNode *node) {
-                          if (node) {
-                              shared.top_nodes[node->str] = node;
-                          }
-                      });
+    visit_one_to_many(
+      {UHDM::uhdmallInterfaces, UHDM::uhdmallPackages, UHDM::uhdmtopPackages, UHDM::uhdmallModules, UHDM::uhdmtopModules, vpiTaskFunc}, obj_h,
+      [&](AST::AstNode *node) {
+          if (node) {
+              shared.top_nodes[node->str] = node;
+          }
+      });
     visit_one_to_many({vpiParameter, vpiParamAssign}, obj_h, [&](AST::AstNode *node) {});
     visit_one_to_many({vpiTypedef}, obj_h, [&](AST::AstNode *node) {
         if (node)
             move_type_to_new_typedef(current_node, node);
     });
+    // Add top level typedefs and params to scope
+    setup_current_scope(shared.top_nodes, current_node);
     for (auto pair : shared.top_nodes) {
         if (!pair.second)
             continue;
@@ -1529,6 +1634,7 @@
             clear_current_scope();
         }
     }
+    setup_current_scope(shared.top_nodes, current_node);
     // Once we walked everything, unroll that as children of this node
     for (auto &pair : shared.top_nodes) {
         if (!pair.second)
@@ -1551,6 +1657,17 @@
             pair.second = nullptr;
         }
     }
+    if (!shared.debug_flag) {
+        // Ranges were already converted, erase obsolete attributes
+        visitEachDescendant(current_node, [&](AST::AstNode *node) {
+            node->attributes.erase(UhdmAst::packed_ranges());
+            node->attributes.erase(UhdmAst::unpacked_ranges());
+            if (node->attributes.count(UhdmAst::is_simplified_wire())) {
+                delete node->attributes[UhdmAst::is_simplified_wire()];
+                node->attributes.erase(UhdmAst::is_simplified_wire());
+            }
+        });
+    }
 }
 
 void UhdmAst::simplify_parameter(AST::AstNode *parameter, AST::AstNode *module_node)
@@ -1559,8 +1676,6 @@
     visitEachDescendant(shared.current_top_node, [&](AST::AstNode *current_scope_node) {
         if (current_scope_node->type == AST::AST_TYPEDEF || current_scope_node->type == AST::AST_PARAMETER ||
             current_scope_node->type == AST::AST_LOCALPARAM) {
-            if (current_scope_node->type == AST::AST_TYPEDEF)
-                simplify(current_scope_node, nullptr);
             AST_INTERNAL::current_scope[current_scope_node->str] = current_scope_node;
         }
     });
@@ -1629,7 +1744,7 @@
                 }
             });
             visit_one_to_many({vpiModule, vpiInterface, vpiTaskFunc, vpiParameter, vpiParamAssign, vpiPort, vpiNet, vpiArrayNet, vpiGenScopeArray,
-                               vpiContAssign, vpiProcess, vpiClockingBlock, vpiAssertion},
+                               vpiProcess, vpiClockingBlock, vpiAssertion},
                               obj_h, [&](AST::AstNode *node) {
                                   if (node) {
                                       if (node->type == AST::AST_ASSIGN && node->children.size() < 2)
@@ -1754,7 +1869,7 @@
                 add_or_replace_child(module_node, node);
             }
         });
-        visit_one_to_many({vpiInterface, vpiModule, vpiPort, vpiGenScopeArray}, obj_h, [&](AST::AstNode *node) {
+        visit_one_to_many({vpiInterface, vpiModule, vpiPort, vpiGenScopeArray, vpiContAssign}, obj_h, [&](AST::AstNode *node) {
             if (node) {
                 add_or_replace_child(module_node, node);
             }
@@ -1821,6 +1936,10 @@
             delete node;
         }
     });
+    if (auto elemtypespec_h = vpi_handle(vpiElemTypespec, obj_h)) {
+        visit_one_to_many({vpiRange}, elemtypespec_h, [&](AST::AstNode *node) { packed_ranges.push_back(node); });
+        vpi_release_handle(elemtypespec_h);
+    }
     visit_one_to_many({vpiRange}, obj_h, [&](AST::AstNode *node) { unpacked_ranges.push_back(node); });
     add_multirange_wire(current_node, packed_ranges, unpacked_ranges);
 }
@@ -1844,27 +1963,27 @@
         break;
     }
     case vpiByteTypespec: {
-        current_node->is_signed = true;
+        current_node->is_signed = vpi_get(vpiSigned, typespec_h);
         packed_ranges.push_back(make_range(7, 0));
         shared.report.mark_handled(typespec_h);
         break;
     }
     case vpiShortIntTypespec: {
-        current_node->is_signed = true;
+        current_node->is_signed = vpi_get(vpiSigned, typespec_h);
         packed_ranges.push_back(make_range(15, 0));
         shared.report.mark_handled(typespec_h);
         break;
     }
     case vpiIntTypespec:
     case vpiIntegerTypespec: {
-        current_node->is_signed = true;
+        current_node->is_signed = vpi_get(vpiSigned, typespec_h);
         packed_ranges.push_back(make_range(31, 0));
         shared.report.mark_handled(typespec_h);
         break;
     }
     case vpiTimeTypespec:
     case vpiLongIntTypespec: {
-        current_node->is_signed = true;
+        current_node->is_signed = vpi_get(vpiSigned, typespec_h);
         packed_ranges.push_back(make_range(63, 0));
         shared.report.mark_handled(typespec_h);
         break;
@@ -1931,16 +2050,18 @@
         });
         break;
     case vpiVoidTypespec: {
-        report_error("%s:%d: Void typespecs are currently unsupported", object->VpiFile().c_str(), object->VpiLineNo());
+        report_error("%.*s:%d: Void typespecs are currently unsupported", (int)object->VpiFile().length(), object->VpiFile().data(),
+                     object->VpiLineNo());
         break;
     }
     case vpiClassTypespec: {
-        report_error("%s:%d: Class typespecs are unsupported", object->VpiFile().c_str(), object->VpiLineNo());
+        report_error("%.*s:%d: Class typespecs are unsupported", (int)object->VpiFile().length(), object->VpiFile().data(), object->VpiLineNo());
         break;
     }
     default: {
-        report_error("%s:%d: Encountered unhandled typespec in process_typespec_member: '%s' of type '%s'\n", object->VpiFile().c_str(),
-                     object->VpiLineNo(), object->VpiName().c_str(), UHDM::VpiTypeName(typespec_h).c_str());
+        report_error("%.*s:%d: Encountered unhandled typespec in process_typespec_member: '%.*s' of type '%s'\n", (int)object->VpiFile().length(),
+                     object->VpiFile().data(), object->VpiLineNo(), (int)object->VpiName().length(), object->VpiName().data(),
+                     UHDM::VpiTypeName(typespec_h).c_str());
         break;
     }
     }
@@ -1950,42 +2071,67 @@
 
 void UhdmAst::process_enum_typespec()
 {
+    // BaseTypespec specifies underlying type of the enum.
+    // The BaseTypespec has at most one explicit packed dimension (range).
+    // When base type is not specified in SystemVerilog code, it is assumed to be an int.
+    // Type of enum items (constants) is the same as the enum type.
     current_node = make_ast_node(AST::AST_ENUM);
+    bool has_base_type = false;
+    visit_one_to_one({vpiBaseTypespec}, obj_h, [&](AST::AstNode *node) {
+        has_base_type = true;
+        current_node->children = std::move(node->children);
+        current_node->attributes = std::move(node->attributes);
+        current_node->is_signed = node->is_signed;
+        current_node->is_logic = node->is_logic;
+        delete node;
+    });
+    if (!has_base_type) {
+        // Base typespec is `int` by default
+        // TODO (mglb): This is almost the same code as in `process_int_typespec()`. Put common code in dedicated function.
+        std::vector<AST::AstNode *> packed_ranges;
+        packed_ranges.push_back(make_range(31, 0));
+        add_multirange_wire(current_node, std::move(packed_ranges), {});
+        current_node->is_signed = true;
+    }
+    // We have to restore node's range_* properties if there's no range.
+    const auto range_left = current_node->range_left;
+    const auto range_right = current_node->range_right;
+    const auto range_valid = current_node->range_valid;
+    // Create a range from the typespec just for the purpose of copying it to consts.
+    convert_packed_unpacked_range(current_node);
+    const auto range_it = std::find_if(current_node->children.cbegin(), current_node->children.cend(),
+                                       [](const AST::AstNode *n) { return n->type == AST::AST_RANGE || n->type == AST::AST_MULTIRANGE; });
+    const auto *const range = range_it != current_node->children.cend() ? *range_it : nullptr;
+    if (range) {
+        current_node->children.erase(range_it);
+    } else {
+        current_node->range_left = range_left;
+        current_node->range_right = range_right;
+        current_node->range_valid = range_valid;
+    }
+
     visit_one_to_one({vpiTypedefAlias}, obj_h, [&](AST::AstNode *node) {
         if (node) {
-            current_node->attributes["\\enum_base_type"] = node->clone();
+            current_node->attributes["\\enum_base_type"] = node;
         }
     });
-    visit_one_to_many({vpiEnumConst}, obj_h, [&](AST::AstNode *node) { current_node->children.push_back(node); });
-    vpiHandle typespec_h = vpi_handle(vpiBaseTypespec, obj_h);
-    if (typespec_h) {
-        int typespec_type = vpi_get(vpiType, typespec_h);
-        switch (typespec_type) {
-        case vpiLogicTypespec: {
-            current_node->is_logic = true;
-            shared.report.mark_handled(typespec_h);
-            break;
+    visit_one_to_many({vpiEnumConst}, obj_h, [&](AST::AstNode *node) {
+        // Enum const must have the same type and ranges as the enum.
+        node->is_logic = current_node->is_logic;
+        node->is_signed = current_node->is_signed;
+        if (range) {
+            node->children.push_back(range->clone());
+            node->range_valid = true;
+        } else {
+            node->range_left = range_left;
+            node->range_right = range_right;
+            node->range_valid = range_valid;
         }
-        case vpiByteTypespec:
-        case vpiIntTypespec:
-        case vpiIntegerTypespec: {
-            current_node->is_signed = true;
-            shared.report.mark_handled(typespec_h);
-            break;
-        }
-        case vpiBitTypespec: {
-            shared.report.mark_handled(typespec_h);
-            break;
-        }
-        default: {
-            const uhdm_handle *const handle = (const uhdm_handle *)typespec_h;
-            const UHDM::BaseClass *const object = (const UHDM::BaseClass *)handle->object;
-            report_error("%s:%d: Encountered unhandled typespec in process_enum_typespec: '%s' of type '%s'\n", object->VpiFile().c_str(),
-                         object->VpiLineNo(), object->VpiName().c_str(), UHDM::VpiTypeName(typespec_h).c_str());
-            break;
-        }
-        }
-        vpi_release_handle(typespec_h);
+        // IMPORTANT: invalidates `range_it`!
+        current_node->children.push_back(node);
+    });
+    if (range) {
+        delete range;
     }
 }
 
@@ -1997,7 +2143,6 @@
         constant_node->filename = current_node->filename;
         constant_node->location = current_node->location;
         current_node->children.push_back(constant_node);
-        current_node->children.push_back(make_range(constant_node->range_left, constant_node->range_right, true));
     }
 }
 
@@ -2031,7 +2176,7 @@
     auto right_const = AST::AstNode::mkconst_int(0, true);
     auto range = new AST::AstNode(AST::AST_RANGE, left_const, right_const);
     current_node->children.push_back(range);
-    current_node->is_signed = true;
+    current_node->is_signed = vpi_get(vpiSigned, obj_h);
     visit_default_expr(obj_h);
 }
 
@@ -2262,10 +2407,14 @@
         process_cont_assign_net();
 }
 
-void UhdmAst::process_assignment()
+void UhdmAst::process_assignment(const UHDM::BaseClass *object)
 {
     auto type = vpi_get(vpiBlocking, obj_h) == 1 ? AST::AST_ASSIGN_EQ : AST::AST_ASSIGN_LE;
+    bool shift_unsigned = false;
+    int op_type = vpi_get(vpiOpType, obj_h);
+    AST::AstNodeType node_type;
     current_node = make_ast_node(type);
+
     visit_one_to_one({vpiLhs, vpiRhs}, obj_h, [&](AST::AstNode *node) {
         if (node) {
             if (node->type == AST::AST_PARAMETER || node->type == AST::AST_LOCALPARAM) {
@@ -2274,6 +2423,64 @@
             current_node->children.push_back(node);
         }
     });
+    if (op_type && op_type != vpiAssignmentOp) {
+        switch (op_type) {
+        case vpiSubOp:
+            node_type = AST::AST_SUB;
+            break;
+        case vpiDivOp:
+            node_type = AST::AST_DIV;
+            break;
+        case vpiModOp:
+            node_type = AST::AST_MOD;
+            break;
+        case vpiLShiftOp:
+            node_type = AST::AST_SHIFT_LEFT;
+            shift_unsigned = true;
+            break;
+        case vpiRShiftOp:
+            node_type = AST::AST_SHIFT_RIGHT;
+            shift_unsigned = true;
+            break;
+        case vpiAddOp:
+            node_type = AST::AST_ADD;
+            break;
+        case vpiMultOp:
+            node_type = AST::AST_MUL;
+            break;
+        case vpiBitAndOp:
+            node_type = AST::AST_BIT_AND;
+            break;
+        case vpiBitOrOp:
+            node_type = AST::AST_BIT_OR;
+            break;
+        case vpiBitXorOp:
+            node_type = AST::AST_BIT_XOR;
+            break;
+        case vpiArithLShiftOp:
+            node_type = AST::AST_SHIFT_SLEFT;
+            shift_unsigned = true;
+            break;
+        case vpiArithRShiftOp:
+            node_type = AST::AST_SHIFT_SRIGHT;
+            shift_unsigned = true;
+            break;
+        default:
+            delete current_node;
+            current_node = nullptr;
+            report_error("%.*s:%d: Encountered unhandled compound assignment with operation type %d\n", (int)object->VpiFile().length(),
+                         object->VpiFile().data(), object->VpiLineNo(), op_type);
+            return;
+        }
+        log_assert(current_node->children.size() == 2);
+        auto child_node = new AST::AstNode(node_type, current_node->children[0]->clone(), current_node->children[1]);
+        current_node->children[1] = child_node;
+        if (shift_unsigned) {
+            log_assert(current_node->children[1]->children.size() == 2);
+            auto unsigned_node = new AST::AstNode(AST::AST_TO_UNSIGNED, current_node->children[1]->children[1]);
+            current_node->children[1]->children[1] = unsigned_node;
+        }
+    }
     if (current_node->children.size() == 1 && current_node->children[0]->type == AST::AST_WIRE) {
         auto top_node = find_ancestor({AST::AST_MODULE});
         if (!top_node)
@@ -2377,7 +2584,7 @@
     if (shared.top_nodes.find(type) != shared.top_nodes.end()) {
         // Was created before, fill missing
         elaboratedInterface = shared.top_nodes[type];
-        visit_one_to_many({vpiPort}, obj_h, [&](AST::AstNode *node) {
+        visit_one_to_many({vpiPort, vpiVariables}, obj_h, [&](AST::AstNode *node) {
             if (node) {
                 add_or_replace_child(elaboratedInterface, node);
             }
@@ -2450,6 +2657,7 @@
                 current_node->is_logic = node->is_logic;
                 current_node->is_reg = node->is_reg;
             }
+            current_node->is_signed = node->is_signed;
             delete node;
         }
     });
@@ -2505,7 +2713,8 @@
         if (node) {
             auto process_node = find_ancestor({AST::AST_ALWAYS});
             if (!process_node) {
-                log_error("%s:%d: Currently supports only event control stmts inside 'always'\n", object->VpiFile().c_str(), object->VpiLineNo());
+                log_error("%.*s:%d: Currently supports only event control stmts inside 'always'\n", (int)object->VpiFile().length(),
+                          object->VpiFile().data(), object->VpiLineNo());
             }
             process_node->children.push_back(node);
         }
@@ -2604,7 +2813,8 @@
         break;
     case vpiWildEqOp:
     case vpiWildNeqOp: {
-        report_error("%s:%d: Wildcard operators are not supported yet\n", object->VpiFile().c_str(), object->VpiLineNo());
+        report_error("%.*s:%d: Wildcard operators are not supported yet\n", (int)object->VpiFile().length(), object->VpiFile().data(),
+                     object->VpiLineNo());
         break;
     }
     default: {
@@ -2640,14 +2850,26 @@
             current_node->type = AST::AST_REDUCE_XNOR;
             break;
         case vpiUnaryNandOp: {
-            current_node->type = AST::AST_REDUCE_AND;
-            auto not_node = new AST::AstNode(AST::AST_LOGIC_NOT, current_node);
+            auto not_node = new AST::AstNode(AST::AST_NONE, current_node);
+            if (current_node->children.size() == 2) {
+                current_node->type = AST::AST_BIT_AND;
+                not_node->type = AST::AST_BIT_NOT;
+            } else {
+                current_node->type = AST::AST_REDUCE_AND;
+                not_node->type = AST::AST_LOGIC_NOT;
+            }
             current_node = not_node;
             break;
         }
         case vpiUnaryNorOp: {
-            current_node->type = AST::AST_REDUCE_OR;
-            auto not_node = new AST::AstNode(AST::AST_LOGIC_NOT, current_node);
+            auto not_node = new AST::AstNode(AST::AST_NONE, current_node);
+            if (current_node->children.size() == 2) {
+                current_node->type = AST::AST_BIT_OR;
+                not_node->type = AST::AST_BIT_NOT;
+            } else {
+                current_node->type = AST::AST_REDUCE_OR;
+                not_node->type = AST::AST_LOGIC_NOT;
+            }
             current_node = not_node;
             break;
         }
@@ -2750,7 +2972,8 @@
             break;
         case vpiPostIncOp: {
             // TODO: Make this an actual post-increment op (currently it's a pre-increment)
-            log_warning("%s:%d: Post-incrementation operations are handled as pre-incrementation.\n", object->VpiFile().c_str(), object->VpiLineNo());
+            log_warning("%.*s:%d: Post-incrementation operations are handled as pre-incrementation.\n", (int)object->VpiFile().length(),
+                        object->VpiFile().data(), object->VpiLineNo());
             [[fallthrough]];
         }
         case vpiPreIncOp: {
@@ -2764,7 +2987,8 @@
         }
         case vpiPostDecOp: {
             // TODO: Make this an actual post-decrement op (currently it's a pre-decrement)
-            log_warning("%s:%d: Post-decrementation operations are handled as pre-decrementation.\n", object->VpiFile().c_str(), object->VpiLineNo());
+            log_warning("%.*s:%d: Post-decrementation operations are handled as pre-decrementation.\n", (int)object->VpiFile().length(),
+                        object->VpiFile().data(), object->VpiLineNo());
             [[fallthrough]];
         }
         case vpiPreDecOp: {
@@ -2814,7 +3038,8 @@
         default: {
             delete current_node;
             current_node = nullptr;
-            report_error("%s:%d: Encountered unhandled operation type %d\n", object->VpiFile().c_str(), object->VpiLineNo(), operation);
+            report_error("%.*s:%d: Encountered unhandled operation type %d\n", (int)object->VpiFile().length(), object->VpiFile().data(),
+                         object->VpiLineNo(), operation);
         }
         }
     }
@@ -3145,14 +3370,13 @@
     current_node->str = "$fordecl_block" + std::to_string(loop_id);
     auto loop = make_ast_node(AST::AST_FOR);
     loop->str = "$loop" + std::to_string(loop_id);
-    current_node->children.push_back(loop);
     visit_one_to_many({vpiForInitStmt}, obj_h, [&](AST::AstNode *node) {
         if (node->type == AST::AST_ASSIGN_LE)
             node->type = AST::AST_ASSIGN_EQ;
         auto lhs = node->children[0];
         if (lhs->type == AST::AST_WIRE) {
             auto *wire = lhs->clone();
-            wire->is_reg = true;
+            wire->is_logic = true;
             current_node->children.push_back(wire);
             lhs->type = AST::AST_IDENTIFIER;
             lhs->is_signed = false;
@@ -3179,6 +3403,7 @@
             loop->children.push_back(node);
         }
     });
+    current_node->children.push_back(loop);
     transform_breaks_continues(loop, current_node);
 }
 
@@ -3257,12 +3482,14 @@
     visit_one_to_one({vpiLeftRange, vpiRightRange}, obj_h, [&](AST::AstNode *node) { current_node->children.push_back(node); });
     if (current_node->children.size() > 0) {
         if (current_node->children[0]->str == "unsized") {
-            log_error("%s:%d: Currently not supported object of type 'unsized range'\n", object->VpiFile().c_str(), object->VpiLineNo());
+            log_error("%.*s:%d: Currently not supported object of type 'unsized range'\n", (int)object->VpiFile().length(), object->VpiFile().data(),
+                      object->VpiLineNo());
         }
     }
     if (current_node->children.size() > 1) {
         if (current_node->children[1]->str == "unsized") {
-            log_error("%s:%d: Currently not supported object of type 'unsized range'\n", object->VpiFile().c_str(), object->VpiLineNo());
+            log_error("%.*s:%d: Currently not supported object of type 'unsized range'\n", (int)object->VpiFile().length(), object->VpiFile().data(),
+                      object->VpiLineNo());
         }
     }
 }
@@ -3339,7 +3566,7 @@
                     log_assert(!node->children.empty());
                     top_node->children.push_back(node->children[0]);
                 } else {
-                    node->type = static_cast<AST::AstNodeType>(AST::AST_DOT);
+                    node->type = static_cast<AST::AstNodeType>(AST::Extended::AST_DOT);
                     top_node->children.push_back(node);
                     top_node = node;
                 }
@@ -3402,7 +3629,7 @@
     if (vpi_get(vpiType, typespec_h) == vpiStringTypespec) {
         std::string field_name = vpi_get_str(vpiName, typespec_h);
         if (field_name != "default") { // TODO: better support of the default keyword
-            auto field = new AST::AstNode(static_cast<AST::AstNodeType>(AST::AST_DOT));
+            auto field = new AST::AstNode(static_cast<AST::AstNodeType>(AST::Extended::AST_DOT));
             field->str = field_name;
             current_node->children[0]->children.push_back(field);
         }
@@ -3438,6 +3665,7 @@
             current_node->children.push_back(wiretype_node);
             current_node->is_custom_type = true;
         }
+        current_node->is_signed = node->is_signed;
         delete node;
     });
     // TODO: Handling below seems similar to other typespec accesses for range. Candidate for extraction to a function.
@@ -3485,9 +3713,9 @@
         current_node->str = current_node->str.substr(1);
 }
 
-void UhdmAst::process_func_call()
+void UhdmAst::process_tf_call(AST::AstNodeType type)
 {
-    current_node = make_ast_node(AST::AST_FCALL);
+    current_node = make_ast_node(type);
     visit_one_to_many({vpiArgument}, obj_h, [&](AST::AstNode *node) {
         if (node) {
             if (node->type == AST::AST_PARAMETER || node->type == AST::AST_LOCALPARAM) {
@@ -3527,6 +3755,7 @@
     }
     visit_one_to_many({vpiRange}, obj_h, [&](AST::AstNode *node) { packed_ranges.push_back(node); });
     add_multirange_wire(current_node, packed_ranges, unpacked_ranges);
+    current_node->is_signed = vpi_get(vpiSigned, obj_h);
 }
 
 void UhdmAst::process_int_typespec()
@@ -3536,7 +3765,7 @@
     current_node = make_ast_node(AST::AST_WIRE);
     packed_ranges.push_back(make_range(31, 0));
     add_multirange_wire(current_node, packed_ranges, unpacked_ranges);
-    current_node->is_signed = true;
+    current_node->is_signed = vpi_get(vpiSigned, obj_h);
 }
 
 void UhdmAst::process_shortint_typespec()
@@ -3546,7 +3775,7 @@
     current_node = make_ast_node(AST::AST_WIRE);
     packed_ranges.push_back(make_range(15, 0));
     add_multirange_wire(current_node, packed_ranges, unpacked_ranges);
-    current_node->is_signed = true;
+    current_node->is_signed = vpi_get(vpiSigned, obj_h);
 }
 
 void UhdmAst::process_longint_typespec()
@@ -3556,7 +3785,7 @@
     current_node = make_ast_node(AST::AST_WIRE);
     packed_ranges.push_back(make_range(63, 0));
     add_multirange_wire(current_node, packed_ranges, unpacked_ranges);
-    current_node->is_signed = true;
+    current_node->is_signed = vpi_get(vpiSigned, obj_h);
 }
 
 void UhdmAst::process_byte_typespec()
@@ -3566,7 +3795,7 @@
     current_node = make_ast_node(AST::AST_WIRE);
     packed_ranges.push_back(make_range(7, 0));
     add_multirange_wire(current_node, packed_ranges, unpacked_ranges);
-    current_node->is_signed = true;
+    current_node->is_signed = vpi_get(vpiSigned, obj_h);
 }
 
 void UhdmAst::process_time_typespec()
@@ -3629,6 +3858,7 @@
             current_node->children.push_back(node);
         }
     });
+    current_node->is_signed = vpi_get(vpiSigned, obj_h);
 }
 
 void UhdmAst::process_repeat()
@@ -3751,6 +3981,8 @@
         case vpiStructVar:
         case vpiUnionVar:
         case vpiEnumVar:
+        case vpiBitVar:
+        case vpiByteVar:
         case vpiShortIntVar:
         case vpiLongIntVar:
         case vpiIntVar:
@@ -3759,8 +3991,8 @@
         default: {
             const uhdm_handle *const handle = (const uhdm_handle *)actual_h;
             const UHDM::BaseClass *const object = (const UHDM::BaseClass *)handle->object;
-            report_error("%s:%d: Encountered unhandled type in process_port: %s\n", object->VpiFile().c_str(), object->VpiLineNo(),
-                         UHDM::VpiTypeName(actual_h).c_str());
+            report_error("%.*s:%d: Encountered unhandled type in process_port: %s\n", (int)object->VpiFile().length(), object->VpiFile().data(),
+                         object->VpiLineNo(), UHDM::VpiTypeName(actual_h).c_str());
             break;
         }
         }
@@ -3782,6 +4014,7 @@
                     current_node->children = std::move(node->children);
                 }
             }
+            current_node->is_signed = current_node->is_signed || node->is_signed;
             delete node;
         }
     });
@@ -3859,7 +4092,10 @@
         }
         case vpiIntTypespec:
         case vpiIntegerTypespec: {
-            packed_ranges.push_back(make_range(31, 0));
+            visit_one_to_many({vpiRange}, typespec_h, [&](AST::AstNode *node) { packed_ranges.push_back(node); });
+            if (packed_ranges.empty()) {
+                packed_ranges.push_back(make_range(31, 0));
+            }
             shared.report.mark_handled(typespec_h);
             break;
         }
@@ -3912,8 +4148,9 @@
         default: {
             const uhdm_handle *const handle = (const uhdm_handle *)typespec_h;
             const UHDM::BaseClass *const object = (const UHDM::BaseClass *)handle->object;
-            report_error("%s:%d: Encountered unhandled typespec in process_parameter: '%s' of type '%s'\n", object->VpiFile().c_str(),
-                         object->VpiLineNo(), object->VpiName().c_str(), UHDM::VpiTypeName(typespec_h).c_str());
+            report_error("%.*s:%d: Encountered unhandled typespec in process_parameter: '%.*s' of type '%s'\n", (int)object->VpiFile().length(),
+                         object->VpiFile().data(), object->VpiLineNo(), (int)object->VpiName().length(), object->VpiName().data(),
+                         UHDM::VpiTypeName(typespec_h).c_str());
             break;
         }
         }
@@ -4026,8 +4263,8 @@
 
 void UhdmAst::process_unsupported_stmt(const UHDM::BaseClass *object)
 {
-    log_error("%s:%d: Currently not supported object of type '%s'\n", object->VpiFile().c_str(), object->VpiLineNo(),
-              UHDM::VpiTypeName(obj_h).c_str());
+    log_error("%.*s:%d: Currently not supported object of type '%s'\n", (int)object->VpiFile().length(), object->VpiFile().data(),
+              object->VpiLineNo(), UHDM::VpiTypeName(obj_h).c_str());
 }
 
 AST::AstNode *UhdmAst::process_object(vpiHandle obj_handle)
@@ -4038,8 +4275,8 @@
     const UHDM::BaseClass *const object = (const UHDM::BaseClass *)handle->object;
     for (auto *obj : shared.nonSynthesizableObjects) {
         if (!object->Compare(obj)) {
-            log_warning("%s:%d: Skipping non-synthesizable object of type '%s'\n", object->VpiFile().c_str(), object->VpiLineNo(),
-                        UHDM::VpiTypeName(obj_h).c_str());
+            log_warning("%.*s:%d: Skipping non-synthesizable object of type '%s'\n", (int)object->VpiFile().length(), object->VpiFile().data(),
+                        object->VpiLineNo(), UHDM::VpiTypeName(obj_h).c_str());
             return nullptr;
         }
     }
@@ -4112,8 +4349,9 @@
         break;
     case vpiAssignStmt:
     case vpiAssignment:
-        process_assignment();
+        process_assignment(object);
         break;
+    case vpiInterfaceTypespec:
     case vpiRefVar:
     case vpiRefObj:
         current_node = make_ast_node(AST::AST_IDENTIFIER);
@@ -4182,11 +4420,11 @@
         break;
     case vpiBreak:
         // Will be resolved later by loop processor
-        current_node = make_ast_node(static_cast<AST::AstNodeType>(AST::AST_BREAK));
+        current_node = make_ast_node(static_cast<AST::AstNodeType>(AST::Extended::AST_BREAK));
         break;
     case vpiContinue:
         // Will be resolved later by loop processor
-        current_node = make_ast_node(static_cast<AST::AstNodeType>(AST::AST_CONTINUE));
+        current_node = make_ast_node(static_cast<AST::AstNodeType>(AST::Extended::AST_CONTINUE));
         break;
     case vpiGenScopeArray:
         process_gen_scope_array();
@@ -4221,10 +4459,10 @@
         process_sys_func_call();
         break;
     case vpiFuncCall:
-        process_func_call();
+        process_tf_call(AST::AST_FCALL);
         break;
     case vpiTaskCall:
-        current_node = make_ast_node(AST::AST_TCALL);
+        process_tf_call(AST::AST_TCALL);
         break;
     case vpiImmediateAssert:
         if (!shared.no_assert)
@@ -4299,8 +4537,8 @@
         break;
     case vpiProgram:
     default:
-        report_error("%s:%d: Encountered unhandled object '%s' of type '%s'\n", object->VpiFile().c_str(), object->VpiLineNo(),
-                     object->VpiName().c_str(), UHDM::VpiTypeName(obj_h).c_str());
+        report_error("%.*s:%d: Encountered unhandled object '%.*s' of type '%s'\n", (int)object->VpiFile().length(), object->VpiFile().data(),
+                     object->VpiLineNo(), (int)object->VpiName().length(), object->VpiName().data(), UHDM::VpiTypeName(obj_h).c_str());
         break;
     }
 
@@ -4339,4 +4577,4 @@
     }
 }
 
-YOSYS_NAMESPACE_END
+} // namespace systemverilog_plugin
diff --git a/systemverilog-plugin/UhdmAst.h b/systemverilog-plugin/UhdmAst.h
index b7877a6..6d6a8f6 100644
--- a/systemverilog-plugin/UhdmAst.h
+++ b/systemverilog-plugin/UhdmAst.h
@@ -8,7 +8,8 @@
 #include "uhdmastshared.h"
 #include <uhdm/uhdm.h>
 
-YOSYS_NAMESPACE_BEGIN
+namespace systemverilog_plugin
+{
 
 class UhdmAst
 {
@@ -16,43 +17,44 @@
     // Walks through one-to-many relationships from given parent
     // node through the VPI interface, visiting child nodes belonging to
     // ChildrenNodeTypes that are present in the given object.
-    void visit_one_to_many(const std::vector<int> child_node_types, vpiHandle parent_handle, const std::function<void(AST::AstNode *)> &f);
+    void visit_one_to_many(const std::vector<int> child_node_types, vpiHandle parent_handle, const std::function<void(::Yosys::AST::AstNode *)> &f);
 
     // Walks through one-to-one relationships from given parent
     // node through the VPI interface, visiting child nodes belonging to
     // ChildrenNodeTypes that are present in the given object.
-    void visit_one_to_one(const std::vector<int> child_node_types, vpiHandle parent_handle, const std::function<void(AST::AstNode *)> &f);
+    void visit_one_to_one(const std::vector<int> child_node_types, vpiHandle parent_handle, const std::function<void(::Yosys::AST::AstNode *)> &f);
 
     // Visit children of type vpiRange that belong to the given parent node.
-    void visit_range(vpiHandle obj_h, const std::function<void(AST::AstNode *)> &f);
+    void visit_range(vpiHandle obj_h, const std::function<void(::Yosys::AST::AstNode *)> &f);
 
     // Visit the default expression assigned to a variable.
     void visit_default_expr(vpiHandle obj_h);
 
     // Create an AstNode of the specified type with metadata extracted from
     // the given vpiHandle.
-    AST::AstNode *make_ast_node(AST::AstNodeType type, std::vector<AST::AstNode *> children = {}, bool prefer_full_name = false);
+    ::Yosys::AST::AstNode *make_ast_node(::Yosys::AST::AstNodeType type, std::vector<::Yosys::AST::AstNode *> children = {},
+                                         bool prefer_full_name = false);
 
     // Create an identifier AstNode
-    AST::AstNode *make_identifier(const std::string &name);
+    ::Yosys::AST::AstNode *make_identifier(const std::string &name);
 
     // Makes the passed node a cell node of the specified type
-    void make_cell(vpiHandle obj_h, AST::AstNode *node, AST::AstNode *type);
+    void make_cell(vpiHandle obj_h, ::Yosys::AST::AstNode *node, ::Yosys::AST::AstNode *type);
 
     // Moves a type node to the specified node
-    void move_type_to_new_typedef(AST::AstNode *current_node, AST::AstNode *type_node);
+    void move_type_to_new_typedef(::Yosys::AST::AstNode *current_node, ::Yosys::AST::AstNode *type_node);
 
     // Go up the UhdmAst to find a parent node of the specified type
-    AST::AstNode *find_ancestor(const std::unordered_set<AST::AstNodeType> &types);
+    ::Yosys::AST::AstNode *find_ancestor(const std::unordered_set<::Yosys::AST::AstNodeType> &types);
 
     // Reports that something went wrong with reading the UHDM file
     void report_error(const char *format, ...) const;
 
     // Processes the value connected to the specified node
-    AST::AstNode *process_value(vpiHandle obj_h);
+    ::Yosys::AST::AstNode *process_value(vpiHandle obj_h);
 
     // Transforms break and continue nodes into structures accepted by the AST frontend
-    void transform_breaks_continues(AST::AstNode *loop, AST::AstNode *decl_block);
+    void transform_breaks_continues(::Yosys::AST::AstNode *loop, ::Yosys::AST::AstNode *decl_block);
 
     // The parent UhdmAst
     UhdmAst *parent;
@@ -64,7 +66,7 @@
     vpiHandle obj_h = 0;
 
     // The current Yosys AST node
-    AST::AstNode *current_node = nullptr;
+    ::Yosys::AST::AstNode *current_node = nullptr;
 
     // Indentation used for debug printing
     std::string indent;
@@ -93,7 +95,7 @@
     void process_cont_assign();
     void process_cont_assign_net();
     void process_cont_assign_var_init();
-    void process_assignment();
+    void process_assignment(const UHDM::BaseClass *object);
     void process_net();
     void process_packed_array_net();
     void process_array_net(const UHDM::BaseClass *object);
@@ -127,7 +129,8 @@
     void process_function();
     void process_logic_var();
     void process_sys_func_call();
-    void process_func_call();
+    // use for task calls and function calls
+    void process_tf_call(::Yosys::AST::AstNodeType type);
     void process_immediate_assert();
     void process_hier_path();
     void process_logic_typespec();
@@ -147,7 +150,7 @@
     void process_while();
     void process_gate();
     void process_primterm();
-    void simplify_parameter(AST::AstNode *parameter, AST::AstNode *module_node = nullptr);
+    void simplify_parameter(::Yosys::AST::AstNode *parameter, ::Yosys::AST::AstNode *module_node = nullptr);
     void process_unsupported_stmt(const UHDM::BaseClass *object);
 
     UhdmAst(UhdmAst *p, UhdmAstShared &s, const std::string &i) : parent(p), shared(s), indent(i)
@@ -160,23 +163,20 @@
     UhdmAst(UhdmAstShared &s, const std::string &i = "") : UhdmAst(nullptr, s, i) {}
 
     // Visits single VPI object and creates proper AST node
-    AST::AstNode *process_object(vpiHandle obj_h);
+    ::Yosys::AST::AstNode *process_object(vpiHandle obj_h);
 
     // Visits all VPI design objects and returns created ASTs
-    AST::AstNode *visit_designs(const std::vector<vpiHandle> &designs);
+    ::Yosys::AST::AstNode *visit_designs(const std::vector<vpiHandle> &designs);
 
-    static const IdString &partial();
-    static const IdString &packed_ranges();
-    static const IdString &unpacked_ranges();
+    static const ::Yosys::IdString &partial();
+    static const ::Yosys::IdString &packed_ranges();
+    static const ::Yosys::IdString &unpacked_ranges();
     // set this attribute to force conversion of multirange wire to single range. It is useful to force-convert some memories.
-    static const IdString &force_convert();
-    static const IdString &is_imported();
+    static const ::Yosys::IdString &force_convert();
+    static const ::Yosys::IdString &is_imported();
+    static const ::Yosys::IdString &is_simplified_wire();
 };
 
-namespace VERILOG_FRONTEND
-{
-extern bool sv_mode;
-}
-YOSYS_NAMESPACE_END
+} // namespace systemverilog_plugin
 
 #endif
diff --git a/systemverilog-plugin/UhdmAstUpstream.cc b/systemverilog-plugin/UhdmAstUpstream.cc
deleted file mode 100644
index 921acf1..0000000
--- a/systemverilog-plugin/UhdmAstUpstream.cc
+++ /dev/null
@@ -1,216 +0,0 @@
-namespace AST
-{
-enum AstNodeTypeExtended {
-    AST_DOT = AST::AST_BIND + 1, // here we always want to point to the last element of yosys' AstNodeType
-    AST_BREAK,
-    AST_CONTINUE
-};
-}
-
-static AST::AstNode *mkconst_real(double d)
-{
-    AST::AstNode *node = new AST::AstNode(AST::AST_REALVALUE);
-    node->realvalue = d;
-    return node;
-}
-namespace VERILOG_FRONTEND
-{
-using namespace AST;
-// divide an arbitrary length decimal number by two and return the rest
-static int my_decimal_div_by_two(std::vector<uint8_t> &digits)
-{
-    int carry = 0;
-    for (size_t i = 0; i < digits.size(); i++) {
-        if (digits[i] >= 10)
-            log_file_error(current_filename, get_line_num(), "Invalid use of [a-fxz?] in decimal constant.\n");
-        digits[i] += carry * 10;
-        carry = digits[i] % 2;
-        digits[i] /= 2;
-    }
-    while (!digits.empty() && !digits.front())
-        digits.erase(digits.begin());
-    return carry;
-}
-
-// find the number of significant bits in a binary number (not including the sign bit)
-static int my_ilog2(int x)
-{
-    int ret = 0;
-    while (x != 0 && x != -1) {
-        x = x >> 1;
-        ret++;
-    }
-    return ret;
-}
-
-// parse a binary, decimal, hexadecimal or octal number with support for special bits ('x', 'z' and '?')
-static void my_strtobin(std::vector<RTLIL::State> &data, const char *str, int len_in_bits, int base, char case_type, bool is_unsized)
-{
-    // all digits in string (MSB at index 0)
-    std::vector<uint8_t> digits;
-
-    while (*str) {
-        if ('0' <= *str && *str <= '9')
-            digits.push_back(*str - '0');
-        else if ('a' <= *str && *str <= 'f')
-            digits.push_back(10 + *str - 'a');
-        else if ('A' <= *str && *str <= 'F')
-            digits.push_back(10 + *str - 'A');
-        else if (*str == 'x' || *str == 'X')
-            digits.push_back(0xf0);
-        else if (*str == 'z' || *str == 'Z' || *str == '?')
-            digits.push_back(0xf1);
-        str++;
-    }
-
-    if (base == 10 && GetSize(digits) == 1 && digits.front() >= 0xf0)
-        base = 2;
-
-    data.clear();
-
-    if (base == 10) {
-        while (!digits.empty())
-            data.push_back(my_decimal_div_by_two(digits) ? State::S1 : State::S0);
-    } else {
-        int bits_per_digit = my_ilog2(base - 1);
-        for (auto it = digits.rbegin(), e = digits.rend(); it != e; it++) {
-            if (*it > (base - 1) && *it < 0xf0)
-                log_file_error(current_filename, get_line_num(), "Digit larger than %d used in in base-%d constant.\n", base - 1, base);
-            for (int i = 0; i < bits_per_digit; i++) {
-                int bitmask = 1 << i;
-                if (*it == 0xf0)
-                    data.push_back(case_type == 'x' ? RTLIL::Sa : RTLIL::Sx);
-                else if (*it == 0xf1)
-                    data.push_back(case_type == 'x' || case_type == 'z' ? RTLIL::Sa : RTLIL::Sz);
-                else
-                    data.push_back((*it & bitmask) ? State::S1 : State::S0);
-            }
-        }
-    }
-
-    int len = GetSize(data);
-    RTLIL::State msb = data.empty() ? State::S0 : data.back();
-
-    if (len_in_bits < 0) {
-        if (len < 32)
-            data.resize(32, msb == State::S0 || msb == State::S1 ? RTLIL::S0 : msb);
-        return;
-    }
-
-    if (is_unsized && (len > len_in_bits))
-        log_file_error(current_filename, get_line_num(), "Unsized constant must have width of 1 bit, but have %d bits!\n", len);
-
-    for (len = len - 1; len >= 0; len--)
-        if (data[len] == State::S1)
-            break;
-    if (msb == State::S0 || msb == State::S1) {
-        len += 1;
-        data.resize(len_in_bits, State::S0);
-    } else {
-        len += 2;
-        data.resize(len_in_bits, msb);
-    }
-
-    if (len_in_bits == 0)
-        log_file_error(current_filename, get_line_num(), "Illegal integer constant size of zero (IEEE 1800-2012, 5.7).\n");
-
-    if (len > len_in_bits)
-        log_warning("Literal has a width of %d bit, but value requires %d bit. (%s:%d)\n", len_in_bits, len, current_filename.c_str(),
-                    get_line_num());
-}
-
-// convert the Verilog code for a constant to an AST node
-static AST::AstNode *const2ast(std::string code, char case_type, bool warn_z)
-{
-    if (warn_z) {
-        AST::AstNode *ret = const2ast(code, case_type, false);
-        if (ret != nullptr && std::find(ret->bits.begin(), ret->bits.end(), RTLIL::State::Sz) != ret->bits.end())
-            log_warning("Yosys has only limited support for tri-state logic at the moment. (%s:%d)\n", current_filename.c_str(), get_line_num());
-        return ret;
-    }
-
-    const char *str = code.c_str();
-
-    // Strings
-    if (*str == '"') {
-        int len = strlen(str) - 2;
-        std::vector<RTLIL::State> data;
-        data.reserve(len * 8);
-        for (int i = 0; i < len; i++) {
-            unsigned char ch = str[len - i];
-            for (int j = 0; j < 8; j++) {
-                data.push_back((ch & 1) ? State::S1 : State::S0);
-                ch = ch >> 1;
-            }
-        }
-        AST::AstNode *ast = AST::AstNode::mkconst_bits(data, false);
-        ast->str = code;
-        return ast;
-    }
-
-    for (size_t i = 0; i < code.size(); i++)
-        if (code[i] == '_' || code[i] == ' ' || code[i] == '\t' || code[i] == '\r' || code[i] == '\n')
-            code.erase(code.begin() + (i--));
-    str = code.c_str();
-
-    char *endptr;
-    long len_in_bits = strtol(str, &endptr, 10);
-
-    // Simple base-10 integer
-    if (*endptr == 0) {
-        std::vector<RTLIL::State> data;
-        my_strtobin(data, str, -1, 10, case_type, false);
-        if (data.back() == State::S1)
-            data.push_back(State::S0);
-        return AST::AstNode::mkconst_bits(data, true);
-    }
-
-    // unsized constant
-    if (str == endptr)
-        len_in_bits = -1;
-
-    // The "<bits>'[sS]?[bodhBODH]<digits>" syntax
-    if (*endptr == '\'') {
-        std::vector<RTLIL::State> data;
-        bool is_signed = false;
-        bool is_unsized = len_in_bits < 0;
-        if (*(endptr + 1) == 's' || *(endptr + 1) == 'S') {
-            is_signed = true;
-            endptr++;
-        }
-        switch (*(endptr + 1)) {
-        case 'b':
-        case 'B':
-            my_strtobin(data, endptr + 2, len_in_bits, 2, case_type, is_unsized);
-            break;
-        case 'o':
-        case 'O':
-            my_strtobin(data, endptr + 2, len_in_bits, 8, case_type, is_unsized);
-            break;
-        case 'd':
-        case 'D':
-            my_strtobin(data, endptr + 2, len_in_bits, 10, case_type, is_unsized);
-            break;
-        case 'h':
-        case 'H':
-            my_strtobin(data, endptr + 2, len_in_bits, 16, case_type, is_unsized);
-            break;
-        default:
-            char next_char = char(tolower(*(endptr + 1)));
-            if (next_char == '0' || next_char == '1' || next_char == 'x' || next_char == 'z') {
-                is_unsized = true;
-                my_strtobin(data, endptr + 1, 1, 2, case_type, is_unsized);
-            } else {
-                return NULL;
-            }
-        }
-        if (len_in_bits < 0) {
-            if (is_signed && data.back() == State::S1)
-                data.push_back(State::S0);
-        }
-        return AST::AstNode::mkconst_bits(data, is_signed, is_unsized);
-    }
-
-    return NULL;
-}
-} // namespace VERILOG_FRONTEND
diff --git a/systemverilog-plugin/tests/Makefile b/systemverilog-plugin/tests/Makefile
index e078fa7..4312522 100644
--- a/systemverilog-plugin/tests/Makefile
+++ b/systemverilog-plugin/tests/Makefile
@@ -16,10 +16,20 @@
 
 TESTS = counter \
 		break_continue \
-		separate-compilation
+		separate-compilation \
+		debug-flag \
+		report-flag \
+		defines \
+		defaults \
+		formal
 
 include $(shell pwd)/../../Makefile_test.common
 
 counter_verify = true
 break_continue_verify = $(call diff_test,break_continue,out)
 separate-compilation_verify = true
+debug-flag_verify = true
+report-flag_verify = true
+defaults_verify = true
+defines_verify = true
+formal_verify = true
diff --git a/systemverilog-plugin/tests/debug-flag/debug-flag-buf.sv b/systemverilog-plugin/tests/debug-flag/debug-flag-buf.sv
new file mode 100644
index 0000000..565946b
--- /dev/null
+++ b/systemverilog-plugin/tests/debug-flag/debug-flag-buf.sv
@@ -0,0 +1,21 @@
+// Copyright 2020-2022 F4PGA Authors
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+// SPDX-License-Identifier: Apache-2.0
+module BUF (
+  input I,
+  output O
+);
+  assign O = I;
+endmodule;
diff --git a/systemverilog-plugin/tests/debug-flag/debug-flag-pkg.sv b/systemverilog-plugin/tests/debug-flag/debug-flag-pkg.sv
new file mode 100644
index 0000000..b0362fc
--- /dev/null
+++ b/systemverilog-plugin/tests/debug-flag/debug-flag-pkg.sv
@@ -0,0 +1,19 @@
+// Copyright 2020-2022 F4PGA Authors
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+// SPDX-License-Identifier: Apache-2.0
+package pkg;
+  parameter BITS = 4;
+  parameter LOG2DELAY = 22;
+endpackage
diff --git a/systemverilog-plugin/tests/debug-flag/debug-flag.tcl b/systemverilog-plugin/tests/debug-flag/debug-flag.tcl
new file mode 100644
index 0000000..86cfee5
--- /dev/null
+++ b/systemverilog-plugin/tests/debug-flag/debug-flag.tcl
@@ -0,0 +1,16 @@
+yosys -import
+if { [info procs read_uhdm] == {} } { plugin -i systemverilog }
+yosys -import  ;# ingest plugin commands
+
+set TMP_DIR /tmp
+if { [info exists ::env(TMPDIR) ] } {
+  set TMP_DIR $::env(TMPDIR)
+}
+
+# Testing simple round-trip
+read_systemverilog -debug -odir $TMP_DIR/debug-flag-test -defer $::env(DESIGN_TOP)-pkg.sv
+read_systemverilog -debug -odir $TMP_DIR/debug-flag-test -defer $::env(DESIGN_TOP)-buf.sv
+read_systemverilog -debug -odir $TMP_DIR/debug-flag-test -defer $::env(DESIGN_TOP).v
+read_systemverilog -debug -odir $TMP_DIR/debug-flag-test -link
+hierarchy
+write_verilog
diff --git a/systemverilog-plugin/tests/debug-flag/debug-flag.v b/systemverilog-plugin/tests/debug-flag/debug-flag.v
new file mode 100644
index 0000000..5bd294a
--- /dev/null
+++ b/systemverilog-plugin/tests/debug-flag/debug-flag.v
@@ -0,0 +1,31 @@
+// Copyright 2020-2022 F4PGA Authors
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+// SPDX-License-Identifier: Apache-2.0
+module top (
+  input clk,
+  output [3:0] led
+);
+
+  wire bufg;
+  BUF bufgctrl (
+      .I(clk),
+      .O(bufg)
+  );
+  reg [pkg::BITS + pkg::LOG2DELAY-1 : 0] counter = 0;
+  always @(posedge bufg) begin
+    counter <= counter + 1;
+  end
+  assign led[3:0] = counter >> pkg::LOG2DELAY;
+endmodule
diff --git a/systemverilog-plugin/tests/defaults/defaults.tcl b/systemverilog-plugin/tests/defaults/defaults.tcl
new file mode 100644
index 0000000..a363895
--- /dev/null
+++ b/systemverilog-plugin/tests/defaults/defaults.tcl
@@ -0,0 +1,23 @@
+yosys -import
+if { [info procs read_uhdm] == {} } { plugin -i systemverilog }
+yosys -import  ;# ingest plugin commands
+
+set TMP_DIR /tmp
+if { [info exists ::env(TMPDIR) ] } {
+  set TMP_DIR $::env(TMPDIR)
+}
+
+# Define forbidden value
+systemverilog_defaults -add -DPAKALA
+# Stash it
+systemverilog_defaults -push
+systemverilog_defaults -clear
+read_systemverilog $::env(DESIGN_TOP).v
+# Allow parsing the module again
+delete top
+systemverilog_defaults -pop
+# Skip check for forbidden value
+systemverilog_defaults -add -Pbypass=1
+read_systemverilog $::env(DESIGN_TOP).v
+hierarchy
+write_verilog
diff --git a/systemverilog-plugin/tests/defaults/defaults.v b/systemverilog-plugin/tests/defaults/defaults.v
new file mode 100644
index 0000000..f565a77
--- /dev/null
+++ b/systemverilog-plugin/tests/defaults/defaults.v
@@ -0,0 +1,28 @@
+// Copyright 2020-2022 F4PGA Authors
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+// SPDX-License-Identifier: Apache-2.0
+
+module top #(
+  parameter bit bypass = 0
+)(
+  input clk,
+  output out
+);
+
+`ifdef PAKALA
+  initial if(!bypass) $stop("Defined forbidden value");
+`endif
+  assign out = clk;
+endmodule
diff --git a/systemverilog-plugin/tests/defines/defines.tcl b/systemverilog-plugin/tests/defines/defines.tcl
new file mode 100644
index 0000000..030c1ad
--- /dev/null
+++ b/systemverilog-plugin/tests/defines/defines.tcl
@@ -0,0 +1,15 @@
+yosys -import
+if { [info procs read_uhdm] == {} } { plugin -i systemverilog }
+yosys -import  ;# ingest plugin commands
+
+set TMP_DIR /tmp
+if { [info exists ::env(TMPDIR) ] } {
+  set TMP_DIR $::env(TMPDIR)
+}
+
+systemverilog_defines -DPONA
+systemverilog_defines -DPAKALA
+systemverilog_defines -UPAKALA
+read_systemverilog $::env(DESIGN_TOP).v
+hierarchy
+write_verilog
diff --git a/systemverilog-plugin/tests/defines/defines.v b/systemverilog-plugin/tests/defines/defines.v
new file mode 100644
index 0000000..528e9f1
--- /dev/null
+++ b/systemverilog-plugin/tests/defines/defines.v
@@ -0,0 +1,29 @@
+// Copyright 2020-2022 F4PGA Authors
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+// SPDX-License-Identifier: Apache-2.0
+
+module top (
+  input clk,
+  output out
+);
+
+`ifndef PONA
+  initial $stop("Define failed");
+`endif
+`ifdef PAKALA
+  initial $stop("Undefine failed");
+`endif
+  assign out = clk;
+endmodule
diff --git a/systemverilog-plugin/tests/formal/formal.tcl b/systemverilog-plugin/tests/formal/formal.tcl
new file mode 100644
index 0000000..2474219
--- /dev/null
+++ b/systemverilog-plugin/tests/formal/formal.tcl
@@ -0,0 +1,12 @@
+yosys -import
+if { [info procs read_uhdm] == {} } { plugin -i systemverilog }
+yosys -import  ;# ingest plugin commands
+
+set TMP_DIR /tmp
+if { [info exists ::env(TMPDIR) ] } {
+  set TMP_DIR $::env(TMPDIR)
+}
+
+read_systemverilog -formal $::env(DESIGN_TOP).v
+hierarchy
+write_verilog
diff --git a/systemverilog-plugin/tests/formal/formal.v b/systemverilog-plugin/tests/formal/formal.v
new file mode 100644
index 0000000..04e346c
--- /dev/null
+++ b/systemverilog-plugin/tests/formal/formal.v
@@ -0,0 +1,33 @@
+// Copyright 2020-2022 F4PGA Authors
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+// SPDX-License-Identifier: Apache-2.0
+
+module top #(
+)(
+  input clk,
+  output out
+);
+
+`ifdef SYNTHESIS
+  initial $stop("SYNTHESIS should be undefined");
+`endif
+`ifndef YOSYS
+  initial $stop("YOSYS should be defined");
+`endif
+`ifndef FORMAL
+  initial $stop("FORMAL should be defined");
+`endif
+  assign out = clk;
+endmodule
diff --git a/systemverilog-plugin/tests/report-flag/report-flag-buf.sv b/systemverilog-plugin/tests/report-flag/report-flag-buf.sv
new file mode 100644
index 0000000..565946b
--- /dev/null
+++ b/systemverilog-plugin/tests/report-flag/report-flag-buf.sv
@@ -0,0 +1,21 @@
+// Copyright 2020-2022 F4PGA Authors
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+// SPDX-License-Identifier: Apache-2.0
+module BUF (
+  input I,
+  output O
+);
+  assign O = I;
+endmodule;
diff --git a/systemverilog-plugin/tests/report-flag/report-flag-pkg.sv b/systemverilog-plugin/tests/report-flag/report-flag-pkg.sv
new file mode 100644
index 0000000..b0362fc
--- /dev/null
+++ b/systemverilog-plugin/tests/report-flag/report-flag-pkg.sv
@@ -0,0 +1,19 @@
+// Copyright 2020-2022 F4PGA Authors
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+// SPDX-License-Identifier: Apache-2.0
+package pkg;
+  parameter BITS = 4;
+  parameter LOG2DELAY = 22;
+endpackage
diff --git a/systemverilog-plugin/tests/report-flag/report-flag.tcl b/systemverilog-plugin/tests/report-flag/report-flag.tcl
new file mode 100644
index 0000000..3a3cc6d
--- /dev/null
+++ b/systemverilog-plugin/tests/report-flag/report-flag.tcl
@@ -0,0 +1,16 @@
+yosys -import
+if { [info procs read_uhdm] == {} } { plugin -i systemverilog }
+yosys -import  ;# ingest plugin commands
+
+set TMP_DIR /tmp
+if { [info exists ::env(TMPDIR) ] } {
+  set TMP_DIR $::env(TMPDIR)
+}
+
+# Testing simple round-trip
+read_systemverilog -report $TMP_DIR/report-flag-test -odir $TMP_DIR/report-flag-test -defer $::env(DESIGN_TOP)-pkg.sv
+read_systemverilog -report $TMP_DIR/report-flag-test -odir $TMP_DIR/report-flag-test -defer $::env(DESIGN_TOP)-buf.sv
+read_systemverilog -report $TMP_DIR/report-flag-test -odir $TMP_DIR/report-flag-test -defer $::env(DESIGN_TOP).v
+read_systemverilog -report $TMP_DIR/report-flag-test -odir $TMP_DIR/report-flag-test -link
+hierarchy
+write_verilog
diff --git a/systemverilog-plugin/tests/report-flag/report-flag.v b/systemverilog-plugin/tests/report-flag/report-flag.v
new file mode 100644
index 0000000..5bd294a
--- /dev/null
+++ b/systemverilog-plugin/tests/report-flag/report-flag.v
@@ -0,0 +1,31 @@
+// Copyright 2020-2022 F4PGA Authors
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+// SPDX-License-Identifier: Apache-2.0
+module top (
+  input clk,
+  output [3:0] led
+);
+
+  wire bufg;
+  BUF bufgctrl (
+      .I(clk),
+      .O(bufg)
+  );
+  reg [pkg::BITS + pkg::LOG2DELAY-1 : 0] counter = 0;
+  always @(posedge bufg) begin
+    counter <= counter + 1;
+  end
+  assign led[3:0] = counter >> pkg::LOG2DELAY;
+endmodule
diff --git a/systemverilog-plugin/third_party/yosys/README b/systemverilog-plugin/third_party/yosys/README
new file mode 100644
index 0000000..ceb62a9
--- /dev/null
+++ b/systemverilog-plugin/third_party/yosys/README
@@ -0,0 +1,17 @@
+Files in this directory were copied from Yosys sources and slightly adapted.
+Original sources and their license available at https://github.com/YosysHQ/yosys.
+
+Copied files, their sources, changes & notes:
+
+- const2ast.cc: yosys/frontends/verilog/const2ast.cc (rev. 72787f5)
+  - The file is a part of Yosys Verilog frontend, which is not publicly exposed
+    by Yosys. Copy has been made to avoid relying on internal details.
+  - Changes:
+    - C++ includes adapted to not rely on `verilog_frontend.h` file.
+    - Removed Yosys namespace; `const2ast()` has been placed inside
+      `systemverilog_plugin` namespace to avoid conflicts with the symbol from
+      Yosys when statically linking.
+
+Non-copied files placed here for interfacing purposes:
+
+- const2ast.h
diff --git a/systemverilog-plugin/third_party/yosys/const2ast.cc b/systemverilog-plugin/third_party/yosys/const2ast.cc
new file mode 100644
index 0000000..96ea6cc
--- /dev/null
+++ b/systemverilog-plugin/third_party/yosys/const2ast.cc
@@ -0,0 +1,252 @@
+/*
+ *  yosys -- Yosys Open SYnthesis Suite
+ *
+ *  Copyright (C) 2012  Claire Xenia Wolf <claire@yosyshq.com>
+ *
+ *  Permission to use, copy, modify, and/or distribute this software for any
+ *  purpose with or without fee is hereby granted, provided that the above
+ *  copyright notice and this permission notice appear in all copies.
+ *
+ *  THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ *  WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ *  MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ *  ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ *  WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ *  ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ *  OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ *
+ *  ---
+ *
+ *  The Verilog frontend.
+ *
+ *  This frontend is using the AST frontend library (see frontends/ast/).
+ *  Thus this frontend does not generate RTLIL code directly but creates an
+ *  AST directly from the Verilog parse tree and then passes this AST to
+ *  the AST frontend library.
+ *
+ *  ---
+ *
+ *  This file contains an ad-hoc parser for Verilog constants. The Verilog
+ *  lexer does only recognize a constant but does not actually split it to its
+ *  components. I.e. it just passes the Verilog code for the constant to the
+ *  bison parser. The parser then uses the function const2ast() from this file
+ *  to create an AST node for the constant.
+ *
+ *  ---
+ *
+ *  The file has been adapted for use in Yosys SystemVerilog Plugin.
+ *
+ */
+
+#include "const2ast.h"
+#include "frontends/ast/ast.h"
+#include "kernel/log.h"
+
+#include <string>
+#include <cmath>
+#include <vector>
+
+using namespace Yosys;
+using namespace Yosys::AST;
+
+// divide an arbitrary length decimal number by two and return the rest
+static int my_decimal_div_by_two(std::vector<uint8_t> &digits)
+{
+	int carry = 0;
+	for (size_t i = 0; i < digits.size(); i++) {
+		if (digits[i] >= 10)
+			log_file_error(current_filename, get_line_num(), "Invalid use of [a-fxz?] in decimal constant.\n");
+		digits[i] += carry * 10;
+		carry = digits[i] % 2;
+		digits[i] /= 2;
+	}
+	while (!digits.empty() && !digits.front())
+		digits.erase(digits.begin());
+	return carry;
+}
+
+// find the number of significant bits in a binary number (not including the sign bit)
+static int my_ilog2(int x)
+{
+	int ret = 0;
+	while (x != 0 && x != -1) {
+		x = x >> 1;
+		ret++;
+	}
+	return ret;
+}
+
+// parse a binary, decimal, hexadecimal or octal number with support for special bits ('x', 'z' and '?')
+static void my_strtobin(std::vector<RTLIL::State> &data, const char *str, int len_in_bits, int base, char case_type, bool is_unsized)
+{
+	// all digits in string (MSB at index 0)
+	std::vector<uint8_t> digits;
+
+	while (*str) {
+		if ('0' <= *str && *str <= '9')
+			digits.push_back(*str - '0');
+		else if ('a' <= *str && *str <= 'f')
+			digits.push_back(10 + *str - 'a');
+		else if ('A' <= *str && *str <= 'F')
+			digits.push_back(10 + *str - 'A');
+		else if (*str == 'x' || *str == 'X')
+			digits.push_back(0xf0);
+		else if (*str == 'z' || *str == 'Z' || *str == '?')
+			digits.push_back(0xf1);
+		str++;
+	}
+
+	if (base == 10 && GetSize(digits) == 1 && digits.front() >= 0xf0)
+		base = 2;
+
+	data.clear();
+
+	if (base == 10) {
+		while (!digits.empty())
+			data.push_back(my_decimal_div_by_two(digits) ? State::S1 : State::S0);
+	} else {
+		int bits_per_digit = my_ilog2(base-1);
+		for (auto it = digits.rbegin(), e = digits.rend(); it != e; it++) {
+			if (*it > (base-1) && *it < 0xf0)
+				log_file_error(current_filename, get_line_num(), "Digit larger than %d used in in base-%d constant.\n",
+					       base-1, base);
+			for (int i = 0; i < bits_per_digit; i++) {
+				int bitmask = 1 << i;
+				if (*it == 0xf0)
+					data.push_back(case_type == 'x' ? RTLIL::Sa : RTLIL::Sx);
+				else if (*it == 0xf1)
+					data.push_back(case_type == 'x' || case_type == 'z' ? RTLIL::Sa : RTLIL::Sz);
+				else
+					data.push_back((*it & bitmask) ? State::S1 : State::S0);
+			}
+		}
+	}
+
+	int len = GetSize(data);
+	RTLIL::State msb = data.empty() ? State::S0 : data.back();
+
+	if (len_in_bits < 0) {
+		if (len < 32)
+			data.resize(32, msb == State::S0 || msb == State::S1 ? RTLIL::S0 : msb);
+		return;
+	}
+
+	if (is_unsized && (len > len_in_bits))
+		log_file_error(current_filename, get_line_num(), "Unsized constant must have width of 1 bit, but have %d bits!\n", len);
+
+	for (len = len - 1; len >= 0; len--)
+		if (data[len] == State::S1)
+			break;
+	if (msb == State::S0 || msb == State::S1) {
+		len += 1;
+		data.resize(len_in_bits, State::S0);
+	} else {
+		len += 2;
+		data.resize(len_in_bits, msb);
+	}
+
+	if (len_in_bits == 0)
+		log_file_error(current_filename, get_line_num(), "Illegal integer constant size of zero (IEEE 1800-2012, 5.7).\n");
+
+	if (len > len_in_bits)
+		log_warning("Literal has a width of %d bit, but value requires %d bit. (%s:%d)\n",
+			len_in_bits, len, current_filename.c_str(), get_line_num());
+}
+
+// convert the Verilog code for a constant to an AST node
+AstNode *systemverilog_plugin::const2ast(std::string code, char case_type, bool warn_z)
+{
+	if (warn_z) {
+		AstNode *ret = const2ast(code, case_type);
+		if (ret != nullptr && std::find(ret->bits.begin(), ret->bits.end(), RTLIL::State::Sz) != ret->bits.end())
+			log_warning("Yosys has only limited support for tri-state logic at the moment. (%s:%d)\n",
+				current_filename.c_str(), get_line_num());
+		return ret;
+	}
+
+	const char *str = code.c_str();
+
+	// Strings
+	if (*str == '"') {
+		int len = strlen(str) - 2;
+		std::vector<RTLIL::State> data;
+		data.reserve(len * 8);
+		for (int i = 0; i < len; i++) {
+			unsigned char ch = str[len - i];
+			for (int j = 0; j < 8; j++) {
+				data.push_back((ch & 1) ? State::S1 : State::S0);
+				ch = ch >> 1;
+			}
+		}
+		AstNode *ast = AstNode::mkconst_bits(data, false);
+		ast->str = code;
+		return ast;
+	}
+
+	for (size_t i = 0; i < code.size(); i++)
+		if (code[i] == '_' || code[i] == ' ' || code[i] == '\t' || code[i] == '\r' || code[i] == '\n')
+			code.erase(code.begin()+(i--));
+	str = code.c_str();
+
+	char *endptr;
+	long len_in_bits = strtol(str, &endptr, 10);
+
+	// Simple base-10 integer
+	if (*endptr == 0) {
+		std::vector<RTLIL::State> data;
+		my_strtobin(data, str, -1, 10, case_type, false);
+		if (data.back() == State::S1)
+			data.push_back(State::S0);
+		return AstNode::mkconst_bits(data, true);
+	}
+
+	// unsized constant
+	if (str == endptr)
+		len_in_bits = -1;
+
+	// The "<bits>'[sS]?[bodhBODH]<digits>" syntax
+	if (*endptr == '\'')
+	{
+		std::vector<RTLIL::State> data;
+		bool is_signed = false;
+		bool is_unsized = len_in_bits < 0;
+		if (*(endptr+1) == 's' || *(endptr+1) == 'S') {
+			is_signed = true;
+			endptr++;
+		}
+		switch (*(endptr+1))
+		{
+		case 'b':
+		case 'B':
+			my_strtobin(data, endptr+2, len_in_bits, 2, case_type, is_unsized);
+			break;
+		case 'o':
+		case 'O':
+			my_strtobin(data, endptr+2, len_in_bits, 8, case_type, is_unsized);
+			break;
+		case 'd':
+		case 'D':
+			my_strtobin(data, endptr+2, len_in_bits, 10, case_type, is_unsized);
+			break;
+		case 'h':
+		case 'H':
+			my_strtobin(data, endptr+2, len_in_bits, 16, case_type, is_unsized);
+			break;
+		default:
+			char next_char = char(tolower(*(endptr+1)));
+			if (next_char == '0' || next_char == '1' || next_char == 'x' || next_char == 'z') {
+				is_unsized = true;
+				my_strtobin(data, endptr+1, 1, 2, case_type, is_unsized);
+			} else {
+				return NULL;
+			}
+		}
+		if (len_in_bits < 0) {
+			if (is_signed && data.back() == State::S1)
+				data.push_back(State::S0);
+		}
+		return AstNode::mkconst_bits(data, is_signed, is_unsized);
+	}
+
+	return NULL;
+}
diff --git a/systemverilog-plugin/third_party/yosys/const2ast.h b/systemverilog-plugin/third_party/yosys/const2ast.h
new file mode 100644
index 0000000..f7130a2
--- /dev/null
+++ b/systemverilog-plugin/third_party/yosys/const2ast.h
@@ -0,0 +1,13 @@
+#ifndef SYSTEMVERILOG_PLUGIN_CONST2AST_H
+#define SYSTEMVERILOG_PLUGIN_CONST2AST_H
+
+#include "frontends/ast/ast.h"
+#include <string>
+
+namespace systemverilog_plugin
+{
+	// this function converts a Verilog constant to an AST_CONSTANT node
+	Yosys::AST::AstNode *const2ast(std::string code, char case_type = 0, bool warn_z = false);
+}
+
+#endif // SYSTEMVERILOG_PLUGIN_CONST2AST_H
diff --git a/systemverilog-plugin/uhdmastfrontend.cc b/systemverilog-plugin/uhdmastfrontend.cc
index c09688c..427fb37 100644
--- a/systemverilog-plugin/uhdmastfrontend.cc
+++ b/systemverilog-plugin/uhdmastfrontend.cc
@@ -25,7 +25,10 @@
                          bool shallowVisit = false);
 }
 
-YOSYS_NAMESPACE_BEGIN
+namespace systemverilog_plugin
+{
+
+using namespace ::Yosys;
 
 struct UhdmAstFrontend : public UhdmCommonFrontend {
     UhdmAstFrontend() : UhdmCommonFrontend("uhdm", "read UHDM file") {}
@@ -44,13 +47,14 @@
         UHDM::Serializer serializer;
 
         std::vector<vpiHandle> restoredDesigns = serializer.Restore(filename);
-        UHDM::SynthSubset *synthSubset = new UHDM::SynthSubset(&serializer, this->shared.nonSynthesizableObjects, false);
+        UHDM::SynthSubset *synthSubset =
+          make_new_object_with_optional_extra_true_arg<UHDM::SynthSubset>(&serializer, this->shared.nonSynthesizableObjects, false);
         synthSubset->listenDesigns(restoredDesigns);
         delete synthSubset;
         if (this->shared.debug_flag || !this->report_directory.empty()) {
             for (auto design : restoredDesigns) {
-                std::stringstream strstr;
-                UHDM::visit_object(design, 1, "", &this->shared.report.unhandled, this->shared.debug_flag ? std::cout : strstr);
+                std::ofstream null_stream;
+                UHDM::visit_object(design, 1, "", &this->shared.report.unhandled, this->shared.debug_flag ? std::cout : null_stream);
             }
         }
         UhdmAst uhdm_ast(this->shared);
@@ -67,4 +71,4 @@
     void call_log_header(RTLIL::Design *design) override { log_header(design, "Executing UHDM frontend.\n"); }
 } UhdmAstFrontend;
 
-YOSYS_NAMESPACE_END
+} // namespace systemverilog_plugin
diff --git a/systemverilog-plugin/uhdmastreport.cc b/systemverilog-plugin/uhdmastreport.cc
index 9a2832f..10d6a94 100644
--- a/systemverilog-plugin/uhdmastreport.cc
+++ b/systemverilog-plugin/uhdmastreport.cc
@@ -5,7 +5,10 @@
 #include <uhdm/BaseClass.h>
 #include <unordered_set>
 
-YOSYS_NAMESPACE_BEGIN
+namespace systemverilog_plugin
+{
+
+using namespace ::Yosys;
 
 void UhdmAstReport::mark_handled(const UHDM::BaseClass *object)
 {
@@ -13,7 +16,7 @@
     auto it = unhandled.find(object);
     if (it != unhandled.end()) {
         unhandled.erase(it);
-        handled_count_per_file.at(object->VpiFile())++;
+        handled_count_per_file.at(std::string(object->VpiFile()))++;
     }
 }
 
@@ -40,7 +43,7 @@
     for (auto object : unhandled) {
         if (!object->VpiFile().empty() && object->VpiFile() != AST::current_filename) {
             unhandled_per_file.insert(std::make_pair(object->VpiFile(), std::unordered_set<unsigned>()));
-            unhandled_per_file.at(object->VpiFile()).insert(object->VpiLineNo());
+            unhandled_per_file.at(std::string(object->VpiFile())).insert(object->VpiLineNo());
             handled_count_per_file.insert(std::make_pair(object->VpiFile(), 0));
         }
     }
@@ -84,4 +87,4 @@
     index_file << "</body>\n</html>" << std::endl;
 }
 
-YOSYS_NAMESPACE_END
+} // namespace systemverilog_plugin
diff --git a/systemverilog-plugin/uhdmastreport.h b/systemverilog-plugin/uhdmastreport.h
index ae16b95..e2403fc 100644
--- a/systemverilog-plugin/uhdmastreport.h
+++ b/systemverilog-plugin/uhdmastreport.h
@@ -8,7 +8,8 @@
 #undef cover
 #include <uhdm/uhdm.h>
 
-YOSYS_NAMESPACE_BEGIN
+namespace systemverilog_plugin
+{
 
 class UhdmAstReport
 {
@@ -30,6 +31,6 @@
     void write(const std::string &directory);
 };
 
-YOSYS_NAMESPACE_END
+} // namespace systemverilog_plugin
 
 #endif
diff --git a/systemverilog-plugin/uhdmastshared.h b/systemverilog-plugin/uhdmastshared.h
index a1ad1c6..475ba70 100644
--- a/systemverilog-plugin/uhdmastshared.h
+++ b/systemverilog-plugin/uhdmastshared.h
@@ -5,7 +5,8 @@
 #include <string>
 #include <unordered_map>
 
-YOSYS_NAMESPACE_BEGIN
+namespace systemverilog_plugin
+{
 
 class UhdmAstShared
 {
@@ -50,20 +51,25 @@
     // applies only to read_systemverilog command
     bool link = false;
 
+    // Flag equivalent to read_verilog -formal
+    // Defines FORMAL, undefines SYNTHESIS
+    // Allows verification constructs in Surelog
+    bool formal = false;
+
     // Top nodes of the design (modules, interfaces)
-    std::unordered_map<std::string, AST::AstNode *> top_nodes;
+    std::unordered_map<std::string, ::Yosys::AST::AstNode *> top_nodes;
 
     // UHDM node coverage report
     UhdmAstReport report;
 
     // Map from AST param nodes to their types (used for params with struct types)
-    std::unordered_map<std::string, AST::AstNode *> param_types;
+    std::unordered_map<std::string, ::Yosys::AST::AstNode *> param_types;
 
-    AST::AstNode *current_top_node = nullptr;
+    ::Yosys::AST::AstNode *current_top_node = nullptr;
     // Set of non-synthesizable objects to skip in current design;
     std::set<const UHDM::BaseClass *> nonSynthesizableObjects;
 };
 
-YOSYS_NAMESPACE_END
+} // namespace systemverilog_plugin
 
 #endif
diff --git a/systemverilog-plugin/uhdmcommonfrontend.cc b/systemverilog-plugin/uhdmcommonfrontend.cc
index 651552a..7fd3871 100644
--- a/systemverilog-plugin/uhdmcommonfrontend.cc
+++ b/systemverilog-plugin/uhdmcommonfrontend.cc
@@ -19,7 +19,10 @@
 
 #include "uhdmcommonfrontend.h"
 
-YOSYS_NAMESPACE_BEGIN
+namespace systemverilog_plugin
+{
+
+using namespace ::Yosys;
 
 /* Stub for AST::process */
 static void set_line_num(int) {}
@@ -62,13 +65,19 @@
     log("        parameters of modules yield invalid or not synthesizable code.\n");
     log("        Needs to be followed by read_systemverilog -link after reading\n");
     log("        all files.\n");
+    log("\n");
     log("    -link\n");
     log("        performs linking and elaboration of the files read with -defer\n");
+    log("\n");
     log("    -parse-only\n");
     log("        this parameter only applies to read_systemverilog command,\n");
     log("        it runs only Surelog to parse design, but doesn't load generated\n");
     log("        tree into Yosys.\n");
     log("\n");
+    log("    -formal\n");
+    log("        enable support for SystemVerilog assertions and some Yosys extensions\n");
+    log("        replace the implicit -D SYNTHESIS with -D FORMAL\n");
+    log("\n");
 }
 
 void UhdmCommonFrontend::execute(std::istream *&f, std::string filename, std::vector<std::string> args, RTLIL::Design *design)
@@ -117,6 +126,10 @@
             this->shared.link = true;
             // Surelog needs it in the command line to link correctly
             unhandled_args.push_back(args[i]);
+        } else if (args[i] == "-formal") {
+            this->shared.formal = true;
+            // Surelog needs it in the command line to annotate UHDM
+            unhandled_args.push_back(args[i]);
         } else {
             unhandled_args.push_back(args[i]);
         }
@@ -147,4 +160,4 @@
     }
 }
 
-YOSYS_NAMESPACE_END
+} // namespace systemverilog_plugin
diff --git a/systemverilog-plugin/uhdmcommonfrontend.h b/systemverilog-plugin/uhdmcommonfrontend.h
index 3d5ff16..4c10d10 100644
--- a/systemverilog-plugin/uhdmcommonfrontend.h
+++ b/systemverilog-plugin/uhdmcommonfrontend.h
@@ -23,20 +23,39 @@
 #include "uhdm/SynthSubset.h"
 #include "uhdm/VpiListener.h"
 #include <string>
+#include <type_traits>
 #include <vector>
 
-YOSYS_NAMESPACE_BEGIN
+namespace systemverilog_plugin
+{
 
-struct UhdmCommonFrontend : public Frontend {
+// FIXME (mglb): temporary fix to support UHDM both before and after the following change:
+// https://github.com/chipsalliance/UHDM/commit/d78d094448bd94926644e48adea4df293b82f101
+// The commit introducing this code should to be reverted after Surelog is bumped to recent versions in all our repositories.
+template <typename ObjT, typename... ArgN, std::enable_if_t<std::is_constructible_v<ObjT, ArgN...>, bool> = true>
+static inline ObjT *make_new_object_with_optional_extra_true_arg(ArgN &&... arg_n)
+{
+    // Older UHDM version
+    return new ObjT(std::forward<ArgN>(arg_n)...);
+}
+
+template <typename ObjT, typename... ArgN, std::enable_if_t<!std::is_constructible_v<ObjT, ArgN...>, bool> = true>
+static inline ObjT *make_new_object_with_optional_extra_true_arg(ArgN &&... arg_n)
+{
+    // Newer UHDM version
+    return new ObjT(std::forward<ArgN>(arg_n)..., true);
+}
+
+struct UhdmCommonFrontend : public ::Yosys::Frontend {
     UhdmAstShared shared;
     std::string report_directory;
     std::vector<std::string> args;
     UhdmCommonFrontend(std::string name, std::string short_help) : Frontend(name, short_help) {}
     virtual void print_read_options();
     virtual void help() = 0;
-    virtual AST::AstNode *parse(std::string filename) = 0;
-    virtual void call_log_header(RTLIL::Design *design) = 0;
-    void execute(std::istream *&f, std::string filename, std::vector<std::string> args, RTLIL::Design *design);
+    virtual ::Yosys::AST::AstNode *parse(std::string filename) = 0;
+    virtual void call_log_header(::Yosys::RTLIL::Design *design) = 0;
+    void execute(std::istream *&f, std::string filename, std::vector<std::string> args, ::Yosys::RTLIL::Design *design);
 };
 
-YOSYS_NAMESPACE_END
+} // namespace systemverilog_plugin
diff --git a/systemverilog-plugin/uhdmsurelogastfrontend.cc b/systemverilog-plugin/uhdmsurelogastfrontend.cc
index 0a72d26..8801d8e 100644
--- a/systemverilog-plugin/uhdmsurelogastfrontend.cc
+++ b/systemverilog-plugin/uhdmsurelogastfrontend.cc
@@ -29,6 +29,9 @@
 #include <sys/param.h>
 #include <unistd.h>
 #endif
+#include <memory>
+
+#include <list>
 
 #include "Surelog/ErrorReporting/Report.h"
 #include "Surelog/surelog.h"
@@ -39,44 +42,78 @@
                          bool shallowVisit = false);
 }
 
-YOSYS_NAMESPACE_BEGIN
-
-std::vector<vpiHandle> executeCompilation(SURELOG::SymbolTable *symbolTable, SURELOG::ErrorContainer *errors, SURELOG::CommandLineParser *clp,
-                                          SURELOG::scompiler *compiler)
+namespace systemverilog_plugin
 {
-    bool success = true;
-    bool noFatalErrors = true;
-    unsigned int codedReturn = 0;
-    clp->setWriteUhdm(false);
-    errors->printMessages(clp->muteStdout());
-    std::vector<vpiHandle> the_design;
-    if (success && (!clp->help())) {
-        compiler = SURELOG::start_compiler(clp);
-        if (!compiler)
+
+using namespace ::Yosys;
+
+// Store systemverilog defaults to be passed for every invocation of read_systemverilog
+static std::vector<std::string> systemverilog_defaults;
+static std::list<std::vector<std::string>> systemverilog_defaults_stack;
+
+// Store global definitions for top-level defines
+static std::vector<std::string> systemverilog_defines;
+
+// SURELOG::scompiler wrapper.
+// Owns UHDM/VPI resources used by designs returned from `execute`
+class Compiler
+{
+  public:
+    Compiler() = default;
+    ~Compiler()
+    {
+        if (this->scompiler) {
+            SURELOG::shutdown_compiler(this->scompiler);
+        }
+    }
+
+    const std::vector<vpiHandle> &execute(std::unique_ptr<SURELOG::ErrorContainer> errors, std::unique_ptr<SURELOG::CommandLineParser> clp)
+    {
+        log_assert(!this->errors && !this->clp && !this->scompiler);
+
+        bool success = true;
+        bool noFatalErrors = true;
+        unsigned int codedReturn = 0;
+        clp->setWriteUhdm(false);
+        errors->printMessages(clp->muteStdout());
+        if (success && (!clp->help())) {
+            this->scompiler = SURELOG::start_compiler(clp.get());
+            if (!this->scompiler)
+                codedReturn |= 1;
+            this->designs.push_back(SURELOG::get_uhdm_design(this->scompiler));
+        }
+        SURELOG::ErrorContainer::Stats stats;
+        if (!clp->help()) {
+            stats = errors->getErrorStats();
+            if (stats.nbFatal)
+                codedReturn |= 1;
+            if (stats.nbSyntax)
+                codedReturn |= 2;
+        }
+        bool noFErrors = true;
+        if (!clp->help())
+            noFErrors = errors->printStats(stats, clp->muteStdout());
+        if (noFErrors == false) {
+            noFatalErrors = false;
+        }
+        if ((!noFatalErrors) || (!success) || (errors->getErrorStats().nbError))
             codedReturn |= 1;
-        the_design.push_back(SURELOG::get_uhdm_design(compiler));
+        if (codedReturn) {
+            log_error("Error when parsing design. Aborting!\n");
+        }
+
+        this->clp = std::move(clp);
+        this->errors = std::move(errors);
+
+        return this->designs;
     }
-    SURELOG::ErrorContainer::Stats stats;
-    if (!clp->help()) {
-        stats = errors->getErrorStats();
-        if (stats.nbFatal)
-            codedReturn |= 1;
-        if (stats.nbSyntax)
-            codedReturn |= 2;
-    }
-    bool noFErrors = true;
-    if (!clp->help())
-        noFErrors = errors->printStats(stats, clp->muteStdout());
-    if (noFErrors == false) {
-        noFatalErrors = false;
-    }
-    if ((!noFatalErrors) || (!success) || (errors->getErrorStats().nbError))
-        codedReturn |= 1;
-    if (codedReturn) {
-        log_error("Error when parsing design. Aborting!\n");
-    }
-    return the_design;
-}
+
+  private:
+    std::unique_ptr<SURELOG::ErrorContainer> errors = nullptr;
+    std::unique_ptr<SURELOG::CommandLineParser> clp = nullptr;
+    SURELOG::scompiler *scompiler = nullptr;
+    std::vector<vpiHandle> designs = {};
+};
 
 struct UhdmSurelogAstFrontend : public UhdmCommonFrontend {
     UhdmSurelogAstFrontend(std::string name, std::string short_help) : UhdmCommonFrontend(name, short_help) {}
@@ -94,13 +131,38 @@
     AST::AstNode *parse(std::string filename) override
     {
         std::vector<const char *> cstrings;
-        cstrings.reserve(this->args.size());
-        for (size_t i = 0; i < this->args.size(); ++i)
+        bool link = false;
+        if (this->shared.formal) {
+            systemverilog_defines.push_back("-DFORMAL=1");
+        } else {
+            systemverilog_defines.push_back("-DSYNTHESIS=1");
+        }
+        cstrings.reserve(this->args.size() + systemverilog_defaults.size() + systemverilog_defines.size());
+        for (size_t i = 0; i < this->args.size(); ++i) {
             cstrings.push_back(const_cast<char *>(this->args[i].c_str()));
+            if (this->args[i] == "-link")
+                link = true;
+        }
 
-        SURELOG::SymbolTable *symbolTable = new SURELOG::SymbolTable();
-        SURELOG::ErrorContainer *errors = new SURELOG::ErrorContainer(symbolTable);
-        SURELOG::CommandLineParser *clp = new SURELOG::CommandLineParser(errors, symbolTable, false, false);
+        if (!link) {
+            // Add systemverilog defaults args
+            for (size_t i = 0; i < systemverilog_defaults.size(); ++i) {
+                // Convert args to surelog compatible
+                if (systemverilog_defaults[i] == "-defer")
+                    this->shared.defer = true;
+                // Pass any remainings args directly to surelog
+                else
+                    cstrings.push_back(const_cast<char *>(systemverilog_defaults[i].c_str()));
+            }
+
+            // Add systemverilog defines args
+            for (size_t i = 0; i < systemverilog_defines.size(); ++i)
+                cstrings.push_back(const_cast<char *>(systemverilog_defines[i].c_str()));
+        }
+
+        auto symbolTable = std::make_unique<SURELOG::SymbolTable>();
+        auto errors = std::make_unique<SURELOG::ErrorContainer>(symbolTable.get());
+        auto clp = std::make_unique<SURELOG::CommandLineParser>(errors.get(), symbolTable.get(), false, false);
         bool success = clp->parseCommandLine(cstrings.size(), &cstrings[0]);
         if (!success) {
             log_error("Error parsing Surelog arguments!\n");
@@ -122,25 +184,21 @@
             clp->setLink(true);
         }
 
-        SURELOG::scompiler *compiler = nullptr;
-        const std::vector<vpiHandle> uhdm_design = executeCompilation(symbolTable, errors, clp, compiler);
+        Compiler compiler;
+        const auto &uhdm_designs = compiler.execute(std::move(errors), std::move(clp));
+
         if (this->shared.debug_flag || !this->report_directory.empty()) {
-            for (auto design : uhdm_design) {
-                std::stringstream strstr;
-                UHDM::visit_object(design, 1, "", &this->shared.report.unhandled, this->shared.debug_flag ? std::cout : strstr);
+            for (auto design : uhdm_designs) {
+                std::ofstream null_stream;
+                UHDM::visit_object(design, 1, "", &this->shared.report.unhandled, this->shared.debug_flag ? std::cout : null_stream);
             }
         }
 
-        SURELOG::shutdown_compiler(compiler);
-        delete clp;
-        delete symbolTable;
-        delete errors;
         // on parse_only mode, don't try to load design
         // into yosys
         if (this->shared.parse_only)
             return nullptr;
 
-        UhdmAst uhdm_ast(this->shared);
         if (this->shared.defer && !this->shared.link)
             return nullptr;
 
@@ -149,16 +207,21 @@
         // Should be called 1. for normal flow 2. after finishing with `-link`
         if (!this->shared.defer) {
             UHDM::Serializer serializer;
-            UHDM::SynthSubset *synthSubset = new UHDM::SynthSubset(&serializer, this->shared.nonSynthesizableObjects, false);
-            synthSubset->listenDesigns(uhdm_design);
+            UHDM::SynthSubset *synthSubset =
+              make_new_object_with_optional_extra_true_arg<UHDM::SynthSubset>(&serializer, this->shared.nonSynthesizableObjects, false);
+            synthSubset->listenDesigns(uhdm_designs);
             delete synthSubset;
         }
 
-        AST::AstNode *current_ast = uhdm_ast.visit_designs(uhdm_design);
+        UhdmAst uhdm_ast(this->shared);
+        AST::AstNode *current_ast = uhdm_ast.visit_designs(uhdm_designs);
         if (!this->report_directory.empty()) {
             this->shared.report.write(this->report_directory);
         }
 
+        // FIXME: Check and reset remaining shared data
+        this->shared.top_nodes.clear();
+        this->shared.nonSynthesizableObjects.clear();
         return current_ast;
     }
     void call_log_header(RTLIL::Design *design) override { log_header(design, "Executing Verilog with UHDM frontend.\n"); }
@@ -175,7 +238,164 @@
         log("Read SystemVerilog files using Surelog into the current design\n");
         log("\n");
         this->print_read_options();
+        log("    -Ipath\n");
+        log("        add include path.\n");
+        log("\n");
+        log("    -Pparameter=value\n");
+        log("        define parameter as value.\n");
+        log("\n");
     }
 } UhdmSystemVerilogFrontend;
 
-YOSYS_NAMESPACE_END
+struct SystemVerilogDefaults : public Pass {
+    SystemVerilogDefaults() : Pass("systemverilog_defaults", "set default options for read_systemverilog") {}
+    void help() override
+    {
+        //   |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|
+        log("\n");
+        log("    systemverilog_defaults -add [options]\n");
+        log("\n");
+        log("Add the specified options to the list of default options to read_systemverilog.\n");
+        log("\n");
+        log("\n");
+        log("    systemverilog_defaults -clear\n");
+        log("\n");
+        log("Clear the list of Systemverilog default options.\n");
+        log("\n");
+        log("\n");
+        log("    systemverilog_defaults -push\n");
+        log("    systemverilog_defaults -pop\n");
+        log("\n");
+        log("Push or pop the list of default options to a stack. Note that -push does\n");
+        log("not imply -clear.\n");
+        log("\n");
+    }
+    void execute(std::vector<std::string> args, RTLIL::Design *) override
+    {
+        if (args.size() < 2)
+            cmd_error(args, 1, "Missing argument.");
+
+        if (args[1] == "-add") {
+            systemverilog_defaults.insert(systemverilog_defaults.end(), args.begin() + 2, args.end());
+            return;
+        }
+
+        if (args.size() != 2)
+            cmd_error(args, 2, "Extra argument.");
+
+        if (args[1] == "-clear") {
+            systemverilog_defaults.clear();
+            return;
+        }
+
+        if (args[1] == "-push") {
+            systemverilog_defaults_stack.push_back(systemverilog_defaults);
+            return;
+        }
+
+        if (args[1] == "-pop") {
+            if (systemverilog_defaults_stack.empty()) {
+                systemverilog_defaults.clear();
+            } else {
+                systemverilog_defaults.swap(systemverilog_defaults_stack.back());
+                systemverilog_defaults_stack.pop_back();
+            }
+            return;
+        }
+    }
+} SystemVerilogDefaults;
+
+struct SystemVerilogDefines : public Pass {
+    SystemVerilogDefines() : Pass("systemverilog_defines", "define and undefine systemverilog defines")
+    {
+        systemverilog_defines.push_back("-DYOSYS=1");
+    }
+    void help() override
+    {
+        //   |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|
+        log("\n");
+        log("    systemverilog_defines [options]\n");
+        log("\n");
+        log("Define and undefine systemverilog preprocessor macros.\n");
+        log("\n");
+        log("    -Dname[=definition]\n");
+        log("        define the preprocessor symbol 'name' and set its optional value\n");
+        log("        'definition'\n");
+        log("\n");
+        log("    -Uname[=definition]\n");
+        log("        undefine the preprocessor symbol 'name'\n");
+        log("\n");
+        log("    -reset\n");
+        log("        clear list of defined preprocessor symbols\n");
+        log("\n");
+        log("    -list\n");
+        log("        list currently defined preprocessor symbols\n");
+        log("\n");
+    }
+    void remove(const std::string name)
+    {
+        auto it = systemverilog_defines.begin();
+        while (it != systemverilog_defines.end()) {
+            std::string nm;
+            size_t equal = (*it).find('=', 2);
+            if (equal == std::string::npos)
+                nm = (*it).substr(2, std::string::npos);
+            else
+                nm = (*it).substr(2, equal - 2);
+            if (name == nm)
+                systemverilog_defines.erase(it);
+            else
+                it++;
+        }
+    }
+    void dump(void)
+    {
+        for (size_t i = 0; i < systemverilog_defines.size(); ++i) {
+            std::string name, value = "";
+            size_t equal = systemverilog_defines[i].find('=', 2);
+            name = systemverilog_defines[i].substr(2, equal - 2);
+            if (equal != std::string::npos)
+                value = systemverilog_defines[i].substr(equal + 1, std::string::npos);
+            Yosys::log("`define %s %s\n", name.c_str(), value.c_str());
+        }
+    }
+    void execute(std::vector<std::string> args, RTLIL::Design *design) override
+    {
+        size_t argidx;
+        for (argidx = 1; argidx < args.size(); argidx++) {
+            std::string arg = args[argidx];
+            if (arg == "-D" && argidx + 1 < args.size()) {
+                systemverilog_defines.push_back("-D" + args[++argidx]);
+                continue;
+            }
+            if (arg.compare(0, 2, "-D") == 0) {
+                systemverilog_defines.push_back(arg);
+                continue;
+            }
+            if (arg == "-U" && argidx + 1 < args.size()) {
+                std::string name = args[++argidx];
+                this->remove(name);
+                continue;
+            }
+            if (arg.compare(0, 2, "-U") == 0) {
+                std::string name = arg.substr(2);
+                this->remove(name);
+                continue;
+            }
+            if (arg == "-reset") {
+                systemverilog_defines.erase(systemverilog_defines.begin() + 1, systemverilog_defines.end());
+                continue;
+            }
+            if (arg == "-list") {
+                this->dump();
+                continue;
+            }
+            break;
+        }
+
+        if (args.size() != argidx)
+            cmd_error(args, argidx, "Extra argument.");
+    }
+} SystemVerilogDefines;
+
+} // namespace systemverilog_plugin
diff --git a/third_party/make-env b/third_party/make-env
index 59adb0f..33b80bd 160000
--- a/third_party/make-env
+++ b/third_party/make-env
@@ -1 +1 @@
-Subproject commit 59adb0f248cc4a5d764b6b06224bf6adea7fa36e
+Subproject commit 33b80bd32c30fb8affd0fd5cda544d1bca075593
diff --git a/uhdm-plugin/Makefile b/uhdm-plugin/Makefile
index 3eea3d4..4f67830 100644
--- a/uhdm-plugin/Makefile
+++ b/uhdm-plugin/Makefile
@@ -14,6 +14,8 @@
 #
 # SPDX-License-Identifier: Apache-2.0
 
+PLUGIN_DIR := $(abspath $(dir $(lastword $(MAKEFILE_LIST))))
+
 NAME = uhdm
 SOURCES = uhdm.cc
 include ../Makefile_plugin.common
diff --git a/xdc-plugin/Makefile b/xdc-plugin/Makefile
index 06d61d7..b2ebd88 100644
--- a/xdc-plugin/Makefile
+++ b/xdc-plugin/Makefile
@@ -14,12 +14,14 @@
 #
 # SPDX-License-Identifier: Apache-2.0
 
+PLUGIN_DIR := $(abspath $(dir $(lastword $(MAKEFILE_LIST))))
+
 NAME = xdc
 SOURCES = xdc.cc
 include ../Makefile_plugin.common
 VERILOG_MODULES = BANK.v
 
 install_modules: $(VERILOG_MODULES)
-	install -D $< $(PLUGINS_DIR)/fasm_extra_modules/$<
+	install -D $< $(YOSYS_PLUGINS_DIR)/fasm_extra_modules/$<
 
 install: install_modules