Merge branch 'master' of https://github.com/dineshannayya/yifive_r0
diff --git a/checks/.full_log.log.swp b/checks/.full_log.log.swp
new file mode 100644
index 0000000..7b64fd1
--- /dev/null
+++ b/checks/.full_log.log.swp
Binary files differ
diff --git a/checks/full_log.log b/checks/full_log.log
new file mode 100644
index 0000000..26e484c
--- /dev/null
+++ b/checks/full_log.log
@@ -0,0 +1,22 @@
+FULL RUN LOG:
+ Executing Step 0 of 8: Extracting GDS Files
+Step 0 done without fatal errors.
+ Executing Step 1 of 8: Project License Check
+{{LICENSE COMPLIANCE PASSED}} Apache-2.0 LICENSE file was found in project root
+ No third party libraries found.
+Step 1 done without fatal errors.
+{{SPDX COMPLIANCE WARNING}} Found 527 non-compliant files with the SPDX Standard. Check full log for more information
+SPDX COMPLIANCE: NON-COMPLIANT FILES PREVIEW: ['/home/dinesha/workarea/opencore/git/yifive_r0/read.me', '/home/dinesha/workarea/opencore/git/yifive_r0/caravel/openlane/user_analog_project_wrapper_empty/or_ioplace.tcl', '/home/dinesha/workarea/opencore/git/yifive_r0/caravel/verilog/dv/caravel/tbuart.v', '/home/dinesha/workarea/opencore/git/yifive_r0/caravel/verilog/dv/caravel/spiflash.v', '/home/dinesha/workarea/opencore/git/yifive_r0/caravel/verilog/dv/caravel/mgmt_soc/timer/timer_tb.v', '/home/dinesha/workarea/opencore/git/yifive_r0/caravel/verilog/dv/caravel/mgmt_soc/qspi/qspi_tb.v', '/home/dinesha/workarea/opencore/git/yifive_r0/caravel/verilog/dv/caravel/mgmt_soc/perf/perf_tb.v', '/home/dinesha/workarea/opencore/git/yifive_r0/caravel/verilog/dv/caravel/mgmt_soc/timer2/timer2_tb.v', '/home/dinesha/workarea/opencore/git/yifive_r0/caravel/verilog/dv/caravel/mgmt_soc/storage/storage_tb.v', '/home/dinesha/workarea/opencore/git/yifive_r0/caravel/verilog/dv/caravel/mgmt_soc/caravan/caravan_tb.v', '/home/dinesha/workarea/opencore/git/yifive_r0/caravel/verilog/dv/caravel/mgmt_soc/uart/uart_tb.v', '/home/dinesha/workarea/opencore/git/yifive_r0/caravel/verilog/dv/caravel/mgmt_soc/mem/mem_tb.v', '/home/dinesha/workarea/opencore/git/yifive_r0/caravel/verilog/dv/caravel/mgmt_soc/gpio/gpio_tb.v', '/home/dinesha/workarea/opencore/git/yifive_r0/caravel/verilog/rtl/simpleuart.v', '/home/dinesha/workarea/opencore/git/yifive_r0/caravel/verilog/rtl/picorv32.v', '/home/dinesha/workarea/opencore/git/yifive_r0/caravel/verilog/rtl/mgmt_soc.v', '/home/dinesha/workarea/opencore/git/yifive_r0/caravel/verilog/rtl/spimemio.v', '/home/dinesha/workarea/opencore/git/yifive_r0/openlane/default.cvcrc', '/home/dinesha/workarea/opencore/git/yifive_r0/openlane/syntacore/config.1.tcl', '/home/dinesha/workarea/opencore/git/yifive_r0/openlane/syntacore/config.tcl']
+ Executing Step 2 of 8: YAML File Check
+ YAML file valid!
+Step 2 done without fatal errors.
+ Detected Project Type is "digital"
+ Executing Step 3 of 8: Project Compliance Checks
+b'Going into /home/dinesha/workarea/efabless/caravel'
+b'Removing manifest'
+b'Fetching manifest'
+b'Running sha1sum checks'
+ Manifest Checks Failed. Please rebase your Repository to the latest Caravel master.
+verilog/rtl/mgmt_core.v: FAILED
+verilog/rtl/mgmt_soc.v: FAILED
+verilog/rtl/wb_intercon.v: FAILED
diff --git a/checks/manifest_check.log b/checks/manifest_check.log
new file mode 100644
index 0000000..94c2d81
--- /dev/null
+++ b/checks/manifest_check.log
@@ -0,0 +1,47 @@
+verilog/rtl/DFFRAM.v: OK
+verilog/rtl/DFFRAMBB.v: OK
+verilog/rtl/__uprj_analog_netlists.v: OK
+verilog/rtl/__uprj_netlists.v: OK
+verilog/rtl/__user_analog_project_wrapper.v: OK
+verilog/rtl/__user_project_wrapper.v: OK
+verilog/rtl/caravan.v: OK
+verilog/rtl/caravan_netlists.v: OK
+verilog/rtl/caravel.v: OK
+verilog/rtl/caravel_clocking.v: OK
+verilog/rtl/chip_io.v: OK
+verilog/rtl/chip_io_alt.v: OK
+verilog/rtl/clock_div.v: OK
+verilog/rtl/convert_gpio_sigs.v: OK
+verilog/rtl/counter_timer_high.v: OK
+verilog/rtl/counter_timer_low.v: OK
+verilog/rtl/digital_pll.v: OK
+verilog/rtl/digital_pll_controller.v: OK
+verilog/rtl/gpio_control_block.v: OK
+verilog/rtl/gpio_wb.v: OK
+verilog/rtl/housekeeping_spi.v: OK
+verilog/rtl/la_wb.v: OK
+verilog/rtl/mem_wb.v: OK
+verilog/rtl/mgmt_core.v: FAILED
+verilog/rtl/mgmt_protect.v: OK
+verilog/rtl/mgmt_protect_hv.v: OK
+verilog/rtl/mgmt_soc.v: FAILED
+verilog/rtl/mprj2_logic_high.v: OK
+verilog/rtl/mprj_ctrl.v: OK
+verilog/rtl/mprj_io.v: OK
+verilog/rtl/mprj_logic_high.v: OK
+verilog/rtl/pads.v: OK
+verilog/rtl/picorv32.v: OK
+verilog/rtl/ring_osc2x13.v: OK
+verilog/rtl/simple_por.v: OK
+verilog/rtl/simple_spi_master.v: OK
+verilog/rtl/simpleuart.v: OK
+verilog/rtl/sky130_fd_sc_hvl__lsbufhv2lv_1_wrapped.v: OK
+verilog/rtl/spimemio.v: OK
+verilog/rtl/sram_1rw1r_32_256_8_sky130.v: OK
+verilog/rtl/storage.v: OK
+verilog/rtl/storage_bridge_wb.v: OK
+verilog/rtl/sysctrl.v: OK
+verilog/rtl/wb_intercon.v: FAILED
+scripts/set_user_id.py: OK
+scripts/generate_fill.py: OK
+scripts/compositor.py: OK
diff --git a/checks/spdx_compliance_report.log b/checks/spdx_compliance_report.log
new file mode 100644
index 0000000..0f040f1
--- /dev/null
+++ b/checks/spdx_compliance_report.log
@@ -0,0 +1,529 @@
+FULL RUN LOG:
+SPDX NON-COMPLIANT FILES
+/home/dinesha/workarea/opencore/git/yifive_r0/read.me
+/home/dinesha/workarea/opencore/git/yifive_r0/caravel/openlane/user_analog_project_wrapper_empty/or_ioplace.tcl
+/home/dinesha/workarea/opencore/git/yifive_r0/caravel/verilog/dv/caravel/tbuart.v
+/home/dinesha/workarea/opencore/git/yifive_r0/caravel/verilog/dv/caravel/spiflash.v
+/home/dinesha/workarea/opencore/git/yifive_r0/caravel/verilog/dv/caravel/mgmt_soc/timer/timer_tb.v
+/home/dinesha/workarea/opencore/git/yifive_r0/caravel/verilog/dv/caravel/mgmt_soc/qspi/qspi_tb.v
+/home/dinesha/workarea/opencore/git/yifive_r0/caravel/verilog/dv/caravel/mgmt_soc/perf/perf_tb.v
+/home/dinesha/workarea/opencore/git/yifive_r0/caravel/verilog/dv/caravel/mgmt_soc/timer2/timer2_tb.v
+/home/dinesha/workarea/opencore/git/yifive_r0/caravel/verilog/dv/caravel/mgmt_soc/storage/storage_tb.v
+/home/dinesha/workarea/opencore/git/yifive_r0/caravel/verilog/dv/caravel/mgmt_soc/caravan/caravan_tb.v
+/home/dinesha/workarea/opencore/git/yifive_r0/caravel/verilog/dv/caravel/mgmt_soc/uart/uart_tb.v
+/home/dinesha/workarea/opencore/git/yifive_r0/caravel/verilog/dv/caravel/mgmt_soc/mem/mem_tb.v
+/home/dinesha/workarea/opencore/git/yifive_r0/caravel/verilog/dv/caravel/mgmt_soc/gpio/gpio_tb.v
+/home/dinesha/workarea/opencore/git/yifive_r0/caravel/verilog/rtl/simpleuart.v
+/home/dinesha/workarea/opencore/git/yifive_r0/caravel/verilog/rtl/picorv32.v
+/home/dinesha/workarea/opencore/git/yifive_r0/caravel/verilog/rtl/mgmt_soc.v
+/home/dinesha/workarea/opencore/git/yifive_r0/caravel/verilog/rtl/spimemio.v
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/default.cvcrc
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/syntacore/config.1.tcl
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/syntacore/config.tcl
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/syntacore/runs/syntacore/config.tcl
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/syntacore/runs/syntacore/tmp/magic_spice.tcl
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/syntacore/runs/syntacore/tmp/opt.lib
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/syntacore/runs/syntacore/tmp/trimmed.lib
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/syntacore/runs/syntacore/tmp/tracks_copy.info
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/syntacore/runs/syntacore/tmp/sky130_fd_sc_hd__tt_025C_1v80.no_pg.lib
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/syntacore/runs/syntacore/tmp/synthesis/hierarchy.dot
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/syntacore/runs/syntacore/tmp/synthesis/yosys.sdc
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/syntacore/runs/syntacore/tmp/routing/20-tritonRoute.param
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/syntacore/runs/syntacore/tmp/routing/20-tritonRoute.guide
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/syntacore/runs/syntacore/tmp/routing/17-fastroute.guide
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/syntacore/runs/syntacore/tmp/magic/sky130_fd_sc_hd__conb_1.ext
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/syntacore/runs/syntacore/tmp/magic/sky130_fd_sc_hd__nor2_4.ext
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/syntacore/runs/syntacore/tmp/magic/sky130_fd_sc_hd__and2_4.ext
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/syntacore/runs/syntacore/tmp/magic/sky130_fd_sc_hd__a21oi_4.ext
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/syntacore/runs/syntacore/tmp/magic/sky130_fd_sc_hd__fill_2.ext
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/syntacore/runs/syntacore/tmp/magic/sky130_fd_sc_hd__a32o_4.ext
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/syntacore/runs/syntacore/tmp/magic/sky130_fd_sc_hd__or2_4.ext
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/syntacore/runs/syntacore/tmp/magic/sky130_fd_sc_hd__clkbuf_16.ext
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/syntacore/runs/syntacore/tmp/magic/sky130_fd_sc_hd__decap_4.ext
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/syntacore/runs/syntacore/tmp/magic/sky130_fd_sc_hd__diode_2.ext
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/syntacore/runs/syntacore/tmp/magic/sky130_fd_sc_hd__buf_4.ext
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/syntacore/runs/syntacore/tmp/magic/sky130_fd_sc_hd__buf_8.ext
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/syntacore/runs/syntacore/tmp/magic/sky130_fd_sc_hd__nand2_4.ext
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/syntacore/runs/syntacore/tmp/magic/sky130_fd_sc_hd__a211o_4.ext
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/syntacore/runs/syntacore/tmp/magic/sky130_fd_sc_hd__a21o_4.ext
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/syntacore/runs/syntacore/tmp/magic/sky130_fd_sc_hd__a21boi_4.ext
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/syntacore/runs/syntacore/tmp/magic/sky130_fd_sc_hd__buf_2.ext
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/syntacore/runs/syntacore/tmp/magic/sky130_fd_sc_hd__or3_4.ext
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/syntacore/runs/syntacore/tmp/magic/sky130_fd_sc_hd__decap_12.ext
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/syntacore/runs/syntacore/tmp/magic/scr1_top_wb.ext
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/syntacore/runs/syntacore/tmp/magic/sky130_fd_sc_hd__a2bb2o_4.ext
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/syntacore/runs/syntacore/tmp/magic/sky130_fd_sc_hd__and4_4.ext
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/syntacore/runs/syntacore/tmp/magic/sky130_fd_sc_hd__decap_3.ext
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/syntacore/runs/syntacore/tmp/magic/sky130_fd_sc_hd__o21ai_4.ext
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/syntacore/runs/syntacore/tmp/magic/sky130_fd_sc_hd__a22oi_4.ext
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/syntacore/runs/syntacore/tmp/magic/sky130_fd_sc_hd__dfrtp_4.ext
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/syntacore/runs/syntacore/tmp/magic/sky130_fd_sc_hd__dfxtp_4.ext
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/syntacore/runs/syntacore/tmp/magic/sky130_fd_sc_hd__tapvpwrvgnd_1.ext
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/syntacore/runs/syntacore/tmp/magic/sky130_fd_sc_hd__a2111o_4.ext
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/syntacore/runs/syntacore/tmp/magic/sky130_fd_sc_hd__fill_1.ext
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/syntacore/runs/syntacore/tmp/magic/sky130_fd_sc_hd__clkbuf_1.ext
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/syntacore/runs/syntacore/tmp/magic/sky130_fd_sc_hd__o32a_4.ext
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/syntacore/runs/syntacore/tmp/magic/sky130_fd_sc_hd__decap_6.ext
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/syntacore/runs/syntacore/tmp/magic/sky130_fd_sc_hd__or4_4.ext
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/syntacore/runs/syntacore/tmp/magic/sky130_fd_sc_hd__a21bo_4.ext
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/syntacore/runs/syntacore/tmp/magic/sky130_fd_sc_hd__decap_8.ext
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/syntacore/runs/syntacore/tmp/magic/sky130_fd_sc_hd__inv_2.ext
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/syntacore/runs/syntacore/tmp/magic/sky130_fd_sc_hd__o21a_4.ext
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/syntacore/runs/syntacore/tmp/magic/sky130_fd_sc_hd__o22a_4.ext
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/syntacore/runs/syntacore/tmp/magic/sky130_fd_sc_hd__and3_4.ext
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/syntacore/runs/syntacore/tmp/magic/sky130_fd_sc_hd__dfstp_4.ext
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/syntacore/runs/syntacore/tmp/lvs/setup_file.lef.lvs
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/syntacore/runs/syntacore/reports/runtime_summary_report.rpt.parsable
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/syntacore/runs/syntacore/reports/runtime_summary_report.rpt
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/syntacore/runs/syntacore/reports/manufacturability_report.rpt
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/syntacore/runs/syntacore/reports/synthesis/1-yosys_4.chk.rpt
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/syntacore/runs/syntacore/reports/synthesis/2-opensta.min_max.rpt
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/syntacore/runs/syntacore/reports/synthesis/1-yosys_pre.stat
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/syntacore/runs/syntacore/reports/synthesis/2-opensta_tns.rpt
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/syntacore/runs/syntacore/reports/synthesis/11-opensta_post_openphysyn.rpt
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/syntacore/runs/syntacore/reports/synthesis/11-opensta_post_openphysyn_tns.rpt
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/syntacore/runs/syntacore/reports/synthesis/1-yosys_dff.stat
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/syntacore/runs/syntacore/reports/synthesis/23-opensta_spef_tns.rpt
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/syntacore/runs/syntacore/reports/synthesis/23-opensta_spef.min_max.rpt
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/syntacore/runs/syntacore/reports/synthesis/11-opensta_post_openphysyn.min_max.rpt
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/syntacore/runs/syntacore/reports/synthesis/11-opensta_post_openphysyn.timing.rpt
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/syntacore/runs/syntacore/reports/synthesis/23-opensta_spef.timing.rpt
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/syntacore/runs/syntacore/reports/synthesis/2-opensta_wns.rpt
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/syntacore/runs/syntacore/reports/synthesis/2-opensta.rpt
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/syntacore/runs/syntacore/reports/synthesis/23-opensta_spef_wns.rpt
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/syntacore/runs/syntacore/reports/synthesis/2-opensta.timing.rpt
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/syntacore/runs/syntacore/reports/synthesis/23-opensta_spef.rpt
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/syntacore/runs/syntacore/reports/synthesis/11-opensta_post_openphysyn_wns.rpt
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/syntacore/runs/syntacore/reports/synthesis/1-yosys_4.stat.rpt
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/syntacore/runs/syntacore/reports/routing/41-antenna.rpt
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/syntacore/runs/syntacore/reports/routing/20-tritonRoute.klayout.xml
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/syntacore/runs/syntacore/reports/magic/38-magic.drc.klayout.xml
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/syntacore/runs/syntacore/reports/floorplan/3-verilog2def.die_area.rpt
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/syntacore/runs/syntacore/reports/floorplan/3-verilog2def.core_area.rpt
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/syntacore/runs/syntacore/reports/klayout/35-klayout.xor.rpt
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/syntacore/runs/syntacore/reports/klayout/33-klayout.xor.rpt
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/syntacore/runs/syntacore/reports/placement/9-openphysyn_allchecks.rpt
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/syntacore/runs/syntacore/reports/placement/9-openphysyn_tns.rpt
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/syntacore/runs/syntacore/reports/placement/9-openphysyn_wns.rpt
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/syntacore/runs/syntacore/results/synthesis/scr1_top_wb.synthesis_preroute.v
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/syntacore/runs/syntacore/results/synthesis/scr1_top_wb.synthesis.v
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/syntacore/runs/syntacore/results/synthesis/scr1_top_wb.synthesis_cts.v
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/syntacore/runs/syntacore/results/synthesis/scr1_top_wb.synthesis_optimized.v
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/syntacore/runs/syntacore/results/cvc/scr1_top_wb.cdl
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/syntacore/runs/syntacore/results/cvc/scr1_top_wb.power
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/syntacore/runs/syntacore/results/cvc/cvc_scr1_top_wb.debug
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/syntacore/runs/syntacore/results/cvc/cvc_scr1_top_wb.error
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/syntacore/runs/syntacore/results/routing/scr1_top_wb.spef
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/syntacore/runs/syntacore/results/routing/scr1_top_wb.def.ref
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/syntacore/runs/syntacore/results/magic/.magicrc
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/syntacore/runs/syntacore/results/lvs/scr1_top_wb.lvs.powered.v
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/syntacore/runs/syntacore/results/lvs/scr1_top_wb.lvs.lef.json
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/syntacore/runs/syntacore/results/klayout/scr1_top_wb.xor.xml
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/syntacore/runs/syntacore/results/klayout/scr1_top_wb.lyp
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/syntacore/runs/syntacore/logs/synthesis/23-opensta_spef
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/syntacore/runs/syntacore/logs/synthesis/2-opensta
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/syntacore/runs/syntacore/logs/synthesis/11-opensta_post_openphysyn
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/glbl_cfg/config.tcl
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/glbl_cfg/runs/glbl_cfg/config.tcl
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/glbl_cfg/runs/glbl_cfg/tmp/magic_spice.tcl
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/glbl_cfg/runs/glbl_cfg/tmp/opt.lib
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/glbl_cfg/runs/glbl_cfg/tmp/trimmed.lib
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/glbl_cfg/runs/glbl_cfg/tmp/tracks_copy.info
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/glbl_cfg/runs/glbl_cfg/tmp/sky130_fd_sc_hd__tt_025C_1v80.no_pg.lib
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/glbl_cfg/runs/glbl_cfg/tmp/synthesis/hierarchy.dot
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/glbl_cfg/runs/glbl_cfg/tmp/synthesis/yosys.sdc
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/glbl_cfg/runs/glbl_cfg/tmp/routing/18-fastroute.guide
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/glbl_cfg/runs/glbl_cfg/tmp/routing/21-tritonRoute.guide
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/glbl_cfg/runs/glbl_cfg/tmp/routing/21-tritonRoute.param
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/glbl_cfg/runs/glbl_cfg/tmp/magic/sky130_fd_sc_hd__conb_1.ext
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/glbl_cfg/runs/glbl_cfg/tmp/magic/sky130_fd_sc_hd__nor2_4.ext
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/glbl_cfg/runs/glbl_cfg/tmp/magic/sky130_fd_sc_hd__and2_4.ext
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/glbl_cfg/runs/glbl_cfg/tmp/magic/sky130_fd_sc_hd__fill_2.ext
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/glbl_cfg/runs/glbl_cfg/tmp/magic/sky130_fd_sc_hd__a32o_4.ext
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/glbl_cfg/runs/glbl_cfg/tmp/magic/sky130_fd_sc_hd__or2_4.ext
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/glbl_cfg/runs/glbl_cfg/tmp/magic/sky130_fd_sc_hd__clkbuf_16.ext
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/glbl_cfg/runs/glbl_cfg/tmp/magic/sky130_fd_sc_hd__decap_4.ext
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/glbl_cfg/runs/glbl_cfg/tmp/magic/sky130_fd_sc_hd__diode_2.ext
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/glbl_cfg/runs/glbl_cfg/tmp/magic/sky130_fd_sc_hd__nand2_4.ext
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/glbl_cfg/runs/glbl_cfg/tmp/magic/sky130_fd_sc_hd__buf_2.ext
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/glbl_cfg/runs/glbl_cfg/tmp/magic/sky130_fd_sc_hd__or3_4.ext
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/glbl_cfg/runs/glbl_cfg/tmp/magic/sky130_fd_sc_hd__decap_12.ext
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/glbl_cfg/runs/glbl_cfg/tmp/magic/sky130_fd_sc_hd__a2bb2o_4.ext
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/glbl_cfg/runs/glbl_cfg/tmp/magic/sky130_fd_sc_hd__and4_4.ext
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/glbl_cfg/runs/glbl_cfg/tmp/magic/sky130_fd_sc_hd__decap_3.ext
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/glbl_cfg/runs/glbl_cfg/tmp/magic/sky130_fd_sc_hd__dfrtp_4.ext
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/glbl_cfg/runs/glbl_cfg/tmp/magic/sky130_fd_sc_hd__tapvpwrvgnd_1.ext
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/glbl_cfg/runs/glbl_cfg/tmp/magic/sky130_fd_sc_hd__fill_1.ext
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/glbl_cfg/runs/glbl_cfg/tmp/magic/sky130_fd_sc_hd__clkbuf_1.ext
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/glbl_cfg/runs/glbl_cfg/tmp/magic/sky130_fd_sc_hd__decap_6.ext
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/glbl_cfg/runs/glbl_cfg/tmp/magic/sky130_fd_sc_hd__or4_4.ext
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/glbl_cfg/runs/glbl_cfg/tmp/magic/sky130_fd_sc_hd__decap_8.ext
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/glbl_cfg/runs/glbl_cfg/tmp/magic/sky130_fd_sc_hd__inv_2.ext
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/glbl_cfg/runs/glbl_cfg/tmp/magic/glbl_cfg.ext
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/glbl_cfg/runs/glbl_cfg/tmp/magic/sky130_fd_sc_hd__o21a_4.ext
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/glbl_cfg/runs/glbl_cfg/tmp/magic/sky130_fd_sc_hd__o22a_4.ext
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/glbl_cfg/runs/glbl_cfg/tmp/magic/sky130_fd_sc_hd__and3_4.ext
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/glbl_cfg/runs/glbl_cfg/tmp/magic/sky130_fd_sc_hd__dfstp_4.ext
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/glbl_cfg/runs/glbl_cfg/tmp/lvs/setup_file.lef.lvs
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/glbl_cfg/runs/glbl_cfg/reports/runtime_summary_report.rpt.parsable
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/glbl_cfg/runs/glbl_cfg/reports/runtime_summary_report.rpt
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/glbl_cfg/runs/glbl_cfg/reports/manufacturability_report.rpt
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/glbl_cfg/runs/glbl_cfg/reports/synthesis/1-yosys_4.chk.rpt
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/glbl_cfg/runs/glbl_cfg/reports/synthesis/24-opensta_spef.timing.rpt
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/glbl_cfg/runs/glbl_cfg/reports/synthesis/2-opensta.min_max.rpt
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/glbl_cfg/runs/glbl_cfg/reports/synthesis/1-yosys_pre.stat
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/glbl_cfg/runs/glbl_cfg/reports/synthesis/2-opensta_tns.rpt
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/glbl_cfg/runs/glbl_cfg/reports/synthesis/1-yosys_dff.stat
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/glbl_cfg/runs/glbl_cfg/reports/synthesis/24-opensta_spef.min_max.rpt
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/glbl_cfg/runs/glbl_cfg/reports/synthesis/12-opensta_post_openphysyn.rpt
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/glbl_cfg/runs/glbl_cfg/reports/synthesis/12-opensta_post_openphysyn.timing.rpt
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/glbl_cfg/runs/glbl_cfg/reports/synthesis/2-opensta_wns.rpt
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/glbl_cfg/runs/glbl_cfg/reports/synthesis/2-opensta.rpt
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/glbl_cfg/runs/glbl_cfg/reports/synthesis/12-opensta_post_openphysyn_tns.rpt
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/glbl_cfg/runs/glbl_cfg/reports/synthesis/2-opensta.timing.rpt
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/glbl_cfg/runs/glbl_cfg/reports/synthesis/24-opensta_spef_tns.rpt
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/glbl_cfg/runs/glbl_cfg/reports/synthesis/12-opensta_post_openphysyn_wns.rpt
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/glbl_cfg/runs/glbl_cfg/reports/synthesis/12-opensta_post_openphysyn.min_max.rpt
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/glbl_cfg/runs/glbl_cfg/reports/synthesis/24-opensta_spef_wns.rpt
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/glbl_cfg/runs/glbl_cfg/reports/synthesis/24-opensta_spef.rpt
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/glbl_cfg/runs/glbl_cfg/reports/synthesis/1-yosys_4.stat.rpt
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/glbl_cfg/runs/glbl_cfg/reports/routing/21-tritonRoute.klayout.xml
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/glbl_cfg/runs/glbl_cfg/reports/routing/42-antenna.rpt
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/glbl_cfg/runs/glbl_cfg/reports/magic/39-magic.drc.klayout.xml
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/glbl_cfg/runs/glbl_cfg/reports/floorplan/3-verilog2def.die_area.rpt
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/glbl_cfg/runs/glbl_cfg/reports/floorplan/3-verilog2def.core_area.rpt
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/glbl_cfg/runs/glbl_cfg/reports/klayout/36-klayout.xor.rpt
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/glbl_cfg/runs/glbl_cfg/reports/klayout/34-klayout.xor.rpt
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/glbl_cfg/runs/glbl_cfg/reports/placement/10-openphysyn_wns.rpt
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/glbl_cfg/runs/glbl_cfg/reports/placement/10-openphysyn_violators.rpt
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/glbl_cfg/runs/glbl_cfg/reports/placement/10-openphysyn_tns.rpt
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/glbl_cfg/runs/glbl_cfg/reports/placement/10-openphysyn_allchecks.rpt
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/glbl_cfg/runs/glbl_cfg/results/synthesis/glbl_cfg.synthesis_preroute.v
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/glbl_cfg/runs/glbl_cfg/results/synthesis/glbl_cfg.synthesis_optimized.v
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/glbl_cfg/runs/glbl_cfg/results/synthesis/glbl_cfg.synthesis_cts.v
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/glbl_cfg/runs/glbl_cfg/results/synthesis/glbl_cfg.synthesis.v
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/glbl_cfg/runs/glbl_cfg/results/cvc/cvc_glbl_cfg.debug
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/glbl_cfg/runs/glbl_cfg/results/cvc/glbl_cfg.cdl
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/glbl_cfg/runs/glbl_cfg/results/cvc/glbl_cfg.power
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/glbl_cfg/runs/glbl_cfg/results/cvc/cvc_glbl_cfg.error
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/glbl_cfg/runs/glbl_cfg/results/routing/glbl_cfg.def.ref
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/glbl_cfg/runs/glbl_cfg/results/routing/glbl_cfg.spef
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/glbl_cfg/runs/glbl_cfg/results/magic/.magicrc
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/glbl_cfg/runs/glbl_cfg/results/lvs/glbl_cfg.lvs.powered.v
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/glbl_cfg/runs/glbl_cfg/results/lvs/glbl_cfg.lvs.lef.json
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/glbl_cfg/runs/glbl_cfg/results/klayout/glbl_cfg.xor.xml
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/glbl_cfg/runs/glbl_cfg/results/klayout/glbl_cfg.lyp
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/glbl_cfg/runs/glbl_cfg/logs/synthesis/2-opensta
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/glbl_cfg/runs/glbl_cfg/logs/synthesis/24-opensta_spef
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/glbl_cfg/runs/glbl_cfg/logs/synthesis/12-opensta_post_openphysyn
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/wb_interconnect/config.tcl
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/wb_interconnect/runs/wb_interconnect/config.tcl
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/wb_interconnect/runs/wb_interconnect/tmp/magic_spice.tcl
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/wb_interconnect/runs/wb_interconnect/tmp/opt.lib
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/wb_interconnect/runs/wb_interconnect/tmp/trimmed.lib
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/wb_interconnect/runs/wb_interconnect/tmp/tracks_copy.info
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/wb_interconnect/runs/wb_interconnect/tmp/sky130_fd_sc_hd__tt_025C_1v80.no_pg.lib
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/wb_interconnect/runs/wb_interconnect/tmp/synthesis/hierarchy.dot
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/wb_interconnect/runs/wb_interconnect/tmp/synthesis/yosys.sdc
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/wb_interconnect/runs/wb_interconnect/tmp/routing/18-fastroute.guide
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/wb_interconnect/runs/wb_interconnect/tmp/routing/21-tritonRoute.guide
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/wb_interconnect/runs/wb_interconnect/tmp/routing/21-tritonRoute.param
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/wb_interconnect/runs/wb_interconnect/tmp/magic/sky130_fd_sc_hd__nor2_4.ext
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/wb_interconnect/runs/wb_interconnect/tmp/magic/sky130_fd_sc_hd__and2_4.ext
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/wb_interconnect/runs/wb_interconnect/tmp/magic/sky130_fd_sc_hd__a21oi_4.ext
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/wb_interconnect/runs/wb_interconnect/tmp/magic/sky130_fd_sc_hd__fill_2.ext
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/wb_interconnect/runs/wb_interconnect/tmp/magic/sky130_fd_sc_hd__a32o_4.ext
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/wb_interconnect/runs/wb_interconnect/tmp/magic/sky130_fd_sc_hd__or2_4.ext
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/wb_interconnect/runs/wb_interconnect/tmp/magic/sky130_fd_sc_hd__clkbuf_16.ext
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/wb_interconnect/runs/wb_interconnect/tmp/magic/sky130_fd_sc_hd__decap_4.ext
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/wb_interconnect/runs/wb_interconnect/tmp/magic/sky130_fd_sc_hd__diode_2.ext
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/wb_interconnect/runs/wb_interconnect/tmp/magic/sky130_fd_sc_hd__a211o_4.ext
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/wb_interconnect/runs/wb_interconnect/tmp/magic/sky130_fd_sc_hd__a21o_4.ext
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/wb_interconnect/runs/wb_interconnect/tmp/magic/sky130_fd_sc_hd__buf_2.ext
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/wb_interconnect/runs/wb_interconnect/tmp/magic/sky130_fd_sc_hd__or3_4.ext
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/wb_interconnect/runs/wb_interconnect/tmp/magic/sky130_fd_sc_hd__decap_12.ext
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/wb_interconnect/runs/wb_interconnect/tmp/magic/sky130_fd_sc_hd__and4_4.ext
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/wb_interconnect/runs/wb_interconnect/tmp/magic/sky130_fd_sc_hd__decap_3.ext
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/wb_interconnect/runs/wb_interconnect/tmp/magic/sky130_fd_sc_hd__a22oi_4.ext
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/wb_interconnect/runs/wb_interconnect/tmp/magic/sky130_fd_sc_hd__dfrtp_4.ext
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/wb_interconnect/runs/wb_interconnect/tmp/magic/sky130_fd_sc_hd__tapvpwrvgnd_1.ext
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/wb_interconnect/runs/wb_interconnect/tmp/magic/wb_interconnect.ext
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/wb_interconnect/runs/wb_interconnect/tmp/magic/sky130_fd_sc_hd__fill_1.ext
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/wb_interconnect/runs/wb_interconnect/tmp/magic/sky130_fd_sc_hd__clkbuf_1.ext
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/wb_interconnect/runs/wb_interconnect/tmp/magic/sky130_fd_sc_hd__decap_6.ext
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/wb_interconnect/runs/wb_interconnect/tmp/magic/sky130_fd_sc_hd__or4_4.ext
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/wb_interconnect/runs/wb_interconnect/tmp/magic/sky130_fd_sc_hd__decap_8.ext
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/wb_interconnect/runs/wb_interconnect/tmp/magic/sky130_fd_sc_hd__inv_2.ext
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/wb_interconnect/runs/wb_interconnect/tmp/magic/sky130_fd_sc_hd__o21a_4.ext
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/wb_interconnect/runs/wb_interconnect/tmp/magic/sky130_fd_sc_hd__o22a_4.ext
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/wb_interconnect/runs/wb_interconnect/tmp/magic/sky130_fd_sc_hd__and3_4.ext
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/wb_interconnect/runs/wb_interconnect/tmp/magic/sky130_fd_sc_hd__dfstp_4.ext
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/wb_interconnect/runs/wb_interconnect/tmp/lvs/setup_file.lef.lvs
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/wb_interconnect/runs/wb_interconnect/reports/runtime_summary_report.rpt.parsable
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/wb_interconnect/runs/wb_interconnect/reports/runtime_summary_report.rpt
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/wb_interconnect/runs/wb_interconnect/reports/manufacturability_report.rpt
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/wb_interconnect/runs/wb_interconnect/reports/synthesis/1-yosys_4.chk.rpt
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/wb_interconnect/runs/wb_interconnect/reports/synthesis/24-opensta_spef.timing.rpt
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/wb_interconnect/runs/wb_interconnect/reports/synthesis/2-opensta.min_max.rpt
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/wb_interconnect/runs/wb_interconnect/reports/synthesis/1-yosys_pre.stat
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/wb_interconnect/runs/wb_interconnect/reports/synthesis/2-opensta_tns.rpt
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/wb_interconnect/runs/wb_interconnect/reports/synthesis/1-yosys_dff.stat
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/wb_interconnect/runs/wb_interconnect/reports/synthesis/24-opensta_spef.min_max.rpt
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/wb_interconnect/runs/wb_interconnect/reports/synthesis/12-opensta_post_openphysyn.rpt
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/wb_interconnect/runs/wb_interconnect/reports/synthesis/12-opensta_post_openphysyn.timing.rpt
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/wb_interconnect/runs/wb_interconnect/reports/synthesis/2-opensta_wns.rpt
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/wb_interconnect/runs/wb_interconnect/reports/synthesis/2-opensta.rpt
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/wb_interconnect/runs/wb_interconnect/reports/synthesis/12-opensta_post_openphysyn_tns.rpt
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/wb_interconnect/runs/wb_interconnect/reports/synthesis/2-opensta.timing.rpt
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/wb_interconnect/runs/wb_interconnect/reports/synthesis/24-opensta_spef_tns.rpt
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/wb_interconnect/runs/wb_interconnect/reports/synthesis/12-opensta_post_openphysyn_wns.rpt
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/wb_interconnect/runs/wb_interconnect/reports/synthesis/12-opensta_post_openphysyn.min_max.rpt
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/wb_interconnect/runs/wb_interconnect/reports/synthesis/24-opensta_spef_wns.rpt
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/wb_interconnect/runs/wb_interconnect/reports/synthesis/24-opensta_spef.rpt
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/wb_interconnect/runs/wb_interconnect/reports/synthesis/1-yosys_4.stat.rpt
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/wb_interconnect/runs/wb_interconnect/reports/routing/21-tritonRoute.klayout.xml
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/wb_interconnect/runs/wb_interconnect/reports/routing/42-antenna.rpt
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/wb_interconnect/runs/wb_interconnect/reports/magic/39-magic.drc.klayout.xml
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/wb_interconnect/runs/wb_interconnect/reports/floorplan/3-verilog2def.die_area.rpt
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/wb_interconnect/runs/wb_interconnect/reports/floorplan/3-verilog2def.core_area.rpt
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/wb_interconnect/runs/wb_interconnect/reports/klayout/36-klayout.xor.rpt
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/wb_interconnect/runs/wb_interconnect/reports/klayout/34-klayout.xor.rpt
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/wb_interconnect/runs/wb_interconnect/reports/placement/10-openphysyn_wns.rpt
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/wb_interconnect/runs/wb_interconnect/reports/placement/10-openphysyn_tns.rpt
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/wb_interconnect/runs/wb_interconnect/reports/placement/10-openphysyn_allchecks.rpt
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/wb_interconnect/runs/wb_interconnect/results/synthesis/wb_interconnect.synthesis.v
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/wb_interconnect/runs/wb_interconnect/results/synthesis/wb_interconnect.synthesis_cts.v
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/wb_interconnect/runs/wb_interconnect/results/synthesis/wb_interconnect.synthesis_preroute.v
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/wb_interconnect/runs/wb_interconnect/results/synthesis/wb_interconnect.synthesis_optimized.v
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/wb_interconnect/runs/wb_interconnect/results/cvc/cvc_wb_interconnect.debug
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/wb_interconnect/runs/wb_interconnect/results/cvc/wb_interconnect.power
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/wb_interconnect/runs/wb_interconnect/results/cvc/wb_interconnect.cdl
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/wb_interconnect/runs/wb_interconnect/results/cvc/cvc_wb_interconnect.error
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/wb_interconnect/runs/wb_interconnect/results/routing/wb_interconnect.spef
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/wb_interconnect/runs/wb_interconnect/results/routing/wb_interconnect.def.ref
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/wb_interconnect/runs/wb_interconnect/results/magic/.magicrc
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/wb_interconnect/runs/wb_interconnect/results/lvs/wb_interconnect.lvs.lef.json
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/wb_interconnect/runs/wb_interconnect/results/lvs/wb_interconnect.lvs.powered.v
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/wb_interconnect/runs/wb_interconnect/results/klayout/wb_interconnect.lyp
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/wb_interconnect/runs/wb_interconnect/results/klayout/wb_interconnect.xor.xml
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/wb_interconnect/runs/wb_interconnect/logs/synthesis/2-opensta
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/wb_interconnect/runs/wb_interconnect/logs/synthesis/24-opensta_spef
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/wb_interconnect/runs/wb_interconnect/logs/synthesis/12-opensta_post_openphysyn
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/spi_master/or_replace.tcl
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/spi_master/aa
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/spi_master/config.tcl
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/spi_master/runs/spi_master/config.tcl
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/spi_master/runs/spi_master/tmp/opt.lib
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/spi_master/runs/spi_master/tmp/trimmed.lib
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/spi_master/runs/spi_master/tmp/tracks_copy.info
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/spi_master/runs/spi_master/tmp/sky130_fd_sc_hd__tt_025C_1v80.no_pg.lib
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/spi_master/runs/spi_master/tmp/synthesis/hierarchy.dot
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/spi_master/runs/spi_master/tmp/synthesis/yosys.sdc
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/spi_master/runs/spi_master/tmp/routing/18-fastroute.guide
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/spi_master/runs/spi_master/tmp/routing/21-tritonRoute.guide
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/spi_master/runs/spi_master/tmp/routing/21-tritonRoute.param
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/spi_master/runs/spi_master/reports/synthesis/1-yosys_4.chk.rpt
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/spi_master/runs/spi_master/reports/synthesis/2-opensta.min_max.rpt
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/spi_master/runs/spi_master/reports/synthesis/1-yosys_pre.stat
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/spi_master/runs/spi_master/reports/synthesis/2-opensta_tns.rpt
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/spi_master/runs/spi_master/reports/synthesis/1-yosys_dff.stat
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/spi_master/runs/spi_master/reports/synthesis/12-opensta_post_openphysyn.rpt
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/spi_master/runs/spi_master/reports/synthesis/12-opensta_post_openphysyn.timing.rpt
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/spi_master/runs/spi_master/reports/synthesis/2-opensta_wns.rpt
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/spi_master/runs/spi_master/reports/synthesis/2-opensta.rpt
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/spi_master/runs/spi_master/reports/synthesis/12-opensta_post_openphysyn_tns.rpt
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/spi_master/runs/spi_master/reports/synthesis/2-opensta.timing.rpt
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/spi_master/runs/spi_master/reports/synthesis/12-opensta_post_openphysyn_wns.rpt
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/spi_master/runs/spi_master/reports/synthesis/12-opensta_post_openphysyn.min_max.rpt
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/spi_master/runs/spi_master/reports/synthesis/1-yosys_4.stat.rpt
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/spi_master/runs/spi_master/reports/floorplan/3-verilog2def.die_area.rpt
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/spi_master/runs/spi_master/reports/floorplan/3-verilog2def.core_area.rpt
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/spi_master/runs/spi_master/reports/placement/10-openphysyn_wns.rpt
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/spi_master/runs/spi_master/reports/placement/10-openphysyn_violators.rpt
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/spi_master/runs/spi_master/reports/placement/10-openphysyn_tns.rpt
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/spi_master/runs/spi_master/reports/placement/10-openphysyn_allchecks.rpt
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/spi_master/runs/spi_master/results/synthesis/spim_top.synthesis_optimized.v
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/spi_master/runs/spi_master/results/synthesis/spim_top.synthesis_preroute.v
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/spi_master/runs/spi_master/results/synthesis/spim_top.synthesis.v
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/spi_master/runs/spi_master/results/synthesis/spim_top.synthesis_cts.v
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/spi_master/runs/spi_master/results/routing/spim_top.def.ref
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/spi_master/runs/spi_master/logs/synthesis/2-opensta
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/spi_master/runs/spi_master/logs/synthesis/12-opensta_post_openphysyn
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/yifive/macro/bb/sdram.v
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/yifive/macro/bb/syntacore.v
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/yifive/runs/yifive/config.tcl
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/yifive/runs/yifive/tmp/opt.lib
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/yifive/runs/yifive/tmp/trimmed.lib
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/yifive/runs/yifive/tmp/tracks_copy.info
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/yifive/runs/yifive/tmp/sky130_fd_sc_hd__tt_025C_1v80.no_pg.lib
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/yifive/runs/yifive/tmp/synthesis/hierarchy.dot
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/yifive/runs/yifive/tmp/synthesis/yosys.sdc
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/yifive/runs/yifive/reports/runtime_summary_report.rpt.parsable
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/yifive/runs/yifive/reports/runtime_summary_report.rpt
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/yifive/runs/yifive/reports/manufacturability_report.rpt
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/yifive/runs/yifive/reports/synthesis/1-yosys_4.chk.rpt
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/yifive/runs/yifive/reports/synthesis/2-opensta.min_max.rpt
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/yifive/runs/yifive/reports/synthesis/1-yosys_pre.stat
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/yifive/runs/yifive/reports/synthesis/2-opensta_tns.rpt
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/yifive/runs/yifive/reports/synthesis/1-yosys_dff.stat
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/yifive/runs/yifive/reports/synthesis/2-opensta_wns.rpt
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/yifive/runs/yifive/reports/synthesis/2-opensta.rpt
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/yifive/runs/yifive/reports/synthesis/2-opensta.timing.rpt
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/yifive/runs/yifive/reports/synthesis/1-yosys_4.stat.rpt
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/yifive/runs/yifive/reports/floorplan/3-verilog2def.die_area.rpt
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/yifive/runs/yifive/reports/floorplan/3-verilog2def.core_area.rpt
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/yifive/runs/yifive/results/synthesis/digital_core.synthesis.v
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/yifive/runs/yifive/logs/synthesis/2-opensta
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/sdram/config.tcl
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/sdram/runs/sdram/config.tcl
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/sdram/runs/sdram/tmp/magic_spice.tcl
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/sdram/runs/sdram/tmp/opt.lib
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/sdram/runs/sdram/tmp/trimmed.lib
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/sdram/runs/sdram/tmp/tracks_copy.info
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/sdram/runs/sdram/tmp/sky130_fd_sc_hd__tt_025C_1v80.no_pg.lib
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/sdram/runs/sdram/tmp/synthesis/hierarchy.dot
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/sdram/runs/sdram/tmp/synthesis/yosys.sdc
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/sdram/runs/sdram/tmp/routing/18-fastroute.guide
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/sdram/runs/sdram/tmp/routing/20-tritonRoute.param
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/sdram/runs/sdram/tmp/routing/20-tritonRoute.guide
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/sdram/runs/sdram/tmp/magic/sky130_fd_sc_hd__conb_1.ext
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/sdram/runs/sdram/tmp/magic/sky130_fd_sc_hd__nor2_4.ext
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/sdram/runs/sdram/tmp/magic/sky130_fd_sc_hd__and2_4.ext
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/sdram/runs/sdram/tmp/magic/sky130_fd_sc_hd__a21oi_4.ext
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/sdram/runs/sdram/tmp/magic/sky130_fd_sc_hd__fill_2.ext
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/sdram/runs/sdram/tmp/magic/sky130_fd_sc_hd__a32o_4.ext
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/sdram/runs/sdram/tmp/magic/sky130_fd_sc_hd__or2_4.ext
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/sdram/runs/sdram/tmp/magic/sky130_fd_sc_hd__clkbuf_16.ext
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/sdram/runs/sdram/tmp/magic/sky130_fd_sc_hd__decap_4.ext
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/sdram/runs/sdram/tmp/magic/sky130_fd_sc_hd__nand2_4.ext
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/sdram/runs/sdram/tmp/magic/sky130_fd_sc_hd__a211o_4.ext
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/sdram/runs/sdram/tmp/magic/sky130_fd_sc_hd__a21o_4.ext
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/sdram/runs/sdram/tmp/magic/sky130_fd_sc_hd__a21boi_4.ext
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/sdram/runs/sdram/tmp/magic/sky130_fd_sc_hd__buf_2.ext
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/sdram/runs/sdram/tmp/magic/sky130_fd_sc_hd__or3_4.ext
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/sdram/runs/sdram/tmp/magic/sky130_fd_sc_hd__decap_12.ext
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/sdram/runs/sdram/tmp/magic/sky130_fd_sc_hd__a2bb2o_4.ext
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/sdram/runs/sdram/tmp/magic/sky130_fd_sc_hd__and4_4.ext
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/sdram/runs/sdram/tmp/magic/sky130_fd_sc_hd__decap_3.ext
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/sdram/runs/sdram/tmp/magic/sky130_fd_sc_hd__o21ai_4.ext
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/sdram/runs/sdram/tmp/magic/sky130_fd_sc_hd__a22oi_4.ext
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/sdram/runs/sdram/tmp/magic/sky130_fd_sc_hd__dfrtp_4.ext
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/sdram/runs/sdram/tmp/magic/sky130_fd_sc_hd__dfxtp_4.ext
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/sdram/runs/sdram/tmp/magic/sky130_fd_sc_hd__tapvpwrvgnd_1.ext
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/sdram/runs/sdram/tmp/magic/sky130_fd_sc_hd__fill_1.ext
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/sdram/runs/sdram/tmp/magic/sky130_fd_sc_hd__clkbuf_1.ext
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/sdram/runs/sdram/tmp/magic/sky130_fd_sc_hd__o32a_4.ext
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/sdram/runs/sdram/tmp/magic/sky130_fd_sc_hd__decap_6.ext
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/sdram/runs/sdram/tmp/magic/sky130_fd_sc_hd__or4_4.ext
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/sdram/runs/sdram/tmp/magic/sky130_fd_sc_hd__a21bo_4.ext
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/sdram/runs/sdram/tmp/magic/sdrc_top.ext
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/sdram/runs/sdram/tmp/magic/sky130_fd_sc_hd__decap_8.ext
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/sdram/runs/sdram/tmp/magic/sky130_fd_sc_hd__inv_2.ext
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/sdram/runs/sdram/tmp/magic/sky130_fd_sc_hd__o21a_4.ext
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/sdram/runs/sdram/tmp/magic/sky130_fd_sc_hd__o22a_4.ext
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/sdram/runs/sdram/tmp/magic/sky130_fd_sc_hd__and3_4.ext
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/sdram/runs/sdram/tmp/magic/sky130_fd_sc_hd__dfstp_4.ext
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/sdram/runs/sdram/tmp/lvs/setup_file.lef.lvs
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/sdram/runs/sdram/reports/runtime_summary_report.rpt.parsable
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/sdram/runs/sdram/reports/runtime_summary_report.rpt
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/sdram/runs/sdram/reports/manufacturability_report.rpt
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/sdram/runs/sdram/reports/synthesis/1-yosys_4.chk.rpt
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/sdram/runs/sdram/reports/synthesis/2-opensta.min_max.rpt
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/sdram/runs/sdram/reports/synthesis/1-yosys_pre.stat
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/sdram/runs/sdram/reports/synthesis/2-opensta_tns.rpt
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/sdram/runs/sdram/reports/synthesis/11-opensta_post_openphysyn.rpt
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/sdram/runs/sdram/reports/synthesis/11-opensta_post_openphysyn_tns.rpt
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/sdram/runs/sdram/reports/synthesis/1-yosys_dff.stat
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/sdram/runs/sdram/reports/synthesis/23-opensta_spef_tns.rpt
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/sdram/runs/sdram/reports/synthesis/23-opensta_spef.min_max.rpt
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/sdram/runs/sdram/reports/synthesis/11-opensta_post_openphysyn.min_max.rpt
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/sdram/runs/sdram/reports/synthesis/11-opensta_post_openphysyn.timing.rpt
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/sdram/runs/sdram/reports/synthesis/23-opensta_spef.timing.rpt
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/sdram/runs/sdram/reports/synthesis/2-opensta_wns.rpt
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/sdram/runs/sdram/reports/synthesis/2-opensta.rpt
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/sdram/runs/sdram/reports/synthesis/23-opensta_spef_wns.rpt
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/sdram/runs/sdram/reports/synthesis/2-opensta.timing.rpt
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/sdram/runs/sdram/reports/synthesis/23-opensta_spef.rpt
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/sdram/runs/sdram/reports/synthesis/11-opensta_post_openphysyn_wns.rpt
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/sdram/runs/sdram/reports/synthesis/1-yosys_4.stat.rpt
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/sdram/runs/sdram/reports/routing/41-antenna.rpt
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/sdram/runs/sdram/reports/routing/20-tritonRoute.klayout.xml
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/sdram/runs/sdram/reports/magic/38-magic.drc.klayout.xml
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/sdram/runs/sdram/reports/floorplan/3-verilog2def.die_area.rpt
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/sdram/runs/sdram/reports/floorplan/3-verilog2def.core_area.rpt
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/sdram/runs/sdram/reports/klayout/35-klayout.xor.rpt
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/sdram/runs/sdram/reports/klayout/33-klayout.xor.rpt
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/sdram/runs/sdram/reports/placement/9-openphysyn_allchecks.rpt
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/sdram/runs/sdram/reports/placement/9-openphysyn_tns.rpt
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/sdram/runs/sdram/reports/placement/9-openphysyn_wns.rpt
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/sdram/runs/sdram/reports/placement/9-openphysyn_violators.rpt
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/sdram/runs/sdram/results/synthesis/sdrc_top.synthesis_optimized.v
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/sdram/runs/sdram/results/synthesis/sdrc_top.synthesis_cts.v
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/sdram/runs/sdram/results/synthesis/sdrc_top.synthesis.v
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/sdram/runs/sdram/results/synthesis/sdrc_top.synthesis_preroute.v
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/sdram/runs/sdram/results/cvc/sdrc_top.power
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/sdram/runs/sdram/results/cvc/cvc_sdrc_top.debug
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/sdram/runs/sdram/results/cvc/cvc_sdrc_top.error
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/sdram/runs/sdram/results/cvc/sdrc_top.cdl
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/sdram/runs/sdram/results/routing/sdrc_top.spef
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/sdram/runs/sdram/results/routing/sdrc_top.def.ref
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/sdram/runs/sdram/results/magic/.magicrc
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/sdram/runs/sdram/results/lvs/sdrc_top.lvs.powered.v
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/sdram/runs/sdram/results/lvs/sdrc_top.lvs.lef.json
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/sdram/runs/sdram/results/klayout/sdrc_top.xor.xml
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/sdram/runs/sdram/results/klayout/sdrc_top.lyp
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/sdram/runs/sdram/logs/synthesis/23-opensta_spef
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/sdram/runs/sdram/logs/synthesis/2-opensta
+/home/dinesha/workarea/opencore/git/yifive_r0/openlane/sdram/runs/sdram/logs/synthesis/11-opensta_post_openphysyn
+/home/dinesha/workarea/opencore/git/yifive_r0/verilog/dv/risc_boot/risc_boot_tb.v
+/home/dinesha/workarea/opencore/git/yifive_r0/verilog/dv/risc_boot/run_iverilog
+/home/dinesha/workarea/opencore/git/yifive_r0/verilog/dv/user_risc_boot/user_risc_boot.dump
+/home/dinesha/workarea/opencore/git/yifive_r0/verilog/dv/user_risc_boot/user_risc_boot.c
+/home/dinesha/workarea/opencore/git/yifive_r0/verilog/dv/user_risc_boot/user_risc_boot_tb.v
+/home/dinesha/workarea/opencore/git/yifive_r0/verilog/dv/user_risc_boot/run_iverilog
+/home/dinesha/workarea/opencore/git/yifive_r0/verilog/rtl/syntacore/scr1/Makefile
+/home/dinesha/workarea/opencore/git/yifive_r0/verilog/rtl/syntacore/scr1/src/core.files
+/home/dinesha/workarea/opencore/git/yifive_r0/verilog/rtl/syntacore/scr1/src/ahb_top.files
+/home/dinesha/workarea/opencore/git/yifive_r0/verilog/rtl/syntacore/scr1/src/run_modemsim
+/home/dinesha/workarea/opencore/git/yifive_r0/verilog/rtl/syntacore/scr1/src/axi_top.files
+/home/dinesha/workarea/opencore/git/yifive_r0/verilog/rtl/syntacore/scr1/src/wb_top.files
+/home/dinesha/workarea/opencore/git/yifive_r0/verilog/rtl/syntacore/scr1/synth/Makefile
+/home/dinesha/workarea/opencore/git/yifive_r0/verilog/rtl/syntacore/scr1/synth/run_synth
+/home/dinesha/workarea/opencore/git/yifive_r0/verilog/rtl/syntacore/scr1/synth/synth.tcl
+/home/dinesha/workarea/opencore/git/yifive_r0/verilog/rtl/syntacore/scr1/sim/tests/common/reloc.h
+/home/dinesha/workarea/opencore/git/yifive_r0/verilog/rtl/syntacore/scr1/sim/tests/common/riscv_macros.h
+/home/dinesha/workarea/opencore/git/yifive_r0/verilog/rtl/syntacore/scr1/sim/tests/common/common.mk
+/home/dinesha/workarea/opencore/git/yifive_r0/verilog/rtl/syntacore/scr1/sim/tests/common/riscv_csr_encoding.h
+/home/dinesha/workarea/opencore/git/yifive_r0/verilog/rtl/syntacore/scr1/sim/tests/common/scr1_specific.h
+/home/dinesha/workarea/opencore/git/yifive_r0/verilog/rtl/lib/wb_interface.v
+/home/dinesha/workarea/opencore/git/yifive_r0/verilog/rtl/lib/clk_ctl.v
+/home/dinesha/workarea/opencore/git/yifive_r0/verilog/rtl/lib/wb_crossbar.v
+/home/dinesha/workarea/opencore/git/yifive_r0/verilog/rtl/lib/async_fifo.sv
+/home/dinesha/workarea/opencore/git/yifive_r0/verilog/rtl/lib/registers.v
+/home/dinesha/workarea/opencore/git/yifive_r0/verilog/rtl/lib/sync_fifo.sv
+/home/dinesha/workarea/opencore/git/yifive_r0/verilog/rtl/sdram_ctrl/src/run_modelsim
+/home/dinesha/workarea/opencore/git/yifive_r0/verilog/rtl/sdram_ctrl/src/filelist_rtl.f
+/home/dinesha/workarea/opencore/git/yifive_r0/verilog/rtl/sdram_ctrl/src/top/sdrc_top.v
+/home/dinesha/workarea/opencore/git/yifive_r0/verilog/rtl/sdram_ctrl/src/core/sdrc_bank_ctl.v
+/home/dinesha/workarea/opencore/git/yifive_r0/verilog/rtl/sdram_ctrl/src/core/sdrc_bank_fsm.v
+/home/dinesha/workarea/opencore/git/yifive_r0/verilog/rtl/sdram_ctrl/src/core/sdrc_core.v
+/home/dinesha/workarea/opencore/git/yifive_r0/verilog/rtl/sdram_ctrl/src/core/sdrc_bs_convert.v
+/home/dinesha/workarea/opencore/git/yifive_r0/verilog/rtl/sdram_ctrl/src/core/sdrc_xfr_ctl.v
+/home/dinesha/workarea/opencore/git/yifive_r0/verilog/rtl/sdram_ctrl/src/core/sdrc_req_gen.v
+/home/dinesha/workarea/opencore/git/yifive_r0/verilog/rtl/sdram_ctrl/src/defs/sdrc_define.v
+/home/dinesha/workarea/opencore/git/yifive_r0/verilog/rtl/wb_interconnect/src/wb_arb.sv
+/home/dinesha/workarea/opencore/git/yifive_r0/verilog/rtl/wb_interconnect/src/wb_interconnect.sv
+/home/dinesha/workarea/opencore/git/yifive_r0/verilog/rtl/spi_master/src/spim_fifo.sv
+/home/dinesha/workarea/opencore/git/yifive_r0/verilog/rtl/spi_master/src/filelist.f
+/home/dinesha/workarea/opencore/git/yifive_r0/verilog/rtl/spi_master/src/spim_top.sv
+/home/dinesha/workarea/opencore/git/yifive_r0/verilog/rtl/spi_master/src/spim_ctrl.sv
+/home/dinesha/workarea/opencore/git/yifive_r0/verilog/rtl/spi_master/src/spim_clkgen.sv
+/home/dinesha/workarea/opencore/git/yifive_r0/verilog/rtl/spi_master/src/spim_regs.sv
+/home/dinesha/workarea/opencore/git/yifive_r0/verilog/rtl/spi_master/src/spim_tx.sv
+/home/dinesha/workarea/opencore/git/yifive_r0/verilog/rtl/spi_master/src/spim_rx.sv
+/home/dinesha/workarea/opencore/git/yifive_r0/verilog/rtl/spi_master/synth/Makefile
+/home/dinesha/workarea/opencore/git/yifive_r0/verilog/rtl/spi_master/synth/synth.tcl
+/home/dinesha/workarea/opencore/git/yifive_r0/verilog/rtl/digital_core/run_modelsim
+/home/dinesha/workarea/opencore/git/yifive_r0/verilog/rtl/digital_core/filelist_rtl.f
+/home/dinesha/workarea/opencore/git/yifive_r0/verilog/rtl/digital_core/src/glbl_cfg.sv
+/home/dinesha/workarea/opencore/git/yifive_r0/verilog/rtl/digital_core/src/digital_core.sv
diff --git a/docs/source/_static/YiFive_Soc_BlockDiagram.odg b/docs/source/_static/YiFive_Soc_BlockDiagram.odg
deleted file mode 100644
index 50ecb7c..0000000
--- a/docs/source/_static/YiFive_Soc_BlockDiagram.odg
+++ /dev/null
Binary files differ
diff --git a/docs/source/_static/YiFve_Soc_Design_Document.docx b/docs/source/_static/YiFve_Soc_Design_Document.docx
deleted file mode 100644
index 0ddf5b2..0000000
--- a/docs/source/_static/YiFve_Soc_Design_Document.docx
+++ /dev/null
Binary files differ
diff --git a/openlane/glbl_cfg/base.sdc b/openlane/glbl_cfg/base.sdc
new file mode 100644
index 0000000..d57972b
--- /dev/null
+++ b/openlane/glbl_cfg/base.sdc
@@ -0,0 +1,62 @@
+set_units -time ns
+set ::env(WB_CLOCK_PERIOD) "10"
+set ::env(WB_CLOCK_PORT) "mclk"
+
+######################################
+# WB Clock domain input output
+######################################
+create_clock [get_ports $::env(WB_CLOCK_PORT)] -name $::env(WB_CLOCK_PORT) -period $::env(WB_CLOCK_PERIOD)
+set wb_input_delay_value [expr $::env(WB_CLOCK_PERIOD) * 0.6]
+set wb_output_delay_value [expr $::env(WB_CLOCK_PERIOD) * 0.6]
+puts "\[INFO\]: Setting wb output delay to:$wb_output_delay_value"
+puts "\[INFO\]: Setting wb input delay to: $wb_input_delay_value"
+
+
+set_input_delay 2.0 -clock [get_clocks $::env(WB_CLOCK_PORT)] {reset_n}
+
+set_input_delay $wb_input_delay_value -clock [get_clocks $::env(WB_CLOCK_PORT)] [get_port reg_cs*]
+set_input_delay $wb_input_delay_value -clock [get_clocks $::env(WB_CLOCK_PORT)] [get_port reg_wr*]
+set_input_delay $wb_input_delay_value -clock [get_clocks $::env(WB_CLOCK_PORT)] [get_port reg_addr*]
+set_input_delay $wb_input_delay_value -clock [get_clocks $::env(WB_CLOCK_PORT)] [get_port reg_wdata*]
+set_input_delay $wb_input_delay_value -clock [get_clocks $::env(WB_CLOCK_PORT)] [get_port reg_be*]
+set_input_delay $wb_input_delay_value -clock [get_clocks $::env(WB_CLOCK_PORT)] [get_port sdr_init_done*]
+
+set_output_delay $wb_output_delay_value -clock [get_clocks $::env(WB_CLOCK_PORT)] [get_port device_idcode*]
+set_output_delay $wb_output_delay_value -clock [get_clocks $::env(WB_CLOCK_PORT)] [get_port reg_rdata*]
+set_output_delay $wb_output_delay_value -clock [get_clocks $::env(WB_CLOCK_PORT)] [get_port reg_ack*]
+set_output_delay $wb_output_delay_value -clock [get_clocks $::env(WB_CLOCK_PORT)] [get_port fuse_mhartid*]
+set_output_delay $wb_output_delay_value -clock [get_clocks $::env(WB_CLOCK_PORT)] [get_port irq_lines*]
+set_output_delay $wb_output_delay_value -clock [get_clocks $::env(WB_CLOCK_PORT)] [get_port soft_irq*]
+set_output_delay $wb_output_delay_value -clock [get_clocks $::env(WB_CLOCK_PORT)] [get_port user_irq*]
+set_output_delay $wb_output_delay_value -clock [get_clocks $::env(WB_CLOCK_PORT)] [get_port cfg_sdr_width*]
+set_output_delay $wb_output_delay_value -clock [get_clocks $::env(WB_CLOCK_PORT)] [get_port cfg_colbits*]
+set_output_delay $wb_output_delay_value -clock [get_clocks $::env(WB_CLOCK_PORT)] [get_port cfg_sdr_tras_d*]
+set_output_delay $wb_output_delay_value -clock [get_clocks $::env(WB_CLOCK_PORT)] [get_port cfg_sdr_trp_d*]
+set_output_delay $wb_output_delay_value -clock [get_clocks $::env(WB_CLOCK_PORT)] [get_port cfg_sdr_trcd_d*]
+set_output_delay $wb_output_delay_value -clock [get_clocks $::env(WB_CLOCK_PORT)] [get_port cfg_sdr_en*]
+set_output_delay $wb_output_delay_value -clock [get_clocks $::env(WB_CLOCK_PORT)] [get_port cfg_req_depth*]
+set_output_delay $wb_output_delay_value -clock [get_clocks $::env(WB_CLOCK_PORT)] [get_port cfg_sdr_mode_reg*]
+set_output_delay $wb_output_delay_value -clock [get_clocks $::env(WB_CLOCK_PORT)] [get_port cfg_sdr_cas*]
+set_output_delay $wb_output_delay_value -clock [get_clocks $::env(WB_CLOCK_PORT)] [get_port cfg_sdr_trcar_d*]
+set_output_delay $wb_output_delay_value -clock [get_clocks $::env(WB_CLOCK_PORT)] [get_port cfg_sdr_twr_d*]
+set_output_delay $wb_output_delay_value -clock [get_clocks $::env(WB_CLOCK_PORT)] [get_port cfg_sdr_rfsh*]
+set_output_delay $wb_output_delay_value -clock [get_clocks $::env(WB_CLOCK_PORT)] [get_port cfg_sdr_cas*]
+set_output_delay $wb_output_delay_value -clock [get_clocks $::env(WB_CLOCK_PORT)] [get_port cfg_sdr_trcar_d*]
+set_output_delay $wb_output_delay_value -clock [get_clocks $::env(WB_CLOCK_PORT)] [get_port cfg_sdr_twr_d*]
+set_output_delay $wb_output_delay_value -clock [get_clocks $::env(WB_CLOCK_PORT)] [get_port cfg_sdr_rfsh*]
+
+
+# TODO set this as parameter
+set_driving_cell -lib_cell $::env(SYNTH_DRIVING_CELL) -pin $::env(SYNTH_DRIVING_CELL_PIN) [all_inputs]
+set cap_load [expr $::env(SYNTH_CAP_LOAD) / 1000.0]
+puts "\[INFO\]: Setting load to: $cap_load"
+set_load $cap_load [all_outputs]
+
+## These are generated clock, only max delay added
+set_false_path -to [get_port sdram_clk]
+set_false_path -to [get_port cpu_clk]
+set_false_path -to [get_port rtc_clk]
+
+#set_max_delay 2.0 [get_port sdram_clk]
+#set_max_delay 2.0 [get_port cpu_clk]
+#set_max_delay 2.0 [get_port rtc_clk]
diff --git a/openlane/glbl_cfg/config.tcl b/openlane/glbl_cfg/config.tcl
new file mode 100755
index 0000000..d17529f
--- /dev/null
+++ b/openlane/glbl_cfg/config.tcl
@@ -0,0 +1,61 @@
+# Global
+# ------
+
+set script_dir [file dirname [file normalize [info script]]]
+# Name
+set ::env(DESIGN_NAME) glbl_cfg
+set ::env(FP_PIN_ORDER_CFG) $::env(DESIGN_DIR)/pin_order.cfg
+
+#set ::env(SYNTH_READ_BLACKBOX_LIB) 1
+
+# Timing configuration
+set ::env(CLOCK_PERIOD) "10"
+set ::env(CLOCK_PORT) "mclk"
+
+set ::env(SYNTH_MAX_FANOUT) 4
+
+# Sources
+# -------
+
+# Local sources + no2usb sources
+set ::env(VERILOG_FILES) "\
+ $script_dir/../../verilog/rtl/lib/registers.v \
+ $script_dir/../../verilog/rtl/lib/clk_ctl.v \
+ $script_dir/../../verilog/rtl/digital_core/src/glbl_cfg.sv \
+ "
+
+set ::env(SDC_FILE) "$script_dir/base.sdc"
+set ::env(BASE_SDC_FILE) "$script_dir/base.sdc"
+
+
+# Floorplanning
+# -------------
+
+set ::env(FP_PIN_ORDER_CFG) $::env(DESIGN_DIR)/pin_order.cfg
+
+set ::env(FP_SIZING) absolute
+set ::env(DIE_AREA) "0 0 400 300"
+
+
+
+set ::env(FP_PDN_VPITCH) 50
+set ::env(PDN_CFG) $script_dir/pdn.tcl
+
+set ::env(FP_VERTICAL_HALO) 6
+set ::env(PL_TARGET_DENSITY) 0.52
+set ::env(PL_TARGET_DENSITY_CELLS) 0.38
+set ::env(PL_OPENPHYSYN_OPTIMIZATIONS) 1
+set ::env(CELL_PAD) 4
+
+set ::env(GLB_RT_ADJUSTMENT) 0
+set ::env(GLB_RT_L2_ADJUSTMENT) 0.2
+set ::env(GLB_RT_L3_ADJUSTMENT) 0.25
+set ::env(GLB_RT_L4_ADJUSTMENT) 0.2
+set ::env(GLB_RT_L5_ADJUSTMENT) 0.1
+set ::env(GLB_RT_L6_ADJUSTMENT) 0.1
+set ::env(GLB_RT_TILES) 14
+set ::env(GLB_RT_MAXLAYER) 5
+
+set ::env(DIODE_INSERTION_STRATEGY) 4
+
+
diff --git a/openlane/glbl_cfg/pdn.tcl b/openlane/glbl_cfg/pdn.tcl
new file mode 100644
index 0000000..1fe689b
--- /dev/null
+++ b/openlane/glbl_cfg/pdn.tcl
@@ -0,0 +1,49 @@
+# SPDX-FileCopyrightText: 2020 Efabless Corporation
+#
+# 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
+
+# Power nets
+set ::power_nets $::env(VDD_PIN)
+set ::ground_nets $::env(GND_PIN)
+
+set ::macro_blockage_layer_list "li1 met1 met2 met3 met4 met5"
+
+pdngen::specify_grid stdcell {
+ name grid
+ rails {
+ met1 {width 0.48 pitch $::env(PLACE_SITE_HEIGHT) offset 0}
+ }
+ straps {
+ met4 {width 1.6 pitch $::env(FP_PDN_VPITCH) offset $::env(FP_PDN_VOFFSET)}
+ met5 {width 1.6 pitch $::env(FP_PDN_HPITCH) offset $::env(FP_PDN_HOFFSET)}
+ }
+ connect {{met1 met4} {met4 met5}}
+}
+
+pdngen::specify_grid macro {
+ power_pins "VPWR"
+ ground_pins "VGND"
+ blockages "li1 met1 met2 met3 met4"
+ straps {
+ }
+ connect {{met4_PIN_ver met5}}
+}
+
+set ::halo 5
+
+# POWER or GROUND #Std. cell rails starting with power or ground rails at the bottom of the core area
+set ::rails_start_with "POWER" ;
+
+# POWER or GROUND #Upper metal stripes starting with power or ground rails at the left/bottom of the core area
+set ::stripes_start_with "POWER" ;
diff --git a/openlane/glbl_cfg/pin_order.cfg b/openlane/glbl_cfg/pin_order.cfg
new file mode 100644
index 0000000..784fe9b
--- /dev/null
+++ b/openlane/glbl_cfg/pin_order.cfg
@@ -0,0 +1,47 @@
+#BUS_SORT
+
+#E
+cpu_clk
+rtc_clk
+cpu_rst_n
+irq_lines.*
+soft_irq
+fuse_mhartid.*
+
+#N
+mclk
+reset_n
+user_clock2
+spi_rst_n
+user_irq.*
+events_o.*
+device_idcode.*
+
+#W
+sdram_clk
+sdram_rst_n
+sdr_init_done
+cfg_sdr_width.*
+cfg_colbits.*
+cfg_sdr_tras_d.*
+cfg_sdr_trp_d.*
+cfg_sdr_trcd_d.*
+cfg_sdr_en.*
+cfg_req_depth.*
+cfg_sdr_mode_reg.*
+cfg_sdr_cas.*
+cfg_sdr_trcar_d.*
+cfg_sdr_twr_d.*
+cfg_sdr_rfsh.*
+cfg_sdr_rfmax.*
+
+
+#S
+reg_cs
+reg_wr
+reg_addr.*
+reg_be.*
+reg_wdata.*
+reg_rdata.*
+reg_ack
+
diff --git a/openlane/sdram/base.sdc b/openlane/sdram/base.sdc
new file mode 100644
index 0000000..9fd9ca2
--- /dev/null
+++ b/openlane/sdram/base.sdc
@@ -0,0 +1,84 @@
+set_units -time ns
+set ::env(WB_CLOCK_PERIOD) "10"
+set ::env(WB_CLOCK_PORT) "wb_clk_i"
+
+set ::env(SDRAM_CLOCK_PERIOD) "20"
+set ::env(SDRAM_CLOCK_PORT) "sdram_clk"
+
+set ::env(PAD_SDRAM_CLOCK_PERIOD) "20"
+set ::env(PAD_SDRAM_CLOCK_PORT) "sdram_pad_clk"
+######################################
+# WB Clock domain input output
+######################################
+create_clock [get_ports $::env(WB_CLOCK_PORT)] -name $::env(WB_CLOCK_PORT) -period $::env(WB_CLOCK_PERIOD)
+set wb_input_delay_value [expr $::env(WB_CLOCK_PERIOD) * 0.6]
+set wb_output_delay_value [expr $::env(WB_CLOCK_PERIOD) * 0.6]
+puts "\[INFO\]: Setting wb output delay to:$wb_output_delay_value"
+puts "\[INFO\]: Setting wb input delay to: $wb_input_delay_value"
+
+
+set_input_delay 2.0 -clock [get_clocks $::env(WB_CLOCK_PORT)] {wb_rst_i}
+
+set_input_delay 3.0 -clock [get_clocks $::env(WB_CLOCK_PORT)] [get_port wb_stb_i*]
+set_input_delay $wb_input_delay_value -clock [get_clocks $::env(WB_CLOCK_PORT)] [get_port wb_addr_i*]
+set_input_delay $wb_input_delay_value -clock [get_clocks $::env(WB_CLOCK_PORT)] [get_port wb_we_i*]
+set_input_delay $wb_input_delay_value -clock [get_clocks $::env(WB_CLOCK_PORT)] [get_port wb_dat_i*]
+set_input_delay $wb_input_delay_value -clock [get_clocks $::env(WB_CLOCK_PORT)] [get_port wb_sel_i*]
+set_input_delay 3.0 -clock [get_clocks $::env(WB_CLOCK_PORT)] [get_port wb_cyc_i*]
+set_input_delay $wb_input_delay_value -clock [get_clocks $::env(WB_CLOCK_PORT)] [get_port wb_cti_i*]
+
+set_input_delay $wb_input_delay_value -clock [get_clocks $::env(WB_CLOCK_PORT)] [get_port cfg_sdr_tras_d*]
+set_input_delay $wb_input_delay_value -clock [get_clocks $::env(WB_CLOCK_PORT)] [get_port cfg_sdr_trp_d*]
+set_input_delay $wb_input_delay_value -clock [get_clocks $::env(WB_CLOCK_PORT)] [get_port cfg_sdr_trcd_d*]
+set_input_delay $wb_input_delay_value -clock [get_clocks $::env(WB_CLOCK_PORT)] [get_port cfg_sdr_en*]
+set_input_delay $wb_input_delay_value -clock [get_clocks $::env(WB_CLOCK_PORT)] [get_port cfg_req_depth*]
+set_input_delay $wb_input_delay_value -clock [get_clocks $::env(WB_CLOCK_PORT)] [get_port cfg_sdr_mode_reg*]
+set_input_delay $wb_input_delay_value -clock [get_clocks $::env(WB_CLOCK_PORT)] [get_port cfg_sdr_cas*]
+set_input_delay $wb_input_delay_value -clock [get_clocks $::env(WB_CLOCK_PORT)] [get_port cfg_sdr_trcar_d*]
+set_input_delay $wb_input_delay_value -clock [get_clocks $::env(WB_CLOCK_PORT)] [get_port cfg_sdr_twr_d*]
+set_input_delay $wb_input_delay_value -clock [get_clocks $::env(WB_CLOCK_PORT)] [get_port cfg_sdr_rfsh*]
+set_input_delay $wb_input_delay_value -clock [get_clocks $::env(WB_CLOCK_PORT)] [get_port cfg_sdr_rfmax*]
+
+set_output_delay $wb_output_delay_value -clock [get_clocks $::env(WB_CLOCK_PORT)] [get_port wb_dat_o*]
+set_output_delay 3.0 -clock [get_clocks $::env(WB_CLOCK_PORT)] [get_port wb_ack_o*]
+set_output_delay $wb_output_delay_value -clock [get_clocks $::env(WB_CLOCK_PORT)] [get_port sdr_init_done*]
+
+######################################
+# SDRAM Clock domain input output
+######################################
+create_clock [get_ports $::env(SDRAM_CLOCK_PORT)] -name $::env(SDRAM_CLOCK_PORT) -period $::env(SDRAM_CLOCK_PERIOD)
+set sdram_input_delay_value [expr $::env(SDRAM_CLOCK_PERIOD) * 0.6]
+set sdram_output_delay_value [expr $::env(SDRAM_CLOCK_PERIOD) * 0.6]
+puts "\[INFO\]: Setting wb output delay to:$wb_output_delay_value"
+puts "\[INFO\]: Setting wb input delay to: $wb_input_delay_value"
+
+set_output_delay $sdram_output_delay_value -clock [get_clocks $::env(SDRAM_CLOCK_PORT)] [get_port sdr_cke*]
+set_output_delay $sdram_output_delay_value -clock [get_clocks $::env(SDRAM_CLOCK_PORT)] [get_port sdr_cs_n*]
+set_output_delay $sdram_output_delay_value -clock [get_clocks $::env(SDRAM_CLOCK_PORT)] [get_port sdr_ras_n*]
+set_output_delay $sdram_output_delay_value -clock [get_clocks $::env(SDRAM_CLOCK_PORT)] [get_port sdr_cas_n*]
+set_output_delay $sdram_output_delay_value -clock [get_clocks $::env(SDRAM_CLOCK_PORT)] [get_port sdr_we_n*]
+set_output_delay $sdram_output_delay_value -clock [get_clocks $::env(SDRAM_CLOCK_PORT)] [get_port sdr_dqm*]
+set_output_delay $sdram_output_delay_value -clock [get_clocks $::env(SDRAM_CLOCK_PORT)] [get_port sdr_ba*]
+set_output_delay $sdram_output_delay_value -clock [get_clocks $::env(SDRAM_CLOCK_PORT)] [get_port sdr_addr*]
+set_output_delay $sdram_output_delay_value -clock [get_clocks $::env(SDRAM_CLOCK_PORT)] [get_port sdr_dout*]
+set_output_delay $sdram_output_delay_value -clock [get_clocks $::env(SDRAM_CLOCK_PORT)] [get_port sdr_den_n*]
+
+################################################
+# PAD SDRAM Clock domain input output
+# Note: PAD SDRAM clock is same as SDRAM clock
+# it's a feedback clock through pads
+################################################
+
+create_clock [get_ports $::env(PAD_SDRAM_CLOCK_PORT)] -name $::env(PAD_SDRAM_CLOCK_PORT) -period $::env(SDRAM_CLOCK_PERIOD)
+set_input_delay $sdram_input_delay_value -clock [get_clocks $::env(PAD_SDRAM_CLOCK_PORT)] [get_port pad_sdr_din*]
+
+
+set_clock_groups -name async_clock -asynchronous -comment "Async Clock group" -group [get_clocks $::env(WB_CLOCK_PORT)] -group [get_clocks $::env(SDRAM_CLOCK_PORT)]
+
+
+# TODO set this as parameter
+set_driving_cell -lib_cell $::env(SYNTH_DRIVING_CELL) -pin $::env(SYNTH_DRIVING_CELL_PIN) [all_inputs]
+set cap_load [expr $::env(SYNTH_CAP_LOAD) / 1000.0]
+puts "\[INFO\]: Setting load to: $cap_load"
+set_load $cap_load [all_outputs]
+
diff --git a/openlane/sdram/config.tcl b/openlane/sdram/config.tcl
index 6d6fa7c..796a40c 100755
--- a/openlane/sdram/config.tcl
+++ b/openlane/sdram/config.tcl
@@ -5,20 +5,11 @@
# Name
set ::env(DESIGN_NAME) sdrc_top
-# This is macro
-set ::env(DESIGN_IS_CORE) 0
-# Diode insertion
- # Spray
-set ::env(DIODE_INSERTION_STRATEGY) 0
-
- # Smart-"ish"
-#set ::env(DIODE_INSERTION_STRATEGY) 3
-#set ::env(GLB_RT_MAX_DIODE_INS_ITERS) 10
# Timing configuration
set ::env(CLOCK_PERIOD) "10"
-set ::env(CLOCK_PORT) "wb_clk_i"
+set ::env(CLOCK_PORT) "wb_clk_i sdram_clk sdram_pad_clk"
# Sources
@@ -38,84 +29,38 @@
set ::env(VERILOG_INCLUDE_DIRS) [glob $script_dir/../../verilog/rtl/sdram_ctrl/src/defs ]
-#set ::env(SYNTH_DEFINES) [list SCR1_DBG_EN ]
-
-
-# Need blackbox for cells
-set ::env(SYNTH_READ_BLACKBOX_LIB) 0
+set ::env(SDC_FILE) "$script_dir/base.sdc"
+set ::env(BASE_SDC_FILE) "$script_dir/base.sdc"
# Floorplanning
# -------------
-# Fixed area and pin position
-set ::env(FP_SIZING) "absolute"
-#actual die area is 0 0 2920 3520, given 500 micron extra margin
-set ::env(DIE_AREA) [list 0.0 0.0 1000.0 300.0]
set ::env(FP_PIN_ORDER_CFG) $::env(DESIGN_DIR)/pin_order.cfg
-
-# Halo around the Macros
-set ::env(FP_HORIZONTAL_HALO) 25
-set ::env(FP_VERTICAL_HALO) 20
-
-#set ::env(PDN_CFG) $::env(DESIGN_DIR)/pdn.tcl
+set ::env(FP_SIZING) "absolute"
+set ::env(DIE_AREA) [list 0.0 0.0 900.0 300.0]
-# Placement
-# ---------
-set ::env(PL_TARGET_DENSITY) 0.40
+set ::env(FP_PDN_VPITCH) 50
+set ::env(PDN_CFG) $script_dir/pdn.tcl
-#set ::env(MACRO_PLACEMENT_CFG) $::env(DESIGN_DIR)/macro_placement.cfg
+set ::env(FP_VERTICAL_HALO) 6
+set ::env(PL_TARGET_DENSITY) 0.52
+set ::env(PL_TARGET_DENSITY_CELLS) 0.38
+set ::env(PL_OPENPHYSYN_OPTIMIZATIONS) 1
+set ::env(CELL_PAD) 4
+
+set ::env(GLB_RT_ADJUSTMENT) 0
+set ::env(GLB_RT_L2_ADJUSTMENT) 0.2
+set ::env(GLB_RT_L3_ADJUSTMENT) 0.25
+set ::env(GLB_RT_L4_ADJUSTMENT) 0.2
+set ::env(GLB_RT_L5_ADJUSTMENT) 0.1
+set ::env(GLB_RT_L6_ADJUSTMENT) 0.1
+set ::env(GLB_RT_TILES) 14
+set ::env(GLB_RT_MAXLAYER) 5
+
+set ::env(DIODE_INSERTION_STRATEGY) 4
-# Routing
-# -------
-
-#| `ROUTING_CORES` | Specifies the number of threads to be used in TritonRoute. <br> (Default: `4`) |
-set ::env(ROUTING_CORES) 4
-
-#| `GLB_RT_ALLOW_CONGESTION` | Allow congestion in the resultign guides. 0 = false, 1 = true <br> (Default: `0`) |
-set ::env(GLB_RT_ALLOW_CONGESTION) 0
-
-# | `GLB_RT_MINLAYER` | The number of lowest layer to be used in routing. <br> (Default: `1`)|
-set ::env(GLB_RT_MINLAYER) 1
-
-# | `GLB_RT_MAXLAYER` | The number of highest layer to be used in routing. <br> (Default: `6`)|
-set ::env(GLB_RT_MAXLAYER) 6
-
-# Obstructions
- # li1 over the SRAM areas
- # met5 over the whole design
-#set ::env(GLB_RT_OBS) "li1 0.00 22.68 1748.00 486.24, li1 0.00 851.08 1748.00 486.24, met5 0.0 0.0 1748.0 1360.0"
-
-#| `ROUTING_OPT_ITERS` | Specifies the maximum number of optimization iterations during Detailed Routing in TritonRoute. <br> (Default: `64`) |
-set ::env(ROUTING_OPT_ITERS) "64"
-
-#| `GLOBAL_ROUTER` | Specifies which global router to use. Values: `fastroute` or `cugr`. <br> (Default: `fastroute`) |
-set ::env(GLOBAL_ROUTER) "fastroute"
-
-#| `DETAILED_ROUTER` | Specifies which detailed router to use. Values: `tritonroute`, `tritonroute_or`, or `drcu`. <br> (Default: `tritonroute`) |
-set ::env(DETAILED_ROUTER) "tritonroute"
-
-# DRC
-# ---
-
-
-set ::env(MAGIC_DRC_USE_GDS) 1
-
-
-# Tape Out
-# --------
-
-set ::env(MAGIC_ZEROIZE_ORIGIN) 0
-
-
-# Cell library specific config
-# ----------------------------
-
-set filename $::env(DESIGN_DIR)/$::env(PDK)_$::env(STD_CELL_LIBRARY)_config.tcl
-if { [file exists $filename] == 1} {
- source $filename
-}
diff --git a/openlane/sdram/pdn.tcl b/openlane/sdram/pdn.tcl
new file mode 100644
index 0000000..1fe689b
--- /dev/null
+++ b/openlane/sdram/pdn.tcl
@@ -0,0 +1,49 @@
+# SPDX-FileCopyrightText: 2020 Efabless Corporation
+#
+# 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
+
+# Power nets
+set ::power_nets $::env(VDD_PIN)
+set ::ground_nets $::env(GND_PIN)
+
+set ::macro_blockage_layer_list "li1 met1 met2 met3 met4 met5"
+
+pdngen::specify_grid stdcell {
+ name grid
+ rails {
+ met1 {width 0.48 pitch $::env(PLACE_SITE_HEIGHT) offset 0}
+ }
+ straps {
+ met4 {width 1.6 pitch $::env(FP_PDN_VPITCH) offset $::env(FP_PDN_VOFFSET)}
+ met5 {width 1.6 pitch $::env(FP_PDN_HPITCH) offset $::env(FP_PDN_HOFFSET)}
+ }
+ connect {{met1 met4} {met4 met5}}
+}
+
+pdngen::specify_grid macro {
+ power_pins "VPWR"
+ ground_pins "VGND"
+ blockages "li1 met1 met2 met3 met4"
+ straps {
+ }
+ connect {{met4_PIN_ver met5}}
+}
+
+set ::halo 5
+
+# POWER or GROUND #Std. cell rails starting with power or ground rails at the bottom of the core area
+set ::rails_start_with "POWER" ;
+
+# POWER or GROUND #Upper metal stripes starting with power or ground rails at the left/bottom of the core area
+set ::stripes_start_with "POWER" ;
diff --git a/openlane/sdram/pin_order.cfg b/openlane/sdram/pin_order.cfg
index 691cdfa..52236e6 100644
--- a/openlane/sdram/pin_order.cfg
+++ b/openlane/sdram/pin_order.cfg
@@ -1,51 +1,52 @@
#BUS_SORT
-#E
-wb_clk_i,
-wb_rst_i,
-sdram_resetn,
-sdram_clk,
+#W
+wb_clk_i
+wb_rst_i
-#S
-sdr_cas_n,
-sdr_cke,
-sdr_cs_n,
-sdr_dqm,
-sdr_ras_n,
-sdr_we_n,
+#N
+sdr_cas_n
+sdr_cke
+sdr_cs_n
+sdr_dqm
+sdr_ras_n
+sdr_we_n
sdr_addr.*
sdr_ba.*
pad_sdr_din.*
sdr_dout.*
-sdr_den_n,
-sdram_pad_clk,
+sdr_den_n
+sdram_pad_clk
-#W
-sdr_init_done,
-cfg_sdr_en,
-cfg_colbits.*
-cfg_req_depth.*
-cfg_sdr_cas.*
-cfg_sdr_mode_reg.*
-cfg_sdr_rfmax.*
-cfg_sdr_rfsh.*
-cfg_sdr_trcar_d.*
-cfg_sdr_trcd_d.*
-cfg_sdr_trp_d.*
-cfg_sdr_twr_d.*
+#E
+sdram_clk
+sdram_resetn
+sdr_init_done
cfg_sdr_width.*
+cfg_colbits.*
+cfg_sdr_tras_d.*
+cfg_sdr_trp_d.*
+cfg_sdr_trcd_d.*
+cfg_sdr_en.*
+cfg_req_depth.*
+cfg_sdr_mode_reg.*
+cfg_sdr_cas.*
+cfg_sdr_trcar_d.*
+cfg_sdr_twr_d.*
+cfg_sdr_rfsh.*
+cfg_sdr_rfmax.*
-#N
-wb_stb_i,
-wb_we_i,
+#S
+wb_stb_i
+wb_we_i
wb_addr_i.*
wb_sel_i.*
wb_dat_i.*
wb_dat_o.*
-wb_ack_o,
+wb_ack_o
wb_cyc_i,
wb_cti_i.*
diff --git a/openlane/spi_master/base.sdc b/openlane/spi_master/base.sdc
new file mode 100644
index 0000000..af8edee
--- /dev/null
+++ b/openlane/spi_master/base.sdc
@@ -0,0 +1,50 @@
+set_units -time ns
+set ::env(WB_CLOCK_PERIOD) "10"
+set ::env(WB_CLOCK_PORT) "mclk"
+
+######################################
+# WB Clock domain input output
+######################################
+create_clock [get_ports $::env(WB_CLOCK_PORT)] -name $::env(WB_CLOCK_PORT) -period $::env(WB_CLOCK_PERIOD)
+set wb_input_delay_value [expr $::env(WB_CLOCK_PERIOD) * 0.6]
+set wb_output_delay_value [expr $::env(WB_CLOCK_PERIOD) * 0.6]
+puts "\[INFO\]: Setting wb output delay to:$wb_output_delay_value"
+puts "\[INFO\]: Setting wb input delay to: $wb_input_delay_value"
+
+
+set_input_delay 2.0 -clock [get_clocks $::env(WB_CLOCK_PORT)] {rst_n}
+
+set_input_delay $wb_input_delay_value -clock [get_clocks $::env(WB_CLOCK_PORT)] [get_port wbd_stb_i*]
+set_input_delay $wb_input_delay_value -clock [get_clocks $::env(WB_CLOCK_PORT)] [get_port wbd_adr_i*]
+set_input_delay $wb_input_delay_value -clock [get_clocks $::env(WB_CLOCK_PORT)] [get_port wbd_we_i*]
+set_input_delay $wb_input_delay_value -clock [get_clocks $::env(WB_CLOCK_PORT)] [get_port wbd_dat_i*]
+set_input_delay $wb_input_delay_value -clock [get_clocks $::env(WB_CLOCK_PORT)] [get_port wbd_sel_i*]
+
+set_input_delay $wb_input_delay_value -clock [get_clocks $::env(WB_CLOCK_PORT)] [get_port spi_sdi0*]
+set_input_delay $wb_input_delay_value -clock [get_clocks $::env(WB_CLOCK_PORT)] [get_port spi_sdi1*]
+set_input_delay $wb_input_delay_value -clock [get_clocks $::env(WB_CLOCK_PORT)] [get_port spi_sdi2*]
+set_input_delay $wb_input_delay_value -clock [get_clocks $::env(WB_CLOCK_PORT)] [get_port spi_sdi3*]
+
+set_output_delay $wb_output_delay_value -clock [get_clocks $::env(WB_CLOCK_PORT)] [get_port wbd_dat_o*]
+set_output_delay $wb_output_delay_value -clock [get_clocks $::env(WB_CLOCK_PORT)] [get_port wbd_ack_o*]
+set_output_delay $wb_output_delay_value -clock [get_clocks $::env(WB_CLOCK_PORT)] [get_port wbd_err_o*]
+set_output_delay $wb_output_delay_value -clock [get_clocks $::env(WB_CLOCK_PORT)] [get_port events_o*]
+set_output_delay $wb_output_delay_value -clock [get_clocks $::env(WB_CLOCK_PORT)] [get_port spi_clk*]
+set_output_delay $wb_output_delay_value -clock [get_clocks $::env(WB_CLOCK_PORT)] [get_port spi_csn0*]
+set_output_delay $wb_output_delay_value -clock [get_clocks $::env(WB_CLOCK_PORT)] [get_port spi_csn1*]
+set_output_delay $wb_output_delay_value -clock [get_clocks $::env(WB_CLOCK_PORT)] [get_port spi_csn2*]
+set_output_delay $wb_output_delay_value -clock [get_clocks $::env(WB_CLOCK_PORT)] [get_port spi_csn2*]
+set_output_delay $wb_output_delay_value -clock [get_clocks $::env(WB_CLOCK_PORT)] [get_port spi_csn3*]
+set_output_delay $wb_output_delay_value -clock [get_clocks $::env(WB_CLOCK_PORT)] [get_port spi_mode*]
+set_output_delay $wb_output_delay_value -clock [get_clocks $::env(WB_CLOCK_PORT)] [get_port spi_sdo0*]
+set_output_delay $wb_output_delay_value -clock [get_clocks $::env(WB_CLOCK_PORT)] [get_port spi_sdo1*]
+set_output_delay $wb_output_delay_value -clock [get_clocks $::env(WB_CLOCK_PORT)] [get_port spi_sdo2*]
+set_output_delay $wb_output_delay_value -clock [get_clocks $::env(WB_CLOCK_PORT)] [get_port spi_sdo3*]
+set_output_delay $wb_output_delay_value -clock [get_clocks $::env(WB_CLOCK_PORT)] [get_port spi_en_tx*]
+
+# TODO set this as parameter
+set_driving_cell -lib_cell $::env(SYNTH_DRIVING_CELL) -pin $::env(SYNTH_DRIVING_CELL_PIN) [all_inputs]
+set cap_load [expr $::env(SYNTH_CAP_LOAD) / 1000.0]
+puts "\[INFO\]: Setting load to: $cap_load"
+set_load $cap_load [all_outputs]
+
diff --git a/openlane/spi_master/config.tcl b/openlane/spi_master/config.tcl
index b69e7cf..584bda3 100755
--- a/openlane/spi_master/config.tcl
+++ b/openlane/spi_master/config.tcl
@@ -3,23 +3,14 @@
set script_dir [file dirname [file normalize [info script]]]
# Name
+
set ::env(DESIGN_NAME) spim_top
-# This is macro
-set ::env(DESIGN_IS_CORE) 0
-
-# Diode insertion
- # Spray
-set ::env(DIODE_INSERTION_STRATEGY) 0
-
- # Smart-"ish"
-#set ::env(DIODE_INSERTION_STRATEGY) 3
-#set ::env(GLB_RT_MAX_DIODE_INS_ITERS) 10
-
# Timing configuration
set ::env(CLOCK_PERIOD) "10"
set ::env(CLOCK_PORT) "mclk"
+set ::env(SYNTH_MAX_FANOUT) 4
# Sources
# -------
@@ -33,86 +24,38 @@
$script_dir/../../verilog/rtl/spi_master/src/spim_rx.sv \
$script_dir/../../verilog/rtl/spi_master/src/spim_tx.sv "
-#set ::env(VERILOG_INCLUDE_DIRS) [glob $script_dir/../../verilog/rtl/syntacore/scr1/src/includes ]
-
-#set ::env(SYNTH_DEFINES) [list SCR1_DBG_EN ]
-
-
-# Need blackbox for cells
-set ::env(SYNTH_READ_BLACKBOX_LIB) 0
+set ::env(SDC_FILE) "$script_dir/base.sdc"
+set ::env(BASE_SDC_FILE) "$script_dir/base.sdc"
# Floorplanning
# -------------
-# Fixed area and pin position
-set ::env(FP_SIZING) "absolute"
-#actual die area is 0 0 2920 3520, given 500 micron extra margin
-set ::env(DIE_AREA) [list 0.0 0.0 300.0 300.0]
set ::env(FP_PIN_ORDER_CFG) $::env(DESIGN_DIR)/pin_order.cfg
-# Halo around the Macros
-set ::env(FP_HORIZONTAL_HALO) 25
-set ::env(FP_VERTICAL_HALO) 20
-
-#set ::env(PDN_CFG) $::env(DESIGN_DIR)/pdn.tcl
+set ::env(FP_SIZING) absolute
+set ::env(DIE_AREA) "0 0 600 500"
-# Placement
-# ---------
+set ::env(FP_PDN_VPITCH) 50
+set ::env(PDN_CFG) $script_dir/pdn.tcl
-set ::env(PL_TARGET_DENSITY) 0.40
+set ::env(FP_VERTICAL_HALO) 6
+set ::env(PL_TARGET_DENSITY) 0.52
+set ::env(PL_TARGET_DENSITY_CELLS) 0.38
+set ::env(PL_OPENPHYSYN_OPTIMIZATIONS) 1
+set ::env(CELL_PAD) 4
-#set ::env(MACRO_PLACEMENT_CFG) $::env(DESIGN_DIR)/macro_placement.cfg
+set ::env(GLB_RT_ADJUSTMENT) 0
+set ::env(GLB_RT_L2_ADJUSTMENT) 0.2
+set ::env(GLB_RT_L3_ADJUSTMENT) 0.25
+set ::env(GLB_RT_L4_ADJUSTMENT) 0.2
+set ::env(GLB_RT_L5_ADJUSTMENT) 0.1
+set ::env(GLB_RT_L6_ADJUSTMENT) 0.1
+set ::env(GLB_RT_TILES) 14
+set ::env(GLB_RT_MAXLAYER) 5
+
+set ::env(DIODE_INSERTION_STRATEGY) 4
-# Routing
-# -------
-
-#| `ROUTING_CORES` | Specifies the number of threads to be used in TritonRoute. <br> (Default: `4`) |
-set ::env(ROUTING_CORES) 4
-
-#| `GLB_RT_ALLOW_CONGESTION` | Allow congestion in the resultign guides. 0 = false, 1 = true <br> (Default: `0`) |
-set ::env(GLB_RT_ALLOW_CONGESTION) 0
-
-# | `GLB_RT_MINLAYER` | The number of lowest layer to be used in routing. <br> (Default: `1`)|
-set ::env(GLB_RT_MINLAYER) 1
-
-# | `GLB_RT_MAXLAYER` | The number of highest layer to be used in routing. <br> (Default: `6`)|
-set ::env(GLB_RT_MAXLAYER) 6
-
-# Obstructions
- # li1 over the SRAM areas
- # met5 over the whole design
-#set ::env(GLB_RT_OBS) "li1 0.00 22.68 1748.00 486.24, li1 0.00 851.08 1748.00 486.24, met5 0.0 0.0 1748.0 1360.0"
-
-#| `ROUTING_OPT_ITERS` | Specifies the maximum number of optimization iterations during Detailed Routing in TritonRoute. <br> (Default: `64`) |
-set ::env(ROUTING_OPT_ITERS) "64"
-
-#| `GLOBAL_ROUTER` | Specifies which global router to use. Values: `fastroute` or `cugr`. <br> (Default: `fastroute`) |
-set ::env(GLOBAL_ROUTER) "fastroute"
-
-#| `DETAILED_ROUTER` | Specifies which detailed router to use. Values: `tritonroute`, `tritonroute_or`, or `drcu`. <br> (Default: `tritonroute`) |
-set ::env(DETAILED_ROUTER) "tritonroute"
-
-# DRC
-# ---
-
-
-set ::env(MAGIC_DRC_USE_GDS) 1
-
-
-# Tape Out
-# --------
-
-set ::env(MAGIC_ZEROIZE_ORIGIN) 0
-
-
-# Cell library specific config
-# ----------------------------
-
-set filename $::env(DESIGN_DIR)/$::env(PDK)_$::env(STD_CELL_LIBRARY)_config.tcl
-if { [file exists $filename] == 1} {
- source $filename
-}
diff --git a/openlane/spi_master/pdn.tcl b/openlane/spi_master/pdn.tcl
new file mode 100644
index 0000000..1fe689b
--- /dev/null
+++ b/openlane/spi_master/pdn.tcl
@@ -0,0 +1,49 @@
+# SPDX-FileCopyrightText: 2020 Efabless Corporation
+#
+# 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
+
+# Power nets
+set ::power_nets $::env(VDD_PIN)
+set ::ground_nets $::env(GND_PIN)
+
+set ::macro_blockage_layer_list "li1 met1 met2 met3 met4 met5"
+
+pdngen::specify_grid stdcell {
+ name grid
+ rails {
+ met1 {width 0.48 pitch $::env(PLACE_SITE_HEIGHT) offset 0}
+ }
+ straps {
+ met4 {width 1.6 pitch $::env(FP_PDN_VPITCH) offset $::env(FP_PDN_VOFFSET)}
+ met5 {width 1.6 pitch $::env(FP_PDN_HPITCH) offset $::env(FP_PDN_HOFFSET)}
+ }
+ connect {{met1 met4} {met4 met5}}
+}
+
+pdngen::specify_grid macro {
+ power_pins "VPWR"
+ ground_pins "VGND"
+ blockages "li1 met1 met2 met3 met4"
+ straps {
+ }
+ connect {{met4_PIN_ver met5}}
+}
+
+set ::halo 5
+
+# POWER or GROUND #Std. cell rails starting with power or ground rails at the bottom of the core area
+set ::rails_start_with "POWER" ;
+
+# POWER or GROUND #Upper metal stripes starting with power or ground rails at the left/bottom of the core area
+set ::stripes_start_with "POWER" ;
diff --git a/openlane/spi_master/pin_order.cfg b/openlane/spi_master/pin_order.cfg
index afd59ee..23b1cf5 100644
--- a/openlane/spi_master/pin_order.cfg
+++ b/openlane/spi_master/pin_order.cfg
@@ -24,7 +24,7 @@
spi_sdo3
-#N
+#S
wbd_stb_i
wbd_we_i
wbd_adr_i.*
diff --git a/openlane/syntacore/base.sdc b/openlane/syntacore/base.sdc
new file mode 100644
index 0000000..0bb30a6
--- /dev/null
+++ b/openlane/syntacore/base.sdc
@@ -0,0 +1,49 @@
+set_units -time ns
+#Wishbone Clock
+set ::env(WB_CLOCK_PERIOD) "10"
+set ::env(WB_CLOCK_PORT) "wb_clk"
+
+#Risc Core Clock
+set ::env(CORE_CLOCK_PERIOD) "50"
+set ::env(CORE_CLOCK_PORT) "core_clk"
+
+######################################
+# CORE Clock domain input output
+######################################
+create_clock [get_ports $::env(CORE_CLOCK_PORT)] -name $::env(CORE_CLOCK_PORT) -period $::env(CORE_CLOCK_PERIOD)
+set core_input_delay_value [expr $::env(CORE_CLOCK_PERIOD) * 0.6]
+set core_output_delay_value [expr $::env(CORE_CLOCK_PERIOD) * 0.6]
+puts "\[INFO\]: Setting core output delay to: $core_output_delay_value"
+puts "\[INFO\]: Setting core input delay to: $core_input_delay_value"
+set core_clk_indx [lsearch [all_inputs] [get_port $::env(CORE_CLOCK_PORT)]]
+set core_rst_indx [lsearch [all_inputs] [get_port cpu_rst_n]]
+set all_inputs_wo_core_clk_rst [lreplace [all_inputs] $core_clk_indx $core_rst_indx]
+set all_outputs_core [all_outputs]
+
+set_input_delay $core_input_delay_value -clock [get_clocks $::env(CORE_CLOCK_PORT)] $all_inputs_wo_core_clk_rst
+set_input_delay 5.0 -clock [get_clocks $::env(CORE_CLOCK_PORT)] {cpu_rst_n}
+set_output_delay $core_output_delay_value -clock [get_clocks $::env(CORE_CLOCK_PORT)] $all_outputs_core
+
+######################################
+# WB Clock domain input output
+######################################
+create_clock [get_ports $::env(WB_CLOCK_PORT)] -name $::env(WB_CLOCK_PORT) -period $::env(WB_CLOCK_PERIOD)
+set wb_input_delay_value [expr $::env(WB_CLOCK_PERIOD) * 0.6]
+set wb_output_delay_value [expr $::env(WB_CLOCK_PERIOD) * 0.6]
+puts "\[INFO\]: Setting wb output delay to:$wb_output_delay_value"
+puts "\[INFO\]: Setting wb input delay to: $wb_input_delay_value"
+set wb_clk_indx [lsearch [all_inputs] [get_port $::env(WB_CLOCK_PORT)]]
+set wb_rst_indx [lsearch [all_inputs] [get_port wb_rst_n]]
+set all_inputs_wo_wb_clk_rst [lreplace [all_inputs] $wb_clk_indx $wb_rst_indx]
+set all_outputs_wb [all_outputs]
+
+set_input_delay $wb_input_delay_value -clock [get_clocks $::env(WB_CLOCK_PORT)] $all_inputs_wo_wb_clk_rst
+set_input_delay 5.0 -clock [get_clocks $::env(WB_CLOCK_PORT)] {wb_rst_n}
+set_output_delay $wb_output_delay_value -clock [get_clocks $::env(WB_CLOCK_PORT)] $all_outputs_wb
+
+
+# TODO set this as parameter
+set_driving_cell -lib_cell $::env(SYNTH_DRIVING_CELL) -pin $::env(SYNTH_DRIVING_CELL_PIN) [all_inputs]
+set cap_load [expr $::env(SYNTH_CAP_LOAD) / 1000.0]
+puts "\[INFO\]: Setting load to: $cap_load"
+set_load $cap_load [all_outputs]
diff --git a/openlane/syntacore/config.tcl b/openlane/syntacore/config.tcl
index 766f736..994b399 100755
--- a/openlane/syntacore/config.tcl
+++ b/openlane/syntacore/config.tcl
@@ -5,21 +5,13 @@
# Name
set ::env(DESIGN_NAME) scr1_top_wb
-# This is macro
-set ::env(DESIGN_IS_CORE) 0
-
-# Diode insertion
- # Spray
-set ::env(DIODE_INSERTION_STRATEGY) 0
-
- # Smart-"ish"
-#set ::env(DIODE_INSERTION_STRATEGY) 3
-#set ::env(GLB_RT_MAX_DIODE_INS_ITERS) 10
+set ::env(SYNTH_READ_BLACKBOX_LIB) 1
# Timing configuration
set ::env(CLOCK_PERIOD) "10"
-set ::env(CLOCK_PORT) "clk"
+set ::env(CLOCK_PORT) "wb_clk core_clk"
+set ::env(SYNTH_MAX_FANOUT) 4
# Sources
# -------
@@ -53,88 +45,45 @@
$script_dir/../../verilog/rtl/syntacore/scr1/src/top/scr1_top_wb.sv \
$script_dir/../../verilog/rtl/syntacore/scr1/src/top/scr1_dmem_wb.sv \
$script_dir/../../verilog/rtl/syntacore/scr1/src/top/scr1_imem_wb.sv \
- $script_dir/../../verilog/rtl/lib/sync_fifo.sv "
+ $script_dir/../../verilog/rtl/lib/async_fifo.sv "
set ::env(VERILOG_INCLUDE_DIRS) [glob $script_dir/../../verilog/rtl/syntacore/scr1/src/includes ]
+set ::env(SDC_FILE) "$script_dir/base.sdc"
+set ::env(BASE_SDC_FILE) "$script_dir/base.sdc"
#set ::env(SYNTH_DEFINES) [list SCR1_DBG_EN ]
-# Need blackbox for cells
-set ::env(SYNTH_READ_BLACKBOX_LIB) 0
-
-
+# --------
# Floorplanning
# -------------
-# Fixed area and pin position
-set ::env(FP_SIZING) "absolute"
-#actual die area is 0 0 2920 3520, given 500 micron extra margin
-set ::env(DIE_AREA) [list 0.0 0.0 2000.0 1200.0]
-set ::env(FP_PIN_ORDER_CFG) $::env(DESIGN_DIR)/pin_order.cfg
+set ::env(FP_DEF_TEMPLATE) $script_dir/floorplan.def
+#set ::env(FP_PIN_ORDER_CFG) $::env(DESIGN_DIR)/pin_order.cfg
-# Halo around the Macros
-set ::env(FP_HORIZONTAL_HALO) 25
-set ::env(FP_VERTICAL_HALO) 20
-
-#set ::env(PDN_CFG) $::env(DESIGN_DIR)/pdn.tcl
+set ::env(FP_SIZING) absolute
+set ::env(DIE_AREA) [list 0.0 0.0 1500.0 1200.0]
-# Placement
-# ---------
+set ::env(FP_PDN_VPITCH) 50
+set ::env(PDN_CFG) $script_dir/pdn.tcl
-set ::env(PL_TARGET_DENSITY) 0.40
+set ::env(FP_VERTICAL_HALO) 6
+set ::env(PL_TARGET_DENSITY) 0.52
+set ::env(PL_TARGET_DENSITY_CELLS) 0.38
+set ::env(PL_OPENPHYSYN_OPTIMIZATIONS) 1
+set ::env(CELL_PAD) 4
-#set ::env(MACRO_PLACEMENT_CFG) $::env(DESIGN_DIR)/macro_placement.cfg
+set ::env(GLB_RT_ADJUSTMENT) 0
+set ::env(GLB_RT_L2_ADJUSTMENT) 0.2
+set ::env(GLB_RT_L3_ADJUSTMENT) 0.25
+set ::env(GLB_RT_L4_ADJUSTMENT) 0.2
+set ::env(GLB_RT_L5_ADJUSTMENT) 0.1
+set ::env(GLB_RT_L6_ADJUSTMENT) 0.1
+set ::env(GLB_RT_TILES) 14
+set ::env(GLB_RT_MAXLAYER) 5
+
+set ::env(DIODE_INSERTION_STRATEGY) 4
-# Routing
-# -------
-
-#| `ROUTING_CORES` | Specifies the number of threads to be used in TritonRoute. <br> (Default: `4`) |
-set ::env(ROUTING_CORES) 4
-
-#| `GLB_RT_ALLOW_CONGESTION` | Allow congestion in the resultign guides. 0 = false, 1 = true <br> (Default: `0`) |
-set ::env(GLB_RT_ALLOW_CONGESTION) 0
-
-# | `GLB_RT_MINLAYER` | The number of lowest layer to be used in routing. <br> (Default: `1`)|
-set ::env(GLB_RT_MINLAYER) 1
-
-# | `GLB_RT_MAXLAYER` | The number of highest layer to be used in routing. <br> (Default: `6`)|
-set ::env(GLB_RT_MAXLAYER) 6
-
-# Obstructions
- # li1 over the SRAM areas
- # met5 over the whole design
-#set ::env(GLB_RT_OBS) "li1 0.00 22.68 1748.00 486.24, li1 0.00 851.08 1748.00 486.24, met5 0.0 0.0 1748.0 1360.0"
-
-#| `ROUTING_OPT_ITERS` | Specifies the maximum number of optimization iterations during Detailed Routing in TritonRoute. <br> (Default: `64`) |
-set ::env(ROUTING_OPT_ITERS) "64"
-
-#| `GLOBAL_ROUTER` | Specifies which global router to use. Values: `fastroute` or `cugr`. <br> (Default: `fastroute`) |
-set ::env(GLOBAL_ROUTER) "fastroute"
-
-#| `DETAILED_ROUTER` | Specifies which detailed router to use. Values: `tritonroute`, `tritonroute_or`, or `drcu`. <br> (Default: `tritonroute`) |
-set ::env(DETAILED_ROUTER) "tritonroute"
-
-# DRC
-# ---
-
-
-set ::env(MAGIC_DRC_USE_GDS) 1
-
-
-# Tape Out
-# --------
-
-set ::env(MAGIC_ZEROIZE_ORIGIN) 0
-
-
-# Cell library specific config
-# ----------------------------
-
-set filename $::env(DESIGN_DIR)/$::env(PDK)_$::env(STD_CELL_LIBRARY)_config.tcl
-if { [file exists $filename] == 1} {
- source $filename
-}
diff --git a/openlane/syntacore/pdn.tcl b/openlane/syntacore/pdn.tcl
new file mode 100644
index 0000000..1fe689b
--- /dev/null
+++ b/openlane/syntacore/pdn.tcl
@@ -0,0 +1,49 @@
+# SPDX-FileCopyrightText: 2020 Efabless Corporation
+#
+# 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
+
+# Power nets
+set ::power_nets $::env(VDD_PIN)
+set ::ground_nets $::env(GND_PIN)
+
+set ::macro_blockage_layer_list "li1 met1 met2 met3 met4 met5"
+
+pdngen::specify_grid stdcell {
+ name grid
+ rails {
+ met1 {width 0.48 pitch $::env(PLACE_SITE_HEIGHT) offset 0}
+ }
+ straps {
+ met4 {width 1.6 pitch $::env(FP_PDN_VPITCH) offset $::env(FP_PDN_VOFFSET)}
+ met5 {width 1.6 pitch $::env(FP_PDN_HPITCH) offset $::env(FP_PDN_HOFFSET)}
+ }
+ connect {{met1 met4} {met4 met5}}
+}
+
+pdngen::specify_grid macro {
+ power_pins "VPWR"
+ ground_pins "VGND"
+ blockages "li1 met1 met2 met3 met4"
+ straps {
+ }
+ connect {{met4_PIN_ver met5}}
+}
+
+set ::halo 5
+
+# POWER or GROUND #Std. cell rails starting with power or ground rails at the bottom of the core area
+set ::rails_start_with "POWER" ;
+
+# POWER or GROUND #Upper metal stripes starting with power or ground rails at the left/bottom of the core area
+set ::stripes_start_with "POWER" ;
diff --git a/openlane/syntacore/pin_order.cfg b/openlane/syntacore/pin_order.cfg
index 398de52..a854d55 100644
--- a/openlane/syntacore/pin_order.cfg
+++ b/openlane/syntacore/pin_order.cfg
@@ -1,41 +1,34 @@
#BUS_SORT
#E
-clk
+core_clk
+rtc_clk
cpu_rst_n
irq_lines.*
-pwrup_rst_n
-rst_n
-rtc_clk
soft_irq
-sys_rdc_qlfy_o
-sys_rst_n_o
-fuse_idcode.*
fuse_mhartid.*
#W
-tck
-tdi
-tdo
-tdo_en
-test_mode
-test_rst_n
-tms
-trst_n
+wb_clk
+wb_rst_n
+pwrup_rst_n
+rst_n
+sys_rdc_qlfy_o
+sys_rst_n_o
-#S
+#N
wbd_imem_stb_o
wbd_imem_we_o
wbd_imem_adr_o.*
-wbd_imem_sel_o
+wbd_imem_sel_o.*
wbd_imem_dat_o.*
wbd_imem_dat_i.*
wbd_imem_ack_i
wbd_imem_err_i
wbd_dmem_stb_o
-wbd_dmem_adr_o.*
wbd_dmem_we_o
-wbd_dmem_sel_o
+wbd_dmem_adr_o.*
+wbd_dmem_sel_o.*
wbd_dmem_dat_o.*
wbd_dmem_dat_i.*
wbd_dmem_ack_i
diff --git a/openlane/user_project_wrapper/base.sdc b/openlane/user_project_wrapper/base.sdc
new file mode 100644
index 0000000..97e8ab3
--- /dev/null
+++ b/openlane/user_project_wrapper/base.sdc
@@ -0,0 +1,56 @@
+set_units -time ns
+set ::env(WB_CLOCK_PERIOD) "10"
+set ::env(WB_CLOCK_PORT) "wb_clk_i"
+
+set ::env(SDRAM_CLOCK_PERIOD) "20"
+set ::env(SDRAM_CLOCK_PORT) "digital_core.u_glbl_cfg.sdram_clk"
+
+set ::env(PAD_SDRAM_CLOCK_PERIOD) "20"
+set ::env(PAD_SDRAM_CLOCK_PORT) "digital_core.u_sdram_ctrl.sdram_pad_clk"
+
+set ::env(CPU_CLOCK_PERIOD) "50"
+set ::env(CPU_CLOCK_PORT) "digital_core.u_glbl_cfg.cpu_clk"
+
+set ::env(RTC_CLOCK_PERIOD) "50"
+set ::env(RTC_CLOCK_PORT) "digital_core.u_glbl_cfg.rtc_clk"
+######################################
+# WB Clock domain input output
+######################################
+create_clock [get_ports $::env(WB_CLOCK_PORT)] -name $::env(WB_CLOCK_PORT) -period $::env(WB_CLOCK_PERIOD)
+set wb_input_delay_value [expr $::env(WB_CLOCK_PERIOD) * 0.6]
+set wb_output_delay_value [expr $::env(WB_CLOCK_PERIOD) * 0.6]
+puts "\[INFO\]: Setting wb output delay to:$wb_output_delay_value"
+puts "\[INFO\]: Setting wb input delay to: $wb_input_delay_value"
+
+
+set_input_delay 2.0 -clock [get_clocks $::env(WB_CLOCK_PORT)] {wb_rst_i}
+
+set_input_delay $wb_input_delay_value -clock [get_clocks $::env(WB_CLOCK_PORT)] [get_port wbs_stb_i*]
+set_input_delay $wb_input_delay_value -clock [get_clocks $::env(WB_CLOCK_PORT)] [get_port wbs_cyc_i*]
+set_input_delay $wb_input_delay_value -clock [get_clocks $::env(WB_CLOCK_PORT)] [get_port wbs_we_i*]
+set_input_delay $wb_input_delay_value -clock [get_clocks $::env(WB_CLOCK_PORT)] [get_port wbs_sel_i*]
+set_input_delay $wb_input_delay_value -clock [get_clocks $::env(WB_CLOCK_PORT)] [get_port wbs_dat_i*]
+set_input_delay $wb_input_delay_value -clock [get_clocks $::env(WB_CLOCK_PORT)] [get_port wbs_adr_i*]
+set_input_delay $wb_input_delay_value -clock [get_clocks $::env(WB_CLOCK_PORT)] [get_port wb_cti_i*]
+
+set_output_delay $wb_output_delay_value -clock [get_clocks $::env(WB_CLOCK_PORT)] [get_port wbs_dat_o*]
+set_output_delay 3.0 -clock [get_clocks $::env(WB_CLOCK_PORT)] [get_port wbs_ack_o*]
+
+######################################
+# SDRAM Clock domain input output
+######################################
+create_clock [get_pins (SDRAM_CLOCK_PORT)] -name $::env(SDRAM_CLOCK_PORT) -period $::env(SDRAM_CLOCK_PERIOD)
+create_clock [get_pins (PAD_SDRAM_CLOCK_PORT)] -name $::env(PAD_SDRAM_CLOCK_PORT) -period $::env(PAD_SDRAM_CLOCK_PERIOD)
+create_clock [get_pins (CPU_CLOCK_PORT)] -name $::env(CPU_CLOCK_PORT) -period $::env(CPU_CLOCK_PERIOD)
+create_clock [get_pins (RTC_CLOCK_PORT)] -name $::env(RTC_CLOCK_PORT) -period $::env(RTC_CLOCK_PERIOD)
+
+set_clock_groups -name async_clock -asynchronous -comment "Async Clock group" -group [get_clocks $::env(WB_CLOCK_PORT)] -group [get_clocks $::env(SDRAM_CLOCK_PORT)] -group [get_clocks $::env(CPU_CLOCK_PORT)] -group [get_clocks $::env(RTC_CLOCK_PORT)]
+
+
+
+# TODO set this as parameter
+set_driving_cell -lib_cell $::env(SYNTH_DRIVING_CELL) -pin $::env(SYNTH_DRIVING_CELL_PIN) [all_inputs]
+set cap_load [expr $::env(SYNTH_CAP_LOAD) / 1000.0]
+puts "\[INFO\]: Setting load to: $cap_load"
+set_load $cap_load [all_outputs]
+
diff --git a/openlane/user_project_wrapper/config.tcl b/openlane/user_project_wrapper/config.tcl
index 330cf57..04ea174 100644
--- a/openlane/user_project_wrapper/config.tcl
+++ b/openlane/user_project_wrapper/config.tcl
@@ -20,6 +20,9 @@
source $script_dir/../../caravel/openlane/user_project_wrapper_empty/fixed_wrapper_cfgs.tcl
set ::env(DESIGN_NAME) user_project_wrapper
+set verilog_root $script_dir/../../verilog/
+set lef_root $script_dir/../../lef/
+set gds_root $script_dir/../../gds/
#section end
# User Configurations
@@ -27,43 +30,75 @@
## Source Verilog Files
set ::env(VERILOG_FILES) "\
$script_dir/../../caravel/verilog/rtl/defines.v \
+ $script_dir/../../verilog/rtl/digital_core/src/digital_core.sv \
$script_dir/../../verilog/rtl/user_project_wrapper.v"
## Clock configurations
-set ::env(CLOCK_PORT) "user_clock2"
-set ::env(CLOCK_NET) "mprj.clk"
+set ::env(CLOCK_PORT) "user_clock2 wb_clk_i"
+#set ::env(CLOCK_NET) "mprj.clk"
set ::env(CLOCK_PERIOD) "10"
## Internal Macros
### Macro Placement
-set ::env(MACRO_PLACEMENT_CFG) $script_dir/macro.cfg
+set ::env(FP_SIZING) "absolute"
+set ::env(MACRO_PLACEMENT_CFG) $script_dir/macro_placement.cfg
+
+set ::env(SDC_FILE) "$script_dir/base.sdc"
+set ::env(BASE_SDC_FILE) "$script_dir/base.sdc"
+
### Black-box verilog and views
set ::env(VERILOG_FILES_BLACKBOX) "\
- $script_dir/../../caravel/verilog/rtl/defines.v \
- $script_dir/../../verilog/rtl/user_proj_example.v"
+ $script_dir/../../verilog/rtl/spi_master/src/spim_top.sv \
+ $script_dir/../../verilog/rtl/wb_interconnect/src/wb_interconnect.sv \
+ $script_dir/../../verilog/rtl/digital_core/src/glbl_cfg.sv \
+ $script_dir/macro/bb/sdram.v \
+ $script_dir/macro/bb/syntacore.v \
+ "
set ::env(EXTRA_LEFS) "\
- $script_dir/../../lef/user_proj_example.lef"
+ $lef_root/spi_master.lef \
+ $lef_root/glbl_cfg.lef \
+ $lef_root/wb_interconnect.lef \
+ $lef_root/sdram.lef \
+ $lef_root/syntacore.lef \
+ "
set ::env(EXTRA_GDS_FILES) "\
- $script_dir/../../gds/user_proj_example.gds"
+ $gds_root/spi_master.gds \
+ $gds_root/glbl_cfg.gds \
+ $gds_root/wb_interconnect.gds \
+ $gds_root/sdram.gds \
+ $gds_root/syntacore.gds \
+ "
+
+set ::env(SYNTH_DEFINES) [list SYNTHESIS ]
+
+set ::env(VERILOG_INCLUDE_DIRS) [glob $script_dir/../../verilog/rtl/syntacore/scr1/src/includes $script_dir/../../verilog/rtl/sdram_ctrl/src/defs ]
set ::env(GLB_RT_MAXLAYER) 5
set ::env(FP_PDN_CHECK_NODES) 0
# The following is because there are no std cells in the example wrapper project.
-set ::env(SYNTH_TOP_LEVEL) 1
-set ::env(PL_RANDOM_GLB_PLACEMENT) 1
+#set ::env(SYNTH_TOP_LEVEL) 1
+set ::env(PL_BASIC_PLACEMENT) 1
set ::env(PL_RESIZER_DESIGN_OPTIMIZATIONS) 0
set ::env(PL_RESIZER_TIMING_OPTIMIZATIONS) 0
set ::env(PL_RESIZER_BUFFER_INPUT_PORTS) 0
set ::env(PL_RESIZER_BUFFER_OUTPUT_PORTS) 0
-set ::env(DIODE_INSERTION_STRATEGY) 0
-set ::env(FILL_INSERTION) 0
-set ::env(TAP_DECAP_INSERTION) 0
-set ::env(CLOCK_TREE_SYNTH) 0
+set ::env(DIODE_INSERTION_STRATEGY) 4
+set ::env(FILL_INSERTION) 1
+set ::env(TAP_DECAP_INSERTION) 1
+#set ::env(CLOCK_TREE_SYNTH) 1
+
+# Important for large macro placement
+set ::env(PL_DIAMOND_SEARCH_HEIGHT) "400"
+set ::env(ROUTING_OPT_ITERS) "20"
+
+set ::env(GLB_RT_OBS) "met5 0.0 0.0 2920.0 3520.0"
+
+
diff --git a/openlane/user_project_wrapper/macro/bb/sdram.v b/openlane/user_project_wrapper/macro/bb/sdram.v
new file mode 100644
index 0000000..2beba06
--- /dev/null
+++ b/openlane/user_project_wrapper/macro/bb/sdram.v
@@ -0,0 +1,84 @@
+module sdrc_top (cfg_sdr_en,
+ sdr_cas_n,
+ sdr_cke,
+ sdr_cs_n,
+ sdr_den_n,
+ sdr_dqm,
+ sdr_init_done,
+ sdr_ras_n,
+ sdr_we_n,
+ sdram_clk,
+ sdram_pad_clk,
+ sdram_resetn,
+ wb_ack_o,
+ wb_clk_i,
+ wb_cyc_i,
+ wb_rst_i,
+ wb_stb_i,
+ wb_we_i,
+ VPWR,
+ VGND,
+ cfg_colbits,
+ cfg_req_depth,
+ cfg_sdr_cas,
+ cfg_sdr_mode_reg,
+ cfg_sdr_rfmax,
+ cfg_sdr_rfsh,
+ cfg_sdr_tras_d,
+ cfg_sdr_trcar_d,
+ cfg_sdr_trcd_d,
+ cfg_sdr_trp_d,
+ cfg_sdr_twr_d,
+ cfg_sdr_width,
+ pad_sdr_din,
+ sdr_addr,
+ sdr_ba,
+ sdr_dout,
+ wb_addr_i,
+ wb_cti_i,
+ wb_dat_i,
+ wb_dat_o,
+ wb_sel_i);
+ input cfg_sdr_en;
+ output sdr_cas_n;
+ output sdr_cke;
+ output sdr_cs_n;
+ output sdr_den_n;
+ output sdr_dqm;
+ output sdr_init_done;
+ output sdr_ras_n;
+ output sdr_we_n;
+ input sdram_clk;
+ input sdram_pad_clk;
+ input sdram_resetn;
+ output wb_ack_o;
+ input wb_clk_i;
+ input wb_cyc_i;
+ input wb_rst_i;
+ input wb_stb_i;
+ input wb_we_i;
+ input VPWR;
+ input VGND;
+ input [1:0] cfg_colbits;
+ input [1:0] cfg_req_depth;
+ input [2:0] cfg_sdr_cas;
+ input [12:0] cfg_sdr_mode_reg;
+ input [2:0] cfg_sdr_rfmax;
+ input [11:0] cfg_sdr_rfsh;
+ input [3:0] cfg_sdr_tras_d;
+ input [3:0] cfg_sdr_trcar_d;
+ input [3:0] cfg_sdr_trcd_d;
+ input [3:0] cfg_sdr_trp_d;
+ input [3:0] cfg_sdr_twr_d;
+ input [1:0] cfg_sdr_width;
+ input [7:0] pad_sdr_din;
+ output [12:0] sdr_addr;
+ output [1:0] sdr_ba;
+ output [7:0] sdr_dout;
+ input [31:0] wb_addr_i;
+ input [2:0] wb_cti_i;
+ input [31:0] wb_dat_i;
+ output [31:0] wb_dat_o;
+ input [3:0] wb_sel_i;
+
+endmodule
diff --git a/openlane/user_project_wrapper/macro/bb/syntacore.v b/openlane/user_project_wrapper/macro/bb/syntacore.v
new file mode 100644
index 0000000..4e1c7db
--- /dev/null
+++ b/openlane/user_project_wrapper/macro/bb/syntacore.v
@@ -0,0 +1,62 @@
+module scr1_top_wb (core_clk,
+ cpu_rst_n,
+ pwrup_rst_n,
+ rst_n,
+ rtc_clk,
+ soft_irq,
+ test_mode,
+ test_rst_n,
+ wb_clk,
+ wb_rst_n,
+ wbd_dmem_ack_i,
+ wbd_dmem_err_i,
+ wbd_dmem_stb_o,
+ wbd_dmem_we_o,
+ wbd_imem_ack_i,
+ wbd_imem_err_i,
+ wbd_imem_stb_o,
+ wbd_imem_we_o,
+ VPWR,
+ VGND,
+ fuse_mhartid,
+ irq_lines,
+ wbd_dmem_adr_o,
+ wbd_dmem_dat_i,
+ wbd_dmem_dat_o,
+ wbd_dmem_sel_o,
+ wbd_imem_adr_o,
+ wbd_imem_dat_i,
+ wbd_imem_dat_o,
+ wbd_imem_sel_o);
+ input core_clk;
+ input cpu_rst_n;
+ input pwrup_rst_n;
+ input rst_n;
+ input rtc_clk;
+ input soft_irq;
+ input test_mode;
+ input test_rst_n;
+ input wb_clk;
+ input wb_rst_n;
+ input wbd_dmem_ack_i;
+ input wbd_dmem_err_i;
+ output wbd_dmem_stb_o;
+ output wbd_dmem_we_o;
+ input wbd_imem_ack_i;
+ input wbd_imem_err_i;
+ output wbd_imem_stb_o;
+ output wbd_imem_we_o;
+ input VPWR;
+ input VGND;
+ input [31:0] fuse_mhartid;
+ input [15:0] irq_lines;
+ output [31:0] wbd_dmem_adr_o;
+ input [31:0] wbd_dmem_dat_i;
+ output [31:0] wbd_dmem_dat_o;
+ output [3:0] wbd_dmem_sel_o;
+ output [31:0] wbd_imem_adr_o;
+ input [31:0] wbd_imem_dat_i;
+ output [31:0] wbd_imem_dat_o;
+ output [3:0] wbd_imem_sel_o;
+
+endmodule
diff --git a/openlane/user_project_wrapper/macro_placement.cfg b/openlane/user_project_wrapper/macro_placement.cfg
new file mode 100644
index 0000000..bc62704
--- /dev/null
+++ b/openlane/user_project_wrapper/macro_placement.cfg
@@ -0,0 +1,5 @@
+u_core.u_riscv_top 300 300 N
+u_core.u_intercon 300 1800 N
+u_core.u_spi_master 300 2500 N
+u_core.u_sdram_ctrl 1000 2500 N
+u_core.u_glbl_cfg 2000 2500 N
diff --git a/openlane/user_project_wrapper/pin_order.cfg b/openlane/user_project_wrapper/pin_order.cfg
index 267d91c..90cde69 100644
--- a/openlane/user_project_wrapper/pin_order.cfg
+++ b/openlane/user_project_wrapper/pin_order.cfg
@@ -1 +1,156 @@
-../../caravel/openlane/user_project_wrapper_empty/pin_order.cfg
\ No newline at end of file
+#BUS_SORT
+#NR
+analog_io\[8\]
+io_in\[15\]
+io_out\[15\]
+io_oeb\[15\]
+analog_io\[9\]
+io_in\[16\]
+io_out\[16\]
+io_oeb\[16\]
+analog_io\[10\]
+io_in\[17\]
+io_out\[17\]
+io_oeb\[17\]
+analog_io\[11\]
+io_in\[18\]
+io_out\[18\]
+io_oeb\[18\]
+analog_io\[12\]
+io_in\[19\]
+io_out\[19\]
+io_oeb\[19\]
+analog_io\[13\]
+io_in\[20\]
+io_out\[20\]
+io_oeb\[20\]
+analog_io\[14\]
+io_in\[21\]
+io_out\[21\]
+io_oeb\[21\]
+analog_io\[15\]
+io_in\[22\]
+io_out\[22\]
+io_oeb\[22\]
+analog_io\[16\]
+io_in\[23\]
+io_out\[23\]
+io_oeb\[23\]
+
+#S
+wb_.*
+wbs_.*
+la_.*
+user_clock2
+user_irq.*
+
+#E
+io_in\[0\]
+io_out\[0\]
+io_oeb\[0\]
+io_in\[1\]
+io_out\[1\]
+io_oeb\[1\]
+io_in\[2\]
+io_out\[2\]
+io_oeb\[2\]
+io_in\[3\]
+io_out\[3\]
+io_oeb\[3\]
+io_in\[4\]
+io_out\[4\]
+io_oeb\[4\]
+io_in\[5\]
+io_out\[5\]
+io_oeb\[5\]
+io_in\[6\]
+io_out\[6\]
+io_oeb\[6\]
+analog_io\[0\]
+io_in\[7\]
+io_out\[7\]
+io_oeb\[7\]
+analog_io\[1\]
+io_in\[8\]
+io_out\[8\]
+io_oeb\[8\]
+analog_io\[2\]
+io_in\[9\]
+io_out\[9\]
+io_oeb\[9\]
+analog_io\[3\]
+io_in\[10\]
+io_out\[10\]
+io_oeb\[10\]
+analog_io\[4\]
+io_in\[11\]
+io_out\[11\]
+io_oeb\[11\]
+analog_io\[5\]
+io_in\[12\]
+io_out\[12\]
+io_oeb\[12\]
+analog_io\[6\]
+io_in\[13\]
+io_out\[13\]
+io_oeb\[13\]
+analog_io\[7\]
+io_in\[14\]
+io_out\[14\]
+io_oeb\[14\]
+
+#WR
+analog_io\[17\]
+io_in\[24\]
+io_out\[24\]
+io_oeb\[24\]
+analog_io\[18\]
+io_in\[25\]
+io_out\[25\]
+io_oeb\[25\]
+analog_io\[19\]
+io_in\[26\]
+io_out\[26\]
+io_oeb\[26\]
+analog_io\[20\]
+io_in\[27\]
+io_out\[27\]
+io_oeb\[27\]
+analog_io\[21\]
+io_in\[28\]
+io_out\[28\]
+io_oeb\[28\]
+analog_io\[22\]
+io_in\[29\]
+io_out\[29\]
+io_oeb\[29\]
+analog_io\[23\]
+io_in\[30\]
+io_out\[30\]
+io_oeb\[30\]
+analog_io\[24\]
+io_in\[31\]
+io_out\[31\]
+io_oeb\[31\]
+analog_io\[25\]
+io_in\[32\]
+io_out\[32\]
+io_oeb\[32\]
+analog_io\[26\]
+io_in\[33\]
+io_out\[33\]
+io_oeb\[33\]
+analog_io\[27\]
+io_in\[34\]
+io_out\[34\]
+io_oeb\[34\]
+analog_io\[28\]
+io_in\[35\]
+io_out\[35\]
+io_oeb\[35\]
+io_in\[36\]
+io_out\[36\]
+io_oeb\[36\]
+io_in\[37\]
+io_out\[37\]
+io_oeb\[37\]
diff --git a/openlane/wb_interconnect/base.sdc b/openlane/wb_interconnect/base.sdc
new file mode 100644
index 0000000..1ef8a54
--- /dev/null
+++ b/openlane/wb_interconnect/base.sdc
@@ -0,0 +1,27 @@
+set_units -time ns
+set ::env(CLOCK_PERIOD) "10"
+set ::env(CLOCK_PORT) "clk_i"
+
+create_clock [get_ports $::env(CLOCK_PORT)] -name $::env(CLOCK_PORT) -period $::env(CLOCK_PERIOD)
+
+set input_delay_value [expr $::env(CLOCK_PERIOD) * 0.6]
+set output_delay_value [expr $::env(CLOCK_PERIOD) * 0.6]
+puts "\[INFO\]: Setting output delay to: $output_delay_value"
+puts "\[INFO\]: Setting input delay to: $input_delay_value"
+
+
+set clk_indx [lsearch [all_inputs] [get_port $::env(CLOCK_PORT)]]
+set rst_indx [lsearch [all_inputs] [get_port rst_n]]
+set all_inputs_wo_clk_rst [lreplace [all_inputs] $clk_indx $rst_indx]
+
+
+# correct resetn
+set_input_delay $input_delay_value -clock [get_clocks $::env(CLOCK_PORT)] $all_inputs_wo_clk_rst
+set_input_delay 2.0 -clock [get_clocks $::env(CLOCK_PORT)] {rst_n}
+set_output_delay $output_delay_value -clock [get_clocks $::env(CLOCK_PORT)] [all_outputs]
+
+# TODO set this as parameter
+set_driving_cell -lib_cell $::env(SYNTH_DRIVING_CELL) -pin $::env(SYNTH_DRIVING_CELL_PIN) [all_inputs]
+set cap_load [expr $::env(SYNTH_CAP_LOAD) / 1000.0]
+puts "\[INFO\]: Setting load to: $cap_load"
+set_load $cap_load [all_outputs]
diff --git a/openlane/wb_interconnect/config.tcl b/openlane/wb_interconnect/config.tcl
new file mode 100755
index 0000000..3cbb6cb
--- /dev/null
+++ b/openlane/wb_interconnect/config.tcl
@@ -0,0 +1,65 @@
+# Global
+# ------
+
+set script_dir [file dirname [file normalize [info script]]]
+# Name
+set ::env(DESIGN_NAME) wb_interconnect
+
+#set ::env(SYNTH_READ_BLACKBOX_LIB) 1
+
+# Timing configuration
+set ::env(CLOCK_PERIOD) "10"
+set ::env(CLOCK_PORT) "clk_i"
+
+set ::env(SYNTH_MAX_FANOUT) 4
+
+# Sources
+# -------
+
+# Local sources + no2usb sources
+set ::env(VERILOG_FILES) "\
+ $script_dir/../../verilog/rtl/lib/wb_stagging.sv \
+ $script_dir/../../verilog/rtl/wb_interconnect/src/wb_arb.sv \
+ $script_dir/../../verilog/rtl/wb_interconnect/src/wb_interconnect.sv \
+ "
+
+set ::env(VERILOG_INCLUDE_DIRS) [glob $script_dir/../../verilog/rtl/syntacore/scr1/src/includes $script_dir/../../verilog/rtl/sdram_ctrl/src/defs ]
+
+set ::env(SDC_FILE) "$script_dir/base.sdc"
+set ::env(BASE_SDC_FILE) "$script_dir/base.sdc"
+
+
+
+# Floorplanning
+# -------------
+
+#set ::env(PL_BASIC_PLACEMENT) 1
+#set ::env(FP_DEF_TEMPLATE) $script_dir/floorplan.def
+set ::env(FP_PIN_ORDER_CFG) $::env(DESIGN_DIR)/pin_order.cfg
+
+set ::env(FP_SIZING) absolute
+set ::env(DIE_AREA) "0 0 2400 150"
+
+
+
+set ::env(FP_PDN_VPITCH) 50
+set ::env(PDN_CFG) $script_dir/pdn.tcl
+
+set ::env(FP_VERTICAL_HALO) 6
+set ::env(PL_TARGET_DENSITY) 0.32
+set ::env(PL_TARGET_DENSITY_CELLS) 0.2
+set ::env(PL_OPENPHYSYN_OPTIMIZATIONS) 1
+set ::env(CELL_PAD) 4
+
+set ::env(GLB_RT_ADJUSTMENT) 0
+set ::env(GLB_RT_L2_ADJUSTMENT) 0.2
+set ::env(GLB_RT_L3_ADJUSTMENT) 0.25
+set ::env(GLB_RT_L4_ADJUSTMENT) 0.2
+set ::env(GLB_RT_L5_ADJUSTMENT) 0.1
+set ::env(GLB_RT_L6_ADJUSTMENT) 0.1
+set ::env(GLB_RT_TILES) 14
+set ::env(GLB_RT_MAXLAYER) 5
+
+set ::env(DIODE_INSERTION_STRATEGY) 4
+
+
diff --git a/openlane/wb_interconnect/pdn.tcl b/openlane/wb_interconnect/pdn.tcl
new file mode 100644
index 0000000..1fe689b
--- /dev/null
+++ b/openlane/wb_interconnect/pdn.tcl
@@ -0,0 +1,49 @@
+# SPDX-FileCopyrightText: 2020 Efabless Corporation
+#
+# 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
+
+# Power nets
+set ::power_nets $::env(VDD_PIN)
+set ::ground_nets $::env(GND_PIN)
+
+set ::macro_blockage_layer_list "li1 met1 met2 met3 met4 met5"
+
+pdngen::specify_grid stdcell {
+ name grid
+ rails {
+ met1 {width 0.48 pitch $::env(PLACE_SITE_HEIGHT) offset 0}
+ }
+ straps {
+ met4 {width 1.6 pitch $::env(FP_PDN_VPITCH) offset $::env(FP_PDN_VOFFSET)}
+ met5 {width 1.6 pitch $::env(FP_PDN_HPITCH) offset $::env(FP_PDN_HOFFSET)}
+ }
+ connect {{met1 met4} {met4 met5}}
+}
+
+pdngen::specify_grid macro {
+ power_pins "VPWR"
+ ground_pins "VGND"
+ blockages "li1 met1 met2 met3 met4"
+ straps {
+ }
+ connect {{met4_PIN_ver met5}}
+}
+
+set ::halo 5
+
+# POWER or GROUND #Std. cell rails starting with power or ground rails at the bottom of the core area
+set ::rails_start_with "POWER" ;
+
+# POWER or GROUND #Upper metal stripes starting with power or ground rails at the left/bottom of the core area
+set ::stripes_start_with "POWER" ;
diff --git a/openlane/wb_interconnect/pin_order.cfg b/openlane/wb_interconnect/pin_order.cfg
new file mode 100644
index 0000000..ffc604a
--- /dev/null
+++ b/openlane/wb_interconnect/pin_order.cfg
@@ -0,0 +1,69 @@
+#BUS_SORT
+
+#E
+clk_i
+rst_n
+
+
+#S
+m0_wbd_stb_i
+m0_wbd_we_i
+m0_wbd_adr_i.*
+m0_wbd_sel_i.*
+m0_wbd_dat_i.*
+m0_wbd_dat_o.*
+m0_wbd_ack_o
+m0_wbd_err_o
+m0_wbd_cyc_i
+
+m1_wbd_stb_i
+m1_wbd_we_i
+m1_wbd_adr_i.*
+m1_wbd_sel_i.*
+m1_wbd_dat_i.*
+m1_wbd_dat_o.*
+m1_wbd_ack_o
+m1_wbd_err_o
+m1_wbd_cyc_i
+
+m2_wbd_stb_i
+m2_wbd_we_i
+m2_wbd_adr_i.*
+m2_wbd_sel_i.*
+m2_wbd_dat_i.*
+m2_wbd_dat_o.*
+m2_wbd_ack_o
+m2_wbd_err_o
+m2_wbd_cyc_i
+
+#N
+s0_wbd_stb_o
+s0_wbd_we_o
+s0_wbd_adr_o.*
+s0_wbd_sel_o.*
+s0_wbd_dat_o.*
+s0_wbd_dat_i.*
+s0_wbd_ack_i
+s0_wbd_err_i
+s0_wbd_cyc_o
+
+s1_wbd_stb_o
+s1_wbd_we_o
+s1_wbd_adr_o.*
+s1_wbd_sel_o.*
+s1_wbd_dat_o.*
+s1_wbd_dat_i.*
+s1_wbd_ack_i
+s1_wbd_err_i
+s1_wbd_cyc_o
+
+s2_wbd_stb_o
+s2_wbd_we_o
+s2_wbd_adr_o.*
+s2_wbd_sel_o.*
+s2_wbd_dat_o.*
+s2_wbd_dat_i.*
+s2_wbd_ack_i
+s2_wbd_err_i
+s2_wbd_cyc_o
+
diff --git a/openlane/yifive/config.tcl b/openlane/yifive/config.tcl
index 4ea25c6..31de106 100644
--- a/openlane/yifive/config.tcl
+++ b/openlane/yifive/config.tcl
@@ -15,27 +15,88 @@
set script_dir [file dirname [file normalize [info script]]]
-set ::env(DESIGN_NAME) user_proj_example
+set ::env(DESIGN_NAME) digital_core
+
+set verilog_root $script_dir/../../verilog/
+set lef_root $script_dir/../../lef/
+set gds_root $script_dir/../../gds/
+
set ::env(VERILOG_FILES) "\
- $script_dir/../../caravel/verilog/rtl/defines.v \
- $script_dir/../../verilog/rtl/user_proj_example.v"
+ $script_dir/../../verilog/rtl/digital_core/src/digital_core.sv \
+ "
+set ::env(SYNTH_READ_BLACKBOX_LIB) "1"
+set ::env(CLOCK_PORT) "wb_clk_i"
+set ::env(CLOCK_PERIOD) "50"
+set ::env(SYNTH_STRATEGY) "AREA 0"
+set ::env(SYNTH_MAX_FANOUT) 4
-set ::env(CLOCK_PORT) ""
-set ::env(CLOCK_NET) "counter.clk"
-set ::env(CLOCK_PERIOD) "10"
-
-set ::env(FP_SIZING) absolute
-set ::env(DIE_AREA) "0 0 900 600"
-set ::env(DESIGN_IS_CORE) 0
-
-set ::env(VDD_NETS) [list {vccd1} {vccd2} {vdda1} {vdda2}]
-set ::env(GND_NETS) [list {vssd1} {vssd2} {vssa1} {vssa2}]
-
-set ::env(FP_PIN_ORDER_CFG) $script_dir/pin_order.cfg
+set ::env(FP_PDN_VPITCH) 50
+set ::env(PDN_CFG) $script_dir/pdn.tcl
set ::env(PL_BASIC_PLACEMENT) 1
-set ::env(PL_TARGET_DENSITY) 0.05
-# If you're going to use multiple power domains, then keep this disabled.
-set ::env(RUN_CVC) 0
+set ::env(FP_VERTICAL_HALO) 6
+set ::env(FP_PIN_ORDER_CFG) $script_dir/pin_order.cfg
+
+
+set ::env(DESIGN_IS_CORE) "0"
+
+
+
+set ::env(SYNTH_DEFINES) [list SYNTHESIS ]
+
+set ::env(VERILOG_INCLUDE_DIRS) [glob $script_dir/../../verilog/rtl/syntacore/scr1/src/includes $script_dir/../../verilog/rtl/sdram_ctrl/src/defs ]
+
+set ::env(EXTRA_LEFS) "\
+ $lef_root/spi_master.lef \
+ $lef_root/glbl_cfg.lef \
+ $lef_root/wb_interconnect.lef \
+ $lef_root/sdram.lef \
+ $lef_root/syntacore.lef \
+ "
+
+set ::env(EXTRA_GDS_FILES) "\
+ $gds_root/spi_master.gds \
+ $gds_root/glbl_cfg.gds \
+ $gds_root/wb_interconnect.gds \
+ $gds_root/sdram.gds \
+ $gds_root/syntacore.gds \
+ "
+
+set ::env(VERILOG_FILES_BLACKBOX) "\
+ $script_dir/../../verilog/rtl/spi_master/src/spim_top.sv \
+ $script_dir/../../verilog/rtl/wb_interconnect/src/wb_interconnect.sv \
+ $script_dir/../../verilog/rtl/digital_core/src/glbl_cfg.sv \
+ $script_dir/macro/bb/sdram.v \
+ $script_dir/macro/bb/syntacore.v \
+ "
+
+
+set ::env(FP_SIZING) relative
+set ::env(DIE_AREA) "0 0 3000 3000"
+
+
+
+set ::env(MACRO_PLACEMENT_CFG) $script_dir/macro_placement.cfg
+set ::env(PL_BASIC_PLACEMENT) 1
+set ::env(PL_TARGET_DENSITY) 0.20
+set ::env(PL_TARGET_DENSITY_CELLS) 0.20
+set ::env(PL_OPENPHYSYN_OPTIMIZATIONS) 0
+set ::env(CELL_PAD) 4
+
+set ::env(GLB_RT_ADJUSTMENT) 0
+set ::env(GLB_RT_L2_ADJUSTMENT) 0.2
+set ::env(GLB_RT_L3_ADJUSTMENT) 0.25
+set ::env(GLB_RT_L4_ADJUSTMENT) 0.2
+set ::env(GLB_RT_L5_ADJUSTMENT) 0.1
+set ::env(GLB_RT_L6_ADJUSTMENT) 0.1
+set ::env(GLB_RT_TILES) 14
+set ::env(GLB_RT_MAXLAYER) 4
+set ::env(PL_DIAMOND_SEARCH_HEIGHT) "400"
+
+set ::env(DIODE_INSERTION_STRATEGY) 4
+
+
+
+
diff --git a/openlane/yifive/macro/bb/sdram.v b/openlane/yifive/macro/bb/sdram.v
new file mode 100644
index 0000000..2beba06
--- /dev/null
+++ b/openlane/yifive/macro/bb/sdram.v
@@ -0,0 +1,84 @@
+module sdrc_top (cfg_sdr_en,
+ sdr_cas_n,
+ sdr_cke,
+ sdr_cs_n,
+ sdr_den_n,
+ sdr_dqm,
+ sdr_init_done,
+ sdr_ras_n,
+ sdr_we_n,
+ sdram_clk,
+ sdram_pad_clk,
+ sdram_resetn,
+ wb_ack_o,
+ wb_clk_i,
+ wb_cyc_i,
+ wb_rst_i,
+ wb_stb_i,
+ wb_we_i,
+ VPWR,
+ VGND,
+ cfg_colbits,
+ cfg_req_depth,
+ cfg_sdr_cas,
+ cfg_sdr_mode_reg,
+ cfg_sdr_rfmax,
+ cfg_sdr_rfsh,
+ cfg_sdr_tras_d,
+ cfg_sdr_trcar_d,
+ cfg_sdr_trcd_d,
+ cfg_sdr_trp_d,
+ cfg_sdr_twr_d,
+ cfg_sdr_width,
+ pad_sdr_din,
+ sdr_addr,
+ sdr_ba,
+ sdr_dout,
+ wb_addr_i,
+ wb_cti_i,
+ wb_dat_i,
+ wb_dat_o,
+ wb_sel_i);
+ input cfg_sdr_en;
+ output sdr_cas_n;
+ output sdr_cke;
+ output sdr_cs_n;
+ output sdr_den_n;
+ output sdr_dqm;
+ output sdr_init_done;
+ output sdr_ras_n;
+ output sdr_we_n;
+ input sdram_clk;
+ input sdram_pad_clk;
+ input sdram_resetn;
+ output wb_ack_o;
+ input wb_clk_i;
+ input wb_cyc_i;
+ input wb_rst_i;
+ input wb_stb_i;
+ input wb_we_i;
+ input VPWR;
+ input VGND;
+ input [1:0] cfg_colbits;
+ input [1:0] cfg_req_depth;
+ input [2:0] cfg_sdr_cas;
+ input [12:0] cfg_sdr_mode_reg;
+ input [2:0] cfg_sdr_rfmax;
+ input [11:0] cfg_sdr_rfsh;
+ input [3:0] cfg_sdr_tras_d;
+ input [3:0] cfg_sdr_trcar_d;
+ input [3:0] cfg_sdr_trcd_d;
+ input [3:0] cfg_sdr_trp_d;
+ input [3:0] cfg_sdr_twr_d;
+ input [1:0] cfg_sdr_width;
+ input [7:0] pad_sdr_din;
+ output [12:0] sdr_addr;
+ output [1:0] sdr_ba;
+ output [7:0] sdr_dout;
+ input [31:0] wb_addr_i;
+ input [2:0] wb_cti_i;
+ input [31:0] wb_dat_i;
+ output [31:0] wb_dat_o;
+ input [3:0] wb_sel_i;
+
+endmodule
diff --git a/openlane/yifive/macro/bb/syntacore.v b/openlane/yifive/macro/bb/syntacore.v
new file mode 100644
index 0000000..1eb131f
--- /dev/null
+++ b/openlane/yifive/macro/bb/syntacore.v
@@ -0,0 +1,58 @@
+module scr1_top_wb (clk,
+ cpu_rst_n,
+ pwrup_rst_n,
+ rst_n,
+ rtc_clk,
+ soft_irq,
+ test_mode,
+ test_rst_n,
+ wbd_dmem_ack_i,
+ wbd_dmem_err_i,
+ wbd_dmem_stb_o,
+ wbd_dmem_we_o,
+ wbd_imem_ack_i,
+ wbd_imem_err_i,
+ wbd_imem_stb_o,
+ wbd_imem_we_o,
+ VPWR,
+ VGND,
+ fuse_mhartid,
+ irq_lines,
+ wbd_dmem_adr_o,
+ wbd_dmem_dat_i,
+ wbd_dmem_dat_o,
+ wbd_dmem_sel_o,
+ wbd_imem_adr_o,
+ wbd_imem_dat_i,
+ wbd_imem_dat_o,
+ wbd_imem_sel_o);
+ input clk;
+ input cpu_rst_n;
+ input pwrup_rst_n;
+ input rst_n;
+ input rtc_clk;
+ input soft_irq;
+ input test_mode;
+ input test_rst_n;
+ input wbd_dmem_ack_i;
+ input wbd_dmem_err_i;
+ output wbd_dmem_stb_o;
+ output wbd_dmem_we_o;
+ input wbd_imem_ack_i;
+ input wbd_imem_err_i;
+ output wbd_imem_stb_o;
+ output wbd_imem_we_o;
+ input VPWR;
+ input VGND;
+ input [31:0] fuse_mhartid;
+ input [15:0] irq_lines;
+ output [31:0] wbd_dmem_adr_o;
+ input [31:0] wbd_dmem_dat_i;
+ output [31:0] wbd_dmem_dat_o;
+ output [3:0] wbd_dmem_sel_o;
+ output [31:0] wbd_imem_adr_o;
+ input [31:0] wbd_imem_dat_i;
+ output [31:0] wbd_imem_dat_o;
+ output [3:0] wbd_imem_sel_o;
+
+endmodule
diff --git a/openlane/yifive/macro_placement.cfg b/openlane/yifive/macro_placement.cfg
new file mode 100644
index 0000000..7b2d9a8
--- /dev/null
+++ b/openlane/yifive/macro_placement.cfg
@@ -0,0 +1,5 @@
+u_riscv_top 300 1200 N
+u_intercon 300 900 N
+u_sdram_ctrl 1100 300 N
+u_glbl_cfg 2300 300 N
+u_spi_master 200 200 N
diff --git a/openlane/yifive/pdn.tcl b/openlane/yifive/pdn.tcl
new file mode 100644
index 0000000..19314bf
--- /dev/null
+++ b/openlane/yifive/pdn.tcl
@@ -0,0 +1,49 @@
+# SPDX-FileCopyrightText: 2020 Efabless Corporation
+#
+# 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
+
+# Power nets
+set ::power_nets $::env(VDD_PIN)
+set ::ground_nets $::env(GND_PIN)
+
+set ::macro_blockage_layer_list "li1 met1 met2 met3 met4 met5"
+
+pdngen::specify_grid stdcell {
+ name grid
+ rails {
+ met1 {width 0.48 pitch $::env(PLACE_SITE_HEIGHT) offset 0}
+ }
+ straps {
+ met4 {width 1.6 pitch $::env(FP_PDN_VPITCH) offset $::env(FP_PDN_VOFFSET)}
+ met5 {width 1.6 pitch $::env(FP_PDN_HPITCH) offset $::env(FP_PDN_HOFFSET)}
+ }
+ connect {{met1 met4} {met4 met5}}
+}
+
+pdngen::specify_grid macro {
+ power_pins "VPWR"
+ ground_pins "VGND"
+ blockages "li1 met1 met2 met3 met4"
+ straps {
+ }
+ connect {{met4_PIN_ver met5}}
+}
+
+set ::halo 4
+
+# POWER or GROUND #Std. cell rails starting with power or ground rails at the bottom of the core area
+set ::rails_start_with "POWER" ;
+
+# POWER or GROUND #Upper metal stripes starting with power or ground rails at the left/bottom of the core area
+set ::stripes_start_with "POWER" ;
diff --git a/openlane/yifive/pin_order.cfg b/openlane/yifive/pin_order.cfg
index 8128f78..925c4df 100644
--- a/openlane/yifive/pin_order.cfg
+++ b/openlane/yifive/pin_order.cfg
@@ -1,9 +1,128 @@
#BUS_SORT
+#NR
+io_in\[15\]
+io_out\[15\]
+io_oeb\[15\]
+io_in\[16\]
+io_out\[16\]
+io_oeb\[16\]
+io_in\[17\]
+io_out\[17\]
+io_oeb\[17\]
+io_in\[18\]
+io_out\[18\]
+io_oeb\[18\]
+io_in\[19\]
+io_out\[19\]
+io_oeb\[19\]
+io_in\[20\]
+io_out\[20\]
+io_oeb\[20\]
+io_in\[21\]
+io_out\[21\]
+io_oeb\[21\]
+io_in\[22\]
+io_out\[22\]
+io_oeb\[22\]
+io_in\[23\]
+io_out\[23\]
+io_oeb\[23\]
#S
-wb_.*
-wbs_.*
-la_.*
-#N
-io_.*
+wb_.*
+wbd_.*
+la_.*
+rtc_clk
+user_irq.*
+
+#E
+io_in\[0\]
+io_out\[0\]
+io_oeb\[0\]
+io_in\[1\]
+io_out\[1\]
+io_oeb\[1\]
+io_in\[2\]
+io_out\[2\]
+io_oeb\[2\]
+io_in\[3\]
+io_out\[3\]
+io_oeb\[3\]
+io_in\[4\]
+io_out\[4\]
+io_oeb\[4\]
+io_in\[5\]
+io_out\[5\]
+io_oeb\[5\]
+io_in\[6\]
+io_out\[6\]
+io_oeb\[6\]
+io_in\[7\]
+io_out\[7\]
+io_oeb\[7\]
+io_in\[8\]
+io_out\[8\]
+io_oeb\[8\]
+io_in\[9\]
+io_out\[9\]
+io_oeb\[9\]
+io_in\[10\]
+io_out\[10\]
+io_oeb\[10\]
+io_in\[11\]
+io_out\[11\]
+io_oeb\[11\]
+io_in\[12\]
+io_out\[12\]
+io_oeb\[12\]
+io_in\[13\]
+io_out\[13\]
+io_oeb\[13\]
+io_in\[14\]
+io_out\[14\]
+io_oeb\[14\]
+
+#WR
+io_in\[24\]
+io_out\[24\]
+io_oeb\[24\]
+io_in\[25\]
+io_out\[25\]
+io_oeb\[25\]
+io_in\[26\]
+io_out\[26\]
+io_oeb\[26\]
+io_in\[27\]
+io_out\[27\]
+io_oeb\[27\]
+io_in\[28\]
+io_out\[28\]
+io_oeb\[28\]
+io_in\[29\]
+io_out\[29\]
+io_oeb\[29\]
+io_in\[30\]
+io_out\[30\]
+io_oeb\[30\]
+io_in\[31\]
+io_out\[31\]
+io_oeb\[31\]
+io_in\[32\]
+io_out\[32\]
+io_oeb\[32\]
+io_in\[33\]
+io_out\[33\]
+io_oeb\[33\]
+io_in\[34\]
+io_out\[34\]
+io_oeb\[34\]
+io_in\[35\]
+io_out\[35\]
+io_oeb\[35\]
+io_in\[36\]
+io_out\[36\]
+io_oeb\[36\]
+io_in\[37\]
+io_out\[37\]
+io_oeb\[37\]
diff --git a/read.me b/read.me
deleted file mode 100644
index 50e0e30..0000000
--- a/read.me
+++ /dev/null
@@ -1,6 +0,0 @@
-
-# To run the sim for wishbone register access
-make verify-wb_port
-
-#To run the sim for Risc Hello
-make verify-risc_hello
diff --git a/signoff/glbl_cfg/OPENLANE_VERSION b/signoff/glbl_cfg/OPENLANE_VERSION
new file mode 100644
index 0000000..a2633b1
--- /dev/null
+++ b/signoff/glbl_cfg/OPENLANE_VERSION
@@ -0,0 +1 @@
+openlane rc7
diff --git a/signoff/glbl_cfg/PDK_SOURCES b/signoff/glbl_cfg/PDK_SOURCES
new file mode 100644
index 0000000..8b58bd5
--- /dev/null
+++ b/signoff/glbl_cfg/PDK_SOURCES
@@ -0,0 +1,6 @@
+-ne openlane
+a68c95289612a361870acedb7f6478fcfae32e49
+-ne skywater-pdk
+f6f76f3dc99526c6fc2cfede19b5b1227d4ebde7
+-ne open_pdks
+522a373441a865fee9d6e3783015b4445f11afe6
diff --git a/signoff/glbl_cfg/final_summary_report.csv b/signoff/glbl_cfg/final_summary_report.csv
new file mode 100644
index 0000000..c2ec988
--- /dev/null
+++ b/signoff/glbl_cfg/final_summary_report.csv
@@ -0,0 +1,2 @@
+,design,design_name,config,flow_status,total_runtime,routed_runtime,(Cell/mm^2)/Core_Util,DIEAREA_mm^2,CellPer_mm^2,OpenDP_Util,Peak_Memory_Usage_MB,cell_count,tritonRoute_violations,Short_violations,MetSpc_violations,OffGrid_violations,MinHole_violations,Other_violations,Magic_violations,antenna_violations,lvs_total_errors,cvc_total_errors,klayout_violations,wire_length,vias,wns,pl_wns,optimized_wns,fastroute_wns,spef_wns,tns,pl_tns,optimized_tns,fastroute_tns,spef_tns,HPWL,routing_layer1_pct,routing_layer2_pct,routing_layer3_pct,routing_layer4_pct,routing_layer5_pct,routing_layer6_pct,wires_count,wire_bits,public_wires_count,public_wire_bits,memories_count,memory_bits,processes_count,cells_pre_abc,AND,DFF,NAND,NOR,OR,XOR,XNOR,MUX,inputs,outputs,level,EndCaps,TapCells,Diodes,Total_Physical_Cells,suggested_clock_frequency,suggested_clock_period,CLOCK_PERIOD,SYNTH_STRATEGY,SYNTH_MAX_FANOUT,FP_CORE_UTIL,FP_ASPECT_RATIO,FP_PDN_VPITCH,FP_PDN_HPITCH,PL_TARGET_DENSITY,GLB_RT_ADJUSTMENT,STD_CELL_LIBRARY,CELL_PAD,DIODE_INSERTION_STRATEGY
+0,/project/openlane/glbl_cfg,glbl_cfg,glbl_cfg,Flow_completed,0h5m29s,0h4m0s,58333.33333333334,0.09,29166.66666666667,48,595.32,2625,0,0,0,0,0,0,0,9,0,0,0,112279,21278,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,81244573,0.0,28.2,24.76,3.22,-1,-1,2478,2670,463,655,0,0,0,2625,1,0,3,1,468,0,0,560,577,533,10,212,1078,10,1300,100.0,10.0,10,AREA 0,5,50,1,80,10.8,0.9,0,sky130_fd_sc_hd,0,3
diff --git a/signoff/sdram/final_summary_report.csv b/signoff/sdram/final_summary_report.csv
index b86c95b..3fff53d 100644
--- a/signoff/sdram/final_summary_report.csv
+++ b/signoff/sdram/final_summary_report.csv
@@ -1,2 +1,2 @@
,design,design_name,config,flow_status,total_runtime,routed_runtime,(Cell/mm^2)/Core_Util,DIEAREA_mm^2,CellPer_mm^2,OpenDP_Util,Peak_Memory_Usage_MB,cell_count,tritonRoute_violations,Short_violations,MetSpc_violations,OffGrid_violations,MinHole_violations,Other_violations,Magic_violations,antenna_violations,lvs_total_errors,cvc_total_errors,klayout_violations,wire_length,vias,wns,pl_wns,optimized_wns,fastroute_wns,spef_wns,tns,pl_tns,optimized_tns,fastroute_tns,spef_tns,HPWL,routing_layer1_pct,routing_layer2_pct,routing_layer3_pct,routing_layer4_pct,routing_layer5_pct,routing_layer6_pct,wires_count,wire_bits,public_wires_count,public_wire_bits,memories_count,memory_bits,processes_count,cells_pre_abc,AND,DFF,NAND,NOR,OR,XOR,XNOR,MUX,inputs,outputs,level,EndCaps,TapCells,Diodes,Total_Physical_Cells,suggested_clock_frequency,suggested_clock_period,CLOCK_PERIOD,SYNTH_STRATEGY,SYNTH_MAX_FANOUT,FP_CORE_UTIL,FP_ASPECT_RATIO,FP_PDN_VPITCH,FP_PDN_HPITCH,PL_TARGET_DENSITY,GLB_RT_ADJUSTMENT,STD_CELL_LIBRARY,CELL_PAD,DIODE_INSERTION_STRATEGY
-0,/project/openlane/sdram,sdrc_top,sdram,Flow_completed,0h8m25s,0h4m36s,43346.66666666667,0.3,21673.333333333336,30,612.11,6502,0,0,0,0,0,0,0,50,0,0,0,373862,49373,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,320796393,0.0,41.88,12.09,12.26,0.0,0.0,6477,6647,1150,1320,0,0,0,6502,131,107,82,107,352,213,29,2197,1190,1123,28,204,3638,0,3842,100.0,10.0,10,AREA 0,5,50,1,153.6,153.18,0.4,0,sky130_fd_sc_hd,4,0
+0,/project/openlane/sdram,sdrc_top,sdram,Flow_completed,0h7m32s,0h4m3s,43333.333333333336,0.3,21666.666666666668,30,603.28,6500,0,0,0,0,0,0,0,43,0,0,0,362096,48694,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,313618208,0.0,40.99,11.75,11.06,0.0,-1,6475,6645,1150,1320,0,0,0,6500,130,107,82,102,354,211,31,2197,1190,1123,28,204,3638,0,3842,100.0,10.0,10,AREA 0,5,50,1,153.6,153.18,0.4,0,sky130_fd_sc_hd,4,0
diff --git a/signoff/spi_master/OPENLANE_VERSION b/signoff/spi_master/OPENLANE_VERSION
new file mode 100644
index 0000000..a2633b1
--- /dev/null
+++ b/signoff/spi_master/OPENLANE_VERSION
@@ -0,0 +1 @@
+openlane rc7
diff --git a/signoff/spi_master/PDK_SOURCES b/signoff/spi_master/PDK_SOURCES
new file mode 100644
index 0000000..8b58bd5
--- /dev/null
+++ b/signoff/spi_master/PDK_SOURCES
@@ -0,0 +1,6 @@
+-ne openlane
+a68c95289612a361870acedb7f6478fcfae32e49
+-ne skywater-pdk
+f6f76f3dc99526c6fc2cfede19b5b1227d4ebde7
+-ne open_pdks
+522a373441a865fee9d6e3783015b4445f11afe6
diff --git a/signoff/spi_master/final_summary_report.csv b/signoff/spi_master/final_summary_report.csv
new file mode 100644
index 0000000..7325d8c
--- /dev/null
+++ b/signoff/spi_master/final_summary_report.csv
@@ -0,0 +1,2 @@
+,design,design_name,config,flow_status,total_runtime,routed_runtime,(Cell/mm^2)/Core_Util,DIEAREA_mm^2,CellPer_mm^2,OpenDP_Util,Peak_Memory_Usage_MB,cell_count,tritonRoute_violations,Short_violations,MetSpc_violations,OffGrid_violations,MinHole_violations,Other_violations,Magic_violations,antenna_violations,lvs_total_errors,cvc_total_errors,klayout_violations,wire_length,vias,wns,pl_wns,optimized_wns,fastroute_wns,spef_wns,tns,pl_tns,optimized_tns,fastroute_tns,spef_tns,HPWL,routing_layer1_pct,routing_layer2_pct,routing_layer3_pct,routing_layer4_pct,routing_layer5_pct,routing_layer6_pct,wires_count,wire_bits,public_wires_count,public_wire_bits,memories_count,memory_bits,processes_count,cells_pre_abc,AND,DFF,NAND,NOR,OR,XOR,XNOR,MUX,inputs,outputs,level,EndCaps,TapCells,Diodes,Total_Physical_Cells,suggested_clock_frequency,suggested_clock_period,CLOCK_PERIOD,SYNTH_STRATEGY,SYNTH_MAX_FANOUT,FP_CORE_UTIL,FP_ASPECT_RATIO,FP_PDN_VPITCH,FP_PDN_HPITCH,PL_TARGET_DENSITY,GLB_RT_ADJUSTMENT,STD_CELL_LIBRARY,CELL_PAD,DIODE_INSERTION_STRATEGY
+0,/project/openlane/spi_master,spim_top,spi_master,Flow_completed,0h7m4s,0h4m20s,19293.333333333336,0.3,9646.666666666668,15,567.92,2894,0,0,0,0,0,0,1,5,1,0,0,150790,24828,-1.25,-1.25,-1.79,-1.79,-2.3,-107.03,-107.03,-394.49,-394.49,-544.26,121832965,0.0,12.02,8.74,0.89,0.0,-1,2872,2970,449,547,0,0,0,2894,85,0,95,81,1125,90,20,923,529,465,27,358,3708,13,4079,81.30081300813008,12.3,10,AREA 0,5,50,1,153.6,153.18,0.4,0,sky130_fd_sc_hd,0,3
diff --git a/signoff/syntacore/final_summary_report.csv b/signoff/syntacore/final_summary_report.csv
index eb76ee8..c99599e 100644
--- a/signoff/syntacore/final_summary_report.csv
+++ b/signoff/syntacore/final_summary_report.csv
@@ -1,2 +1,2 @@
,design,design_name,config,flow_status,total_runtime,routed_runtime,(Cell/mm^2)/Core_Util,DIEAREA_mm^2,CellPer_mm^2,OpenDP_Util,Peak_Memory_Usage_MB,cell_count,tritonRoute_violations,Short_violations,MetSpc_violations,OffGrid_violations,MinHole_violations,Other_violations,Magic_violations,antenna_violations,lvs_total_errors,cvc_total_errors,klayout_violations,wire_length,vias,wns,pl_wns,optimized_wns,fastroute_wns,spef_wns,tns,pl_tns,optimized_tns,fastroute_tns,spef_tns,HPWL,routing_layer1_pct,routing_layer2_pct,routing_layer3_pct,routing_layer4_pct,routing_layer5_pct,routing_layer6_pct,wires_count,wire_bits,public_wires_count,public_wire_bits,memories_count,memory_bits,processes_count,cells_pre_abc,AND,DFF,NAND,NOR,OR,XOR,XNOR,MUX,inputs,outputs,level,EndCaps,TapCells,Diodes,Total_Physical_Cells,suggested_clock_frequency,suggested_clock_period,CLOCK_PERIOD,SYNTH_STRATEGY,SYNTH_MAX_FANOUT,FP_CORE_UTIL,FP_ASPECT_RATIO,FP_PDN_VPITCH,FP_PDN_HPITCH,PL_TARGET_DENSITY,GLB_RT_ADJUSTMENT,STD_CELL_LIBRARY,CELL_PAD,DIODE_INSERTION_STRATEGY
-0,/project/openlane/syntacore,scr1_top_wb,syntacore,Flow_completed,4h25m58s,0h24m27s,14261.866666666665,3.75,7130.9333333333325,9,1835.44,26741,0,0,0,0,0,0,0,386,0,0,0,2348462,220538,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,2088019437,0.0,20.65,8.72,3.4,0.0,0.0,26627,26865,2336,2574,0,0,0,26741,509,0,694,1902,3881,2196,1040,6600,2386,2349,98,1086,48226,0,49312,20.0,50.0,50,AREA 0,5,50,1,153.6,153.18,0.2,0,sky130_fd_sc_hd,4,0
+0,/project/openlane/syntacore,scr1_top_wb,syntacore,Flow_completed,1h35m28s,0h27m5s,29668.888888888887,1.8,14834.444444444443,20,1125.28,26702,0,0,0,0,0,0,0,69,0,0,0,1591280,222490,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1348931410,0.0,19.87,15.65,3.42,0.14,-1,26588,26826,2335,2573,0,0,0,26702,508,0,693,1900,3881,2188,1037,6599,2386,2349,100,866,22835,255,23956,20.0,50.0,50,AREA 0,5,50,1,153.6,153.18,0.4,0,sky130_fd_sc_hd,4,3
diff --git a/signoff/user_project_wrapper/OPENLANE_VERSION b/signoff/user_project_wrapper/OPENLANE_VERSION
new file mode 100644
index 0000000..a2633b1
--- /dev/null
+++ b/signoff/user_project_wrapper/OPENLANE_VERSION
@@ -0,0 +1 @@
+openlane rc7
diff --git a/signoff/user_project_wrapper/PDK_SOURCES b/signoff/user_project_wrapper/PDK_SOURCES
new file mode 100644
index 0000000..8b58bd5
--- /dev/null
+++ b/signoff/user_project_wrapper/PDK_SOURCES
@@ -0,0 +1,6 @@
+-ne openlane
+a68c95289612a361870acedb7f6478fcfae32e49
+-ne skywater-pdk
+f6f76f3dc99526c6fc2cfede19b5b1227d4ebde7
+-ne open_pdks
+522a373441a865fee9d6e3783015b4445f11afe6
diff --git a/signoff/user_project_wrapper/final_summary_report.csv b/signoff/user_project_wrapper/final_summary_report.csv
new file mode 100644
index 0000000..5246de2
--- /dev/null
+++ b/signoff/user_project_wrapper/final_summary_report.csv
@@ -0,0 +1,2 @@
+,design,design_name,config,flow_status,total_runtime,routed_runtime,(Cell/mm^2)/Core_Util,DIEAREA_mm^2,CellPer_mm^2,OpenDP_Util,Peak_Memory_Usage_MB,cell_count,tritonRoute_violations,Short_violations,MetSpc_violations,OffGrid_violations,MinHole_violations,Other_violations,Magic_violations,antenna_violations,lvs_total_errors,cvc_total_errors,klayout_violations,wire_length,vias,wns,pl_wns,optimized_wns,fastroute_wns,spef_wns,tns,pl_tns,optimized_tns,fastroute_tns,spef_tns,HPWL,routing_layer1_pct,routing_layer2_pct,routing_layer3_pct,routing_layer4_pct,routing_layer5_pct,routing_layer6_pct,wires_count,wire_bits,public_wires_count,public_wire_bits,memories_count,memory_bits,processes_count,cells_pre_abc,AND,DFF,NAND,NOR,OR,XOR,XNOR,MUX,inputs,outputs,level,EndCaps,TapCells,Diodes,Total_Physical_Cells,suggested_clock_frequency,suggested_clock_period,CLOCK_PERIOD,SYNTH_STRATEGY,SYNTH_MAX_FANOUT,FP_CORE_UTIL,FP_ASPECT_RATIO,FP_PDN_VPITCH,FP_PDN_HPITCH,PL_TARGET_DENSITY,GLB_RT_ADJUSTMENT,STD_CELL_LIBRARY,CELL_PAD,DIODE_INSERTION_STRATEGY
+0,/project/openlane/user_project_wrapper,user_project_wrapper,user_project_wrapper,Flow_completed,0h34m28s,0h2m12s,37.943648816936495,10.2784,18.971824408468247,0,585.11,195,0,0,0,0,0,0,74835,13,226,-1,2,898598,4357,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,895585866,0.0,1.19,1.92,1.26,2.19,-1,684,1302,676,1294,0,0,0,195,0,0,0,0,0,0,0,0,2,2,1,0,0,0,0,100.0,10.0,10,AREA 0,5,50,1,180,180,0.55,0,sky130_fd_sc_hd,4,0
diff --git a/signoff/wb_interconnect/OPENLANE_VERSION b/signoff/wb_interconnect/OPENLANE_VERSION
new file mode 100644
index 0000000..a2633b1
--- /dev/null
+++ b/signoff/wb_interconnect/OPENLANE_VERSION
@@ -0,0 +1 @@
+openlane rc7
diff --git a/signoff/wb_interconnect/PDK_SOURCES b/signoff/wb_interconnect/PDK_SOURCES
new file mode 100644
index 0000000..8b58bd5
--- /dev/null
+++ b/signoff/wb_interconnect/PDK_SOURCES
@@ -0,0 +1,6 @@
+-ne openlane
+a68c95289612a361870acedb7f6478fcfae32e49
+-ne skywater-pdk
+f6f76f3dc99526c6fc2cfede19b5b1227d4ebde7
+-ne open_pdks
+522a373441a865fee9d6e3783015b4445f11afe6
diff --git a/signoff/wb_interconnect/final_summary_report.csv b/signoff/wb_interconnect/final_summary_report.csv
new file mode 100644
index 0000000..7b324d7
--- /dev/null
+++ b/signoff/wb_interconnect/final_summary_report.csv
@@ -0,0 +1,2 @@
+,design,design_name,config,flow_status,total_runtime,routed_runtime,(Cell/mm^2)/Core_Util,DIEAREA_mm^2,CellPer_mm^2,OpenDP_Util,Peak_Memory_Usage_MB,cell_count,tritonRoute_violations,Short_violations,MetSpc_violations,OffGrid_violations,MinHole_violations,Other_violations,Magic_violations,antenna_violations,lvs_total_errors,cvc_total_errors,klayout_violations,wire_length,vias,wns,pl_wns,optimized_wns,fastroute_wns,spef_wns,tns,pl_tns,optimized_tns,fastroute_tns,spef_tns,HPWL,routing_layer1_pct,routing_layer2_pct,routing_layer3_pct,routing_layer4_pct,routing_layer5_pct,routing_layer6_pct,wires_count,wire_bits,public_wires_count,public_wire_bits,memories_count,memory_bits,processes_count,cells_pre_abc,AND,DFF,NAND,NOR,OR,XOR,XNOR,MUX,inputs,outputs,level,EndCaps,TapCells,Diodes,Total_Physical_Cells,suggested_clock_frequency,suggested_clock_period,CLOCK_PERIOD,SYNTH_STRATEGY,SYNTH_MAX_FANOUT,FP_CORE_UTIL,FP_ASPECT_RATIO,FP_PDN_VPITCH,FP_PDN_HPITCH,PL_TARGET_DENSITY,GLB_RT_ADJUSTMENT,STD_CELL_LIBRARY,CELL_PAD,DIODE_INSERTION_STRATEGY
+0,/project/openlane/wb_interconnect,wb_interconnect,wb_interconnect,Flow_completed,0h5m21s,0h3m7s,7321.739130434781,0.23,3660.8695652173906,4,510.27,842,0,0,0,0,0,0,0,14,0,0,0,399186,10637,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,371301320,0.0,48.62,5.88,23.46,-1,-1,583,1159,59,635,0,0,0,842,146,0,3,75,33,0,0,107,318,318,14,64,2750,195,3009,100.0,10.0,10,AREA 0,5,50,1,80,10.8,0.9,0,sky130_fd_sc_hd,0,3
diff --git a/verilog/dv/risc_boot/risc_boot.c b/verilog/dv/risc_boot/risc_boot.c
index d042822..f0d8010 100644
--- a/verilog/dv/risc_boot/risc_boot.c
+++ b/verilog/dv/risc_boot/risc_boot.c
@@ -170,7 +170,6 @@
// Add some delay for user core to boot
for(i = 0; i < 40; i ++);
- for(i = 0; i < 40; i ++);
if(reg_mprj_globl_reg6 != 0x11223344) bFail = 1;
if(reg_mprj_globl_reg7 != 0x22334455) bFail = 1;
diff --git a/verilog/dv/risc_boot/risc_boot.hex b/verilog/dv/risc_boot/risc_boot.hex
new file mode 100755
index 0000000..3a5d43e
--- /dev/null
+++ b/verilog/dv/risc_boot/risc_boot.hex
@@ -0,0 +1,125 @@
+@00000000
+93 00 00 00 93 01 00 00 13 02 00 00 93 02 00 00
+13 03 00 00 93 03 00 00 13 04 00 00 93 04 00 00
+13 05 00 00 93 05 00 00 13 06 00 00 93 06 00 00
+13 07 00 00 93 07 00 00 13 08 00 00 93 08 00 00
+13 09 00 00 93 09 00 00 13 0A 00 00 93 0A 00 00
+13 0B 00 00 93 0B 00 00 13 0C 00 00 93 0C 00 00
+13 0D 00 00 93 0D 00 00 13 0E 00 00 93 0E 00 00
+13 0F 00 00 93 0F 00 00 17 05 00 00 13 05 05 74
+93 05 00 00 13 06 00 00 63 D8 C5 00 14 41 94 C1
+11 05 91 05 E3 CC C5 FE 13 05 00 00 93 05 80 00
+63 57 B5 00 23 20 05 00 11 05 E3 4D B5 FE 11 22
+01 A0 01 00 B7 02 00 28 13 03 00 12 23 90 62 00
+A3 81 02 00 05 C6 21 4F 93 73 F6 0F 93 DE 73 00
+23 80 D2 01 93 EE 0E 01 23 80 D2 01 86 03 93 F3
+F3 0F 7D 1F E3 14 0F FE 23 80 62 00 A1 C9 13 0F
+00 02 83 23 05 00 A1 4F 93 DE F3 01 23 80 D2 01
+93 EE 0E 01 23 80 D2 01 83 CE 02 00 93 FE 2E 00
+93 DE 1E 00 86 03 B3 E3 D3 01 7D 1F 63 17 0F 00
+23 20 75 00 11 05 83 23 05 00 FD 1F E3 96 0F FC
+FD 15 F1 F1 63 04 0F 00 23 20 75 00 13 03 00 08
+A3 81 62 00 82 80 01 00 00 00 01 11 06 CE 22 CC
+00 10 AA 87 A3 07 F4 FE 03 47 F4 FE A9 47 63 14
+F7 00 35 45 DD 37 B7 07 00 20 91 07 03 47 F4 FE
+98 C3 01 00 F2 40 62 44 05 61 82 80 01 11 06 CE
+22 CC 00 10 23 26 A4 FE 19 A8 83 27 C4 FE 13 87
+17 00 23 26 E4 FE 83 C7 07 00 3E 85 7D 37 83 27
+C4 FE 83 C7 07 00 F5 F3 01 00 F2 40 62 44 05 61
+82 80 01 11 22 CE 00 10 23 26 04 FE B7 07 00 24
+29 67 09 07 98 C3 B7 07 00 26 93 87 07 0A 09 67
+13 07 97 80 98 C3 B7 07 00 26 93 87 C7 09 09 67
+13 07 97 80 98 C3 B7 07 00 26 93 87 87 09 09 67
+13 07 97 80 98 C3 B7 07 00 26 93 87 47 09 09 67
+13 07 97 80 98 C3 B7 07 00 26 93 87 07 09 09 67
+13 07 97 80 98 C3 B7 07 00 26 93 87 C7 08 09 67
+13 07 97 80 98 C3 B7 07 00 26 93 87 87 08 09 67
+13 07 97 80 98 C3 B7 07 00 26 93 87 47 08 09 67
+13 07 97 80 98 C3 B7 07 00 26 93 87 07 08 09 67
+13 07 97 80 98 C3 B7 07 00 26 93 87 C7 07 09 67
+13 07 97 80 98 C3 B7 07 00 26 93 87 87 07 09 67
+13 07 97 80 98 C3 B7 07 00 26 93 87 47 07 09 67
+13 07 97 80 98 C3 B7 07 00 26 93 87 07 07 09 67
+13 07 97 80 98 C3 B7 07 00 26 93 87 C7 06 09 67
+13 07 97 80 98 C3 B7 07 00 26 93 87 87 06 09 67
+13 07 97 80 98 C3 B7 07 00 26 93 87 47 06 09 67
+13 07 97 80 98 C3 B7 07 00 26 05 47 98 C3 01 00
+B7 07 00 26 98 43 85 47 E3 0C F7 FE B7 07 00 25
+13 87 87 02 FD 57 1C C3 37 07 00 25 61 07 1C C3
+B7 07 00 26 B1 07 37 07 60 AB 98 C3 B7 07 00 26
+93 87 87 0B 09 67 13 07 07 C0 98 C3 B7 07 00 26
+93 87 47 0B 09 67 13 07 07 C0 98 C3 B7 07 00 26
+93 87 07 0B 09 67 13 07 07 C0 98 C3 B7 07 00 26
+93 87 C7 0A 09 67 13 07 07 C0 98 C3 B7 07 00 26
+93 87 87 0A 09 67 13 07 07 C0 98 C3 B7 07 00 26
+93 87 47 0A 09 67 13 07 07 C0 98 C3 B7 07 00 26
+93 87 07 0A 09 67 13 07 07 C0 98 C3 B7 07 00 26
+93 87 C7 09 09 67 13 07 07 C0 98 C3 B7 07 00 26
+93 87 87 09 09 67 13 07 07 C0 98 C3 B7 07 00 26
+93 87 47 09 09 67 13 07 07 C0 98 C3 B7 07 00 26
+93 87 07 09 09 67 13 07 07 C0 98 C3 B7 07 00 26
+93 87 C7 08 09 67 13 07 07 C0 98 C3 B7 07 00 26
+93 87 87 08 09 67 13 07 07 C0 98 C3 B7 07 00 26
+93 87 47 08 09 67 13 07 07 C0 98 C3 B7 07 00 26
+93 87 07 08 09 67 13 07 07 C0 98 C3 B7 07 00 26
+93 87 C7 07 09 67 13 07 07 C0 98 C3 B7 07 00 26
+93 87 87 07 09 67 13 07 07 C0 98 C3 B7 07 00 26
+93 87 47 07 09 67 13 07 07 C0 98 C3 B7 07 00 26
+93 87 07 07 09 67 13 07 07 C0 98 C3 B7 07 00 26
+93 87 C7 06 09 67 13 07 07 C0 98 C3 B7 07 00 26
+93 87 87 06 09 67 13 07 07 C0 98 C3 B7 07 00 26
+93 87 47 06 09 67 13 07 07 C0 98 C3 B7 07 00 26
+93 87 07 06 09 67 13 07 07 C0 98 C3 B7 07 00 26
+93 87 C7 05 09 67 13 07 07 C0 98 C3 B7 07 00 26
+93 87 87 05 09 67 13 07 07 C0 98 C3 B7 07 00 26
+93 87 47 05 09 67 13 07 07 C0 98 C3 B7 07 00 26
+93 87 07 05 09 67 13 07 07 C0 98 C3 B7 07 00 26
+93 87 C7 04 09 67 13 07 07 C0 98 C3 B7 07 00 26
+93 87 87 04 09 67 13 07 07 C0 98 C3 B7 07 00 26
+93 87 47 04 09 67 13 07 07 C0 98 C3 B7 07 00 26
+93 87 07 04 09 67 13 07 07 C0 98 C3 B7 07 00 26
+93 87 C7 03 09 67 13 07 07 C0 98 C3 B7 07 00 26
+93 87 87 03 09 67 13 07 07 C0 98 C3 B7 07 00 26
+93 87 47 03 09 67 13 07 07 C0 98 C3 B7 07 00 26
+93 87 07 03 09 67 13 07 07 C0 98 C3 B7 07 00 26
+93 87 C7 02 09 67 13 07 07 C0 98 C3 B7 07 00 26
+93 87 87 02 09 67 13 07 07 C0 98 C3 B7 07 00 26
+93 87 47 02 09 67 13 07 07 C0 98 C3 B7 07 00 26
+05 47 98 C3 01 00 B7 07 00 26 98 43 85 47 E3 0C
+F7 FE B7 07 00 30 D1 07 37 07 00 01 13 07 E7 19
+98 C3 B7 07 00 30 C1 07 37 27 17 2F 13 07 27 24
+98 C3 B7 07 00 30 1D 47 98 C3 23 20 00 00 39 A0
+83 27 00 00 13 87 17 00 23 20 E0 00 03 27 00 00
+93 07 70 02 E3 D6 E7 FE 23 20 00 00 39 A0 83 27
+00 00 13 87 17 00 23 20 E0 00 03 27 00 00 93 07
+70 02 E3 D6 E7 FE B7 07 00 30 E1 07 98 43 B7 37
+22 11 93 87 47 34 63 05 F7 00 85 47 23 26 F4 FE
+B7 07 00 30 F1 07 98 43 B7 47 33 22 93 87 57 45
+63 05 F7 00 85 47 23 26 F4 FE B7 07 00 30 93 87
+07 02 98 43 B7 57 44 33 93 87 67 56 63 05 F7 00
+85 47 23 26 F4 FE B7 07 00 30 93 87 47 02 98 43
+B7 67 55 44 93 87 77 67 63 05 F7 00 85 47 23 26
+F4 FE B7 07 00 30 93 87 87 02 98 43 B7 77 66 55
+93 87 87 78 63 05 F7 00 85 47 23 26 F4 FE B7 07
+00 30 93 87 C7 02 98 43 B7 97 77 66 93 87 97 89
+63 05 F7 00 85 47 23 26 F4 FE 83 27 C4 FE 81 EB
+B7 07 00 26 B1 07 37 07 61 AB 98 C3 39 A0 B7 07
+00 26 B1 07 37 07 60 AB 98 C3 B7 07 00 26 93 87
+07 0A 09 67 13 07 97 80 98 C3 B7 07 00 26 93 87
+C7 09 09 67 13 07 97 80 98 C3 B7 07 00 26 93 87
+87 09 09 67 13 07 97 80 98 C3 B7 07 00 26 93 87
+47 09 09 67 13 07 97 80 98 C3 B7 07 00 26 93 87
+07 09 09 67 13 07 97 80 98 C3 B7 07 00 26 93 87
+C7 08 09 67 13 07 97 80 98 C3 B7 07 00 26 93 87
+87 08 09 67 13 07 97 80 98 C3 B7 07 00 26 93 87
+47 08 09 67 13 07 97 80 98 C3 B7 07 00 26 93 87
+07 08 09 67 13 07 97 80 98 C3 B7 07 00 26 93 87
+C7 07 09 67 13 07 97 80 98 C3 B7 07 00 26 93 87
+87 07 09 67 13 07 97 80 98 C3 B7 07 00 26 93 87
+47 07 09 67 13 07 97 80 98 C3 B7 07 00 26 93 87
+07 07 09 67 13 07 97 80 98 C3 B7 07 00 26 93 87
+C7 06 09 67 13 07 97 80 98 C3 B7 07 00 26 93 87
+87 06 09 67 13 07 97 80 98 C3 B7 07 00 26 93 87
+47 06 09 67 13 07 97 80 98 C3 B7 07 00 26 05 47
+98 C3 01 00 B7 07 00 26 98 43 85 47 E3 0C F7 FE
+01 00 72 44 05 61 82 80
diff --git a/verilog/dv/risc_boot/risc_boot_tb.v b/verilog/dv/risc_boot/risc_boot_tb.v
index 80c7d98..fe5a499 100644
--- a/verilog/dv/risc_boot/risc_boot_tb.v
+++ b/verilog/dv/risc_boot/risc_boot_tb.v
@@ -91,7 +91,7 @@
$dumpfile("simx.vcd");
$dumpvars(1,risc_boot_tb);
//$dumpvars(2,risc_boot_tb.uut);
- $dumpvars(1,risc_boot_tb.uut.mprj.u_core);
+ $dumpvars(4,risc_boot_tb.uut.mprj.u_core);
//$dumpvars(0,risc_boot_tb.u_user_spiflash);
$display("Waveform Dump started");
end
@@ -100,7 +100,7 @@
initial begin
// Repeat cycles of 1000 clock edges as needed to complete testbench
- repeat (600) begin
+ repeat (200) begin
repeat (1000) @(posedge clock);
// $display("+1000 cycles");
end
diff --git a/verilog/dv/risc_boot/run_iverilog b/verilog/dv/risc_boot/run_iverilog
index 0cafcde..65f8bd5 100755
--- a/verilog/dv/risc_boot/run_iverilog
+++ b/verilog/dv/risc_boot/run_iverilog
@@ -1,6 +1,6 @@
#add -DWFDUMP to enable waveform dump
-iverilog -g2005-sv -DFUNCTIONAL -DSIM -I $PDK_PATH \
+iverilog -DWFDUMP -g2005-sv -DFUNCTIONAL -DSIM -I $PDK_PATH \
-I $CARAVEL_ROOT/verilog/dv/caravel -I $CARAVEL_ROOT/verilog/rtl \
-I ../model -I ../../../verilog/rtl \
-I ../../../verilog/rtl/syntacore/scr1/src/includes -I ../../../verilog/rtl/sdram_ctrl/src/defs \
diff --git a/verilog/dv/risc_boot/user_risc_boot.hex b/verilog/dv/risc_boot/user_risc_boot.hex
index 1fdd96c..5ab43fa 100755
--- a/verilog/dv/risc_boot/user_risc_boot.hex
+++ b/verilog/dv/risc_boot/user_risc_boot.hex
@@ -38,20 +38,20 @@
93 08 00 00 13 09 00 00 93 09 00 00 13 0A 00 00
93 0A 00 00 13 0B 00 00 93 0B 00 00 13 0C 00 00
93 0C 00 00 13 0D 00 00 93 0D 00 00 13 0E 00 00
-93 0E 00 00 13 0F 00 00 93 0F 00 00 97 01 48 00
-93 81 41 62 13 05 00 40 97 05 48 00 93 85 85 D7
-17 06 48 00 13 06 06 E3 63 0D B5 00 29 A0 14 41
-94 C1 11 05 91 05 E3 9C C5 FE 17 06 48 00 13 06
-66 E1 97 05 48 00 93 85 E5 E0 21 A0 23 20 06 00
-11 06 E3 9D C5 FE 17 01 49 00 13 01 A1 D3 17 05
-48 00 13 05 25 DF 17 06 48 00 13 06 A6 DE B3 05
-A6 40 17 07 49 00 13 07 E7 91 33 02 B7 40 92 85
-17 06 48 00 13 06 06 DD 29 A0 14 41 94 C1 11 05
+93 0E 00 00 13 0F 00 00 93 0F 00 00 97 01 00 20
+93 81 41 62 13 05 00 40 97 05 00 20 93 85 85 D7
+17 06 00 20 13 06 06 E3 63 0D B5 00 29 A0 14 41
+94 C1 11 05 91 05 E3 9C C5 FE 17 06 00 20 13 06
+66 E1 97 05 00 20 93 85 E5 E0 21 A0 23 20 06 00
+11 06 E3 9D C5 FE 17 01 01 20 13 01 A1 D3 17 05
+00 20 13 05 25 DF 17 06 00 20 13 06 A6 DE B3 05
+A6 40 17 07 01 20 13 07 E7 91 33 02 B7 40 92 85
+17 06 00 20 13 06 06 DD 29 A0 14 41 94 C1 11 05
91 05 E3 1C C5 FE 21 A0 23 A0 05 00 91 05 E3 9D
E5 FE B7 02 49 00 05 43 23 A0 62 00 B7 02 49 00
91 02 13 03 30 06 23 A0 62 00 B7 02 49 00 C1 02
7D 53 23 A0 62 00 23 A2 62 00 01 45 81 45 97 02
-48 00 E7 80 22 CC 97 02 48 00 93 82 A2 D1 6D 71
+00 20 E7 80 22 CC 97 02 00 20 93 82 A2 D1 6D 71
06 C2 0A C4 0E C6 12 C8 16 CA 1A CC 1E CE 22 D0
26 D2 2A D4 2E D6 32 D8 36 DA 3A DC 3E DE C2 C0
C6 C2 CA C4 CE C6 D2 C8 D6 CA DA CC DE CE E2 D0
@@ -70,7 +70,7 @@
66 55 D4 D3 93 08 88 78 37 9E 77 66 23 A4 17 03
93 0E 9E 89 23 A6 D7 03 01 A0 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
-97 02 B8 FF 93 82 42 09 82 82 13 00 00 00 13 00
+97 02 00 E0 93 82 42 09 82 82 13 00 00 00 13 00
00 00 13 00 00 00 13 00 00 00 13 00 00 00 01 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
diff --git a/verilog/dv/user_risc_boot/uprj_netlists.v b/verilog/dv/user_risc_boot/uprj_netlists.v
index 45af4a9..fe938c1 100644
--- a/verilog/dv/user_risc_boot/uprj_netlists.v
+++ b/verilog/dv/user_risc_boot/uprj_netlists.v
@@ -38,6 +38,7 @@
`include "digital_core/src/glbl_cfg.sv"
`include "digital_core/src/digital_core.sv"
+ `include "lib/wb_stagging.sv"
`include "wb_interconnect/src/wb_arb.sv"
`include "wb_interconnect/src/wb_interconnect.sv"
diff --git a/verilog/dv/user_risc_boot/user_risc_boot.hex b/verilog/dv/user_risc_boot/user_risc_boot.hex
index 1fdd96c..5ab43fa 100755
--- a/verilog/dv/user_risc_boot/user_risc_boot.hex
+++ b/verilog/dv/user_risc_boot/user_risc_boot.hex
@@ -38,20 +38,20 @@
93 08 00 00 13 09 00 00 93 09 00 00 13 0A 00 00
93 0A 00 00 13 0B 00 00 93 0B 00 00 13 0C 00 00
93 0C 00 00 13 0D 00 00 93 0D 00 00 13 0E 00 00
-93 0E 00 00 13 0F 00 00 93 0F 00 00 97 01 48 00
-93 81 41 62 13 05 00 40 97 05 48 00 93 85 85 D7
-17 06 48 00 13 06 06 E3 63 0D B5 00 29 A0 14 41
-94 C1 11 05 91 05 E3 9C C5 FE 17 06 48 00 13 06
-66 E1 97 05 48 00 93 85 E5 E0 21 A0 23 20 06 00
-11 06 E3 9D C5 FE 17 01 49 00 13 01 A1 D3 17 05
-48 00 13 05 25 DF 17 06 48 00 13 06 A6 DE B3 05
-A6 40 17 07 49 00 13 07 E7 91 33 02 B7 40 92 85
-17 06 48 00 13 06 06 DD 29 A0 14 41 94 C1 11 05
+93 0E 00 00 13 0F 00 00 93 0F 00 00 97 01 00 20
+93 81 41 62 13 05 00 40 97 05 00 20 93 85 85 D7
+17 06 00 20 13 06 06 E3 63 0D B5 00 29 A0 14 41
+94 C1 11 05 91 05 E3 9C C5 FE 17 06 00 20 13 06
+66 E1 97 05 00 20 93 85 E5 E0 21 A0 23 20 06 00
+11 06 E3 9D C5 FE 17 01 01 20 13 01 A1 D3 17 05
+00 20 13 05 25 DF 17 06 00 20 13 06 A6 DE B3 05
+A6 40 17 07 01 20 13 07 E7 91 33 02 B7 40 92 85
+17 06 00 20 13 06 06 DD 29 A0 14 41 94 C1 11 05
91 05 E3 1C C5 FE 21 A0 23 A0 05 00 91 05 E3 9D
E5 FE B7 02 49 00 05 43 23 A0 62 00 B7 02 49 00
91 02 13 03 30 06 23 A0 62 00 B7 02 49 00 C1 02
7D 53 23 A0 62 00 23 A2 62 00 01 45 81 45 97 02
-48 00 E7 80 22 CC 97 02 48 00 93 82 A2 D1 6D 71
+00 20 E7 80 22 CC 97 02 00 20 93 82 A2 D1 6D 71
06 C2 0A C4 0E C6 12 C8 16 CA 1A CC 1E CE 22 D0
26 D2 2A D4 2E D6 32 D8 36 DA 3A DC 3E DE C2 C0
C6 C2 CA C4 CE C6 D2 C8 D6 CA DA CC DE CE E2 D0
@@ -70,7 +70,7 @@
66 55 D4 D3 93 08 88 78 37 9E 77 66 23 A4 17 03
93 0E 9E 89 23 A6 D7 03 01 A0 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
-97 02 B8 FF 93 82 42 09 82 82 13 00 00 00 13 00
+97 02 00 E0 93 82 42 09 82 82 13 00 00 00 13 00
00 00 13 00 00 00 13 00 00 00 13 00 00 00 01 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
diff --git a/verilog/dv/user_risc_boot/user_risc_boot_tb.v b/verilog/dv/user_risc_boot/user_risc_boot_tb.v
index efab5eb..8009a57 100644
--- a/verilog/dv/user_risc_boot/user_risc_boot_tb.v
+++ b/verilog/dv/user_risc_boot/user_risc_boot_tb.v
@@ -207,9 +207,9 @@
.vssd1(), // User area 1 digital ground
.vssd2(), // User area 2 digital ground
`endif
- .clk (clock), // System clock
+ .wb_clk_i (clock), // System clock
.rtc_clk (1'b1), // Real-time clock
- .rst_n (RSTB), // Regular Reset signal
+ .wb_rst_i (RSTB), // Regular Reset signal
.wbd_ext_cyc_i (wbd_ext_cyc_i), // strobe/request
.wbd_ext_stb_i (wbd_ext_stb_i), // strobe/request
@@ -234,7 +234,7 @@
.io_out (io_out) ,
.io_oeb (io_oeb) ,
- .irq ()
+ .user_irq ()
);
diff --git a/verilog/rtl/digital_core/src/digital_core.sv b/verilog/rtl/digital_core/src/digital_core.sv
index 44448ff..41fbf83 100644
--- a/verilog/rtl/digital_core/src/digital_core.sv
+++ b/verilog/rtl/digital_core/src/digital_core.sv
@@ -22,6 +22,24 @@
//// 0.1 - 16th Feb 2021, Dinesh A ////
//// Initial integration with Risc-V core + ////
//// Wishbone Cross Bar + SPI Master ////
+//// 0.2 - 17th June 2021, Dinesh A ////
+//// 1. In risc core, wishbone and core domain is ////
+//// created ////
+//// 2. cpu and rtc clock are generated in glbl reg block ////
+//// 3. in wishbone interconnect:- Stagging flop are added ////
+//// at interface to break wishbone timing path ////
+//// 4. buswidth warning are fixed inside spi_master ////
+//// modified rtl files are ////
+//// verilog/rtl/digital_core/src/digital_core.sv ////
+/// verilog/rtl/digital_core/src/glbl_cfg.sv ////
+/// verilog/rtl/lib/wb_stagging.sv ////
+/// verilog/rtl/syntacore/scr1/src/top/scr1_dmem_wb.sv ////
+/// verilog/rtl/syntacore/scr1/src/top/scr1_imem_wb.sv ////
+/// verilog/rtl/syntacore/scr1/src/top/scr1_top_wb.sv ////
+/// verilog/rtl/user_project_wrapper.v ////
+/// verilog/rtl/wb_interconnect/src/wb_interconnect.sv ////
+/// verilog/rtl/spi_master/src/spim_clkgen.sv ////
+/// verilog/rtl/spi_master/src/spim_ctrl.sv ////
//// ////
//////////////////////////////////////////////////////////////////////
//// ////
@@ -72,9 +90,9 @@
inout vssd1, // User area 1 digital ground
inout vssd2, // User area 2 digital ground
`endif
- input logic clk , // System clock
- input logic rtc_clk , // Real-time clock
- input logic rst_n , // Regular Reset signal
+ input logic wb_clk_i , // System clock
+ input logic user_clock2 , // user Clock
+ input logic wb_rst_i , // Regular Reset signal
input logic wbd_ext_cyc_i , // strobe/request
input logic wbd_ext_stb_i , // strobe/request
@@ -98,7 +116,7 @@
output logic [37:0] io_out ,
output logic [37:0] io_oeb ,
- output logic [2:0] irq
+ output logic [2:0] user_irq
);
@@ -161,7 +179,7 @@
// Global Register Wishbone Interface
//---------------------------------------------------------------------
logic wbd_glbl_stb_o; // strobe/request
-logic [WB_WIDTH-1:0] wbd_glbl_adr_o; // address
+logic [7:0] wbd_glbl_adr_o; // address
logic wbd_glbl_we_o; // write
logic [WB_WIDTH-1:0] wbd_glbl_dat_o; // data output
logic [3:0] wbd_glbl_sel_o; // byte enable
@@ -284,14 +302,16 @@
assign io_oeb[37] = 1'b1; // Unused
+wire wb_rst_n = !wb_rst_i;
+
//------------------------------------------------------------------------------
// RISC V Core instance
//------------------------------------------------------------------------------
scr1_top_wb u_riscv_top (
// Reset
- .pwrup_rst_n (rst_n ),
- .rst_n (rst_n ),
+ .pwrup_rst_n (wb_rst_n ),
+ .rst_n (wb_rst_n ),
.cpu_rst_n (cpu_rst_n ),
`ifdef SCR1_DBG_EN
.sys_rst_n_o (sys_rst_n_o ),
@@ -299,7 +319,7 @@
`endif // SCR1_DBG_EN
// Clock
- .clk (clk ),
+ .core_clk (cpu_clk ),
.rtc_clk (rtc_clk ),
// Fuses
@@ -330,6 +350,9 @@
.tdo_en (tdo_en ),
`endif // SCR1_DBG_EN
+
+ .wb_rst_n (wb_rst_n ),
+ .wb_clk (wb_clk_i ),
// Instruction memory interface
.wbd_imem_stb_o (wbd_riscv_imem_stb_i ),
.wbd_imem_adr_o (wbd_riscv_imem_adr_i ),
@@ -365,7 +388,7 @@
`endif
) u_spi_master
(
- .mclk (clk ),
+ .mclk (wb_clk_i ),
.rst_n (spi_rst_n ),
.wbd_stb_i (wbd_spim_stb_o ),
@@ -397,18 +420,21 @@
);
-sdrc_top #(.APP_AW(WB_WIDTH),
+sdrc_top
+ `ifndef SYNTHESIS
+ #(.APP_AW(WB_WIDTH),
.APP_DW(WB_WIDTH),
.APP_BW(4),
.SDR_DW(8),
.SDR_BW(1))
+ `endif
u_sdram_ctrl (
- .cfg_sdr_width (cfg_sdr_width ),
- .cfg_colbits (cfg_colbits ),
+ .cfg_sdr_width (cfg_sdr_width ),
+ .cfg_colbits (cfg_colbits ),
// WB bus
- .wb_rst_i (!rst_n ),
- .wb_clk_i (clk ),
+ .wb_rst_i (wb_rst_i ),
+ .wb_clk_i (wb_clk_i ),
.wb_stb_i (wbd_sdram_stb_o ),
.wb_addr_i (wbd_sdram_adr_o ),
@@ -453,39 +479,9 @@
);
-//------------------------------
-// RISC Data Memory Map
-// 0x0000_0000 to 0x0FFF_FFFF - SPI FLASH MEMORY
-// 0x1000_0000 to 0x1000_00FF - SPI REGISTER
-// 0x2000_0000 to 0x2FFF_FFFF - SDRAM
-// 0x3000_0000 to 0x3000_00FF - GLOBAL REGISTER
-//-----------------------------
-//
-wire [3:0] wbd_riscv_imem_tar_id = (wbd_riscv_imem_adr_i[31:16] == 16'h0000 ) ? 4'b0000 :
- (wbd_riscv_imem_adr_i[31:16] == 16'h0041 ) ? 4'b0000 :
- (wbd_riscv_imem_adr_i[31:16] == 16'h0048 ) ? 4'b0001 :// Todo: Temp fix for SDRAM
- (wbd_riscv_imem_adr_i[31:16] == 16'h3000 ) ? 4'b0010 : 4'b0000;
-
-wire [3:0] wbd_riscv_dmem_tar_id = (wbd_riscv_dmem_adr_i[31:16] == 16'h0000 ) ? 4'b0000 :
- (wbd_riscv_dmem_adr_i[31:16] == 16'h0041 ) ? 4'b0000 :
- (wbd_riscv_dmem_adr_i[31:16] == 16'h0048 ) ? 4'b0001 : // todo: Temp fix for SDRAM
- (wbd_riscv_dmem_adr_i[31:16] == 16'h3000 ) ? 4'b0010 : 4'b0000;
-
-
-//-------------------------------------------------------------------
-// EXTERNAL MEMORY MAP
-// 0x3000_0000 to 0x3000_00FF - GLOBAL REGISTER
-// 0x4000_0000 to 0x4FFF_FFFF - SPI FLASH MEMORY
-// 0x5000_0000 to 0x5000_00FF - SPI REGISTER
-// 0x6000_0000 to 0x6FFF_FFFF - SDRAM
-//
-wire [3:0] wbd_ext_tar_id = (wbd_ext_adr_i[31:28] == 4'b0100 ) ? 4'b0000 :
- (wbd_ext_adr_i[31:28] == 4'b0101 ) ? 4'b0000 :
- (wbd_ext_adr_i[31:28] == 4'b0110 ) ? 4'b0001 :
- (wbd_ext_adr_i[31:28] == 4'b0011 ) ? 4'b0010 : 4'b0000;
wb_interconnect u_intercon (
- .clk_i (clk),
- .rst_n (rst_n),
+ .clk_i (wb_clk_i ),
+ .rst_n (wb_rst_n ),
// Master 0 Interface
.m0_wbd_dat_i (wbd_riscv_imem_dat_i ),
@@ -494,7 +490,6 @@
.m0_wbd_we_i (wbd_riscv_imem_we_i ),
.m0_wbd_cyc_i (wbd_riscv_imem_stb_i ),
.m0_wbd_stb_i (wbd_riscv_imem_stb_i ),
- .m0_wbd_tid_i (wbd_riscv_imem_tar_id ), // target id
.m0_wbd_dat_o (wbd_riscv_imem_dat_o ),
.m0_wbd_ack_o (wbd_riscv_imem_ack_o ),
.m0_wbd_err_o (wbd_riscv_imem_err_o ),
@@ -506,7 +501,6 @@
.m1_wbd_we_i (wbd_riscv_dmem_we_i ),
.m1_wbd_cyc_i (wbd_riscv_dmem_stb_i ),
.m1_wbd_stb_i (wbd_riscv_dmem_stb_i ),
- .m1_wbd_tid_i (wbd_riscv_dmem_tar_id ), // target id
.m1_wbd_dat_o (wbd_riscv_dmem_dat_o ),
.m1_wbd_ack_o (wbd_riscv_dmem_ack_o ),
.m1_wbd_err_o (wbd_riscv_dmem_err_o ),
@@ -518,7 +512,6 @@
.m2_wbd_we_i (wbd_ext_we_i ),
.m2_wbd_cyc_i (wbd_ext_cyc_i ),
.m2_wbd_stb_i (wbd_ext_stb_i ),
- .m2_wbd_tid_i (wbd_ext_tar_id ), // target id
.m2_wbd_dat_o (wbd_ext_dat_o ),
.m2_wbd_ack_o (wbd_ext_ack_o ),
.m2_wbd_err_o (wbd_ext_err_o ),
@@ -560,14 +553,15 @@
glbl_cfg u_glbl_cfg (
- .mclk (clk ),
- .reset_n (rst_n ),
+ .mclk (wb_clk_i ),
+ .reset_n (wb_rst_n ),
+ .user_clock2 (user_clock2 ),
.device_idcode ( ),
// Reg Bus Interface Signal
.reg_cs (wbd_glbl_stb_o ),
.reg_wr (wbd_glbl_we_o ),
- .reg_addr (wbd_glbl_adr_o[5:2] ),
+ .reg_addr (wbd_glbl_adr_o ),
.reg_wdata (wbd_glbl_dat_o ),
.reg_be (wbd_glbl_sel_o ),
@@ -578,6 +572,8 @@
// SDRAM Clock
.sdram_clk (sdram_clk ),
+ .cpu_clk (cpu_clk ),
+ .rtc_clk (rtc_clk ),
// reset
.cpu_rst_n (cpu_rst_n ),
@@ -588,6 +584,7 @@
.fuse_mhartid (fuse_mhartid ),
.irq_lines (irq_lines ),
.soft_irq (soft_irq ),
+ .user_irq (user_irq ),
// SDRAM Config
.cfg_sdr_width (cfg_sdr_width ),
diff --git a/verilog/rtl/digital_core/src/glbl_cfg.sv b/verilog/rtl/digital_core/src/glbl_cfg.sv
index c44e20c..1754aec 100644
--- a/verilog/rtl/digital_core/src/glbl_cfg.sv
+++ b/verilog/rtl/digital_core/src/glbl_cfg.sv
@@ -48,13 +48,14 @@
module glbl_cfg (
input logic mclk,
+ input logic user_clock2,
input logic reset_n,
output logic [31:0] device_idcode,
// Reg Bus Interface Signal
input logic reg_cs,
input logic reg_wr,
- input logic [3:0] reg_addr,
+ input logic [7:0] reg_addr,
input logic [31:0] reg_wdata,
input logic [3:0] reg_be,
@@ -65,6 +66,8 @@
// SDRAM Clock
output logic sdram_clk,
+ output logic cpu_clk,
+ output logic rtc_clk,
// reset
output logic cpu_rst_n,
@@ -75,6 +78,7 @@
output logic [31:0] fuse_mhartid,
output logic [15:0] irq_lines,
output logic soft_irq,
+ output logic [2:0] user_irq,
// SDRAM Config
input logic sdr_init_done , // Indicate SDRAM Initialisation Done
@@ -109,7 +113,6 @@
logic reg_cs_l ;
logic reg_cs_2l ;
-logic cfg_sdram_clk_div;
logic [31:0] reg_0; // Software_Reg_0
@@ -149,7 +152,7 @@
reg_cs_l <= '0;
reg_cs_2l <= '0;
end else begin
- sw_addr <= reg_addr [3:0];
+ sw_addr <= reg_addr [5:2];
sw_rd_en <= reg_cs & !reg_wr;
sw_wr_en <= reg_cs & reg_wr;
sw_reg_wdata <= reg_wdata;
@@ -251,12 +254,24 @@
// reg-0
// -----------------------------------------------------------------
-assign cpu_rst_n = reg_0[0];
-assign spi_rst_n = reg_0[1];
-assign sdram_rst_n = reg_0[2];
-assign cfg_sdram_clk_div = reg_0[3];
+assign cpu_rst_n = reg_0[0];
+assign spi_rst_n = reg_0[1];
+assign sdram_rst_n = reg_0[2];
+// SDRAM Clock source & div selection
+wire cfg_sdram_clk_src_sel = reg_0[4];
+wire cfg_sdram_clk_div = reg_0[5];
+wire [1:0] cfg_sdram_clk_ratio = reg_0[7:6];
+// Core Clock source & div selection
+wire cfg_cpu_clk_src_sel = reg_0[8];
+wire cfg_cpu_clk_div = reg_0[9];
+wire [1:0] cfg_cpu_clk_ratio = reg_0[11:10];
+
+// RTC Clock source & div selection
+wire cfg_rtc_clk_src_sel = reg_0[12];
+wire cfg_rtc_clk_div = reg_0[13];
+wire [1:0] cfg_rtc_clk_ratio = reg_0[15:14];
generic_register #(8,0 ) u_reg0_be0 (
.we ({8{sw_wr_en_0 &
@@ -404,6 +419,7 @@
//-----------------------------------------------------------------
assign irq_lines = reg_3[15:0];
assign soft_irq = reg_3[16];
+assign user_irq = reg_3[19:17];
generic_register #(8,0 ) u_reg3_be0 (
.we ({8{sw_wr_en_3 &
@@ -426,18 +442,18 @@
//List of Outs
.data_out (reg_3[15:8] )
);
-generic_register #(1,0 ) u_reg3_be2 (
- .we ({1{sw_wr_en_3 &
+generic_register #(4,0 ) u_reg3_be2 (
+ .we ({4{sw_wr_en_3 &
wr_be[2] }} ),
- .data_in (sw_reg_wdata[16] ),
+ .data_in (sw_reg_wdata[19:16] ),
.reset_n (reset_n ),
.clk (mclk ),
//List of Outs
- .data_out (reg_3[16] )
+ .data_out (reg_3[19:16] )
);
-assign reg_3[31:17] = '0;
+assign reg_3[31:20] = '0;
//-----------------------------------------------------------------------
@@ -1028,29 +1044,72 @@
.clk (mclk ),
//List of Outs
- .data_out (reg_15[31:24] )
+ .data_out (reg_15[31:24] )
);
//----------------------------------
-// Generate SDRAM Div-2 Clock
+// Generate SDRAM Clock Generation
//----------------------------------
-wire sdram_clk_div2;
+wire sdram_clk_div;
+wire sdram_ref_clk;
-assign sdram_clk = (cfg_sdram_clk_div) ? sdram_clk_div2 : mclk;
+assign sdram_ref_clk = (cfg_sdram_clk_src_sel) ? user_clock2 : mclk;
+
+
+
+assign sdram_clk = (cfg_sdram_clk_div) ? sdram_clk_div : sdram_ref_clk;
clk_ctl #(1) u_sdramclk (
// Outputs
- .clk_o (sdram_clk_div2),
+ .clk_o (sdram_clk_div ),
// Inputs
- .mclk (mclk),
- .reset_n (reset_n),
- .clk_div_ratio (2'b00)
+ .mclk (sdram_ref_clk ),
+ .reset_n (reset_n ),
+ .clk_div_ratio (cfg_sdram_clk_ratio)
);
+//----------------------------------
+// Generate CORE Clock Generation
+//----------------------------------
+wire cpu_clk_div;
+wire cpu_ref_clk;
+
+assign cpu_ref_clk = (cfg_cpu_clk_src_sel) ? user_clock2 : mclk;
+assign cpu_clk = (cfg_cpu_clk_div) ? cpu_clk_div : cpu_ref_clk;
+
+
+clk_ctl #(1) u_cpuclk (
+ // Outputs
+ .clk_o (cpu_clk_div ),
+ // Inputs
+ .mclk (cpu_ref_clk ),
+ .reset_n (reset_n ),
+ .clk_div_ratio (cfg_cpu_clk_ratio)
+ );
+
+//----------------------------------
+// Generate RTC Clock Generation
+//----------------------------------
+wire rtc_clk_div;
+wire rtc_ref_clk;
+
+assign rtc_ref_clk = (cfg_rtc_clk_src_sel) ? user_clock2 : mclk;
+assign rtc_clk = (cfg_rtc_clk_div) ? rtc_clk_div : rtc_ref_clk;
+
+
+clk_ctl #(1) u_rtcclk (
+ // Outputs
+ .clk_o (rtc_clk_div ),
+ // Inputs
+ .mclk (rtc_ref_clk ),
+ .reset_n (reset_n ),
+ .clk_div_ratio (cfg_rtc_clk_ratio)
+ );
+
endmodule
diff --git a/verilog/rtl/lib/async_fifo_th.sv b/verilog/rtl/lib/async_fifo_th.sv
new file mode 100755
index 0000000..5ff3df6
--- /dev/null
+++ b/verilog/rtl/lib/async_fifo_th.sv
@@ -0,0 +1,386 @@
+//////////////////////////////////////////////////////////////////////
+//// ////
+//// OMS 8051 cores common library Module ////
+//// ////
+//// This file is part of the OMS 8051 cores project ////
+//// http://www.opencores.org/cores/oms8051mini/ ////
+//// ////
+//// Description ////
+//// Async Fifo with threshold tracking/status ////
+//// ////
+//// To Do: ////
+//// nothing ////
+//// ////
+//// Author(s): ////
+//// - Dinesh Annayya, dinesha@opencores.org ////
+//// ////
+//// Revision : Nov 26, 2016 ////
+//// ////
+//////////////////////////////////////////////////////////////////////
+//// ////
+//// Copyright (C) 2000 Authors and OPENCORES.ORG ////
+//// ////
+//// This source file may be used and distributed without ////
+//// restriction provided that this copyright statement is not ////
+//// removed from the file and that any derivative work contains ////
+//// the original copyright notice and the associated disclaimer. ////
+//// ////
+//// This source file is free software; you can redistribute it ////
+//// and/or modify it under the terms of the GNU Lesser General ////
+//// Public License as published by the Free Software Foundation; ////
+//// either version 2.1 of the License, or (at your option) any ////
+//// later version. ////
+//// ////
+//// This source is distributed in the hope that it will be ////
+//// useful, but WITHOUT ANY WARRANTY; without even the implied ////
+//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR ////
+//// PURPOSE. See the GNU Lesser General Public License for more ////
+//// details. ////
+//// ////
+//// You should have received a copy of the GNU Lesser General ////
+//// Public License along with this source; if not, download it ////
+//// from http://www.opencores.org/lgpl.shtml ////
+//// ////
+//////////////////////////////////////////////////////////////////////
+
+//-------------------------------------------
+// async_fifo:: async FIFO
+// Following two ports are newly added
+// 1. At write clock domain:
+// wr_total_free_space --> Indicate total free transfer available
+// 2. At read clock domain:
+// rd_total_aval --> Indicate total no of transfer available
+//-----------------------------------------------
+
+module async_fifo_th (
+ wr_clk,
+ wr_reset_n,
+ wr_en,
+ wr_data,
+ full, // sync'ed to wr_clk
+ afull, // sync'ed to wr_clk
+ wr_total_free_space,
+ rd_clk,
+ rd_reset_n,
+ rd_en,
+ empty, // sync'ed to rd_clk
+ aempty, // sync'ed to rd_clk
+ rd_total_aval,
+ rd_data);
+
+ parameter W = 4'd8;
+ parameter DP = 3'd4;
+ parameter WR_FAST = 1'b1;
+ parameter RD_FAST = 1'b1;
+ parameter FULL_DP = DP;
+ parameter EMPTY_DP = 1'b0;
+
+ parameter AW = (DP == 2) ? 1 :
+ (DP == 4) ? 2 :
+ (DP == 8) ? 3 :
+ (DP == 16) ? 4 :
+ (DP == 32) ? 5 :
+ (DP == 64) ? 6 :
+ (DP == 128) ? 7 :
+ (DP == 256) ? 8 : 0;
+
+ output [W-1 : 0] rd_data;
+ input [W-1 : 0] wr_data;
+ input wr_clk, wr_reset_n, wr_en, rd_clk, rd_reset_n,
+ rd_en;
+ output full, empty;
+ output afull, aempty; // about full and about to empty
+ output [AW:0] wr_total_free_space; // Total Number of free space aval
+ // w.r.t write clk
+ // note: Without accounting byte enables
+ output [AW:0] rd_total_aval; // Total Number of words avaialble
+ // w.r.t rd clock,
+ // note: Without accounting byte enables
+ // synopsys translate_off
+
+ initial begin
+ if (AW == 0) begin
+ $display ("%m : ERROR!!! Fifo depth %d not in range 2 to 256", DP);
+ end // if (AW == 0)
+ end // initial begin
+
+ // synopsys translate_on
+ reg [W-1 : 0] mem[DP-1 : 0];
+
+ /*********************** write side ************************/
+ reg [AW:0] sync_rd_ptr_0, sync_rd_ptr_1;
+ wire [AW:0] sync_rd_ptr;
+ reg [AW:0] wr_ptr, grey_wr_ptr;
+ reg [AW:0] grey_rd_ptr;
+ reg full_q;
+ wire full_c;
+ wire afull_c;
+ wire [AW:0] wr_ptr_inc = wr_ptr + 1'b1;
+ wire [AW:0] wr_cnt = get_cnt(wr_ptr, sync_rd_ptr);
+
+ assign full_c = (wr_cnt == FULL_DP) ? 1'b1 : 1'b0;
+ assign afull_c = (wr_cnt == FULL_DP-1) ? 1'b1 : 1'b0;
+
+ //--------------------------
+ // Shows total number of words
+ // of free space available w.r.t write clock
+ //---------------------------
+ assign wr_total_free_space = FULL_DP - wr_cnt;
+
+ always @(posedge wr_clk or negedge wr_reset_n) begin
+ if (!wr_reset_n) begin
+ wr_ptr <= 0;
+ grey_wr_ptr <= 0;
+ full_q <= 0;
+ end
+ else if (wr_en) begin
+ wr_ptr <= wr_ptr_inc;
+ grey_wr_ptr <= bin2grey(wr_ptr_inc);
+ if (wr_cnt == (FULL_DP-1)) begin
+ full_q <= 1'b1;
+ end
+ end
+ else begin
+ if (full_q && (wr_cnt<FULL_DP)) begin
+ full_q <= 1'b0;
+ end
+ end
+ end
+
+ assign full = (WR_FAST == 1) ? full_c : full_q;
+ assign afull = afull_c;
+
+ always @(posedge wr_clk) begin
+ if (wr_en) begin
+ mem[wr_ptr[AW-1:0]] <= wr_data;
+ end
+ end
+
+ wire [AW:0] grey_rd_ptr_dly ;
+ assign #1 grey_rd_ptr_dly = grey_rd_ptr;
+
+ // read pointer synchronizer
+ always @(posedge wr_clk or negedge wr_reset_n) begin
+ if (!wr_reset_n) begin
+ sync_rd_ptr_0 <= 0;
+ sync_rd_ptr_1 <= 0;
+ end
+ else begin
+ sync_rd_ptr_0 <= grey_rd_ptr_dly;
+ sync_rd_ptr_1 <= sync_rd_ptr_0;
+ end
+ end
+
+ assign sync_rd_ptr = grey2bin(sync_rd_ptr_1);
+
+ /************************ read side *****************************/
+ reg [AW:0] sync_wr_ptr_0, sync_wr_ptr_1;
+ wire [AW:0] sync_wr_ptr;
+ reg [AW:0] rd_ptr;
+ reg empty_q;
+ wire empty_c;
+ wire aempty_c;
+ wire [AW:0] rd_ptr_inc = rd_ptr + 1'b1;
+ wire [AW:0] sync_wr_ptr_dec = sync_wr_ptr - 1'b1;
+ wire [AW:0] rd_cnt = get_cnt(sync_wr_ptr, rd_ptr);
+
+ assign empty_c = (rd_cnt == 0) ? 1'b1 : 1'b0;
+ assign aempty_c = (rd_cnt == 1) ? 1'b1 : 1'b0;
+ //--------------------------
+ // Shows total number of words
+ // space available w.r.t write clock
+ //---------------------------
+ assign rd_total_aval = rd_cnt;
+
+ always @(posedge rd_clk or negedge rd_reset_n) begin
+ if (!rd_reset_n) begin
+ rd_ptr <= 0;
+ grey_rd_ptr <= 0;
+ empty_q <= 1'b1;
+ end
+ else begin
+ if (rd_en) begin
+ rd_ptr <= rd_ptr_inc;
+ grey_rd_ptr <= bin2grey(rd_ptr_inc);
+ if (rd_cnt==(EMPTY_DP+1)) begin
+ empty_q <= 1'b1;
+ end
+ end
+ else begin
+ if (empty_q && (rd_cnt!=EMPTY_DP)) begin
+ empty_q <= 1'b0;
+ end
+ end
+ end
+ end
+
+ assign empty = (RD_FAST == 1) ? empty_c : empty_q;
+ assign aempty = aempty_c;
+
+ assign rd_data = mem[rd_ptr[AW-1:0]];
+
+ wire [AW:0] grey_wr_ptr_dly ;
+ assign #1 grey_wr_ptr_dly = grey_wr_ptr;
+
+ // write pointer synchronizer
+ always @(posedge rd_clk or negedge rd_reset_n) begin
+ if (!rd_reset_n) begin
+ sync_wr_ptr_0 <= 0;
+ sync_wr_ptr_1 <= 0;
+ end
+ else begin
+ sync_wr_ptr_0 <= grey_wr_ptr_dly;
+ sync_wr_ptr_1 <= sync_wr_ptr_0;
+ end
+ end
+ assign sync_wr_ptr = grey2bin(sync_wr_ptr_1);
+
+
+/************************ functions ******************************/
+function [AW:0] bin2grey;
+input [AW:0] bin;
+reg [8:0] bin_8;
+reg [8:0] grey_8;
+begin
+ bin_8 = bin;
+ grey_8[1:0] = do_grey(bin_8[2:0]);
+ grey_8[3:2] = do_grey(bin_8[4:2]);
+ grey_8[5:4] = do_grey(bin_8[6:4]);
+ grey_8[7:6] = do_grey(bin_8[8:6]);
+ grey_8[8] = bin_8[8];
+ bin2grey = grey_8;
+end
+endfunction
+
+function [AW:0] grey2bin;
+input [AW:0] grey;
+reg [8:0] grey_8;
+reg [8:0] bin_8;
+begin
+ grey_8 = grey;
+ bin_8[8] = grey_8[8];
+ bin_8[7:6] = do_bin({bin_8[8], grey_8[7:6]});
+ bin_8[5:4] = do_bin({bin_8[6], grey_8[5:4]});
+ bin_8[3:2] = do_bin({bin_8[4], grey_8[3:2]});
+ bin_8[1:0] = do_bin({bin_8[2], grey_8[1:0]});
+ grey2bin = bin_8;
+end
+endfunction
+
+
+function [1:0] do_grey;
+input [2:0] bin;
+begin
+ if (bin[2]) begin // do reverse grey
+ case (bin[1:0])
+ 2'b00: do_grey = 2'b10;
+ 2'b01: do_grey = 2'b11;
+ 2'b10: do_grey = 2'b01;
+ 2'b11: do_grey = 2'b00;
+ endcase
+ end
+ else begin
+ case (bin[1:0])
+ 2'b00: do_grey = 2'b00;
+ 2'b01: do_grey = 2'b01;
+ 2'b10: do_grey = 2'b11;
+ 2'b11: do_grey = 2'b10;
+ endcase
+ end
+end
+endfunction
+
+function [1:0] do_bin;
+input [2:0] grey;
+begin
+ if (grey[2]) begin // actually bin[2]
+ case (grey[1:0])
+ 2'b10: do_bin = 2'b00;
+ 2'b11: do_bin = 2'b01;
+ 2'b01: do_bin = 2'b10;
+ 2'b00: do_bin = 2'b11;
+ endcase
+ end
+ else begin
+ case (grey[1:0])
+ 2'b00: do_bin = 2'b00;
+ 2'b01: do_bin = 2'b01;
+ 2'b11: do_bin = 2'b10;
+ 2'b10: do_bin = 2'b11;
+ endcase
+ end
+end
+endfunction
+
+function [AW:0] get_cnt;
+input [AW:0] wr_ptr, rd_ptr;
+begin
+ if (wr_ptr >= rd_ptr) begin
+ get_cnt = (wr_ptr - rd_ptr);
+ end
+ else begin
+ get_cnt = DP*2 - (rd_ptr - wr_ptr);
+ end
+end
+endfunction
+
+// synopsys translate_off
+always @(posedge wr_clk) begin
+ if (wr_en && full) begin
+ $display($time, "%m Error! afifo overflow!");
+ $stop;
+ end
+end
+
+always @(posedge rd_clk) begin
+ if (rd_en && empty) begin
+ $display($time, "%m error! afifo underflow!");
+ $stop;
+ end
+end
+
+// gray code monitor
+reg [AW:0] last_gwr_ptr;
+always @(posedge wr_clk or negedge wr_reset_n) begin
+ if (!wr_reset_n) begin
+ last_gwr_ptr <= #1 0;
+ end
+ else if (last_gwr_ptr !== grey_wr_ptr) begin
+ check_ptr_chg(last_gwr_ptr, grey_wr_ptr);
+ last_gwr_ptr <= #1 grey_wr_ptr;
+ end
+end
+
+reg [AW:0] last_grd_ptr;
+always @(posedge rd_clk or negedge rd_reset_n) begin
+ if (!rd_reset_n) begin
+ last_grd_ptr <= #1 0;
+ end
+ else if (last_grd_ptr !== grey_rd_ptr) begin
+ check_ptr_chg(last_grd_ptr, grey_rd_ptr);
+ last_grd_ptr <= #1 grey_rd_ptr;
+ end
+end
+
+task check_ptr_chg;
+input [AW:0] last_ptr;
+input [AW:0] cur_ptr;
+integer i;
+integer ptr_diff;
+begin
+ ptr_diff = 0;
+ for (i=0; i<= AW; i=i+ 1'b1) begin
+ if (last_ptr[i] != cur_ptr[i]) begin
+ ptr_diff = ptr_diff + 1'b1;
+ end
+ end
+ if (ptr_diff !== 1) begin
+ $display($time, "%m, ERROR! async fifo ptr has changed more than noe bit, last=%h, cur=%h",
+ last_ptr, cur_ptr);
+ $stop;
+ end
+end
+endtask
+ // synopsys translate_on
+
+endmodule
diff --git a/verilog/rtl/lib/double_sync_high.v b/verilog/rtl/lib/double_sync_high.v
new file mode 100755
index 0000000..8e39520
--- /dev/null
+++ b/verilog/rtl/lib/double_sync_high.v
@@ -0,0 +1,88 @@
+//////////////////////////////////////////////////////////////////////
+//// ////
+//// OMS 8051 cores common library Module ////
+//// ////
+//// This file is part of the OMS 8051 cores project ////
+//// http://www.opencores.org/cores/oms8051mini/ ////
+//// ////
+//// Description ////
+//// OMS 8051 definitions. ////
+//// ////
+//// To Do: ////
+//// nothing ////
+//// ////
+//// Author(s): ////
+//// - Dinesh Annayya, dinesha@opencores.org ////
+//// ////
+//// Revision : Nov 26, 2016 ////
+//// ////
+//////////////////////////////////////////////////////////////////////
+//// ////
+//// Copyright (C) 2000 Authors and OPENCORES.ORG ////
+//// ////
+//// This source file may be used and distributed without ////
+//// restriction provided that this copyright statement is not ////
+//// removed from the file and that any derivative work contains ////
+//// the original copyright notice and the associated disclaimer. ////
+//// ////
+//// This source file is free software; you can redistribute it ////
+//// and/or modify it under the terms of the GNU Lesser General ////
+//// Public License as published by the Free Software Foundation; ////
+//// either version 2.1 of the License, or (at your option) any ////
+//// later version. ////
+//// ////
+//// This source is distributed in the hope that it will be ////
+//// useful, but WITHOUT ANY WARRANTY; without even the implied ////
+//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR ////
+//// PURPOSE. See the GNU Lesser General Public License for more ////
+//// details. ////
+//// ////
+//// You should have received a copy of the GNU Lesser General ////
+//// Public License along with this source; if not, download it ////
+//// from http://www.opencores.org/lgpl.shtml ////
+//// ////
+//////////////////////////////////////////////////////////////////////
+//----------------------------------------------------------------------------
+// Simple Double sync logic with Reset value = 0
+// This double signal should be used for signal transiting from low to high
+//----------------------------------------------------------------------------
+
+module double_sync_high (
+ in_data ,
+ out_clk ,
+ out_rst_n ,
+ out_data
+ );
+
+parameter WIDTH = 1;
+
+input [WIDTH-1:0] in_data ; // Input from Different clock domain
+input out_clk ; // Output clock
+input out_rst_n ; // Active low Reset
+output[WIDTH-1:0] out_data ; // Output Data
+
+
+reg [WIDTH-1:0] in_data_s ; // One Cycle sync
+reg [WIDTH-1:0] in_data_2s ; // two Cycle sync
+reg [WIDTH-1:0] in_data_3s ; // three Cycle sync
+
+assign out_data = in_data_3s;
+
+always @(negedge out_rst_n or posedge out_clk)
+begin
+ if(out_rst_n == 1'b0)
+ begin
+ in_data_s <= {WIDTH{1'b0}};
+ in_data_2s <= {WIDTH{1'b0}};
+ in_data_3s <= {WIDTH{1'b0}};
+ end
+ else
+ begin
+ in_data_s <= in_data;
+ in_data_2s <= in_data_s;
+ in_data_3s <= in_data_2s;
+ end
+end
+
+
+endmodule
diff --git a/verilog/rtl/lib/double_sync_low.v b/verilog/rtl/lib/double_sync_low.v
new file mode 100755
index 0000000..2709b91
--- /dev/null
+++ b/verilog/rtl/lib/double_sync_low.v
@@ -0,0 +1,88 @@
+//////////////////////////////////////////////////////////////////////
+//// ////
+//// OMS 8051 cores common library Module ////
+//// ////
+//// This file is part of the OMS 8051 cores project ////
+//// http://www.opencores.org/cores/oms8051mini/ ////
+//// ////
+//// Description ////
+//// OMS 8051 definitions. ////
+//// ////
+//// To Do: ////
+//// nothing ////
+//// ////
+//// Author(s): ////
+//// - Dinesh Annayya, dinesha@opencores.org ////
+//// ////
+//// Revision : Nov 26, 2016 ////
+//// ////
+//////////////////////////////////////////////////////////////////////
+//// ////
+//// Copyright (C) 2000 Authors and OPENCORES.ORG ////
+//// ////
+//// This source file may be used and distributed without ////
+//// restriction provided that this copyright statement is not ////
+//// removed from the file and that any derivative work contains ////
+//// the original copyright notice and the associated disclaimer. ////
+//// ////
+//// This source file is free software; you can redistribute it ////
+//// and/or modify it under the terms of the GNU Lesser General ////
+//// Public License as published by the Free Software Foundation; ////
+//// either version 2.1 of the License, or (at your option) any ////
+//// later version. ////
+//// ////
+//// This source is distributed in the hope that it will be ////
+//// useful, but WITHOUT ANY WARRANTY; without even the implied ////
+//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR ////
+//// PURPOSE. See the GNU Lesser General Public License for more ////
+//// details. ////
+//// ////
+//// You should have received a copy of the GNU Lesser General ////
+//// Public License along with this source; if not, download it ////
+//// from http://www.opencores.org/lgpl.shtml ////
+//// ////
+//////////////////////////////////////////////////////////////////////
+//----------------------------------------------------------------------------
+// Simple Double sync logic with Reset value = 1
+// This double signal should be used for signal transiting from low to high
+//----------------------------------------------------------------------------
+
+module double_sync_low (
+ in_data ,
+ out_clk ,
+ out_rst_n ,
+ out_data
+ );
+
+parameter WIDTH = 1;
+
+input [WIDTH-1:0] in_data ; // Input from Different clock domain
+input out_clk ; // Output clock
+input out_rst_n ; // Active low Reset
+output[WIDTH-1:0] out_data ; // Output Data
+
+
+reg [WIDTH-1:0] in_data_s ; // One Cycle sync
+reg [WIDTH-1:0] in_data_2s ; // two Cycle sync
+reg [WIDTH-1:0] in_data_3s ; // three Cycle sync
+
+assign out_data = in_data_3s;
+
+always @(negedge out_rst_n or posedge out_clk)
+begin
+ if(out_rst_n == 1'b0)
+ begin
+ in_data_s <= {WIDTH{1'b1}};
+ in_data_2s <= {WIDTH{1'b1}};
+ in_data_3s <= {WIDTH{1'b1}};
+ end
+ else
+ begin
+ in_data_s <= in_data;
+ in_data_2s <= in_data_s;
+ in_data_3s <= in_data_2s;
+ end
+end
+
+
+endmodule
diff --git a/verilog/rtl/lib/wb_crossbar.v b/verilog/rtl/lib/wb_crossbar.v
deleted file mode 100644
index 76b9981..0000000
--- a/verilog/rtl/lib/wb_crossbar.v
+++ /dev/null
@@ -1,398 +0,0 @@
-//////////////////////////////////////////////////////////////////////
-//// ////
-//// yifive common library Module ////
-//// ////
-//// This file is part of the yifive cores project ////
-//// http://www.opencores.org/cores/yifive/ ////
-//// ////
-//// Description ////
-//// This module does the Wishone crossbar network ////
-//// ////
-//// To Do: ////
-//// nothing ////
-//// ////
-//// Author(s): ////
-//// - Dinesh Annayya, dinesha@opencores.org ////
-//// ////
-//////////////////////////////////////////////////////////////////////
-//// Revision : ////
-//// v0: Nov 26, 2016, Dinesh A ////
-//// This files copied from my open core ////
-//// turbo8051 project ////
-//////////////////////////////////////////////////////////////////////
-//// ////
-//// Copyright (C) 2000 Authors and OPENCORES.ORG ////
-//// ////
-//// This source file may be used and distributed without ////
-//// restriction provided that this copyright statement is not ////
-//// removed from the file and that any derivative work contains ////
-//// the original copyright notice and the associated disclaimer. ////
-//// ////
-//// This source file is free software; you can redistribute it ////
-//// and/or modify it under the terms of the GNU Lesser General ////
-//// Public License as published by the Free Software Foundation; ////
-//// either version 2.1 of the License, or (at your option) any ////
-//// later version. ////
-//// ////
-//// This source is distributed in the hope that it will be ////
-//// useful, but WITHOUT ANY WARRANTY; without even the implied ////
-//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR ////
-//// PURPOSE. See the GNU Lesser General Public License for more ////
-//// details. ////
-//// ////
-//// You should have received a copy of the GNU Lesser General ////
-//// Public License along with this source; if not, download it ////
-//// from http://www.opencores.org/lgpl.shtml ////
-//// ////
-//////////////////////////////////////////////////////////////////////
-
-/**********************************************
- Wish-bone cross bar M-Master By S-Slave
-**********************************************/
-
-module wb_crossbar (
-
- rst_n ,
- clk ,
-
-
- // Master Interface Signal
- wbd_taddr_master ,
- wbd_din_master ,
- wbd_dout_master ,
- wbd_adr_master ,
- wbd_be_master ,
- wbd_we_master ,
- wbd_ack_master ,
- wbd_stb_master ,
- wbd_cyc_master ,
- wbd_err_master ,
- wbd_rty_master ,
-
- // Slave Interface Signal
- wbd_din_slave ,
- wbd_dout_slave ,
- wbd_adr_slave ,
- wbd_be_slave ,
- wbd_we_slave ,
- wbd_ack_slave ,
- wbd_stb_slave ,
- wbd_cyc_slave ,
- wbd_err_slave ,
- wbd_rty_slave
- );
-
-parameter WB_SLAVE = 4 ;
-parameter WB_MASTER = 4 ;
-
-parameter D_WD = 16; // Data Width
-parameter BE_WD = 2; // Byte Enable
-parameter ADR_WD = 28; // Address Width
-parameter TAR_WD = 4; // Target Width
-
-input clk; // CLK_I The clock input [CLK_I] coordinates all activities
- // for the internal logic within the WISHBONE interconnect.
- // All WISHBONE output signals are registered at the
- // rising edge of [CLK_I].
- // All WISHBONE input signals must be stable before the
- // rising edge of [CLK_I].
-input rst_n; // RST_I The reset input [RST_I] forces the WISHBONE interface
- // to restart. Furthermore, all internal self-starting state
- // machines will be forced into an initial state.
-
-input [(WB_MASTER *TAR_WD)-1:0] wbd_taddr_master; // target address from master
-input [WB_MASTER-1:0] wbd_stb_master;
- // STB_O The strobe output [STB_O] indicates a valid data
- // transfer cycle. It is used to qualify various other signals
- // on the interface such as [SEL_O(7..0)]. The SLAVE must
- // assert either the [ACK_I], [ERR_I] or [RTY_I] signals in
- // response to every assertion of the [STB_O] signal.
-output [WB_SLAVE-1:0] wbd_stb_slave;
- // STB_O The strobe output [STB_O] indicates a valid data
- // transfer cycle. It is used to qualify various other signals
- // on the interface such as [SEL_O(7..0)]. The SLAVE must
- // assert either the [ACK_I], [ERR_I] or [RTY_I] signals in
- // response to every assertion of the [STB_O] signal.
-
-input [WB_MASTER-1:0] wbd_we_master;
- // WE_O The write enable output [WE_O] indicates whether the
- // current local bus cycle is a READ or WRITE cycle. The
- // signal is negated during READ cycles, and is asserted
- // during WRITE cycles.
-output [WB_SLAVE-1:0] wbd_we_slave;
- // WE_O The write enable output [WE_O] indicates whether the
- // current local bus cycle is a READ or WRITE cycle. The
- // signal is negated during READ cycles, and is asserted
- // during WRITE cycles.
-
-output [WB_MASTER-1:0] wbd_ack_master;
- // The acknowledge input [ACK_I], when asserted,
- // indicates the termination of a normal bus cycle.
- // Also see the [ERR_I] and [RTY_I] signal descriptions.
-input [WB_SLAVE-1:0] wbd_ack_slave;
- // The acknowledge input [ACK_I], when asserted,
- // indicates the termination of a normal bus cycle.
- // Also see the [ERR_I] and [RTY_I] signal descriptions.
-
-input [(WB_MASTER *ADR_WD)-1:0] wbd_adr_master;
- // The address output array [ADR_O(63..0)] is used
- // to pass a binary address, with the most significant
- // address bit at the higher numbered end of the signal array.
- // The lower array boundary is specific to the data port size.
- // The higher array boundary is core-specific.
- // In some cases (such as FIFO interfaces)
- // the array may not be present on the interface.
-
-output [(WB_SLAVE *ADR_WD)-1:0] wbd_adr_slave;
- // The address output array [ADR_O(63..0)] is used
- // to pass a binary address, with the most significant
- // address bit at the higher numbered end of the signal array.
- // The lower array boundary is specific to the data port size.
- // The higher array boundary is core-specific.
- // In some cases (such as FIFO interfaces)
- // the array may not be present on the interface.
-
-input [(WB_MASTER * BE_WD)-1:0] wbd_be_master; // Byte Enable
- // SEL_O(7..0) The select output array [SEL_O(7..0)] indicates
- // where valid data is expected on the [DAT_I(63..0)] signal
- // array during READ cycles, and where it is placed on the
- // [DAT_O(63..0)] signal array during WRITE cycles.
- // Also see the [DAT_I(63..0)], [DAT_O(63..0)] and [STB_O]
- // signal descriptions.
-output [(WB_SLAVE * BE_WD)-1:0] wbd_be_slave; // Byte Enable
- // SEL_O(7..0) The select output array [SEL_O(7..0)] indicates
- // where valid data is expected on the [DAT_I(63..0)] signal
- // array during READ cycles, and where it is placed on the
- // [DAT_O(63..0)] signal array during WRITE cycles.
- // Also see the [DAT_I(63..0)], [DAT_O(63..0)] and [STB_O]
- // signal descriptions.
-
-input [WB_MASTER -1:0] wbd_cyc_master;
- // CYC_O The cycle output [CYC_O], when asserted,
- // indicates that a valid bus cycle is in progress.
- // The signal is asserted for the duration of all bus cycles.
- // For example, during a BLOCK transfer cycle there can be
- // multiple data transfers. The [CYC_O] signal is asserted
- // during the first data transfer, and remains asserted
- // until the last data transfer. The [CYC_O] signal is useful
- // for interfaces with multi-port interfaces
- // (such as dual port memories). In these cases,
- // the [CYC_O] signal requests use of a common bus from an
- // arbiter. Once the arbiter grants the bus to the MASTER,
- // it is held until [CYC_O] is negated.
-output [WB_SLAVE -1:0] wbd_cyc_slave;
- // CYC_O The cycle output [CYC_O], when asserted,
- // indicates that a valid bus cycle is in progress.
- // The signal is asserted for the duration of all bus cycles.
- // For example, during a BLOCK transfer cycle there can be
- // multiple data transfers. The [CYC_O] signal is asserted
- // during the first data transfer, and remains asserted
- // until the last data transfer. The [CYC_O] signal is useful
- // for interfaces with multi-port interfaces
- // (such as dual port memories). In these cases,
- // the [CYC_O] signal requests use of a common bus from an
- // arbiter. Once the arbiter grants the bus to the MASTER,
- // it is held until [CYC_O] is negated.
-
-input [(WB_MASTER * D_WD)-1:0] wbd_din_master;
- // DAT_I(63..0) The data input array [DAT_I(63..0)] is
- // used to pass binary data. The array boundaries are
- // determined by the port size. Also see the [DAT_O(63..0)]
- // and [SEL_O(7..0)] signal descriptions.
-
-output [(WB_SLAVE * D_WD)-1:0] wbd_din_slave;
- // DAT_I(63..0) The data input array [DAT_I(63..0)] is
- // used to pass binary data. The array boundaries are
- // determined by the port size. Also see the [DAT_O(63..0)]
- // and [SEL_O(7..0)] signal descriptions.
-
-output [(WB_MASTER * D_WD)-1:0] wbd_dout_master;
- // DAT_O(63..0) The data output array [DAT_O(63..0)] is
- // used to pass binary data. The array boundaries are
- // determined by the port size. Also see the [DAT_I(63..0)]
- // and [SEL_O(7..0)] signal descriptions.
-input [(WB_SLAVE * D_WD)-1:0] wbd_dout_slave;
- // DAT_O(63..0) The data output array [DAT_O(63..0)] is
- // used to pass binary data. The array boundaries are
- // determined by the port size. Also see the [DAT_I(63..0)]
- // and [SEL_O(7..0)] signal descriptions.
-
-output [WB_MASTER -1:0] wbd_err_master;
- // ERR_I The error input [ERR_I] indicates an abnormal
- // cycle termination. The source of the error, and the
- // response generated by the MASTER is defined by the IP core
- // supplier in the WISHBONE DATASHEET. Also see the [ACK_I]
- // and [RTY_I] signal descriptions.
-input [WB_SLAVE -1:0] wbd_err_slave;
- // ERR_I The error input [ERR_I] indicates an abnormal
- // cycle termination. The source of the error, and the
- // response generated by the MASTER is defined by the IP core
- // supplier in the WISHBONE DATASHEET. Also see the [ACK_I]
- // and [RTY_I] signal descriptions.
-
-output [WB_MASTER -1:0] wbd_rty_master;
- // RTY_I The retry input [RTY_I] indicates that the indicates
- // that the interface is not ready to accept or send data, and
- // that the cycle should be retried. When and how the cycle is
- // retried is defined by the IP core supplier in the WISHBONE
- // DATASHEET. Also see the [ERR_I] and [RTY_I] signal
- // descriptions.
-input [WB_SLAVE -1:0] wbd_rty_slave;
- // RTY_I The retry input [RTY_I] indicates that the indicates
- // that the interface is not ready to accept or send data, and
- // that the cycle should be retried. When and how the cycle is
- // retried is defined by the IP core supplier in the WISHBONE
- // DATASHEET. Also see the [ERR_I] and [RTY_I] signal
- // descriptions.
-
-
-reg [WB_MASTER-1:0] wbd_ack_master;
-reg [WB_MASTER-1:0] wbd_err_master;
-reg [WB_MASTER-1:0] wbd_rty_master;
-
-
-reg [WB_MASTER-1:0] master_busy; // master busy flag
-reg [WB_SLAVE-1:0] slave_busy; // slave busy flag
-reg [TAR_WD -1:0] master_mx_id[WB_MASTER-1:0];
-reg [TAR_WD -1:0] slave_mx_id [WB_SLAVE-1:0];
-
-wire [TAR_WD-1:0] wbd_taddr_master_t[WB_MASTER-1:0]; // target address from master
-wire [D_WD-1:0] wbd_din_master_t[WB_MASTER-1:0]; // target address from master
-reg [D_WD-1:0] wbd_dout_master_t[WB_MASTER-1:0]; // target address from master
-wire [ADR_WD-1:0] wbd_adr_master_t[WB_MASTER-1:0]; // target address from master
-wire [BE_WD-1:0] wbd_be_master_t[WB_MASTER-1:0]; // target address from master
-
-
-reg [WB_SLAVE-1:0] wbd_stb_slave;
-reg [WB_SLAVE-1:0] wbd_we_slave;
-reg [WB_SLAVE-1:0] wbd_cyc_slave;
-wire [D_WD-1:0] wbd_dout_slave_t[WB_SLAVE-1:0]; // target data towards master
-
-
-reg [D_WD-1:0] wbd_din_slave_t[WB_SLAVE-1:0]; // target address from master
-reg [ADR_WD-1:0] wbd_adr_slave_t[WB_SLAVE-1:0]; // target address from master
-reg [BE_WD-1:0] wbd_be_slave_t[WB_SLAVE-1:0]; // target address from master
-
-integer i,k,l,n;
-
-
-/**********************************************************
- Re-Arraging the array in seperate two dimensional information
-***********************************************************/
-
-genvar j,m;
-generate
-
- // Connect the Master Mux
- for(j=0; j < WB_MASTER ; j = j + 1) begin : master_expand
- assign wbd_taddr_master_t[j] = wbd_taddr_master[((j+1)*TAR_WD)-1:j * TAR_WD];
- assign wbd_din_master_t[j] = wbd_din_master[((j+1)*D_WD)-1:j * D_WD];
- assign wbd_adr_master_t[j] = wbd_adr_master[((j+1)*ADR_WD)-1:j * ADR_WD];
- assign wbd_be_master_t[j] = wbd_be_master[((j+1)*BE_WD)-1:j * BE_WD];
-
- assign wbd_dout_master[((j+1)*D_WD)-1:j * D_WD] = wbd_dout_master_t[j];
- end
-
- // Connect the Slave Mux
- for(m=0; m < WB_SLAVE ; m = m + 1) begin : slave_expand
- assign wbd_din_slave[((m+1)*D_WD)-1:m * D_WD] = wbd_din_slave_t[m];
- assign wbd_adr_slave[((m+1)*ADR_WD)-1:m * ADR_WD] = wbd_adr_slave_t[m];
- assign wbd_be_slave[((m+1)*BE_WD)-1:m * BE_WD] = wbd_be_slave_t[m];
-
- assign wbd_dout_slave_t[m] = wbd_dout_slave[((m+1)*D_WD)-1:m * D_WD];
-
- end
-endgenerate
-
-always @* begin
- for(k = 0; k < WB_MASTER; k = k + 1) begin
- if(master_busy[k] == 1) begin
- wbd_dout_master_t[k] = wbd_dout_slave_t[master_mx_id[k]];
- wbd_ack_master[k] = wbd_ack_slave[master_mx_id[k]];
- wbd_err_master[k] = wbd_err_slave[master_mx_id[k]];
- wbd_rty_master[k] = wbd_rty_slave[master_mx_id[k]];
- end else begin
- wbd_dout_master_t[k] = 0;
- wbd_ack_master[k] = 0;
- wbd_err_master[k] = 0;
- wbd_rty_master[k] = 0;
- end
- end
- for(l = 0; l < WB_SLAVE; l = l + 1) begin
- if(slave_busy[l] == 1) begin
- wbd_din_slave_t[l] = wbd_din_master_t[slave_mx_id[l]];
- wbd_adr_slave_t[l] = wbd_adr_master_t[slave_mx_id[l]];
- wbd_be_slave_t[l] = wbd_be_master_t[slave_mx_id[l]];
- wbd_stb_slave[l] = wbd_stb_master[slave_mx_id[l]];
- wbd_we_slave[l] = wbd_we_master[slave_mx_id[l]];
- wbd_cyc_slave[l] = wbd_cyc_master[slave_mx_id[l]];
- end else begin
- wbd_din_slave_t[l] = 0;
- wbd_adr_slave_t[l] = 0;
- wbd_be_slave_t[l] = 0;
- wbd_stb_slave[l] = 0;
- wbd_we_slave[l] = 0;
- wbd_cyc_slave[l] = 0;
- end
- end
-end
-
-/*******************************************************
- Parsing through the master and deciding on mux connectio
- Step-1: analysis the master from 0 to total master
- Step-2: If the previously master is not busy,
- Then check for any new request from the master and
- check corresponding slave is free or not. If there is
- master request and requesting slave is free.
- Then set the master max id to slave id &
- requesting slave to master number & set the master
- and slave busy flag
- Step-3: If the previous state of master is busy and bus-cycle
- is de-asserted, then reset the master and corresponding
- slave busy flag
-
-*********************************************************/
-
-always @(negedge rst_n or posedge clk) begin
- if(rst_n == 0) begin
- master_busy <= 0;
- slave_busy <= 0;
- end else begin
- for(i = 0; i < WB_MASTER; i = i + 1) begin
- if(master_busy[i] == 0) begin
- if(wbd_stb_master[i] & slave_busy[wbd_taddr_master_t[i]] == 0) begin
- $display("Locking Master Id: %d for tar_master: %d, Total Master: %x ", i, wbd_taddr_master_t[i], wbd_taddr_master);
- slave_busy[wbd_taddr_master_t[i]] = 1;
- master_busy[i] = 1;
- end
- end else if(wbd_cyc_master[i] == 0) begin
- master_busy[i] <= 0;
- slave_busy[wbd_taddr_master_t[i]] <= 0;
- end
- end
- end
-end
-
-// Seperated non resetable two dimensional reg
-always @(posedge clk) begin
- for(n = 0; n < WB_MASTER; n = n + 1) begin
- if(master_busy[n] == 0) begin
- if(wbd_stb_master[n] & slave_busy[wbd_taddr_master_t[n]] == 0) begin
- master_mx_id[n] <= wbd_taddr_master_t[n];
- slave_mx_id [wbd_taddr_master_t[n]] <= n;
- // synopsys translate_off
- $display("%m:%t: Locking Master : %d with Slave : %d",$time,i,wbd_taddr_master_t[n]);
- // synopsys translate_on
- end
- end else if(wbd_cyc_master[n] == 0) begin
- if(master_busy[n] == 1) begin
- // synopsys translate_off
- $display("%m:%t: Releasing Master : %d with Slave : %d",$time,i,wbd_taddr_master_t[n]);
- // synopsys translate_on
- end
- end
- end
-end
-
-
-endmodule
diff --git a/verilog/rtl/lib/wb_stagging.sv b/verilog/rtl/lib/wb_stagging.sv
new file mode 100644
index 0000000..5fce5f1
--- /dev/null
+++ b/verilog/rtl/lib/wb_stagging.sv
@@ -0,0 +1,155 @@
+//----------------------------------------------------------------------
+// This logic create a holding register for Wishbone interface.
+// This is usefull to break timing issue at interconnect
+//
+// Limitation: Due to stagging FF, Continous Burst of Wishbone will have one
+// cycle break between each transaction
+//----------------------------------------------------------------------
+//////////////////////////////////////////////////////////////////////
+//// ////
+//// Wishbone Stagging FF ////
+//// ////
+//// This file is part of the YIFive cores project ////
+//// http://www.opencores.org/cores/yifive/ ////
+//// ////
+//// Description ////
+//// This logic create a holding FF for Wishbone interface. ////
+//// This is usefull to break timing issue at interconnect ////
+//// ////
+//// Limitation: Due to stagging FF, Continous Burst of ////
+//// Wishbone will have one cycle break between each transaction ////
+//// ////
+//// To Do: ////
+//// nothing ////
+//// ////
+//// Author(s): ////
+//// - Dinesh Annayya, dinesha@opencores.org ////
+//// ////
+//// Revision : ////
+//// 0.1 - 12th June 2021, Dinesh A ////
+//// ////
+//////////////////////////////////////////////////////////////////////
+//// ////
+//// Copyright (C) 2000 Authors and OPENCORES.ORG ////
+//// ////
+//// This source file may be used and distributed without ////
+//// restriction provided that this copyright statement is not ////
+//// removed from the file and that any derivative work contains ////
+//// the original copyright notice and the associated disclaimer. ////
+//// ////
+//// This source file is free software; you can redistribute it ////
+//// and/or modify it under the terms of the GNU Lesser General ////
+//// Public License as published by the Free Software Foundation; ////
+//// either version 2.1 of the License, or (at your option) any ////
+//// later version. ////
+//// ////
+//// This source is distributed in the hope that it will be ////
+//// useful, but WITHOUT ANY WARRANTY; without even the implied ////
+//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR ////
+//// PURPOSE. See the GNU Lesser General Public License for more ////
+//// details. ////
+//// ////
+//// You should have received a copy of the GNU Lesser General ////
+//// Public License along with this source; if not, download it ////
+//// from http://www.opencores.org/lgpl.shtml ////
+//// ////
+//////////////////////////////////////////////////////////////////////
+
+
+module wb_stagging (
+ input logic clk_i,
+ input logic rst_n,
+ // WishBone Input master I/P
+ input logic [31:0] m_wbd_dat_i,
+ input logic [31:0] m_wbd_adr_i,
+ input logic [3:0] m_wbd_sel_i,
+ input logic m_wbd_we_i,
+ input logic m_wbd_cyc_i,
+ input logic m_wbd_stb_i,
+ input logic [3:0] m_wbd_tid_i,
+ output logic [31:0] m_wbd_dat_o,
+ output logic m_wbd_ack_o,
+ output logic m_wbd_err_o,
+
+ // Slave Interface
+ input logic [31:0] s_wbd_dat_i,
+ input logic s_wbd_ack_i,
+ input logic s_wbd_err_i,
+ output logic [31:0] s_wbd_dat_o,
+ output logic [31:0] s_wbd_adr_o,
+ output logic [3:0] s_wbd_sel_o,
+ output logic s_wbd_we_o,
+ output logic s_wbd_cyc_o,
+ output logic s_wbd_stb_o,
+ output logic [3:0] s_wbd_tid_o
+
+);
+
+logic holding_busy ; // Indicate Stagging for Free or not
+logic [31:0] m_wbd_dat_i_ff ; // Flopped vesion of m_wbd_dat_i
+logic [31:0] m_wbd_adr_i_ff ; // Flopped vesion of m_wbd_adr_i
+logic [3:0] m_wbd_sel_i_ff ; // Flopped vesion of m_wbd_sel_i
+logic m_wbd_we_i_ff ; // Flopped vesion of m_wbd_we_i
+logic m_wbd_cyc_i_ff ; // Flopped vesion of m_wbd_cyc_i
+logic m_wbd_stb_i_ff ; // Flopped vesion of m_wbd_stb_i
+logic [3:0] m_wbd_tid_i_ff ; // Flopped vesion of m_wbd_tid_i
+logic [31:0] s_wbd_dat_i_ff ; // Flopped vesion of s_wbd_dat_i
+logic s_wbd_ack_i_ff ; // Flopped vesion of s_wbd_ack_i
+logic s_wbd_err_i_ff ; // Flopped vesion of s_wbd_err_i
+
+
+assign s_wbd_dat_o = m_wbd_dat_i_ff;
+assign s_wbd_adr_o = m_wbd_adr_i_ff;
+assign s_wbd_sel_o = m_wbd_sel_i_ff;
+assign s_wbd_we_o = m_wbd_we_i_ff;
+assign s_wbd_cyc_o = m_wbd_cyc_i_ff;
+assign s_wbd_stb_o = m_wbd_stb_i_ff;
+assign s_wbd_tid_o = m_wbd_tid_i_ff;
+
+assign m_wbd_dat_o = s_wbd_dat_i_ff;
+assign m_wbd_ack_o = s_wbd_ack_i_ff;
+assign m_wbd_err_o = s_wbd_err_i_ff;
+
+always @(negedge rst_n or posedge clk_i)
+begin
+ if(rst_n == 1'b0) begin
+ holding_busy <= 1'b0;
+ m_wbd_dat_i_ff <= 'h0;
+ m_wbd_adr_i_ff <= 'h0;
+ m_wbd_sel_i_ff <= 'h0;
+ m_wbd_we_i_ff <= 'h0;
+ m_wbd_cyc_i_ff <= 'h0;
+ m_wbd_stb_i_ff <= 'h0;
+ m_wbd_tid_i_ff <= 'h0;
+ s_wbd_dat_i_ff <= 'h0;
+ s_wbd_ack_i_ff <= 'h0;
+ s_wbd_err_i_ff <= 'h0;
+ end else begin
+ s_wbd_dat_i_ff <= s_wbd_dat_i;
+ s_wbd_ack_i_ff <= s_wbd_ack_i;
+ s_wbd_err_i_ff <= s_wbd_err_i;
+ if(m_wbd_stb_i && holding_busy == 0 && m_wbd_ack_o == 0) begin
+ holding_busy <= 1'b1;
+ m_wbd_dat_i_ff <= m_wbd_dat_i;
+ m_wbd_adr_i_ff <= m_wbd_adr_i;
+ m_wbd_sel_i_ff <= m_wbd_sel_i;
+ m_wbd_we_i_ff <= m_wbd_we_i;
+ m_wbd_cyc_i_ff <= m_wbd_cyc_i;
+ m_wbd_stb_i_ff <= m_wbd_stb_i;
+ m_wbd_tid_i_ff <= m_wbd_tid_i;
+ end else if (holding_busy && s_wbd_ack_i) begin
+ holding_busy <= 1'b0;
+ m_wbd_dat_i_ff <= 'h0;
+ m_wbd_adr_i_ff <= 'h0;
+ m_wbd_sel_i_ff <= 'h0;
+ m_wbd_we_i_ff <= 'h0;
+ m_wbd_cyc_i_ff <= 'h0;
+ m_wbd_stb_i_ff <= 'h0;
+ m_wbd_tid_i_ff <= 'h0;
+ end
+ end
+end
+
+
+endmodule
+
diff --git a/verilog/rtl/spi_master/src/spim_clkgen.sv b/verilog/rtl/spi_master/src/spim_clkgen.sv
index 2c6b236..8c9fa83 100644
--- a/verilog/rtl/spi_master/src/spim_clkgen.sv
+++ b/verilog/rtl/spi_master/src/spim_clkgen.sv
@@ -58,25 +58,22 @@
input logic clk,
input logic rstn,
input logic en,
- input logic [7:0] cfg_sck_period,
+ input logic [5:0] cfg_sck_period,
output logic spi_clk,
output logic spi_fall,
output logic spi_rise
);
- logic [7:0] sck_half_period;
- logic [7:0] clk_cnt;
+ logic [5:0] sck_half_period;
+ logic [5:0] clk_cnt;
- assign sck_half_period = {1'b0, cfg_sck_period[7:1]};
+ assign sck_half_period = {1'b0, cfg_sck_period[5:1]};
// The first transition on the sck_toggle happens one SCK period
// after en is asserted
always @(posedge clk or negedge rstn) begin
if(!rstn) begin
- clk_cnt <= 'h1;
spi_clk <= 1'b1;
- spi_fall <= 1'b0;
- spi_rise <= 1'b0;
end // if (!reset_n)
else
begin
diff --git a/verilog/rtl/spi_master/src/spim_ctrl.sv b/verilog/rtl/spi_master/src/spim_ctrl.sv
index 8ce6524..5ae41ad 100644
--- a/verilog/rtl/spi_master/src/spim_ctrl.sv
+++ b/verilog/rtl/spi_master/src/spim_ctrl.sv
@@ -49,7 +49,7 @@
input logic rstn,
output logic eot,
- input logic [7:0] spi_clk_div,
+ input logic [5:0] spi_clk_div,
output logic [8:0] spi_status,
diff --git a/verilog/rtl/spi_master/src/spim_regs.sv b/verilog/rtl/spi_master/src/spim_regs.sv
index 0128568..cfb8ead 100644
--- a/verilog/rtl/spi_master/src/spim_regs.sv
+++ b/verilog/rtl/spi_master/src/spim_regs.sv
@@ -227,6 +227,7 @@
end
end
+ wire [3:0] reg_addr = spim_wb_addr[5:2];
integer byte_index;
always_ff @(negedge rst_n or posedge mclk) begin
if ( rst_n == 1'b0 ) begin
@@ -328,7 +329,7 @@
endcase
end else if (spim_reg_req & spim_wb_we )
begin
- case(spim_wb_addr[7:4])
+ case(reg_addr)
REG_CTRL:
begin
if ( spim_wb_be[0] == 1 )
@@ -398,8 +399,6 @@
- wire [3:0] reg_addr = spim_wb_addr[7:4];
-
// implement slave model register read mux
always_comb
begin
diff --git a/verilog/rtl/spi_master/synth/Makefile b/verilog/rtl/spi_master/synth/Makefile
new file mode 100644
index 0000000..1c814b2
--- /dev/null
+++ b/verilog/rtl/spi_master/synth/Makefile
@@ -0,0 +1,32 @@
+#------------------------------------------------------------------------------
+# Makefile for Synthesis
+#------------------------------------------------------------------------------
+
+# Paths
+export ROOT_DIR := $(shell pwd)
+export REPORT_DIR := $(ROOT_DIR)/reports
+export NETLIST_DIR := $(ROOT_DIR)/netlist
+export TMP_DIR := $(ROOT_DIR)/tmp
+
+
+# Targets
+.PHONY: clean create synth
+
+default: clean create synth
+
+synth: clean create
+ yosys -g -c synth.tcl -l synth.log
+
+create:
+ mkdir -p ./tmp/synthesis;
+ mkdir -p ./reports;
+ mkdir -p ./netlist;
+ $(OPENLANE_ROOT)/scripts/libtrim.pl $(PDK_ROOT)/sky130A/libs.ref/sky130_fd_sc_hd/lib/sky130_fd_sc_hd__tt_025C_1v80.lib $(PDK_ROOT)/sky130A/libs.tech/openlane/sky130_fd_sc_hd/no_synth.cells > ./tmp/trimmed.lib
+
+
+
+clean:
+ $(RM) -R synth.log
+ $(RM) -R $(REPORT_DIR)
+ $(RM) -R $(NETLIST_DIR)
+ $(RM) -R $(TMP_DIR)
diff --git a/verilog/rtl/spi_master/synth/synth.tcl b/verilog/rtl/spi_master/synth/synth.tcl
new file mode 100755
index 0000000..1c327cf
--- /dev/null
+++ b/verilog/rtl/spi_master/synth/synth.tcl
@@ -0,0 +1,388 @@
+# Copyright 2020 Efabless Corporation
+#
+# 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.
+
+# inputs expected as env vars
+#set opt $::env(SYNTH_OPT)
+########### config.tcl ##################
+# User config
+
+# User config
+set ::env(DESIGN_DIR) ../
+
+set ::env(PROJ_DIR) ../../../../
+
+# User config
+set ::env(DESIGN_NAME) spim_ctrl
+
+# Change if needed
+set ::env(VERILOG_FILES) [glob \
+ ../src/spim_clkgen.sv \
+ ../src/spim_ctrl.sv \
+ ../src/spim_fifo.sv \
+ ../src/spim_regs.sv \
+ ../src/spim_rx.sv \
+ ../src/spim_top.sv \
+ ../src/spim_tx.sv ]
+
+
+set ::env(SYNTH_DEFINES) [list YOSYS ]
+
+
+set ::env(LIB_SYNTH) ./tmp/trimmed.lib
+
+
+# Fill this
+set ::env(CLOCK_PERIOD) "10"
+set ::env(CLOCK_PORT) "mclk"
+set ::env(CLOCK_TREE_SYNTH) 0
+
+set ::env(RUN_SIMPLE_CTS) 0
+set ::env(SYNTH_BUFFERING) 0
+set ::env(SYNTH_SIZING) 0
+
+set ::env(SYNTH_DRIVING_CELL) "sky130_fd_sc_hd__inv_8"
+set ::env(SYNTH_CAP_LOAD) "17.65"
+set ::env(SYNTH_MAX_TRAN) "[expr {0.1*10.0}]"
+
+set ::env(SYNTH_MAX_FANOUT) 6
+set ::env(FP_CORE_UTIL) 50
+set ::env(PL_TARGET_DENSITY) [ expr ($::env(FP_CORE_UTIL)+5) / 100.0 ]
+set ::env(CELL_PAD) 4
+
+set ::env(SYNTH_NO_FLAT) "0"
+
+
+set ::env(SYNTH_STRATEGY) "AREA 0"
+set ::env(SYNTH_TIELO_PORT) "sky130_fd_sc_hd__conb_1 LO"
+set ::env(SYNTH_TIEHI_PORT) "sky130_fd_sc_hd__conb_1 HI"
+set ::env(SYNTH_MIN_BUF_PORT) "sky130_fd_sc_hd__buf_2 A X"
+
+
+set ::env(CLOCK_NET) $::env(CLOCK_PORT)
+
+
+
+set ::env(yosys_tmp_file_tag) "./tmp/"
+set ::env(TMP_DIR) "./tmp/"
+set ::env(yosys_netlist_dir) "./netlist"
+set ::env(yosys_report_file_tag) "./reports/yosys"
+set ::env(yosys_result_file_tag) "./reports/yosys.synthesis"
+
+set ::env(SAVE_NETLIST) $::env(yosys_netlist_dir)/$::env(DESIGN_NAME).gv
+
+
+
+########### End of config.tcl
+set buffering $::env(SYNTH_BUFFERING)
+set sizing $::env(SYNTH_SIZING)
+
+yosys -import
+
+set vtop $::env(DESIGN_NAME)
+#set sdc_file $::env(SDC_FILE)
+set sclib $::env(LIB_SYNTH)
+
+if { [info exists ::env(SYNTH_DEFINES) ] } {
+ foreach define $::env(SYNTH_DEFINES) {
+ log "Defining $define"
+ verilog_defines -D$define
+ }
+}
+
+set vIdirsArgs ""
+if {[info exist ::env(VERILOG_INCLUDE_DIRS)]} {
+ foreach dir $::env(VERILOG_INCLUDE_DIRS) {
+ log "Adding include file -I$dir "
+ lappend vIdirsArgs "-I$dir"
+ }
+ set vIdirsArgs [join $vIdirsArgs]
+}
+
+
+
+if { [info exists ::env(EXTRA_LIBS) ] } {
+ foreach lib $::env(EXTRA_LIBS) {
+ read_liberty {*}$vIdirsArgs -lib -ignore_miss_dir -setattr blackbox $lib
+ }
+}
+
+
+
+# ns expected (in sdc as well)
+set clock_period [expr {$::env(CLOCK_PERIOD)*1000}]
+
+set driver $::env(SYNTH_DRIVING_CELL)
+set cload $::env(SYNTH_CAP_LOAD)
+# input pin cap of IN_3VX8
+set max_FO $::env(SYNTH_MAX_FANOUT)
+if {![info exist ::env(SYNTH_MAX_TRAN)]} {
+ set ::env(SYNTH_MAX_TRAN) [expr {0.1*$clock_period}]
+} else {
+ set ::env(SYNTH_MAX_TRAN) [expr {$::env(SYNTH_MAX_TRAN) * 1000}]
+}
+set max_Tran $::env(SYNTH_MAX_TRAN)
+
+
+# Mapping parameters
+set A_factor 0.00
+set B_factor 0.88
+set F_factor 0.00
+
+# Don't change these unless you know what you are doing
+set stat_ext ".stat.rpt"
+set chk_ext ".chk.rpt"
+set gl_ext ".gl.v"
+set constr_ext ".$clock_period.constr"
+set timing_ext ".timing.txt"
+set abc_ext ".abc"
+
+
+# get old sdc, add library specific stuff for abc scripts
+set sdc_file $::env(yosys_tmp_file_tag).sdc
+set outfile [open ${sdc_file} w]
+#puts $outfile $sdc_data
+puts $outfile "set_driving_cell ${driver}"
+puts $outfile "set_load ${cload}"
+close $outfile
+
+
+# ABC Scrips
+set abc_rs_K "resub,-K,"
+set abc_rs "resub"
+set abc_rsz "resub,-z"
+set abc_rw_K "rewrite,-K,"
+set abc_rw "rewrite"
+set abc_rwz "rewrite,-z"
+set abc_rf "refactor"
+set abc_rfz "refactor,-z"
+set abc_b "balance"
+
+set abc_resyn2 "${abc_b}; ${abc_rw}; ${abc_rf}; ${abc_b}; ${abc_rw}; ${abc_rwz}; ${abc_b}; ${abc_rfz}; ${abc_rwz}; ${abc_b}"
+set abc_share "strash; multi,-m; ${abc_resyn2}"
+set abc_resyn2a "${abc_b};${abc_rw};${abc_b};${abc_rw};${abc_rwz};${abc_b};${abc_rwz};${abc_b}"
+set abc_resyn3 "balance;resub;resub,-K,6;balance;resub,-z;resub,-z,-K,6;balance;resub,-z,-K,5;balance"
+set abc_resyn2rs "${abc_b};${abc_rs_K},6;${abc_rw};${abc_rs_K},6,-N,2;${abc_rf};${abc_rs_K},8;${abc_rw};${abc_rs_K},10;${abc_rwz};${abc_rs_K},10,-N,2;${abc_b},${abc_rs_K},12;${abc_rfz};${abc_rs_K},12,-N,2;${abc_rwz};${abc_b}"
+
+set abc_choice "fraig_store; ${abc_resyn2}; fraig_store; ${abc_resyn2}; fraig_store; fraig_restore"
+set abc_choice2 "fraig_store; balance; fraig_store; ${abc_resyn2}; fraig_store; ${abc_resyn2}; fraig_store; ${abc_resyn2}; fraig_store; fraig_restore"
+
+set abc_map_old_cnt "map,-p,-a,-B,0.2,-A,0.9,-M,0"
+set abc_map_old_dly "map,-p,-B,0.2,-A,0.9,-M,0"
+set abc_retime_area "retime,-D,{D},-M,5"
+set abc_retime_dly "retime,-D,{D},-M,6"
+set abc_map_new_area "amap,-m,-Q,0.1,-F,20,-A,20,-C,5000"
+
+set abc_area_recovery_1 "${abc_choice}; map;"
+set abc_area_recovery_2 "${abc_choice2}; map;"
+
+set map_old_cnt "map,-p,-a,-B,0.2,-A,0.9,-M,0"
+set map_old_dly "map,-p,-B,0.2,-A,0.9,-M,0"
+set abc_retime_area "retime,-D,{D},-M,5"
+set abc_retime_dly "retime,-D,{D},-M,6"
+set abc_map_new_area "amap,-m,-Q,0.1,-F,20,-A,20,-C,5000"
+
+if {$buffering==1} {
+ set abc_fine_tune "buffer,-N,${max_FO},-S,${max_Tran};upsize,{D};dnsize,{D}"
+} elseif {$sizing} {
+ set abc_fine_tune "upsize,{D};dnsize,{D}"
+} else {
+ set abc_fine_tune ""
+}
+
+
+set delay_scripts [list \
+ "+read_constr,${sdc_file};fx;mfs;strash;refactor;${abc_resyn2};${abc_retime_dly}; scleanup;${abc_map_old_dly};retime,-D,{D};${abc_fine_tune};stime,-p;print_stats -m" \
+ \
+ "+read_constr,${sdc_file};fx;mfs;strash;refactor;${abc_resyn2};${abc_retime_dly}; scleanup;${abc_choice2};${abc_map_old_dly};${abc_area_recovery_2}; retime,-D,{D};${abc_fine_tune};stime,-p;print_stats -m" \
+ \
+ "+read_constr,${sdc_file};fx;mfs;strash;refactor;${abc_resyn2};${abc_retime_dly}; scleanup;${abc_choice};${abc_map_old_dly};${abc_area_recovery_1}; retime,-D,{D};${abc_fine_tune};stime,-p;print_stats -m" \
+ \
+ "+read_constr,${sdc_file};fx;mfs;strash;refactor;${abc_resyn2};${abc_retime_area};scleanup;${abc_choice2};${abc_map_new_area};${abc_choice2};${abc_map_old_dly};retime,-D,{D};${abc_fine_tune};stime,-p;print_stats -m" \
+ ]
+
+set area_scripts [list \
+ "+read_constr,${sdc_file};fx;mfs;strash;refactor;${abc_resyn2};${abc_retime_area};scleanup;${abc_choice2};${abc_map_new_area};retime,-D,{D};${abc_fine_tune};stime,-p;print_stats -m" \
+ \
+ "+read_constr,${sdc_file};fx;mfs;strash;refactor;${abc_resyn2};${abc_retime_area};scleanup;${abc_choice2};${abc_map_new_area};${abc_choice2};${abc_map_new_area};retime,-D,{D};${abc_fine_tune};stime,-p;print_stats -m" \
+ \
+ "+read_constr,${sdc_file};fx;mfs;strash;refactor;${abc_choice2};${abc_retime_area};scleanup;${abc_choice2};${abc_map_new_area};${abc_choice2};${abc_map_new_area};retime,-D,{D};${abc_fine_tune};stime,-p;print_stats -m" \
+ ]
+
+set all_scripts [list {*}$delay_scripts {*}$area_scripts]
+
+set strategy_parts [split $::env(SYNTH_STRATEGY)]
+
+proc synth_strategy_format_err { } {
+ upvar area_scripts area_scripts
+ upvar delay_scripts delay_scripts
+ log -stderr "\[ERROR] Misformatted SYNTH_STRATEGY (\"$::env(SYNTH_STRATEGY)\")."
+ log -stderr "\[ERROR] Correct format is \"DELAY|AREA 0-[expr [llength $delay_scripts]-1]|0-[expr [llength $area_scripts]-1]\"."
+ exit 1
+}
+
+if { [llength $strategy_parts] != 2 } {
+ synth_strategy_format_err
+}
+
+set strategy_type [lindex $strategy_parts 0]
+set strategy_type_idx [lindex $strategy_parts 1]
+
+if { $strategy_type != "AREA" && $strategy_type != "DELAY" } {
+ log -stderr "\[ERROR] AREA|DELAY tokens not found. ($strategy_type)"
+ synth_strategy_format_err
+}
+
+if { $strategy_type == "DELAY" && $strategy_type_idx >= [llength $delay_scripts] } {
+ log -stderr "\[ERROR] strategy index ($strategy_type_idx) is too high."
+ synth_strategy_format_err
+}
+
+if { $strategy_type == "AREA" && $strategy_type_idx >= [llength $area_scripts] } {
+ log -stderr "\[ERROR] strategy index ($strategy_type_idx) is too high."
+ synth_strategy_format_err
+}
+
+if { $strategy_type == "DELAY" } {
+ set strategy $strategy_type_idx
+} else {
+ set strategy [expr {[llength $delay_scripts]+$strategy_type_idx}]
+}
+
+
+for { set i 0 } { $i < [llength $::env(VERILOG_FILES)] } { incr i } {
+ read_verilog -sv {*}$vIdirsArgs [lindex $::env(VERILOG_FILES) $i]
+}
+
+if { [info exists ::env(VERILOG_FILES_BLACKBOX)] } {
+ foreach verilog_file $::env(VERILOG_FILES_BLACKBOX) {
+ read_verilog -sv {*}$vIdirsArgs -lib $verilog_file
+ }
+}
+select -module $vtop
+show -format dot -prefix $::env(TMP_DIR)/synthesis/hierarchy
+select -clear
+
+hierarchy -check -top $vtop
+
+# Infer tri-state buffers.
+set tbuf_map false
+if { [info exists ::env(TRISTATE_BUFFER_MAP)] } {
+ if { [file exists $::env(TRISTATE_BUFFER_MAP)] } {
+ set tbuf_map true
+ tribuf
+ } else {
+ log "WARNING: TRISTATE_BUFFER_MAP is defined but could not be found: $::env(TRISTATE_BUFFER_MAP)"
+ }
+}
+
+if { $::env(SYNTH_NO_FLAT) } {
+ synth -top $vtop
+} else {
+ synth -top $vtop -flatten
+}
+
+share -aggressive
+opt
+opt_clean -purge
+
+tee -o "$::env(yosys_report_file_tag)_pre.stat" stat
+
+# Map tri-state buffers.
+if { $tbuf_map } {
+ log {mapping tbuf}
+ techmap -map $::env(TRISTATE_BUFFER_MAP)
+ simplemap
+}
+
+# handle technology mapping of 4-MUX, and tell Yosys to infer 4-muxes
+if { [info exists ::env(SYNTH_MUX4_MAP)] && [file exists $::env(SYNTH_MUX4_MAP)] } {
+ muxcover -mux4
+ techmap -map $::env(SYNTH_MUX4_MAP)
+ simplemap
+}
+
+# handle technology mapping of 2-MUX
+if { [info exists ::env(SYNTH_MUX_MAP)] && [file exists $::env(SYNTH_MUX_MAP)] } {
+ techmap -map $::env(SYNTH_MUX_MAP)
+ simplemap
+}
+
+# handle technology mapping of latches
+if { [info exists ::env(SYNTH_LATCH_MAP)] && [file exists $::env(SYNTH_LATCH_MAP)] } {
+ techmap -map $::env(SYNTH_LATCH_MAP)
+ simplemap
+}
+
+dfflibmap -liberty $sclib
+tee -o "$::env(yosys_report_file_tag)_dff.stat" stat
+
+if { [info exists ::env(SYNTH_EXPLORE)] && $::env(SYNTH_EXPLORE) } {
+ design -save myDesign
+
+ for { set index 0 } { $index < [llength $all_scripts] } { incr index } {
+ log "\[INFO\]: ABC: WireLoad : S_$index"
+ design -load myDesign
+
+ abc -D $clock_period \
+ -constr "$sdc_file" \
+ -liberty $sclib \
+ -script [lindex $all_scripts $index]
+
+ setundef -zero
+
+ hilomap -hicell {*}$::env(SYNTH_TIEHI_PORT) -locell {*}$::env(SYNTH_TIELO_PORT)
+
+ # get rid of the assignments that make verilog2def fail
+ splitnets
+ opt_clean -purge
+ insbuf -buf {*}$::env(SYNTH_MIN_BUF_PORT)
+
+ tee -o "$::env(yosys_report_file_tag)_$index$chk_ext" check
+ write_verilog -noattr -noexpr -nohex -nodec -defparam "$::env(yosys_result_file_tag)_$index.v"
+ design -reset
+ }
+} else {
+
+ log "\[INFO\]: ABC: WireLoad : S_$strategy"
+
+ abc -D $clock_period \
+ -constr "$sdc_file" \
+ -liberty $sclib \
+ -script [lindex $all_scripts $strategy] \
+ -showtmp;
+
+ setundef -zero
+
+ hilomap -hicell {*}$::env(SYNTH_TIEHI_PORT) -locell {*}$::env(SYNTH_TIELO_PORT)
+
+ # get rid of the assignments that make verilog2def fail
+ splitnets
+ opt_clean -purge
+ insbuf -buf {*}$::env(SYNTH_MIN_BUF_PORT)
+
+ tee -o "$::env(yosys_report_file_tag)_$strategy$chk_ext" check
+ write_verilog -noattr -noexpr -nohex -nodec -defparam "$::env(SAVE_NETLIST)"
+}
+
+if { $::env(SYNTH_NO_FLAT) } {
+ design -reset
+ file copy -force $::env(SAVE_NETLIST) $::env(yosys_tmp_file_tag)_unflat.v
+ read_verilog -sv $::env(SAVE_NETLIST)
+ synth -top $vtop -flatten
+ splitnets
+ opt_clean -purge
+ insbuf -buf {*}$::env(SYNTH_MIN_BUF_PORT)
+ write_verilog -noattr -noexpr -nohex -nodec -defparam "$::env(SAVE_NETLIST)"
+ tee -o "$::env(yosys_report_file_tag)_$strategy$chk_ext" check
+}
diff --git a/verilog/rtl/syntacore/scr1/sim/tests/common/link_tcm.ld b/verilog/rtl/syntacore/scr1/sim/tests/common/link_tcm.ld
index 7b37506..0612031 100644
--- a/verilog/rtl/syntacore/scr1/sim/tests/common/link_tcm.ld
+++ b/verilog/rtl/syntacore/scr1/sim/tests/common/link_tcm.ld
@@ -9,7 +9,7 @@
MEMORY {
RAM (rwx) : ORIGIN = 0x0, LENGTH = 64K
- TCM (rwx) : ORIGIN = 0x00480000, LENGTH = 64K
+ TCM (rwx) : ORIGIN = 0x20000000, LENGTH = 64K
}
STACK_SIZE = 1024;
diff --git a/verilog/rtl/syntacore/scr1/src/top/scr1_dmem_wb.sv b/verilog/rtl/syntacore/scr1/src/top/scr1_dmem_wb.sv
index 85a0c5c..b9e893a 100644
--- a/verilog/rtl/syntacore/scr1/src/top/scr1_dmem_wb.sv
+++ b/verilog/rtl/syntacore/scr1/src/top/scr1_dmem_wb.sv
@@ -21,6 +21,9 @@
//// On power up, wishbone output are unkown as it ////
//// driven from fifo output. To avoid unknown ////
//// propgation, we are driving 'h0 when fifo empty ////
+//// v2: June 18, 2021, Dinesh A ////
+//// core and wishbone is made async and async fifo ////
+//// added to take care of domain cross-over ////
//// ////
//////////////////////////////////////////////////////////////////////
//// ////
@@ -60,8 +63,8 @@
module scr1_dmem_wb (
// Control Signals
- input logic rst_n,
- input logic clk,
+ input logic core_rst_n, // core reset
+ input logic core_clk, // Core clock
// Core Interface
output logic dmem_req_ack,
@@ -74,6 +77,8 @@
output logic [1:0] dmem_resp,
// WB Interface
+ input logic wb_rst_n, // wishbone reset
+ input logic wb_clk, // wishbone clock
output logic wbd_stb_o, // strobe/request
output logic [SCR1_WB_WIDTH-1:0] wbd_adr_o, // address
output logic wbd_we_o, // write
@@ -88,31 +93,19 @@
//-------------------------------------------------------------------------------
// Local Parameters
//-------------------------------------------------------------------------------
-`ifndef SCR1_DMEM_WB_OUT_BP
-localparam SCR1_FIFO_WIDTH = 2;
-localparam SCR1_FIFO_CNT_WIDTH = 2;
-`endif // SCR1_DMEM_WB_OUT_BP
//-------------------------------------------------------------------------------
// Local type declaration
//-------------------------------------------------------------------------------
-typedef enum logic {
- SCR1_FSM_ADDR = 1'b0,
- SCR1_FSM_DATA = 1'b1,
- SCR1_FSM_ERR = 1'bx
-} type_scr1_fsm_e;
typedef struct packed {
+ logic [3:0] hbel;
logic hwrite;
logic [2:0] hwidth;
logic [SCR1_WB_WIDTH-1:0] haddr;
logic [SCR1_WB_WIDTH-1:0] hwdata;
} type_scr1_req_fifo_s;
-typedef struct packed {
- logic [2:0] hwidth;
- logic [1:0] haddr;
-} type_scr1_data_fifo_s;
typedef struct packed {
logic hresp;
@@ -238,85 +231,18 @@
//-------------------------------------------------------------------------------
logic req_fifo_rd;
logic req_fifo_wr;
-logic req_fifo_up;
-`ifdef SCR1_DMEM_WB_OUT_BP
-type_scr1_req_fifo_s req_fifo_new;
-type_scr1_req_fifo_s req_fifo_r;
-type_scr1_req_fifo_s [0:0] req_fifo;
-`else // SCR1_DMEM_WB_OUT_BP
-type_scr1_req_fifo_s [0:SCR1_FIFO_WIDTH-1] req_fifo;
-type_scr1_req_fifo_s [0:SCR1_FIFO_WIDTH-1] req_fifo_new;
-logic [SCR1_FIFO_CNT_WIDTH-1:0] req_fifo_cnt;
-logic [SCR1_FIFO_CNT_WIDTH-1:0] req_fifo_cnt_new;
-`endif // SCR1_DMEM_WB_OUT_BP
logic req_fifo_empty;
logic req_fifo_full;
-type_scr1_data_fifo_s data_fifo;
-type_scr1_resp_fifo_s resp_fifo;
-logic resp_fifo_hready;
+
+logic resp_fifo_rd;
+logic resp_fifo_empty;
+logic resp_fifo_full;
+
//-------------------------------------------------------------------------------
-// Interface to Core
+// REQ_FIFO (CORE to WB)
//-------------------------------------------------------------------------------
-assign dmem_req_ack = ~req_fifo_full;
-assign req_fifo_wr = ~req_fifo_full & dmem_req;
-
-assign dmem_rdata = (resp_fifo_hready) ? scr1_conv_wb2mem_rdata(resp_fifo.hwidth, resp_fifo.haddr, resp_fifo.hrdata) : 'h0;
-
-assign dmem_resp = (resp_fifo_hready)
- ? (resp_fifo.hresp == 1'b1)
- ? SCR1_MEM_RESP_RDY_OK
- : SCR1_MEM_RESP_RDY_ER
- : SCR1_MEM_RESP_NOTRDY ;
-
-//-------------------------------------------------------------------------------
-// REQ_FIFO
-//-------------------------------------------------------------------------------
-`ifdef SCR1_DMEM_WB_OUT_BP
-always_ff @(negedge rst_n, posedge clk) begin
- if (~rst_n) begin
- req_fifo_full <= 1'b0;
- end else begin
- if (~req_fifo_full) begin
- req_fifo_full <= dmem_req & ~req_fifo_rd;
- end else begin
- req_fifo_full <= ~req_fifo_rd;
- end
- end
-end
-assign req_fifo_empty = ~(req_fifo_full | dmem_req);
-
-assign req_fifo_up = ~req_fifo_rd & req_fifo_wr;
-always_ff @(posedge clk) begin
- if (req_fifo_up) begin
- req_fifo_r <= req_fifo_new;
- end
-end
-
-assign req_fifo_new.hwrite = dmem_req ? (dmem_cmd == SCR1_MEM_CMD_WR) : 1'b0;
-assign req_fifo_new.hwidth = dmem_req ? scr1_conv_mem2wb_width(dmem_width) : '0;
-assign req_fifo_new.haddr = dmem_req ? dmem_addr : '0;
-assign req_fifo_new.hwdata = (dmem_req & (dmem_cmd == SCR1_MEM_CMD_WR))
- ? scr1_conv_mem2wb_wdata(dmem_addr[1:0], dmem_width, dmem_wdata)
- : '0;
-assign req_fifo[0] = (req_fifo_full) ? req_fifo_r: req_fifo_new;
-
-//-------------------------------------------------------------------------------
-// Register Data from response path - Used by Read path logic
-//-------------------------------------------------------------------------------
-always_ff @(posedge clk) begin
- if (wbd_ack_i) begin
- if (~req_fifo_empty) begin
- data_fifo.hwidth <= req_fifo[0].hwidth;
- data_fifo.haddr <= req_fifo[0].haddr[1:0];
- end
- end
-end
-
-`else // SCR1_DMEM_WB_OUT_BP
-
-
wire hwrite_in = (dmem_cmd == SCR1_MEM_CMD_WR);
wire [2:0] hwidth_in = scr1_conv_mem2wb_width(dmem_width);
wire [SCR1_WB_WIDTH-1:0] haddr_in = dmem_addr;
@@ -339,47 +265,46 @@
end
-wire [SCR1_WB_WIDTH+SCR1_WB_WIDTH+3+4:0] req_fifo_din = {hbel_in,hwrite_in,hwidth_in,haddr_in,hwdata_in};
-wire [SCR1_WB_WIDTH+SCR1_WB_WIDTH+3+4:0] req_fifo_dout;
+//-------------------------------------------------------------------------------
+// REQ_FIFO (WB to CORE)
+//-------------------------------------------------------------------------------
+type_scr1_req_fifo_s req_fifo_din;
+type_scr1_req_fifo_s req_fifo_dout;
- sync_fifo #(
+
+assign dmem_req_ack = ~req_fifo_full;
+assign req_fifo_wr = ~req_fifo_full & dmem_req;
+
+//pack data in
+assign req_fifo_din.hbel = hbel_in;
+assign req_fifo_din.hwrite = hwrite_in;
+assign req_fifo_din.hwidth = hwidth_in;
+assign req_fifo_din.haddr = haddr_in;
+assign req_fifo_din.hwdata = hwdata_in;
+
+
+ async_fifo #(
.W(SCR1_WB_WIDTH+SCR1_WB_WIDTH+3+1+4), // Data Width
- .D(2) // FIFO DEPTH
+ .DP(4), // FIFO DEPTH
+ .WR_FAST(1), // We need FF'ed Full
+ .RD_FAST(1) // We need FF'ed Empty
) u_req_fifo(
+ // Writc Clock
+ .wr_clk (core_clk ),
+ .wr_reset_n (core_rst_n ),
+ .wr_en (req_fifo_wr ),
+ .wr_data (req_fifo_din ),
+ .full (req_fifo_full ),
+ .afull ( ),
- .rd_data (req_fifo_dout ),
-
- .reset_n (rst_n ),
- .clk (clk ),
- .wr_en (req_fifo_wr ), // Write
- .rd_en (req_fifo_rd ), // Read
- .wr_data (req_fifo_din ),
- .full (req_fifo_full ),
- .empty (req_fifo_empty )
-);
-
-//-------------------------------------------------------------------------------
-// Register Data from response path - Used by Read path logic
-//-------------------------------------------------------------------------------
-wire hwrite_out;
-wire [2:0] hwidth_out;
-wire [SCR1_WB_WIDTH-1:0] haddr_out;
-wire [SCR1_WB_WIDTH-1:0] hwdata_out;
-wire [3:0] hbel_out;
-
-
-assign {hbel_out,hwrite_out,hwidth_out,haddr_out,hwdata_out} = req_fifo_dout;
-
-always_ff @(posedge clk) begin
- if (wbd_ack_i) begin
- if (~req_fifo_empty) begin
- data_fifo.hwidth <= hwidth_out;
- data_fifo.haddr <= haddr_out[1:0];
- end
- end
-end
-
-`endif // SCR1_DMEM_WB_OUT_BP
+ // RD Clock
+ .rd_clk (wb_clk ),
+ .rd_reset_n (wb_rst_n ),
+ .rd_en (req_fifo_rd ),
+ .empty (req_fifo_empty ),
+ .aempty ( ),
+ .rd_data (req_fifo_dout )
+ );
always_comb begin
@@ -390,64 +315,62 @@
end
-//-------------------------------------------------------------------------------
-// FIFO response
-//-------------------------------------------------------------------------------
-`ifdef SCR1_DMEM_WB_IN_BP
-
-assign resp_fifo_hready = wbd_ack_i;
-assign resp_fifo.hresp = (wbd_err_i) ? 1'b0 : 1'b1;
-assign resp_fifo.hwidth = data_fifo.hwidth;
-assign resp_fifo.haddr = data_fifo.haddr;
-assign resp_fifo.hrdata = wbd_dat_i;
-
-assign wbd_stb_o = ~req_fifo_empty;
-assign wbd_adr_o = req_fifo[0].haddr;
-assign wbd_we_o = req_fifo[0].hwrite;
-assign wbd_dat_o = req_fifo[0].hwdata;
-
-always_comb begin
- wbd_sel_o = 0;
- case (req_fifo[0].hwidth)
- SCR1_DSIZE_8B : begin
- wbd_sel_o = 4'b0001 << req_fifo[0].haddr[1:0];
- end
- SCR1_DSIZE_16B : begin
- wbd_sel_o = 4'b0011 << req_fifo[0].haddr[1:0];
- end
- SCR1_DSIZE_32B : begin
- wbd_sel_o = 4'b1111;
- end
- endcase
-end
-`else // SCR1_DMEM_WB_IN_BP
-always_ff @(negedge rst_n, posedge clk) begin
- if (~rst_n) begin
- resp_fifo_hready <= 1'b0;
- end else begin
- resp_fifo_hready <= wbd_ack_i ;
- end
-end
-
-always_ff @(posedge clk) begin
- if (wbd_ack_i) begin
- resp_fifo.hresp <= (wbd_err_i) ? 1'b0 : 1'b1;
- resp_fifo.hwidth <= hwidth_out;
- resp_fifo.haddr <= haddr_out[1:0];
- resp_fifo.hrdata <= (wbd_we_o) ? 'h0: wbd_dat_i;
- end
-end
-
-
assign wbd_stb_o = ~req_fifo_empty;
// To avoid unknown progating the design, driven zero when fifo is empty
-assign wbd_adr_o = (req_fifo_empty) ? 'h0 : haddr_out;
-assign wbd_we_o = (req_fifo_empty) ? 'h0 : hwrite_out;
-assign wbd_dat_o = (req_fifo_empty) ? 'h0 : hwdata_out;
-assign wbd_sel_o = (req_fifo_empty) ? 'h0 : hbel_out;
+assign wbd_adr_o = (req_fifo_empty) ? 'h0 : req_fifo_dout.haddr;
+assign wbd_we_o = (req_fifo_empty) ? 'h0 : req_fifo_dout.hwrite;
+assign wbd_dat_o = (req_fifo_empty) ? 'h0 : req_fifo_dout.hwdata;
+assign wbd_sel_o = (req_fifo_empty) ? 'h0 : req_fifo_dout.hbel;
-`endif // SCR1_DMEM_WB_IN_BP
+
+//-------------------------------------------------------------------------------
+// Response path - Used by Read path logic
+//-------------------------------------------------------------------------------
+type_scr1_resp_fifo_s resp_fifo_din;
+type_scr1_resp_fifo_s resp_fifo_dout;
+
+
+assign resp_fifo_din.hresp = (wbd_err_i) ? 1'b0 : 1'b1;
+assign resp_fifo_din.hwidth = req_fifo_dout.hwidth;
+assign resp_fifo_din.haddr = req_fifo_dout.haddr[1:0];
+assign resp_fifo_din.hrdata = (wbd_we_o) ? 'h0: wbd_dat_i;
+
+ async_fifo #(
+ .W(SCR1_WB_WIDTH+2+3+1), // Data Width
+ .DP(4), // FIFO DEPTH
+ .WR_FAST(1), // We need FF'ed Full
+ .RD_FAST(1) // We need FF'ed Empty
+ ) u_res_fifo(
+ // Writc Clock
+ .wr_clk (wb_clk ),
+ .wr_reset_n (wb_rst_n ),
+ .wr_en (wbd_ack_i ),
+ .wr_data (resp_fifo_din ),
+ .full ( ), // Assmed FIFO will never be full as it's Response a Single Request
+ .afull ( ),
+
+ // RD Clock
+ .rd_clk (core_clk ),
+ .rd_reset_n (core_rst_n ),
+ .rd_en (resp_fifo_rd ),
+ .empty (resp_fifo_empty ),
+ .aempty ( ),
+ .rd_data (resp_fifo_dout )
+ );
+
+
+
+assign resp_fifo_rd = !resp_fifo_empty;
+
+assign dmem_rdata = (resp_fifo_rd) ? scr1_conv_wb2mem_rdata(resp_fifo_dout.hwidth, resp_fifo_dout.haddr, resp_fifo_dout.hrdata) : 'h0;
+
+assign dmem_resp = (resp_fifo_rd)
+ ? (resp_fifo_dout.hresp == 1'b1)
+ ? SCR1_MEM_RESP_RDY_OK
+ : SCR1_MEM_RESP_RDY_ER
+ : SCR1_MEM_RESP_NOTRDY ;
+
diff --git a/verilog/rtl/syntacore/scr1/src/top/scr1_imem_wb.sv b/verilog/rtl/syntacore/scr1/src/top/scr1_imem_wb.sv
index d91c9e3..fb6c137 100644
--- a/verilog/rtl/syntacore/scr1/src/top/scr1_imem_wb.sv
+++ b/verilog/rtl/syntacore/scr1/src/top/scr1_imem_wb.sv
@@ -21,6 +21,9 @@
//// On power up, wishbone output are unkown as it ////
//// driven from fifo output. To avoid unknown ////
//// propgation, we are driving 'h0 when fifo empty ////
+//// v2: June 18, 2021, Dinesh A ////
+//// core and wishbone is made async and async fifo ////
+//// added to take care of domain cross-over ////
//// ////
//////////////////////////////////////////////////////////////////////
//// ////
@@ -60,8 +63,8 @@
module scr1_imem_wb (
// Control Signals
- input logic rst_n,
- input logic clk,
+ input logic core_rst_n, // core reset
+ input logic core_clk, // Core clock
// Core Interface
output logic imem_req_ack,
@@ -71,6 +74,8 @@
output logic [1:0] imem_resp,
// WB Interface
+ input logic wb_rst_n, // wishbone reset
+ input logic wb_clk, // wishbone clock
output logic wbd_stb_o, // strobe/request
output logic [SCR1_WB_WIDTH-1:0] wbd_adr_o, // address
output logic wbd_we_o, // write
@@ -85,19 +90,10 @@
//-------------------------------------------------------------------------------
// Local parameters declaration
//-------------------------------------------------------------------------------
-`ifndef SCR1_IMEM_WB_OUT_BP
-localparam SCR1_FIFO_WIDTH = 2;
-localparam SCR1_FIFO_CNT_WIDTH = $clog2(SCR1_FIFO_WIDTH+1);
-`endif // SCR1_IMEM_WB_OUT_BP
//-------------------------------------------------------------------------------
// Local types declaration
//-------------------------------------------------------------------------------
-typedef enum logic {
- SCR1_FSM_ADDR = 1'b0,
- SCR1_FSM_DATA = 1'b1,
- SCR1_FSM_ERR = 1'bx
-} type_scr1_fsm_e;
typedef struct packed {
logic [SCR1_WB_WIDTH-1:0] haddr;
@@ -111,86 +107,57 @@
//-------------------------------------------------------------------------------
// Local signal declaration
//-------------------------------------------------------------------------------
-type_scr1_fsm_e fsm;
+
+//-------------------------------------------------------------------------------
+// Request FIFO
+// ------------------------------------------------------------------------------
logic req_fifo_rd;
logic req_fifo_wr;
-logic req_fifo_up;
-`ifdef SCR1_IMEM_WB_OUT_BP
-type_scr1_req_fifo_s req_fifo_r;
-type_scr1_req_fifo_s [0:0] req_fifo;
-`else // SCR1_IMEM_WB_OUT_BP
-logic [SCR1_WB_WIDTH-1:0] req_fifo_dout;
-`endif // SCR1_IMEM_WB_OUT_BP
-
logic req_fifo_empty;
logic req_fifo_full;
-type_scr1_resp_fifo_s resp_fifo;
-logic resp_fifo_hready;
-//-------------------------------------------------------------------------------
-// Interface to Core
-//-------------------------------------------------------------------------------
-assign imem_req_ack = ~req_fifo_full;
-assign req_fifo_wr = ~req_fifo_full & imem_req;
+//-----------------------------------------------------
+// Response FIFO (READ PATH
+// ----------------------------------------------------
+logic resp_fifo_empty;
+logic resp_fifo_rd;
-assign imem_rdata = resp_fifo.hrdata;
-assign imem_resp = (resp_fifo_hready)
- ? (resp_fifo.hresp == 1'b1)
- ? SCR1_MEM_RESP_RDY_OK
- : SCR1_MEM_RESP_RDY_ER
- : SCR1_MEM_RESP_NOTRDY;
//-------------------------------------------------------------------------------
// REQ_FIFO
//-------------------------------------------------------------------------------
-`ifdef SCR1_IMEM_WB_OUT_BP
-always_ff @(negedge rst_n, posedge clk) begin
- if (~rst_n) begin
- req_fifo_full <= 1'b0;
- end else begin
- if (~req_fifo_full) begin
- req_fifo_full <= imem_req & ~req_fifo_rd;
- end else begin
- req_fifo_full <= ~req_fifo_rd;
- end
- end
-end
-assign req_fifo_empty = ~(req_fifo_full | imem_req);
+type_scr1_req_fifo_s req_fifo_din;
+type_scr1_req_fifo_s req_fifo_dout;
-assign req_fifo_up = ~req_fifo_rd & req_fifo_wr;
-always_ff @(posedge clk) begin
- if (req_fifo_up) begin
- req_fifo_r.haddr <= imem_addr;
- end
-end
+assign req_fifo_wr = ~req_fifo_full & imem_req;
+assign imem_req_ack = ~req_fifo_full;
-assign req_fifo[0] = (req_fifo_full) ? req_fifo_r : imem_addr;
+assign req_fifo_din.haddr = imem_addr;
-`else // SCR1_IMEM_WB_OUT_BP
-
-
- sync_fifo #(
+ async_fifo #(
.W(SCR1_WB_WIDTH), // Data Width
- .D(2) // FIFO DEPTH
+ .DP(4), // FIFO DEPTH
+ .WR_FAST(1), // We need FF'ed Full
+ .RD_FAST(1) // We need FF'ed Empty
) u_req_fifo(
+ // Writc Clock
+ .wr_clk (core_clk ),
+ .wr_reset_n (core_rst_n ),
+ .wr_en (req_fifo_wr ),
+ .wr_data (req_fifo_din ),
+ .full (req_fifo_full ),
+ .afull ( ),
- .rd_data (req_fifo_dout ),
-
- .reset_n (rst_n ),
- .clk (clk ),
- .wr_en (req_fifo_wr ), // Write
- .rd_en (req_fifo_rd ), // Read
- .wr_data (imem_addr ),
- .full (req_fifo_full ),
- .empty (req_fifo_empty )
-);
-
-
-
-
-`endif // SCR1_IMEM_WB_OUT_BP
+ // RD Clock
+ .rd_clk (wb_clk ),
+ .rd_reset_n (wb_rst_n ),
+ .rd_en (req_fifo_rd ),
+ .empty (req_fifo_empty ),
+ .aempty ( ),
+ .rd_data (req_fifo_dout )
+ );
always_comb begin
@@ -200,44 +167,53 @@
end
end
-//-------------------------------------------------------------------------------
-// FIFO response
-//-------------------------------------------------------------------------------
-`ifdef SCR1_IMEM_WB_IN_BP
-assign resp_fifo_hready = wbd_ack_i;
-assign resp_fifo.hresp = (wbd_err_i) ? 1'b0 : 1'b1;
-assign resp_fifo.hrdata = wbd_dat_i;
-assign wbd_stb_o = ~req_fifo_empty;
-assign wbd_adr_o = req_fifo[0];
-assign wbd_we_o = 0; // Only Read supported
-assign wbd_dat_o = 32'h0; // No Write
-assign wbd_sel_o = 4'b1111; // Only Read allowed in imem i/f
-
-
-`else // SCR1_IMEM_WB_IN_BP
-always_ff @(negedge rst_n, posedge clk) begin
- if (~rst_n) begin
- resp_fifo_hready <= 1'b0;
- end else begin
- resp_fifo_hready <= wbd_ack_i ;
- end
-end
-
-always_ff @(posedge clk) begin
- if (wbd_ack_i) begin
- resp_fifo.hresp <= (wbd_err_i) ? 1'b0 : 1'b1;
- resp_fifo.hrdata <= wbd_dat_i;
- end
-end
-
assign wbd_stb_o = ~req_fifo_empty;
// On Power, to avoid unknow propgating the value
-assign wbd_adr_o = (req_fifo_empty) ? 'h0 : req_fifo_dout;
+assign wbd_adr_o = (req_fifo_empty) ? 'h0 : req_fifo_dout.haddr;
assign wbd_we_o = 0; // Only Read supported
assign wbd_dat_o = 32'h0; // No Write
assign wbd_sel_o = 4'b1111; // Only Read allowed in imem i/f
-`endif // SCR1_IMEM_WB_IN_BP
+//-------------------------------------------------------------------------------
+// Response path - Used by Read path logic
+//-------------------------------------------------------------------------------
+type_scr1_resp_fifo_s resp_fifo_din;
+type_scr1_resp_fifo_s resp_fifo_dout;
+assign resp_fifo_din.hresp = (wbd_err_i) ? 1'b0 : 1'b1;
+assign resp_fifo_din.hrdata = wbd_dat_i;
+
+ async_fifo #(
+ .W(SCR1_WB_WIDTH+1), // Data Width
+ .DP(4), // FIFO DEPTH
+ .WR_FAST(1), // We need FF'ed Full
+ .RD_FAST(1) // We need FF'ed Empty
+ ) u_res_fifo(
+ // Writc Clock
+ .wr_clk (wb_clk ),
+ .wr_reset_n (wb_rst_n ),
+ .wr_en (wbd_ack_i ),
+ .wr_data (resp_fifo_din ),
+ .full ( ), // Assmed FIFO will never be full as it's Response a Single Request
+ .afull ( ),
+
+ // RD Clock
+ .rd_clk (core_clk ),
+ .rd_reset_n (core_rst_n ),
+ .rd_en (resp_fifo_rd ),
+ .empty (resp_fifo_empty ),
+ .aempty ( ),
+ .rd_data (resp_fifo_dout )
+ );
+
+
+assign resp_fifo_rd = !resp_fifo_empty;
+assign imem_rdata = resp_fifo_dout.hrdata;
+
+assign imem_resp = (resp_fifo_rd)
+ ? (resp_fifo_dout.hresp == 1'b1)
+ ? SCR1_MEM_RESP_RDY_OK
+ : SCR1_MEM_RESP_RDY_ER
+ : SCR1_MEM_RESP_NOTRDY ;
`ifdef SCR1_TRGT_SIMULATION
diff --git a/verilog/rtl/syntacore/scr1/src/top/scr1_top_wb.sv b/verilog/rtl/syntacore/scr1/src/top/scr1_top_wb.sv
index 97f565c..d72afd1 100644
--- a/verilog/rtl/syntacore/scr1/src/top/scr1_top_wb.sv
+++ b/verilog/rtl/syntacore/scr1/src/top/scr1_top_wb.sv
@@ -17,6 +17,9 @@
//// Revision : ////
//// v0: June 7, 2021, Dinesh A ////
//// wishbone integration ////
+//// v1: June 17, 2021, Dinesh A ////
+//// core and wishbone clock domain are seperated ////
+//// Async fifo added in imem and dmem path ////
//// ////
//////////////////////////////////////////////////////////////////////
//// ////
@@ -69,7 +72,7 @@
input logic cpu_rst_n, // CPU Reset (Core Reset)
input logic test_mode, // Test mode
input logic test_rst_n, // Test mode's reset
- input logic clk, // System clock
+ input logic core_clk, // Core clock
input logic rtc_clk, // Real-time clock
`ifdef SCR1_DBG_EN
output logic sys_rst_n_o, // External System Reset output
@@ -103,6 +106,8 @@
output logic tdo_en,
`endif // SCR1_DBG_EN
+ input logic wb_rst_n, // Wish bone reset
+ input logic wb_clk, // wish bone clock
// Instruction Memory Interface
output logic wbd_imem_stb_o, // strobe/request
output logic [SCR1_WB_WIDTH-1:0] wbd_imem_adr_o, // address
@@ -219,7 +224,7 @@
.STAGES_AMOUNT (SCR1_CLUSTER_TOP_RST_SYNC_STAGES_NUM)
) i_pwrup_rstn_reset_sync (
.rst_n (pwrup_rst_n ),
- .clk (clk ),
+ .clk (core_clk ),
.test_rst_n (test_rst_n ),
.test_mode (test_mode ),
.rst_n_in (1'b1 ),
@@ -231,7 +236,7 @@
.STAGES_AMOUNT (SCR1_CLUSTER_TOP_RST_SYNC_STAGES_NUM)
) i_rstn_reset_sync (
.rst_n (pwrup_rst_n ),
- .clk (clk ),
+ .clk (core_clk ),
.test_rst_n (test_rst_n ),
.test_mode (test_mode ),
.rst_n_in (rst_n ),
@@ -243,7 +248,7 @@
.STAGES_AMOUNT (SCR1_CLUSTER_TOP_RST_SYNC_STAGES_NUM)
) i_cpu_rstn_reset_sync (
.rst_n (pwrup_rst_n ),
- .clk (clk ),
+ .clk (core_clk ),
.test_rst_n (test_rst_n ),
.test_mode (test_mode ),
.rst_n_in (cpu_rst_n ),
@@ -270,7 +275,7 @@
.cpu_rst_n (cpu_rst_n_sync ),
.test_mode (test_mode ),
.test_rst_n (test_rst_n ),
- .clk (clk ),
+ .clk (core_clk ),
.core_rst_n_o (core_rst_n_local ),
.core_rdc_qlfy_o ( ),
`ifdef SCR1_DBG_EN
@@ -333,7 +338,7 @@
scr1_tcm #(
.SCR1_TCM_SIZE (`SCR1_DMEM_AWIDTH'(~SCR1_TCM_ADDR_MASK + 1'b1))
) i_tcm (
- .clk (clk ),
+ .clk (core_clk ),
.rst_n (core_rst_n_local),
// Instruction interface to TCM
@@ -362,7 +367,7 @@
scr1_timer i_timer (
// Common
.rst_n (core_rst_n_local ),
- .clk (clk ),
+ .clk (core_clk ),
.rtc_clk (rtc_clk ),
// Memory interface
@@ -392,7 +397,7 @@
`endif // SCR1_TCM_EN
) i_imem_router (
.rst_n (core_rst_n_local ),
- .clk (clk ),
+ .clk (core_clk ),
// Interface to core
.imem_req_ack (core_imem_req_ack),
.imem_req (core_imem_req ),
@@ -447,7 +452,7 @@
) i_dmem_router (
.rst_n (core_rst_n_local ),
- .clk (clk ),
+ .clk (core_clk ),
// Interface to core
.dmem_req_ack (core_dmem_req_ack ),
.dmem_req (core_dmem_req ),
@@ -502,8 +507,8 @@
// Instruction memory WB bridge
//-------------------------------------------------------------------------------
scr1_imem_wb i_imem_wb (
- .rst_n (core_rst_n_local ),
- .clk (clk ),
+ .core_rst_n (core_rst_n_local ),
+ .core_clk (core_clk ),
// Interface to imem router
.imem_req_ack (wb_imem_req_ack ),
.imem_req (wb_imem_req ),
@@ -511,6 +516,8 @@
.imem_rdata (wb_imem_rdata ),
.imem_resp (wb_imem_resp ),
// WB interface
+ .wb_rst_n (wb_rst_n ),
+ .wb_clk (wb_clk ),
.wbd_stb_o (wbd_imem_stb_o ),
.wbd_adr_o (wbd_imem_adr_o ),
.wbd_we_o (wbd_imem_we_o ),
@@ -526,8 +533,8 @@
// Data memory WB bridge
//-------------------------------------------------------------------------------
scr1_dmem_wb i_dmem_wb (
- .rst_n (core_rst_n_local ),
- .clk (clk ),
+ .core_rst_n (core_rst_n_local ),
+ .core_clk (core_clk ),
// Interface to dmem router
.dmem_req_ack (wb_dmem_req_ack ),
.dmem_req (wb_dmem_req ),
@@ -538,6 +545,8 @@
.dmem_rdata (wb_dmem_rdata ),
.dmem_resp (wb_dmem_resp ),
// WB interface
+ .wb_rst_n (wb_rst_n ),
+ .wb_clk (wb_clk ),
.wbd_stb_o (wbd_dmem_stb_o ),
.wbd_adr_o (wbd_dmem_adr_o ),
.wbd_we_o (wbd_dmem_we_o ),
diff --git a/verilog/rtl/uprj_netlists.v b/verilog/rtl/uprj_netlists.v
index b97154e..689eca3 100644
--- a/verilog/rtl/uprj_netlists.v
+++ b/verilog/rtl/uprj_netlists.v
@@ -46,6 +46,7 @@
`include "digital_core/src/glbl_cfg.sv"
`include "digital_core/src/digital_core.sv"
+ `include "lib/wb_stagging.sv"
`include "wb_interconnect/src/wb_arb.sv"
`include "wb_interconnect/src/wb_interconnect.sv"
diff --git a/verilog/rtl/user_project_wrapper.v b/verilog/rtl/user_project_wrapper.v
index 0ff3294..8e7547b 100644
--- a/verilog/rtl/user_project_wrapper.v
+++ b/verilog/rtl/user_project_wrapper.v
@@ -95,9 +95,9 @@
.vssd2(vssd2), // User area 2 digital ground
`endif
- .clk(wb_clk_i),
- .rst_n(!wb_rst_i),
- .rtc_clk(user_clock2),
+ .wb_clk_i(wb_clk_i),
+ .wb_rst_i(wb_rst_i),
+ .user_clock2(user_clock2),
// MGMT SoC Wishbone Slave
@@ -124,7 +124,7 @@
.io_oeb(io_oeb),
// IRQ
- .irq(user_irq)
+ .user_irq(user_irq)
);
endmodule // user_project_wrapper
diff --git a/verilog/rtl/wb_interconnect/src/wb_arb.sv b/verilog/rtl/wb_interconnect/src/wb_arb.sv
index b127d5c..a477c94 100644
--- a/verilog/rtl/wb_interconnect/src/wb_arb.sv
+++ b/verilog/rtl/wb_interconnect/src/wb_arb.sv
@@ -107,7 +107,7 @@
grant2:
// if this req is dropped or next is asserted, check for other req's
if(!req[2] ) begin
- if(req[0]) next_state = grant0;
+ if(req[0]) next_state = grant0;
else if(req[1]) next_state = grant1;
end
endcase
diff --git a/verilog/rtl/wb_interconnect/src/wb_interconnect.sv b/verilog/rtl/wb_interconnect/src/wb_interconnect.sv
index d626b95..3eb688e 100644
--- a/verilog/rtl/wb_interconnect/src/wb_interconnect.sv
+++ b/verilog/rtl/wb_interconnect/src/wb_interconnect.sv
@@ -17,6 +17,9 @@
//// ////
//// Revision : ////
//// 0.1 - 12th June 2021, Dinesh A ////
+//// 0.2 - 17th June 2021, Dinesh A ////
+//// Stagging FF added at Slave Interface to break ////
+//// path ////
//// ////
//////////////////////////////////////////////////////////////////////
//// ////
@@ -58,7 +61,6 @@
input logic m0_wbd_we_i,
input logic m0_wbd_cyc_i,
input logic m0_wbd_stb_i,
- input logic [3:0] m0_wbd_tid_i, // target id
output logic [31:0] m0_wbd_dat_o,
output logic m0_wbd_ack_o,
output logic m0_wbd_err_o,
@@ -70,7 +72,6 @@
input logic m1_wbd_we_i,
input logic m1_wbd_cyc_i,
input logic m1_wbd_stb_i,
- input logic [3:0] m1_wbd_tid_i, // target id
output logic [31:0] m1_wbd_dat_o,
output logic m1_wbd_ack_o,
output logic m1_wbd_err_o,
@@ -82,7 +83,6 @@
input logic m2_wbd_we_i,
input logic m2_wbd_cyc_i,
input logic m2_wbd_stb_i,
- input logic [3:0] m2_wbd_tid_i, // target id
output logic [31:0] m2_wbd_dat_o,
output logic m2_wbd_ack_o,
output logic m2_wbd_err_o,
@@ -115,7 +115,7 @@
input logic s2_wbd_ack_i,
input logic s2_wbd_err_i,
output logic [31:0] s2_wbd_dat_o,
- output logic [31:0] s2_wbd_adr_o,
+ output logic [7:0] s2_wbd_adr_o, // glbl reg need only 8 bits
output logic [3:0] s2_wbd_sel_o,
output logic s2_wbd_we_o,
output logic s2_wbd_cyc_o,
@@ -168,9 +168,41 @@
type_wb_rd_intf s2_wb_rd;
-type_wb_wr_intf i_bus_m; // Multiplexed Master I/F
-type_wb_rd_intf i_bus_s; // Multiplexed Slave I/F
+type_wb_wr_intf m_bus_wr; // Multiplexed Master I/F
+type_wb_rd_intf m_bus_rd; // Multiplexed Slave I/F
+type_wb_wr_intf s_bus_wr; // Multiplexed Master I/F
+type_wb_rd_intf s_bus_rd; // Multiplexed Slave I/F
+//------------------------------
+// RISC Data Memory Map
+// 0x0000_0000 to 0x0FFF_FFFF - SPI FLASH MEMORY
+// 0x1000_0000 to 0x1000_00FF - SPI REGISTER
+// 0x2000_0000 to 0x2FFF_FFFF - SDRAM
+// 0x3000_0000 to 0x3000_00FF - GLOBAL REGISTER
+//-----------------------------
+//
+wire [3:0] m0_wbd_tid_i = (m0_wbd_adr_i[31:28] == 4'b0000 ) ? 4'b0000 :
+ (m0_wbd_adr_i[31:28] == 4'b0001 ) ? 4'b0000 :
+ (m0_wbd_adr_i[31:28] == 4'b0010 ) ? 4'b0001 :
+ (m0_wbd_adr_i[31:28] == 4'b0011 ) ? 4'b0010 : 4'b0000;
+
+wire [3:0] m1_wbd_tid_i = (m1_wbd_adr_i[31:28] == 4'b0000 ) ? 4'b0000 :
+ (m1_wbd_adr_i[31:28] == 4'b0001 ) ? 4'b0000 :
+ (m1_wbd_adr_i[31:28] == 4'b0010 ) ? 4'b0001 :
+ (m1_wbd_adr_i[31:28] == 4'b0011 ) ? 4'b0010 : 4'b0000;
+
+
+//-------------------------------------------------------------------
+// EXTERNAL MEMORY MAP
+// 0x3000_0000 to 0x3000_00FF - GLOBAL REGISTER
+// 0x4000_0000 to 0x4FFF_FFFF - SPI FLASH MEMORY
+// 0x5000_0000 to 0x5000_00FF - SPI REGISTER
+// 0x6000_0000 to 0x6FFF_FFFF - SDRAM
+//
+wire [3:0] m2_wbd_tid_i = (m2_wbd_adr_i[31:28] == 4'b0100 ) ? 4'b0000 :
+ (m2_wbd_adr_i[31:28] == 4'b0101 ) ? 4'b0000 :
+ (m2_wbd_adr_i[31:28] == 4'b0110 ) ? 4'b0001 :
+ (m2_wbd_adr_i[31:28] == 4'b0011 ) ? 4'b0010 : 4'b0000;
//----------------------------------------
// Master Mapping
@@ -211,43 +243,43 @@
assign m2_wbd_ack_o = m2_wb_rd.wbd_ack;
assign m2_wbd_err_o = m2_wb_rd.wbd_err;
-assign s0_wb_rd.wbd_dat = s0_wbd_dat_i ;
-assign s0_wb_rd.wbd_ack = s0_wbd_ack_i ;
-assign s0_wb_rd.wbd_err = s0_wbd_err_i ;
-
-assign s1_wb_rd.wbd_dat = s1_wbd_dat_i ;
-assign s1_wb_rd.wbd_ack = s1_wbd_ack_i ;
-assign s1_wb_rd.wbd_err = s1_wbd_err_i ;
-
-assign s2_wb_rd.wbd_dat = s2_wbd_dat_i ;
-assign s2_wb_rd.wbd_ack = s2_wbd_ack_i ;
-assign s2_wb_rd.wbd_err = s2_wbd_err_i ;
-
-
//----------------------------------------
// Slave Mapping
// -------------------------------------
+// Masked Now and added stagging FF now
+ assign s0_wbd_dat_o = s0_wb_wr.wbd_dat ;
+ assign s0_wbd_adr_o = s0_wb_wr.wbd_adr ;
+ assign s0_wbd_sel_o = s0_wb_wr.wbd_sel ;
+ assign s0_wbd_we_o = s0_wb_wr.wbd_we ;
+ assign s0_wbd_cyc_o = s0_wb_wr.wbd_cyc ;
+ assign s0_wbd_stb_o = s0_wb_wr.wbd_stb ;
+
+ assign s1_wbd_dat_o = s1_wb_wr.wbd_dat ;
+ assign s1_wbd_adr_o = s1_wb_wr.wbd_adr ;
+ assign s1_wbd_sel_o = s1_wb_wr.wbd_sel ;
+ assign s1_wbd_we_o = s1_wb_wr.wbd_we ;
+ assign s1_wbd_cyc_o = s1_wb_wr.wbd_cyc ;
+ assign s1_wbd_stb_o = s1_wb_wr.wbd_stb ;
+
+ assign s2_wbd_dat_o = s2_wb_wr.wbd_dat ;
+ assign s2_wbd_adr_o = s2_wb_wr.wbd_adr[7:0] ; // Global Reg Need 8 bit
+ assign s2_wbd_sel_o = s2_wb_wr.wbd_sel ;
+ assign s2_wbd_we_o = s2_wb_wr.wbd_we ;
+ assign s2_wbd_cyc_o = s2_wb_wr.wbd_cyc ;
+ assign s2_wbd_stb_o = s2_wb_wr.wbd_stb ;
+
+ assign s0_wb_rd.wbd_dat = s0_wbd_dat_i ;
+ assign s0_wb_rd.wbd_ack = s0_wbd_ack_i ;
+ assign s0_wb_rd.wbd_err = s0_wbd_err_i ;
+
+ assign s1_wb_rd.wbd_dat = s1_wbd_dat_i ;
+ assign s1_wb_rd.wbd_ack = s1_wbd_ack_i ;
+ assign s1_wb_rd.wbd_err = s1_wbd_err_i ;
+
+ assign s2_wb_rd.wbd_dat = s2_wbd_dat_i ;
+ assign s2_wb_rd.wbd_ack = s2_wbd_ack_i ;
+ assign s2_wb_rd.wbd_err = s2_wbd_err_i ;
-assign s0_wbd_dat_o = s0_wb_wr.wbd_dat ;
-assign s0_wbd_adr_o = s0_wb_wr.wbd_adr ;
-assign s0_wbd_sel_o = s0_wb_wr.wbd_sel ;
-assign s0_wbd_we_o = s0_wb_wr.wbd_we ;
-assign s0_wbd_cyc_o = s0_wb_wr.wbd_cyc ;
-assign s0_wbd_stb_o = s0_wb_wr.wbd_stb ;
-
-assign s1_wbd_dat_o = s1_wb_wr.wbd_dat ;
-assign s1_wbd_adr_o = s1_wb_wr.wbd_adr ;
-assign s1_wbd_sel_o = s1_wb_wr.wbd_sel ;
-assign s1_wbd_we_o = s1_wb_wr.wbd_we ;
-assign s1_wbd_cyc_o = s1_wb_wr.wbd_cyc ;
-assign s1_wbd_stb_o = s1_wb_wr.wbd_stb ;
-
-assign s2_wbd_dat_o = s2_wb_wr.wbd_dat ;
-assign s2_wbd_adr_o = s2_wb_wr.wbd_adr ;
-assign s2_wbd_sel_o = s2_wb_wr.wbd_sel ;
-assign s2_wbd_we_o = s2_wb_wr.wbd_we ;
-assign s2_wbd_cyc_o = s2_wb_wr.wbd_cyc ;
-assign s2_wbd_stb_o = s2_wb_wr.wbd_stb ;
//
// arbitor
@@ -257,9 +289,9 @@
wb_arb u_wb_arb(
.clk(clk_i),
.rstn(rst_n),
- .req({ m2_wbd_cyc_i,
- m1_wbd_cyc_i,
- m0_wbd_cyc_i}),
+ .req({ m2_wbd_stb_i & !m2_wbd_ack_o,
+ m1_wbd_stb_i & !m1_wbd_ack_o,
+ m0_wbd_stb_i & !m0_wbd_ack_o}),
.gnt(gnt)
);
@@ -267,37 +299,67 @@
// Generate Multiplexed Master Interface based on grant
always_comb begin
case(gnt)
- 3'h0: i_bus_m = m0_wb_wr;
- 3'h1: i_bus_m = m1_wb_wr;
- 3'h2: i_bus_m = m2_wb_wr;
- default: i_bus_m = m0_wb_wr;
+ 3'h0: m_bus_wr = m0_wb_wr;
+ 3'h1: m_bus_wr = m1_wb_wr;
+ 3'h2: m_bus_wr = m2_wb_wr;
+ default: m_bus_wr = m0_wb_wr;
endcase
end
// Generate Multiplexed Slave Interface based on target Id
-wire [3:0] wbd_tid = i_bus_m.wbd_tid; // to fix iverilog warning
+wire [3:0] s_wbd_tid = s_bus_wr.wbd_tid; // to fix iverilog warning
always_comb begin
- case(wbd_tid)
- 3'h0: i_bus_s = s0_wb_rd;
- 3'h1: i_bus_s = s1_wb_rd;
- 3'h2: i_bus_s = s2_wb_rd;
- default: i_bus_s = s0_wb_rd;
+ case(s_wbd_tid)
+ 3'h0: s_bus_rd = s0_wb_rd;
+ 3'h1: s_bus_rd = s1_wb_rd;
+ 3'h2: s_bus_rd = s2_wb_rd;
+ default: s_bus_rd = s0_wb_rd;
endcase
end
// Connect Master => Slave
-assign s0_wb_wr = (i_bus_m.wbd_tid == 2'b00) ? i_bus_m : 'h0;
-assign s1_wb_wr = (i_bus_m.wbd_tid == 2'b01) ? i_bus_m : 'h0;
-assign s2_wb_wr = (i_bus_m.wbd_tid == 2'b10) ? i_bus_m : 'h0;
+assign s0_wb_wr = (s_wbd_tid == 2'b00) ? s_bus_wr : 'h0;
+assign s1_wb_wr = (s_wbd_tid == 2'b01) ? s_bus_wr : 'h0;
+assign s2_wb_wr = (s_wbd_tid == 2'b10) ? s_bus_wr : 'h0;
// Connect Slave to Master
-assign m0_wb_rd = (gnt == 2'b00) ? i_bus_s : 'h0;
-assign m1_wb_rd = (gnt == 2'b01) ? i_bus_s : 'h0;
-assign m2_wb_rd = (gnt == 2'b10) ? i_bus_s : 'h0;
+assign m0_wb_rd = (gnt == 2'b00) ? m_bus_rd : 'h0;
+assign m1_wb_rd = (gnt == 2'b01) ? m_bus_rd : 'h0;
+assign m2_wb_rd = (gnt == 2'b10) ? m_bus_rd : 'h0;
+// Stagging FF to break write and read timing path
+wb_stagging u_m_wb_stage(
+ .clk_i (clk_i ),
+ .rst_n (rst_n ),
+ // WishBone Input master I/P
+ .m_wbd_dat_i (m_bus_wr.wbd_dat ),
+ .m_wbd_adr_i (m_bus_wr.wbd_adr ),
+ .m_wbd_sel_i (m_bus_wr.wbd_sel ),
+ .m_wbd_we_i (m_bus_wr.wbd_we ),
+ .m_wbd_cyc_i (m_bus_wr.wbd_cyc ),
+ .m_wbd_stb_i (m_bus_wr.wbd_stb ),
+ .m_wbd_tid_i (m_bus_wr.wbd_tid ),
+ .m_wbd_dat_o (m_bus_rd.wbd_dat ),
+ .m_wbd_ack_o (m_bus_rd.wbd_ack ),
+ .m_wbd_err_o (m_bus_rd.wbd_err ),
+
+ // Slave Interface
+ .s_wbd_dat_i (s_bus_rd.wbd_dat ),
+ .s_wbd_ack_i (s_bus_rd.wbd_ack ),
+ .s_wbd_err_i (s_bus_rd.wbd_err ),
+ .s_wbd_dat_o (s_bus_wr.wbd_dat ),
+ .s_wbd_adr_o (s_bus_wr.wbd_adr ),
+ .s_wbd_sel_o (s_bus_wr.wbd_sel ),
+ .s_wbd_we_o (s_bus_wr.wbd_we ),
+ .s_wbd_cyc_o (s_bus_wr.wbd_cyc ),
+ .s_wbd_stb_o (s_bus_wr.wbd_stb ),
+ .s_wbd_tid_o (s_bus_wr.wbd_tid )
+
+);
+
endmodule