feat: refactor RIB to RIBP: Update tests and scripts to reflect RIBP interface changes

- Updated test cases in , , , , , , , and  to replace references from RIB to RIBP.
- Modified file names and paths in tests to align with the new RIBP naming conventions.
- Ensured that all assertions and checks in the tests are consistent with the updated RIBP interfaces and functionality.
- Added a new test for migrating user core RIBP interfaces in .
This commit is contained in:
maksyuki committed 2026-08-04 10:56:36 +08:00
1 parent bef5881149
commit 1b4b53c650
139 files changed
+3363 -3217

No files matched your search

+10 -10
View File
@@ -16,26 +16,26 @@ The header in rtl/tech/tc_clk.sv also states the Solderpad Hardware License, Ver
The following RTL files retain the original header from the Ravenna example SoC project, which refers to a design using PicoRV32 in ASIC:
- rtl/ip/rib/peripheral/gpio.sv
- rtl/ip/rib/peripheral/timer.sv
- rtl/ip/rib/serial/uart.sv
- rtl/ip/ribp/peripheral/gpio.sv
- rtl/ip/ribp/peripheral/timer.sv
- rtl/ip/ribp/serial/uart.sv
The preserved notice attributes the work to Clifford Wolf and Tim Edwards.
## 3. Hirosh Dabui
The SDRAM controller implementation in rtl/ip/rib/memory/sdram_core.sv retains the original copyright notice attributed to Hirosh Dabui.
The SDRAM controller implementation in rtl/ip/ribp/memory/sdram_core.sv retains the original copyright notice attributed to Hirosh Dabui.
## 4. EmbedFire
Several SPI/I2C-related RTL files retain the original attribution to EmbedFire and refer to source files such as sd_init.v, sd_write.v, sd_read.v, data_rw_ctrl.v, and i2c_ctrl.v:
- rtl/ip/rib/serial/i2c_core.sv
- rtl/ip/rib/storage/spisd_core.sv
- rtl/ip/rib/storage/spisd_data.sv
- rtl/ip/rib/storage/spisd_init.sv
- rtl/ip/rib/storage/spisd_read.sv
- rtl/ip/rib/storage/spisd_write.sv
- rtl/ip/ribp/serial/i2c_core.sv
- rtl/ip/ribp/storage/spisd_core.sv
- rtl/ip/ribp/storage/spisd_data.sv
- rtl/ip/ribp/storage/spisd_init.sv
- rtl/ip/ribp/storage/spisd_read.sv
- rtl/ip/ribp/storage/spisd_write.sv
These headers state that the original code was published on GitHub by EmbedFire, but that the original license was not specified in the retained header.
+2 -2
View File
@@ -210,7 +210,7 @@ endif
benchmark-report \
pin-map check-pin-map soc-topology check-soc-topology user-extensions check-user-extensions \
check-clock-reset-domains tech-cell-test rtl-lint check-rtl-lint \
formal formal-bus formal-rib-adapter formal-spill-register formal-rib2apb formal-clean formal-doctor
formal formal-bus formal-rib-adapter formal-spill-register formal-ribp2apb formal-clean formal-doctor
.NOTPARALLEL: setup
help:
@@ -235,7 +235,7 @@ help:
' check-user-extensions validate the canonical user-extension map' \
' check-clock-reset-domains validate the root clock/reset and CDC inventory' \
' rtl-lint | check-rtl-lint run/check strict Verilator RTL lint warnings' \
' formal | formal-bus | formal-rib-adapter | formal-spill-register | formal-rib2apb run SBY protocol proofs' \
' formal | formal-bus | formal-rib-adapter | formal-spill-register | formal-ribp2apb run SBY protocol proofs' \
' formal-sysctrl | formal-pll-rcu | formal-gpio-user run SBY peripheral-control proofs' \
' formal-doctor check the SBY, Yosys, sv2v, and Bitwuzla formal toolchain' \
' benchmark-report run the benchmark profile and write meta/performance.json' \
+3 -3
View File
@@ -5,8 +5,8 @@ This repository includes RTL source files that preserve third-party copyright an
The following third-party projects or authors are referenced in the RTL source headers currently present in this repository:
- ETH Zurich and University of Bologna: notices are preserved in several RTL files under rtl/managed/clusterip/, rtl/managed/mpw/core/username7/ibex/, and in rtl/tech/tc_clk.sv.
- Ravenna / PicoRV32 in ASIC: notices are preserved in rtl/ip/rib/peripheral/gpio.sv, rtl/ip/rib/peripheral/timer.sv, and rtl/ip/rib/serial/uart.sv.
- Hirosh Dabui: the original copyright notice is preserved in rtl/ip/rib/memory/sdram_core.sv.
- EmbedFire: attribution is preserved in rtl/ip/rib/serial/i2c_core.sv and the SPI SD card related files under rtl/ip/rib/storage/.
- Ravenna / PicoRV32 in ASIC: notices are preserved in rtl/ip/ribp/peripheral/gpio.sv, rtl/ip/ribp/peripheral/timer.sv, and rtl/ip/ribp/serial/uart.sv.
- Hirosh Dabui: the original copyright notice is preserved in rtl/ip/ribp/memory/sdram_core.sv.
- EmbedFire: attribution is preserved in rtl/ip/ribp/serial/i2c_core.sv and the SPI SD card related files under rtl/ip/ribp/storage/.
These notices are included solely to preserve attribution for the retained third-party source material. They do not alter the licensing terms of the retroSoC repository itself, which is distributed under the Mulan PSL v2 license.
+1 -1
View File
@@ -114,7 +114,7 @@ static void rs_benchmark_report(const char *region, const char *operation, uint3
rs_benchmark_put_hex(checksum);
rs_benchmark_put_counter(" cycles=", cycles);
rs_benchmark_put_counter(" mgmt_wait=", snapshot->mgmt_wait);
rs_benchmark_put_counter(" rib_wait=", snapshot->rib_wait);
rs_benchmark_put_counter(" ribp_wait=", snapshot->ribp_wait);
rs_benchmark_put_counter(" sdram_wait=", snapshot->sdram_wait);
rs_benchmark_put_counter(" psram_wait=", snapshot->psram_wait);
rs_benchmark_put_counter(" flash_wait=", snapshot->flash_wait);
+5 -5
View File
@@ -62,19 +62,19 @@
},
"cluster_archinfo": {"url": "https://github.com/retroSoC/archinfo.git", "revision": "d65dd13c83a1176668bf5178004814a1551bf6ba", "destination": "rtl/managed/clusterip/archinfo", "license": "NOASSERTION"},
"cluster_clint": {"url": "https://github.com/retroSoC/clint.git", "revision": "ce49f1a5501c0a9f18c0e3f358417648f3f2fb18", "destination": "rtl/managed/clusterip/clint", "license": "NOASSERTION"},
"cluster_common": {"url": "https://github.com/retroSoC/common.git", "revision": "215e47f3774a0f7a493aa2a74da68861d3b6d397", "destination": "rtl/managed/clusterip/common", "license": "NOASSERTION"},
"cluster_common": {"url": "https://github.com/retroSoC/common.git", "revision": "f666d8f04977157fe282ca9873c45aad6757c37f", "destination": "rtl/managed/clusterip/common", "license": "NOASSERTION"},
"cluster_crc": {"url": "https://github.com/retroSoC/crc.git", "revision": "4654a63d06d487b5b9fe22af228c36c736b90bad", "destination": "rtl/managed/clusterip/crc", "license": "NOASSERTION"},
"cluster_i2c": {"url": "https://github.com/retroSoC/i2c.git", "revision": "73b024547c5cd70fb8bf801cc7757db2536c604f", "destination": "rtl/managed/clusterip/i2c", "license": "NOASSERTION"},
"cluster_i2s": {"url": "https://github.com/retroSoC/i2s.git", "revision": "bd0978e8b45e4cf4c1335a1fa7311385d2a4e805", "destination": "rtl/managed/clusterip/i2s", "license": "NOASSERTION"},
"cluster_plic": {"url": "https://github.com/retroSoC/plic.git", "revision": "c851d93829d2e75b224003a058e718925855c0cc", "destination": "rtl/managed/clusterip/plic", "license": "NOASSERTION"},
"cluster_ps2": {"url": "https://github.com/retroSoC/ps2.git", "revision": "60921e0f72d6113f8615d03ce54567388fc2410f", "destination": "rtl/managed/clusterip/ps2", "license": "NOASSERTION"},
"cluster_pwm": {"url": "https://github.com/retroSoC/pwm.git", "revision": "0777ef085c661d2b103f2fa0f8519f97eea3c950", "destination": "rtl/managed/clusterip/pwm", "license": "NOASSERTION"},
"cluster_pwm": {"url": "https://github.com/retroSoC/pwm.git", "revision": "c631ede87506d34f714167313ba69b196c0bea72", "destination": "rtl/managed/clusterip/pwm", "license": "NOASSERTION"},
"cluster_rng": {"url": "https://github.com/retroSoC/rng.git", "revision": "7374e1e7f25bfd1ff9954ea99f19b77a583def29", "destination": "rtl/managed/clusterip/rng", "license": "NOASSERTION"},
"cluster_rtc": {"url": "https://github.com/retroSoC/rtc.git", "revision": "69963b8424cb00e04c8be70157b8ca738464e342", "destination": "rtl/managed/clusterip/rtc", "license": "NOASSERTION"},
"cluster_rtc": {"url": "https://github.com/retroSoC/rtc.git", "revision": "c6cc82f7530eea0b87ebe1d2cde2a67c9268c0db", "destination": "rtl/managed/clusterip/rtc", "license": "NOASSERTION"},
"cluster_spi": {"url": "https://github.com/retroSoC/spi.git", "revision": "515cb408806584525605b4747db5e890dbdf1928", "destination": "rtl/managed/clusterip/spi", "license": "NOASSERTION"},
"cluster_timer": {"url": "https://github.com/retroSoC/timer.git", "revision": "0c44b0d8b742c6a477fda15a812cf22962b54dd8", "destination": "rtl/managed/clusterip/timer", "license": "NOASSERTION"},
"cluster_timer": {"url": "https://github.com/retroSoC/timer.git", "revision": "75fa45d786739e1d5ab6d1e10520be2c2f0d022a", "destination": "rtl/managed/clusterip/timer", "license": "NOASSERTION"},
"cluster_uart": {"url": "https://github.com/retroSoC/uart.git", "revision": "eca12213ba06f42e0a6dd0f27907fd4c447e2774", "destination": "rtl/managed/clusterip/uart", "license": "NOASSERTION"},
"cluster_wdg": {"url": "https://github.com/retroSoC/wdg.git", "revision": "b2603c1faeba96603392f0fe9e692e645d7e061f", "destination": "rtl/managed/clusterip/wdg", "license": "NOASSERTION"}
"cluster_wdg": {"url": "https://github.com/retroSoC/wdg.git", "revision": "86981d54b1b13e6e82d25ab0a369de67ff946dcb", "destination": "rtl/managed/clusterip/wdg", "license": "NOASSERTION"}
},
"archives": {
"fatfs": {
+126 -126
View File
@@ -38,125 +38,125 @@
#define RS_SOC_REG32(base, offset) (*(volatile uint32_t *)(uintptr_t)((base) + (offset)))
// gpio
#define reg_gpio_oe RS_SOC_REG32(RS_SOC_RIB_GPIO_BASE, UINT32_C(0x00))
#define reg_gpio_cs RS_SOC_REG32(RS_SOC_RIB_GPIO_BASE, UINT32_C(0x04))
#define reg_gpio_pu RS_SOC_REG32(RS_SOC_RIB_GPIO_BASE, UINT32_C(0x08))
#define reg_gpio_pd RS_SOC_REG32(RS_SOC_RIB_GPIO_BASE, UINT32_C(0x0C))
#define reg_gpio_do RS_SOC_REG32(RS_SOC_RIB_GPIO_BASE, UINT32_C(0x10))
#define reg_gpio_di RS_SOC_REG32(RS_SOC_RIB_GPIO_BASE, UINT32_C(0x14))
#define reg_gpio_ien RS_SOC_REG32(RS_SOC_RIB_GPIO_BASE, UINT32_C(0x18))
#define reg_gpio_itype0 RS_SOC_REG32(RS_SOC_RIB_GPIO_BASE, UINT32_C(0x1C))
#define reg_gpio_itype1 RS_SOC_REG32(RS_SOC_RIB_GPIO_BASE, UINT32_C(0x20))
#define reg_gpio_istat RS_SOC_REG32(RS_SOC_RIB_GPIO_BASE, UINT32_C(0x24))
#define reg_gpio_iofcfg RS_SOC_REG32(RS_SOC_RIB_GPIO_BASE, UINT32_C(0x28))
#define reg_gpio_pinmux RS_SOC_REG32(RS_SOC_RIB_GPIO_BASE, UINT32_C(0x2C))
#define reg_gpio_user_sel RS_SOC_REG32(RS_SOC_RIB_GPIO_BASE, UINT32_C(0x30))
#define reg_gpio_user_lock RS_SOC_REG32(RS_SOC_RIB_GPIO_BASE, UINT32_C(0x34))
#define reg_gpio_user_status RS_SOC_REG32(RS_SOC_RIB_GPIO_BASE, UINT32_C(0x38))
#define reg_gpio_oe RS_SOC_REG32(RS_SOC_RIBP_GPIO_BASE, UINT32_C(0x00))
#define reg_gpio_cs RS_SOC_REG32(RS_SOC_RIBP_GPIO_BASE, UINT32_C(0x04))
#define reg_gpio_pu RS_SOC_REG32(RS_SOC_RIBP_GPIO_BASE, UINT32_C(0x08))
#define reg_gpio_pd RS_SOC_REG32(RS_SOC_RIBP_GPIO_BASE, UINT32_C(0x0C))
#define reg_gpio_do RS_SOC_REG32(RS_SOC_RIBP_GPIO_BASE, UINT32_C(0x10))
#define reg_gpio_di RS_SOC_REG32(RS_SOC_RIBP_GPIO_BASE, UINT32_C(0x14))
#define reg_gpio_ien RS_SOC_REG32(RS_SOC_RIBP_GPIO_BASE, UINT32_C(0x18))
#define reg_gpio_itype0 RS_SOC_REG32(RS_SOC_RIBP_GPIO_BASE, UINT32_C(0x1C))
#define reg_gpio_itype1 RS_SOC_REG32(RS_SOC_RIBP_GPIO_BASE, UINT32_C(0x20))
#define reg_gpio_istat RS_SOC_REG32(RS_SOC_RIBP_GPIO_BASE, UINT32_C(0x24))
#define reg_gpio_iofcfg RS_SOC_REG32(RS_SOC_RIBP_GPIO_BASE, UINT32_C(0x28))
#define reg_gpio_pinmux RS_SOC_REG32(RS_SOC_RIBP_GPIO_BASE, UINT32_C(0x2C))
#define reg_gpio_user_sel RS_SOC_REG32(RS_SOC_RIBP_GPIO_BASE, UINT32_C(0x30))
#define reg_gpio_user_lock RS_SOC_REG32(RS_SOC_RIBP_GPIO_BASE, UINT32_C(0x34))
#define reg_gpio_user_status RS_SOC_REG32(RS_SOC_RIBP_GPIO_BASE, UINT32_C(0x38))
// uart0
#define reg_uart0_clkdiv RS_SOC_REG32(RS_SOC_RIB_UART0_BASE, UINT32_C(0x00))
#define reg_uart0_data RS_SOC_REG32(RS_SOC_RIB_UART0_BASE, UINT32_C(0x04))
#define reg_uart0_clkdiv RS_SOC_REG32(RS_SOC_RIBP_UART0_BASE, UINT32_C(0x00))
#define reg_uart0_data RS_SOC_REG32(RS_SOC_RIBP_UART0_BASE, UINT32_C(0x04))
// tim0
#define reg_tim0_cfg RS_SOC_REG32(RS_SOC_RIB_TIM0_BASE, UINT32_C(0x00))
#define reg_tim0_rld RS_SOC_REG32(RS_SOC_RIB_TIM0_BASE, UINT32_C(0x04))
#define reg_tim0_val RS_SOC_REG32(RS_SOC_RIB_TIM0_BASE, UINT32_C(0x08))
#define reg_tim0_cfg RS_SOC_REG32(RS_SOC_RIBP_TIM0_BASE, UINT32_C(0x00))
#define reg_tim0_rld RS_SOC_REG32(RS_SOC_RIBP_TIM0_BASE, UINT32_C(0x04))
#define reg_tim0_val RS_SOC_REG32(RS_SOC_RIBP_TIM0_BASE, UINT32_C(0x08))
// tim1
#define reg_tim1_cfg RS_SOC_REG32(RS_SOC_RIB_TIM1_BASE, UINT32_C(0x00))
#define reg_tim1_rld RS_SOC_REG32(RS_SOC_RIB_TIM1_BASE, UINT32_C(0x04))
#define reg_tim1_val RS_SOC_REG32(RS_SOC_RIB_TIM1_BASE, UINT32_C(0x08))
#define reg_tim1_cfg RS_SOC_REG32(RS_SOC_RIBP_TIM1_BASE, UINT32_C(0x00))
#define reg_tim1_rld RS_SOC_REG32(RS_SOC_RIBP_TIM1_BASE, UINT32_C(0x04))
#define reg_tim1_val RS_SOC_REG32(RS_SOC_RIBP_TIM1_BASE, UINT32_C(0x08))
// psram
#define reg_psram_wait RS_SOC_REG32(RS_SOC_RIB_PSRAM_BASE, UINT32_C(0x00))
#define reg_psram_chd RS_SOC_REG32(RS_SOC_RIB_PSRAM_BASE, UINT32_C(0x04))
#define reg_psram_init RS_SOC_REG32(RS_SOC_RIB_PSRAM_BASE, UINT32_C(0x08))
#define reg_psram_wait RS_SOC_REG32(RS_SOC_RIBP_PSRAM_BASE, UINT32_C(0x00))
#define reg_psram_chd RS_SOC_REG32(RS_SOC_RIBP_PSRAM_BASE, UINT32_C(0x04))
#define reg_psram_init RS_SOC_REG32(RS_SOC_RIBP_PSRAM_BASE, UINT32_C(0x08))
// spisd
#define reg_spisd_mode RS_SOC_REG32(RS_SOC_RIB_SPISD_BASE, UINT32_C(0x00))
#define reg_spisd_clkdiv RS_SOC_REG32(RS_SOC_RIB_SPISD_BASE, UINT32_C(0x04))
#define reg_spisd_addr RS_SOC_REG32(RS_SOC_RIB_SPISD_BASE, UINT32_C(0x08))
#define reg_spisd_txdata RS_SOC_REG32(RS_SOC_RIB_SPISD_BASE, UINT32_C(0x0C))
#define reg_spisd_rxdata RS_SOC_REG32(RS_SOC_RIB_SPISD_BASE, UINT32_C(0x10))
#define reg_spisd_status RS_SOC_REG32(RS_SOC_RIB_SPISD_BASE, UINT32_C(0x14))
#define reg_spisd_sync RS_SOC_REG32(RS_SOC_RIB_SPISD_BASE, UINT32_C(0x18))
#define reg_spisd_mode RS_SOC_REG32(RS_SOC_RIBP_SPISD_BASE, UINT32_C(0x00))
#define reg_spisd_clkdiv RS_SOC_REG32(RS_SOC_RIBP_SPISD_BASE, UINT32_C(0x04))
#define reg_spisd_addr RS_SOC_REG32(RS_SOC_RIBP_SPISD_BASE, UINT32_C(0x08))
#define reg_spisd_txdata RS_SOC_REG32(RS_SOC_RIBP_SPISD_BASE, UINT32_C(0x0C))
#define reg_spisd_rxdata RS_SOC_REG32(RS_SOC_RIBP_SPISD_BASE, UINT32_C(0x10))
#define reg_spisd_status RS_SOC_REG32(RS_SOC_RIBP_SPISD_BASE, UINT32_C(0x14))
#define reg_spisd_sync RS_SOC_REG32(RS_SOC_RIBP_SPISD_BASE, UINT32_C(0x18))
// i2c0
#define reg_i2c0_clkdiv RS_SOC_REG32(RS_SOC_RIB_I2C0_BASE, UINT32_C(0x00))
#define reg_i2c0_devaddr RS_SOC_REG32(RS_SOC_RIB_I2C0_BASE, UINT32_C(0x04))
#define reg_i2c0_regaddr RS_SOC_REG32(RS_SOC_RIB_I2C0_BASE, UINT32_C(0x08))
#define reg_i2c0_txdata RS_SOC_REG32(RS_SOC_RIB_I2C0_BASE, UINT32_C(0x0C))
#define reg_i2c0_rxdata RS_SOC_REG32(RS_SOC_RIB_I2C0_BASE, UINT32_C(0x10))
#define reg_i2c0_xfer RS_SOC_REG32(RS_SOC_RIB_I2C0_BASE, UINT32_C(0x14))
#define reg_i2c0_cfg RS_SOC_REG32(RS_SOC_RIB_I2C0_BASE, UINT32_C(0x18))
#define reg_i2c0_status RS_SOC_REG32(RS_SOC_RIB_I2C0_BASE, UINT32_C(0x1C))
#define reg_i2c0_clkdiv RS_SOC_REG32(RS_SOC_RIBP_I2C0_BASE, UINT32_C(0x00))
#define reg_i2c0_devaddr RS_SOC_REG32(RS_SOC_RIBP_I2C0_BASE, UINT32_C(0x04))
#define reg_i2c0_regaddr RS_SOC_REG32(RS_SOC_RIBP_I2C0_BASE, UINT32_C(0x08))
#define reg_i2c0_txdata RS_SOC_REG32(RS_SOC_RIBP_I2C0_BASE, UINT32_C(0x0C))
#define reg_i2c0_rxdata RS_SOC_REG32(RS_SOC_RIBP_I2C0_BASE, UINT32_C(0x10))
#define reg_i2c0_xfer RS_SOC_REG32(RS_SOC_RIBP_I2C0_BASE, UINT32_C(0x14))
#define reg_i2c0_cfg RS_SOC_REG32(RS_SOC_RIBP_I2C0_BASE, UINT32_C(0x18))
#define reg_i2c0_status RS_SOC_REG32(RS_SOC_RIBP_I2C0_BASE, UINT32_C(0x1C))
// i2s
#define reg_i2s_mode RS_SOC_REG32(RS_SOC_RIB_I2S_BASE, UINT32_C(0x00))
#define reg_i2s_format RS_SOC_REG32(RS_SOC_RIB_I2S_BASE, UINT32_C(0x04))
#define reg_i2s_upbound RS_SOC_REG32(RS_SOC_RIB_I2S_BASE, UINT32_C(0x08))
#define reg_i2s_lowbound RS_SOC_REG32(RS_SOC_RIB_I2S_BASE, UINT32_C(0x0C))
#define reg_i2s_recven RS_SOC_REG32(RS_SOC_RIB_I2S_BASE, UINT32_C(0x10))
#define reg_i2s_txdata RS_SOC_REG32(RS_SOC_RIB_I2S_BASE, UINT32_C(0x14))
#define reg_i2s_rxdata RS_SOC_REG32(RS_SOC_RIB_I2S_BASE, UINT32_C(0x18))
#define reg_i2s_status RS_SOC_REG32(RS_SOC_RIB_I2S_BASE, UINT32_C(0x1C))
#define reg_i2s_mode RS_SOC_REG32(RS_SOC_RIBP_I2S_BASE, UINT32_C(0x00))
#define reg_i2s_format RS_SOC_REG32(RS_SOC_RIBP_I2S_BASE, UINT32_C(0x04))
#define reg_i2s_upbound RS_SOC_REG32(RS_SOC_RIBP_I2S_BASE, UINT32_C(0x08))
#define reg_i2s_lowbound RS_SOC_REG32(RS_SOC_RIBP_I2S_BASE, UINT32_C(0x0C))
#define reg_i2s_recven RS_SOC_REG32(RS_SOC_RIBP_I2S_BASE, UINT32_C(0x10))
#define reg_i2s_txdata RS_SOC_REG32(RS_SOC_RIBP_I2S_BASE, UINT32_C(0x14))
#define reg_i2s_rxdata RS_SOC_REG32(RS_SOC_RIBP_I2S_BASE, UINT32_C(0x18))
#define reg_i2s_status RS_SOC_REG32(RS_SOC_RIBP_I2S_BASE, UINT32_C(0x1C))
// onewire
#define reg_onewire_clkdiv RS_SOC_REG32(RS_SOC_RIB_ONEWIRE_BASE, UINT32_C(0x00))
#define reg_onewire_zerocnt RS_SOC_REG32(RS_SOC_RIB_ONEWIRE_BASE, UINT32_C(0x04))
#define reg_onewire_onecnt RS_SOC_REG32(RS_SOC_RIB_ONEWIRE_BASE, UINT32_C(0x08))
#define reg_onewire_rstcnt RS_SOC_REG32(RS_SOC_RIB_ONEWIRE_BASE, UINT32_C(0x0C))
#define reg_onewire_txdata RS_SOC_REG32(RS_SOC_RIB_ONEWIRE_BASE, UINT32_C(0x10))
#define reg_onewire_ctrl RS_SOC_REG32(RS_SOC_RIB_ONEWIRE_BASE, UINT32_C(0x14))
#define reg_onewire_status RS_SOC_REG32(RS_SOC_RIB_ONEWIRE_BASE, UINT32_C(0x18))
#define reg_onewire_clkdiv RS_SOC_REG32(RS_SOC_RIBP_ONEWIRE_BASE, UINT32_C(0x00))
#define reg_onewire_zerocnt RS_SOC_REG32(RS_SOC_RIBP_ONEWIRE_BASE, UINT32_C(0x04))
#define reg_onewire_onecnt RS_SOC_REG32(RS_SOC_RIBP_ONEWIRE_BASE, UINT32_C(0x08))
#define reg_onewire_rstcnt RS_SOC_REG32(RS_SOC_RIBP_ONEWIRE_BASE, UINT32_C(0x0C))
#define reg_onewire_txdata RS_SOC_REG32(RS_SOC_RIBP_ONEWIRE_BASE, UINT32_C(0x10))
#define reg_onewire_ctrl RS_SOC_REG32(RS_SOC_RIBP_ONEWIRE_BASE, UINT32_C(0x14))
#define reg_onewire_status RS_SOC_REG32(RS_SOC_RIBP_ONEWIRE_BASE, UINT32_C(0x18))
// xpi
#define reg_xpi_cfgidx RS_SOC_REG32(RS_SOC_RIB_XPI_BASE, UINT32_C(0x00))
#define reg_xpi_accmd RS_SOC_REG32(RS_SOC_RIB_XPI_BASE, UINT32_C(0x04))
#define reg_xpi_mmstad RS_SOC_REG32(RS_SOC_RIB_XPI_BASE, UINT32_C(0x08))
#define reg_xpi_mmoffst RS_SOC_REG32(RS_SOC_RIB_XPI_BASE, UINT32_C(0x0C))
#define reg_xpi_mode RS_SOC_REG32(RS_SOC_RIB_XPI_BASE, UINT32_C(0x10))
#define reg_xpi_nss RS_SOC_REG32(RS_SOC_RIB_XPI_BASE, UINT32_C(0x14))
#define reg_xpi_clkdiv RS_SOC_REG32(RS_SOC_RIB_XPI_BASE, UINT32_C(0x18))
#define reg_xpi_rdwr RS_SOC_REG32(RS_SOC_RIB_XPI_BASE, UINT32_C(0x1C))
#define reg_xpi_revdat RS_SOC_REG32(RS_SOC_RIB_XPI_BASE, UINT32_C(0x20))
#define reg_xpi_txupb RS_SOC_REG32(RS_SOC_RIB_XPI_BASE, UINT32_C(0x24))
#define reg_xpi_txlowb RS_SOC_REG32(RS_SOC_RIB_XPI_BASE, UINT32_C(0x28))
#define reg_xpi_rxupb RS_SOC_REG32(RS_SOC_RIB_XPI_BASE, UINT32_C(0x2C))
#define reg_xpi_rxlowb RS_SOC_REG32(RS_SOC_RIB_XPI_BASE, UINT32_C(0x30))
#define reg_xpi_flush RS_SOC_REG32(RS_SOC_RIB_XPI_BASE, UINT32_C(0x34))
#define reg_xpi_cmdtyp RS_SOC_REG32(RS_SOC_RIB_XPI_BASE, UINT32_C(0x38))
#define reg_xpi_cmdlen RS_SOC_REG32(RS_SOC_RIB_XPI_BASE, UINT32_C(0x3C))
#define reg_xpi_cmddat RS_SOC_REG32(RS_SOC_RIB_XPI_BASE, UINT32_C(0x40))
#define reg_xpi_adrtyp RS_SOC_REG32(RS_SOC_RIB_XPI_BASE, UINT32_C(0x44))
#define reg_xpi_adrlen RS_SOC_REG32(RS_SOC_RIB_XPI_BASE, UINT32_C(0x48))
#define reg_xpi_adrdat RS_SOC_REG32(RS_SOC_RIB_XPI_BASE, UINT32_C(0x4C))
#define reg_xpi_alttyp RS_SOC_REG32(RS_SOC_RIB_XPI_BASE, UINT32_C(0x50))
#define reg_xpi_altlen RS_SOC_REG32(RS_SOC_RIB_XPI_BASE, UINT32_C(0x54))
#define reg_xpi_altdat RS_SOC_REG32(RS_SOC_RIB_XPI_BASE, UINT32_C(0x58))
#define reg_xpi_tdulen RS_SOC_REG32(RS_SOC_RIB_XPI_BASE, UINT32_C(0x5C))
#define reg_xpi_rdulen RS_SOC_REG32(RS_SOC_RIB_XPI_BASE, UINT32_C(0x60))
#define reg_xpi_dattyp RS_SOC_REG32(RS_SOC_RIB_XPI_BASE, UINT32_C(0x64))
#define reg_xpi_datlen RS_SOC_REG32(RS_SOC_RIB_XPI_BASE, UINT32_C(0x68))
#define reg_xpi_datbit RS_SOC_REG32(RS_SOC_RIB_XPI_BASE, UINT32_C(0x6C))
#define reg_xpi_hlvlen RS_SOC_REG32(RS_SOC_RIB_XPI_BASE, UINT32_C(0x70))
#define reg_xpi_txdata RS_SOC_REG32(RS_SOC_RIB_XPI_BASE, UINT32_C(0x74))
#define reg_xpi_rxdata RS_SOC_REG32(RS_SOC_RIB_XPI_BASE, UINT32_C(0x78))
#define reg_xpi_start RS_SOC_REG32(RS_SOC_RIB_XPI_BASE, UINT32_C(0x7C))
#define reg_xpi_status RS_SOC_REG32(RS_SOC_RIB_XPI_BASE, UINT32_C(0x80))
#define reg_xpi_cfgidx RS_SOC_REG32(RS_SOC_RIBP_XPI_BASE, UINT32_C(0x00))
#define reg_xpi_accmd RS_SOC_REG32(RS_SOC_RIBP_XPI_BASE, UINT32_C(0x04))
#define reg_xpi_mmstad RS_SOC_REG32(RS_SOC_RIBP_XPI_BASE, UINT32_C(0x08))
#define reg_xpi_mmoffst RS_SOC_REG32(RS_SOC_RIBP_XPI_BASE, UINT32_C(0x0C))
#define reg_xpi_mode RS_SOC_REG32(RS_SOC_RIBP_XPI_BASE, UINT32_C(0x10))
#define reg_xpi_nss RS_SOC_REG32(RS_SOC_RIBP_XPI_BASE, UINT32_C(0x14))
#define reg_xpi_clkdiv RS_SOC_REG32(RS_SOC_RIBP_XPI_BASE, UINT32_C(0x18))
#define reg_xpi_rdwr RS_SOC_REG32(RS_SOC_RIBP_XPI_BASE, UINT32_C(0x1C))
#define reg_xpi_revdat RS_SOC_REG32(RS_SOC_RIBP_XPI_BASE, UINT32_C(0x20))
#define reg_xpi_txupb RS_SOC_REG32(RS_SOC_RIBP_XPI_BASE, UINT32_C(0x24))
#define reg_xpi_txlowb RS_SOC_REG32(RS_SOC_RIBP_XPI_BASE, UINT32_C(0x28))
#define reg_xpi_rxupb RS_SOC_REG32(RS_SOC_RIBP_XPI_BASE, UINT32_C(0x2C))
#define reg_xpi_rxlowb RS_SOC_REG32(RS_SOC_RIBP_XPI_BASE, UINT32_C(0x30))
#define reg_xpi_flush RS_SOC_REG32(RS_SOC_RIBP_XPI_BASE, UINT32_C(0x34))
#define reg_xpi_cmdtyp RS_SOC_REG32(RS_SOC_RIBP_XPI_BASE, UINT32_C(0x38))
#define reg_xpi_cmdlen RS_SOC_REG32(RS_SOC_RIBP_XPI_BASE, UINT32_C(0x3C))
#define reg_xpi_cmddat RS_SOC_REG32(RS_SOC_RIBP_XPI_BASE, UINT32_C(0x40))
#define reg_xpi_adrtyp RS_SOC_REG32(RS_SOC_RIBP_XPI_BASE, UINT32_C(0x44))
#define reg_xpi_adrlen RS_SOC_REG32(RS_SOC_RIBP_XPI_BASE, UINT32_C(0x48))
#define reg_xpi_adrdat RS_SOC_REG32(RS_SOC_RIBP_XPI_BASE, UINT32_C(0x4C))
#define reg_xpi_alttyp RS_SOC_REG32(RS_SOC_RIBP_XPI_BASE, UINT32_C(0x50))
#define reg_xpi_altlen RS_SOC_REG32(RS_SOC_RIBP_XPI_BASE, UINT32_C(0x54))
#define reg_xpi_altdat RS_SOC_REG32(RS_SOC_RIBP_XPI_BASE, UINT32_C(0x58))
#define reg_xpi_tdulen RS_SOC_REG32(RS_SOC_RIBP_XPI_BASE, UINT32_C(0x5C))
#define reg_xpi_rdulen RS_SOC_REG32(RS_SOC_RIBP_XPI_BASE, UINT32_C(0x60))
#define reg_xpi_dattyp RS_SOC_REG32(RS_SOC_RIBP_XPI_BASE, UINT32_C(0x64))
#define reg_xpi_datlen RS_SOC_REG32(RS_SOC_RIBP_XPI_BASE, UINT32_C(0x68))
#define reg_xpi_datbit RS_SOC_REG32(RS_SOC_RIBP_XPI_BASE, UINT32_C(0x6C))
#define reg_xpi_hlvlen RS_SOC_REG32(RS_SOC_RIBP_XPI_BASE, UINT32_C(0x70))
#define reg_xpi_txdata RS_SOC_REG32(RS_SOC_RIBP_XPI_BASE, UINT32_C(0x74))
#define reg_xpi_rxdata RS_SOC_REG32(RS_SOC_RIBP_XPI_BASE, UINT32_C(0x78))
#define reg_xpi_start RS_SOC_REG32(RS_SOC_RIBP_XPI_BASE, UINT32_C(0x7C))
#define reg_xpi_status RS_SOC_REG32(RS_SOC_RIBP_XPI_BASE, UINT32_C(0x80))
// dma(32b xfer, hardware trigger by I2S fifo, QSPI fifo)
#define reg_dma_mode RS_SOC_REG32(RS_SOC_RIB_DMA_BASE, UINT32_C(0x00))
#define reg_dma_srcaddr RS_SOC_REG32(RS_SOC_RIB_DMA_BASE, UINT32_C(0x04))
#define reg_dma_srcincr RS_SOC_REG32(RS_SOC_RIB_DMA_BASE, UINT32_C(0x08))
#define reg_dma_dstaddr RS_SOC_REG32(RS_SOC_RIB_DMA_BASE, UINT32_C(0x0C))
#define reg_dma_dstincr RS_SOC_REG32(RS_SOC_RIB_DMA_BASE, UINT32_C(0x10))
#define reg_dma_xferlen RS_SOC_REG32(RS_SOC_RIB_DMA_BASE, UINT32_C(0x14))
#define reg_dma_start RS_SOC_REG32(RS_SOC_RIB_DMA_BASE, UINT32_C(0x18))
#define reg_dma_stop RS_SOC_REG32(RS_SOC_RIB_DMA_BASE, UINT32_C(0x1C))
#define reg_dma_reset RS_SOC_REG32(RS_SOC_RIB_DMA_BASE, UINT32_C(0x20))
#define reg_dma_status RS_SOC_REG32(RS_SOC_RIB_DMA_BASE, UINT32_C(0x24))
#define reg_dma_fsm RS_SOC_REG32(RS_SOC_RIB_DMA_BASE, UINT32_C(0x28))
#define reg_dma_error_status RS_SOC_REG32(RS_SOC_RIB_DMA_BASE, UINT32_C(0x2C))
#define reg_dma_error_addr RS_SOC_REG32(RS_SOC_RIB_DMA_BASE, UINT32_C(0x30))
#define reg_dma_mode RS_SOC_REG32(RS_SOC_RIBP_DMA_BASE, UINT32_C(0x00))
#define reg_dma_srcaddr RS_SOC_REG32(RS_SOC_RIBP_DMA_BASE, UINT32_C(0x04))
#define reg_dma_srcincr RS_SOC_REG32(RS_SOC_RIBP_DMA_BASE, UINT32_C(0x08))
#define reg_dma_dstaddr RS_SOC_REG32(RS_SOC_RIBP_DMA_BASE, UINT32_C(0x0C))
#define reg_dma_dstincr RS_SOC_REG32(RS_SOC_RIBP_DMA_BASE, UINT32_C(0x10))
#define reg_dma_xferlen RS_SOC_REG32(RS_SOC_RIBP_DMA_BASE, UINT32_C(0x14))
#define reg_dma_start RS_SOC_REG32(RS_SOC_RIBP_DMA_BASE, UINT32_C(0x18))
#define reg_dma_stop RS_SOC_REG32(RS_SOC_RIBP_DMA_BASE, UINT32_C(0x1C))
#define reg_dma_reset RS_SOC_REG32(RS_SOC_RIBP_DMA_BASE, UINT32_C(0x20))
#define reg_dma_status RS_SOC_REG32(RS_SOC_RIBP_DMA_BASE, UINT32_C(0x24))
#define reg_dma_fsm RS_SOC_REG32(RS_SOC_RIBP_DMA_BASE, UINT32_C(0x28))
#define reg_dma_error_status RS_SOC_REG32(RS_SOC_RIBP_DMA_BASE, UINT32_C(0x2C))
#define reg_dma_error_addr RS_SOC_REG32(RS_SOC_RIBP_DMA_BASE, UINT32_C(0x30))
#define RS_SOC_DMA_ERROR_PENDING UINT32_C(0x00000001)
#define RS_SOC_DMA_ERROR_RESPONSE_SHIFT 1U
#define RS_SOC_DMA_ERROR_RESPONSE_MASK UINT32_C(0x0000000E)
// sys ctrl
#define RS_SOC_SYSCTRL_REG32(offset) RS_SOC_REG32(RS_SOC_RIB_SYSCTRL_BASE, (offset))
#define reg_sysctrl_coresel RS_SOC_REG32(RS_SOC_RIB_SYSCTRL_BASE, UINT32_C(0x00))
#define reg_sysctrl_ipsel RS_SOC_REG32(RS_SOC_RIB_SYSCTRL_BASE, UINT32_C(0x04))
#define RS_SOC_SYSCTRL_REG32(offset) RS_SOC_REG32(RS_SOC_RIBP_SYSCTRL_BASE, (offset))
#define reg_sysctrl_coresel RS_SOC_REG32(RS_SOC_RIBP_SYSCTRL_BASE, UINT32_C(0x00))
#define reg_sysctrl_ipsel RS_SOC_REG32(RS_SOC_RIBP_SYSCTRL_BASE, UINT32_C(0x04))
#define reg_sysctrl_pll_cfg RS_SOC_SYSCTRL_REG32(RS_SOC_SYSCTRL_PLL_CFG_OFFSET)
#define reg_sysctrl_pll_cmd RS_SOC_SYSCTRL_REG32(RS_SOC_SYSCTRL_PLL_CMD_OFFSET)
/* Status: bit 0 pending (W1C), bit 1 write, bits 3:2 reason (1 unmapped, 2 reserved). */
@@ -175,8 +175,8 @@
#define reg_sysctrl_perf_user_wait_hi RS_SOC_SYSCTRL_REG32(RS_SOC_SYSCTRL_PERF_USER_WAIT_HI_OFFSET)
#define reg_sysctrl_perf_dma_wait_lo RS_SOC_SYSCTRL_REG32(RS_SOC_SYSCTRL_PERF_DMA_WAIT_LO_OFFSET)
#define reg_sysctrl_perf_dma_wait_hi RS_SOC_SYSCTRL_REG32(RS_SOC_SYSCTRL_PERF_DMA_WAIT_HI_OFFSET)
#define reg_sysctrl_perf_rib_wait_lo RS_SOC_SYSCTRL_REG32(RS_SOC_SYSCTRL_PERF_RIB_WAIT_LO_OFFSET)
#define reg_sysctrl_perf_rib_wait_hi RS_SOC_SYSCTRL_REG32(RS_SOC_SYSCTRL_PERF_RIB_WAIT_HI_OFFSET)
#define reg_sysctrl_perf_ribp_wait_lo RS_SOC_SYSCTRL_REG32(RS_SOC_SYSCTRL_PERF_RIBP_WAIT_LO_OFFSET)
#define reg_sysctrl_perf_ribp_wait_hi RS_SOC_SYSCTRL_REG32(RS_SOC_SYSCTRL_PERF_RIBP_WAIT_HI_OFFSET)
#define reg_sysctrl_perf_apb_wait_lo RS_SOC_SYSCTRL_REG32(RS_SOC_SYSCTRL_PERF_APB_WAIT_LO_OFFSET)
#define reg_sysctrl_perf_apb_wait_hi RS_SOC_SYSCTRL_REG32(RS_SOC_SYSCTRL_PERF_APB_WAIT_HI_OFFSET)
#define reg_sysctrl_perf_sdram_wait_lo \
@@ -206,28 +206,28 @@
#define RS_SOC_PERF_CTRL_CLEAR UINT32_C(0x00000002)
#define RS_SOC_PERF_CTRL_SNAPSHOT UINT32_C(0x00000004)
// clint
#define reg_clint_mtimel RS_SOC_REG32(RS_SOC_RIB_CLINT_BASE, UINT32_C(0x00))
#define reg_clint_mtimeh RS_SOC_REG32(RS_SOC_RIB_CLINT_BASE, UINT32_C(0x04))
#define reg_clint_mtimecmpl RS_SOC_REG32(RS_SOC_RIB_CLINT_BASE, UINT32_C(0x08))
#define reg_clint_mtimecmph RS_SOC_REG32(RS_SOC_RIB_CLINT_BASE, UINT32_C(0x0C))
#define reg_clint_msip RS_SOC_REG32(RS_SOC_RIB_CLINT_BASE, UINT32_C(0x10))
#define reg_clint_clkdiv RS_SOC_REG32(RS_SOC_RIB_CLINT_BASE, UINT32_C(0x14))
#define reg_clint_mtimel RS_SOC_REG32(RS_SOC_RIBP_CLINT_BASE, UINT32_C(0x00))
#define reg_clint_mtimeh RS_SOC_REG32(RS_SOC_RIBP_CLINT_BASE, UINT32_C(0x04))
#define reg_clint_mtimecmpl RS_SOC_REG32(RS_SOC_RIBP_CLINT_BASE, UINT32_C(0x08))
#define reg_clint_mtimecmph RS_SOC_REG32(RS_SOC_RIBP_CLINT_BASE, UINT32_C(0x0C))
#define reg_clint_msip RS_SOC_REG32(RS_SOC_RIBP_CLINT_BASE, UINT32_C(0x10))
#define reg_clint_clkdiv RS_SOC_REG32(RS_SOC_RIBP_CLINT_BASE, UINT32_C(0x14))
// sdram
#define reg_sdram_clkdiv RS_SOC_REG32(RS_SOC_RIB_SDRAM_BASE, UINT32_C(0x00))
#define reg_sdram_cfg RS_SOC_REG32(RS_SOC_RIB_SDRAM_BASE, UINT32_C(0x04))
#define reg_sdram_clkdiv RS_SOC_REG32(RS_SOC_RIBP_SDRAM_BASE, UINT32_C(0x00))
#define reg_sdram_cfg RS_SOC_REG32(RS_SOC_RIBP_SDRAM_BASE, UINT32_C(0x04))
// dvp
#define reg_dvp_recven RS_SOC_REG32(RS_SOC_RIB_DVP_BASE, UINT32_C(0x00))
#define reg_dvp_rxdata RS_SOC_REG32(RS_SOC_RIB_DVP_BASE, UINT32_C(0x04))
#define reg_dvp_status RS_SOC_REG32(RS_SOC_RIB_DVP_BASE, UINT32_C(0x08))
#define reg_dvp_recven RS_SOC_REG32(RS_SOC_RIBP_DVP_BASE, UINT32_C(0x00))
#define reg_dvp_rxdata RS_SOC_REG32(RS_SOC_RIBP_DVP_BASE, UINT32_C(0x04))
#define reg_dvp_status RS_SOC_REG32(RS_SOC_RIBP_DVP_BASE, UINT32_C(0x08))
// i2c1
#define reg_i2c1_clkdiv RS_SOC_REG32(RS_SOC_RIB_I2C1_BASE, UINT32_C(0x00))
#define reg_i2c1_devaddr RS_SOC_REG32(RS_SOC_RIB_I2C1_BASE, UINT32_C(0x04))
#define reg_i2c1_regaddr RS_SOC_REG32(RS_SOC_RIB_I2C1_BASE, UINT32_C(0x08))
#define reg_i2c1_txdata RS_SOC_REG32(RS_SOC_RIB_I2C1_BASE, UINT32_C(0x0C))
#define reg_i2c1_rxdata RS_SOC_REG32(RS_SOC_RIB_I2C1_BASE, UINT32_C(0x10))
#define reg_i2c1_xfer RS_SOC_REG32(RS_SOC_RIB_I2C1_BASE, UINT32_C(0x14))
#define reg_i2c1_cfg RS_SOC_REG32(RS_SOC_RIB_I2C1_BASE, UINT32_C(0x18))
#define reg_i2c1_status RS_SOC_REG32(RS_SOC_RIB_I2C1_BASE, UINT32_C(0x1C))
#define reg_i2c1_clkdiv RS_SOC_REG32(RS_SOC_RIBP_I2C1_BASE, UINT32_C(0x00))
#define reg_i2c1_devaddr RS_SOC_REG32(RS_SOC_RIBP_I2C1_BASE, UINT32_C(0x04))
#define reg_i2c1_regaddr RS_SOC_REG32(RS_SOC_RIBP_I2C1_BASE, UINT32_C(0x08))
#define reg_i2c1_txdata RS_SOC_REG32(RS_SOC_RIBP_I2C1_BASE, UINT32_C(0x0C))
#define reg_i2c1_rxdata RS_SOC_REG32(RS_SOC_RIBP_I2C1_BASE, UINT32_C(0x10))
#define reg_i2c1_xfer RS_SOC_REG32(RS_SOC_RIBP_I2C1_BASE, UINT32_C(0x14))
#define reg_i2c1_cfg RS_SOC_REG32(RS_SOC_RIBP_I2C1_BASE, UINT32_C(0x18))
#define reg_i2c1_status RS_SOC_REG32(RS_SOC_RIBP_I2C1_BASE, UINT32_C(0x1C))
// archinfo
#define reg_archinfo_sys RS_SOC_REG32(RS_SOC_APB_ARCHINFO_BASE, UINT32_C(0x00))
#define reg_archinfo_idl RS_SOC_REG32(RS_SOC_APB_ARCHINFO_BASE, UINT32_C(0x04))
+1 -1
View File
@@ -9,7 +9,7 @@ typedef struct {
uint64_t mgmt_wait;
uint64_t user_wait;
uint64_t dma_wait;
uint64_t rib_wait;
uint64_t ribp_wait;
uint64_t apb_wait;
uint64_t sdram_wait;
uint64_t psram_wait;
+2 -2
View File
@@ -30,8 +30,8 @@ rs_status_t rs_perf_snapshot(rs_perf_snapshot_t *snapshot) {
rs_perf_read_counter(&reg_sysctrl_perf_user_wait_lo, &reg_sysctrl_perf_user_wait_hi);
snapshot->dma_wait =
rs_perf_read_counter(&reg_sysctrl_perf_dma_wait_lo, &reg_sysctrl_perf_dma_wait_hi);
snapshot->rib_wait =
rs_perf_read_counter(&reg_sysctrl_perf_rib_wait_lo, &reg_sysctrl_perf_rib_wait_hi);
snapshot->ribp_wait =
rs_perf_read_counter(&reg_sysctrl_perf_ribp_wait_lo, &reg_sysctrl_perf_ribp_wait_hi);
snapshot->apb_wait =
rs_perf_read_counter(&reg_sysctrl_perf_apb_wait_lo, &reg_sysctrl_perf_apb_wait_hi);
snapshot->sdram_wait =
+1 -1
View File
@@ -111,7 +111,7 @@ Verilator regressions.
`make CONFIG=configs/ci/ihp130.mk formal` proves selected
protocol invariants with SymbiYosys, Yosys, `sv2v`, and Bitwuzla. The current
targets are `bus`, `rib_adapter`, `spill_register`, `rib2apb`, `sysctrl`,
targets are `bus`, `rib_adapter`, `spill_register`, `ribp2apb`, `sysctrl`,
`pll_rcu`, and `gpio_user`; each uses
the SBY `prove` task for bounded model checking and k-induction, plus a
`cover` task, at depth 20. `sysctrl` checks register side effects, PLL request
@@ -8,7 +8,7 @@
// MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
// See the Mulan PSL v2 for more details.
module axi4f2rib (
module axi4f2ribp (
// verilog_format: off
input logic aclk_i,
input logic aresetn_i,
@@ -29,7 +29,7 @@ module axi4f2rib (
output logic [ 1:0] rresp_o,
output logic rvalid_o,
input logic rready_i,
rib_if.master rib
ribp_if.master ribp
// verilog_format: on
);
+1 -1
View File
@@ -8,5 +8,5 @@
// MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
// See the Mulan PSL v2 for more details.
module rib_gpu ();
module ribp_gpu ();
endmodule
@@ -10,5 +10,5 @@
`include "mmap_define.svh"
module wb2rib ();
module wb2ribp ();
endmodule
-136
View File
@@ -1,136 +0,0 @@
// Copyright (c) 2023-2026 Yuchi Miao <miaoyuchi@ict.ac.cn>
// retroSoC is licensed under Mulan PSL v2.
// You can use this software according to the terms and conditions of the Mulan PSL v2.
// You may obtain a copy of Mulan PSL v2 at:
// http://license.coscl.org.cn/MulanPSL2
// THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
// EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
// MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
// See the Mulan PSL v2 for more details.
module rib_regslice (
// verilog_format: off
input logic clk_i,
input logic rst_n_i,
rib_if.slave rib_slv,
rib_if.master rib_mst
// verilog_format: on
);
localparam FSM_IDLE = 2'd0;
localparam FSM_REQ = 2'd1;
localparam FSM_RESP = 2'd2;
logic [1:0] s_fsm_d, s_fsm_q;
logic s_rib_mst_valid_d, s_rib_mst_valid_q;
logic [31:0] s_rib_mst_addr_d, s_rib_mst_addr_q;
logic [31:0] s_rib_mst_wdata_d, s_rib_mst_wdata_q;
logic [3:0] s_rib_mst_wstrb_d, s_rib_mst_wstrb_q;
logic [31:0] s_rib_mst_rdata_d, s_rib_mst_rdata_q;
logic s_rib_mst_ready_d, s_rib_mst_ready_q;
// rib mst if
assign rib_mst.valid = s_rib_mst_valid_q;
assign rib_mst.addr = s_rib_mst_addr_q;
assign rib_mst.wdata = s_rib_mst_wdata_q;
assign rib_mst.wstrb = s_rib_mst_wstrb_q;
always_comb begin
s_fsm_d = s_fsm_q;
s_rib_mst_valid_d = s_rib_mst_valid_q;
s_rib_mst_addr_d = s_rib_mst_addr_q;
s_rib_mst_wdata_d = s_rib_mst_wdata_q;
s_rib_mst_wstrb_d = s_rib_mst_wstrb_q;
s_rib_mst_ready_d = s_rib_mst_ready_q;
s_rib_mst_rdata_d = s_rib_mst_rdata_q;
rib_slv.ready = '0;
rib_slv.rdata = '0;
unique case (s_fsm_q)
FSM_IDLE: begin
if (rib_slv.valid) begin
s_fsm_d = FSM_REQ;
s_rib_mst_valid_d = rib_slv.valid;
s_rib_mst_addr_d = rib_slv.addr;
s_rib_mst_wdata_d = rib_slv.wdata;
s_rib_mst_wstrb_d = rib_slv.wstrb;
end
end
FSM_REQ: begin
if (rib_mst.ready) begin
s_fsm_d = FSM_RESP;
s_rib_mst_valid_d = 1'b0;
s_rib_mst_ready_d = rib_mst.ready;
s_rib_mst_rdata_d = rib_mst.rdata;
end
end
FSM_RESP: begin
s_fsm_d = FSM_IDLE;
rib_slv.ready = s_rib_mst_ready_q;
rib_slv.rdata = s_rib_mst_rdata_q;
end
default: begin
s_fsm_d = s_fsm_q;
s_rib_mst_valid_d = s_rib_mst_valid_q;
s_rib_mst_addr_d = s_rib_mst_addr_q;
s_rib_mst_wdata_d = s_rib_mst_wdata_q;
s_rib_mst_wstrb_d = s_rib_mst_wstrb_q;
s_rib_mst_ready_d = s_rib_mst_ready_q;
s_rib_mst_rdata_d = s_rib_mst_rdata_q;
rib_slv.ready = '0;
rib_slv.rdata = '0;
end
endcase
end
dffr #(2) u_fsm_dffr (
clk_i,
rst_n_i,
s_fsm_d,
s_fsm_q
);
dffr #(1) u_rib_mstr_valid_dffr (
clk_i,
rst_n_i,
s_rib_mst_valid_d,
s_rib_mst_valid_q
);
dffr #(32) u_rib_mst_addr_dffr (
clk_i,
rst_n_i,
s_rib_mst_addr_d,
s_rib_mst_addr_q
);
dffr #(32) u_rib_mst_wdata_dffr (
clk_i,
rst_n_i,
s_rib_mst_wdata_d,
s_rib_mst_wdata_q
);
dffr #(4) u_rib_mst_wstrb_dffr (
clk_i,
rst_n_i,
s_rib_mst_wstrb_d,
s_rib_mst_wstrb_q
);
dffr #(32) u_rib_mst_rdata_dffr (
clk_i,
rst_n_i,
s_rib_mst_rdata_d,
s_rib_mst_rdata_q
);
dffr #(1) u_rib_mst_ready_dffr (
clk_i,
rst_n_i,
s_rib_mst_ready_d,
s_rib_mst_ready_q
);
endmodule
-84
View File
@@ -1,84 +0,0 @@
// Copyright (c) 2023-2026 Yuchi Miao <miaoyuchi@ict.ac.cn>
// retroSoC is licensed under Mulan PSL v2.
// You can use this software according to the terms and conditions of the Mulan PSL v2.
// You may obtain a copy of Mulan PSL v2 at:
// http://license.coscl.org.cn/MulanPSL2
// THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
// EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
// MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
// See the Mulan PSL v2 for more details.
`ifndef RIB_SDRAM_DEF_SV
`define RIB_SDRAM_DEF_SV
// verilog_format: off
`define RIB_SDRAM_CLKDIV 8'h00
`define RIB_SDRAM_CFG 8'h04
// verilog_format: on
`endif
module sdram_reg (
// verilog_format: off
input logic clk_i,
input logic rst_n_i,
rib_if.slave rib,
output logic [1:0] clkdiv_o
// verilog_format: on
);
// rib
logic s_rib_wr_hdshk, s_rib_rd_hdshk;
logic s_rib_ready_d, s_rib_ready_q;
logic s_rib_rdata_en;
logic [31:0] s_rib_rdata_d, s_rib_rdata_q;
// register
logic s_sdram_clkdiv_en;
logic [1:0] s_sdram_clkdiv_d, s_sdram_clkdiv_q;
// rib
assign s_rib_wr_hdshk = rib.valid && (~s_rib_ready_q) && (|rib.wstrb);
assign s_rib_rd_hdshk = rib.valid && (~s_rib_ready_q) && (~(|rib.wstrb));
assign rib.ready = s_rib_ready_q;
assign rib.rdata = s_rib_rdata_q;
// reg
assign clkdiv_o = s_sdram_clkdiv_q;
assign s_sdram_clkdiv_en = s_rib_wr_hdshk && rib.addr[7:0] == `RIB_SDRAM_CLKDIV;
assign s_sdram_clkdiv_d = rib.wdata[1:0];
dffer #(2) u_sdram_clkdiv_dffer (
clk_i,
rst_n_i,
s_sdram_clkdiv_en,
s_sdram_clkdiv_d,
s_sdram_clkdiv_q
);
// rib resp
assign s_rib_ready_d = rib.valid && (~s_rib_ready_q);
dffr #(1) u_rib_ready_dffr (
clk_i,
rst_n_i,
s_rib_ready_d,
s_rib_ready_q
);
assign s_rib_rdata_en = s_rib_rd_hdshk;
always_comb begin
s_rib_rdata_d = s_rib_rdata_q;
unique case (rib.addr[7:0])
`RIB_SDRAM_CLKDIV: s_rib_rdata_d = {30'd0, s_sdram_clkdiv_q};
default: s_rib_rdata_d = s_rib_rdata_q;
endcase
end
dffer #(32) u_rib_rdata_dffer (
clk_i,
rst_n_i,
s_rib_rdata_en,
s_rib_rdata_d,
s_rib_rdata_q
);
endmodule
-180
View File
@@ -1,180 +0,0 @@
// Copyright (c) 2023-2026 Yuchi Miao <miaoyuchi@ict.ac.cn>
// retroSoC is licensed under Mulan PSL v2.
// You can use this software according to the terms and conditions of the Mulan PSL v2.
// You may obtain a copy of Mulan PSL v2 at:
// http://license.coscl.org.cn/MulanPSL2
// THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
// EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
// MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
// See the Mulan PSL v2 for more details.
`ifndef CLINT_DEF_SV
`define CLINT_DEF_SV
// verilog_format: off
`define RIB_CLINT_MTIMEL 8'h00
`define RIB_CLINT_MTIMEH 8'h04
`define RIB_CLINT_MTIMECMPL 8'h08
`define RIB_CLINT_MTIMECMPH 8'h0C
`define RIB_CLINT_MSIP 8'h10
`define RIB_CLINT_CLKDIV 8'h14
// verilog_format: on
`endif
interface simp_clint_if ();
logic tmr_irq_o;
logic sfr_irq_o;
modport dut(output tmr_irq_o, output sfr_irq_o);
endinterface
module rib_clint (
// verilog_format: off
input logic clk_i,
input logic rst_n_i,
rib_if.slave rib,
simp_clint_if.dut clint
// verilog_format: on
);
logic s_rib_wr_hdshk, s_rib_rd_hdshk;
logic s_rib_ready_d, s_rib_ready_q;
logic s_rib_rdata_en;
logic [31:0] s_rib_rdata_d, s_rib_rdata_q;
logic s_clint_clkdiv_en;
logic [7:0] s_clint_clkdiv_d, s_clint_clkdiv_q;
logic s_clint_mtime_en;
logic [63:0] s_clint_mtime_d, s_clint_mtime_q;
logic s_clint_mtimecmp_en;
logic [63:0] s_clint_mtimecmp_d, s_clint_mtimecmp_q;
logic s_clint_msip_en;
logic s_clint_msip_d, s_clint_msip_q;
// utils
logic [7:0] s_clk_cnt_d, s_clk_cnt_q;
// pipelined 64-bit compare: split into hi32 and lo32 stages
logic s_tmr_hi_gt, s_tmr_hi_eq, s_tmr_lo_ge;
logic s_tmr_irq_d, s_tmr_irq_q;
assign s_rib_wr_hdshk = rib.valid && (~s_rib_ready_q) && (|rib.wstrb);
assign s_rib_rd_hdshk = rib.valid && (~s_rib_ready_q) && (~(|rib.wstrb));
assign rib.ready = s_rib_ready_q;
assign rib.rdata = s_rib_rdata_q;
// pipelined 64-bit magnitude compare (registered output)
assign s_tmr_hi_gt = s_clint_mtime_q[63:32] > s_clint_mtimecmp_q[63:32];
assign s_tmr_hi_eq = s_clint_mtime_q[63:32] == s_clint_mtimecmp_q[63:32];
assign s_tmr_lo_ge = s_clint_mtime_q[31:0] >= s_clint_mtimecmp_q[31:0];
assign s_tmr_irq_d = s_tmr_hi_gt || (s_tmr_hi_eq && s_tmr_lo_ge);
dffr #(1) u_tmr_irq_dffr (
clk_i,
rst_n_i,
s_tmr_irq_d,
s_tmr_irq_q
);
assign clint.tmr_irq_o = s_tmr_irq_q;
assign clint.sfr_irq_o = s_clint_msip_q;
assign s_clint_clkdiv_en = s_rib_wr_hdshk && rib.addr[7:0] == `RIB_CLINT_CLKDIV;
assign s_clint_clkdiv_d = rib.wdata[7:0];
dffer #(8) u_clint_clkdiv_dffer (
clk_i,
rst_n_i,
s_clint_clkdiv_en,
s_clint_clkdiv_d,
s_clint_clkdiv_q
);
always_comb begin
s_clk_cnt_d = s_clk_cnt_q;
if (s_clk_cnt_q == s_clint_clkdiv_q) begin
s_clk_cnt_d = '0;
end else begin
s_clk_cnt_d = s_clk_cnt_q + 1'b1;
end
end
dffr #(8) u_clk_cnt_dffr (
clk_i,
rst_n_i,
s_clk_cnt_d,
s_clk_cnt_q
);
assign s_clint_mtime_en = s_clk_cnt_q == s_clint_clkdiv_q;
assign s_clint_mtime_d = s_clint_mtime_q + 1'b1;
dffer #(64) u_clint_mtime_dffer (
clk_i,
rst_n_i,
s_clint_mtime_en,
s_clint_mtime_d,
s_clint_mtime_q
);
assign s_clint_mtimecmp_en = s_rib_wr_hdshk && (rib.addr[7:0] == `RIB_CLINT_MTIMECMPL || rib.addr[7:0] == `RIB_CLINT_MTIMECMPH);
always_comb begin
s_clint_mtimecmp_d = s_clint_mtimecmp_q;
if (rib.addr[7:0] == `RIB_CLINT_MTIMECMPL) begin
if (rib.wstrb[0]) s_clint_mtimecmp_d[7:0] = rib.wdata[7:0];
if (rib.wstrb[1]) s_clint_mtimecmp_d[15:8] = rib.wdata[15:8];
if (rib.wstrb[2]) s_clint_mtimecmp_d[23:16] = rib.wdata[23:16];
if (rib.wstrb[3]) s_clint_mtimecmp_d[31:24] = rib.wdata[31:24];
end else if (rib.addr[7:0] == `RIB_CLINT_MTIMECMPH) begin
if (rib.wstrb[0]) s_clint_mtimecmp_d[39:32] = rib.wdata[7:0];
if (rib.wstrb[1]) s_clint_mtimecmp_d[47:40] = rib.wdata[15:8];
if (rib.wstrb[2]) s_clint_mtimecmp_d[55:48] = rib.wdata[23:16];
if (rib.wstrb[3]) s_clint_mtimecmp_d[63:56] = rib.wdata[31:24];
end
end
dfferh #(64) u_clint_mtimecmp_dfferh (
clk_i,
rst_n_i,
s_clint_mtimecmp_en,
s_clint_mtimecmp_d,
s_clint_mtimecmp_q
);
assign s_clint_msip_en = s_rib_wr_hdshk && rib.addr[7:0] == `RIB_CLINT_MSIP;
assign s_clint_msip_d = rib.wdata[0];
dffer #(1) u_clint_msip_dffer (
clk_i,
rst_n_i,
s_clint_msip_en,
s_clint_msip_d,
s_clint_msip_q
);
assign s_rib_ready_d = rib.valid && (~s_rib_ready_q);
dffr #(1) u_rib_ready_dffr (
clk_i,
rst_n_i,
s_rib_ready_d,
s_rib_ready_q
);
assign s_rib_rdata_en = s_rib_rd_hdshk;
always_comb begin
s_rib_rdata_d = s_rib_rdata_q;
unique case (rib.addr[7:0])
`RIB_CLINT_CLKDIV: s_rib_rdata_d = {24'd0, s_clint_clkdiv_q};
`RIB_CLINT_MTIMEL: s_rib_rdata_d = s_clint_mtime_q[31:0];
`RIB_CLINT_MTIMEH: s_rib_rdata_d = s_clint_mtime_q[63:32];
`RIB_CLINT_MTIMECMPL: s_rib_rdata_d = s_clint_mtimecmp_q[31:0];
`RIB_CLINT_MTIMECMPH: s_rib_rdata_d = s_clint_mtimecmp_q[63:32];
`RIB_CLINT_MSIP: s_rib_rdata_d = {31'd0, s_clint_msip_q};
default: s_rib_rdata_d = s_rib_rdata_q;
endcase
end
dffer #(32) u_rib_rdata_dffer (
clk_i,
rst_n_i,
s_rib_rdata_en,
s_rib_rdata_d,
s_rib_rdata_q
);
endmodule
-32
View File
@@ -1,32 +0,0 @@
// Copyright (c) 2023-2026 Yuchi Miao <miaoyuchi@ict.ac.cn>
// retroSoC is licensed under Mulan PSL v2.
// You can use this software according to the terms and conditions of the Mulan PSL v2.
// You may obtain a copy of Mulan PSL v2 at:
// http://license.coscl.org.cn/MulanPSL2
// THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
// EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
// MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
// See the Mulan PSL v2 for more details.
`ifndef RIB_GPIO_DEF_SV
`define RIB_GPIO_DEF_SV
// verilog_format: off
`define RIB_GPIO_NUM 32
`define RIB_GPIO_OE 8'h00 // rw
`define RIB_GPIO_CS 8'h04 // rw
`define RIB_GPIO_PU 8'h08 // rw
`define RIB_GPIO_PD 8'h0C // rw
`define RIB_GPIO_DO 8'h10 // rw
`define RIB_GPIO_DI 8'h14 // ro
`define RIB_GPIO_IEN 8'h18 // rw
`define RIB_GPIO_ITYPE0 8'h1c // rw
`define RIB_GPIO_ITYPE1 8'h20 // rw
`define RIB_GPIO_ISTAT 8'h24 // ro
`define RIB_GPIO_IOFCFG 8'h28 // rw
`define RIB_GPIO_PINMUX 8'h2c // rw
`define RIB_GPIO_USER_SEL 8'h30 // rw
`define RIB_GPIO_USER_LOCK 8'h34 // rw1s
`define RIB_GPIO_USER_STATUS 8'h38 // ro
// verilog_format: on
`endif
-157
View File
@@ -1,157 +0,0 @@
// Copyright (c) 2023-2026 Yuchi Miao <miaoyuchi@ict.ac.cn>
// retroSoC is licensed under Mulan PSL v2.
// You can use this software according to the terms and conditions of the Mulan PSL v2.
// You may obtain a copy of Mulan PSL v2 at:
// http://license.coscl.org.cn/MulanPSL2
// THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
// EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
// MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
// See the Mulan PSL v2 for more details.
`ifndef RIB_SPISD_DEF_SV
`define RIB_SPISD_DEF_SV
// verilog_format: off
`define RIB_SPISD_MODE 8'h00
`define RIB_SPISD_CLKDIV 8'h04
`define RIB_SPISD_ADDR 8'h08
`define RIB_SPISD_TXDATA 8'h0C
`define RIB_SPISD_RXDATA 8'h10
`define RIB_SPISD_STATUS 8'h14
`define RIB_SPISD_SYNC 8'h18
// verilog_format: on
`endif
module spisd_reg (
// verilog_format: off
input logic clk_i,
input logic rst_n_i,
input logic init_done_i,
output logic wr_sync_o,
input logic wr_sync_done_i,
output logic mode_o,
output logic [1:0] clkdiv_o,
rib_if.slave rib,
rib_if.master byp_rib
// verilog_format: on
);
// rib
logic s_rib_wr_hdshk, s_rib_rd_hdshk;
logic s_rib_ready_d, s_rib_ready_q;
logic s_rib_rdata_en;
logic [31:0] s_rib_rdata_d, s_rib_rdata_q;
// reg
logic s_spisd_mode_en;
logic s_spisd_mode_d, s_spisd_mode_q;
logic s_spisd_clkdiv_en;
logic [1:0] s_spisd_clkdiv_d, s_spisd_clkdiv_q;
logic s_spisd_addr_en;
logic [31:0] s_spisd_addr_d, s_spisd_addr_q;
logic [1:0] s_spisd_status_d, s_spisd_status_q;
// common
logic s_wr_byp, s_rd_byp;
// rib
assign s_rib_wr_hdshk = rib.valid && (~s_rib_ready_q) && (|rib.wstrb);
assign s_rib_rd_hdshk = rib.valid && (~s_rib_ready_q) && (~(|rib.wstrb));
assign s_wr_byp = s_rib_wr_hdshk && rib.addr[7:0] == `RIB_SPISD_TXDATA;
assign s_rd_byp = s_rib_rd_hdshk && rib.addr[7:0] == `RIB_SPISD_RXDATA;
assign rib.ready = (s_wr_byp || s_rd_byp) ? byp_rib.ready : s_rib_ready_q;
assign rib.rdata = (s_wr_byp || s_rd_byp) ? byp_rib.rdata : s_rib_rdata_q;
// common
assign mode_o = s_spisd_mode_q;
assign clkdiv_o = s_spisd_clkdiv_q;
// byp
assign byp_rib.valid = s_wr_byp || s_rd_byp;
assign byp_rib.addr = s_spisd_addr_q;
assign byp_rib.wdata = rib.wdata;
assign byp_rib.wstrb = rib.wstrb;
assign s_spisd_mode_en = s_rib_wr_hdshk && rib.addr[7:0] == `RIB_SPISD_MODE;
assign s_spisd_mode_d = rib.wdata[0];
dffer #(1) u_spisd_mode_dffer (
clk_i,
rst_n_i,
s_spisd_mode_en,
s_spisd_mode_d,
s_spisd_mode_q
);
assign s_spisd_clkdiv_en = s_rib_wr_hdshk && rib.addr[7:0] == `RIB_SPISD_CLKDIV;
assign s_spisd_clkdiv_d = rib.wdata[1:0];
dffer #(2) u_spisd_clkdiv_dffer (
clk_i,
rst_n_i,
s_spisd_clkdiv_en,
s_spisd_clkdiv_d,
s_spisd_clkdiv_q
);
assign s_spisd_addr_en = s_rib_wr_hdshk && rib.addr[7:0] == `RIB_SPISD_ADDR;
always_comb begin
s_spisd_addr_d = s_spisd_addr_q;
if (rib.wstrb[0]) s_spisd_addr_d[7:0] = rib.wdata[7:0];
if (rib.wstrb[1]) s_spisd_addr_d[15:8] = rib.wdata[15:8];
if (rib.wstrb[2]) s_spisd_addr_d[23:16] = rib.wdata[23:16];
if (rib.wstrb[3]) s_spisd_addr_d[31:24] = rib.wdata[31:24];
end
dffer #(32) u_spisd_addr_dffer (
clk_i,
rst_n_i,
s_spisd_addr_en,
s_spisd_addr_d,
s_spisd_addr_q
);
// 0: init done
// 1: wr sync done
always_comb begin
s_spisd_status_d = s_spisd_status_q;
s_spisd_status_d[0] = init_done_i;
if (wr_sync_done_i && ~s_spisd_status_q[1]) begin
s_spisd_status_d[1] = 1'b1;
end else if (s_spisd_status_q[1] && s_rib_rd_hdshk && rib.addr[7:0] == `RIB_SPISD_STATUS) begin
s_spisd_status_d[1] = 1'b0;
end
end
dffr #(2) u_spisd_status_dffr (
clk_i,
rst_n_i,
s_spisd_status_d,
s_spisd_status_q
);
// software wr sync
assign wr_sync_o = s_rib_wr_hdshk && rib.addr[7:0] == `RIB_SPISD_SYNC;
assign s_rib_ready_d = rib.valid && (~s_rib_ready_q);
dffr #(1) u_rib_ready_dffr (
clk_i,
rst_n_i,
s_rib_ready_d,
s_rib_ready_q
);
assign s_rib_rdata_en = s_rib_rd_hdshk;
always_comb begin
s_rib_rdata_d = s_rib_rdata_q;
unique case (rib.addr[7:0])
`RIB_SPISD_MODE: s_rib_rdata_d = {31'd0, s_spisd_mode_q};
`RIB_SPISD_CLKDIV: s_rib_rdata_d = {30'd0, s_spisd_clkdiv_q};
`RIB_SPISD_ADDR: s_rib_rdata_d = s_spisd_addr_q;
`RIB_SPISD_STATUS: s_rib_rdata_d = {30'd0, s_spisd_status_q};
default: s_rib_rdata_d = s_rib_rdata_q;
endcase
end
dffer #(32) u_rib_rdata_dffer (
clk_i,
rst_n_i,
s_rib_rdata_en,
s_rib_rdata_d,
s_rib_rdata_q
);
endmodule
-58
View File
@@ -1,58 +0,0 @@
// Copyright (c) 2023-2026 Yuchi Miao <miaoyuchi@ict.ac.cn>
// retroSoC is licensed under Mulan PSL v2.
// You can use this software according to the terms and conditions of the Mulan PSL v2.
// You may obtain a copy of Mulan PSL v2 at:
// http://license.coscl.org.cn/MulanPSL2
// THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
// EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
// MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
// See the Mulan PSL v2 for more details.
`ifndef RIB_XPI_DEF_SV
`define RIB_XPI_DEF_SV
// verilog_format: off
`define RIB_XPI_CFGIDX 8'h00
`define RIB_XPI_ACCMD 8'h04
`define RIB_XPI_MMSTAD 8'h08
`define RIB_XPI_MMOFFST 8'h0C
`define RIB_XPI_MODE 8'h10
`define RIB_XPI_NSS 8'h14
`define RIB_XPI_CLKDIV 8'h18
`define RIB_XPI_RDWR 8'h1C
`define RIB_XPI_REVDAT 8'h20
`define RIB_XPI_TXUPB 8'h24
`define RIB_XPI_TXLOWB 8'h28
`define RIB_XPI_RXUPB 8'h2C
`define RIB_XPI_RXLOWB 8'h30
`define RIB_XPI_FLUSH 8'h34
`define RIB_XPI_CMDTYP 8'h38
`define RIB_XPI_CMDLEN 8'h3C
`define RIB_XPI_CMDDAT 8'h40
`define RIB_XPI_ADRTYP 8'h44
`define RIB_XPI_ADRLEN 8'h48
`define RIB_XPI_ADRDAT 8'h4C
`define RIB_XPI_ALTTYP 8'h50
`define RIB_XPI_ALTLEN 8'h54
`define RIB_XPI_ALTDAT 8'h58
`define RIB_XPI_TDULEN 8'h5C
`define RIB_XPI_RDULEN 8'h60
`define RIB_XPI_DATTYP 8'h64
`define RIB_XPI_DATLEN 8'h68
`define RIB_XPI_DATBIT 8'h6C
`define RIB_XPI_HLVLEN 8'h70
`define RIB_XPI_TXDATA 8'h74
`define RIB_XPI_RXDATA 8'h78
`define RIB_XPI_XST 8'h7C
`define RIB_XPI_STATUS 8'h80
`define XPI_TYPE_NONE 2'd0
`define XPI_TYPE_SNGL 2'd1
`define XPI_TYPE_DUAL 2'd2
`define XPI_TYPE_QUAD 2'd3
`define XPI_NSS_NUM 4
`define XPI_LNS_NUM $clog2(`XPI_NSS_NUM)
// verilog_format: on
`endif
@@ -9,9 +9,9 @@
// See the Mulan PSL v2 for more details.
module ahbl2rib (
ahbl_if.slave ahbl,
rib_if.master rib
module ahbl2ribp (
ahbl_if.slave ahbl,
ribp_if.master ribp
);
localparam AHBL_TRANS_IDLE = 2'b00;
@@ -39,61 +39,61 @@ module ahbl2rib (
// ahbl if
// NOTE: need to gurantee `ahbl.hready` and `ahbl.hrdata` sampled in same cycle
assign ahbl.hready = (s_fsm_q == STATE_IDLE) || rib.ready;
assign ahbl.hready = (s_fsm_q == STATE_IDLE) || ribp.ready;
assign ahbl.hresp = AHBL_RESP_OKAY;
assign ahbl.hrdata = rib.rdata;
assign ahbl.hrdata = ribp.rdata;
// rib if
assign rib.valid = s_fsm_q != STATE_IDLE;
assign rib.addr = {s_haddr_q[31:2], 2'b00};
// ribp if
assign ribp.valid = s_fsm_q != STATE_IDLE;
assign ribp.addr = {s_haddr_q[31:2], 2'b00};
always_comb begin
rib.wstrb = '0;
rib.wdata = '0;
ribp.wstrb = '0;
ribp.wdata = '0;
if (s_hwrite_q) begin
unique case (s_hsize_q)
AHBL_SIZE_BYTE: begin
unique case (s_haddr_q[1:0])
2'b00: begin
rib.wstrb = 4'b0001;
rib.wdata = {24'b0, ahbl.hwdata[7:0]};
ribp.wstrb = 4'b0001;
ribp.wdata = {24'b0, ahbl.hwdata[7:0]};
end
2'b01: begin
rib.wstrb = 4'b0010;
rib.wdata = {16'b0, ahbl.hwdata[7:0], 8'b0};
ribp.wstrb = 4'b0010;
ribp.wdata = {16'b0, ahbl.hwdata[7:0], 8'b0};
end
2'b10: begin
rib.wstrb = 4'b0100;
rib.wdata = {8'b0, ahbl.hwdata[7:0], 16'b0};
ribp.wstrb = 4'b0100;
ribp.wdata = {8'b0, ahbl.hwdata[7:0], 16'b0};
end
2'b11: begin
rib.wstrb = 4'b1000;
rib.wdata = {ahbl.hwdata[7:0], 24'b0};
ribp.wstrb = 4'b1000;
ribp.wdata = {ahbl.hwdata[7:0], 24'b0};
end
default: begin
rib.wstrb = 4'b0001;
rib.wdata = {24'b0, ahbl.hwdata[7:0]};
ribp.wstrb = 4'b0001;
ribp.wdata = {24'b0, ahbl.hwdata[7:0]};
end
endcase
end
AHBL_SIZE_HWRD: begin
unique case (s_haddr_q[1])
1'b0: begin
rib.wstrb = 4'b0011;
rib.wdata = {16'b0, ahbl.hwdata[15:0]};
ribp.wstrb = 4'b0011;
ribp.wdata = {16'b0, ahbl.hwdata[15:0]};
end
1'b1: begin
rib.wstrb = 4'b1100;
rib.wdata = {ahbl.hwdata[15:0], 16'd0};
ribp.wstrb = 4'b1100;
ribp.wdata = {ahbl.hwdata[15:0], 16'd0};
end
endcase
end
AHBL_SIZE_WORD: begin
rib.wstrb = 4'b1111;
rib.wdata = ahbl.hwdata;
ribp.wstrb = 4'b1111;
ribp.wdata = ahbl.hwdata;
end
default: begin
rib.wstrb = 4'b1111;
rib.wdata = ahbl.hwdata;
ribp.wstrb = 4'b1111;
ribp.wdata = ahbl.hwdata;
end
endcase
end
@@ -117,8 +117,8 @@ module ahbl2rib (
end
end
STATE_DATA: begin
if (~rib.ready) s_fsm_d = STATE_WAIT;
// rib.ready == 1'b1
if (~ribp.ready) s_fsm_d = STATE_WAIT;
// ribp.ready == 1'b1
else if (ahbl.htrans == AHBL_TRANS_NSEQ) begin
s_fsm_d = STATE_DATA;
s_haddr_d = ahbl.haddr;
@@ -127,7 +127,7 @@ module ahbl2rib (
end else s_fsm_d = STATE_IDLE;
end
STATE_WAIT: begin
if (rib.ready) begin
if (ribp.ready) begin
if (ahbl.htrans == AHBL_TRANS_NSEQ) begin
s_fsm_d = STATE_DATA;
s_haddr_d = ahbl.haddr;
@@ -8,7 +8,7 @@
// MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
// See the Mulan PSL v2 for more details.
module axi4l2rib (
module axi4l2ribp (
// verilog_format: off
input logic aclk_i,
input logic aresetn_i,
@@ -29,7 +29,7 @@ module axi4l2rib (
output logic [ 1:0] rresp_o,
output logic rvalid_o,
input logic rready_i,
rib_if.master rib
ribp_if.master ribp
// verilog_format: on
);
@@ -58,7 +58,7 @@ module axi4l2rib (
if (arvalid_i) s_rd_fsm_d = RD_DATA;
end
RD_DATA: begin
if (rib.ready) s_rd_fsm_d = RD_WAIT;
if (ribp.ready) s_rd_fsm_d = RD_WAIT;
end
RD_WAIT: begin
if (rready_i) s_rd_fsm_d = RD_IDLE;
@@ -83,7 +83,7 @@ module axi4l2rib (
if (wvalid_i) s_wr_fsm_d = WR_WAIT;
end
WR_WAIT: begin
if (rib.ready) s_wr_fsm_d = WR_RESP;
if (ribp.ready) s_wr_fsm_d = WR_RESP;
end
WR_RESP: begin
if (bready_i) s_wr_fsm_d = WR_IDLE;
@@ -99,13 +99,13 @@ module axi4l2rib (
);
always_comb begin
rib.addr = s_addr_q;
ribp.addr = s_addr_q;
if (s_rd_fsm_q == RD_IDLE && arvalid_i) begin
rib.addr = araddr_i;
s_addr_d = araddr_i;
ribp.addr = araddr_i;
s_addr_d = araddr_i;
end else if (s_wr_fsm_q == WR_IDLE && awvalid_i) begin
rib.addr = awaddr_i;
s_addr_d = awaddr_i;
ribp.addr = awaddr_i;
s_addr_d = awaddr_i;
end
end
dffer #(32) u_addr_dffer (
@@ -116,11 +116,11 @@ module axi4l2rib (
s_addr_q
);
assign s_rdata_d = rib.rdata;
assign s_rdata_d = ribp.rdata;
dffer #(32) u_rdata_dffer (
aclk_i,
aresetn_i,
s_rd_fsm_q == RD_DATA && rib.ready,
s_rd_fsm_q == RD_DATA && ribp.ready,
s_rdata_d,
s_rdata_q
);
@@ -144,19 +144,19 @@ module axi4l2rib (
);
// axil
assign arready_o = s_rd_fsm_q == RD_IDLE && arvalid_i;
assign rvalid_o = s_rd_fsm_q == RD_WAIT;
assign rresp_o = '0;
assign rdata_o = s_rdata_q;
assign arready_o = s_rd_fsm_q == RD_IDLE && arvalid_i;
assign rvalid_o = s_rd_fsm_q == RD_WAIT;
assign rresp_o = '0;
assign rdata_o = s_rdata_q;
assign awready_o = s_wr_fsm_q == WR_IDLE && awvalid_i;
assign wready_o = s_wr_fsm_q == WR_DATA && wvalid_i;
assign bvalid_o = s_wr_fsm_q == WR_RESP;
assign bresp_o = '0;
assign awready_o = s_wr_fsm_q == WR_IDLE && awvalid_i;
assign wready_o = s_wr_fsm_q == WR_DATA && wvalid_i;
assign bvalid_o = s_wr_fsm_q == WR_RESP;
assign bresp_o = '0;
assign s_rd_req = (s_rd_fsm_q == RD_DATA || s_rd_fsm_q == RD_WAIT);
assign s_wr_req = s_wr_fsm_q == WR_WAIT;
assign rib.valid = s_rd_req || s_wr_req;
assign rib.wdata = s_wdata_q;
assign rib.wstrb = (s_wr_fsm_q == WR_WAIT) ? s_wstrb_q : '0;
assign s_rd_req = (s_rd_fsm_q == RD_DATA || s_rd_fsm_q == RD_WAIT);
assign s_wr_req = s_wr_fsm_q == WR_WAIT;
assign ribp.valid = s_rd_req || s_wr_req;
assign ribp.wdata = s_wdata_q;
assign ribp.wstrb = (s_wr_fsm_q == WR_WAIT) ? s_wstrb_q : '0;
endmodule
@@ -10,11 +10,11 @@
`include "mmap_define.svh"
module rib2apb (
module ribp2apb (
// verilog_format: off
input logic clk_i,
input logic rst_n_i,
rib_if.slave rib,
ribp_if.slave ribp,
output logic resp_err_o,
`include "soc_apb_ports.svh"
// verilog_format: on
@@ -40,7 +40,7 @@ module rib2apb (
edge_det_sync_re #(1) u_mem_valid_edge_det_sync_re (
clk_i,
rst_n_i,
rib.valid,
ribp.valid,
s_mem_valid_re
);
// verilog_format: on
@@ -64,9 +64,9 @@ module rib2apb (
s_fsm_q
);
assign rib.ready = rib.valid && (s_fsm_q == FSM_ENAB) && s_xfer_ready;
assign rib.rdata = {32{rib.ready}} & s_rd_data;
assign resp_err_o = rib.ready && s_xfer_error;
assign ribp.ready = ribp.valid && (s_fsm_q == FSM_ENAB) && s_xfer_ready;
assign ribp.rdata = {32{ribp.ready}} & s_rd_data;
assign resp_err_o = ribp.ready && s_xfer_error;
// Capture slave-select one-hot at FSM_SETP for cleaner response mux.
`include "soc_apb_select_routes.svh"
@@ -8,7 +8,7 @@
// MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
// See the Mulan PSL v2 for more details.
module rib2rib (
module ribp2ribp (
// mstr
input logic mstr_clk_i,
input logic mstr_rst_n_i,
+136
View File
@@ -0,0 +1,136 @@
// Copyright (c) 2023-2026 Yuchi Miao <miaoyuchi@ict.ac.cn>
// retroSoC is licensed under Mulan PSL v2.
// You can use this software according to the terms and conditions of the Mulan PSL v2.
// You may obtain a copy of Mulan PSL v2 at:
// http://license.coscl.org.cn/MulanPSL2
// THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
// EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
// MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
// See the Mulan PSL v2 for more details.
module ribp_regslice (
// verilog_format: off
input logic clk_i,
input logic rst_n_i,
ribp_if.slave ribp_slv,
ribp_if.master ribp_mst
// verilog_format: on
);
localparam FSM_IDLE = 2'd0;
localparam FSM_REQ = 2'd1;
localparam FSM_RESP = 2'd2;
logic [1:0] s_fsm_d, s_fsm_q;
logic s_ribp_mst_valid_d, s_ribp_mst_valid_q;
logic [31:0] s_ribp_mst_addr_d, s_ribp_mst_addr_q;
logic [31:0] s_ribp_mst_wdata_d, s_ribp_mst_wdata_q;
logic [3:0] s_ribp_mst_wstrb_d, s_ribp_mst_wstrb_q;
logic [31:0] s_ribp_mst_rdata_d, s_ribp_mst_rdata_q;
logic s_ribp_mst_ready_d, s_ribp_mst_ready_q;
// ribp mst if
assign ribp_mst.valid = s_ribp_mst_valid_q;
assign ribp_mst.addr = s_ribp_mst_addr_q;
assign ribp_mst.wdata = s_ribp_mst_wdata_q;
assign ribp_mst.wstrb = s_ribp_mst_wstrb_q;
always_comb begin
s_fsm_d = s_fsm_q;
s_ribp_mst_valid_d = s_ribp_mst_valid_q;
s_ribp_mst_addr_d = s_ribp_mst_addr_q;
s_ribp_mst_wdata_d = s_ribp_mst_wdata_q;
s_ribp_mst_wstrb_d = s_ribp_mst_wstrb_q;
s_ribp_mst_ready_d = s_ribp_mst_ready_q;
s_ribp_mst_rdata_d = s_ribp_mst_rdata_q;
ribp_slv.ready = '0;
ribp_slv.rdata = '0;
unique case (s_fsm_q)
FSM_IDLE: begin
if (ribp_slv.valid) begin
s_fsm_d = FSM_REQ;
s_ribp_mst_valid_d = ribp_slv.valid;
s_ribp_mst_addr_d = ribp_slv.addr;
s_ribp_mst_wdata_d = ribp_slv.wdata;
s_ribp_mst_wstrb_d = ribp_slv.wstrb;
end
end
FSM_REQ: begin
if (ribp_mst.ready) begin
s_fsm_d = FSM_RESP;
s_ribp_mst_valid_d = 1'b0;
s_ribp_mst_ready_d = ribp_mst.ready;
s_ribp_mst_rdata_d = ribp_mst.rdata;
end
end
FSM_RESP: begin
s_fsm_d = FSM_IDLE;
ribp_slv.ready = s_ribp_mst_ready_q;
ribp_slv.rdata = s_ribp_mst_rdata_q;
end
default: begin
s_fsm_d = s_fsm_q;
s_ribp_mst_valid_d = s_ribp_mst_valid_q;
s_ribp_mst_addr_d = s_ribp_mst_addr_q;
s_ribp_mst_wdata_d = s_ribp_mst_wdata_q;
s_ribp_mst_wstrb_d = s_ribp_mst_wstrb_q;
s_ribp_mst_ready_d = s_ribp_mst_ready_q;
s_ribp_mst_rdata_d = s_ribp_mst_rdata_q;
ribp_slv.ready = '0;
ribp_slv.rdata = '0;
end
endcase
end
dffr #(2) u_fsm_dffr (
clk_i,
rst_n_i,
s_fsm_d,
s_fsm_q
);
dffr #(1) u_ribp_mstr_valid_dffr (
clk_i,
rst_n_i,
s_ribp_mst_valid_d,
s_ribp_mst_valid_q
);
dffr #(32) u_ribp_mst_addr_dffr (
clk_i,
rst_n_i,
s_ribp_mst_addr_d,
s_ribp_mst_addr_q
);
dffr #(32) u_ribp_mst_wdata_dffr (
clk_i,
rst_n_i,
s_ribp_mst_wdata_d,
s_ribp_mst_wdata_q
);
dffr #(4) u_ribp_mst_wstrb_dffr (
clk_i,
rst_n_i,
s_ribp_mst_wstrb_d,
s_ribp_mst_wstrb_q
);
dffr #(32) u_ribp_mst_rdata_dffr (
clk_i,
rst_n_i,
s_ribp_mst_rdata_d,
s_ribp_mst_rdata_q
);
dffr #(1) u_ribp_mst_ready_dffr (
clk_i,
rst_n_i,
s_ribp_mst_ready_d,
s_ribp_mst_ready_q
);
endmodule
@@ -32,11 +32,11 @@ interface opipsram_if ();
);
endinterface
module rib_opipsram (
module ribp_opipsram (
// verilog_format: off
input logic clk_i,
input logic rst_n_i,
rib_if.slave rib,
ribp_if.slave ribp,
opipsram_if.dut psram
// verilog_format: on
);
@@ -44,9 +44,9 @@ module rib_opipsram (
wire dummy0 = clk_i;
wire dummy1 = rst_n_i;
// rib
assign rib.rdata = '0;
assign rib.ready = '0;
// ribp
assign ribp.rdata = '0;
assign ribp.ready = '0;
// psram
assign psram.sck_o = '0;
assign psram.ce_o = '0;
File renamed without changes.
@@ -36,13 +36,13 @@
// tSP(min: 2ns) is meet
// data keeps 6.94 / 2 = 3.47ns low at least befer sclk
`ifndef RIB_PSRAM_DEF_SV
`define RIB_PSRAM_DEF_SV
`ifndef RIBP_PSRAM_DEF_SV
`define RIBP_PSRAM_DEF_SV
// verilog_format: off
`define RIB_PSRAM_WAIT 8'h00
`define RIB_PSRAM_CHD 8'h04
`define RIB_PSRAM_INIT 8'h08
`define RIBP_PSRAM_WAIT 8'h00
`define RIBP_PSRAM_CHD 8'h04
`define RIBP_PSRAM_INIT 8'h08
// verilog_format: on
`endif
@@ -69,11 +69,11 @@ interface psram_if ();
endinterface
module rib_psram (
module ribp_psram (
// verilog_format: off
input logic clk_i,
input logic rst_n_i,
rib_if.slave rib,
ribp_if.slave ribp,
psram_if.dut psram
// verilog_format: on
);
@@ -113,10 +113,10 @@ module rib_psram (
// verilog_format: off
assign psram.nss_o[0] = (~s_init_done) || (s_init_done && rib.addr[24:23] == 2'd0) ? s_psram_ce : 1'b1;
assign psram.nss_o[1] = (~s_init_done) || (s_init_done && rib.addr[24:23] == 2'd1) ? s_psram_ce : 1'b1;
assign psram.nss_o[2] = (~s_init_done) || (s_init_done && rib.addr[24:23] == 2'd2) ? s_psram_ce : 1'b1;
assign psram.nss_o[3] = (~s_init_done) || (s_init_done && rib.addr[24:23] == 2'd3) ? s_psram_ce : 1'b1;
assign psram.nss_o[0] = (~s_init_done) || (s_init_done && ribp.addr[24:23] == 2'd0) ? s_psram_ce : 1'b1;
assign psram.nss_o[1] = (~s_init_done) || (s_init_done && ribp.addr[24:23] == 2'd1) ? s_psram_ce : 1'b1;
assign psram.nss_o[2] = (~s_init_done) || (s_init_done && ribp.addr[24:23] == 2'd2) ? s_psram_ce : 1'b1;
assign psram.nss_o[3] = (~s_init_done) || (s_init_done && ribp.addr[24:23] == 2'd3) ? s_psram_ce : 1'b1;
assign psram.io_oe_o[0] = ~s_psram_sio_oen;
assign psram.io_oe_o[1] = ~s_psram_sio_oen;
assign psram.io_oe_o[2] = ~s_psram_sio_oen;
@@ -125,48 +125,48 @@ module rib_psram (
// verilog_format: on
assign s_mem_sel = `SOC_ADDR_IS_PSRAM(rib.addr);
assign s_cfg_reg_sel = `SOC_ADDR_IS_RIB_PSRAM(rib.addr);
assign rib.ready = s_mem_sel ? s_mem_ready : 1'b1;
assign s_mem_sel = `SOC_ADDR_IS_PSRAM(ribp.addr);
assign s_cfg_reg_sel = `SOC_ADDR_IS_RIBP_PSRAM(ribp.addr);
assign ribp.ready = s_mem_sel ? s_mem_ready : 1'b1;
always_comb begin
rib.rdata = '0;
ribp.rdata = '0;
if (s_mem_sel) begin
rib.rdata = s_mem_rdata;
end else if (rib.addr[7:0] == `RIB_PSRAM_WAIT) begin
rib.rdata = {27'd0, r_cfg_wait};
end else if (rib.addr[7:0] == `RIB_PSRAM_CHD) begin
rib.rdata = {29'd0, r_cfg_chd};
end else if (rib.addr[7:0] == `RIB_PSRAM_INIT) begin
rib.rdata = {31'd0, r_cfg_init};
ribp.rdata = s_mem_rdata;
end else if (ribp.addr[7:0] == `RIBP_PSRAM_WAIT) begin
ribp.rdata = {27'd0, r_cfg_wait};
end else if (ribp.addr[7:0] == `RIBP_PSRAM_CHD) begin
ribp.rdata = {29'd0, r_cfg_chd};
end else if (ribp.addr[7:0] == `RIBP_PSRAM_INIT) begin
ribp.rdata = {31'd0, r_cfg_init};
end
end
// wait cycles(mmio)
always_ff @(posedge clk_i, negedge rst_n_i) begin
if (~rst_n_i) r_cfg_wait <= 5'd18;
else if (rib.valid && rib.wstrb[0] && s_cfg_reg_sel && rib.addr[7:0] == `RIB_PSRAM_WAIT) begin
r_cfg_wait <= rib.wdata[4:0];
else if (ribp.valid && ribp.wstrb[0] && s_cfg_reg_sel && ribp.addr[7:0] == `RIBP_PSRAM_WAIT) begin
r_cfg_wait <= ribp.wdata[4:0];
end
end
// extra cycle for tCHD(mmio)
always_ff @(posedge clk_i, negedge rst_n_i) begin
if (~rst_n_i) r_cfg_chd <= 3'd4;
else if (rib.valid && rib.wstrb[0] && s_cfg_reg_sel && rib.addr[7:0] == `RIB_PSRAM_CHD) begin
r_cfg_chd <= rib.wdata[2:0];
else if (ribp.valid && ribp.wstrb[0] && s_cfg_reg_sel && ribp.addr[7:0] == `RIBP_PSRAM_CHD) begin
r_cfg_chd <= ribp.wdata[2:0];
end
end
// init device/switch qpi mode
always_ff @(posedge clk_i, negedge rst_n_i) begin
if (~rst_n_i) r_cfg_init <= '0;
else if (rib.valid && rib.wstrb[0] && s_cfg_reg_sel && rib.addr[7:0] == `RIB_PSRAM_INIT) begin
r_cfg_init <= rib.wdata[0];
else if (ribp.valid && ribp.wstrb[0] && s_cfg_reg_sel && ribp.addr[7:0] == `RIBP_PSRAM_INIT) begin
r_cfg_init <= ribp.wdata[0];
end
end
edge_det_sync_re #(1) u_mem_valid_edge_det_sync_re (
clk_i,
rst_n_i,
rib.valid,
ribp.valid,
s_mem_valid_re
);
@@ -183,16 +183,16 @@ module rib_psram (
/* verilator lint_off CASEINCOMPLETE */
case (r_fsm_state)
FSM_IDLE: begin
if (s_mem_valid_re && (|rib.wstrb)) begin
if (s_mem_valid_re && (|ribp.wstrb)) begin
r_fsm_state <= FSM_WE_ST;
r_xfer_data_bit_cnt <= s_disp_xfer_bit_cnt;
r_mem_addr <= {1'b0, rib.addr[22:0]} + {22'd0, s_disp_addr_ofst};
r_mem_addr <= {1'b0, ribp.addr[22:0]} + {22'd0, s_disp_addr_ofst};
r_mem_wdata <= s_disp_wdata;
end else if (s_mem_valid_re && (~(|rib.wstrb))) begin
end else if (s_mem_valid_re && (~(|ribp.wstrb))) begin
r_fsm_state <= FSM_RD_ST;
r_xfer_data_bit_cnt <= 8'd32;
r_mem_addr <= {1'b0, rib.addr[22:0]};
r_mem_wdata <= rib.wdata; // NOTE: no used
r_mem_addr <= {1'b0, ribp.addr[22:0]};
r_mem_wdata <= ribp.wdata; // NOTE: no used
end
end
FSM_WE_ST: begin
@@ -248,8 +248,8 @@ module rib_psram (
);
wr_dispatcher u_wr_dispatcher (
.wstrb_i (rib.wstrb),
.wdata_i (rib.wdata),
.wstrb_i (ribp.wstrb),
.wdata_i (ribp.wdata),
.addr_ofst_o (s_disp_addr_ofst),
.xfer_bit_cnt_o(s_disp_xfer_bit_cnt),
.wdata_o (s_disp_wdata)
File renamed without changes.
@@ -42,11 +42,11 @@ interface sdram_if ();
endinterface
module rib_sdram (
module ribp_sdram (
// verilog_format: off
input logic clk_i,
input logic rst_n_i,
rib_if.slave rib,
ribp_if.slave ribp,
sdram_if.dut sdram
// verilog_format: on
);
@@ -58,34 +58,34 @@ module rib_sdram (
logic s_sec_edge;
// interface
rib_if u_reg_rib_if ();
rib_if u_mem_rib_if ();
ribp_if u_reg_ribp_if ();
ribp_if u_mem_ribp_if ();
// rib mux
assign s_sdram_reg_sel = `SOC_ADDR_IS_RIB_SDRAM(rib.addr);
assign u_reg_rib_if.valid = rib.valid && s_sdram_reg_sel;
assign u_reg_rib_if.addr = rib.addr;
assign u_reg_rib_if.wdata = rib.wdata;
assign u_reg_rib_if.wstrb = rib.wstrb;
// ribp mux
assign s_sdram_reg_sel = `SOC_ADDR_IS_RIBP_SDRAM(ribp.addr);
assign u_reg_ribp_if.valid = ribp.valid && s_sdram_reg_sel;
assign u_reg_ribp_if.addr = ribp.addr;
assign u_reg_ribp_if.wdata = ribp.wdata;
assign u_reg_ribp_if.wstrb = ribp.wstrb;
assign u_mem_rib_if.valid = rib.valid && (~s_sdram_reg_sel);
assign u_mem_rib_if.addr = rib.addr;
assign u_mem_rib_if.wdata = rib.wdata;
assign u_mem_rib_if.wstrb = rib.wstrb;
assign u_mem_ribp_if.valid = ribp.valid && (~s_sdram_reg_sel);
assign u_mem_ribp_if.addr = ribp.addr;
assign u_mem_ribp_if.wdata = ribp.wdata;
assign u_mem_ribp_if.wstrb = ribp.wstrb;
// verilog_format: off
assign rib.ready = (u_reg_rib_if.valid & u_reg_rib_if.ready) |
(u_mem_rib_if.valid & u_mem_rib_if.ready);
assign ribp.ready = (u_reg_ribp_if.valid & u_reg_ribp_if.ready) |
(u_mem_ribp_if.valid & u_mem_ribp_if.ready);
assign rib.rdata = ({32{(u_reg_rib_if.valid & u_reg_rib_if.ready)}} & u_reg_rib_if.rdata) |
({32{(u_mem_rib_if.valid & u_mem_rib_if.ready)}} & u_mem_rib_if.rdata);
assign ribp.rdata = ({32{(u_reg_ribp_if.valid & u_reg_ribp_if.ready)}} & u_reg_ribp_if.rdata) |
({32{(u_mem_ribp_if.valid & u_mem_ribp_if.ready)}} & u_mem_ribp_if.rdata);
// verilog_format: on
sdram_reg u_sdram_reg (
.clk_i (clk_i),
.rst_n_i (rst_n_i),
.rib (u_reg_rib_if),
.ribp (u_reg_ribp_if),
.clkdiv_o(s_sdram_clkdiv)
);
@@ -106,7 +106,7 @@ module rib_sdram (
.fir_edge_i (s_fir_edge),
.sec_edge_i (s_sec_edge),
.sdram_clk_i(s_sdram_clk),
.rib (u_mem_rib_if),
.ribp (u_mem_ribp_if),
.sdram (sdram)
);
File renamed without changes.
@@ -36,7 +36,7 @@ module sdram_core (
input logic sdram_clk_i,
input logic fir_edge_i,
input logic sec_edge_i,
rib_if.slave rib,
ribp_if.slave ribp,
sdram_if.dut sdram
// verilog_format: on
);
@@ -136,14 +136,14 @@ module sdram_core (
logic [12:0] s_addr_d, s_addr_q;
logic s_upd_ready_d, s_upd_ready_q;
// Registered RIB inputs (captured at IDLE→ACT)
logic [24:0] s_rib_addr_d, s_rib_addr_q; // addr[24:0] (relevant bits)
logic [31:0] s_rib_wdata_d, s_rib_wdata_q;
logic [3:0] s_rib_wstrb_d, s_rib_wstrb_q;
logic [24:0] s_ribp_addr_d, s_ribp_addr_q; // addr[24:0] (relevant bits)
logic [31:0] s_ribp_wdata_d, s_ribp_wdata_q;
logic [3:0] s_ribp_wstrb_d, s_ribp_wstrb_q;
// rib
assign rib.ready = s_ready_q;
assign rib.rdata = s_rdata_q;
// ribp
assign ribp.ready = s_ready_q;
assign ribp.rdata = s_rdata_q;
// sdram
assign sdram.clk_o = sdram_clk_i;
assign sdram.cke_o = s_cke_q;
@@ -157,23 +157,23 @@ module sdram_core (
always_comb begin
s_state_d = s_state_q;
s_ret_state_d = s_ret_state_q;
s_wait_cnt_d = s_wait_cnt_q;
s_cmd_d = s_cmd_q;
s_ready_d = s_ready_q;
s_rdata_d = s_rdata_q;
s_state_d = s_state_q;
s_ret_state_d = s_ret_state_q;
s_wait_cnt_d = s_wait_cnt_q;
s_cmd_d = s_cmd_q;
s_ready_d = s_ready_q;
s_rdata_d = s_rdata_q;
// sdram
s_dqm_d = s_dqm_q;
s_dq_d = s_dq_q;
s_ba_d = s_ba_q;
s_oe_d = s_oe_q;
s_cke_d = s_cke_q;
s_addr_d = s_addr_q;
s_upd_ready_d = s_upd_ready_q;
s_rib_addr_d = s_rib_addr_q;
s_rib_wdata_d = s_rib_wdata_q;
s_rib_wstrb_d = s_rib_wstrb_q;
s_dqm_d = s_dqm_q;
s_dq_d = s_dq_q;
s_ba_d = s_ba_q;
s_oe_d = s_oe_q;
s_cke_d = s_cke_q;
s_addr_d = s_addr_q;
s_upd_ready_d = s_upd_ready_q;
s_ribp_addr_d = s_ribp_addr_q;
s_ribp_wdata_d = s_ribp_wdata_q;
s_ribp_wstrb_d = s_ribp_wstrb_q;
case (s_state_q)
RESET: begin
s_cke_d = 1'b0;
@@ -218,18 +218,18 @@ module sdram_core (
s_oe_d = 1'b0;
s_dqm_d = 2'b11;
s_ready_d = 1'b0;
if (rib.valid && !s_ready_q) begin
if (ribp.valid && !s_ready_q) begin
// Capture RIB inputs into holding registers
s_rib_addr_d = rib.addr[24:0];
s_rib_wdata_d = rib.wdata;
s_rib_wstrb_d = rib.wstrb;
s_cmd_d = CMD_ACT;
s_ba_d = rib.addr[22:21];
s_addr_d = {rib.addr[24:23], rib.addr[20:10]};
s_state_d = WAIT_STATE;
s_ret_state_d = |rib.wstrb ? COL_WRITEL : COL_READ;
s_wait_cnt_d = 16'(TRCD);
s_upd_ready_d = 1'b1;
s_ribp_addr_d = ribp.addr[24:0];
s_ribp_wdata_d = ribp.wdata;
s_ribp_wstrb_d = ribp.wstrb;
s_cmd_d = CMD_ACT;
s_ba_d = ribp.addr[22:21];
s_addr_d = {ribp.addr[24:23], ribp.addr[20:10]};
s_state_d = WAIT_STATE;
s_ret_state_d = |ribp.wstrb ? COL_WRITEL : COL_READ;
s_wait_cnt_d = 16'(TRCD);
s_upd_ready_d = 1'b1;
end else begin
// autorefresh
s_cmd_d = CMD_RFSH;
@@ -246,8 +246,8 @@ module sdram_core (
s_cmd_d = CMD_READ;
s_dqm_d = 2'b00;
// autoprecharge and column (use registered addr)
s_ba_d = s_rib_addr_q[22:21];
s_addr_d = {3'b001, s_rib_addr_q[10:2], 1'b0};
s_ba_d = s_ribp_addr_q[22:21];
s_addr_d = {3'b001, s_ribp_addr_q[10:2], 1'b0};
// $display("rd col addr: %0x", s_addr_d);
s_state_d = WAIT_STATE;
s_ret_state_d = COL_READL;
@@ -269,19 +269,19 @@ module sdram_core (
end
COL_WRITEL: begin
s_cmd_d = CMD_WRITE;
s_dqm_d = ~s_rib_wstrb_q[1:0];
s_dqm_d = ~s_ribp_wstrb_q[1:0];
// autoprecharge and column (use registered addr)
s_ba_d = s_rib_addr_q[22:21];
s_addr_d = {3'b001, s_rib_addr_q[10:2], 1'b0};
s_dq_d = s_rib_wdata_q[15:0];
s_ba_d = s_ribp_addr_q[22:21];
s_addr_d = {3'b001, s_ribp_addr_q[10:2], 1'b0};
s_dq_d = s_ribp_wdata_q[15:0];
s_oe_d = 1'b1;
s_state_d = COL_WRITEH;
end
COL_WRITEH: begin
s_cmd_d = CMD_NOP;
s_dqm_d = ~s_rib_wstrb_q[3:2];
s_dqm_d = ~s_ribp_wstrb_q[3:2];
// autoprecharge and column (use registered wdata)
s_dq_d = s_rib_wdata_q[31:16];
s_dq_d = s_ribp_wdata_q[31:16];
s_oe_d = 1'b1;
s_state_d = WAIT_STATE;
s_ret_state_d = IDLE;
@@ -316,44 +316,44 @@ module sdram_core (
always_ff @(posedge clk_i, negedge rst_n_i) begin
if (~rst_n_i) begin
s_state_q <= RESET;
s_ret_state_q <= RESET;
s_wait_cnt_q <= '0;
s_cmd_q <= CMD_NOP;
s_ready_q <= '0;
s_rdata_q <= '0;
s_state_q <= RESET;
s_ret_state_q <= RESET;
s_wait_cnt_q <= '0;
s_cmd_q <= CMD_NOP;
s_ready_q <= '0;
s_rdata_q <= '0;
// sdram
s_dqm_q <= '1;
s_dq_q <= '0;
s_ba_q <= '1;
s_oe_q <= '0;
s_cke_q <= '0;
s_addr_q <= '0;
s_upd_ready_q <= '0;
s_rib_addr_q <= '0;
s_rib_wdata_q <= '0;
s_rib_wstrb_q <= '0;
s_dqm_q <= '1;
s_dq_q <= '0;
s_ba_q <= '1;
s_oe_q <= '0;
s_cke_q <= '0;
s_addr_q <= '0;
s_upd_ready_q <= '0;
s_ribp_addr_q <= '0;
s_ribp_wdata_q <= '0;
s_ribp_wstrb_q <= '0;
end else begin
s_ready_q <= s_ready_d;
if (fir_edge_i) begin
s_rdata_q <= s_rdata_d;
end
if (sec_edge_i) begin
s_state_q <= s_state_d;
s_ret_state_q <= s_ret_state_d;
s_wait_cnt_q <= s_wait_cnt_d;
s_cmd_q <= s_cmd_d;
s_state_q <= s_state_d;
s_ret_state_q <= s_ret_state_d;
s_wait_cnt_q <= s_wait_cnt_d;
s_cmd_q <= s_cmd_d;
// sdram
s_dqm_q <= s_dqm_d;
s_dq_q <= s_dq_d;
s_ba_q <= s_ba_d;
s_oe_q <= s_oe_d;
s_cke_q <= s_cke_d;
s_addr_q <= s_addr_d;
s_upd_ready_q <= s_upd_ready_d;
s_rib_addr_q <= s_rib_addr_d;
s_rib_wdata_q <= s_rib_wdata_d;
s_rib_wstrb_q <= s_rib_wstrb_d;
s_dqm_q <= s_dqm_d;
s_dq_q <= s_dq_d;
s_ba_q <= s_ba_d;
s_oe_q <= s_oe_d;
s_cke_q <= s_cke_d;
s_addr_q <= s_addr_d;
s_upd_ready_q <= s_upd_ready_d;
s_ribp_addr_q <= s_ribp_addr_d;
s_ribp_wdata_q <= s_ribp_wdata_d;
s_ribp_wstrb_q <= s_ribp_wstrb_d;
end
end
end
+84
View File
@@ -0,0 +1,84 @@
// Copyright (c) 2023-2026 Yuchi Miao <miaoyuchi@ict.ac.cn>
// retroSoC is licensed under Mulan PSL v2.
// You can use this software according to the terms and conditions of the Mulan PSL v2.
// You may obtain a copy of Mulan PSL v2 at:
// http://license.coscl.org.cn/MulanPSL2
// THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
// EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
// MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
// See the Mulan PSL v2 for more details.
`ifndef RIBP_SDRAM_DEF_SV
`define RIBP_SDRAM_DEF_SV
// verilog_format: off
`define RIBP_SDRAM_CLKDIV 8'h00
`define RIBP_SDRAM_CFG 8'h04
// verilog_format: on
`endif
module sdram_reg (
// verilog_format: off
input logic clk_i,
input logic rst_n_i,
ribp_if.slave ribp,
output logic [1:0] clkdiv_o
// verilog_format: on
);
// ribp
logic s_ribp_wr_hdshk, s_ribp_rd_hdshk;
logic s_ribp_ready_d, s_ribp_ready_q;
logic s_ribp_rdata_en;
logic [31:0] s_ribp_rdata_d, s_ribp_rdata_q;
// register
logic s_sdram_clkdiv_en;
logic [1:0] s_sdram_clkdiv_d, s_sdram_clkdiv_q;
// ribp
assign s_ribp_wr_hdshk = ribp.valid && (~s_ribp_ready_q) && (|ribp.wstrb);
assign s_ribp_rd_hdshk = ribp.valid && (~s_ribp_ready_q) && (~(|ribp.wstrb));
assign ribp.ready = s_ribp_ready_q;
assign ribp.rdata = s_ribp_rdata_q;
// reg
assign clkdiv_o = s_sdram_clkdiv_q;
assign s_sdram_clkdiv_en = s_ribp_wr_hdshk && ribp.addr[7:0] == `RIBP_SDRAM_CLKDIV;
assign s_sdram_clkdiv_d = ribp.wdata[1:0];
dffer #(2) u_sdram_clkdiv_dffer (
clk_i,
rst_n_i,
s_sdram_clkdiv_en,
s_sdram_clkdiv_d,
s_sdram_clkdiv_q
);
// ribp resp
assign s_ribp_ready_d = ribp.valid && (~s_ribp_ready_q);
dffr #(1) u_ribp_ready_dffr (
clk_i,
rst_n_i,
s_ribp_ready_d,
s_ribp_ready_q
);
assign s_ribp_rdata_en = s_ribp_rd_hdshk;
always_comb begin
s_ribp_rdata_d = s_ribp_rdata_q;
unique case (ribp.addr[7:0])
`RIBP_SDRAM_CLKDIV: s_ribp_rdata_d = {30'd0, s_sdram_clkdiv_q};
default: s_ribp_rdata_d = s_ribp_rdata_q;
endcase
end
dffer #(32) u_ribp_rdata_dffer (
clk_i,
rst_n_i,
s_ribp_rdata_en,
s_ribp_rdata_d,
s_ribp_rdata_q
);
endmodule
@@ -8,12 +8,12 @@
// MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
// See the Mulan PSL v2 for more details.
`ifndef RIB_DVP_DEF_SV
`define RIB_DVP_DEF_SV
`ifndef RIBP_DVP_DEF_SV
`define RIBP_DVP_DEF_SV
`define RIB_DVP_RECVEN 8'h00
`define RIB_DVP_RXDATA 8'h04
`define RIB_DVP_STATUS 8'h08
`define RIBP_DVP_RECVEN 8'h00
`define RIBP_DVP_RXDATA 8'h04
`define RIBP_DVP_STATUS 8'h08
`endif
@@ -26,19 +26,19 @@ interface dvp_if ();
modport dut(input pclk_i, input href_i, input vsync_i, input dat_i);
endinterface
module rib_dvp (
module ribp_dvp (
// verilog_format: off
input logic clk_i,
input logic rst_n_i,
rib_if.slave rib,
ribp_if.slave ribp,
dvp_if.dut dvp
// verilog_format: on
);
// rib
logic s_rib_wr_hdshk, s_rib_rd_hdshk;
logic s_rib_ready_d, s_rib_ready_q;
logic s_rib_rdata_en;
logic [31:0] s_rib_rdata_d, s_rib_rdata_q;
// ribp
logic s_ribp_wr_hdshk, s_ribp_rd_hdshk;
logic s_ribp_ready_d, s_ribp_ready_q;
logic s_ribp_rdata_en;
logic [31:0] s_ribp_rdata_d, s_ribp_rdata_q;
// register
logic s_dvp_recven_en;
logic s_dvp_recven_d, s_dvp_recven_q;
@@ -53,15 +53,15 @@ module rib_dvp (
logic [31:0] s_rx_push_data, s_rx_pop_data;
logic [7:0] s_rx_elem_num;
// rib
assign s_rib_wr_hdshk = rib.valid && (~s_rib_ready_q) && rib.wstrb[0];
assign s_rib_rd_hdshk = rib.valid && (~s_rib_ready_q) && (~(|rib.wstrb));
assign rib.ready = s_rib_ready_q;
assign rib.rdata = s_rib_rdata_q;
// ribp
assign s_ribp_wr_hdshk = ribp.valid && (~s_ribp_ready_q) && ribp.wstrb[0];
assign s_ribp_rd_hdshk = ribp.valid && (~s_ribp_ready_q) && (~(|ribp.wstrb));
assign ribp.ready = s_ribp_ready_q;
assign ribp.rdata = s_ribp_rdata_q;
assign s_dvp_recven_en = s_rib_wr_hdshk && rib.addr[7:0] == `RIB_DVP_RECVEN;
assign s_dvp_recven_d = rib.wdata[0];
assign s_dvp_recven_en = s_ribp_wr_hdshk && ribp.addr[7:0] == `RIBP_DVP_RECVEN;
assign s_dvp_recven_d = ribp.wdata[0];
dffer #(1) u_dvp_recven_dffer (
clk_i,
rst_n_i,
@@ -78,37 +78,37 @@ module rib_dvp (
s_dvp_status_q
);
assign s_rib_ready_d = rib.valid && (~s_rib_ready_q);
dffr #(1) u_rib_ready_dffr (
assign s_ribp_ready_d = ribp.valid && (~s_ribp_ready_q);
dffr #(1) u_ribp_ready_dffr (
clk_i,
rst_n_i,
s_rib_ready_d,
s_rib_ready_q
s_ribp_ready_d,
s_ribp_ready_q
);
assign s_rib_rdata_en = s_rib_rd_hdshk;
assign s_ribp_rdata_en = s_ribp_rd_hdshk;
always_comb begin
s_rx_pop_valid = '0;
s_rib_rdata_d = s_rib_rdata_q;
unique case (rib.addr[7:0])
`RIB_DVP_RECVEN: s_rib_rdata_d = {31'd0, s_dvp_recven_q};
`RIB_DVP_RXDATA: begin
if (s_rib_rd_hdshk) begin
s_ribp_rdata_d = s_ribp_rdata_q;
unique case (ribp.addr[7:0])
`RIBP_DVP_RECVEN: s_ribp_rdata_d = {31'd0, s_dvp_recven_q};
`RIBP_DVP_RXDATA: begin
if (s_ribp_rd_hdshk) begin
s_rx_pop_valid = 1'b1;
if (!s_rx_empty) s_rib_rdata_d = s_rx_pop_data;
else s_rib_rdata_d = '0;
if (!s_rx_empty) s_ribp_rdata_d = s_rx_pop_data;
else s_ribp_rdata_d = '0;
end
end
`RIB_DVP_STATUS: s_rib_rdata_d = {31'd0, s_dvp_status_q};
default: s_rib_rdata_d = s_rib_rdata_q;
`RIBP_DVP_STATUS: s_ribp_rdata_d = {31'd0, s_dvp_status_q};
default: s_ribp_rdata_d = s_ribp_rdata_q;
endcase
end
dffer #(32) u_rib_rdata_dffer (
dffer #(32) u_ribp_rdata_dffer (
clk_i,
rst_n_i,
s_rib_rdata_en,
s_rib_rdata_d,
s_rib_rdata_q
s_ribp_rdata_en,
s_ribp_rdata_d,
s_ribp_rdata_q
);
File renamed without changes.
+180
View File
@@ -0,0 +1,180 @@
// Copyright (c) 2023-2026 Yuchi Miao <miaoyuchi@ict.ac.cn>
// retroSoC is licensed under Mulan PSL v2.
// You can use this software according to the terms and conditions of the Mulan PSL v2.
// You may obtain a copy of Mulan PSL v2 at:
// http://license.coscl.org.cn/MulanPSL2
// THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
// EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
// MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
// See the Mulan PSL v2 for more details.
`ifndef CLINT_DEF_SV
`define CLINT_DEF_SV
// verilog_format: off
`define RIBP_CLINT_MTIMEL 8'h00
`define RIBP_CLINT_MTIMEH 8'h04
`define RIBP_CLINT_MTIMECMPL 8'h08
`define RIBP_CLINT_MTIMECMPH 8'h0C
`define RIBP_CLINT_MSIP 8'h10
`define RIBP_CLINT_CLKDIV 8'h14
// verilog_format: on
`endif
interface simp_clint_if ();
logic tmr_irq_o;
logic sfr_irq_o;
modport dut(output tmr_irq_o, output sfr_irq_o);
endinterface
module ribp_clint (
// verilog_format: off
input logic clk_i,
input logic rst_n_i,
ribp_if.slave ribp,
simp_clint_if.dut clint
// verilog_format: on
);
logic s_ribp_wr_hdshk, s_ribp_rd_hdshk;
logic s_ribp_ready_d, s_ribp_ready_q;
logic s_ribp_rdata_en;
logic [31:0] s_ribp_rdata_d, s_ribp_rdata_q;
logic s_clint_clkdiv_en;
logic [7:0] s_clint_clkdiv_d, s_clint_clkdiv_q;
logic s_clint_mtime_en;
logic [63:0] s_clint_mtime_d, s_clint_mtime_q;
logic s_clint_mtimecmp_en;
logic [63:0] s_clint_mtimecmp_d, s_clint_mtimecmp_q;
logic s_clint_msip_en;
logic s_clint_msip_d, s_clint_msip_q;
// utils
logic [7:0] s_clk_cnt_d, s_clk_cnt_q;
// pipelined 64-bit compare: split into hi32 and lo32 stages
logic s_tmr_hi_gt, s_tmr_hi_eq, s_tmr_lo_ge;
logic s_tmr_irq_d, s_tmr_irq_q;
assign s_ribp_wr_hdshk = ribp.valid && (~s_ribp_ready_q) && (|ribp.wstrb);
assign s_ribp_rd_hdshk = ribp.valid && (~s_ribp_ready_q) && (~(|ribp.wstrb));
assign ribp.ready = s_ribp_ready_q;
assign ribp.rdata = s_ribp_rdata_q;
// pipelined 64-bit magnitude compare (registered output)
assign s_tmr_hi_gt = s_clint_mtime_q[63:32] > s_clint_mtimecmp_q[63:32];
assign s_tmr_hi_eq = s_clint_mtime_q[63:32] == s_clint_mtimecmp_q[63:32];
assign s_tmr_lo_ge = s_clint_mtime_q[31:0] >= s_clint_mtimecmp_q[31:0];
assign s_tmr_irq_d = s_tmr_hi_gt || (s_tmr_hi_eq && s_tmr_lo_ge);
dffr #(1) u_tmr_irq_dffr (
clk_i,
rst_n_i,
s_tmr_irq_d,
s_tmr_irq_q
);
assign clint.tmr_irq_o = s_tmr_irq_q;
assign clint.sfr_irq_o = s_clint_msip_q;
assign s_clint_clkdiv_en = s_ribp_wr_hdshk && ribp.addr[7:0] == `RIBP_CLINT_CLKDIV;
assign s_clint_clkdiv_d = ribp.wdata[7:0];
dffer #(8) u_clint_clkdiv_dffer (
clk_i,
rst_n_i,
s_clint_clkdiv_en,
s_clint_clkdiv_d,
s_clint_clkdiv_q
);
always_comb begin
s_clk_cnt_d = s_clk_cnt_q;
if (s_clk_cnt_q == s_clint_clkdiv_q) begin
s_clk_cnt_d = '0;
end else begin
s_clk_cnt_d = s_clk_cnt_q + 1'b1;
end
end
dffr #(8) u_clk_cnt_dffr (
clk_i,
rst_n_i,
s_clk_cnt_d,
s_clk_cnt_q
);
assign s_clint_mtime_en = s_clk_cnt_q == s_clint_clkdiv_q;
assign s_clint_mtime_d = s_clint_mtime_q + 1'b1;
dffer #(64) u_clint_mtime_dffer (
clk_i,
rst_n_i,
s_clint_mtime_en,
s_clint_mtime_d,
s_clint_mtime_q
);
assign s_clint_mtimecmp_en = s_ribp_wr_hdshk && (ribp.addr[7:0] == `RIBP_CLINT_MTIMECMPL || ribp.addr[7:0] == `RIBP_CLINT_MTIMECMPH);
always_comb begin
s_clint_mtimecmp_d = s_clint_mtimecmp_q;
if (ribp.addr[7:0] == `RIBP_CLINT_MTIMECMPL) begin
if (ribp.wstrb[0]) s_clint_mtimecmp_d[7:0] = ribp.wdata[7:0];
if (ribp.wstrb[1]) s_clint_mtimecmp_d[15:8] = ribp.wdata[15:8];
if (ribp.wstrb[2]) s_clint_mtimecmp_d[23:16] = ribp.wdata[23:16];
if (ribp.wstrb[3]) s_clint_mtimecmp_d[31:24] = ribp.wdata[31:24];
end else if (ribp.addr[7:0] == `RIBP_CLINT_MTIMECMPH) begin
if (ribp.wstrb[0]) s_clint_mtimecmp_d[39:32] = ribp.wdata[7:0];
if (ribp.wstrb[1]) s_clint_mtimecmp_d[47:40] = ribp.wdata[15:8];
if (ribp.wstrb[2]) s_clint_mtimecmp_d[55:48] = ribp.wdata[23:16];
if (ribp.wstrb[3]) s_clint_mtimecmp_d[63:56] = ribp.wdata[31:24];
end
end
dfferh #(64) u_clint_mtimecmp_dfferh (
clk_i,
rst_n_i,
s_clint_mtimecmp_en,
s_clint_mtimecmp_d,
s_clint_mtimecmp_q
);
assign s_clint_msip_en = s_ribp_wr_hdshk && ribp.addr[7:0] == `RIBP_CLINT_MSIP;
assign s_clint_msip_d = ribp.wdata[0];
dffer #(1) u_clint_msip_dffer (
clk_i,
rst_n_i,
s_clint_msip_en,
s_clint_msip_d,
s_clint_msip_q
);
assign s_ribp_ready_d = ribp.valid && (~s_ribp_ready_q);
dffr #(1) u_ribp_ready_dffr (
clk_i,
rst_n_i,
s_ribp_ready_d,
s_ribp_ready_q
);
assign s_ribp_rdata_en = s_ribp_rd_hdshk;
always_comb begin
s_ribp_rdata_d = s_ribp_rdata_q;
unique case (ribp.addr[7:0])
`RIBP_CLINT_CLKDIV: s_ribp_rdata_d = {24'd0, s_clint_clkdiv_q};
`RIBP_CLINT_MTIMEL: s_ribp_rdata_d = s_clint_mtime_q[31:0];
`RIBP_CLINT_MTIMEH: s_ribp_rdata_d = s_clint_mtime_q[63:32];
`RIBP_CLINT_MTIMECMPL: s_ribp_rdata_d = s_clint_mtimecmp_q[31:0];
`RIBP_CLINT_MTIMECMPH: s_ribp_rdata_d = s_clint_mtimecmp_q[63:32];
`RIBP_CLINT_MSIP: s_ribp_rdata_d = {31'd0, s_clint_msip_q};
default: s_ribp_rdata_d = s_ribp_rdata_q;
endcase
end
dffer #(32) u_ribp_rdata_dffer (
clk_i,
rst_n_i,
s_ribp_rdata_en,
s_ribp_rdata_d,
s_ribp_rdata_q
);
endmodule
@@ -8,23 +8,23 @@
// MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
// See the Mulan PSL v2 for more details.
`ifndef RIB_DMA_DEF_SV
`define RIB_DMA_DEF_SV
`ifndef RIBP_DMA_DEF_SV
`define RIBP_DMA_DEF_SV
// verilog_format: off
`define RIB_DMA_MODE 8'h00
`define RIB_DMA_SRCADDR 8'h04
`define RIB_DMA_SRCINCR 8'h08
`define RIB_DMA_DSTADDR 8'h0C
`define RIB_DMA_DSTINCR 8'h10
`define RIB_DMA_XFERLEN 8'h14
`define RIB_DMA_START 8'h18
`define RIB_DMA_STOP 8'h1C
`define RIB_DMA_RESET 8'h20
`define RIB_DMA_STATUS 8'h24
`define RIB_DMA_FSM 8'h28
`define RIB_DMA_ERROR_STATUS 8'h2C
`define RIB_DMA_ERROR_ADDR 8'h30
`define RIBP_DMA_MODE 8'h00
`define RIBP_DMA_SRCADDR 8'h04
`define RIBP_DMA_SRCINCR 8'h08
`define RIBP_DMA_DSTADDR 8'h0C
`define RIBP_DMA_DSTINCR 8'h10
`define RIBP_DMA_XFERLEN 8'h14
`define RIBP_DMA_START 8'h18
`define RIBP_DMA_STOP 8'h1C
`define RIBP_DMA_RESET 8'h20
`define RIBP_DMA_STATUS 8'h24
`define RIBP_DMA_FSM 8'h28
`define RIBP_DMA_ERROR_STATUS 8'h2C
`define RIBP_DMA_ERROR_ADDR 8'h30
// verilog_format: on
interface dma_hw_trg_if ();
@@ -38,21 +38,21 @@ endinterface
`endif
module rib_dma (
module ribp_dma (
// verilog_format: off
input logic clk_i,
input logic rst_n_i,
output logic dma_xfer_done_o,
dma_hw_trg_if.dut hw_trg,
rib_if.slave rib,
soc_rib_burst_if.master rib_dma
ribp_if.slave ribp,
soc_rib_if.master rib
// verilog_format: on
);
logic s_rib_wr_hdshk, s_rib_rd_hdshk;
logic s_rib_ready_d, s_rib_ready_q;
logic s_rib_rdata_en;
logic [31:0] s_rib_rdata_d, s_rib_rdata_q;
logic s_ribp_wr_hdshk, s_ribp_rd_hdshk;
logic s_ribp_ready_d, s_ribp_ready_q;
logic s_ribp_rdata_en;
logic [31:0] s_ribp_rdata_d, s_ribp_rdata_q;
logic s_dma_mode_en;
logic [2:0] s_dma_mode_d, s_dma_mode_q;
@@ -78,16 +78,16 @@ module rib_dma (
logic [31:0] s_xfer_error_addr;
assign s_rib_wr_hdshk = rib.valid && (~s_rib_ready_q) && (|rib.wstrb);
assign s_rib_rd_hdshk = rib.valid && (~s_rib_ready_q) && (~(|rib.wstrb));
assign rib.ready = s_rib_ready_q;
assign rib.rdata = s_rib_rdata_q;
assign s_ribp_wr_hdshk = ribp.valid && (~s_ribp_ready_q) && (|ribp.wstrb);
assign s_ribp_rd_hdshk = ribp.valid && (~s_ribp_ready_q) && (~(|ribp.wstrb));
assign ribp.ready = s_ribp_ready_q;
assign ribp.rdata = s_ribp_rdata_q;
assign dma_xfer_done_o = s_dma_status_q;
assign s_dma_mode_en = s_rib_wr_hdshk && rib.addr[7:0] == `RIB_DMA_MODE;
assign s_dma_mode_d = rib.wdata[2:0];
assign s_dma_mode_en = s_ribp_wr_hdshk && ribp.addr[7:0] == `RIBP_DMA_MODE;
assign s_dma_mode_d = ribp.wdata[2:0];
dffer #(3) u_dma_mode_dffer (
clk_i,
rst_n_i,
@@ -97,13 +97,13 @@ module rib_dma (
);
assign s_dma_srcaddr_en = s_rib_wr_hdshk && rib.addr[7:0] == `RIB_DMA_SRCADDR;
assign s_dma_srcaddr_en = s_ribp_wr_hdshk && ribp.addr[7:0] == `RIBP_DMA_SRCADDR;
always_comb begin
s_dma_srcaddr_d = s_dma_srcaddr_q;
if (rib.wstrb[0]) s_dma_srcaddr_d[7:0] = rib.wdata[7:0];
if (rib.wstrb[1]) s_dma_srcaddr_d[15:8] = rib.wdata[15:8];
if (rib.wstrb[2]) s_dma_srcaddr_d[23:16] = rib.wdata[23:16];
if (rib.wstrb[3]) s_dma_srcaddr_d[31:24] = rib.wdata[31:24];
if (ribp.wstrb[0]) s_dma_srcaddr_d[7:0] = ribp.wdata[7:0];
if (ribp.wstrb[1]) s_dma_srcaddr_d[15:8] = ribp.wdata[15:8];
if (ribp.wstrb[2]) s_dma_srcaddr_d[23:16] = ribp.wdata[23:16];
if (ribp.wstrb[3]) s_dma_srcaddr_d[31:24] = ribp.wdata[31:24];
end
dffer #(32) u_dma_srcaddr_dffer (
clk_i,
@@ -114,8 +114,8 @@ module rib_dma (
);
assign s_dma_srcincr_en = s_rib_wr_hdshk && rib.addr[7:0] == `RIB_DMA_SRCINCR;
assign s_dma_srcincr_d = rib.wdata[0];
assign s_dma_srcincr_en = s_ribp_wr_hdshk && ribp.addr[7:0] == `RIBP_DMA_SRCINCR;
assign s_dma_srcincr_d = ribp.wdata[0];
dffer #(1) u_dma_srcincr_dffer (
clk_i,
rst_n_i,
@@ -125,13 +125,13 @@ module rib_dma (
);
assign s_dma_dstaddr_en = s_rib_wr_hdshk && rib.addr[7:0] == `RIB_DMA_DSTADDR;
assign s_dma_dstaddr_en = s_ribp_wr_hdshk && ribp.addr[7:0] == `RIBP_DMA_DSTADDR;
always_comb begin
s_dma_dstaddr_d = s_dma_dstaddr_q;
if (rib.wstrb[0]) s_dma_dstaddr_d[7:0] = rib.wdata[7:0];
if (rib.wstrb[1]) s_dma_dstaddr_d[15:8] = rib.wdata[15:8];
if (rib.wstrb[2]) s_dma_dstaddr_d[23:16] = rib.wdata[23:16];
if (rib.wstrb[3]) s_dma_dstaddr_d[31:24] = rib.wdata[31:24];
if (ribp.wstrb[0]) s_dma_dstaddr_d[7:0] = ribp.wdata[7:0];
if (ribp.wstrb[1]) s_dma_dstaddr_d[15:8] = ribp.wdata[15:8];
if (ribp.wstrb[2]) s_dma_dstaddr_d[23:16] = ribp.wdata[23:16];
if (ribp.wstrb[3]) s_dma_dstaddr_d[31:24] = ribp.wdata[31:24];
end
dffer #(32) u_dma_dstaddr_dffer (
clk_i,
@@ -141,8 +141,8 @@ module rib_dma (
s_dma_dstaddr_q
);
assign s_dma_dstincr_en = s_rib_wr_hdshk && rib.addr[7:0] == `RIB_DMA_DSTINCR;
assign s_dma_dstincr_d = rib.wdata[0];
assign s_dma_dstincr_en = s_ribp_wr_hdshk && ribp.addr[7:0] == `RIBP_DMA_DSTINCR;
assign s_dma_dstincr_d = ribp.wdata[0];
dffer #(1) u_dma_dstincr_dffer (
clk_i,
rst_n_i,
@@ -151,13 +151,13 @@ module rib_dma (
s_dma_dstincr_q
);
assign s_dma_xferlen_en = s_rib_wr_hdshk && rib.addr[7:0] == `RIB_DMA_XFERLEN;
assign s_dma_xferlen_en = s_ribp_wr_hdshk && ribp.addr[7:0] == `RIBP_DMA_XFERLEN;
always_comb begin
s_dma_xferlen_d = s_dma_xferlen_q;
if (rib.wstrb[0]) s_dma_xferlen_d[7:0] = rib.wdata[7:0];
if (rib.wstrb[1]) s_dma_xferlen_d[15:8] = rib.wdata[15:8];
if (rib.wstrb[2]) s_dma_xferlen_d[23:16] = rib.wdata[23:16];
if (rib.wstrb[3]) s_dma_xferlen_d[31:24] = rib.wdata[31:24];
if (ribp.wstrb[0]) s_dma_xferlen_d[7:0] = ribp.wdata[7:0];
if (ribp.wstrb[1]) s_dma_xferlen_d[15:8] = ribp.wdata[15:8];
if (ribp.wstrb[2]) s_dma_xferlen_d[23:16] = ribp.wdata[23:16];
if (ribp.wstrb[3]) s_dma_xferlen_d[31:24] = ribp.wdata[31:24];
end
dffer #(32) u_dma_xferlen_dffer (
clk_i,
@@ -168,14 +168,14 @@ module rib_dma (
);
assign s_xfer_start = s_rib_wr_hdshk && rib.addr[7:0] == `RIB_DMA_START;
assign s_xfer_stop = s_rib_wr_hdshk && rib.addr[7:0] == `RIB_DMA_STOP;
assign s_xfer_reset = s_rib_wr_hdshk && rib.addr[7:0] == `RIB_DMA_RESET;
assign s_xfer_start = s_ribp_wr_hdshk && ribp.addr[7:0] == `RIBP_DMA_START;
assign s_xfer_stop = s_ribp_wr_hdshk && ribp.addr[7:0] == `RIBP_DMA_STOP;
assign s_xfer_reset = s_ribp_wr_hdshk && ribp.addr[7:0] == `RIBP_DMA_RESET;
always_comb begin
s_dma_status_d = s_dma_status_q;
if (s_rib_rd_hdshk && rib.addr[7:0] == `RIB_DMA_STATUS) begin
if (s_ribp_rd_hdshk && ribp.addr[7:0] == `RIBP_DMA_STATUS) begin
s_dma_status_d = '0;
end else if (s_xfer_done) begin
s_dma_status_d = 1'b1;
@@ -190,8 +190,8 @@ module rib_dma (
always_comb begin
s_dma_error_status_d = s_dma_error_status_q;
if (s_rib_wr_hdshk && rib.addr[7:0] == `RIB_DMA_ERROR_STATUS && rib.wstrb[0] &&
rib.wdata[0]) begin
if (s_ribp_wr_hdshk && ribp.addr[7:0] == `RIBP_DMA_ERROR_STATUS && ribp.wstrb[0] &&
ribp.wdata[0]) begin
s_dma_error_status_d = 1'b0;
end else if (s_xfer_error) begin
s_dma_error_status_d = 1'b1;
@@ -221,37 +221,37 @@ module rib_dma (
);
assign s_rib_ready_d = rib.valid && (~s_rib_ready_q);
dffr #(1) u_rib_ready_dffr (
assign s_ribp_ready_d = ribp.valid && (~s_ribp_ready_q);
dffr #(1) u_ribp_ready_dffr (
clk_i,
rst_n_i,
s_rib_ready_d,
s_rib_ready_q
s_ribp_ready_d,
s_ribp_ready_q
);
assign s_rib_rdata_en = s_rib_rd_hdshk;
assign s_ribp_rdata_en = s_ribp_rd_hdshk;
always_comb begin
s_rib_rdata_d = s_rib_rdata_q;
unique case (rib.addr[7:0])
`RIB_DMA_MODE: s_rib_rdata_d = {29'd0, s_dma_mode_q};
`RIB_DMA_SRCADDR: s_rib_rdata_d = s_dma_srcaddr_q;
`RIB_DMA_SRCINCR: s_rib_rdata_d = {31'd0, s_dma_srcincr_q};
`RIB_DMA_DSTADDR: s_rib_rdata_d = s_dma_dstaddr_q;
`RIB_DMA_DSTINCR: s_rib_rdata_d = {31'd0, s_dma_dstincr_q};
`RIB_DMA_XFERLEN: s_rib_rdata_d = s_dma_xferlen_q;
`RIB_DMA_STATUS: s_rib_rdata_d = {31'd0, s_dma_status_q};
`RIB_DMA_FSM: s_rib_rdata_d = {30'd0, s_xfer_fsm};
`RIB_DMA_ERROR_STATUS: s_rib_rdata_d = {28'd0, s_dma_error_code_q, s_dma_error_status_q};
`RIB_DMA_ERROR_ADDR: s_rib_rdata_d = s_dma_error_addr_q;
default: s_rib_rdata_d = s_rib_rdata_q;
s_ribp_rdata_d = s_ribp_rdata_q;
unique case (ribp.addr[7:0])
`RIBP_DMA_MODE: s_ribp_rdata_d = {29'd0, s_dma_mode_q};
`RIBP_DMA_SRCADDR: s_ribp_rdata_d = s_dma_srcaddr_q;
`RIBP_DMA_SRCINCR: s_ribp_rdata_d = {31'd0, s_dma_srcincr_q};
`RIBP_DMA_DSTADDR: s_ribp_rdata_d = s_dma_dstaddr_q;
`RIBP_DMA_DSTINCR: s_ribp_rdata_d = {31'd0, s_dma_dstincr_q};
`RIBP_DMA_XFERLEN: s_ribp_rdata_d = s_dma_xferlen_q;
`RIBP_DMA_STATUS: s_ribp_rdata_d = {31'd0, s_dma_status_q};
`RIBP_DMA_FSM: s_ribp_rdata_d = {30'd0, s_xfer_fsm};
`RIBP_DMA_ERROR_STATUS: s_ribp_rdata_d = {28'd0, s_dma_error_code_q, s_dma_error_status_q};
`RIBP_DMA_ERROR_ADDR: s_ribp_rdata_d = s_dma_error_addr_q;
default: s_ribp_rdata_d = s_ribp_rdata_q;
endcase
end
dffer #(32) u_rib_rdata_dffer (
dffer #(32) u_ribp_rdata_dffer (
clk_i,
rst_n_i,
s_rib_rdata_en,
s_rib_rdata_d,
s_rib_rdata_q
s_ribp_rdata_en,
s_ribp_rdata_d,
s_ribp_rdata_q
);
@@ -273,7 +273,7 @@ module rib_dma (
.error_addr_o(s_xfer_error_addr),
.fsm_o (s_xfer_fsm),
.hw_trg (hw_trg),
.rib (rib_dma)
.rib (rib)
);
endmodule
@@ -30,7 +30,7 @@ module dma_core (
output logic [31:0] error_addr_o,
output logic [1:0] fsm_o,
dma_hw_trg_if.dut hw_trg,
soc_rib_burst_if.master rib
soc_rib_if.master rib
// verilog_format: on
);
@@ -78,7 +78,7 @@ module dma_core (
`SOC_ADDR_SUPPORTS_INCR4(s_dst_addr_q) &&
`SOC_ADDR_SUPPORTS_INCR4(s_dst_addr_q + 32'd12);
// verilog_format: on
assign s_chunk_len = s_use_burst ? `SOC_RIB_BURST_INCR4 : `SOC_RIB_BURST_INCR1;
assign s_chunk_len = s_use_burst ? `SOC_RIB_LEN_INCR4 : `SOC_RIB_LEN_INCR1;
assign s_chunk_words = s_use_burst ? 32'd4 : 32'd1;
always_comb begin
@@ -32,7 +32,7 @@
`include "gpio_define.svh"
interface gpio_if #(
parameter int DATA_WIDTH = `RIB_GPIO_NUM
parameter int DATA_WIDTH = `RIBP_GPIO_NUM
) ();
logic [DATA_WIDTH-1:0] oe_o;
logic [DATA_WIDTH-1:0] cs_o;
@@ -66,7 +66,7 @@ interface gpio_if #(
endinterface
interface user_gpio_if #(
parameter int DATA_WIDTH = `RIB_GPIO_NUM
parameter int DATA_WIDTH = `RIBP_GPIO_NUM
) ();
logic [DATA_WIDTH-1:0] do_o;
logic [DATA_WIDTH-1:0] oe_o;
@@ -76,80 +76,80 @@ interface user_gpio_if #(
modport padctrl(input do_o, input oe_o, output di_i);
endinterface
module rib_gpio (
module ribp_gpio (
// verilog_format: off
input logic clk_i,
input logic rst_n_i,
rib_if.slave rib,
ribp_if.slave ribp,
gpio_if.dut gpio,
user_gpio_if.padctrl user_gpio
// verilog_format: on
);
// rib
logic s_rib_wr_hdshk, s_rib_rd_hdshk;
logic s_rib_ready_d, s_rib_ready_q;
logic s_rib_rdata_en;
logic [31:0] s_rib_rdata_d, s_rib_rdata_q;
// ribp
logic s_ribp_wr_hdshk, s_ribp_rd_hdshk;
logic s_ribp_ready_d, s_ribp_ready_q;
logic s_ribp_rdata_en;
logic [31:0] s_ribp_rdata_d, s_ribp_rdata_q;
// reg
logic s_gpio_oe_en;
logic [`RIB_GPIO_NUM-1:0] s_gpio_oe_d, s_gpio_oe_q;
logic [`RIBP_GPIO_NUM-1:0] s_gpio_oe_d, s_gpio_oe_q;
logic s_gpio_cs_en;
logic [`RIB_GPIO_NUM-1:0] s_gpio_cs_d, s_gpio_cs_q;
logic [`RIBP_GPIO_NUM-1:0] s_gpio_cs_d, s_gpio_cs_q;
logic s_gpio_pu_en;
logic [`RIB_GPIO_NUM-1:0] s_gpio_pu_d, s_gpio_pu_q;
logic [`RIBP_GPIO_NUM-1:0] s_gpio_pu_d, s_gpio_pu_q;
logic s_gpio_pd_en;
logic [`RIB_GPIO_NUM-1:0] s_gpio_pd_d, s_gpio_pd_q;
logic [`RIBP_GPIO_NUM-1:0] s_gpio_pd_d, s_gpio_pd_q;
logic s_gpio_do_en;
logic [`RIB_GPIO_NUM-1:0] s_gpio_do_d, s_gpio_do_q;
logic [`RIB_GPIO_NUM-1:0] s_gpio_di;
logic s_gpio_ien_en;
logic [`RIB_GPIO_NUM-1:0] s_gpio_ien_d, s_gpio_ien_q;
logic [`RIBP_GPIO_NUM-1:0] s_gpio_do_d, s_gpio_do_q;
logic [`RIBP_GPIO_NUM-1:0] s_gpio_di;
logic s_gpio_ien_en;
logic [`RIBP_GPIO_NUM-1:0] s_gpio_ien_d, s_gpio_ien_q;
logic s_gpio_itype0_en;
logic [`RIB_GPIO_NUM-1:0] s_gpio_itype0_d, s_gpio_itype0_q;
logic [`RIBP_GPIO_NUM-1:0] s_gpio_itype0_d, s_gpio_itype0_q;
logic s_gpio_itype1_en;
logic [`RIB_GPIO_NUM-1:0] s_gpio_itype1_d, s_gpio_itype1_q;
logic [`RIBP_GPIO_NUM-1:0] s_gpio_itype1_d, s_gpio_itype1_q;
logic s_gpio_istat_en;
logic [`RIB_GPIO_NUM-1:0] s_gpio_istat_d, s_gpio_istat_q;
logic [`RIBP_GPIO_NUM-1:0] s_gpio_istat_d, s_gpio_istat_q;
logic s_gpio_iofcfg_en;
logic [`RIB_GPIO_NUM-1:0] s_gpio_iofcfg_d, s_gpio_iofcfg_q;
logic [`RIBP_GPIO_NUM-1:0] s_gpio_iofcfg_d, s_gpio_iofcfg_q;
logic s_gpio_pinmux_en;
logic [`RIB_GPIO_NUM-1:0] s_gpio_pinmux_d, s_gpio_pinmux_q;
logic [`RIBP_GPIO_NUM-1:0] s_gpio_pinmux_d, s_gpio_pinmux_q;
logic s_gpio_user_sel_en;
logic [`RIB_GPIO_NUM-1:0] s_gpio_user_sel_d, s_gpio_user_sel_q;
logic [`RIBP_GPIO_NUM-1:0] s_gpio_user_sel_d, s_gpio_user_sel_q;
logic s_gpio_user_lock_en;
logic [`RIB_GPIO_NUM-1:0] s_gpio_user_lock_d, s_gpio_user_lock_q;
logic [`RIB_GPIO_NUM-1:0] s_gpio_user_handoff_d, s_gpio_user_handoff_q;
logic [`RIB_GPIO_NUM-1:0] s_gpio_user_status;
logic [`RIBP_GPIO_NUM-1:0] s_gpio_user_lock_d, s_gpio_user_lock_q;
logic [`RIBP_GPIO_NUM-1:0] s_gpio_user_handoff_d, s_gpio_user_handoff_q;
logic [`RIBP_GPIO_NUM-1:0] s_gpio_user_status;
// irq
logic [`RIB_GPIO_NUM-1:0] s_gpio_di_re, s_gpio_di_fe, s_gpio_irq;
logic [`RIB_GPIO_NUM-1:0] s_irq_rise, s_irq_fall;
logic [`RIB_GPIO_NUM-1:0] s_irq_lev0, s_irq_lev1;
logic [`RIB_GPIO_NUM-1:0] s_irq_masked;
logic [`RIBP_GPIO_NUM-1:0] s_gpio_di_re, s_gpio_di_fe, s_gpio_irq;
logic [`RIBP_GPIO_NUM-1:0] s_irq_rise, s_irq_fall;
logic [`RIBP_GPIO_NUM-1:0] s_irq_lev0, s_irq_lev1;
logic [`RIBP_GPIO_NUM-1:0] s_irq_masked;
logic s_irq_trg, s_irq_stat;
// alt
logic [`RIB_GPIO_NUM-1:0] s_gpio_alt_out, s_gpio_alt_oe;
logic [`RIB_GPIO_NUM-1:0] s_gpio_native_out, s_gpio_native_oe;
logic [`RIBP_GPIO_NUM-1:0] s_gpio_alt_out, s_gpio_alt_oe;
logic [`RIBP_GPIO_NUM-1:0] s_gpio_native_out, s_gpio_native_oe;
// shake
assign s_rib_wr_hdshk = rib.valid && (~s_rib_ready_q) && (|rib.wstrb);
assign s_rib_rd_hdshk = rib.valid && (~s_rib_ready_q) && (~(|rib.wstrb));
assign rib.ready = s_rib_ready_q;
assign rib.rdata = s_rib_rdata_q;
assign s_ribp_wr_hdshk = ribp.valid && (~s_ribp_ready_q) && (|ribp.wstrb);
assign s_ribp_rd_hdshk = ribp.valid && (~s_ribp_ready_q) && (~(|ribp.wstrb));
assign ribp.ready = s_ribp_ready_q;
assign ribp.rdata = s_ribp_rdata_q;
// gpio
assign gpio.cs_o = s_gpio_cs_q; // 1: CMOS 0: SCHMI
assign gpio.pu_o = s_gpio_pu_q;
assign gpio.pd_o = s_gpio_pd_q;
for (genvar i = 0; i < `RIB_GPIO_NUM; i++) begin : ALT_PINMUX_BLOCK
assign gpio.cs_o = s_gpio_cs_q; // 1: CMOS 0: SCHMI
assign gpio.pu_o = s_gpio_pu_q;
assign gpio.pd_o = s_gpio_pd_q;
for (genvar i = 0; i < `RIBP_GPIO_NUM; i++) begin : ALT_PINMUX_BLOCK
assign s_gpio_alt_oe[i] = s_gpio_pinmux_q[i] ? gpio.alt1_oe_i[i] : gpio.alt0_oe_i[i];
assign s_gpio_alt_out[i] = s_gpio_pinmux_q[i] ? gpio.alt1_do_i[i] : gpio.alt0_do_i[i];
end
for (genvar i = 0; i < `RIB_GPIO_NUM; i++) begin : IOF_PINMUX_BLOCK
for (genvar i = 0; i < `RIBP_GPIO_NUM; i++) begin : IOF_PINMUX_BLOCK
assign s_gpio_native_oe[i] = s_gpio_iofcfg_q[i] ? s_gpio_alt_oe[i] : s_gpio_oe_q[i];
assign s_gpio_native_out[i] = s_gpio_iofcfg_q[i] ? s_gpio_alt_out[i] : s_gpio_do_q[i];
end
assign user_gpio.di_i = gpio.di_i;
for (genvar i = 0; i < `RIB_GPIO_NUM; i++) begin : USER_GPIO_MUX_BLOCK
for (genvar i = 0; i < `RIBP_GPIO_NUM; i++) begin : USER_GPIO_MUX_BLOCK
assign gpio.oe_o[i] = s_gpio_user_handoff_q[i]
? 1'b0
: (s_gpio_user_sel_q[i] ? user_gpio.oe_o[i] : s_gpio_native_oe[i]);
@@ -171,7 +171,7 @@ module rib_gpio (
edge_det #(
.STAGE (2),
.DATA_WIDTH(`RIB_GPIO_NUM)
.DATA_WIDTH(`RIBP_GPIO_NUM)
) u_gpio_di_edge_det (
.clk_i (clk_i),
.rst_n_i(rst_n_i),
@@ -182,9 +182,9 @@ module rib_gpio (
);
// register
assign s_gpio_oe_en = s_rib_wr_hdshk && rib.addr[7:0] == `RIB_GPIO_OE;
assign s_gpio_oe_d = rib.wdata[`RIB_GPIO_NUM-1:0];
dffer #(`RIB_GPIO_NUM) u_gpio_oe_dffer (
assign s_gpio_oe_en = s_ribp_wr_hdshk && ribp.addr[7:0] == `RIBP_GPIO_OE;
assign s_gpio_oe_d = ribp.wdata[`RIBP_GPIO_NUM-1:0];
dffer #(`RIBP_GPIO_NUM) u_gpio_oe_dffer (
clk_i,
rst_n_i,
s_gpio_oe_en,
@@ -193,9 +193,9 @@ module rib_gpio (
);
assign s_gpio_cs_en = s_rib_wr_hdshk && rib.addr[7:0] == `RIB_GPIO_CS;
assign s_gpio_cs_d = rib.wdata[`RIB_GPIO_NUM-1:0];
dffer #(`RIB_GPIO_NUM) u_gpio_cs_dffer (
assign s_gpio_cs_en = s_ribp_wr_hdshk && ribp.addr[7:0] == `RIBP_GPIO_CS;
assign s_gpio_cs_d = ribp.wdata[`RIBP_GPIO_NUM-1:0];
dffer #(`RIBP_GPIO_NUM) u_gpio_cs_dffer (
clk_i,
rst_n_i,
s_gpio_cs_en,
@@ -204,9 +204,9 @@ module rib_gpio (
);
assign s_gpio_pu_en = s_rib_wr_hdshk && rib.addr[7:0] == `RIB_GPIO_PU;
assign s_gpio_pu_d = rib.wdata[`RIB_GPIO_NUM-1:0];
dffer #(`RIB_GPIO_NUM) u_gpio_pu_dffer (
assign s_gpio_pu_en = s_ribp_wr_hdshk && ribp.addr[7:0] == `RIBP_GPIO_PU;
assign s_gpio_pu_d = ribp.wdata[`RIBP_GPIO_NUM-1:0];
dffer #(`RIBP_GPIO_NUM) u_gpio_pu_dffer (
clk_i,
rst_n_i,
s_gpio_pu_en,
@@ -215,9 +215,9 @@ module rib_gpio (
);
assign s_gpio_pd_en = s_rib_wr_hdshk && rib.addr[7:0] == `RIB_GPIO_PD;
assign s_gpio_pd_d = rib.wdata[`RIB_GPIO_NUM-1:0];
dffer #(`RIB_GPIO_NUM) u_gpio_pd_dffer (
assign s_gpio_pd_en = s_ribp_wr_hdshk && ribp.addr[7:0] == `RIBP_GPIO_PD;
assign s_gpio_pd_d = ribp.wdata[`RIBP_GPIO_NUM-1:0];
dffer #(`RIBP_GPIO_NUM) u_gpio_pd_dffer (
clk_i,
rst_n_i,
s_gpio_pd_en,
@@ -226,9 +226,9 @@ module rib_gpio (
);
assign s_gpio_do_en = s_rib_wr_hdshk && rib.addr[7:0] == `RIB_GPIO_DO;
assign s_gpio_do_d = rib.wdata[`RIB_GPIO_NUM-1:0];
dffer #(`RIB_GPIO_NUM) u_gpio_do_dffer (
assign s_gpio_do_en = s_ribp_wr_hdshk && ribp.addr[7:0] == `RIBP_GPIO_DO;
assign s_gpio_do_d = ribp.wdata[`RIBP_GPIO_NUM-1:0];
dffer #(`RIBP_GPIO_NUM) u_gpio_do_dffer (
clk_i,
rst_n_i,
s_gpio_do_en,
@@ -237,9 +237,9 @@ module rib_gpio (
);
assign s_gpio_ien_en = s_rib_wr_hdshk && rib.addr[7:0] == `RIB_GPIO_IEN;
assign s_gpio_ien_d = rib.wdata[`RIB_GPIO_NUM-1:0];
dffer #(`RIB_GPIO_NUM) u_gpio_ien_dffer (
assign s_gpio_ien_en = s_ribp_wr_hdshk && ribp.addr[7:0] == `RIBP_GPIO_IEN;
assign s_gpio_ien_d = ribp.wdata[`RIBP_GPIO_NUM-1:0];
dffer #(`RIBP_GPIO_NUM) u_gpio_ien_dffer (
clk_i,
rst_n_i,
s_gpio_ien_en,
@@ -248,9 +248,9 @@ module rib_gpio (
);
assign s_gpio_itype0_en = s_rib_wr_hdshk && rib.addr[7:0] == `RIB_GPIO_ITYPE0;
assign s_gpio_itype0_d = rib.wdata[`RIB_GPIO_NUM-1:0];
dffer #(`RIB_GPIO_NUM) u_gpio_itype0_dffer (
assign s_gpio_itype0_en = s_ribp_wr_hdshk && ribp.addr[7:0] == `RIBP_GPIO_ITYPE0;
assign s_gpio_itype0_d = ribp.wdata[`RIBP_GPIO_NUM-1:0];
dffer #(`RIBP_GPIO_NUM) u_gpio_itype0_dffer (
clk_i,
rst_n_i,
s_gpio_itype0_en,
@@ -259,9 +259,9 @@ module rib_gpio (
);
assign s_gpio_itype1_en = s_rib_wr_hdshk && rib.addr[7:0] == `RIB_GPIO_ITYPE1;
assign s_gpio_itype1_d = rib.wdata[`RIB_GPIO_NUM-1:0];
dffer #(`RIB_GPIO_NUM) u_gpio_itype1_dffer (
assign s_gpio_itype1_en = s_ribp_wr_hdshk && ribp.addr[7:0] == `RIBP_GPIO_ITYPE1;
assign s_gpio_itype1_d = ribp.wdata[`RIBP_GPIO_NUM-1:0];
dffer #(`RIBP_GPIO_NUM) u_gpio_itype1_dffer (
clk_i,
rst_n_i,
s_gpio_itype1_en,
@@ -270,9 +270,9 @@ module rib_gpio (
);
assign s_gpio_iofcfg_en = s_rib_wr_hdshk && rib.addr[7:0] == `RIB_GPIO_IOFCFG;
assign s_gpio_iofcfg_d = rib.wdata[`RIB_GPIO_NUM-1:0];
dffer #(`RIB_GPIO_NUM) u_gpio_iocfg_dffer (
assign s_gpio_iofcfg_en = s_ribp_wr_hdshk && ribp.addr[7:0] == `RIBP_GPIO_IOFCFG;
assign s_gpio_iofcfg_d = ribp.wdata[`RIBP_GPIO_NUM-1:0];
dffer #(`RIBP_GPIO_NUM) u_gpio_iocfg_dffer (
clk_i,
rst_n_i,
s_gpio_iofcfg_en,
@@ -284,7 +284,7 @@ module rib_gpio (
always_comb begin
s_gpio_istat_en = 1'b0;
s_gpio_istat_d = s_gpio_istat_q;
if (s_irq_stat && s_rib_rd_hdshk && rib.addr[7:0] == `RIB_GPIO_ISTAT) begin
if (s_irq_stat && s_ribp_rd_hdshk && ribp.addr[7:0] == `RIBP_GPIO_ISTAT) begin
s_gpio_istat_en = 1'b1;
// HACK: clear all irq
s_gpio_istat_d = '0;
@@ -293,7 +293,7 @@ module rib_gpio (
s_gpio_istat_d = s_irq_masked;
end
end
dffer #(`RIB_GPIO_NUM) u_gpio_istat_dffer (
dffer #(`RIBP_GPIO_NUM) u_gpio_istat_dffer (
clk_i,
rst_n_i,
s_gpio_istat_en,
@@ -302,9 +302,9 @@ module rib_gpio (
);
assign s_gpio_pinmux_en = s_rib_wr_hdshk && rib.addr[7:0] == `RIB_GPIO_PINMUX;
assign s_gpio_pinmux_d = rib.wdata[`RIB_GPIO_NUM-1:0];
dffer #(`RIB_GPIO_NUM) u_gpio_pinmux_dffer (
assign s_gpio_pinmux_en = s_ribp_wr_hdshk && ribp.addr[7:0] == `RIBP_GPIO_PINMUX;
assign s_gpio_pinmux_d = ribp.wdata[`RIBP_GPIO_NUM-1:0];
dffer #(`RIBP_GPIO_NUM) u_gpio_pinmux_dffer (
clk_i,
rst_n_i,
s_gpio_pinmux_en,
@@ -312,10 +312,10 @@ module rib_gpio (
s_gpio_pinmux_q
);
assign s_gpio_user_sel_en = s_rib_wr_hdshk && rib.addr[7:0] == `RIB_GPIO_USER_SEL;
assign s_gpio_user_sel_en = s_ribp_wr_hdshk && ribp.addr[7:0] == `RIBP_GPIO_USER_SEL;
assign s_gpio_user_sel_d = (s_gpio_user_sel_q & s_gpio_user_lock_q) |
(rib.wdata[`RIB_GPIO_NUM-1:0] & ~s_gpio_user_lock_q);
dffer #(`RIB_GPIO_NUM) u_gpio_user_sel_dffer (
(ribp.wdata[`RIBP_GPIO_NUM-1:0] & ~s_gpio_user_lock_q);
dffer #(`RIBP_GPIO_NUM) u_gpio_user_sel_dffer (
clk_i,
rst_n_i,
s_gpio_user_sel_en,
@@ -323,9 +323,9 @@ module rib_gpio (
s_gpio_user_sel_q
);
assign s_gpio_user_lock_en = s_rib_wr_hdshk && rib.addr[7:0] == `RIB_GPIO_USER_LOCK;
assign s_gpio_user_lock_d = s_gpio_user_lock_q | rib.wdata[`RIB_GPIO_NUM-1:0];
dffer #(`RIB_GPIO_NUM) u_gpio_user_lock_dffer (
assign s_gpio_user_lock_en = s_ribp_wr_hdshk && ribp.addr[7:0] == `RIBP_GPIO_USER_LOCK;
assign s_gpio_user_lock_d = s_gpio_user_lock_q | ribp.wdata[`RIBP_GPIO_NUM-1:0];
dffer #(`RIBP_GPIO_NUM) u_gpio_user_lock_dffer (
clk_i,
rst_n_i,
s_gpio_user_lock_en,
@@ -334,7 +334,7 @@ module rib_gpio (
);
assign s_gpio_user_handoff_d = s_gpio_user_sel_en ? (s_gpio_user_sel_d ^ s_gpio_user_sel_q) : '0;
dffr #(`RIB_GPIO_NUM) u_gpio_user_handoff_dffr (
dffr #(`RIBP_GPIO_NUM) u_gpio_user_handoff_dffr (
clk_i,
rst_n_i,
s_gpio_user_handoff_d,
@@ -343,43 +343,43 @@ module rib_gpio (
assign s_gpio_user_status = s_gpio_user_sel_q & ~s_gpio_user_handoff_q;
// rib resp
assign s_rib_ready_d = rib.valid && (~s_rib_ready_q);
dffr #(1) u_rib_ready_dffr (
// ribp resp
assign s_ribp_ready_d = ribp.valid && (~s_ribp_ready_q);
dffr #(1) u_ribp_ready_dffr (
clk_i,
rst_n_i,
s_rib_ready_d,
s_rib_ready_q
s_ribp_ready_d,
s_ribp_ready_q
);
assign s_rib_rdata_en = s_rib_rd_hdshk;
assign s_ribp_rdata_en = s_ribp_rd_hdshk;
always_comb begin
s_rib_rdata_d = s_rib_rdata_q;
unique case (rib.addr[7:0])
`RIB_GPIO_OE: s_rib_rdata_d = {{(32 - `RIB_GPIO_NUM) {1'b0}}, s_gpio_oe_q};
`RIB_GPIO_CS: s_rib_rdata_d = {{(32 - `RIB_GPIO_NUM) {1'b0}}, s_gpio_cs_q};
`RIB_GPIO_PU: s_rib_rdata_d = {{(32 - `RIB_GPIO_NUM) {1'b0}}, s_gpio_pu_q};
`RIB_GPIO_PD: s_rib_rdata_d = {{(32 - `RIB_GPIO_NUM) {1'b0}}, s_gpio_pd_q};
`RIB_GPIO_DO: s_rib_rdata_d = {{(32 - `RIB_GPIO_NUM) {1'b0}}, s_gpio_do_q};
`RIB_GPIO_DI: s_rib_rdata_d = {{(32 - `RIB_GPIO_NUM) {1'b0}}, s_gpio_di};
`RIB_GPIO_IEN: s_rib_rdata_d = {{(32 - `RIB_GPIO_NUM) {1'b0}}, s_gpio_ien_q};
`RIB_GPIO_ITYPE0: s_rib_rdata_d = {{(32 - `RIB_GPIO_NUM) {1'b0}}, s_gpio_itype0_q};
`RIB_GPIO_ITYPE1: s_rib_rdata_d = {{(32 - `RIB_GPIO_NUM) {1'b0}}, s_gpio_itype1_q};
`RIB_GPIO_ISTAT: s_rib_rdata_d = {{(32 - `RIB_GPIO_NUM) {1'b0}}, s_gpio_istat_q};
`RIB_GPIO_IOFCFG: s_rib_rdata_d = {{(32 - `RIB_GPIO_NUM) {1'b0}}, s_gpio_iofcfg_q};
`RIB_GPIO_PINMUX: s_rib_rdata_d = {{(32 - `RIB_GPIO_NUM) {1'b0}}, s_gpio_pinmux_q};
`RIB_GPIO_USER_SEL: s_rib_rdata_d = {{(32 - `RIB_GPIO_NUM) {1'b0}}, s_gpio_user_sel_q};
`RIB_GPIO_USER_LOCK: s_rib_rdata_d = {{(32 - `RIB_GPIO_NUM) {1'b0}}, s_gpio_user_lock_q};
`RIB_GPIO_USER_STATUS: s_rib_rdata_d = {{(32 - `RIB_GPIO_NUM) {1'b0}}, s_gpio_user_status};
default: s_rib_rdata_d = s_rib_rdata_q;
s_ribp_rdata_d = s_ribp_rdata_q;
unique case (ribp.addr[7:0])
`RIBP_GPIO_OE: s_ribp_rdata_d = {{(32 - `RIBP_GPIO_NUM) {1'b0}}, s_gpio_oe_q};
`RIBP_GPIO_CS: s_ribp_rdata_d = {{(32 - `RIBP_GPIO_NUM) {1'b0}}, s_gpio_cs_q};
`RIBP_GPIO_PU: s_ribp_rdata_d = {{(32 - `RIBP_GPIO_NUM) {1'b0}}, s_gpio_pu_q};
`RIBP_GPIO_PD: s_ribp_rdata_d = {{(32 - `RIBP_GPIO_NUM) {1'b0}}, s_gpio_pd_q};
`RIBP_GPIO_DO: s_ribp_rdata_d = {{(32 - `RIBP_GPIO_NUM) {1'b0}}, s_gpio_do_q};
`RIBP_GPIO_DI: s_ribp_rdata_d = {{(32 - `RIBP_GPIO_NUM) {1'b0}}, s_gpio_di};
`RIBP_GPIO_IEN: s_ribp_rdata_d = {{(32 - `RIBP_GPIO_NUM) {1'b0}}, s_gpio_ien_q};
`RIBP_GPIO_ITYPE0: s_ribp_rdata_d = {{(32 - `RIBP_GPIO_NUM) {1'b0}}, s_gpio_itype0_q};
`RIBP_GPIO_ITYPE1: s_ribp_rdata_d = {{(32 - `RIBP_GPIO_NUM) {1'b0}}, s_gpio_itype1_q};
`RIBP_GPIO_ISTAT: s_ribp_rdata_d = {{(32 - `RIBP_GPIO_NUM) {1'b0}}, s_gpio_istat_q};
`RIBP_GPIO_IOFCFG: s_ribp_rdata_d = {{(32 - `RIBP_GPIO_NUM) {1'b0}}, s_gpio_iofcfg_q};
`RIBP_GPIO_PINMUX: s_ribp_rdata_d = {{(32 - `RIBP_GPIO_NUM) {1'b0}}, s_gpio_pinmux_q};
`RIBP_GPIO_USER_SEL: s_ribp_rdata_d = {{(32 - `RIBP_GPIO_NUM) {1'b0}}, s_gpio_user_sel_q};
`RIBP_GPIO_USER_LOCK: s_ribp_rdata_d = {{(32 - `RIBP_GPIO_NUM) {1'b0}}, s_gpio_user_lock_q};
`RIBP_GPIO_USER_STATUS: s_ribp_rdata_d = {{(32 - `RIBP_GPIO_NUM) {1'b0}}, s_gpio_user_status};
default: s_ribp_rdata_d = s_ribp_rdata_q;
endcase
end
dffer #(32) u_rib_rdata_dffer (
dffer #(32) u_ribp_rdata_dffer (
clk_i,
rst_n_i,
s_rib_rdata_en,
s_rib_rdata_d,
s_rib_rdata_q
s_ribp_rdata_en,
s_ribp_rdata_d,
s_ribp_rdata_q
);
endmodule
+32
View File
@@ -0,0 +1,32 @@
// Copyright (c) 2023-2026 Yuchi Miao <miaoyuchi@ict.ac.cn>
// retroSoC is licensed under Mulan PSL v2.
// You can use this software according to the terms and conditions of the Mulan PSL v2.
// You may obtain a copy of Mulan PSL v2 at:
// http://license.coscl.org.cn/MulanPSL2
// THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
// EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
// MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
// See the Mulan PSL v2 for more details.
`ifndef RIBP_GPIO_DEF_SV
`define RIBP_GPIO_DEF_SV
// verilog_format: off
`define RIBP_GPIO_NUM 32
`define RIBP_GPIO_OE 8'h00 // rw
`define RIBP_GPIO_CS 8'h04 // rw
`define RIBP_GPIO_PU 8'h08 // rw
`define RIBP_GPIO_PD 8'h0C // rw
`define RIBP_GPIO_DO 8'h10 // rw
`define RIBP_GPIO_DI 8'h14 // ro
`define RIBP_GPIO_IEN 8'h18 // rw
`define RIBP_GPIO_ITYPE0 8'h1c // rw
`define RIBP_GPIO_ITYPE1 8'h20 // rw
`define RIBP_GPIO_ISTAT 8'h24 // ro
`define RIBP_GPIO_IOFCFG 8'h28 // rw
`define RIBP_GPIO_PINMUX 8'h2c // rw
`define RIBP_GPIO_USER_SEL 8'h30 // rw
`define RIBP_GPIO_USER_LOCK 8'h34 // rw1s
`define RIBP_GPIO_USER_STATUS 8'h38 // ro
// verilog_format: on
`endif
File renamed without changes.
@@ -25,7 +25,7 @@ interface sysctrl_if ();
logic [ 63:0] perf_mgmt_wait_i;
logic [ 63:0] perf_user_wait_i;
logic [ 63:0] perf_dma_wait_i;
logic [ 63:0] perf_rib_wait_i;
logic [ 63:0] perf_ribp_wait_i;
logic [ 63:0] perf_apb_wait_i;
logic [ 63:0] perf_sdram_wait_i;
logic [ 63:0] perf_psram_wait_i;
@@ -40,7 +40,7 @@ interface sysctrl_if ();
input perf_mgmt_wait_i,
input perf_user_wait_i,
input perf_dma_wait_i,
input perf_rib_wait_i,
input perf_ribp_wait_i,
input perf_apb_wait_i,
input perf_sdram_wait_i,
input perf_psram_wait_i,
@@ -54,7 +54,7 @@ interface sysctrl_if ();
);
endinterface
module rib_sysctrl (
module ribp_sysctrl (
// verilog_format: off
input logic clk_i,
input logic rst_n_i,
@@ -62,7 +62,7 @@ module rib_sysctrl (
input logic [31:0] fault_addr_i,
input logic [3:0] fault_wstrb_i,
input logic fault_reserved_i,
rib_if.slave rib,
ribp_if.slave ribp,
sysctrl_if.dut sysctrl,
pll_ctrl_if.sysctrl pll_ctrl
// verilog_format: on
@@ -99,10 +99,10 @@ module rib_sysctrl (
sysctrl_offset_t'(`SOC_SYSCTRL_PERF_DMA_WAIT_LO_OFFSET);
localparam sysctrl_offset_t SYSCTRL_PERF_DMA_WAIT_HI_OFFSET =
sysctrl_offset_t'(`SOC_SYSCTRL_PERF_DMA_WAIT_HI_OFFSET);
localparam sysctrl_offset_t SYSCTRL_PERF_RIB_WAIT_LO_OFFSET =
sysctrl_offset_t'(`SOC_SYSCTRL_PERF_RIB_WAIT_LO_OFFSET);
localparam sysctrl_offset_t SYSCTRL_PERF_RIB_WAIT_HI_OFFSET =
sysctrl_offset_t'(`SOC_SYSCTRL_PERF_RIB_WAIT_HI_OFFSET);
localparam sysctrl_offset_t SYSCTRL_PERF_RIBP_WAIT_LO_OFFSET =
sysctrl_offset_t'(`SOC_SYSCTRL_PERF_RIBP_WAIT_LO_OFFSET);
localparam sysctrl_offset_t SYSCTRL_PERF_RIBP_WAIT_HI_OFFSET =
sysctrl_offset_t'(`SOC_SYSCTRL_PERF_RIBP_WAIT_HI_OFFSET);
localparam sysctrl_offset_t SYSCTRL_PERF_APB_WAIT_LO_OFFSET =
sysctrl_offset_t'(`SOC_SYSCTRL_PERF_APB_WAIT_LO_OFFSET);
localparam sysctrl_offset_t SYSCTRL_PERF_APB_WAIT_HI_OFFSET =
@@ -120,10 +120,10 @@ module rib_sysctrl (
localparam sysctrl_offset_t SYSCTRL_PERF_FLASH_WAIT_HI_OFFSET =
sysctrl_offset_t'(`SOC_SYSCTRL_PERF_FLASH_WAIT_HI_OFFSET);
logic s_rib_wr_hdshk, s_rib_rd_hdshk;
logic s_rib_ready_d, s_rib_ready_q;
logic s_rib_rdata_en;
logic [31:0] s_rib_rdata_d, s_rib_rdata_q;
logic s_ribp_wr_hdshk, s_ribp_rd_hdshk;
logic s_ribp_ready_d, s_ribp_ready_q;
logic s_ribp_rdata_en;
logic [31:0] s_ribp_rdata_d, s_ribp_rdata_q;
logic [`USER_CORESEL_WIDTH-1:0] s_sysctrl_coresel_d, s_sysctrl_coresel_q;
logic s_sysctrl_coresel_en;
@@ -163,16 +163,16 @@ module rib_sysctrl (
logic [63:0] s_perf_mgmt_wait_q;
logic [63:0] s_perf_user_wait_q;
logic [63:0] s_perf_dma_wait_q;
logic [63:0] s_perf_rib_wait_q;
logic [63:0] s_perf_ribp_wait_q;
logic [63:0] s_perf_apb_wait_q;
logic [63:0] s_perf_sdram_wait_q;
logic [63:0] s_perf_psram_wait_q;
logic [63:0] s_perf_flash_wait_q;
assign s_rib_wr_hdshk = rib.valid && (~s_rib_ready_q) && (|rib.wstrb);
assign s_rib_rd_hdshk = rib.valid && (~s_rib_ready_q) && (~(|rib.wstrb));
assign rib.ready = s_rib_ready_q;
assign rib.rdata = s_rib_rdata_q;
assign s_ribp_wr_hdshk = ribp.valid && (~s_ribp_ready_q) && (|ribp.wstrb);
assign s_ribp_rd_hdshk = ribp.valid && (~s_ribp_ready_q) && (~(|ribp.wstrb));
assign ribp.ready = s_ribp_ready_q;
assign ribp.rdata = s_ribp_rdata_q;
assign sysctrl.ip_sel_o = s_sysctrl_ipsel_q;
assign sysctrl.core_sel_o = s_sysctrl_coresel_q;
@@ -184,11 +184,11 @@ module rib_sysctrl (
assign pll_ctrl.req_valid_o = s_pll_req_valid_q;
assign pll_ctrl.rsp_ready_o = 1'b1;
assign s_sysctrl_coresel_write_valid = rib.wdata[`USER_CORESEL_WIDTH-1:0] < `USER_CORE_COUNT;
assign s_sysctrl_coresel_en = s_rib_wr_hdshk && rib.addr[7:0] == SYSCTRL_CORESEL_OFFSET &&
rib.wstrb[0] && s_sysctrl_coresel_write_valid &&
assign s_sysctrl_coresel_write_valid = ribp.wdata[`USER_CORESEL_WIDTH-1:0] < `USER_CORE_COUNT;
assign s_sysctrl_coresel_en = s_ribp_wr_hdshk && ribp.addr[7:0] == SYSCTRL_CORESEL_OFFSET &&
ribp.wstrb[0] && s_sysctrl_coresel_write_valid &&
(&s_user_reset_q) && sysctrl.user_bus_idle_i && ~s_user_running_q;
assign s_sysctrl_coresel_d = rib.wdata[`USER_CORESEL_WIDTH-1:0];
assign s_sysctrl_coresel_d = ribp.wdata[`USER_CORESEL_WIDTH-1:0];
dffer #(`USER_CORESEL_WIDTH) u_sysctrl_coresel_dffer (
clk_i,
rst_n_i,
@@ -197,15 +197,15 @@ module rib_sysctrl (
s_sysctrl_coresel_q
);
assign s_user_reset_write_data = rib.wdata[`USER_CORE_COUNT-1:0];
assign s_user_reset_write_data = ribp.wdata[`USER_CORE_COUNT-1:0];
assign s_user_reset_write_legal = (&s_user_reset_write_data) ||
((s_sysctrl_coresel_q < `USER_CORE_COUNT) &&
((~s_user_reset_write_data) ==
({{(`USER_CORE_COUNT - 1){1'b0}}, 1'b1} << s_sysctrl_coresel_q)));
assign s_user_reset_en = s_rib_wr_hdshk && rib.addr[7:0] == SYSCTRL_USER_CORE_RESET_OFFSET &&
rib.wstrb[0];
assign s_user_config_error_clear = s_rib_wr_hdshk &&
rib.addr[7:0] == SYSCTRL_USER_CORE_STATUS_OFFSET && rib.wstrb[1] && rib.wdata[11];
assign s_user_reset_en = s_ribp_wr_hdshk && ribp.addr[7:0] == SYSCTRL_USER_CORE_RESET_OFFSET &&
ribp.wstrb[0];
assign s_user_config_error_clear = s_ribp_wr_hdshk &&
ribp.addr[7:0] == SYSCTRL_USER_CORE_STATUS_OFFSET && ribp.wstrb[1] && ribp.wdata[11];
always_comb begin
s_user_reset_d = s_user_reset_q;
@@ -215,7 +215,7 @@ module rib_sysctrl (
if (s_user_config_error_clear) begin
s_user_config_error_d = 1'b0;
end
if (s_rib_wr_hdshk && rib.addr[7:0] == SYSCTRL_CORESEL_OFFSET && ~s_sysctrl_coresel_en) begin
if (s_ribp_wr_hdshk && ribp.addr[7:0] == SYSCTRL_CORESEL_OFFSET && ~s_sysctrl_coresel_en) begin
s_user_config_error_d = 1'b1;
end
if (s_user_reset_en) begin
@@ -267,8 +267,8 @@ module rib_sysctrl (
s_user_config_error_q
);
assign s_sysctrl_ipsel_en = s_rib_wr_hdshk && rib.addr[7:0] == SYSCTRL_IPSEL_OFFSET;
assign s_sysctrl_ipsel_d = rib.wdata[`USER_IPSEL_WIDTH-1:0];
assign s_sysctrl_ipsel_en = s_ribp_wr_hdshk && ribp.addr[7:0] == SYSCTRL_IPSEL_OFFSET;
assign s_sysctrl_ipsel_d = ribp.wdata[`USER_IPSEL_WIDTH-1:0];
dffer #(`USER_IPSEL_WIDTH) u_sysctrl_ipsel_dffer (
clk_i,
rst_n_i,
@@ -277,8 +277,8 @@ module rib_sysctrl (
s_sysctrl_ipsel_q
);
assign s_pll_cfg_en = s_rib_wr_hdshk && rib.addr[7:0] == SYSCTRL_PLL_CFG_OFFSET && rib.wstrb[0];
assign s_pll_cfg_d = rib.wdata[2:0];
assign s_pll_cfg_en = s_ribp_wr_hdshk && ribp.addr[7:0] == SYSCTRL_PLL_CFG_OFFSET && ribp.wstrb[0];
assign s_pll_cfg_d = ribp.wdata[2:0];
dffer #(3) u_pll_cfg_dffer (
clk_i,
rst_n_i,
@@ -287,10 +287,10 @@ module rib_sysctrl (
s_pll_cfg_q
);
assign s_pll_apply = s_rib_wr_hdshk && rib.addr[7:0] == SYSCTRL_PLL_CMD_OFFSET &&
rib.wstrb[0] && rib.wdata[0];
assign s_pll_clear_error = s_rib_wr_hdshk && rib.addr[7:0] == SYSCTRL_PLL_CMD_OFFSET &&
rib.wstrb[0] && rib.wdata[1];
assign s_pll_apply = s_ribp_wr_hdshk && ribp.addr[7:0] == SYSCTRL_PLL_CMD_OFFSET &&
ribp.wstrb[0] && ribp.wdata[0];
assign s_pll_clear_error = s_ribp_wr_hdshk && ribp.addr[7:0] == SYSCTRL_PLL_CMD_OFFSET &&
ribp.wstrb[0] && ribp.wdata[1];
assign s_pll_rsp_accept = pll_ctrl.rsp_valid_i && pll_ctrl.rsp_ready_o;
always_comb begin
@@ -382,11 +382,11 @@ module rib_sysctrl (
s_pll_lock_q
);
assign s_perf_enable_en = s_rib_wr_hdshk && rib.addr[7:0] == SYSCTRL_PERF_CTRL_OFFSET &&
rib.wstrb[0];
assign s_perf_enable_d = rib.wdata[0];
assign s_perf_clear = s_perf_enable_en && rib.wdata[1];
assign s_perf_snapshot = s_perf_enable_en && rib.wdata[2];
assign s_perf_enable_en = s_ribp_wr_hdshk && ribp.addr[7:0] == SYSCTRL_PERF_CTRL_OFFSET &&
ribp.wstrb[0];
assign s_perf_enable_d = ribp.wdata[0];
assign s_perf_clear = s_perf_enable_en && ribp.wdata[1];
assign s_perf_snapshot = s_perf_enable_en && ribp.wdata[2];
dffer #(1) u_perf_enable_dffer (
clk_i,
rst_n_i,
@@ -415,12 +415,12 @@ module rib_sysctrl (
sysctrl.perf_dma_wait_i,
s_perf_dma_wait_q
);
dffer #(64) u_perf_rib_wait_dffer (
dffer #(64) u_perf_ribp_wait_dffer (
clk_i,
rst_n_i,
s_perf_snapshot,
sysctrl.perf_rib_wait_i,
s_perf_rib_wait_q
sysctrl.perf_ribp_wait_i,
s_perf_ribp_wait_q
);
dffer #(64) u_perf_apb_wait_dffer (
clk_i,
@@ -451,9 +451,9 @@ module rib_sysctrl (
s_perf_flash_wait_q
);
assign s_fault_status_clear = s_rib_wr_hdshk &&
rib.addr[7:0] == SYSCTRL_FAULT_STATUS_OFFSET &&
rib.wstrb[0] && rib.wdata[0];
assign s_fault_status_clear = s_ribp_wr_hdshk &&
ribp.addr[7:0] == SYSCTRL_FAULT_STATUS_OFFSET &&
ribp.wstrb[0] && ribp.wdata[0];
always_comb begin
s_fault_pending_d = s_fault_pending_q;
s_fault_write_d = s_fault_write_q;
@@ -534,26 +534,26 @@ module rib_sysctrl (
s_fault_master_q
);
assign s_rib_ready_d = rib.valid && (~s_rib_ready_q);
dffr #(1) u_rib_ready_dffr (
assign s_ribp_ready_d = ribp.valid && (~s_ribp_ready_q);
dffr #(1) u_ribp_ready_dffr (
clk_i,
rst_n_i,
s_rib_ready_d,
s_rib_ready_q
s_ribp_ready_d,
s_ribp_ready_q
);
assign s_rib_rdata_en = s_rib_rd_hdshk;
assign s_ribp_rdata_en = s_ribp_rd_hdshk;
always_comb begin
s_rib_rdata_d = s_rib_rdata_q;
unique case (rib.addr[7:0])
s_ribp_rdata_d = s_ribp_rdata_q;
unique case (ribp.addr[7:0])
// verilog_format: off
SYSCTRL_CORESEL_OFFSET: s_rib_rdata_d = {{(32 - `USER_CORESEL_WIDTH) {1'b0}}, s_sysctrl_coresel_q};
SYSCTRL_IPSEL_OFFSET: s_rib_rdata_d = {{(32 - `USER_IPSEL_WIDTH) {1'b0}}, s_sysctrl_ipsel_q};
SYSCTRL_PLL_CFG_OFFSET: s_rib_rdata_d = {29'd0, s_pll_cfg_q};
SYSCTRL_FAULT_STATUS_OFFSET: s_rib_rdata_d = {27'd0, s_fault_reason_q, s_fault_write_q, s_fault_pending_q};
SYSCTRL_FAULT_ADDR_OFFSET: s_rib_rdata_d = s_fault_addr_q;
SYSCTRL_FAULT_COUNT_OFFSET: s_rib_rdata_d = s_fault_count_q;
SYSCTRL_PLL_STATUS_OFFSET: s_rib_rdata_d = {
SYSCTRL_CORESEL_OFFSET: s_ribp_rdata_d = {{(32 - `USER_CORESEL_WIDTH) {1'b0}}, s_sysctrl_coresel_q};
SYSCTRL_IPSEL_OFFSET: s_ribp_rdata_d = {{(32 - `USER_IPSEL_WIDTH) {1'b0}}, s_sysctrl_ipsel_q};
SYSCTRL_PLL_CFG_OFFSET: s_ribp_rdata_d = {29'd0, s_pll_cfg_q};
SYSCTRL_FAULT_STATUS_OFFSET: s_ribp_rdata_d = {27'd0, s_fault_reason_q, s_fault_write_q, s_fault_pending_q};
SYSCTRL_FAULT_ADDR_OFFSET: s_ribp_rdata_d = s_fault_addr_q;
SYSCTRL_FAULT_COUNT_OFFSET: s_ribp_rdata_d = s_fault_count_q;
SYSCTRL_PLL_STATUS_OFFSET: s_ribp_rdata_d = {
21'd0,
pll_ctrl.capable_i,
s_pll_lock_q,
@@ -564,8 +564,8 @@ module rib_sysctrl (
s_pll_active_valid_q,
s_pll_active_sel_q
};
SYSCTRL_USER_CORE_RESET_OFFSET: s_rib_rdata_d = {{(32 - `USER_CORE_COUNT) {1'b0}}, s_user_reset_q};
SYSCTRL_USER_CORE_STATUS_OFFSET: s_rib_rdata_d = {
SYSCTRL_USER_CORE_RESET_OFFSET: s_ribp_rdata_d = {{(32 - `USER_CORE_COUNT) {1'b0}}, s_user_reset_q};
SYSCTRL_USER_CORE_STATUS_OFFSET: s_ribp_rdata_d = {
20'd0,
s_user_config_error_q,
s_user_draining_q,
@@ -574,35 +574,35 @@ module rib_sysctrl (
{ (8 - `USER_CORESEL_WIDTH) {1'b0} },
s_sysctrl_coresel_q
};
SYSCTRL_FAULT_MASTER_OFFSET: s_rib_rdata_d = {30'd0, s_fault_master_q};
SYSCTRL_FAULT_DETAIL_OFFSET: s_rib_rdata_d = {29'd0, s_fault_detail_q};
SYSCTRL_PERF_CTRL_OFFSET: s_rib_rdata_d = {31'd0, s_perf_enable_q};
SYSCTRL_PERF_MGMT_WAIT_LO_OFFSET: s_rib_rdata_d = s_perf_mgmt_wait_q[31:0];
SYSCTRL_PERF_MGMT_WAIT_HI_OFFSET: s_rib_rdata_d = s_perf_mgmt_wait_q[63:32];
SYSCTRL_PERF_USER_WAIT_LO_OFFSET: s_rib_rdata_d = s_perf_user_wait_q[31:0];
SYSCTRL_PERF_USER_WAIT_HI_OFFSET: s_rib_rdata_d = s_perf_user_wait_q[63:32];
SYSCTRL_PERF_DMA_WAIT_LO_OFFSET: s_rib_rdata_d = s_perf_dma_wait_q[31:0];
SYSCTRL_PERF_DMA_WAIT_HI_OFFSET: s_rib_rdata_d = s_perf_dma_wait_q[63:32];
SYSCTRL_PERF_RIB_WAIT_LO_OFFSET: s_rib_rdata_d = s_perf_rib_wait_q[31:0];
SYSCTRL_PERF_RIB_WAIT_HI_OFFSET: s_rib_rdata_d = s_perf_rib_wait_q[63:32];
SYSCTRL_PERF_APB_WAIT_LO_OFFSET: s_rib_rdata_d = s_perf_apb_wait_q[31:0];
SYSCTRL_PERF_APB_WAIT_HI_OFFSET: s_rib_rdata_d = s_perf_apb_wait_q[63:32];
SYSCTRL_PERF_SDRAM_WAIT_LO_OFFSET: s_rib_rdata_d = s_perf_sdram_wait_q[31:0];
SYSCTRL_PERF_SDRAM_WAIT_HI_OFFSET: s_rib_rdata_d = s_perf_sdram_wait_q[63:32];
SYSCTRL_PERF_PSRAM_WAIT_LO_OFFSET: s_rib_rdata_d = s_perf_psram_wait_q[31:0];
SYSCTRL_PERF_PSRAM_WAIT_HI_OFFSET: s_rib_rdata_d = s_perf_psram_wait_q[63:32];
SYSCTRL_PERF_FLASH_WAIT_LO_OFFSET: s_rib_rdata_d = s_perf_flash_wait_q[31:0];
SYSCTRL_PERF_FLASH_WAIT_HI_OFFSET: s_rib_rdata_d = s_perf_flash_wait_q[63:32];
default: s_rib_rdata_d = s_rib_rdata_q;
SYSCTRL_FAULT_MASTER_OFFSET: s_ribp_rdata_d = {30'd0, s_fault_master_q};
SYSCTRL_FAULT_DETAIL_OFFSET: s_ribp_rdata_d = {29'd0, s_fault_detail_q};
SYSCTRL_PERF_CTRL_OFFSET: s_ribp_rdata_d = {31'd0, s_perf_enable_q};
SYSCTRL_PERF_MGMT_WAIT_LO_OFFSET: s_ribp_rdata_d = s_perf_mgmt_wait_q[31:0];
SYSCTRL_PERF_MGMT_WAIT_HI_OFFSET: s_ribp_rdata_d = s_perf_mgmt_wait_q[63:32];
SYSCTRL_PERF_USER_WAIT_LO_OFFSET: s_ribp_rdata_d = s_perf_user_wait_q[31:0];
SYSCTRL_PERF_USER_WAIT_HI_OFFSET: s_ribp_rdata_d = s_perf_user_wait_q[63:32];
SYSCTRL_PERF_DMA_WAIT_LO_OFFSET: s_ribp_rdata_d = s_perf_dma_wait_q[31:0];
SYSCTRL_PERF_DMA_WAIT_HI_OFFSET: s_ribp_rdata_d = s_perf_dma_wait_q[63:32];
SYSCTRL_PERF_RIBP_WAIT_LO_OFFSET: s_ribp_rdata_d = s_perf_ribp_wait_q[31:0];
SYSCTRL_PERF_RIBP_WAIT_HI_OFFSET: s_ribp_rdata_d = s_perf_ribp_wait_q[63:32];
SYSCTRL_PERF_APB_WAIT_LO_OFFSET: s_ribp_rdata_d = s_perf_apb_wait_q[31:0];
SYSCTRL_PERF_APB_WAIT_HI_OFFSET: s_ribp_rdata_d = s_perf_apb_wait_q[63:32];
SYSCTRL_PERF_SDRAM_WAIT_LO_OFFSET: s_ribp_rdata_d = s_perf_sdram_wait_q[31:0];
SYSCTRL_PERF_SDRAM_WAIT_HI_OFFSET: s_ribp_rdata_d = s_perf_sdram_wait_q[63:32];
SYSCTRL_PERF_PSRAM_WAIT_LO_OFFSET: s_ribp_rdata_d = s_perf_psram_wait_q[31:0];
SYSCTRL_PERF_PSRAM_WAIT_HI_OFFSET: s_ribp_rdata_d = s_perf_psram_wait_q[63:32];
SYSCTRL_PERF_FLASH_WAIT_LO_OFFSET: s_ribp_rdata_d = s_perf_flash_wait_q[31:0];
SYSCTRL_PERF_FLASH_WAIT_HI_OFFSET: s_ribp_rdata_d = s_perf_flash_wait_q[63:32];
default: s_ribp_rdata_d = s_ribp_rdata_q;
endcase
// verilog_format: on
end
dffer #(32) u_rib_rdata_dffer (
dffer #(32) u_ribp_rdata_dffer (
clk_i,
rst_n_i,
s_rib_rdata_en,
s_rib_rdata_d,
s_rib_rdata_q
s_ribp_rdata_en,
s_ribp_rdata_d,
s_ribp_rdata_q
);
endmodule
@@ -30,32 +30,32 @@
// MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
// See the Mulan PSL v2 for more details.
`ifndef RIB_TIMER_DEF_SV
`define RIB_TIMER_DEF_SV
`ifndef RIBP_TIMER_DEF_SV
`define RIBP_TIMER_DEF_SV
// verilog_format: off
`define RIB_TIMER_CFG 8'h00
`define RIB_TIMER_RLD 8'h04
`define RIB_TIMER_VAL 8'h08
`define RIBP_TIMER_CFG 8'h00
`define RIBP_TIMER_RLD 8'h04
`define RIBP_TIMER_VAL 8'h08
// verilog_format: on
`endif
module rib_timer (
module ribp_timer (
// verilog_format: off
input logic clk_i,
input logic rst_n_i,
rib_if.slave rib,
ribp_if.slave ribp,
output logic irq_o
// verilog_format: on
);
// rib
// ribp
logic s_irq_d, s_irq_q;
logic s_rib_wr_hdshk, s_rib_rd_hdshk;
logic s_rib_ready_d, s_rib_ready_q;
logic s_rib_rdata_en;
logic [31:0] s_rib_rdata_d, s_rib_rdata_q;
logic s_ribp_wr_hdshk, s_ribp_rd_hdshk;
logic s_ribp_ready_d, s_ribp_ready_q;
logic s_ribp_rdata_en;
logic [31:0] s_ribp_rdata_d, s_ribp_rdata_q;
// register
logic s_tim_cfg_en;
logic [3:0] s_tim_cfg_d, s_tim_cfg_q;
@@ -69,37 +69,37 @@ module rib_timer (
logic s_bit_en, s_bit_oneshot;
logic s_bit_updown, s_bit_irq_en;
// irq
assign irq_o = s_irq_q;
assign irq_o = s_irq_q;
assign s_rib_wr_hdshk = rib.valid && (~s_rib_ready_q) && (|rib.wstrb);
assign s_rib_rd_hdshk = rib.valid && (~s_rib_ready_q) && (~(|rib.wstrb));
assign rib.ready = s_rib_ready_q;
assign rib.rdata = s_rib_rdata_q;
assign s_ribp_wr_hdshk = ribp.valid && (~s_ribp_ready_q) && (|ribp.wstrb);
assign s_ribp_rd_hdshk = ribp.valid && (~s_ribp_ready_q) && (~(|ribp.wstrb));
assign ribp.ready = s_ribp_ready_q;
assign ribp.rdata = s_ribp_rdata_q;
assign s_bit_en = s_tim_cfg_q[0];
assign s_bit_oneshot = s_tim_cfg_q[1];
assign s_bit_updown = s_tim_cfg_q[2];
assign s_bit_irq_en = s_tim_cfg_q[3];
assign s_bit_en = s_tim_cfg_q[0];
assign s_bit_oneshot = s_tim_cfg_q[1];
assign s_bit_updown = s_tim_cfg_q[2];
assign s_bit_irq_en = s_tim_cfg_q[3];
// register
assign s_tim_cfg_en = s_rib_wr_hdshk && rib.addr[7:0] == `RIB_TIMER_CFG;
assign s_tim_cfg_d = rib.wdata[3:0];
assign s_tim_cfg_en = s_ribp_wr_hdshk && ribp.addr[7:0] == `RIBP_TIMER_CFG;
assign s_tim_cfg_d = ribp.wdata[3:0];
dffer #(4) u_tim_cfg_dffer (
clk_i,
rst_n_i,
s_tim_cfg_en && rib.wstrb[0],
s_tim_cfg_en && ribp.wstrb[0],
s_tim_cfg_d,
s_tim_cfg_q
);
assign s_tim_rld_en = s_rib_wr_hdshk && rib.addr[7:0] == `RIB_TIMER_RLD;
assign s_tim_rld_en = s_ribp_wr_hdshk && ribp.addr[7:0] == `RIBP_TIMER_RLD;
always_comb begin
s_tim_rld_d = s_tim_rld_q;
if (rib.wstrb[0]) s_tim_rld_d[7:0] = rib.wdata[7:0];
if (rib.wstrb[1]) s_tim_rld_d[15:8] = rib.wdata[15:8];
if (rib.wstrb[2]) s_tim_rld_d[23:16] = rib.wdata[23:16];
if (rib.wstrb[3]) s_tim_rld_d[31:24] = rib.wdata[31:24];
if (ribp.wstrb[0]) s_tim_rld_d[7:0] = ribp.wdata[7:0];
if (ribp.wstrb[1]) s_tim_rld_d[15:8] = ribp.wdata[15:8];
if (ribp.wstrb[2]) s_tim_rld_d[23:16] = ribp.wdata[23:16];
if (ribp.wstrb[3]) s_tim_rld_d[31:24] = ribp.wdata[31:24];
end
dffer #(32) u_tim_rld_dffer (
clk_i,
@@ -113,11 +113,11 @@ module rib_timer (
always_comb begin
s_tim_val_d = s_tim_val_q;
s_irq_d = s_irq_q;
if (s_rib_wr_hdshk && rib.addr[7:0] == `RIB_TIMER_VAL) begin
if (rib.wstrb[0]) s_tim_val_d[7:0] = rib.wdata[7:0];
if (rib.wstrb[1]) s_tim_val_d[15:8] = rib.wdata[15:8];
if (rib.wstrb[2]) s_tim_val_d[23:16] = rib.wdata[23:16];
if (rib.wstrb[3]) s_tim_val_d[31:24] = rib.wdata[31:24];
if (s_ribp_wr_hdshk && ribp.addr[7:0] == `RIBP_TIMER_VAL) begin
if (ribp.wstrb[0]) s_tim_val_d[7:0] = ribp.wdata[7:0];
if (ribp.wstrb[1]) s_tim_val_d[15:8] = ribp.wdata[15:8];
if (ribp.wstrb[2]) s_tim_val_d[23:16] = ribp.wdata[23:16];
if (ribp.wstrb[3]) s_tim_val_d[31:24] = ribp.wdata[31:24];
end else if (s_bit_en) begin
if (s_bit_updown) begin
if (s_tim_val_q == s_tim_rld_q) begin
@@ -153,30 +153,30 @@ module rib_timer (
);
assign s_rib_ready_d = rib.valid && (~s_rib_ready_q);
dffr #(1) u_rib_ready_dffr (
assign s_ribp_ready_d = ribp.valid && (~s_ribp_ready_q);
dffr #(1) u_ribp_ready_dffr (
clk_i,
rst_n_i,
s_rib_ready_d,
s_rib_ready_q
s_ribp_ready_d,
s_ribp_ready_q
);
assign s_rib_rdata_en = s_rib_rd_hdshk;
assign s_ribp_rdata_en = s_ribp_rd_hdshk;
always_comb begin
s_rib_rdata_d = s_rib_rdata_q;
unique case (rib.addr[7:0])
`RIB_TIMER_CFG: s_rib_rdata_d = {28'd0, s_tim_cfg_q};
`RIB_TIMER_RLD: s_rib_rdata_d = s_tim_rld_q;
`RIB_TIMER_VAL: s_rib_rdata_d = s_tim_val_q;
default: s_rib_rdata_d = s_rib_rdata_q;
s_ribp_rdata_d = s_ribp_rdata_q;
unique case (ribp.addr[7:0])
`RIBP_TIMER_CFG: s_ribp_rdata_d = {28'd0, s_tim_cfg_q};
`RIBP_TIMER_RLD: s_ribp_rdata_d = s_tim_rld_q;
`RIBP_TIMER_VAL: s_ribp_rdata_d = s_tim_val_q;
default: s_ribp_rdata_d = s_ribp_rdata_q;
endcase
end
dffer #(32) u_rib_rdata_dffer (
dffer #(32) u_ribp_rdata_dffer (
clk_i,
rst_n_i,
s_rib_rdata_en,
s_rib_rdata_d,
s_rib_rdata_q
s_ribp_rdata_en,
s_ribp_rdata_d,
s_ribp_rdata_q
);
endmodule
@@ -8,35 +8,35 @@
// MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
// See the Mulan PSL v2 for more details.
`ifndef RIB_I2C_DEF_SV
`define RIB_I2C_DEF_SV
`ifndef RIBP_I2C_DEF_SV
`define RIBP_I2C_DEF_SV
// verilog_format: off
`define RIB_I2C_CLKDIV 8'h00
`define RIB_I2C_DEVADDR 8'h04
`define RIB_I2C_REGADDR 8'h08
`define RIB_I2C_TXDATA 8'h0C
`define RIB_I2C_RXDATA 8'h10
`define RIB_I2C_XFER 8'h14
`define RIB_I2C_CFG 8'h18
`define RIB_I2C_STATUS 8'h1C
`define RIBP_I2C_CLKDIV 8'h00
`define RIBP_I2C_DEVADDR 8'h04
`define RIBP_I2C_REGADDR 8'h08
`define RIBP_I2C_TXDATA 8'h0C
`define RIBP_I2C_RXDATA 8'h10
`define RIBP_I2C_XFER 8'h14
`define RIBP_I2C_CFG 8'h18
`define RIBP_I2C_STATUS 8'h1C
// verilog_format: on
`endif
module rib_i2c (
module ribp_i2c (
// verilog_format: off
input logic clk_i,
input logic rst_n_i,
rib_if.slave rib,
ribp_if.slave ribp,
i2c_if.dut i2c
// verilog_format: on
);
logic s_rib_wr_hdshk, s_rib_rd_hdshk;
logic s_rib_ready_d, s_rib_ready_q;
logic s_rib_rdata_en;
logic [31:0] s_rib_rdata_d, s_rib_rdata_q;
logic s_ribp_wr_hdshk, s_ribp_rd_hdshk;
logic s_ribp_ready_d, s_ribp_ready_q;
logic s_ribp_rdata_en;
logic [31:0] s_ribp_rdata_d, s_ribp_rdata_q;
//2^7=128
logic s_i2c_clkdiv_en;
@@ -63,14 +63,14 @@ module rib_i2c (
assign s_bit_start = s_i2c_xfer_q[1];
assign s_bit_extn_addr = s_i2c_cfg_q;
assign s_rib_wr_hdshk = rib.valid && (~s_rib_ready_q) && (|rib.wstrb);
assign s_rib_rd_hdshk = rib.valid && (~s_rib_ready_q) && (~(|rib.wstrb));
assign rib.ready = s_rib_ready_q;
assign rib.rdata = s_rib_rdata_q;
assign s_ribp_wr_hdshk = ribp.valid && (~s_ribp_ready_q) && (|ribp.wstrb);
assign s_ribp_rd_hdshk = ribp.valid && (~s_ribp_ready_q) && (~(|ribp.wstrb));
assign ribp.ready = s_ribp_ready_q;
assign ribp.rdata = s_ribp_rdata_q;
assign s_i2c_clkdiv_en = s_rib_wr_hdshk && rib.addr[7:0] == `RIB_I2C_CLKDIV;
assign s_i2c_clkdiv_d = rib.wdata[6:0];
assign s_i2c_clkdiv_en = s_ribp_wr_hdshk && ribp.addr[7:0] == `RIBP_I2C_CLKDIV;
assign s_i2c_clkdiv_d = ribp.wdata[6:0];
dffer #(7) u_i2c_clkdiv_dffer (
clk_i,
rst_n_i,
@@ -79,8 +79,8 @@ module rib_i2c (
s_i2c_clkdiv_q
);
assign s_i2c_devaddr_en = s_rib_wr_hdshk && rib.addr[7:0] == `RIB_I2C_DEVADDR;
assign s_i2c_devaddr_d = rib.wdata[6:0];
assign s_i2c_devaddr_en = s_ribp_wr_hdshk && ribp.addr[7:0] == `RIBP_I2C_DEVADDR;
assign s_i2c_devaddr_d = ribp.wdata[6:0];
dffer #(7) u_i2c_devaddr_dffer (
clk_i,
rst_n_i,
@@ -90,11 +90,11 @@ module rib_i2c (
);
assign s_i2c_regaddr_en = s_rib_wr_hdshk && rib.addr[7:0] == `RIB_I2C_REGADDR;
assign s_i2c_regaddr_en = s_ribp_wr_hdshk && ribp.addr[7:0] == `RIBP_I2C_REGADDR;
always_comb begin
s_i2c_regaddr_d = s_i2c_regaddr_q;
if (rib.wstrb[0]) s_i2c_regaddr_d[7:0] = rib.wdata[7:0];
if (rib.wstrb[1]) s_i2c_regaddr_d[15:8] = rib.wdata[15:8];
if (ribp.wstrb[0]) s_i2c_regaddr_d[7:0] = ribp.wdata[7:0];
if (ribp.wstrb[1]) s_i2c_regaddr_d[15:8] = ribp.wdata[15:8];
end
dffer #(16) u_i2c_regaddr_dffer (
clk_i,
@@ -105,8 +105,8 @@ module rib_i2c (
);
assign s_i2c_txdata_en = s_rib_wr_hdshk && rib.addr[7:0] == `RIB_I2C_TXDATA;
assign s_i2c_txdata_d = rib.wdata[7:0];
assign s_i2c_txdata_en = s_ribp_wr_hdshk && ribp.addr[7:0] == `RIBP_I2C_TXDATA;
assign s_i2c_txdata_d = ribp.wdata[7:0];
dffer #(8) u_i2c_txdata_dffer (
clk_i,
rst_n_i,
@@ -118,8 +118,8 @@ module rib_i2c (
always_comb begin
s_i2c_xfer_d = s_i2c_xfer_q;
if (s_rib_wr_hdshk && rib.addr[7:0] == `RIB_I2C_XFER) begin
s_i2c_xfer_d = rib.wdata[1:0];
if (s_ribp_wr_hdshk && ribp.addr[7:0] == `RIBP_I2C_XFER) begin
s_i2c_xfer_d = ribp.wdata[1:0];
end else if (s_oper_clk_pos && (|s_i2c_xfer_q)) begin
s_i2c_xfer_d = '0;
end
@@ -132,8 +132,8 @@ module rib_i2c (
);
assign s_i2c_cfg_en = s_rib_wr_hdshk && rib.addr[7:0] == `RIB_I2C_CFG;
assign s_i2c_cfg_d = rib.wdata[0];
assign s_i2c_cfg_en = s_ribp_wr_hdshk && ribp.addr[7:0] == `RIBP_I2C_CFG;
assign s_i2c_cfg_d = ribp.wdata[0];
dffer #(1) u_i2c_cfg_dffer (
clk_i,
rst_n_i,
@@ -152,7 +152,7 @@ module rib_i2c (
always_comb begin
s_i2c_status_d = s_i2c_status_q;
if (s_bit_end_re) s_i2c_status_d = 1'b1;
else if (s_rib_rd_hdshk && rib.addr[7:0] == `RIB_I2C_STATUS) begin
else if (s_ribp_rd_hdshk && ribp.addr[7:0] == `RIBP_I2C_STATUS) begin
s_i2c_status_d = 1'b0;
end
end
@@ -164,35 +164,35 @@ module rib_i2c (
);
assign s_rib_ready_d = rib.valid && (~s_rib_ready_q);
dffr #(1) u_rib_ready_dffr (
assign s_ribp_ready_d = ribp.valid && (~s_ribp_ready_q);
dffr #(1) u_ribp_ready_dffr (
clk_i,
rst_n_i,
s_rib_ready_d,
s_rib_ready_q
s_ribp_ready_d,
s_ribp_ready_q
);
assign s_rib_rdata_en = s_rib_rd_hdshk;
assign s_ribp_rdata_en = s_ribp_rd_hdshk;
always_comb begin
s_rib_rdata_d = s_rib_rdata_q;
unique case (rib.addr[7:0])
`RIB_I2C_CLKDIV: s_rib_rdata_d = {25'd0, s_i2c_clkdiv_q};
`RIB_I2C_DEVADDR: s_rib_rdata_d = {25'd0, s_i2c_devaddr_q};
`RIB_I2C_REGADDR: s_rib_rdata_d = {16'd0, s_i2c_regaddr_q};
`RIB_I2C_TXDATA: s_rib_rdata_d = {24'd0, s_i2c_txdata_q};
`RIB_I2C_RXDATA: s_rib_rdata_d = {24'd0, s_i2c_rxdata};
`RIB_I2C_XFER: s_rib_rdata_d = {30'd0, s_i2c_xfer_q};
`RIB_I2C_CFG: s_rib_rdata_d = {31'd0, s_i2c_cfg_q};
`RIB_I2C_STATUS: s_rib_rdata_d = {31'd0, s_i2c_status_q};
default: s_rib_rdata_d = s_rib_rdata_q;
s_ribp_rdata_d = s_ribp_rdata_q;
unique case (ribp.addr[7:0])
`RIBP_I2C_CLKDIV: s_ribp_rdata_d = {25'd0, s_i2c_clkdiv_q};
`RIBP_I2C_DEVADDR: s_ribp_rdata_d = {25'd0, s_i2c_devaddr_q};
`RIBP_I2C_REGADDR: s_ribp_rdata_d = {16'd0, s_i2c_regaddr_q};
`RIBP_I2C_TXDATA: s_ribp_rdata_d = {24'd0, s_i2c_txdata_q};
`RIBP_I2C_RXDATA: s_ribp_rdata_d = {24'd0, s_i2c_rxdata};
`RIBP_I2C_XFER: s_ribp_rdata_d = {30'd0, s_i2c_xfer_q};
`RIBP_I2C_CFG: s_ribp_rdata_d = {31'd0, s_i2c_cfg_q};
`RIBP_I2C_STATUS: s_ribp_rdata_d = {31'd0, s_i2c_status_q};
default: s_ribp_rdata_d = s_ribp_rdata_q;
endcase
end
dffer #(32) u_rib_rdata_dffer (
dffer #(32) u_ribp_rdata_dffer (
clk_i,
rst_n_i,
s_rib_rdata_en,
s_rib_rdata_d,
s_rib_rdata_q
s_ribp_rdata_en,
s_ribp_rdata_d,
s_ribp_rdata_q
);
File renamed without changes.
@@ -29,7 +29,7 @@ interface i2s_if ();
endinterface
module rib_i2s (
module ribp_i2s (
// verilog_format: off
input logic clk_i,
input logic rst_n_i,
@@ -37,7 +37,7 @@ module rib_i2s (
input logic rst_aud_n_i,
output logic dma_tx_stall_o,
output logic dma_rx_stall_o,
rib_if.slave rib,
ribp_if.slave ribp,
i2s_if.dut i2s
// verilog_format: on
);
@@ -60,7 +60,7 @@ module rib_i2s (
i2s_reg u_i2s_reg (
.clk_i (clk_i),
.rst_n_i (rst_n_i),
.rib (rib),
.ribp (ribp),
.mode_o (s_i2s_mode),
.format_o (s_i2s_format),
.recven_o (s_i2s_recven),
File renamed without changes.
File renamed without changes.
@@ -8,18 +8,18 @@
// MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
// See the Mulan PSL v2 for more details.
`ifndef RIB_I2S_DEF_SV
`define RIB_I2S_DEF_SV
`ifndef RIBP_I2S_DEF_SV
`define RIBP_I2S_DEF_SV
// verilog_format: off
`define RIB_I2S_MODE 8'h00
`define RIB_I2S_FORMAT 8'h04
`define RIB_I2S_UPBOUND 8'h08
`define RIB_I2S_LOWBOUND 8'h0C
`define RIB_I2S_RECVEN 8'h10
`define RIB_I2S_TXDATA 8'h14
`define RIB_I2S_RXDATA 8'h18
`define RIB_I2S_STATUS 8'h1C
`define RIBP_I2S_MODE 8'h00
`define RIBP_I2S_FORMAT 8'h04
`define RIBP_I2S_UPBOUND 8'h08
`define RIBP_I2S_LOWBOUND 8'h0C
`define RIBP_I2S_RECVEN 8'h10
`define RIBP_I2S_TXDATA 8'h14
`define RIBP_I2S_RXDATA 8'h18
`define RIBP_I2S_STATUS 8'h1C
// verilog_format: on
`define I2S_16b_48K 2'd0
File renamed without changes.
@@ -14,7 +14,7 @@ module i2s_reg (
// verilog_format: off
input logic clk_i,
input logic rst_n_i,
rib_if.slave rib,
ribp_if.slave ribp,
output logic mode_o,
output logic [ 1:0] format_o,
output logic recven_o,
@@ -31,11 +31,11 @@ module i2s_reg (
// verilog_format: on
);
// rib
logic s_rib_wr_hdshk, s_rib_rd_hdshk;
logic s_rib_ready_d, s_rib_ready_q;
logic s_rib_rdata_en;
logic [31:0] s_rib_rdata_d, s_rib_rdata_q;
// ribp
logic s_ribp_wr_hdshk, s_ribp_rd_hdshk;
logic s_ribp_ready_d, s_ribp_ready_q;
logic s_ribp_rdata_en;
logic [31:0] s_ribp_rdata_d, s_ribp_rdata_q;
// register
logic s_i2s_mode_en;
logic s_i2s_mode_d, s_i2s_mode_q;
@@ -53,22 +53,22 @@ module i2s_reg (
logic s_rx_fifo_stall_d, s_rx_fifo_stall_q;
// rib
assign s_rib_wr_hdshk = rib.valid && (~s_rib_ready_q) && (|rib.wstrb);
assign s_rib_rd_hdshk = rib.valid && (~s_rib_ready_q) && (~(|rib.wstrb));
assign rib.ready = s_rib_ready_q;
assign rib.rdata = s_rib_rdata_q;
// ribp
assign s_ribp_wr_hdshk = ribp.valid && (~s_ribp_ready_q) && (|ribp.wstrb);
assign s_ribp_rd_hdshk = ribp.valid && (~s_ribp_ready_q) && (~(|ribp.wstrb));
assign ribp.ready = s_ribp_ready_q;
assign ribp.rdata = s_ribp_rdata_q;
// reg
assign mode_o = s_i2s_mode_q;
assign format_o = s_i2s_format_q;
assign recven_o = s_i2s_recven_q;
assign mode_o = s_i2s_mode_q;
assign format_o = s_i2s_format_q;
assign recven_o = s_i2s_recven_q;
// dma
assign dma_tx_stall_o = s_tx_fifo_stall_q;
assign dma_rx_stall_o = s_rx_fifo_stall_q;
assign dma_tx_stall_o = s_tx_fifo_stall_q;
assign dma_rx_stall_o = s_rx_fifo_stall_q;
assign s_i2s_mode_en = s_rib_wr_hdshk && rib.addr[7:0] == `RIB_I2S_MODE;
assign s_i2s_mode_d = rib.wdata[0];
assign s_i2s_mode_en = s_ribp_wr_hdshk && ribp.addr[7:0] == `RIBP_I2S_MODE;
assign s_i2s_mode_d = ribp.wdata[0];
dffer #(1) u_i2s_mode_dffer (
clk_i,
rst_n_i,
@@ -78,8 +78,8 @@ module i2s_reg (
);
assign s_i2s_format_en = s_rib_wr_hdshk && rib.addr[7:0] == `RIB_I2S_FORMAT;
assign s_i2s_format_d = rib.wdata[1:0];
assign s_i2s_format_en = s_ribp_wr_hdshk && ribp.addr[7:0] == `RIBP_I2S_FORMAT;
assign s_i2s_format_d = ribp.wdata[1:0];
dffer #(2) u_i2s_format_dffer (
clk_i,
rst_n_i,
@@ -89,8 +89,8 @@ module i2s_reg (
);
assign s_i2s_upbound_en = s_rib_wr_hdshk && rib.addr[7:0] == `RIB_I2S_UPBOUND;
assign s_i2s_upbound_d = rib.wdata[7:0];
assign s_i2s_upbound_en = s_ribp_wr_hdshk && ribp.addr[7:0] == `RIBP_I2S_UPBOUND;
assign s_i2s_upbound_d = ribp.wdata[7:0];
dfferh #(8) u_i2s_upbound_dfferh (
clk_i,
rst_n_i,
@@ -100,8 +100,8 @@ module i2s_reg (
);
assign s_i2s_lowbound_en = s_rib_wr_hdshk && rib.addr[7:0] == `RIB_I2S_LOWBOUND;
assign s_i2s_lowbound_d = rib.wdata[7:0];
assign s_i2s_lowbound_en = s_ribp_wr_hdshk && ribp.addr[7:0] == `RIBP_I2S_LOWBOUND;
assign s_i2s_lowbound_d = ribp.wdata[7:0];
dffer #(8) u_i2s_lowbound_dffer (
clk_i,
rst_n_i,
@@ -111,8 +111,8 @@ module i2s_reg (
);
assign s_i2s_recven_en = s_rib_wr_hdshk && rib.addr[7:0] == `RIB_I2S_RECVEN;
assign s_i2s_recven_d = rib.wdata[0];
assign s_i2s_recven_en = s_ribp_wr_hdshk && ribp.addr[7:0] == `RIBP_I2S_RECVEN;
assign s_i2s_recven_d = ribp.wdata[0];
dffer #(1) u_i2s_recven_dffer (
clk_i,
rst_n_i,
@@ -158,12 +158,12 @@ module i2s_reg (
always_comb begin
tx_push_valid_o = 1'b0;
tx_push_data_o = '0;
if (s_rib_wr_hdshk && rib.addr[7:0] == `RIB_I2S_TXDATA) begin
if (s_ribp_wr_hdshk && ribp.addr[7:0] == `RIBP_I2S_TXDATA) begin
tx_push_valid_o = 1'b1;
if (rib.wstrb[0]) tx_push_data_o[7:0] = rib.wdata[7:0];
if (rib.wstrb[1]) tx_push_data_o[15:8] = rib.wdata[15:8];
if (rib.wstrb[2]) tx_push_data_o[23:16] = rib.wdata[23:16];
if (rib.wstrb[3]) tx_push_data_o[31:24] = rib.wdata[31:24];
if (ribp.wstrb[0]) tx_push_data_o[7:0] = ribp.wdata[7:0];
if (ribp.wstrb[1]) tx_push_data_o[15:8] = ribp.wdata[15:8];
if (ribp.wstrb[2]) tx_push_data_o[23:16] = ribp.wdata[23:16];
if (ribp.wstrb[3]) tx_push_data_o[31:24] = ribp.wdata[31:24];
end
end
@@ -179,38 +179,38 @@ module i2s_reg (
s_i2s_status_q
);
assign s_rib_ready_d = rib.valid && (~s_rib_ready_q);
dffr #(1) u_rib_ready_dffr (
assign s_ribp_ready_d = ribp.valid && (~s_ribp_ready_q);
dffr #(1) u_ribp_ready_dffr (
clk_i,
rst_n_i,
s_rib_ready_d,
s_rib_ready_q
s_ribp_ready_d,
s_ribp_ready_q
);
assign s_rib_rdata_en = s_rib_rd_hdshk;
assign s_ribp_rdata_en = s_ribp_rd_hdshk;
always_comb begin
rx_pop_valid_o = 1'b0;
s_rib_rdata_d = s_rib_rdata_q;
unique case (rib.addr[7:0])
`RIB_I2S_MODE: s_rib_rdata_d = {31'd0, s_i2s_mode_q};
`RIB_I2S_FORMAT: s_rib_rdata_d = {30'd0, s_i2s_format_q};
`RIB_I2S_RXDATA: begin
if (s_rib_rd_hdshk) begin
s_ribp_rdata_d = s_ribp_rdata_q;
unique case (ribp.addr[7:0])
`RIBP_I2S_MODE: s_ribp_rdata_d = {31'd0, s_i2s_mode_q};
`RIBP_I2S_FORMAT: s_ribp_rdata_d = {30'd0, s_i2s_format_q};
`RIBP_I2S_RXDATA: begin
if (s_ribp_rd_hdshk) begin
rx_pop_valid_o = 1'b1;
if (!rx_empty_i) s_rib_rdata_d = rx_pop_data_i;
else s_rib_rdata_d = '0;
if (!rx_empty_i) s_ribp_rdata_d = rx_pop_data_i;
else s_ribp_rdata_d = '0;
end
end
`RIB_I2S_STATUS: s_rib_rdata_d = {30'd0, s_i2s_status_q};
default: s_rib_rdata_d = s_rib_rdata_q;
`RIBP_I2S_STATUS: s_ribp_rdata_d = {30'd0, s_i2s_status_q};
default: s_ribp_rdata_d = s_ribp_rdata_q;
endcase
end
dffer #(32) u_rib_rdata_dffer (
dffer #(32) u_ribp_rdata_dffer (
clk_i,
rst_n_i,
s_rib_rdata_en,
s_rib_rdata_d,
s_rib_rdata_q
s_ribp_rdata_en,
s_ribp_rdata_d,
s_ribp_rdata_q
);
endmodule
File renamed without changes.
@@ -12,13 +12,13 @@
`define ONEWIRE_DEF_SV
// verilog_format: off
`define RIB_ONEWIRE_CLKDIV 8'h00
`define RIB_ONEWIRE_ZEROCNT 8'h04
`define RIB_ONEWIRE_ONECNT 8'h08
`define RIB_ONEWIRE_RSTCNT 8'h0C
`define RIB_ONEWIRE_TXDATA 8'h10
`define RIB_ONEWIRE_CTRL 8'h14
`define RIB_ONEWIRE_STATUS 8'h18
`define RIBP_ONEWIRE_CLKDIV 8'h00
`define RIBP_ONEWIRE_ZEROCNT 8'h04
`define RIBP_ONEWIRE_ONECNT 8'h08
`define RIBP_ONEWIRE_RSTCNT 8'h0C
`define RIBP_ONEWIRE_TXDATA 8'h10
`define RIBP_ONEWIRE_CTRL 8'h14
`define RIBP_ONEWIRE_STATUS 8'h18
// verilog_format: on
`endif
@@ -30,19 +30,19 @@ interface onewire_if ();
endinterface
// generate 1250ns for ws2812x only
module rib_onewire (
module ribp_onewire (
// verilog_format: off
input logic clk_i,
input logic rst_n_i,
rib_if.slave rib,
ribp_if.slave ribp,
onewire_if.dut onewire
// verilog_format: on
);
logic s_rib_wr_hdshk, s_rib_rd_hdshk;
logic s_rib_ready_d, s_rib_ready_q;
logic s_rib_rdata_en;
logic [31:0] s_rib_rdata_d, s_rib_rdata_q;
logic s_ribp_wr_hdshk, s_ribp_rd_hdshk;
logic s_ribp_ready_d, s_ribp_ready_q;
logic s_ribp_rdata_en;
logic [31:0] s_ribp_rdata_d, s_ribp_rdata_q;
logic s_onewire_clkdiv_en;
logic [7:0] s_onewire_clkdiv_d, s_onewire_clkdiv_q;
@@ -61,14 +61,14 @@ module rib_onewire (
logic s_done;
assign s_rib_wr_hdshk = rib.valid && (~s_rib_ready_q) && (|rib.wstrb);
assign s_rib_rd_hdshk = rib.valid && (~s_rib_ready_q) && (~(|rib.wstrb));
assign rib.ready = s_rib_ready_q;
assign rib.rdata = s_rib_rdata_q;
assign s_ribp_wr_hdshk = ribp.valid && (~s_ribp_ready_q) && (|ribp.wstrb);
assign s_ribp_rd_hdshk = ribp.valid && (~s_ribp_ready_q) && (~(|ribp.wstrb));
assign ribp.ready = s_ribp_ready_q;
assign ribp.rdata = s_ribp_rdata_q;
assign s_onewire_clkdiv_en = s_rib_wr_hdshk && rib.addr[7:0] == `RIB_ONEWIRE_CLKDIV;
assign s_onewire_clkdiv_d = rib.wdata[7:0];
assign s_onewire_clkdiv_en = s_ribp_wr_hdshk && ribp.addr[7:0] == `RIBP_ONEWIRE_CLKDIV;
assign s_onewire_clkdiv_d = ribp.wdata[7:0];
dffer #(8) u_onewire_clkdiv_dffer (
clk_i,
rst_n_i,
@@ -77,8 +77,8 @@ module rib_onewire (
s_onewire_clkdiv_q
);
assign s_onewire_zerocnt_en = s_rib_wr_hdshk && rib.addr[7:0] == `RIB_ONEWIRE_ZEROCNT;
assign s_onewire_zerocnt_d = rib.wdata[7:0];
assign s_onewire_zerocnt_en = s_ribp_wr_hdshk && ribp.addr[7:0] == `RIBP_ONEWIRE_ZEROCNT;
assign s_onewire_zerocnt_d = ribp.wdata[7:0];
dffer #(8) u_onewire_zerocnt_dffer (
clk_i,
rst_n_i,
@@ -87,8 +87,8 @@ module rib_onewire (
s_onewire_zerocnt_q
);
assign s_onewire_onecnt_en = s_rib_wr_hdshk && rib.addr[7:0] == `RIB_ONEWIRE_ONECNT;
assign s_onewire_onecnt_d = rib.wdata[7:0];
assign s_onewire_onecnt_en = s_ribp_wr_hdshk && ribp.addr[7:0] == `RIBP_ONEWIRE_ONECNT;
assign s_onewire_onecnt_d = ribp.wdata[7:0];
dffer #(8) u_onewire_onecnt_dffer (
clk_i,
rst_n_i,
@@ -97,8 +97,8 @@ module rib_onewire (
s_onewire_onecnt_q
);
assign s_onewire_rstcnt_en = s_rib_wr_hdshk && rib.addr[7:0] == `RIB_ONEWIRE_RSTCNT;
assign s_onewire_rstcnt_d = rib.wdata[7:0];
assign s_onewire_rstcnt_en = s_ribp_wr_hdshk && ribp.addr[7:0] == `RIBP_ONEWIRE_RSTCNT;
assign s_onewire_rstcnt_d = ribp.wdata[7:0];
dffer #(8) u_onewire_rstcnt_dffer (
clk_i,
rst_n_i,
@@ -110,11 +110,11 @@ module rib_onewire (
always_comb begin
s_tx_push_valid = 1'b0;
s_tx_push_data = '0;
if (s_rib_wr_hdshk && rib.addr[7:0] == `RIB_ONEWIRE_TXDATA) begin
if (s_ribp_wr_hdshk && ribp.addr[7:0] == `RIBP_ONEWIRE_TXDATA) begin
s_tx_push_valid = 1'b1;
if (rib.wstrb[0]) s_tx_push_data[7:0] = rib.wdata[7:0];
if (rib.wstrb[1]) s_tx_push_data[15:8] = rib.wdata[15:8];
if (rib.wstrb[2]) s_tx_push_data[23:16] = rib.wdata[23:16];
if (ribp.wstrb[0]) s_tx_push_data[7:0] = ribp.wdata[7:0];
if (ribp.wstrb[1]) s_tx_push_data[15:8] = ribp.wdata[15:8];
if (ribp.wstrb[2]) s_tx_push_data[23:16] = ribp.wdata[23:16];
end
end
@@ -138,8 +138,8 @@ module rib_onewire (
// [0] clear fifo [1] start
always_comb begin
if (s_rib_wr_hdshk && rib.addr[7:0] == `RIB_ONEWIRE_CTRL) begin
s_onewire_ctrl_d = rib.wdata[1:0];
if (s_ribp_wr_hdshk && ribp.addr[7:0] == `RIBP_ONEWIRE_CTRL) begin
s_onewire_ctrl_d = ribp.wdata[1:0];
end else begin
s_onewire_ctrl_d = '0;
end
@@ -159,7 +159,7 @@ module rib_onewire (
s_onewire_status_d[2] = s_tx_empty;
if (s_done) begin
s_onewire_status_d[0] = 1'b1;
end else if (s_rib_rd_hdshk && rib.addr[7:0] == `RIB_ONEWIRE_STATUS) begin
end else if (s_ribp_rd_hdshk && ribp.addr[7:0] == `RIBP_ONEWIRE_STATUS) begin
s_onewire_status_d[0] = 1'b0;
end
end
@@ -170,32 +170,32 @@ module rib_onewire (
s_onewire_status_q
);
assign s_rib_ready_d = rib.valid && (~s_rib_ready_q);
dffr #(1) u_rib_ready_dffr (
assign s_ribp_ready_d = ribp.valid && (~s_ribp_ready_q);
dffr #(1) u_ribp_ready_dffr (
clk_i,
rst_n_i,
s_rib_ready_d,
s_rib_ready_q
s_ribp_ready_d,
s_ribp_ready_q
);
assign s_rib_rdata_en = s_rib_rd_hdshk;
assign s_ribp_rdata_en = s_ribp_rd_hdshk;
always_comb begin
s_rib_rdata_d = s_rib_rdata_q;
unique case (rib.addr[7:0])
`RIB_ONEWIRE_CLKDIV: s_rib_rdata_d = {24'd0, s_onewire_clkdiv_q};
`RIB_ONEWIRE_ZEROCNT: s_rib_rdata_d = {24'd0, s_onewire_zerocnt_q};
`RIB_ONEWIRE_ONECNT: s_rib_rdata_d = {24'd0, s_onewire_onecnt_q};
`RIB_ONEWIRE_RSTCNT: s_rib_rdata_d = {24'd0, s_onewire_rstcnt_q};
`RIB_ONEWIRE_STATUS: s_rib_rdata_d = {29'd0, s_onewire_status_q};
default: s_rib_rdata_d = s_rib_rdata_q;
s_ribp_rdata_d = s_ribp_rdata_q;
unique case (ribp.addr[7:0])
`RIBP_ONEWIRE_CLKDIV: s_ribp_rdata_d = {24'd0, s_onewire_clkdiv_q};
`RIBP_ONEWIRE_ZEROCNT: s_ribp_rdata_d = {24'd0, s_onewire_zerocnt_q};
`RIBP_ONEWIRE_ONECNT: s_ribp_rdata_d = {24'd0, s_onewire_onecnt_q};
`RIBP_ONEWIRE_RSTCNT: s_ribp_rdata_d = {24'd0, s_onewire_rstcnt_q};
`RIBP_ONEWIRE_STATUS: s_ribp_rdata_d = {29'd0, s_onewire_status_q};
default: s_ribp_rdata_d = s_ribp_rdata_q;
endcase
end
dffer #(32) u_rib_rdata_dffer (
dffer #(32) u_ribp_rdata_dffer (
clk_i,
rst_n_i,
s_rib_rdata_en,
s_rib_rdata_d,
s_rib_rdata_q
s_ribp_rdata_en,
s_ribp_rdata_d,
s_ribp_rdata_q
);
onewire_core u_onewire_core (
File renamed without changes.
@@ -29,29 +29,29 @@
// MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
// See the Mulan PSL v2 for more details.
`ifndef RIB_UART_DEF_SV
`define RIB_UART_DEF_SV
`ifndef RIBP_UART_DEF_SV
`define RIBP_UART_DEF_SV
// verilog_format: off
`define RIB_UART_DIV 8'h00
`define RIB_UART_DAT 8'h04
`define RIBP_UART_DIV 8'h00
`define RIBP_UART_DAT 8'h04
// verilog_format: on
`endif
module rib_uart (
module ribp_uart (
// verilog_format: off
input logic clk_i,
input logic rst_n_i,
rib_if.slave rib,
ribp_if.slave ribp,
uart_if.dut uart
// verilog_format: on
);
logic s_rib_wr_hdshk, s_rib_rd_hdshk;
logic s_rib_ready_d, s_rib_ready_q;
logic s_rib_rdata_en;
logic [31:0] s_rib_rdata_d, s_rib_rdata_q;
logic s_ribp_wr_hdshk, s_ribp_rd_hdshk;
logic s_ribp_ready_d, s_ribp_ready_q;
logic s_ribp_rdata_en;
logic [31:0] s_ribp_rdata_d, s_ribp_rdata_q;
logic s_uart_div_en;
logic [31:0] s_uart_div_d, s_uart_div_q;
@@ -69,21 +69,21 @@ module rib_uart (
logic r_send_dummy;
assign s_rib_wr_hdshk = rib.valid && (~s_rib_ready_q) && (|rib.wstrb);
assign s_rib_rd_hdshk = rib.valid && (~s_rib_ready_q) && (~(|rib.wstrb));
assign rib.ready = s_rib_ready_q;
assign rib.rdata = s_rib_rdata_q;
assign s_ribp_wr_hdshk = ribp.valid && (~s_ribp_ready_q) && (|ribp.wstrb);
assign s_ribp_rd_hdshk = ribp.valid && (~s_ribp_ready_q) && (~(|ribp.wstrb));
assign ribp.ready = s_ribp_ready_q;
assign ribp.rdata = s_ribp_rdata_q;
assign uart.tx_o = r_send_pattern[0];
assign uart.irq_o = r_recv_buf_valid;
assign uart.tx_o = r_send_pattern[0];
assign uart.irq_o = r_recv_buf_valid;
assign s_uart_div_en = s_rib_wr_hdshk && rib.addr[7:0] == `RIB_UART_DIV;
assign s_uart_div_en = s_ribp_wr_hdshk && ribp.addr[7:0] == `RIBP_UART_DIV;
always_comb begin
s_uart_div_d = s_uart_div_q;
if (rib.wstrb[0]) s_uart_div_d[7:0] = rib.wdata[7:0];
if (rib.wstrb[1]) s_uart_div_d[15:8] = rib.wdata[15:8];
if (rib.wstrb[2]) s_uart_div_d[23:16] = rib.wdata[23:16];
if (rib.wstrb[3]) s_uart_div_d[31:24] = rib.wdata[31:24];
if (ribp.wstrb[0]) s_uart_div_d[7:0] = ribp.wdata[7:0];
if (ribp.wstrb[1]) s_uart_div_d[15:8] = ribp.wdata[15:8];
if (ribp.wstrb[2]) s_uart_div_d[23:16] = ribp.wdata[23:16];
if (ribp.wstrb[3]) s_uart_div_d[31:24] = ribp.wdata[31:24];
end
dfferh #(32) u_uart_div_dfferh (
clk_i,
@@ -93,31 +93,31 @@ module rib_uart (
s_uart_div_q
);
assign s_uart_dat_en = s_rib_wr_hdshk && rib.addr[7:0] == `RIB_UART_DAT;
assign s_send_dat_wait = s_uart_dat_en && rib.wstrb[0] && ((|r_send_bitcnt) || r_send_dummy);
assign s_rib_ready_d = rib.valid && (~s_rib_ready_q) && (~s_send_dat_wait);
dffr #(1) u_rib_ready_dffr (
assign s_uart_dat_en = s_ribp_wr_hdshk && ribp.addr[7:0] == `RIBP_UART_DAT;
assign s_send_dat_wait = s_uart_dat_en && ribp.wstrb[0] && ((|r_send_bitcnt) || r_send_dummy);
assign s_ribp_ready_d = ribp.valid && (~s_ribp_ready_q) && (~s_send_dat_wait);
dffr #(1) u_ribp_ready_dffr (
clk_i,
rst_n_i,
s_rib_ready_d,
s_rib_ready_q
s_ribp_ready_d,
s_ribp_ready_q
);
assign s_rib_rdata_en = s_rib_rd_hdshk;
assign s_ribp_rdata_en = s_ribp_rd_hdshk;
always_comb begin
s_rib_rdata_d = s_rib_rdata_q;
unique case (rib.addr[7:0])
`RIB_UART_DIV: s_rib_rdata_d = s_uart_div_q;
`RIB_UART_DAT: s_rib_rdata_d = r_recv_buf_valid ? {24'd0, r_recv_buf_data} : '1;
default: s_rib_rdata_d = s_rib_rdata_q;
s_ribp_rdata_d = s_ribp_rdata_q;
unique case (ribp.addr[7:0])
`RIBP_UART_DIV: s_ribp_rdata_d = s_uart_div_q;
`RIBP_UART_DAT: s_ribp_rdata_d = r_recv_buf_valid ? {24'd0, r_recv_buf_data} : '1;
default: s_ribp_rdata_d = s_ribp_rdata_q;
endcase
end
dffer #(32) u_rib_rdata_dffer (
dffer #(32) u_ribp_rdata_dffer (
clk_i,
rst_n_i,
s_rib_rdata_en,
s_rib_rdata_d,
s_rib_rdata_q
s_ribp_rdata_en,
s_ribp_rdata_d,
s_ribp_rdata_q
);
@@ -175,11 +175,11 @@ module rib_uart (
r_send_bitcnt <= 4'd15;
r_send_divcnt <= '0;
r_send_dummy <= '0;
end else if (s_uart_dat_en && rib.wstrb[0] && (~(|r_send_bitcnt))) begin
r_send_pattern <= {1'b1, rib.wdata[7:0], 1'b0};
end else if (s_uart_dat_en && ribp.wstrb[0] && (~(|r_send_bitcnt))) begin
r_send_pattern <= {1'b1, ribp.wdata[7:0], 1'b0};
`ifndef SYNTHESIS
`ifdef SIMU_VERILATOR
$write("%c", rib.wdata[7:0]); // NOTE: just for verilator sim
$write("%c", ribp.wdata[7:0]); // NOTE: just for verilator sim
`endif
`endif
r_send_bitcnt <= 4'd10;
@@ -31,20 +31,20 @@ interface sdio_if ();
endinterface
module rib_sdio (
module ribp_sdio (
// verilog_format: off
input logic clk_i,
input logic rst_n_i,
rib_if.slave rib,
ribp_if.slave ribp,
sdio_if.dut sdio
// verilog_format: on
);
wire dummy0 = clk_i;
wire dummy1 = rst_n_i;
// rib
assign rib.rdata = '0;
assign rib.ready = '0;
// ribp
assign ribp.rdata = '0;
assign ribp.ready = '0;
// sdio
assign sdio.sck_o = '0;
assign sdio.cmd_oe_o = '0;
@@ -14,11 +14,11 @@
`include "mmap_define.svh"
module rib_spisd (
module ribp_spisd (
// verilog_format: off
input logic clk_i,
input logic rst_n_i,
rib_if.slave rib,
ribp_if.slave ribp,
spi_if.dut spi
// verilog_format: on
);
@@ -40,25 +40,25 @@ module rib_spisd (
logic [ 7:0] s_sd_wr_data;
logic s_sd_wr_busy;
rib_if u_cfg_rib_if ();
rib_if u_cache_rib_if ();
rib_if u_cache_mem_rib_if ();
rib_if u_cache_byp_rib_if ();
ribp_if u_cfg_ribp_if ();
ribp_if u_cache_ribp_if ();
ribp_if u_cache_mem_ribp_if ();
ribp_if u_cache_byp_ribp_if ();
// verilog_format: off
assign s_cfg_reg_sel = `SOC_ADDR_IS_RIB_SPISD(rib.addr);
assign u_cfg_rib_if.valid = rib.valid && s_cfg_reg_sel;
assign u_cfg_rib_if.addr = rib.addr;
assign u_cfg_rib_if.wdata = rib.wdata;
assign u_cfg_rib_if.wstrb = rib.wstrb;
assign s_cfg_reg_sel = `SOC_ADDR_IS_RIBP_SPISD(ribp.addr);
assign u_cfg_ribp_if.valid = ribp.valid && s_cfg_reg_sel;
assign u_cfg_ribp_if.addr = ribp.addr;
assign u_cfg_ribp_if.wdata = ribp.wdata;
assign u_cfg_ribp_if.wstrb = ribp.wstrb;
assign u_cache_mem_rib_if.valid = rib.valid && (~s_cfg_reg_sel);
assign u_cache_mem_rib_if.addr = rib.addr;
assign u_cache_mem_rib_if.wdata = rib.wdata;
assign u_cache_mem_rib_if.wstrb = rib.wstrb;
assign u_cache_mem_ribp_if.valid = ribp.valid && (~s_cfg_reg_sel);
assign u_cache_mem_ribp_if.addr = ribp.addr;
assign u_cache_mem_ribp_if.wdata = ribp.wdata;
assign u_cache_mem_ribp_if.wstrb = ribp.wstrb;
assign rib.ready = s_cfg_reg_sel ? u_cfg_rib_if.ready : u_cache_mem_rib_if.ready;
assign rib.rdata = s_cfg_reg_sel ? u_cfg_rib_if.rdata : u_cache_mem_rib_if.rdata;
assign ribp.ready = s_cfg_reg_sel ? u_cfg_ribp_if.ready : u_cache_mem_ribp_if.ready;
assign ribp.rdata = s_cfg_reg_sel ? u_cfg_ribp_if.rdata : u_cache_mem_ribp_if.rdata;
// verilog_format: on
spisd_reg u_spisd_reg (
@@ -69,20 +69,20 @@ module rib_spisd (
.wr_sync_done_i(s_wr_sync_done),
.mode_o (s_mode),
.clkdiv_o (s_clkdiv),
.rib (u_cfg_rib_if),
.byp_rib (u_cache_byp_rib_if)
.ribp (u_cfg_ribp_if),
.byp_rib (u_cache_byp_ribp_if)
);
assign u_cache_rib_if.valid = s_mode ? u_cache_byp_rib_if.valid : u_cache_mem_rib_if.valid;
assign u_cache_rib_if.addr = s_mode ? u_cache_byp_rib_if.addr : u_cache_mem_rib_if.addr;
assign u_cache_rib_if.wdata = s_mode ? u_cache_byp_rib_if.wdata : u_cache_mem_rib_if.wdata;
assign u_cache_rib_if.wstrb = s_mode ? u_cache_byp_rib_if.wstrb : u_cache_mem_rib_if.wstrb;
assign u_cache_ribp_if.valid = s_mode ? u_cache_byp_ribp_if.valid : u_cache_mem_ribp_if.valid;
assign u_cache_ribp_if.addr = s_mode ? u_cache_byp_ribp_if.addr : u_cache_mem_ribp_if.addr;
assign u_cache_ribp_if.wdata = s_mode ? u_cache_byp_ribp_if.wdata : u_cache_mem_ribp_if.wdata;
assign u_cache_ribp_if.wstrb = s_mode ? u_cache_byp_ribp_if.wstrb : u_cache_mem_ribp_if.wstrb;
assign u_cache_byp_rib_if.ready = s_mode ? u_cache_rib_if.ready : '0;
assign u_cache_byp_rib_if.rdata = s_mode ? u_cache_rib_if.rdata : '0;
assign u_cache_mem_rib_if.ready = ~s_mode ? u_cache_rib_if.ready : '0;
assign u_cache_mem_rib_if.rdata = ~s_mode ? u_cache_rib_if.rdata : '0;
assign u_cache_byp_ribp_if.ready = s_mode ? u_cache_ribp_if.ready : '0;
assign u_cache_byp_ribp_if.rdata = s_mode ? u_cache_ribp_if.rdata : '0;
assign u_cache_mem_ribp_if.ready = ~s_mode ? u_cache_ribp_if.ready : '0;
assign u_cache_mem_ribp_if.rdata = ~s_mode ? u_cache_ribp_if.rdata : '0;
spisd_cache u_spisd_cache (
.clk_i (clk_i),
.rst_n_i (rst_n_i),
@@ -100,7 +100,7 @@ module rib_spisd (
.sd_wr_data_req_i(s_sd_wr_data_req),
.sd_wr_data_o (s_sd_wr_data),
.sd_wr_busy_i (s_sd_wr_busy),
.rib (u_cache_rib_if)
.ribp (u_cache_ribp_if)
);
assign spi.irq_o = 1'b0; // TODO:
@@ -26,7 +26,7 @@ module spisd_cache (
input logic sd_wr_data_req_i,
output logic [7:0] sd_wr_data_o,
input logic sd_wr_busy_i,
rib_if.slave rib
ribp_if.slave ribp
// verilog_format: on
);
@@ -56,11 +56,11 @@ module spisd_cache (
// io
assign sd_wr_data_o = s_sd_wr_data_q;
assign rib.rdata = s_cache_data_q[s_cache_index];
assign ribp.rdata = s_cache_data_q[s_cache_index];
// cache
assign s_cache_index = rib.addr[8:2];
assign s_cache_mem_hit = ~mode_i && (rib.addr[27:9] == s_cache_tag_q[18:0]);
assign s_cache_byp_hit = mode_i && (rib.addr == s_cache_tag_q);
assign s_cache_index = ribp.addr[8:2];
assign s_cache_mem_hit = ~mode_i && (ribp.addr[27:9] == s_cache_tag_q[18:0]);
assign s_cache_byp_hit = mode_i && (ribp.addr == s_cache_tag_q);
always_comb begin
// cache
@@ -79,13 +79,13 @@ module spisd_cache (
s_sd_wr_data_d = s_sd_wr_data_q;
sd_addr_o = '0;
// mem_if
rib.ready = '0;
ribp.ready = '0;
// wr sync
wr_sync_done_o = '0;
unique case (s_cache_fsm_q)
FSM_IDLE: begin
if (init_done_i) begin
if (rib.valid) s_cache_fsm_d = FSM_COMP_TAG;
if (ribp.valid) s_cache_fsm_d = FSM_COMP_TAG;
// sw wr sync
else if (wr_sync_i && s_cache_dirty_q) begin
s_cache_fsm_d = FSM_WR_BACK;
@@ -98,26 +98,26 @@ module spisd_cache (
if ((s_cache_mem_hit || s_cache_byp_hit) && s_cache_valid_q) begin
if (s_wr_sync_q) wr_sync_done_o = 1'b1; // wr sync oper
else begin
rib.ready = 1'b1; // nomral oper
ribp.ready = 1'b1; // nomral oper
// write oper, set dirty
if (|rib.wstrb) begin
if (|ribp.wstrb) begin
s_cache_dirty_d = 1'b1;
if (rib.wstrb[0]) s_cache_data_d[s_cache_index][7:0] = rib.wdata[7:0];
if (rib.wstrb[1]) s_cache_data_d[s_cache_index][15:8] = rib.wdata[15:8];
if (rib.wstrb[2]) s_cache_data_d[s_cache_index][23:16] = rib.wdata[23:16];
if (rib.wstrb[3]) s_cache_data_d[s_cache_index][31:24] = rib.wdata[31:24];
if (ribp.wstrb[0]) s_cache_data_d[s_cache_index][7:0] = ribp.wdata[7:0];
if (ribp.wstrb[1]) s_cache_data_d[s_cache_index][15:8] = ribp.wdata[15:8];
if (ribp.wstrb[2]) s_cache_data_d[s_cache_index][23:16] = ribp.wdata[23:16];
if (ribp.wstrb[3]) s_cache_data_d[s_cache_index][31:24] = ribp.wdata[31:24];
end
end
s_cache_fsm_d = FSM_IDLE;
end else begin
// need to update tag line info
s_cache_valid_d = 1'b1;
s_cache_dirty_d = |rib.wstrb;
s_cache_dirty_d = |ribp.wstrb;
// tag line is clean
if (s_cache_valid_q == 1'b0 || s_cache_dirty_q == 1'b0) begin
s_cache_fsm_d = FSM_ALLOC;
if (~mode_i) s_cache_tag_d = {13'd0, rib.addr[27:9]};
else s_cache_tag_d = rib.addr;
if (~mode_i) s_cache_tag_d = {13'd0, ribp.addr[27:9]};
else s_cache_tag_d = ribp.addr;
end else begin
// need to flush data into sd card sectors
s_cache_fsm_d = FSM_WR_BACK;
@@ -159,8 +159,8 @@ module spisd_cache (
s_word_data_d = s_cache_data_q[s_line_cnt_d];
if (s_line_cnt_q == 7'd127) begin
s_cache_fsm_d = FSM_ALLOC;
if (~mode_i) s_cache_tag_d = {13'd0, rib.addr[27:9]};
else s_cache_tag_d = rib.addr;
if (~mode_i) s_cache_tag_d = {13'd0, ribp.addr[27:9]};
else s_cache_tag_d = ribp.addr;
end
end else begin
s_word_cnt_d = s_word_cnt_q + 1'b1;
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
+157
View File
@@ -0,0 +1,157 @@
// Copyright (c) 2023-2026 Yuchi Miao <miaoyuchi@ict.ac.cn>
// retroSoC is licensed under Mulan PSL v2.
// You can use this software according to the terms and conditions of the Mulan PSL v2.
// You may obtain a copy of Mulan PSL v2 at:
// http://license.coscl.org.cn/MulanPSL2
// THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
// EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
// MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
// See the Mulan PSL v2 for more details.
`ifndef RIBP_SPISD_DEF_SV
`define RIBP_SPISD_DEF_SV
// verilog_format: off
`define RIBP_SPISD_MODE 8'h00
`define RIBP_SPISD_CLKDIV 8'h04
`define RIBP_SPISD_ADDR 8'h08
`define RIBP_SPISD_TXDATA 8'h0C
`define RIBP_SPISD_RXDATA 8'h10
`define RIBP_SPISD_STATUS 8'h14
`define RIBP_SPISD_SYNC 8'h18
// verilog_format: on
`endif
module spisd_reg (
// verilog_format: off
input logic clk_i,
input logic rst_n_i,
input logic init_done_i,
output logic wr_sync_o,
input logic wr_sync_done_i,
output logic mode_o,
output logic [1:0] clkdiv_o,
ribp_if.slave ribp,
ribp_if.master byp_rib
// verilog_format: on
);
// ribp
logic s_ribp_wr_hdshk, s_ribp_rd_hdshk;
logic s_ribp_ready_d, s_ribp_ready_q;
logic s_ribp_rdata_en;
logic [31:0] s_ribp_rdata_d, s_ribp_rdata_q;
// reg
logic s_spisd_mode_en;
logic s_spisd_mode_d, s_spisd_mode_q;
logic s_spisd_clkdiv_en;
logic [1:0] s_spisd_clkdiv_d, s_spisd_clkdiv_q;
logic s_spisd_addr_en;
logic [31:0] s_spisd_addr_d, s_spisd_addr_q;
logic [1:0] s_spisd_status_d, s_spisd_status_q;
// common
logic s_wr_byp, s_rd_byp;
// ribp
assign s_ribp_wr_hdshk = ribp.valid && (~s_ribp_ready_q) && (|ribp.wstrb);
assign s_ribp_rd_hdshk = ribp.valid && (~s_ribp_ready_q) && (~(|ribp.wstrb));
assign s_wr_byp = s_ribp_wr_hdshk && ribp.addr[7:0] == `RIBP_SPISD_TXDATA;
assign s_rd_byp = s_ribp_rd_hdshk && ribp.addr[7:0] == `RIBP_SPISD_RXDATA;
assign ribp.ready = (s_wr_byp || s_rd_byp) ? byp_rib.ready : s_ribp_ready_q;
assign ribp.rdata = (s_wr_byp || s_rd_byp) ? byp_rib.rdata : s_ribp_rdata_q;
// common
assign mode_o = s_spisd_mode_q;
assign clkdiv_o = s_spisd_clkdiv_q;
// byp
assign byp_rib.valid = s_wr_byp || s_rd_byp;
assign byp_rib.addr = s_spisd_addr_q;
assign byp_rib.wdata = ribp.wdata;
assign byp_rib.wstrb = ribp.wstrb;
assign s_spisd_mode_en = s_ribp_wr_hdshk && ribp.addr[7:0] == `RIBP_SPISD_MODE;
assign s_spisd_mode_d = ribp.wdata[0];
dffer #(1) u_spisd_mode_dffer (
clk_i,
rst_n_i,
s_spisd_mode_en,
s_spisd_mode_d,
s_spisd_mode_q
);
assign s_spisd_clkdiv_en = s_ribp_wr_hdshk && ribp.addr[7:0] == `RIBP_SPISD_CLKDIV;
assign s_spisd_clkdiv_d = ribp.wdata[1:0];
dffer #(2) u_spisd_clkdiv_dffer (
clk_i,
rst_n_i,
s_spisd_clkdiv_en,
s_spisd_clkdiv_d,
s_spisd_clkdiv_q
);
assign s_spisd_addr_en = s_ribp_wr_hdshk && ribp.addr[7:0] == `RIBP_SPISD_ADDR;
always_comb begin
s_spisd_addr_d = s_spisd_addr_q;
if (ribp.wstrb[0]) s_spisd_addr_d[7:0] = ribp.wdata[7:0];
if (ribp.wstrb[1]) s_spisd_addr_d[15:8] = ribp.wdata[15:8];
if (ribp.wstrb[2]) s_spisd_addr_d[23:16] = ribp.wdata[23:16];
if (ribp.wstrb[3]) s_spisd_addr_d[31:24] = ribp.wdata[31:24];
end
dffer #(32) u_spisd_addr_dffer (
clk_i,
rst_n_i,
s_spisd_addr_en,
s_spisd_addr_d,
s_spisd_addr_q
);
// 0: init done
// 1: wr sync done
always_comb begin
s_spisd_status_d = s_spisd_status_q;
s_spisd_status_d[0] = init_done_i;
if (wr_sync_done_i && ~s_spisd_status_q[1]) begin
s_spisd_status_d[1] = 1'b1;
end else if (s_spisd_status_q[1] && s_ribp_rd_hdshk && ribp.addr[7:0] == `RIBP_SPISD_STATUS) begin
s_spisd_status_d[1] = 1'b0;
end
end
dffr #(2) u_spisd_status_dffr (
clk_i,
rst_n_i,
s_spisd_status_d,
s_spisd_status_q
);
// software wr sync
assign wr_sync_o = s_ribp_wr_hdshk && ribp.addr[7:0] == `RIBP_SPISD_SYNC;
assign s_ribp_ready_d = ribp.valid && (~s_ribp_ready_q);
dffr #(1) u_ribp_ready_dffr (
clk_i,
rst_n_i,
s_ribp_ready_d,
s_ribp_ready_q
);
assign s_ribp_rdata_en = s_ribp_rd_hdshk;
always_comb begin
s_ribp_rdata_d = s_ribp_rdata_q;
unique case (ribp.addr[7:0])
`RIBP_SPISD_MODE: s_ribp_rdata_d = {31'd0, s_spisd_mode_q};
`RIBP_SPISD_CLKDIV: s_ribp_rdata_d = {30'd0, s_spisd_clkdiv_q};
`RIBP_SPISD_ADDR: s_ribp_rdata_d = s_spisd_addr_q;
`RIBP_SPISD_STATUS: s_ribp_rdata_d = {30'd0, s_spisd_status_q};
default: s_ribp_rdata_d = s_ribp_rdata_q;
endcase
end
dffer #(32) u_ribp_rdata_dffer (
clk_i,
rst_n_i,
s_ribp_rdata_en,
s_ribp_rdata_d,
s_ribp_rdata_q
);
endmodule
File renamed without changes.
@@ -29,14 +29,14 @@ interface xpi_if ();
);
endinterface
module rib_xpi (
module ribp_xpi (
// verilog_format: off
input logic clk_i,
input logic rst_n_i,
input logic dma_xfer_done_i,
output logic dma_tx_stall_o,
output logic dma_rx_stall_o,
rib_if.slave rib,
ribp_if.slave ribp,
xpi_if.dut xpi
// verilog_format: on
);
@@ -102,28 +102,28 @@ module rib_xpi (
// ctrl
logic s_reg_xfer_start, s_xfer_done;
// interface
rib_if u_reg_rib_if ();
rib_if u_mm_rib_if ();
ribp_if u_reg_ribp_if ();
ribp_if u_mm_ribp_if ();
// rib mux
assign s_xpi_mm_sel = `SOC_ADDR_IS_FLASH(rib.addr) || `SOC_ADDR_IS_XPI(rib.addr);
assign u_reg_rib_if.valid = rib.valid && (~s_xpi_mm_sel);
assign u_reg_rib_if.addr = rib.addr;
assign u_reg_rib_if.wdata = rib.wdata;
assign u_reg_rib_if.wstrb = rib.wstrb;
// ribp mux
assign s_xpi_mm_sel = `SOC_ADDR_IS_FLASH(ribp.addr) || `SOC_ADDR_IS_XPI(ribp.addr);
assign u_reg_ribp_if.valid = ribp.valid && (~s_xpi_mm_sel);
assign u_reg_ribp_if.addr = ribp.addr;
assign u_reg_ribp_if.wdata = ribp.wdata;
assign u_reg_ribp_if.wstrb = ribp.wstrb;
assign u_mm_rib_if.valid = rib.valid && s_xpi_mm_sel;
assign u_mm_rib_if.addr = rib.addr;
assign u_mm_rib_if.wdata = rib.wdata;
assign u_mm_rib_if.wstrb = rib.wstrb;
assign u_mm_ribp_if.valid = ribp.valid && s_xpi_mm_sel;
assign u_mm_ribp_if.addr = ribp.addr;
assign u_mm_ribp_if.wdata = ribp.wdata;
assign u_mm_ribp_if.wstrb = ribp.wstrb;
// verilog_format: off
assign rib.ready = (u_reg_rib_if.valid & u_reg_rib_if.ready) |
(u_mm_rib_if.valid & u_mm_rib_if.ready);
assign ribp.ready = (u_reg_ribp_if.valid & u_reg_ribp_if.ready) |
(u_mm_ribp_if.valid & u_mm_ribp_if.ready);
assign rib.rdata = ({32{(u_reg_rib_if.valid & u_reg_rib_if.ready)}} & u_reg_rib_if.rdata) |
({32{(u_mm_rib_if.valid & u_mm_rib_if.ready)}} & u_mm_rib_if.rdata);
assign ribp.rdata = ({32{(u_reg_ribp_if.valid & u_reg_ribp_if.ready)}} & u_reg_ribp_if.rdata) |
({32{(u_mm_ribp_if.valid & u_mm_ribp_if.ready)}} & u_mm_ribp_if.rdata);
// verilog_format: on
// reg/mm mode nss
@@ -181,7 +181,7 @@ module rib_xpi (
// dma
.dma_tx_stall_o (dma_tx_stall_o),
.dma_rx_stall_o (dma_rx_stall_o),
.rib (u_reg_rib_if)
.ribp (u_reg_ribp_if)
);
@@ -206,7 +206,7 @@ module rib_xpi (
.rx_pop_ready_i (s_rx_pop_ready),
// ctrl
.xfer_done_i (s_xfer_done),
.rib (u_mm_rib_if)
.ribp (u_mm_ribp_if)
);
@@ -255,7 +255,7 @@ module rib_xpi (
.nss_i(s_xpi_nss),
.mode_i(s_xpi_mode[s_xpi_nss]),
.clkdiv_i(s_xpi_clkdiv[s_xpi_nss]),
.rdwr_i(u_mm_rib_if.valid ? s_xpi_mm_rdwr : s_xpi_rdwr[s_xpi_nss]),
.rdwr_i(u_mm_ribp_if.valid ? s_xpi_mm_rdwr : s_xpi_rdwr[s_xpi_nss]),
.revdat_i(s_xpi_revdat[s_xpi_nss]),
.cmdtyp_i(s_xpi_cmdtyp[s_xpi_nss]),
.cmdlen_i(s_xpi_cmdlen[s_xpi_nss]),
@@ -263,12 +263,12 @@ module rib_xpi (
.adrtyp_i(s_xpi_adrtyp[s_xpi_nss]),
.adrlen_i(s_xpi_adrlen[s_xpi_nss]),
// HACK:
.adrdat_i(u_mm_rib_if.valid ? {s_xpi_mm_addr[23:0], 8'hF0} : s_xpi_adrdat[s_xpi_nss]),
.adrdat_i(u_mm_ribp_if.valid ? {s_xpi_mm_addr[23:0], 8'hF0} : s_xpi_adrdat[s_xpi_nss]),
.tdulen_i(s_xpi_tdulen[s_xpi_nss]),
.rdulen_i(s_xpi_rdulen[s_xpi_nss]),
.dattyp_i(s_xpi_dattyp[s_xpi_nss]),
.datlen_i(s_xpi_datlen[s_xpi_nss]), // NOTE:
.datbit_i(u_mm_rib_if.valid ? s_xpi_mm_xfer_byte : s_xpi_datbit[s_xpi_nss]),
.datbit_i(u_mm_ribp_if.valid ? s_xpi_mm_xfer_byte : s_xpi_datbit[s_xpi_nss]),
.hlvlen_i(s_xpi_hlvlen[s_xpi_nss]),
.tx_data_req_o(s_tx_pop_valid),
.tx_data_rdy_i(s_tx_pop_ready),
@@ -276,7 +276,7 @@ module rib_xpi (
.rx_data_req_o(s_rx_push_valid),
.rx_data_rdy_i(s_rx_push_ready),
.rx_data_o(s_rx_push_data),
.start_i(u_mm_rib_if.valid ? s_xpi_mm_req : s_reg_xfer_start),
.start_i(u_mm_ribp_if.valid ? s_xpi_mm_req : s_reg_xfer_start),
.done_o(s_xfer_done),
.tx_elem_num_i(s_tx_elem_num[7:0]),
.dma_xfer_done_i(dma_xfer_done_i),
File renamed without changes.
File renamed without changes.
+58
View File
@@ -0,0 +1,58 @@
// Copyright (c) 2023-2026 Yuchi Miao <miaoyuchi@ict.ac.cn>
// retroSoC is licensed under Mulan PSL v2.
// You can use this software according to the terms and conditions of the Mulan PSL v2.
// You may obtain a copy of Mulan PSL v2 at:
// http://license.coscl.org.cn/MulanPSL2
// THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
// EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
// MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
// See the Mulan PSL v2 for more details.
`ifndef RIBP_XPI_DEF_SV
`define RIBP_XPI_DEF_SV
// verilog_format: off
`define RIBP_XPI_CFGIDX 8'h00
`define RIBP_XPI_ACCMD 8'h04
`define RIBP_XPI_MMSTAD 8'h08
`define RIBP_XPI_MMOFFST 8'h0C
`define RIBP_XPI_MODE 8'h10
`define RIBP_XPI_NSS 8'h14
`define RIBP_XPI_CLKDIV 8'h18
`define RIBP_XPI_RDWR 8'h1C
`define RIBP_XPI_REVDAT 8'h20
`define RIBP_XPI_TXUPB 8'h24
`define RIBP_XPI_TXLOWB 8'h28
`define RIBP_XPI_RXUPB 8'h2C
`define RIBP_XPI_RXLOWB 8'h30
`define RIBP_XPI_FLUSH 8'h34
`define RIBP_XPI_CMDTYP 8'h38
`define RIBP_XPI_CMDLEN 8'h3C
`define RIBP_XPI_CMDDAT 8'h40
`define RIBP_XPI_ADRTYP 8'h44
`define RIBP_XPI_ADRLEN 8'h48
`define RIBP_XPI_ADRDAT 8'h4C
`define RIBP_XPI_ALTTYP 8'h50
`define RIBP_XPI_ALTLEN 8'h54
`define RIBP_XPI_ALTDAT 8'h58
`define RIBP_XPI_TDULEN 8'h5C
`define RIBP_XPI_RDULEN 8'h60
`define RIBP_XPI_DATTYP 8'h64
`define RIBP_XPI_DATLEN 8'h68
`define RIBP_XPI_DATBIT 8'h6C
`define RIBP_XPI_HLVLEN 8'h70
`define RIBP_XPI_TXDATA 8'h74
`define RIBP_XPI_RXDATA 8'h78
`define RIBP_XPI_XST 8'h7C
`define RIBP_XPI_STATUS 8'h80
`define XPI_TYPE_NONE 2'd0
`define XPI_TYPE_SNGL 2'd1
`define XPI_TYPE_DUAL 2'd2
`define XPI_TYPE_QUAD 2'd3
`define XPI_NSS_NUM 4
`define XPI_LNS_NUM $clog2(`XPI_NSS_NUM)
// verilog_format: on
`endif
@@ -32,7 +32,7 @@ module xpi_mm (
input logic rx_pop_ready_i,
// ctrl
input logic xfer_done_i,
rib_if.slave rib
ribp_if.slave ribp
// verilog_format: on
);
// verilog_format: off
@@ -43,11 +43,11 @@ module xpi_mm (
localparam FSM_RD = 3'd4;
// verilog_format: on
// rib
logic s_rib_wr_hdshk, s_rib_rd_hdshk;
logic s_rib_ready_d, s_rib_ready_q;
logic s_rib_rdata_en;
logic [31:0] s_rib_rdata_d, s_rib_rdata_q;
// ribp
logic s_ribp_wr_hdshk, s_ribp_rd_hdshk;
logic s_ribp_ready_d, s_ribp_ready_q;
logic s_ribp_rdata_en;
logic [31:0] s_ribp_rdata_d, s_ribp_rdata_q;
// ctrl
logic r_rd_st;
logic r_wr_st;
@@ -62,34 +62,34 @@ module xpi_mm (
logic s_mem_valid_re;
logic [`XPI_LNS_NUM-1:0] s_nss_d, s_nss_q;
// rib
assign s_rib_wr_hdshk = rib.valid && (~s_rib_ready_q) && (|rib.wstrb);
assign s_rib_rd_hdshk = rib.valid && (~s_rib_ready_q) && (~(|rib.wstrb));
assign rib.ready = s_rib_ready_q;
assign rib.rdata = s_rib_rdata_q;
// rib rd
// ribp
assign s_ribp_wr_hdshk = ribp.valid && (~s_ribp_ready_q) && (|ribp.wstrb);
assign s_ribp_rd_hdshk = ribp.valid && (~s_ribp_ready_q) && (~(|ribp.wstrb));
assign ribp.ready = s_ribp_ready_q;
assign ribp.rdata = s_ribp_rdata_q;
// ribp rd
always_comb begin
if (s_rib_rd_hdshk) s_rib_ready_d = rx_pop_ready_i;
else if (s_rib_wr_hdshk) s_rib_ready_d = xfer_done_i;
else s_rib_ready_d = 1'b0;
if (s_ribp_rd_hdshk) s_ribp_ready_d = rx_pop_ready_i;
else if (s_ribp_wr_hdshk) s_ribp_ready_d = xfer_done_i;
else s_ribp_ready_d = 1'b0;
end
dffr #(1) u_rib_ready_dffr (
dffr #(1) u_ribp_ready_dffr (
clk_i,
rst_n_i,
s_rib_ready_d,
s_rib_ready_q
s_ribp_ready_d,
s_ribp_ready_q
);
assign rx_pop_valid_o = s_rib_rd_hdshk;
assign s_rib_rdata_en = s_rib_rd_hdshk;
assign s_rib_rdata_d = (rib.valid && rx_pop_ready_i) ? rx_pop_data_i : s_rib_rdata_q;
dffer #(32) u_rib_rdata_dffer (
assign rx_pop_valid_o = s_ribp_rd_hdshk;
assign s_ribp_rdata_en = s_ribp_rd_hdshk;
assign s_ribp_rdata_d = (ribp.valid && rx_pop_ready_i) ? rx_pop_data_i : s_ribp_rdata_q;
dffer #(32) u_ribp_rdata_dffer (
clk_i,
rst_n_i,
s_rib_rdata_en,
s_rib_rdata_d,
s_rib_rdata_q
s_ribp_rdata_en,
s_ribp_rdata_d,
s_ribp_rdata_q
);
@@ -109,7 +109,7 @@ module xpi_mm (
always_comb begin
s_nss_d = s_nss_q;
for (int i = 0; i < `XPI_NSS_NUM; i++) begin
if (xpi_mmstad_i[i] <= rib.addr && rib.addr <= xpi_mmstad_i[i] + xpi_mmoffst_i[i]) begin
if (xpi_mmstad_i[i] <= ribp.addr && ribp.addr <= xpi_mmstad_i[i] + xpi_mmoffst_i[i]) begin
s_nss_d = `XPI_LNS_NUM'(i);
break;
end
@@ -128,7 +128,7 @@ module xpi_mm (
edge_det_sync_re #(1) u_mem_valid_edge_det_sync_re (
clk_i,
rst_n_i,
rib.valid,
ribp.valid,
s_mem_valid_re
);
@@ -145,15 +145,15 @@ module xpi_mm (
unique case (r_fsm_state)
FSM_IDLE: begin
if (s_mem_valid_re) begin
if (|rib.wstrb) begin
if (|ribp.wstrb) begin
r_fsm_state <= FSM_WE_ST;
r_addr <= {4'd0, rib.addr[27:0]} + {30'd0, s_disp_addr_ofst};
r_addr <= {4'd0, ribp.addr[27:0]} + {30'd0, s_disp_addr_ofst};
r_wr_data <= s_disp_wdata;
r_xfer_byte_cnt <= s_disp_byte_cnt;
end else begin
r_fsm_state <= FSM_RD_ST;
r_addr <= {4'd0, rib.addr[27:0]};
r_wr_data <= rib.wdata; // NOTE: no used
r_addr <= {4'd0, ribp.addr[27:0]};
r_wr_data <= ribp.wdata; // NOTE: no used
r_xfer_byte_cnt <= 3'd4;
end
end
@@ -192,8 +192,8 @@ module xpi_mm (
end
xfer_dispatcher u_xfer_dispatcher (
.wstrb_i (rib.wstrb),
.wdata_i (rib.wdata),
.wstrb_i (ribp.wstrb),
.wdata_i (ribp.wdata),
.addr_ofst_o (s_disp_addr_ofst),
.xfer_byte_cnt_o(s_disp_byte_cnt),
.wdata_o (s_disp_wdata)
@@ -58,15 +58,15 @@ module xpi_reg (
// dma
output logic dma_tx_stall_o,
output logic dma_rx_stall_o,
rib_if.slave rib
ribp_if.slave ribp
// verilog_format: on
);
// rib
logic s_rib_wr_hdshk, s_rib_rd_hdshk;
logic s_rib_ready_d, s_rib_ready_q;
logic s_rib_rdata_en;
logic [31:0] s_rib_rdata_d, s_rib_rdata_q;
// ribp
logic s_ribp_wr_hdshk, s_ribp_rd_hdshk;
logic s_ribp_ready_d, s_ribp_ready_q;
logic s_ribp_rdata_en;
logic [31:0] s_ribp_rdata_d, s_ribp_rdata_q;
// cfgidx
logic s_xpi_cfgidx_en;
logic [`XPI_LNS_NUM-1:0] s_xpi_cfgidx_d;
@@ -189,11 +189,11 @@ module xpi_reg (
logic s_tx_fifo_stall_d, s_tx_fifo_stall_q;
logic s_rx_fifo_stall_d, s_rx_fifo_stall_q;
// rib
assign s_rib_wr_hdshk = rib.valid && (~s_rib_ready_q) && (|rib.wstrb);
assign s_rib_rd_hdshk = rib.valid && (~s_rib_ready_q) && (~(|rib.wstrb));
assign rib.ready = s_rib_ready_q;
assign rib.rdata = s_rib_rdata_q;
// ribp
assign s_ribp_wr_hdshk = ribp.valid && (~s_ribp_ready_q) && (|ribp.wstrb);
assign s_ribp_rd_hdshk = ribp.valid && (~s_ribp_ready_q) && (~(|ribp.wstrb));
assign ribp.ready = s_ribp_ready_q;
assign ribp.rdata = s_ribp_rdata_q;
// reg
assign xpi_accmd_o = s_xpi_accmd_q;
assign xpi_mmstad_o = s_xpi_mmstad_q;
@@ -225,8 +225,8 @@ module xpi_reg (
assign dma_rx_stall_o = s_rx_fifo_stall_q;
assign s_xpi_cfgidx_en = s_rib_wr_hdshk && rib.addr[7:0] == `RIB_XPI_CFGIDX;
assign s_xpi_cfgidx_d = rib.wdata[`XPI_LNS_NUM-1:0];
assign s_xpi_cfgidx_en = s_ribp_wr_hdshk && ribp.addr[7:0] == `RIBP_XPI_CFGIDX;
assign s_xpi_cfgidx_d = ribp.wdata[`XPI_LNS_NUM-1:0];
dffer #(`XPI_LNS_NUM) u_xpi_cfgidx_dffer (
clk_i,
rst_n_i,
@@ -237,8 +237,8 @@ module xpi_reg (
for (genvar i = 0; i < `XPI_NSS_NUM; i++) begin : XPI_ACCMD_BLOCK
assign s_xpi_accmd_en[i] = s_rib_wr_hdshk && rib.addr[7:0] == `RIB_XPI_ACCMD && `XPI_LNS_NUM'(i) == s_xpi_cfgidx_q;
assign s_xpi_accmd_d[i] = rib.wdata[0];
assign s_xpi_accmd_en[i] = s_ribp_wr_hdshk && ribp.addr[7:0] == `RIBP_XPI_ACCMD && `XPI_LNS_NUM'(i) == s_xpi_cfgidx_q;
assign s_xpi_accmd_d[i] = ribp.wdata[0];
end
dfferm #(`XPI_NSS_NUM, 1, 1'b1) u_xpi_accmd_dfferm (
clk_i,
@@ -251,13 +251,13 @@ module xpi_reg (
// 5000_0000 - 5FFF_FFFF
for (genvar i = 0; i < `XPI_NSS_NUM; i++) begin : XPI_MMSTAD_BLOCK
assign s_xpi_mmstad_en[i] = s_rib_wr_hdshk && rib.addr[7:0] == `RIB_XPI_MMSTAD && `XPI_LNS_NUM'(i) == s_xpi_cfgidx_q;
assign s_xpi_mmstad_en[i] = s_ribp_wr_hdshk && ribp.addr[7:0] == `RIBP_XPI_MMSTAD && `XPI_LNS_NUM'(i) == s_xpi_cfgidx_q;
always_comb begin
s_xpi_mmstad_d[i] = s_xpi_mmstad_q[i];
if (rib.wstrb[0]) s_xpi_mmstad_d[i][7:0] = rib.wdata[7:0];
if (rib.wstrb[1]) s_xpi_mmstad_d[i][15:8] = rib.wdata[15:8];
if (rib.wstrb[2]) s_xpi_mmstad_d[i][23:16] = rib.wdata[23:16];
if (rib.wstrb[3]) s_xpi_mmstad_d[i][31:24] = rib.wdata[31:24];
if (ribp.wstrb[0]) s_xpi_mmstad_d[i][7:0] = ribp.wdata[7:0];
if (ribp.wstrb[1]) s_xpi_mmstad_d[i][15:8] = ribp.wdata[15:8];
if (ribp.wstrb[2]) s_xpi_mmstad_d[i][23:16] = ribp.wdata[23:16];
if (ribp.wstrb[3]) s_xpi_mmstad_d[i][31:24] = ribp.wdata[31:24];
end
end
dfferm #(`XPI_NSS_NUM, 32, 32'd0) u_xpi_mmdstad_dfferm (
@@ -270,13 +270,13 @@ module xpi_reg (
for (genvar i = 0; i < `XPI_NSS_NUM; i++) begin : XPI_MMOFFST_BLOCK
assign s_xpi_mmoffst_en[i] = s_rib_wr_hdshk && rib.addr[7:0] == `RIB_XPI_MMOFFST && `XPI_LNS_NUM'(i) == s_xpi_cfgidx_q;
assign s_xpi_mmoffst_en[i] = s_ribp_wr_hdshk && ribp.addr[7:0] == `RIBP_XPI_MMOFFST && `XPI_LNS_NUM'(i) == s_xpi_cfgidx_q;
always_comb begin
s_xpi_mmoffst_d[i] = s_xpi_mmoffst_q[i];
if (rib.wstrb[0]) s_xpi_mmoffst_d[i][7:0] = rib.wdata[7:0];
if (rib.wstrb[1]) s_xpi_mmoffst_d[i][15:8] = rib.wdata[15:8];
if (rib.wstrb[2]) s_xpi_mmoffst_d[i][23:16] = rib.wdata[23:16];
if (rib.wstrb[3]) s_xpi_mmoffst_d[i][31:24] = rib.wdata[31:24];
if (ribp.wstrb[0]) s_xpi_mmoffst_d[i][7:0] = ribp.wdata[7:0];
if (ribp.wstrb[1]) s_xpi_mmoffst_d[i][15:8] = ribp.wdata[15:8];
if (ribp.wstrb[2]) s_xpi_mmoffst_d[i][23:16] = ribp.wdata[23:16];
if (ribp.wstrb[3]) s_xpi_mmoffst_d[i][31:24] = ribp.wdata[31:24];
end
end
dfferm #(`XPI_NSS_NUM, 32, 32'h0200_0000) u_xpi_mmoffst_dfferm (
@@ -289,8 +289,8 @@ module xpi_reg (
for (genvar i = 0; i < `XPI_NSS_NUM; i++) begin : XPI_MODE_BLOCK
assign s_xpi_mode_en[i] = s_rib_wr_hdshk && rib.addr[7:0] == `RIB_XPI_MODE && `XPI_LNS_NUM'(i) == s_xpi_cfgidx_q;
assign s_xpi_mode_d[i] = rib.wdata[0];
assign s_xpi_mode_en[i] = s_ribp_wr_hdshk && ribp.addr[7:0] == `RIBP_XPI_MODE && `XPI_LNS_NUM'(i) == s_xpi_cfgidx_q;
assign s_xpi_mode_d[i] = ribp.wdata[0];
end
dfferm #(`XPI_NSS_NUM, 1, 1'b0) u_xpi_mode_dfferm (
clk_i,
@@ -301,8 +301,8 @@ module xpi_reg (
);
assign s_xpi_nss_en = s_rib_wr_hdshk && rib.addr[7:0] == `RIB_XPI_NSS;
assign s_xpi_nss_d = rib.wdata[`XPI_LNS_NUM-1:0];
assign s_xpi_nss_en = s_ribp_wr_hdshk && ribp.addr[7:0] == `RIBP_XPI_NSS;
assign s_xpi_nss_d = ribp.wdata[`XPI_LNS_NUM-1:0];
dffer #(`XPI_LNS_NUM) u_xpi_nss_dffer (
clk_i,
rst_n_i,
@@ -313,8 +313,8 @@ module xpi_reg (
for (genvar i = 0; i < `XPI_NSS_NUM; i++) begin : XPI_CLKDIV_BLOCK
assign s_xpi_clkdiv_en[i] = s_rib_wr_hdshk && rib.addr[7:0] == `RIB_XPI_CLKDIV && `XPI_LNS_NUM'(i) == s_xpi_cfgidx_q;
assign s_xpi_clkdiv_d[i] = rib.wdata[7:0];
assign s_xpi_clkdiv_en[i] = s_ribp_wr_hdshk && ribp.addr[7:0] == `RIBP_XPI_CLKDIV && `XPI_LNS_NUM'(i) == s_xpi_cfgidx_q;
assign s_xpi_clkdiv_d[i] = ribp.wdata[7:0];
end
dfferm #(`XPI_NSS_NUM, 8, 8'd0) u_xpi_clkdiv_dfferm (
clk_i,
@@ -326,8 +326,8 @@ module xpi_reg (
for (genvar i = 0; i < `XPI_NSS_NUM; i++) begin : XPI_RDWR_BLOCK
assign s_xpi_rdwr_en[i] = s_rib_wr_hdshk && rib.addr[7:0] == `RIB_XPI_RDWR && `XPI_LNS_NUM'(i) == s_xpi_cfgidx_q;
assign s_xpi_rdwr_d[i] = rib.wdata[0];
assign s_xpi_rdwr_en[i] = s_ribp_wr_hdshk && ribp.addr[7:0] == `RIBP_XPI_RDWR && `XPI_LNS_NUM'(i) == s_xpi_cfgidx_q;
assign s_xpi_rdwr_d[i] = ribp.wdata[0];
end
dfferm #(`XPI_NSS_NUM, 1, 1'b1) u_xpi_rdwr_dfferm (
clk_i,
@@ -339,8 +339,8 @@ module xpi_reg (
for (genvar i = 0; i < `XPI_NSS_NUM; i++) begin : XPI_REVDAT_BLOCK
assign s_xpi_revdat_en[i] = s_rib_wr_hdshk && rib.addr[7:0] == `RIB_XPI_REVDAT && `XPI_LNS_NUM'(i) == s_xpi_cfgidx_q;
assign s_xpi_revdat_d[i] = rib.wdata[0];
assign s_xpi_revdat_en[i] = s_ribp_wr_hdshk && ribp.addr[7:0] == `RIBP_XPI_REVDAT && `XPI_LNS_NUM'(i) == s_xpi_cfgidx_q;
assign s_xpi_revdat_d[i] = ribp.wdata[0];
end
dfferm #(`XPI_NSS_NUM, 1, 1'b0) u_xpi_revdat_dfferm (
clk_i,
@@ -352,8 +352,8 @@ module xpi_reg (
for (genvar i = 0; i < `XPI_NSS_NUM; i++) begin : XPI_TXUPB_BLOCK
assign s_xpi_txupb_en[i] = s_rib_wr_hdshk && rib.addr[7:0] == `RIB_XPI_TXUPB && `XPI_LNS_NUM'(i) == s_xpi_cfgidx_q;
assign s_xpi_txupb_d[i] = rib.wdata[7:0];
assign s_xpi_txupb_en[i] = s_ribp_wr_hdshk && ribp.addr[7:0] == `RIBP_XPI_TXUPB && `XPI_LNS_NUM'(i) == s_xpi_cfgidx_q;
assign s_xpi_txupb_d[i] = ribp.wdata[7:0];
end
dfferm #(`XPI_NSS_NUM, 8, 8'd0) u_xpi_txupb_dfferm (
clk_i,
@@ -365,8 +365,8 @@ module xpi_reg (
for (genvar i = 0; i < `XPI_NSS_NUM; i++) begin : XPI_TXLOWB_BLOCK
assign s_xpi_txlowb_en[i] = s_rib_wr_hdshk && rib.addr[7:0] == `RIB_XPI_TXLOWB && `XPI_LNS_NUM'(i) == s_xpi_cfgidx_q;
assign s_xpi_txlowb_d[i] = rib.wdata[7:0];
assign s_xpi_txlowb_en[i] = s_ribp_wr_hdshk && ribp.addr[7:0] == `RIBP_XPI_TXLOWB && `XPI_LNS_NUM'(i) == s_xpi_cfgidx_q;
assign s_xpi_txlowb_d[i] = ribp.wdata[7:0];
end
dfferm #(`XPI_NSS_NUM, 8, 8'd0) u_xpi_txlowb_dfferm (
clk_i,
@@ -378,8 +378,8 @@ module xpi_reg (
for (genvar i = 0; i < `XPI_NSS_NUM; i++) begin : XPI_RXUPB_BLOCK
assign s_xpi_rxupb_en[i] = s_rib_wr_hdshk && rib.addr[7:0] == `RIB_XPI_RXUPB && `XPI_LNS_NUM'(i) == s_xpi_cfgidx_q;
assign s_xpi_rxupb_d[i] = rib.wdata[5:0];
assign s_xpi_rxupb_en[i] = s_ribp_wr_hdshk && ribp.addr[7:0] == `RIBP_XPI_RXUPB && `XPI_LNS_NUM'(i) == s_xpi_cfgidx_q;
assign s_xpi_rxupb_d[i] = ribp.wdata[5:0];
end
dfferm #(`XPI_NSS_NUM, 6, 6'd0) u_xpi_rxupb_dfferm (
clk_i,
@@ -391,8 +391,8 @@ module xpi_reg (
for (genvar i = 0; i < `XPI_NSS_NUM; i++) begin : XPI_RXLOWB_BLOCK
assign s_xpi_rxlowb_en[i] = s_rib_wr_hdshk && rib.addr[7:0] == `RIB_XPI_RXLOWB && `XPI_LNS_NUM'(i) == s_xpi_cfgidx_q;
assign s_xpi_rxlowb_d[i] = rib.wdata[5:0];
assign s_xpi_rxlowb_en[i] = s_ribp_wr_hdshk && ribp.addr[7:0] == `RIBP_XPI_RXLOWB && `XPI_LNS_NUM'(i) == s_xpi_cfgidx_q;
assign s_xpi_rxlowb_d[i] = ribp.wdata[5:0];
end
dfferm #(`XPI_NSS_NUM, 6, 6'd0) u_xpi_rxlowb_dfferm (
clk_i,
@@ -403,13 +403,13 @@ module xpi_reg (
);
assign s_xpi_flush = s_rib_wr_hdshk && rib.addr[7:0] == `RIB_XPI_FLUSH;
assign s_xpi_flush_val = rib.wdata[0];
assign s_xpi_flush = s_ribp_wr_hdshk && ribp.addr[7:0] == `RIBP_XPI_FLUSH;
assign s_xpi_flush_val = ribp.wdata[0];
for (genvar i = 0; i < `XPI_NSS_NUM; i++) begin : XPI_CMDTYP_BLOCK
assign s_xpi_cmdtyp_en[i] = s_rib_wr_hdshk && rib.addr[7:0] == `RIB_XPI_CMDTYP && `XPI_LNS_NUM'(i) == s_xpi_cfgidx_q;
assign s_xpi_cmdtyp_d[i] = rib.wdata[1:0];
assign s_xpi_cmdtyp_en[i] = s_ribp_wr_hdshk && ribp.addr[7:0] == `RIBP_XPI_CMDTYP && `XPI_LNS_NUM'(i) == s_xpi_cfgidx_q;
assign s_xpi_cmdtyp_d[i] = ribp.wdata[1:0];
end
dfferm #(`XPI_NSS_NUM, 2, 2'd1) u_xpi_cmdtyp_dfferm (
clk_i,
@@ -421,8 +421,8 @@ module xpi_reg (
for (genvar i = 0; i < `XPI_NSS_NUM; i++) begin : XPI_CMDLEN_BLOCK
assign s_xpi_cmdlen_en[i] = s_rib_wr_hdshk && rib.addr[7:0] == `RIB_XPI_CMDLEN && `XPI_LNS_NUM'(i) == s_xpi_cfgidx_q;
assign s_xpi_cmdlen_d[i] = rib.wdata[2:0];
assign s_xpi_cmdlen_en[i] = s_ribp_wr_hdshk && ribp.addr[7:0] == `RIBP_XPI_CMDLEN && `XPI_LNS_NUM'(i) == s_xpi_cfgidx_q;
assign s_xpi_cmdlen_d[i] = ribp.wdata[2:0];
end
dfferm #(`XPI_NSS_NUM, 3, 3'd1) u_xpi_cmdlen_dfferm (
clk_i,
@@ -434,13 +434,13 @@ module xpi_reg (
for (genvar i = 0; i < `XPI_NSS_NUM; i++) begin : XPI_CMDDAT_BLOCK
assign s_xpi_cmddat_en[i] = s_rib_wr_hdshk && rib.addr[7:0] == `RIB_XPI_CMDDAT && `XPI_LNS_NUM'(i) == s_xpi_cfgidx_q;
assign s_xpi_cmddat_en[i] = s_ribp_wr_hdshk && ribp.addr[7:0] == `RIBP_XPI_CMDDAT && `XPI_LNS_NUM'(i) == s_xpi_cfgidx_q;
always_comb begin
s_xpi_cmddat_d[i] = s_xpi_cmddat_q[i];
if (rib.wstrb[0]) s_xpi_cmddat_d[i][7:0] = rib.wdata[7:0];
if (rib.wstrb[1]) s_xpi_cmddat_d[i][15:8] = rib.wdata[15:8];
if (rib.wstrb[2]) s_xpi_cmddat_d[i][23:16] = rib.wdata[23:16];
if (rib.wstrb[3]) s_xpi_cmddat_d[i][31:24] = rib.wdata[31:24];
if (ribp.wstrb[0]) s_xpi_cmddat_d[i][7:0] = ribp.wdata[7:0];
if (ribp.wstrb[1]) s_xpi_cmddat_d[i][15:8] = ribp.wdata[15:8];
if (ribp.wstrb[2]) s_xpi_cmddat_d[i][23:16] = ribp.wdata[23:16];
if (ribp.wstrb[3]) s_xpi_cmddat_d[i][31:24] = ribp.wdata[31:24];
end
end
dfferm #(`XPI_NSS_NUM, 32, 32'hEB00_0000) u_xpi_cmddat_dfferm (
@@ -453,8 +453,8 @@ module xpi_reg (
for (genvar i = 0; i < `XPI_NSS_NUM; i++) begin : XPI_ADRTYP_BLOCK
assign s_xpi_adrtyp_en[i] = s_rib_wr_hdshk && rib.addr[7:0] == `RIB_XPI_ADRTYP && `XPI_LNS_NUM'(i) == s_xpi_cfgidx_q;
assign s_xpi_adrtyp_d[i] = rib.wdata[1:0];
assign s_xpi_adrtyp_en[i] = s_ribp_wr_hdshk && ribp.addr[7:0] == `RIBP_XPI_ADRTYP && `XPI_LNS_NUM'(i) == s_xpi_cfgidx_q;
assign s_xpi_adrtyp_d[i] = ribp.wdata[1:0];
end
dfferm #(`XPI_NSS_NUM, 2, 2'd3) u_xpi_adrtyp_dfferm (
clk_i,
@@ -466,8 +466,8 @@ module xpi_reg (
for (genvar i = 0; i < `XPI_NSS_NUM; i++) begin : XPI_ADRLEN_BLOCK
assign s_xpi_adrlen_en[i] = s_rib_wr_hdshk && rib.addr[7:0] == `RIB_XPI_ADRLEN && `XPI_LNS_NUM'(i) == s_xpi_cfgidx_q;
assign s_xpi_adrlen_d[i] = rib.wdata[2:0];
assign s_xpi_adrlen_en[i] = s_ribp_wr_hdshk && ribp.addr[7:0] == `RIBP_XPI_ADRLEN && `XPI_LNS_NUM'(i) == s_xpi_cfgidx_q;
assign s_xpi_adrlen_d[i] = ribp.wdata[2:0];
end
dfferm #(`XPI_NSS_NUM, 3, 3'd4) u_xpi_adrlen_dfferm (
clk_i,
@@ -479,13 +479,13 @@ module xpi_reg (
for (genvar i = 0; i < `XPI_NSS_NUM; i++) begin : XPI_ADRDAT_BLOCK
assign s_xpi_adrdat_en[i] = s_rib_wr_hdshk && rib.addr[7:0] == `RIB_XPI_ADRDAT && `XPI_LNS_NUM'(i) == s_xpi_cfgidx_q;
assign s_xpi_adrdat_en[i] = s_ribp_wr_hdshk && ribp.addr[7:0] == `RIBP_XPI_ADRDAT && `XPI_LNS_NUM'(i) == s_xpi_cfgidx_q;
always_comb begin
s_xpi_adrdat_d[i] = s_xpi_adrdat_q[i];
if (rib.wstrb[0]) s_xpi_adrdat_d[i][7:0] = rib.wdata[7:0];
if (rib.wstrb[1]) s_xpi_adrdat_d[i][15:8] = rib.wdata[15:8];
if (rib.wstrb[2]) s_xpi_adrdat_d[i][23:16] = rib.wdata[23:16];
if (rib.wstrb[3]) s_xpi_adrdat_d[i][31:24] = rib.wdata[31:24];
if (ribp.wstrb[0]) s_xpi_adrdat_d[i][7:0] = ribp.wdata[7:0];
if (ribp.wstrb[1]) s_xpi_adrdat_d[i][15:8] = ribp.wdata[15:8];
if (ribp.wstrb[2]) s_xpi_adrdat_d[i][23:16] = ribp.wdata[23:16];
if (ribp.wstrb[3]) s_xpi_adrdat_d[i][31:24] = ribp.wdata[31:24];
end
end
dfferm #(`XPI_NSS_NUM, 32, 32'd0) u_xpi_adrdat_dfferm (
@@ -498,8 +498,8 @@ module xpi_reg (
for (genvar i = 0; i < `XPI_NSS_NUM; i++) begin : XPI_ALTTYP_BLOCK
assign s_xpi_alttyp_en[i] = s_rib_wr_hdshk && rib.addr[7:0] == `RIB_XPI_ALTTYP && `XPI_LNS_NUM'(i) == s_xpi_cfgidx_q;
assign s_xpi_alttyp_d[i] = rib.wdata[1:0];
assign s_xpi_alttyp_en[i] = s_ribp_wr_hdshk && ribp.addr[7:0] == `RIBP_XPI_ALTTYP && `XPI_LNS_NUM'(i) == s_xpi_cfgidx_q;
assign s_xpi_alttyp_d[i] = ribp.wdata[1:0];
end
dfferm #(`XPI_NSS_NUM, 2, 2'd0) u_xpi_alttyp_dfferm (
clk_i,
@@ -511,8 +511,8 @@ module xpi_reg (
for (genvar i = 0; i < `XPI_NSS_NUM; i++) begin : XPI_ALTLEN_BLOCK
assign s_xpi_altlen_en[i] = s_rib_wr_hdshk && rib.addr[7:0] == `RIB_XPI_ALTLEN && `XPI_LNS_NUM'(i) == s_xpi_cfgidx_q;
assign s_xpi_altlen_d[i] = rib.wdata[2:0];
assign s_xpi_altlen_en[i] = s_ribp_wr_hdshk && ribp.addr[7:0] == `RIBP_XPI_ALTLEN && `XPI_LNS_NUM'(i) == s_xpi_cfgidx_q;
assign s_xpi_altlen_d[i] = ribp.wdata[2:0];
end
dfferm #(`XPI_NSS_NUM, 3, 3'd0) u_xpi_altlen_dfferm (
clk_i,
@@ -524,13 +524,13 @@ module xpi_reg (
for (genvar i = 0; i < `XPI_NSS_NUM; i++) begin : XPI_ALTDAT_BLOCK
assign s_xpi_altdat_en[i] = s_rib_wr_hdshk && rib.addr[7:0] == `RIB_XPI_ALTDAT && `XPI_LNS_NUM'(i) == s_xpi_cfgidx_q;
assign s_xpi_altdat_en[i] = s_ribp_wr_hdshk && ribp.addr[7:0] == `RIBP_XPI_ALTDAT && `XPI_LNS_NUM'(i) == s_xpi_cfgidx_q;
always_comb begin
s_xpi_altdat_d[i] = s_xpi_altdat_q[i];
if (rib.wstrb[0]) s_xpi_altdat_d[i][7:0] = rib.wdata[7:0];
if (rib.wstrb[1]) s_xpi_altdat_d[i][15:8] = rib.wdata[15:8];
if (rib.wstrb[2]) s_xpi_altdat_d[i][23:16] = rib.wdata[23:16];
if (rib.wstrb[3]) s_xpi_altdat_d[i][31:24] = rib.wdata[31:24];
if (ribp.wstrb[0]) s_xpi_altdat_d[i][7:0] = ribp.wdata[7:0];
if (ribp.wstrb[1]) s_xpi_altdat_d[i][15:8] = ribp.wdata[15:8];
if (ribp.wstrb[2]) s_xpi_altdat_d[i][23:16] = ribp.wdata[23:16];
if (ribp.wstrb[3]) s_xpi_altdat_d[i][31:24] = ribp.wdata[31:24];
end
end
dfferm #(`XPI_NSS_NUM, 32, 32'd0) u_xpi_altdat_dfferm (
@@ -543,8 +543,8 @@ module xpi_reg (
for (genvar i = 0; i < `XPI_NSS_NUM; i++) begin : XPI_TDULEN_BLOCK
assign s_xpi_tdulen_en[i] = s_rib_wr_hdshk && rib.addr[7:0] == `RIB_XPI_TDULEN && `XPI_LNS_NUM'(i) == s_xpi_cfgidx_q;
assign s_xpi_tdulen_d[i] = rib.wdata[7:0];
assign s_xpi_tdulen_en[i] = s_ribp_wr_hdshk && ribp.addr[7:0] == `RIBP_XPI_TDULEN && `XPI_LNS_NUM'(i) == s_xpi_cfgidx_q;
assign s_xpi_tdulen_d[i] = ribp.wdata[7:0];
end
dfferm #(`XPI_NSS_NUM, 8, 8'd4) u_xpi_tdulen_dfferm (
clk_i,
@@ -556,8 +556,8 @@ module xpi_reg (
for (genvar i = 0; i < `XPI_NSS_NUM; i++) begin : XPI_RDULEN_BLOCK
assign s_xpi_rdulen_en[i] = s_rib_wr_hdshk && rib.addr[7:0] == `RIB_XPI_RDULEN && `XPI_LNS_NUM'(i) == s_xpi_cfgidx_q;
assign s_xpi_rdulen_d[i] = rib.wdata[7:0];
assign s_xpi_rdulen_en[i] = s_ribp_wr_hdshk && ribp.addr[7:0] == `RIBP_XPI_RDULEN && `XPI_LNS_NUM'(i) == s_xpi_cfgidx_q;
assign s_xpi_rdulen_d[i] = ribp.wdata[7:0];
end
dfferm #(`XPI_NSS_NUM, 8, 8'd4) u_xpi_rdulen_dfferm (
clk_i,
@@ -569,8 +569,8 @@ module xpi_reg (
for (genvar i = 0; i < `XPI_NSS_NUM; i++) begin : XPI_DATTYP_BLOCK
assign s_xpi_dattyp_en[i] = s_rib_wr_hdshk && rib.addr[7:0] == `RIB_XPI_DATTYP && `XPI_LNS_NUM'(i) == s_xpi_cfgidx_q;
assign s_xpi_dattyp_d[i] = rib.wdata[1:0];
assign s_xpi_dattyp_en[i] = s_ribp_wr_hdshk && ribp.addr[7:0] == `RIBP_XPI_DATTYP && `XPI_LNS_NUM'(i) == s_xpi_cfgidx_q;
assign s_xpi_dattyp_d[i] = ribp.wdata[1:0];
end
dfferm #(`XPI_NSS_NUM, 2, 2'd3) u_xpi_dattyp_dfferm (
clk_i,
@@ -582,8 +582,8 @@ module xpi_reg (
for (genvar i = 0; i < `XPI_NSS_NUM; i++) begin : XPI_DATLEN_BLOCK
assign s_xpi_datlen_en[i] = s_rib_wr_hdshk && rib.addr[7:0] == `RIB_XPI_DATLEN && `XPI_LNS_NUM'(i) == s_xpi_cfgidx_q;
assign s_xpi_datlen_d[i] = rib.wdata[7:0];
assign s_xpi_datlen_en[i] = s_ribp_wr_hdshk && ribp.addr[7:0] == `RIBP_XPI_DATLEN && `XPI_LNS_NUM'(i) == s_xpi_cfgidx_q;
assign s_xpi_datlen_d[i] = ribp.wdata[7:0];
end
dfferm #(`XPI_NSS_NUM, 8, 8'd1) u_xpi_datlen_dfferm (
clk_i,
@@ -595,8 +595,8 @@ module xpi_reg (
for (genvar i = 0; i < `XPI_NSS_NUM; i++) begin : XPI_DATBIT_BLOCK
assign s_xpi_datbit_en[i] = s_rib_wr_hdshk && rib.addr[7:0] == `RIB_XPI_DATBIT && `XPI_LNS_NUM'(i) == s_xpi_cfgidx_q;
assign s_xpi_datbit_d[i] = rib.wdata[2:0];
assign s_xpi_datbit_en[i] = s_ribp_wr_hdshk && ribp.addr[7:0] == `RIBP_XPI_DATBIT && `XPI_LNS_NUM'(i) == s_xpi_cfgidx_q;
assign s_xpi_datbit_d[i] = ribp.wdata[2:0];
end
dfferm #(`XPI_NSS_NUM, 3, 3'd4) u_xpi_datbit_dfferm (
clk_i,
@@ -608,8 +608,8 @@ module xpi_reg (
for (genvar i = 0; i < `XPI_NSS_NUM; i++) begin : XPI_HLVLEN_BLOCK
assign s_xpi_hlvlen_en[i] = s_rib_wr_hdshk && rib.addr[7:0] == `RIB_XPI_HLVLEN && `XPI_LNS_NUM'(i) == s_xpi_cfgidx_q;
assign s_xpi_hlvlen_d[i] = rib.wdata[7:0];
assign s_xpi_hlvlen_en[i] = s_ribp_wr_hdshk && ribp.addr[7:0] == `RIBP_XPI_HLVLEN && `XPI_LNS_NUM'(i) == s_xpi_cfgidx_q;
assign s_xpi_hlvlen_d[i] = ribp.wdata[7:0];
end
dfferm #(`XPI_NSS_NUM, 8, 8'd2) u_xpi_hlvlen_dfferm (
clk_i,
@@ -624,17 +624,17 @@ module xpi_reg (
always_comb begin
tx_push_valid_o = 1'b0;
tx_push_data_o = '0;
if (s_rib_wr_hdshk && rib.addr[7:0] == `RIB_XPI_TXDATA) begin
if (s_ribp_wr_hdshk && ribp.addr[7:0] == `RIBP_XPI_TXDATA) begin
tx_push_valid_o = 1'b1;
if (rib.wstrb[0]) tx_push_data_o[7:0] = rib.wdata[7:0];
if (rib.wstrb[1]) tx_push_data_o[15:8] = rib.wdata[15:8];
if (rib.wstrb[2]) tx_push_data_o[23:16] = rib.wdata[23:16];
if (rib.wstrb[3]) tx_push_data_o[31:24] = rib.wdata[31:24];
if (ribp.wstrb[0]) tx_push_data_o[7:0] = ribp.wdata[7:0];
if (ribp.wstrb[1]) tx_push_data_o[15:8] = ribp.wdata[15:8];
if (ribp.wstrb[2]) tx_push_data_o[23:16] = ribp.wdata[23:16];
if (ribp.wstrb[3]) tx_push_data_o[31:24] = ribp.wdata[31:24];
end
end
// start
assign xfer_start_o = s_rib_wr_hdshk && rib.addr[7:0] == `RIB_XPI_XST;
assign xfer_start_o = s_ribp_wr_hdshk && ribp.addr[7:0] == `RIBP_XPI_XST;
// status
// [20:14] rx elem num
@@ -654,7 +654,7 @@ module xpi_reg (
s_xpi_status_d[20:14] = rx_elem_num_i;
if (xfer_done_i) begin
s_xpi_status_d[0] = 1'b1;
end else if (s_rib_rd_hdshk && rib.addr[7:0] == `RIB_XPI_STATUS) begin
end else if (s_ribp_rd_hdshk && ribp.addr[7:0] == `RIBP_XPI_STATUS) begin
s_xpi_status_d[0] = 1'b0;
end
end
@@ -699,67 +699,67 @@ module xpi_reg (
);
// rib rd
assign s_rib_ready_d = rib.valid && (~s_rib_ready_q);
dffr #(1) u_rib_ready_dffr (
// ribp rd
assign s_ribp_ready_d = ribp.valid && (~s_ribp_ready_q);
dffr #(1) u_ribp_ready_dffr (
clk_i,
rst_n_i,
s_rib_ready_d,
s_rib_ready_q
s_ribp_ready_d,
s_ribp_ready_q
);
// verilog_format: off
assign s_rib_rdata_en = s_rib_rd_hdshk;
assign s_ribp_rdata_en = s_ribp_rd_hdshk;
always_comb begin
rx_pop_valid_o = '0;
s_rib_rdata_d = s_rib_rdata_q;
unique case (rib.addr[7:0])
`RIB_XPI_CFGIDX: s_rib_rdata_d = {{(32 - `XPI_LNS_NUM) {1'b0}}, s_xpi_cfgidx_q};
`RIB_XPI_ACCMD: s_rib_rdata_d = {31'd0, s_xpi_accmd_q[s_xpi_cfgidx_q]};
`RIB_XPI_MMSTAD: s_rib_rdata_d = s_xpi_mmstad_q[s_xpi_cfgidx_q];
`RIB_XPI_MMOFFST: s_rib_rdata_d = s_xpi_mmoffst_q[s_xpi_cfgidx_q];
`RIB_XPI_MODE: s_rib_rdata_d = {31'd0, s_xpi_mode_q[s_xpi_cfgidx_q]};
`RIB_XPI_NSS: s_rib_rdata_d = {{(32 - `XPI_LNS_NUM) {1'b0}}, s_xpi_nss_q};
`RIB_XPI_CLKDIV: s_rib_rdata_d = {24'd0, s_xpi_clkdiv_q[s_xpi_cfgidx_q]};
`RIB_XPI_RDWR: s_rib_rdata_d = {31'd0, s_xpi_rdwr_q[s_xpi_cfgidx_q]};
`RIB_XPI_REVDAT: s_rib_rdata_d = {31'd0, s_xpi_revdat_q[s_xpi_cfgidx_q]};
`RIB_XPI_TXUPB: s_rib_rdata_d = {24'd0, s_xpi_txupb_q[s_xpi_cfgidx_q]};
`RIB_XPI_TXLOWB: s_rib_rdata_d = {24'd0, s_xpi_txlowb_q[s_xpi_cfgidx_q]};
`RIB_XPI_RXUPB: s_rib_rdata_d = {26'd0, s_xpi_rxupb_q[s_xpi_cfgidx_q]};
`RIB_XPI_RXLOWB: s_rib_rdata_d = {26'd0, s_xpi_rxlowb_q[s_xpi_cfgidx_q]};
`RIB_XPI_CMDTYP: s_rib_rdata_d = {30'd0, s_xpi_cmdtyp_q[s_xpi_cfgidx_q]};
`RIB_XPI_CMDLEN: s_rib_rdata_d = {29'd0, s_xpi_cmdlen_q[s_xpi_cfgidx_q]};
`RIB_XPI_CMDDAT: s_rib_rdata_d = s_xpi_cmddat_q[s_xpi_cfgidx_q];
`RIB_XPI_ADRTYP: s_rib_rdata_d = {30'd0, s_xpi_adrtyp_q[s_xpi_cfgidx_q]};
`RIB_XPI_ADRLEN: s_rib_rdata_d = {29'd0, s_xpi_adrlen_q[s_xpi_cfgidx_q]};
`RIB_XPI_ADRDAT: s_rib_rdata_d = s_xpi_adrdat_q[s_xpi_cfgidx_q];
`RIB_XPI_ALTTYP: s_rib_rdata_d = {30'd0, s_xpi_alttyp_q[s_xpi_cfgidx_q]};
`RIB_XPI_ALTLEN: s_rib_rdata_d = {29'd0, s_xpi_altlen_q[s_xpi_cfgidx_q]};
`RIB_XPI_ALTDAT: s_rib_rdata_d = s_xpi_altdat_q[s_xpi_cfgidx_q];
`RIB_XPI_TDULEN: s_rib_rdata_d = {24'd0, s_xpi_tdulen_q[s_xpi_cfgidx_q]};
`RIB_XPI_RDULEN: s_rib_rdata_d = {24'd0, s_xpi_rdulen_q[s_xpi_cfgidx_q]};
`RIB_XPI_DATTYP: s_rib_rdata_d = {30'd0, s_xpi_dattyp_q[s_xpi_cfgidx_q]};
`RIB_XPI_DATLEN: s_rib_rdata_d = {24'd0, s_xpi_datlen_q[s_xpi_cfgidx_q]};
`RIB_XPI_DATBIT: s_rib_rdata_d = {29'd0, s_xpi_datbit_q[s_xpi_cfgidx_q]};
`RIB_XPI_HLVLEN: s_rib_rdata_d = {24'd0, s_xpi_hlvlen_q[s_xpi_cfgidx_q]};
`RIB_XPI_RXDATA: begin
if (s_rib_rd_hdshk) begin
s_ribp_rdata_d = s_ribp_rdata_q;
unique case (ribp.addr[7:0])
`RIBP_XPI_CFGIDX: s_ribp_rdata_d = {{(32 - `XPI_LNS_NUM) {1'b0}}, s_xpi_cfgidx_q};
`RIBP_XPI_ACCMD: s_ribp_rdata_d = {31'd0, s_xpi_accmd_q[s_xpi_cfgidx_q]};
`RIBP_XPI_MMSTAD: s_ribp_rdata_d = s_xpi_mmstad_q[s_xpi_cfgidx_q];
`RIBP_XPI_MMOFFST: s_ribp_rdata_d = s_xpi_mmoffst_q[s_xpi_cfgidx_q];
`RIBP_XPI_MODE: s_ribp_rdata_d = {31'd0, s_xpi_mode_q[s_xpi_cfgidx_q]};
`RIBP_XPI_NSS: s_ribp_rdata_d = {{(32 - `XPI_LNS_NUM) {1'b0}}, s_xpi_nss_q};
`RIBP_XPI_CLKDIV: s_ribp_rdata_d = {24'd0, s_xpi_clkdiv_q[s_xpi_cfgidx_q]};
`RIBP_XPI_RDWR: s_ribp_rdata_d = {31'd0, s_xpi_rdwr_q[s_xpi_cfgidx_q]};
`RIBP_XPI_REVDAT: s_ribp_rdata_d = {31'd0, s_xpi_revdat_q[s_xpi_cfgidx_q]};
`RIBP_XPI_TXUPB: s_ribp_rdata_d = {24'd0, s_xpi_txupb_q[s_xpi_cfgidx_q]};
`RIBP_XPI_TXLOWB: s_ribp_rdata_d = {24'd0, s_xpi_txlowb_q[s_xpi_cfgidx_q]};
`RIBP_XPI_RXUPB: s_ribp_rdata_d = {26'd0, s_xpi_rxupb_q[s_xpi_cfgidx_q]};
`RIBP_XPI_RXLOWB: s_ribp_rdata_d = {26'd0, s_xpi_rxlowb_q[s_xpi_cfgidx_q]};
`RIBP_XPI_CMDTYP: s_ribp_rdata_d = {30'd0, s_xpi_cmdtyp_q[s_xpi_cfgidx_q]};
`RIBP_XPI_CMDLEN: s_ribp_rdata_d = {29'd0, s_xpi_cmdlen_q[s_xpi_cfgidx_q]};
`RIBP_XPI_CMDDAT: s_ribp_rdata_d = s_xpi_cmddat_q[s_xpi_cfgidx_q];
`RIBP_XPI_ADRTYP: s_ribp_rdata_d = {30'd0, s_xpi_adrtyp_q[s_xpi_cfgidx_q]};
`RIBP_XPI_ADRLEN: s_ribp_rdata_d = {29'd0, s_xpi_adrlen_q[s_xpi_cfgidx_q]};
`RIBP_XPI_ADRDAT: s_ribp_rdata_d = s_xpi_adrdat_q[s_xpi_cfgidx_q];
`RIBP_XPI_ALTTYP: s_ribp_rdata_d = {30'd0, s_xpi_alttyp_q[s_xpi_cfgidx_q]};
`RIBP_XPI_ALTLEN: s_ribp_rdata_d = {29'd0, s_xpi_altlen_q[s_xpi_cfgidx_q]};
`RIBP_XPI_ALTDAT: s_ribp_rdata_d = s_xpi_altdat_q[s_xpi_cfgidx_q];
`RIBP_XPI_TDULEN: s_ribp_rdata_d = {24'd0, s_xpi_tdulen_q[s_xpi_cfgidx_q]};
`RIBP_XPI_RDULEN: s_ribp_rdata_d = {24'd0, s_xpi_rdulen_q[s_xpi_cfgidx_q]};
`RIBP_XPI_DATTYP: s_ribp_rdata_d = {30'd0, s_xpi_dattyp_q[s_xpi_cfgidx_q]};
`RIBP_XPI_DATLEN: s_ribp_rdata_d = {24'd0, s_xpi_datlen_q[s_xpi_cfgidx_q]};
`RIBP_XPI_DATBIT: s_ribp_rdata_d = {29'd0, s_xpi_datbit_q[s_xpi_cfgidx_q]};
`RIBP_XPI_HLVLEN: s_ribp_rdata_d = {24'd0, s_xpi_hlvlen_q[s_xpi_cfgidx_q]};
`RIBP_XPI_RXDATA: begin
if (s_ribp_rd_hdshk) begin
rx_pop_valid_o = 1'b1;
if (~rx_empty_i) s_rib_rdata_d = rx_pop_data_i;
else s_rib_rdata_d = '0;
if (~rx_empty_i) s_ribp_rdata_d = rx_pop_data_i;
else s_ribp_rdata_d = '0;
end
end
`RIB_XPI_STATUS: s_rib_rdata_d = {11'd0, s_xpi_status_q};
default: s_rib_rdata_d = s_rib_rdata_q;
`RIBP_XPI_STATUS: s_ribp_rdata_d = {11'd0, s_xpi_status_q};
default: s_ribp_rdata_d = s_ribp_rdata_q;
endcase
end
// verilog_format: on
dffer #(32) u_rib_rdata_dffer (
dffer #(32) u_ribp_rdata_dffer (
clk_i,
rst_n_i,
s_rib_rdata_en,
s_rib_rdata_d,
s_rib_rdata_q
s_ribp_rdata_en,
s_ribp_rdata_d,
s_ribp_rdata_q
);
endmodule
File renamed without changes.
+2 -2
View File
@@ -12,7 +12,7 @@ from typing import Any
MAX_ADDRESS = 1 << 32
VALID_ROUTES = {"rib", "apb", "ram", "reserved"}
VALID_ROUTES = {"ribp", "apb", "ram", "reserved"}
VALID_KINDS = {"active", "reserved"}
VALID_USER_ACCESS = {"none", "ro", "rw"}
VALID_BURST = {"incr1", "incr4"}
@@ -160,7 +160,7 @@ def render_rtl(
f"{range_expression(symbol, region['base'], region['end'])}",
]
lines.append("")
for route in ("rib", "apb", "ram", "reserved"):
for route in ("ribp", "apb", "ram", "reserved"):
selected = [
f"`SOC_ADDR_IS_{region['symbol']}(addr)"
for region in regions
+27 -27
View File
@@ -21,8 +21,8 @@
{"symbol": "PERF_USER_WAIT_HI", "offset": "0x50"},
{"symbol": "PERF_DMA_WAIT_LO", "offset": "0x54"},
{"symbol": "PERF_DMA_WAIT_HI", "offset": "0x58"},
{"symbol": "PERF_RIB_WAIT_LO", "offset": "0x5C"},
{"symbol": "PERF_RIB_WAIT_HI", "offset": "0x60"},
{"symbol": "PERF_RIBP_WAIT_LO", "offset": "0x5C"},
{"symbol": "PERF_RIBP_WAIT_HI", "offset": "0x60"},
{"symbol": "PERF_APB_WAIT_LO", "offset": "0x64"},
{"symbol": "PERF_APB_WAIT_HI", "offset": "0x68"},
{"symbol": "PERF_SDRAM_WAIT_LO", "offset": "0x6C"},
@@ -33,27 +33,27 @@
{"symbol": "PERF_FLASH_WAIT_HI", "offset": "0x80"}
],
"regions": [
{"symbol": "FLASH", "base": "0x00000000", "size": "0x01000000", "route": "rib", "kind": "active", "public": true, "linker": "FLASH", "user_access": "ro", "burst": "incr4"},
{"symbol": "RIB_GPIO", "base": "0x10000000", "size": "0x00001000", "route": "rib", "kind": "active", "public": true, "user_access": "rw"},
{"symbol": "RIB_UART0", "base": "0x10001000", "size": "0x00001000", "route": "rib", "kind": "active", "public": true, "user_access": "rw"},
{"symbol": "RIB_TIM0", "base": "0x10002000", "size": "0x00001000", "route": "rib", "kind": "active", "public": true, "user_access": "rw"},
{"symbol": "RIB_TIM1", "base": "0x10003000", "size": "0x00001000", "route": "rib", "kind": "active", "public": true, "user_access": "rw"},
{"symbol": "RIB_PSRAM", "base": "0x10004000", "size": "0x00001000", "route": "rib", "kind": "active", "public": true, "user_access": "none"},
{"symbol": "RIB_SPISD", "base": "0x10005000", "size": "0x00001000", "route": "rib", "kind": "active", "public": true, "user_access": "rw"},
{"symbol": "RIB_I2C0", "base": "0x10006000", "size": "0x00001000", "route": "rib", "kind": "active", "public": true, "user_access": "rw"},
{"symbol": "RIB_I2S", "base": "0x10007000", "size": "0x00001000", "route": "rib", "kind": "active", "public": true, "user_access": "rw"},
{"symbol": "RIB_ONEWIRE", "base": "0x10008000", "size": "0x00001000", "route": "rib", "kind": "active", "public": true, "user_access": "rw"},
{"symbol": "RIB_XPI", "base": "0x10009000", "size": "0x00001000", "route": "rib", "kind": "active", "public": true, "user_access": "none"},
{"symbol": "RIB_DMA", "base": "0x1000A000", "size": "0x00001000", "route": "rib", "kind": "active", "public": true, "user_access": "none"},
{"symbol": "RIB_SYSCTRL", "base": "0x1000B000", "size": "0x00001000", "route": "rib", "kind": "active", "public": true, "user_access": "none"},
{"symbol": "RIB_CLINT", "base": "0x1000C000", "size": "0x00001000", "route": "rib", "kind": "active", "public": true, "user_access": "none"},
{"symbol": "RIB_SDRAM", "base": "0x1000D000", "size": "0x00001000", "route": "rib", "kind": "active", "public": true, "user_access": "none"},
{"symbol": "RIB_DVP", "base": "0x1000E000", "size": "0x00001000", "route": "rib", "kind": "active", "public": true, "user_access": "rw"},
{"symbol": "RIB_SDIO", "base": "0x1000F000", "size": "0x00001000", "route": "reserved", "kind": "reserved", "public": false, "user_access": "none"},
{"symbol": "RIB_OPIPSRAM", "base": "0x10010000", "size": "0x00001000", "route": "reserved", "kind": "reserved", "public": false, "user_access": "none"},
{"symbol": "RIB_I2C1", "base": "0x10011000", "size": "0x00001000", "route": "rib", "kind": "active", "public": true, "user_access": "rw"},
{"symbol": "RIB_GA", "base": "0x10012000", "size": "0x00001000", "route": "reserved", "kind": "reserved", "public": false, "user_access": "none"},
{"symbol": "RIB_APU", "base": "0x10013000", "size": "0x00001000", "route": "reserved", "kind": "reserved", "public": false, "user_access": "none"},
{"symbol": "FLASH", "base": "0x00000000", "size": "0x01000000", "route": "ribp", "kind": "active", "public": true, "linker": "FLASH", "user_access": "ro", "burst": "incr4"},
{"symbol": "RIBP_GPIO", "base": "0x10000000", "size": "0x00001000", "route": "ribp", "kind": "active", "public": true, "user_access": "rw"},
{"symbol": "RIBP_UART0", "base": "0x10001000", "size": "0x00001000", "route": "ribp", "kind": "active", "public": true, "user_access": "rw"},
{"symbol": "RIBP_TIM0", "base": "0x10002000", "size": "0x00001000", "route": "ribp", "kind": "active", "public": true, "user_access": "rw"},
{"symbol": "RIBP_TIM1", "base": "0x10003000", "size": "0x00001000", "route": "ribp", "kind": "active", "public": true, "user_access": "rw"},
{"symbol": "RIBP_PSRAM", "base": "0x10004000", "size": "0x00001000", "route": "ribp", "kind": "active", "public": true, "user_access": "none"},
{"symbol": "RIBP_SPISD", "base": "0x10005000", "size": "0x00001000", "route": "ribp", "kind": "active", "public": true, "user_access": "rw"},
{"symbol": "RIBP_I2C0", "base": "0x10006000", "size": "0x00001000", "route": "ribp", "kind": "active", "public": true, "user_access": "rw"},
{"symbol": "RIBP_I2S", "base": "0x10007000", "size": "0x00001000", "route": "ribp", "kind": "active", "public": true, "user_access": "rw"},
{"symbol": "RIBP_ONEWIRE", "base": "0x10008000", "size": "0x00001000", "route": "ribp", "kind": "active", "public": true, "user_access": "rw"},
{"symbol": "RIBP_XPI", "base": "0x10009000", "size": "0x00001000", "route": "ribp", "kind": "active", "public": true, "user_access": "none"},
{"symbol": "RIBP_DMA", "base": "0x1000A000", "size": "0x00001000", "route": "ribp", "kind": "active", "public": true, "user_access": "none"},
{"symbol": "RIBP_SYSCTRL", "base": "0x1000B000", "size": "0x00001000", "route": "ribp", "kind": "active", "public": true, "user_access": "none"},
{"symbol": "RIBP_CLINT", "base": "0x1000C000", "size": "0x00001000", "route": "ribp", "kind": "active", "public": true, "user_access": "none"},
{"symbol": "RIBP_SDRAM", "base": "0x1000D000", "size": "0x00001000", "route": "ribp", "kind": "active", "public": true, "user_access": "none"},
{"symbol": "RIBP_DVP", "base": "0x1000E000", "size": "0x00001000", "route": "ribp", "kind": "active", "public": true, "user_access": "rw"},
{"symbol": "RIBP_SDIO", "base": "0x1000F000", "size": "0x00001000", "route": "reserved", "kind": "reserved", "public": false, "user_access": "none"},
{"symbol": "RIBP_OPIPSRAM", "base": "0x10010000", "size": "0x00001000", "route": "reserved", "kind": "reserved", "public": false, "user_access": "none"},
{"symbol": "RIBP_I2C1", "base": "0x10011000", "size": "0x00001000", "route": "ribp", "kind": "active", "public": true, "user_access": "rw"},
{"symbol": "RIBP_GA", "base": "0x10012000", "size": "0x00001000", "route": "reserved", "kind": "reserved", "public": false, "user_access": "none"},
{"symbol": "RIBP_APU", "base": "0x10013000", "size": "0x00001000", "route": "reserved", "kind": "reserved", "public": false, "user_access": "none"},
{"symbol": "APB_ARCHINFO", "base": "0x20000000", "size": "0x00001000", "route": "apb", "kind": "active", "public": true, "user_access": "ro"},
{"symbol": "APB_RNG", "base": "0x20001000", "size": "0x00001000", "route": "apb", "kind": "active", "public": true, "user_access": "rw"},
{"symbol": "APB_UART1", "base": "0x20002000", "size": "0x00001000", "route": "apb", "kind": "active", "public": true, "user_access": "rw"},
@@ -65,10 +65,10 @@
{"symbol": "APB_TMR", "base": "0x20008000", "size": "0x00001000", "route": "apb", "kind": "active", "public": true, "user_access": "rw"},
{"symbol": "APB_USER_IP", "base": "0x2000F000", "size": "0x00001000", "route": "apb", "kind": "active", "public": true, "user_access": "rw"},
{"symbol": "SRAM", "base": "0x30000000", "size": "0x00020000", "route": "ram", "kind": "active", "public": true, "linker": "SRAM", "user_access": "rw", "burst": "incr4"},
{"symbol": "SDRAM", "base": "0x38000000", "size": "0x02000000", "route": "rib", "kind": "active", "public": true, "linker": "SDRAM", "user_access": "rw", "burst": "incr4"},
{"symbol": "PSRAM", "base": "0x40000000", "size": "0x00800000", "route": "rib", "kind": "active", "public": true, "linker": "PSRAM", "user_access": "rw", "burst": "incr4"},
{"symbol": "SDRAM", "base": "0x38000000", "size": "0x02000000", "route": "ribp", "kind": "active", "public": true, "linker": "SDRAM", "user_access": "rw", "burst": "incr4"},
{"symbol": "PSRAM", "base": "0x40000000", "size": "0x00800000", "route": "ribp", "kind": "active", "public": true, "linker": "PSRAM", "user_access": "rw", "burst": "incr4"},
{"symbol": "OPIPSRAM", "base": "0x48000000", "size": "0x08000000", "route": "reserved", "kind": "reserved", "public": false, "user_access": "none"},
{"symbol": "XPI", "base": "0x50000000", "size": "0x10000000", "route": "rib", "kind": "active", "public": true, "user_access": "rw", "burst": "incr4"},
{"symbol": "SPISD", "base": "0x60000000", "size": "0x40000000", "route": "rib", "kind": "active", "public": true, "user_access": "rw", "burst": "incr4"}
{"symbol": "XPI", "base": "0x50000000", "size": "0x10000000", "route": "ribp", "kind": "active", "public": true, "user_access": "rw", "burst": "incr4"},
{"symbol": "SPISD", "base": "0x60000000", "size": "0x40000000", "route": "ribp", "kind": "active", "public": true, "user_access": "rw", "burst": "incr4"}
]
}
+5 -5
View File
@@ -49,7 +49,7 @@ bind bus soc_bus_sva u_soc_bus_sva (
.access_denied_i (s_access_denied),
.cmd_accepted_i (s_cmd_accepted_q),
.arb_owner_i (s_mstr_id_q),
.mgmt_valid_i (mgmt_rib.valid),
.mgmt_valid_i (mgmt_ribl.valid),
.user_valid_i (user_rib.cmd_valid),
.dma_valid_i (dma_rib.cmd_valid)
);
@@ -72,14 +72,14 @@ module soc_rib2apb_sva #(
endmodule
bind rib2apb soc_rib2apb_sva #(
bind ribp2apb soc_rib2apb_sva #(
.NSLV(NSLV)
) u_soc_rib2apb_sva (
.clk_i (clk_i),
.rst_n_i (rst_n_i),
.psel_comb_i (s_psel_comb),
.psel_q_i (s_psel_q),
.rib_ready_i (rib.ready),
.rib_ready_i (ribp.ready),
.xfer_ready_i(s_xfer_ready)
);
@@ -140,8 +140,8 @@ module soc_gpio_user_handoff_sva #(
endmodule
bind rib_gpio soc_gpio_user_handoff_sva #(
.DATA_WIDTH(`RIB_GPIO_NUM)
bind ribp_gpio soc_gpio_user_handoff_sva #(
.DATA_WIDTH(`RIBP_GPIO_NUM)
) u_soc_gpio_user_handoff_sva (
.clk_i (clk_i),
.rst_n_i (rst_n_i),
+3 -2
View File
@@ -1,10 +1,10 @@
/clusterip/common/rtl/interface/apb4_if.sv
/clusterip/common/rtl/interface/apb4_pure_if.sv
/clusterip/common/rtl/interface/ahbl_if.sv
/clusterip/common/rtl/interface/rib_if.sv
/clusterip/common/rtl/interface/ribp_if.sv
/clusterip/common/rtl/interface/ram_if.sv
/top/soc_ribl_if.sv
/top/soc_rib_if.sv
/top/soc_rib_burst_if.sv
/clusterip/common/rtl/utils/register.sv
/top/soc_common_fifo.sv
/clusterip/common/rtl/utils/spill_register.sv
@@ -12,6 +12,7 @@
/clusterip/common/rtl/utils/gray2bin.sv
/clusterip/common/rtl/utils/edge_det.sv
/clusterip/common/rtl/cdc/cdc_sync.sv
/clusterip/common/rtl/cdc/cdc_rst_ctrlr.sv
/clusterip/common/rtl/cdc/cdc_2phase.sv
/clusterip/common/rtl/clkrst/clk_int_div.sv
/clusterip/common/rtl/clkrst/rst_sync.sv
+7 -7
View File
@@ -16,11 +16,11 @@
+incdir+/clusterip/wdg/rtl
+incdir+/clusterip/crc/rtl
+incdir+/clusterip/timer/rtl
+incdir+/ip/rib/interconnect
+incdir+/ip/rib/util
+incdir+/ip/rib/memory
+incdir+/ip/rib/storage
+incdir+/ip/rib/serial
+incdir+/ip/rib/multimedia
+incdir+/ip/rib/peripheral
+incdir+/ip/ribp/interconnect
+incdir+/ip/ribp/util
+incdir+/ip/ribp/memory
+incdir+/ip/ribp/storage
+incdir+/ip/ribp/serial
+incdir+/ip/ribp/multimedia
+incdir+/ip/ribp/peripheral
+incdir+/third_party/model/sdram/
+49 -49
View File
@@ -1,49 +1,49 @@
/ip/rib/memory/psram_core.sv
/ip/rib/memory/psram.sv
/ip/rib/memory/opipsram.sv
/ip/rib/memory/opipsram_core.sv
/ip/rib/storage/spisd_init.sv
/ip/rib/storage/spisd_read.sv
/ip/rib/storage/spisd_write.sv
/ip/rib/storage/spisd_reg.sv
/ip/rib/storage/spisd_cache.sv
/ip/rib/storage/spisd_core.sv
/ip/rib/storage/spisd_data.sv
/ip/rib/storage/spisd.sv
/ip/rib/storage/sdio.sv
/ip/rib/serial/i2c_core.sv
/ip/rib/serial/i2c.sv
/ip/rib/serial/i2s_reg.sv
/ip/rib/serial/i2s_clkgen.sv
/ip/rib/serial/i2s_recv.sv
/ip/rib/serial/i2s_send.sv
/ip/rib/serial/i2s_core.sv
/ip/rib/serial/i2s.sv
/ip/rib/serial/onewire_core.sv
/ip/rib/serial/onewire.sv
/ip/rib/storage/xpi_reg.sv
/ip/rib/storage/xpi_mm.sv
/ip/rib/storage/xpi_clkgen.sv
/ip/rib/storage/xpi_core.sv
/ip/rib/storage/xpi.sv
/ip/rib/peripheral/dma_core.sv
/ip/rib/peripheral/dma.sv
/ip/rib/peripheral/pll_ctrl_if.sv
/ip/rib/peripheral/sysctrl.sv
/ip/rib/peripheral/clint.sv
/ip/rib/memory/sdram_clkgen.sv
/ip/rib/memory/sdram_reg.sv
/ip/rib/memory/sdram_core.sv
/ip/rib/memory/sdram.sv
/ip/rib/multimedia/dvp_core.sv
/ip/rib/multimedia/dvp.sv
/ip/rib/peripheral/timer.sv
/ip/rib/serial/uart.sv
/ip/rib/peripheral/gpio.sv
/ip/rib/interconnect/rib2apb.sv
/ip/rib/interconnect/ahbl2rib.sv
/top/ahbl2soc_rib.sv
/ip/rib/interconnect/axi4l2rib.sv
/ip/rib/util/async_fifo.sv
/ip/rib/interconnect/rib_regslice.sv
/ip/rib/interconnect/rib2rib.sv
/ip/ribp/memory/psram_core.sv
/ip/ribp/memory/psram.sv
/ip/ribp/memory/opipsram.sv
/ip/ribp/memory/opipsram_core.sv
/ip/ribp/storage/spisd_init.sv
/ip/ribp/storage/spisd_read.sv
/ip/ribp/storage/spisd_write.sv
/ip/ribp/storage/spisd_reg.sv
/ip/ribp/storage/spisd_cache.sv
/ip/ribp/storage/spisd_core.sv
/ip/ribp/storage/spisd_data.sv
/ip/ribp/storage/spisd.sv
/ip/ribp/storage/sdio.sv
/ip/ribp/serial/i2c_core.sv
/ip/ribp/serial/i2c.sv
/ip/ribp/serial/i2s_reg.sv
/ip/ribp/serial/i2s_clkgen.sv
/ip/ribp/serial/i2s_recv.sv
/ip/ribp/serial/i2s_send.sv
/ip/ribp/serial/i2s_core.sv
/ip/ribp/serial/i2s.sv
/ip/ribp/serial/onewire_core.sv
/ip/ribp/serial/onewire.sv
/ip/ribp/storage/xpi_reg.sv
/ip/ribp/storage/xpi_mm.sv
/ip/ribp/storage/xpi_clkgen.sv
/ip/ribp/storage/xpi_core.sv
/ip/ribp/storage/xpi.sv
/ip/ribp/peripheral/dma_core.sv
/ip/ribp/peripheral/dma.sv
/ip/ribp/peripheral/pll_ctrl_if.sv
/ip/ribp/peripheral/sysctrl.sv
/ip/ribp/peripheral/clint.sv
/ip/ribp/memory/sdram_clkgen.sv
/ip/ribp/memory/sdram_reg.sv
/ip/ribp/memory/sdram_core.sv
/ip/ribp/memory/sdram.sv
/ip/ribp/multimedia/dvp_core.sv
/ip/ribp/multimedia/dvp.sv
/ip/ribp/peripheral/timer.sv
/ip/ribp/serial/uart.sv
/ip/ribp/peripheral/gpio.sv
/ip/ribp/interconnect/ribp2apb.sv
/ip/ribp/interconnect/ahbl2ribp.sv
/top/ahbl2soc_ribl.sv
/ip/ribp/interconnect/axi4l2ribp.sv
/ip/ribp/util/async_fifo.sv
/ip/ribp/interconnect/ribp_regslice.sv
/ip/ribp/interconnect/ribp2ribp.sv
+6 -6
View File
@@ -1,15 +1,15 @@
/top/apb4_if_bridge.sv
/top/gpio_pad_bridge.sv
/top/soc_rib_legacy_to_burst.sv
/top/rib_legacy_to_burst.sv
/top/soc_rib_burst_to_legacy.sv
/top/soc_rib_burst_error_slave.sv
/top/soc_rib_burst_ram.sv
/top/soc_ribl2rib.sv
/top/ribp2rib.sv
/top/soc_rib2ribp.sv
/top/soc_rib_error_slave.sv
/top/soc_rib_ram.sv
/top/core_wrapper.sv
/top/retrosoc.sv
/top/retrosoc_asic.sv
/top/onchip_ram.sv
/top/ip_rib_wrapper.sv
/top/ip_ribp_wrapper.sv
/top/ip_apb_wrapper.sv
/top/bus.sv
/top/rcu.sv
+19 -19
View File
@@ -30,11 +30,11 @@ module bus_formal_design (
output logic terminal_rsp
);
soc_rib_if mgmt_rib ();
soc_rib_burst_if user_rib ();
soc_rib_burst_if dma_rib ();
soc_rib_burst_if rib ();
rib_if apb_rib ();
soc_ribl_if mgmt_ribl ();
soc_rib_if user_rib ();
soc_rib_if dma_rib ();
soc_rib_if rib ();
ribp_if apb_ribp ();
(* anyseq *)logic f_mgmt_valid;
(* anyseq *)logic [31:0] f_mgmt_addr;
@@ -71,10 +71,10 @@ module bus_formal_design (
logic [ 2:0] fault_code;
logic user_idle;
assign mgmt_rib.valid = f_mgmt_valid;
assign mgmt_rib.addr = f_mgmt_addr;
assign mgmt_rib.wdata = f_mgmt_wdata;
assign mgmt_rib.wstrb = f_mgmt_wstrb;
assign mgmt_ribl.valid = f_mgmt_valid;
assign mgmt_ribl.addr = f_mgmt_addr;
assign mgmt_ribl.wdata = f_mgmt_wdata;
assign mgmt_ribl.wstrb = f_mgmt_wstrb;
assign user_rib.cmd_valid = f_user_cmd_valid;
assign user_rib.cmd_addr = f_user_cmd_addr;
@@ -138,13 +138,13 @@ module bus_formal_design (
end
end
assign apb_rib.ready = apb_rib.valid;
assign apb_rib.rdata = 32'h1234_5678;
assign apb_ribp.ready = apb_ribp.valid;
assign apb_ribp.rdata = 32'h1234_5678;
assign mgmt_valid = mgmt_rib.valid;
assign mgmt_addr = mgmt_rib.addr;
assign mgmt_wstrb = mgmt_rib.wstrb;
assign mgmt_ready = mgmt_rib.ready;
assign mgmt_valid = mgmt_ribl.valid;
assign mgmt_addr = mgmt_ribl.addr;
assign mgmt_wstrb = mgmt_ribl.wstrb;
assign mgmt_ready = mgmt_ribl.ready;
assign user_cmd_valid = user_rib.cmd_valid;
assign user_cmd_ready = user_rib.cmd_ready;
assign user_cmd_addr = user_rib.cmd_addr;
@@ -157,18 +157,18 @@ module bus_formal_design (
assign dma_cmd_len = dma_rib.cmd_len;
assign rib_cmd_valid = rib.cmd_valid;
assign rib_cmd_len = rib.cmd_len;
assign apb_valid = apb_rib.valid;
assign apb_valid = apb_ribp.valid;
bus u_dut (
.clk_i (clk_i),
.rst_n_i (rst_n_i),
.mgmt_rib (mgmt_rib),
.mgmt_ribl (mgmt_ribl),
.user_rib (user_rib),
.dma_rib (dma_rib),
.user_bus_enable_i(1'b1),
.user_bus_idle_o (user_idle),
.rib (rib),
.apb_rib (apb_rib),
.apb_ribp (apb_ribp),
.apb_resp_err_i (1'b0),
.perf_enable_i (1'b0),
.perf_clear_i (1'b0),
@@ -182,7 +182,7 @@ module bus_formal_design (
.perf_mgmt_wait_o (),
.perf_user_wait_o (),
.perf_dma_wait_o (),
.perf_rib_wait_o (),
.perf_ribp_wait_o (),
.perf_apb_wait_o (),
.perf_sdram_wait_o(),
.perf_psram_wait_o(),
+17 -15
View File
@@ -17,8 +17,8 @@ from filelist import FileList, write_filelist # noqa: E402
COMMON_RTL = ROOT / "rtl/managed/clusterip/common/rtl"
INTERCONNECT = ROOT / "rtl/ip/rib/interconnect"
PERIPHERAL = ROOT / "rtl/ip/rib/peripheral"
INTERCONNECT = ROOT / "rtl/ip/ribp/interconnect"
PERIPHERAL = ROOT / "rtl/ip/ribp/peripheral"
TOP = ROOT / "rtl/mini/top"
@@ -28,28 +28,28 @@ def target_defines(target: str) -> list[str]:
def source_files(target: str) -> list[Path]:
common = [
COMMON_RTL / "interface/rib_if.sv",
COMMON_RTL / "interface/ribp_if.sv",
COMMON_RTL / "interface/ram_if.sv",
COMMON_RTL / "utils/register.sv",
TOP / "soc_ribl_if.sv",
TOP / "soc_rib_if.sv",
TOP / "soc_rib_burst_if.sv",
]
if target == "bus":
return [
*common,
COMMON_RTL / "utils/spill_register.sv",
TOP / "soc_rib_legacy_to_burst.sv",
TOP / "soc_rib_burst_to_legacy.sv",
TOP / "soc_rib_burst_error_slave.sv",
TOP / "soc_rib_burst_ram.sv",
TOP / "soc_ribl2rib.sv",
TOP / "soc_rib2ribp.sv",
TOP / "soc_rib_error_slave.sv",
TOP / "soc_rib_ram.sv",
TOP / "bus.sv",
SCRIPT_DIR / "bus_formal.sv",
]
if target == "rib_adapter":
return [
*common,
TOP / "soc_rib_legacy_to_burst.sv",
TOP / "soc_rib_burst_to_legacy.sv",
TOP / "soc_ribl2rib.sv",
TOP / "soc_rib2ribp.sv",
SCRIPT_DIR / "rib_adapter_formal.sv",
]
if target == "spill_register":
@@ -58,14 +58,14 @@ def source_files(target: str) -> list[Path]:
COMMON_RTL / "utils/spill_register.sv",
SCRIPT_DIR / "spill_register_formal.sv",
]
if target == "rib2apb":
if target == "ribp2apb":
return [
COMMON_RTL / "interface/rib_if.sv",
COMMON_RTL / "interface/ribp_if.sv",
COMMON_RTL / "interface/apb4_pure_if.sv",
COMMON_RTL / "utils/register.sv",
COMMON_RTL / "utils/edge_det.sv",
INTERCONNECT / "rib2apb.sv",
SCRIPT_DIR / "rib2apb_formal.sv",
INTERCONNECT / "ribp2apb.sv",
SCRIPT_DIR / "ribp2apb_formal.sv",
]
if target == "sysctrl":
return [
@@ -78,6 +78,7 @@ def source_files(target: str) -> list[Path]:
return [
*common,
COMMON_RTL / "cdc/cdc_sync.sv",
COMMON_RTL / "cdc/cdc_rst_ctrlr.sv",
COMMON_RTL / "cdc/cdc_2phase.sv",
PERIPHERAL / "pll_ctrl_if.sv",
TOP / "rcu.sv",
@@ -87,6 +88,7 @@ def source_files(target: str) -> list[Path]:
return [
*common,
COMMON_RTL / "cdc/cdc_sync.sv",
COMMON_RTL / "cdc/cdc_rst_ctrlr.sv",
COMMON_RTL / "utils/edge_det.sv",
PERIPHERAL / "gpio.sv",
SCRIPT_DIR / "gpio_user_formal.sv",
@@ -127,7 +129,7 @@ def parse_args() -> argparse.Namespace:
"bus",
"rib_adapter",
"spill_register",
"rib2apb",
"ribp2apb",
"sysctrl",
"pll_rcu",
"gpio_user",
+3 -3
View File
@@ -24,7 +24,7 @@ module gpio_user_formal_design (
output logic [31:0] native_do
);
rib_if rib ();
ribp_if rib ();
gpio_if gpio ();
user_gpio_if user_gpio ();
@@ -70,10 +70,10 @@ module gpio_user_formal_design (
assign native_oe = u_dut.s_gpio_native_oe;
assign native_do = u_dut.s_gpio_native_out;
rib_gpio u_dut (
ribp_gpio u_dut (
.clk_i (clk_i),
.rst_n_i (rst_n_i),
.rib (rib),
.ribp (rib),
.gpio (gpio),
.user_gpio(user_gpio)
);
+80 -80
View File
@@ -21,11 +21,11 @@ module rib_adapter_formal_design (
output logic [ 2:0] rsp_code,
output logic [ 1:0] rsp_beat,
output logic rsp_last,
output logic legacy_valid,
output logic legacy_ready,
output logic [31:0] legacy_addr,
output logic [31:0] legacy_wdata,
output logic [ 3:0] legacy_wstrb,
output logic ribp_valid,
output logic ribp_ready,
output logic [31:0] ribp_addr,
output logic [31:0] ribp_wdata,
output logic [ 3:0] ribp_wstrb,
output logic source_valid,
output logic source_ready,
output logic [31:0] source_addr,
@@ -41,10 +41,10 @@ module rib_adapter_formal_design (
output logic adapted_wlast
);
soc_rib_burst_if burst_source ();
rib_if legacy_target ();
soc_rib_if legacy_source ();
soc_rib_burst_if burst_target ();
soc_rib_if rib_source ();
ribp_if ribp_target ();
soc_ribl_if ribl_source ();
soc_rib_if rib_target ();
(* anyseq *)logic f_cmd_valid;
(* anyseq *)logic [31:0] f_cmd_addr;
@@ -55,10 +55,10 @@ module rib_adapter_formal_design (
(* anyseq *)logic [ 3:0] f_wstrb;
(* anyseq *)logic f_wlast;
(* anyseq *)logic f_rsp_ready;
(* anyseq *)logic f_legacy_ready;
(* anyseq *)logic [31:0] f_legacy_rdata;
(* anyseq *)logic f_legacy_error;
(* anyseq *)logic [ 2:0] f_legacy_code;
(* anyseq *)logic f_ribp_ready;
(* anyseq *)logic [31:0] f_ribp_rdata;
(* anyseq *)logic f_ribp_error;
(* anyseq *)logic [ 2:0] f_ribp_code;
(* anyseq *)logic f_source_valid;
(* anyseq *)logic [31:0] f_source_addr;
@@ -71,82 +71,82 @@ module rib_adapter_formal_design (
(* anyseq *)logic f_target_error;
(* anyseq *)logic [ 2:0] f_target_code;
assign burst_source.cmd_valid = f_cmd_valid;
assign burst_source.cmd_addr = f_cmd_addr;
assign burst_source.cmd_write = f_cmd_write;
assign burst_source.cmd_len = f_cmd_len;
assign burst_source.w_valid = f_w_valid;
assign burst_source.wdata = f_wdata;
assign burst_source.wstrb = f_wstrb;
assign burst_source.wlast = f_wlast;
assign burst_source.rsp_ready = f_rsp_ready;
assign legacy_target.ready = f_legacy_ready;
assign legacy_target.rdata = f_legacy_rdata;
assign rib_source.cmd_valid = f_cmd_valid;
assign rib_source.cmd_addr = f_cmd_addr;
assign rib_source.cmd_write = f_cmd_write;
assign rib_source.cmd_len = f_cmd_len;
assign rib_source.w_valid = f_w_valid;
assign rib_source.wdata = f_wdata;
assign rib_source.wstrb = f_wstrb;
assign rib_source.wlast = f_wlast;
assign rib_source.rsp_ready = f_rsp_ready;
assign ribp_target.ready = f_ribp_ready;
assign ribp_target.rdata = f_ribp_rdata;
soc_rib_burst_to_legacy u_burst_to_legacy (
.clk_i (clk_i),
.rst_n_i (rst_n_i),
.legacy_resp_err_i (f_legacy_error),
.legacy_resp_code_i(f_legacy_code),
.burst (burst_source),
.legacy (legacy_target)
soc_rib2ribp u_rib2ribp (
.clk_i (clk_i),
.rst_n_i (rst_n_i),
.ribp_resp_err_i (f_ribp_error),
.ribp_resp_code_i(f_ribp_code),
.rib (rib_source),
.ribp (ribp_target)
);
assign legacy_source.valid = f_source_valid;
assign legacy_source.addr = f_source_addr;
assign legacy_source.wdata = f_source_wdata;
assign legacy_source.wstrb = f_source_wstrb;
assign burst_target.cmd_ready = f_target_cmd_ready;
assign burst_target.w_ready = f_target_w_ready;
assign burst_target.rsp_valid = f_target_rsp_valid;
assign burst_target.rdata = f_target_rdata;
assign burst_target.resp_err = f_target_error;
assign burst_target.resp_code = f_target_code;
assign burst_target.rsp_beat = '0;
assign burst_target.rsp_last = 1'b1;
assign ribl_source.valid = f_source_valid;
assign ribl_source.addr = f_source_addr;
assign ribl_source.wdata = f_source_wdata;
assign ribl_source.wstrb = f_source_wstrb;
assign rib_target.cmd_ready = f_target_cmd_ready;
assign rib_target.w_ready = f_target_w_ready;
assign rib_target.rsp_valid = f_target_rsp_valid;
assign rib_target.rdata = f_target_rdata;
assign rib_target.resp_err = f_target_error;
assign rib_target.resp_code = f_target_code;
assign rib_target.rsp_beat = '0;
assign rib_target.rsp_last = 1'b1;
soc_rib_legacy_to_burst u_legacy_to_burst (
soc_ribl2rib u_ribl2rib (
.clk_i (clk_i),
.rst_n_i(rst_n_i),
.legacy (legacy_source),
.burst (burst_target)
.ribl (ribl_source),
.rib (rib_target)
);
assign cmd_valid = burst_source.cmd_valid;
assign cmd_ready = burst_source.cmd_ready;
assign cmd_addr = burst_source.cmd_addr;
assign cmd_write = burst_source.cmd_write;
assign cmd_len = burst_source.cmd_len;
assign w_valid = burst_source.w_valid;
assign w_ready = burst_source.w_ready;
assign wdata = burst_source.wdata;
assign wstrb = burst_source.wstrb;
assign wlast = burst_source.wlast;
assign rsp_valid = burst_source.rsp_valid;
assign rsp_ready = burst_source.rsp_ready;
assign rsp_rdata = burst_source.rdata;
assign rsp_code = burst_source.resp_code;
assign rsp_beat = burst_source.rsp_beat;
assign rsp_last = burst_source.rsp_last;
assign legacy_valid = legacy_target.valid;
assign legacy_ready = legacy_target.ready;
assign legacy_addr = legacy_target.addr;
assign legacy_wdata = legacy_target.wdata;
assign legacy_wstrb = legacy_target.wstrb;
assign cmd_valid = rib_source.cmd_valid;
assign cmd_ready = rib_source.cmd_ready;
assign cmd_addr = rib_source.cmd_addr;
assign cmd_write = rib_source.cmd_write;
assign cmd_len = rib_source.cmd_len;
assign w_valid = rib_source.w_valid;
assign w_ready = rib_source.w_ready;
assign wdata = rib_source.wdata;
assign wstrb = rib_source.wstrb;
assign wlast = rib_source.wlast;
assign rsp_valid = rib_source.rsp_valid;
assign rsp_ready = rib_source.rsp_ready;
assign rsp_rdata = rib_source.rdata;
assign rsp_code = rib_source.resp_code;
assign rsp_beat = rib_source.rsp_beat;
assign rsp_last = rib_source.rsp_last;
assign ribp_valid = ribp_target.valid;
assign ribp_ready = ribp_target.ready;
assign ribp_addr = ribp_target.addr;
assign ribp_wdata = ribp_target.wdata;
assign ribp_wstrb = ribp_target.wstrb;
assign source_valid = legacy_source.valid;
assign source_ready = legacy_source.ready;
assign source_addr = legacy_source.addr;
assign source_wstrb = legacy_source.wstrb;
assign adapted_cmd_valid = burst_target.cmd_valid;
assign adapted_cmd_ready = burst_target.cmd_ready;
assign adapted_cmd_addr = burst_target.cmd_addr;
assign adapted_cmd_len = burst_target.cmd_len;
assign adapted_w_valid = burst_target.w_valid;
assign adapted_w_ready = burst_target.w_ready;
assign adapted_wdata = burst_target.wdata;
assign adapted_wstrb = burst_target.wstrb;
assign adapted_wlast = burst_target.wlast;
assign source_valid = ribl_source.valid;
assign source_ready = ribl_source.ready;
assign source_addr = ribl_source.addr;
assign source_wstrb = ribl_source.wstrb;
assign adapted_cmd_valid = rib_target.cmd_valid;
assign adapted_cmd_ready = rib_target.cmd_ready;
assign adapted_cmd_addr = rib_target.cmd_addr;
assign adapted_cmd_len = rib_target.cmd_len;
assign adapted_w_valid = rib_target.w_valid;
assign adapted_w_ready = rib_target.w_ready;
assign adapted_wdata = rib_target.wdata;
assign adapted_wstrb = rib_target.wstrb;
assign adapted_wlast = rib_target.wlast;
initial begin
rst_n_i = 1'b0;
+9 -9
View File
@@ -15,9 +15,9 @@ module rib_adapter_formal;
wire [31:0] rsp_rdata;
wire [ 2:0] rsp_code;
wire [ 1:0] rsp_beat;
wire legacy_valid, legacy_ready;
wire [31:0] legacy_addr, legacy_wdata;
wire [3:0] legacy_wstrb;
wire ribp_valid, ribp_ready;
wire [31:0] ribp_addr, ribp_wdata;
wire [3:0] ribp_wstrb;
wire source_valid, source_ready;
wire [31:0] source_addr;
wire [ 3:0] source_wstrb;
@@ -49,11 +49,11 @@ module rib_adapter_formal;
assume (source_wstrb == $past(source_wstrb));
end
if (rst_n_i) begin
if (f_past_valid && $past(rst_n_i && legacy_valid && !legacy_ready)) begin
assert (legacy_valid);
assert (legacy_addr == $past(legacy_addr));
assert (legacy_wdata == $past(legacy_wdata));
assert (legacy_wstrb == $past(legacy_wstrb));
if (f_past_valid && $past(rst_n_i && ribp_valid && !ribp_ready)) begin
assert (ribp_valid);
assert (ribp_addr == $past(ribp_addr));
assert (ribp_wdata == $past(ribp_wdata));
assert (ribp_wstrb == $past(ribp_wstrb));
end
if (f_past_valid && $past(rst_n_i && rsp_valid && !rsp_ready)) begin
assert (rsp_valid);
@@ -75,7 +75,7 @@ module rib_adapter_formal;
assert (adapted_wstrb == $past(adapted_wstrb));
assert (adapted_wlast);
end
cover (legacy_valid && cmd_len == 2'd3 && legacy_addr == cmd_addr + 32'd12);
cover (ribp_valid && cmd_len == 2'd3 && ribp_addr == cmd_addr + 32'd12);
cover (rsp_valid && rsp_last && rsp_beat == 2'd3);
cover (adapted_w_valid && adapted_wlast);
end
@@ -22,7 +22,7 @@ module formal_apb_slave (
endmodule
module rib2apb_formal_design (
module ribp2apb_formal_design (
input logic clk_i,
output logic rst_n_i,
output logic f_past_valid,
@@ -37,7 +37,7 @@ module rib2apb_formal_design (
output logic [ 1:0] fsm_q
);
rib_if rib ();
ribp_if rib ();
apb4_pure_if archinfo ();
apb4_pure_if rng ();
apb4_pure_if uart ();
@@ -75,10 +75,10 @@ module rib2apb_formal_design (
formal_apb_slave u_tmr_slave (.apb(tmr));
formal_apb_slave u_user_ip_slave (.apb(user_ip));
rib2apb u_dut (
ribp2apb u_dut (
.clk_i (clk_i),
.rst_n_i (rst_n_i),
.rib (rib),
.ribp (rib),
.archinfo(archinfo),
.rng (rng),
.uart (uart),
@@ -8,7 +8,7 @@
// MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
// See the Mulan PSL v2 for more details.
module rib2apb_formal;
module ribp2apb_formal;
localparam [1:0] FSM_SETP = 2'd1;
localparam [1:0] FSM_ENAB = 2'd2;
@@ -26,7 +26,7 @@ module rib2apb_formal;
wire xfer_ready;
wire [ 1:0] fsm_q;
rib2apb_formal_design u_design (
ribp2apb_formal_design u_design (
.clk_i (clk_i),
.rst_n_i (rst_n_i),
.f_past_valid(f_past_valid),
@@ -9,8 +9,8 @@ module spill_register_formal;
wire [31:0] data_i, data_o;
reg [1:0] count;
wire push = valid_i && ready_o;
wire pop = valid_o && ready_i;
wire push = valid_i && ready_o && !flush_i;
wire pop = valid_o && ready_i && !flush_i;
spill_register_formal_design u_design (.*);
@@ -22,16 +22,19 @@ module spill_register_formal;
if (!rst_n_i) begin
count <= 2'd0;
end else begin
assume (!(flush_i && valid_i));
if (f_past_valid && $past(rst_n_i && valid_i && !ready_o)) begin
assume (valid_i);
assume (data_i == $past(data_i));
end
assert (count <= 2'd2);
assert (valid_o == (count != 2'd0));
assert (ready_o == (count != 2'd2));
if (f_past_valid && $past(rst_n_i && valid_o && !ready_i && !flush_i)) begin
assert (valid_o == (!flush_i && (count != 2'd0)));
assert (ready_o == (!flush_i && (count != 2'd2)));
if (flush_i) begin
assert (!valid_o);
assert (!ready_o);
end
if (f_past_valid && !flush_i && $past(rst_n_i && valid_o && !ready_i && !flush_i)) begin
assert (valid_o);
assert (data_o == $past(data_o));
end
+4 -4
View File
@@ -33,7 +33,7 @@ module sysctrl_formal_design (
output logic [31:0] fault_count
);
rib_if rib ();
ribp_if rib ();
sysctrl_if sysctrl ();
pll_ctrl_if pll_ctrl ();
@@ -65,7 +65,7 @@ module sysctrl_formal_design (
assign sysctrl.perf_mgmt_wait_i = '0;
assign sysctrl.perf_user_wait_i = '0;
assign sysctrl.perf_dma_wait_i = '0;
assign sysctrl.perf_rib_wait_i = '0;
assign sysctrl.perf_ribp_wait_i = '0;
assign sysctrl.perf_apb_wait_i = '0;
assign sysctrl.perf_sdram_wait_i = '0;
assign sysctrl.perf_psram_wait_i = '0;
@@ -106,14 +106,14 @@ module sysctrl_formal_design (
assign fault_addr_q = u_dut.s_fault_addr_q;
assign fault_count = u_dut.s_fault_count_q;
rib_sysctrl u_dut (
ribp_sysctrl u_dut (
.clk_i (clk_i),
.rst_n_i (rst_n_i),
.fault_valid_i (f_fault_valid),
.fault_addr_i (f_fault_addr),
.fault_wstrb_i (f_fault_wstrb),
.fault_reserved_i(f_fault_reserved),
.rib (rib),
.ribp (rib),
.sysctrl (sysctrl),
.pll_ctrl (pll_ctrl)
);
+2 -2
View File
@@ -5,11 +5,11 @@ that is not part of the software address-map ABI or the package pad map.
The topology generator validates rib RIB and APB target ownership against
`../address_map/memory_map.json` and emits generated SystemVerilog include
files for `ip_rib_wrapper.sv`, `ip_apb_wrapper.sv`, `rib2apb.sv`, and
files for `ip_ribp_wrapper.sv`, `ip_apb_wrapper.sv`, `ribp2apb.sv`, and
`retrosoc.sv`. The output retains scalar interface instances and ports, so it
does not depend on interface-array support in FPGA or netlist simulation tools.
The `rib_targets` list uses stable response slots. Every active rib
The `ribp_targets` list uses stable response slots. Every active RIBP
memory-map region must appear exactly once. Disabled targets keep their slot
and interface declaration but cannot own an address region.
@@ -53,11 +53,11 @@
"reset": "s_dvp_pclk_rst_n_sync",
"reset_source": "rst_n_i",
"reset_primitive": "rst_sync",
"path": "rtl/ip/rib/multimedia/dvp.sv",
"path": "rtl/ip/ribp/multimedia/dvp.sv",
"instance": "u_dvp_pclk_rst_sync",
"sta": {
"source_port": "gpio_10_io_pad",
"pin": "u_retrosoc.u_ip_rib_wrapper/u_rib_dvp.u_dvp_pclk_clk_buf/clk_o",
"pin": "u_retrosoc.u_ip_ribp_wrapper.u_rib_dvp.u_dvp_pclk_clk_buf/clk_o",
"period_ns": 41.666666667,
"async_group": "dvp"
}
@@ -85,7 +85,7 @@
"source": "system",
"destination": "dvp",
"primitive": "cdc_sync",
"path": "rtl/ip/rib/multimedia/dvp.sv",
"path": "rtl/ip/ribp/multimedia/dvp.sv",
"instance": "u_dvp_recven_cdc_sync"
},
{
@@ -93,7 +93,7 @@
"source": "dvp",
"destination": "system",
"primitive": "async_fifo",
"path": "rtl/ip/rib/multimedia/dvp.sv",
"path": "rtl/ip/ribp/multimedia/dvp.sv",
"instance": "u_rx_async_fifo"
}
]
+75 -75
View File
@@ -18,25 +18,25 @@ SV_REFERENCE_RE = re.compile(r"[A-Za-z_][A-Za-z0-9_]*(?:\.[A-Za-z_][A-Za-z0-9_]*
SV_CONSTANT_RE = re.compile(r"(?:1'[bB][01]|'[01])$")
FABRIC_LINK_NAMES = ("mgmt", "user", "dma", "rib", "apb")
FABRIC_PROTOCOLS = {
"mgmt": "soc_legacy",
"user": "burst",
"dma": "burst",
"rib": "burst",
"apb": "legacy",
"mgmt": "ribl",
"user": "rib",
"dma": "rib",
"rib": "rib",
"apb": "ribp",
}
IRQ_GROUP_NAMES = ("rib", "apb")
IRQ_GROUP_NAMES = ("ribp", "apb")
IRQ_VECTOR_WIDTH = 32
COMPATIBILITY_IRQ_BINDINGS = (
("clint_software", "rib", 0, 0, "u_clint_if.sfr_irq_o"),
("clint_timer", "rib", 1, 1, "u_clint_if.tmr_irq_o"),
("uart0", "rib", 2, 2, "uart.irq_o"),
("timer0", "rib", 3, 3, "s_tim0_irq"),
("timer1", "rib", 4, 4, "s_tim1_irq"),
("psram", "rib", 5, 5, "psram.irq_o"),
("spisd", "rib", 6, 6, "spisd.irq_o"),
("i2c0", "rib", 7, 7, "i2c0.irq_o"),
("i2s", "rib", 8, 8, "i2s.irq_o"),
("xpi", "rib", 9, 9, "xpi.irq_o"),
("clint_software", "ribp", 0, 0, "u_clint_if.sfr_irq_o"),
("clint_timer", "ribp", 1, 1, "u_clint_if.tmr_irq_o"),
("uart0", "ribp", 2, 2, "uart.irq_o"),
("timer0", "ribp", 3, 3, "s_tim0_irq"),
("timer1", "ribp", 4, 4, "s_tim1_irq"),
("psram", "ribp", 5, 5, "psram.irq_o"),
("spisd", "ribp", 6, 6, "spisd.irq_o"),
("i2c0", "ribp", 7, 7, "i2c0.irq_o"),
("i2s", "ribp", 8, 8, "i2s.irq_o"),
("xpi", "ribp", 9, 9, "xpi.irq_o"),
("uart1", "apb", 0, 10, "uart.irq_o"),
("pwm", "apb", 1, 11, "pwm.irq_o"),
("ps2", "apb", 2, 12, "ps2.irq_o"),
@@ -48,7 +48,7 @@ COMPATIBILITY_IRQ_BINDINGS = (
@dataclass(frozen=True)
class RIBTarget:
class RIBPTarget:
slot: int
name: str
interface: str
@@ -181,76 +181,76 @@ def parse_regions(value: Any, field: str) -> tuple[str, ...]:
return regions
def parse_rib_targets(
def parse_ribp_targets(
value: Any, memory_regions: dict[str, dict[str, Any]]
) -> list[RIBTarget]:
) -> list[RIBPTarget]:
if not isinstance(value, list) or not value:
raise ValueError("rib_targets must be a non-empty list")
targets: list[RIBTarget] = []
raise ValueError("ribp_targets must be a non-empty list")
targets: list[RIBPTarget] = []
claimed_regions: set[str] = set()
names: set[str] = set()
interfaces: set[str] = set()
slots: set[int] = set()
for index, entry in enumerate(value):
target = require_object(entry, f"rib_targets[{index}]")
target = require_object(entry, f"ribp_targets[{index}]")
slot = target.get("slot")
if not isinstance(slot, int) or slot < 0:
raise ValueError(f"rib_targets[{index}].slot must be a non-negative integer")
name = require_identifier(target.get("name"), f"rib_targets[{index}].name")
raise ValueError(f"ribp_targets[{index}].slot must be a non-negative integer")
name = require_identifier(target.get("name"), f"ribp_targets[{index}].name")
interface = require_identifier(
target.get("interface"), f"rib_targets[{index}].interface"
target.get("interface"), f"ribp_targets[{index}].interface"
)
disabled = target.get("disabled", False)
if not isinstance(disabled, bool):
raise ValueError(f"rib_targets[{index}].disabled must be boolean")
raise ValueError(f"ribp_targets[{index}].disabled must be boolean")
if disabled:
if "regions" in target:
raise ValueError(f"rib_targets[{index}] is disabled but declares regions")
raise ValueError(f"ribp_targets[{index}] is disabled but declares regions")
regions: tuple[str, ...] = ()
else:
regions = parse_regions(target.get("regions"), f"rib_targets[{index}].regions")
regions = parse_regions(target.get("regions"), f"ribp_targets[{index}].regions")
for region_name in regions:
region = memory_regions.get(region_name)
if region is None:
raise ValueError(
f"rib_targets[{index}] references unknown region {region_name}"
f"ribp_targets[{index}] references unknown region {region_name}"
)
if region.get("route") != "rib" or region.get("kind") != "active":
if region.get("route") != "ribp" or region.get("kind") != "active":
raise ValueError(
f"rib_targets[{index}] region {region_name} is not an active rib region"
f"ribp_targets[{index}] region {region_name} is not an active RIBP region"
)
if region_name in claimed_regions:
raise ValueError(f"rib region {region_name} has multiple targets")
raise ValueError(f"RIBP region {region_name} has multiple targets")
claimed_regions.add(region_name)
if name in names:
raise ValueError(f"rib target name {name} is duplicated")
raise ValueError(f"RIBP target name {name} is duplicated")
if interface in interfaces:
raise ValueError(f"rib target interface {interface} is duplicated")
raise ValueError(f"RIBP target interface {interface} is duplicated")
if slot in slots:
raise ValueError(f"rib target slot {slot} is duplicated")
raise ValueError(f"RIBP target slot {slot} is duplicated")
names.add(name)
interfaces.add(interface)
slots.add(slot)
targets.append(RIBTarget(slot, name, interface, regions, disabled))
targets.append(RIBPTarget(slot, name, interface, regions, disabled))
ordered = sorted(targets, key=lambda item: item.slot)
if [target.slot for target in ordered] != list(range(len(ordered))):
raise ValueError("rib target slots must be contiguous from zero")
active_rib_regions = {
raise ValueError("RIBP target slots must be contiguous from zero")
active_ribp_regions = {
symbol
for symbol, region in memory_regions.items()
if region.get("route") == "rib" and region.get("kind") == "active"
if region.get("route") == "ribp" and region.get("kind") == "active"
}
if claimed_regions != active_rib_regions:
missing = sorted(active_rib_regions - claimed_regions)
extra = sorted(claimed_regions - active_rib_regions)
if claimed_regions != active_ribp_regions:
missing = sorted(active_ribp_regions - claimed_regions)
extra = sorted(claimed_regions - active_ribp_regions)
details: list[str] = []
if missing:
details.append(f"missing {', '.join(missing)}")
if extra:
details.append(f"extra {', '.join(extra)}")
raise ValueError(
f"rib target regions do not cover the memory map ({'; '.join(details)})"
f"RIBP target regions do not cover the memory map ({'; '.join(details)})"
)
return ordered
@@ -496,7 +496,7 @@ def validate_compatibility_irq_bindings(interrupts: list[Interrupt]) -> None:
def read_topology(
topology_path: Path, memory_map_path: Path
) -> tuple[
list[RIBTarget],
list[RIBPTarget],
list[ApbTarget],
list[FabricLink],
list[GpioFunction],
@@ -518,7 +518,7 @@ def read_topology(
interrupts = parse_interrupts(document.get("interrupts"), irq_groups, irq_vector_width)
validate_compatibility_irq_bindings(interrupts)
return (
parse_rib_targets(document.get("rib_targets"), memory_regions),
parse_ribp_targets(document.get("ribp_targets"), memory_regions),
parse_apb_targets(document.get("apb_targets"), memory_regions),
parse_fabric_links(document.get("fabric_links")),
parse_gpio_functions(document.get("gpio_alt_functions"), gpio_pins),
@@ -528,21 +528,21 @@ def read_topology(
)
def render_rib_interfaces(targets: list[RIBTarget]) -> str:
def render_ribp_interfaces(targets: list[RIBPTarget]) -> str:
lines = ["// Generated by rtl/mini/integration/generate_soc_topology.py; do not edit."]
lines.extend(f" rib_if {target.interface} ();" for target in targets)
lines.extend(f" ribp_if {target.interface} ();" for target in targets)
return "\n".join(lines) + "\n"
def render_region_select(region: str, memory_region: dict[str, Any]) -> str:
base = int(require_string(memory_region.get("base"), f"memory map region {region}.base"), 0)
if base == 0:
return f"(rib.addr <= `SOC_ADDR_{region}_END)"
return f"`SOC_ADDR_IS_{region}(rib.addr)"
return f"(ribp.addr <= `SOC_ADDR_{region}_END)"
return f"`SOC_ADDR_IS_{region}(ribp.addr)"
def render_rib_routes(
targets: list[RIBTarget], memory_regions: dict[str, dict[str, Any]]
def render_ribp_routes(
targets: list[RIBPTarget], memory_regions: dict[str, dict[str, Any]]
) -> str:
count = len(targets)
lines = ["// Generated by rtl/mini/integration/generate_soc_topology.py; do not edit."]
@@ -568,13 +568,13 @@ def render_rib_routes(
f"{render_region_select(region, memory_regions[region])};"
)
lines.append(
f" assign {target.interface}.valid = rib.valid && (|s_{target.name}_region_sel);"
f" assign {target.interface}.valid = ribp.valid && (|s_{target.name}_region_sel);"
)
lines.extend(
[
f" assign {target.interface}.addr = rib.addr;",
f" assign {target.interface}.wdata = rib.wdata;",
f" assign {target.interface}.wstrb = rib.wstrb;",
f" assign {target.interface}.addr = ribp.addr;",
f" assign {target.interface}.wdata = ribp.wdata;",
f" assign {target.interface}.wstrb = ribp.wstrb;",
f" assign s_slv_sel_d[{target.slot}] = {target.interface}.valid;",
f" assign s_slv_ready[{target.slot}] = {target.interface}.ready;",
f" assign s_slv_rdata[{target.slot}] = {target.interface}.rdata;",
@@ -590,13 +590,13 @@ def render_rib_routes(
" s_slv_sel_q",
" );",
"",
" assign rib.ready = |(s_slv_sel_q & s_slv_ready);",
" assign ribp.ready = |(s_slv_sel_q & s_slv_ready);",
"",
" always_comb begin",
" rib.rdata = '0;",
" ribp.rdata = '0;",
f" for (int index = 0; index < {count}; index++) begin",
" if (s_slv_sel_q[index]) begin",
" rib.rdata = rib.rdata | s_slv_rdata[index];",
" ribp.rdata = ribp.rdata | s_slv_rdata[index];",
" end",
" end",
" end",
@@ -665,13 +665,13 @@ def render_apb_request_routes(targets: list[ApbTarget]) -> str:
for target in targets:
lines.extend(
[
f" assign {target.name}.paddr = rib.addr;",
f" assign {target.name}.paddr = ribp.addr;",
f" assign {target.name}.pprot = '0;",
f" assign {target.name}.psel = s_xfer_valid && `SOC_ADDR_IS_{target.region}(rib.addr);",
f" assign {target.name}.psel = s_xfer_valid && `SOC_ADDR_IS_{target.region}(ribp.addr);",
f" assign {target.name}.penable = s_fsm_q == FSM_ENAB;",
f" assign {target.name}.pwrite = |rib.wstrb;",
f" assign {target.name}.pwdata = rib.wdata;",
f" assign {target.name}.pstrb = rib.wstrb;",
f" assign {target.name}.pwrite = |ribp.wstrb;",
f" assign {target.name}.pwdata = ribp.wdata;",
f" assign {target.name}.pstrb = ribp.wstrb;",
"",
]
)
@@ -681,7 +681,7 @@ def render_apb_request_routes(targets: list[ApbTarget]) -> str:
def render_apb_select_routes(targets: list[ApbTarget]) -> str:
lines = ["// Generated by rtl/mini/integration/generate_soc_topology.py; do not edit."]
lines.extend(
f" assign s_psel_comb[{target.slot}] = `SOC_ADDR_IS_{target.region}(rib.addr);"
f" assign s_psel_comb[{target.slot}] = `SOC_ADDR_IS_{target.region}(ribp.addr);"
for target in targets
)
return "\n".join(lines) + "\n"
@@ -706,9 +706,9 @@ def render_apb_response_mux(targets: list[ApbTarget]) -> str:
def render_fabric_interfaces(links: list[FabricLink]) -> str:
lines = ["// Generated by rtl/mini/integration/generate_soc_topology.py; do not edit."]
interface_types = {
"soc_legacy": "soc_rib_if",
"burst": "soc_rib_burst_if",
"legacy": "rib_if",
"ribl": "soc_ribl_if",
"rib": "soc_rib_if",
"ribp": "ribp_if",
}
lines.extend(
f" {interface_types[link.protocol]} {link.interface} ();"
@@ -730,11 +730,11 @@ def render_fabric_connection(links: list[FabricLink], name: str, port: str) -> s
def render_bus_fabric_connections(links: list[FabricLink]) -> str:
port_names = {
"mgmt": "mgmt_rib",
"mgmt": "mgmt_ribl",
"user": "user_rib",
"dma": "dma_rib",
"rib": "rib",
"apb": "apb_rib",
"apb": "apb_ribp",
}
interfaces = {link.name: link.interface for link in links}
lines = ["// Generated by rtl/mini/integration/generate_soc_topology.py; do not edit."]
@@ -876,8 +876,8 @@ def generate(topology_path: Path, memory_map_path: Path, output_dir: Path) -> No
) = read_topology(topology_path, memory_map_path)
memory_regions = read_memory_regions(memory_map_path)
rtl_dir = output_dir / "rtl"
atomic_write(rtl_dir / "soc_rib_interfaces.svh", render_rib_interfaces(targets))
atomic_write(rtl_dir / "soc_rib_routes.svh", render_rib_routes(targets, memory_regions))
atomic_write(rtl_dir / "soc_ribp_interfaces.svh", render_ribp_interfaces(targets))
atomic_write(rtl_dir / "soc_ribp_routes.svh", render_ribp_routes(targets, memory_regions))
atomic_write(rtl_dir / "soc_apb_interfaces.svh", render_apb_interfaces(apb_targets))
atomic_write(rtl_dir / "soc_apb_bridges.svh", render_apb_bridges(apb_targets))
atomic_write(rtl_dir / "soc_apb_ports.svh", render_apb_ports(apb_targets))
@@ -889,7 +889,7 @@ def generate(topology_path: Path, memory_map_path: Path, output_dir: Path) -> No
atomic_write(rtl_dir / "soc_fabric_interfaces.svh", render_fabric_interfaces(fabric_links))
atomic_write(
rtl_dir / "soc_mgmt_core_wrapper_fabric.svh",
render_fabric_connection(fabric_links, "mgmt", "rib"),
render_fabric_connection(fabric_links, "mgmt", "ribl"),
)
atomic_write(
rtl_dir / "soc_user_core_fabric.svh",
@@ -897,13 +897,13 @@ def generate(topology_path: Path, memory_map_path: Path, output_dir: Path) -> No
)
atomic_write(rtl_dir / "soc_bus_fabric.svh", render_bus_fabric_connections(fabric_links))
atomic_write(
rtl_dir / "soc_ip_rib_wrapper_fabric.svh",
render_fabric_connection(fabric_links, "rib", "burst_rib")
rtl_dir / "soc_ip_ribp_wrapper_fabric.svh",
render_fabric_connection(fabric_links, "rib", "rib")
+ render_fabric_connection(fabric_links, "dma", "dma_rib"),
)
atomic_write(
rtl_dir / "soc_ip_apb_wrapper_fabric.svh",
render_fabric_connection(fabric_links, "apb", "rib"),
render_fabric_connection(fabric_links, "apb", "ribp"),
)
atomic_write(rtl_dir / "soc_gpio_alt_bindings.svh", render_gpio_bindings(gpio_functions))
atomic_write(rtl_dir / "soc_irq_config.svh", render_irq_config(irq_vector_width, irq_groups))
@@ -84,8 +84,8 @@ def parse_targets(
instance = require_identifier(target.get("instance"), f"{field}[{index}].instance")
if field == "core_targets":
bus = target.get("bus")
if bus not in {"legacy", "burst"}:
raise ValueError(f"{field}[{index}].bus must be legacy or burst")
if bus not in {"ribp", "rib"}:
raise ValueError(f"{field}[{index}].bus must be ribp or rib")
reset = target.get("reset")
if reset not in {"sync", "async"}:
raise ValueError(f"{field}[{index}].reset must be sync or async")
@@ -130,21 +130,21 @@ def render_core_bindings(extensions: ExtensionMap) -> str:
for target in extensions.core_targets:
lines.extend(
[
f" soc_rib_burst_if u_user_{target.slot}_burst_rib_if ();",
f" soc_rib_if u_user_{target.slot}_rib_if ();",
f" logic [31:0] s_user_{target.slot}_irq;",
]
)
if target.bus == "legacy":
if target.bus == "ribp":
lines.extend(
[
f" rib_if u_user_{target.slot}_legacy_rib_if ();",
" rib_legacy_to_burst #(",
f" ribp_if u_user_{target.slot}_ribp_if ();",
" ribp2rib #(",
f" .SYNC_RESET(1'b{int(target.reset == 'sync')})",
f" ) u_user_{target.slot}_legacy_to_burst (",
f" ) u_user_{target.slot}_ribp2rib (",
" .clk_i (clk_i),",
f" .rst_n_i(rst_n_i && ~core_reset_i[{target.slot}]),",
f" .legacy(u_user_{target.slot}_legacy_rib_if),",
f" .burst (u_user_{target.slot}_burst_rib_if)",
f" .ribp (u_user_{target.slot}_ribp_if),",
f" .rib (u_user_{target.slot}_rib_if)",
" );",
]
)
@@ -166,14 +166,14 @@ def render_core_bindings(extensions: ExtensionMap) -> str:
for target in extensions.core_targets:
lines.extend(
[
f" u_user_{target.slot}_burst_rib_if.cmd_ready = '0;",
f" u_user_{target.slot}_burst_rib_if.w_ready = '0;",
f" u_user_{target.slot}_burst_rib_if.rsp_valid = '0;",
f" u_user_{target.slot}_burst_rib_if.rdata = '0;",
f" u_user_{target.slot}_burst_rib_if.resp_err = '0;",
f" u_user_{target.slot}_burst_rib_if.resp_code = '0;",
f" u_user_{target.slot}_burst_rib_if.rsp_beat = '0;",
f" u_user_{target.slot}_burst_rib_if.rsp_last = '0;",
f" u_user_{target.slot}_rib_if.cmd_ready = '0;",
f" u_user_{target.slot}_rib_if.w_ready = '0;",
f" u_user_{target.slot}_rib_if.rsp_valid = '0;",
f" u_user_{target.slot}_rib_if.rdata = '0;",
f" u_user_{target.slot}_rib_if.resp_err = '0;",
f" u_user_{target.slot}_rib_if.resp_code = '0;",
f" u_user_{target.slot}_rib_if.rsp_beat = '0;",
f" u_user_{target.slot}_rib_if.rsp_last = '0;",
f" s_user_{target.slot}_irq = '0;",
]
)
@@ -182,23 +182,23 @@ def render_core_bindings(extensions: ExtensionMap) -> str:
lines.extend(
[
f" {extensions.core_selector_width}'d{target.slot}: begin",
f" rib.cmd_valid = u_user_{target.slot}_burst_rib_if.cmd_valid;",
f" rib.cmd_addr = u_user_{target.slot}_burst_rib_if.cmd_addr;",
f" rib.cmd_write = u_user_{target.slot}_burst_rib_if.cmd_write;",
f" rib.cmd_len = u_user_{target.slot}_burst_rib_if.cmd_len;",
f" rib.w_valid = u_user_{target.slot}_burst_rib_if.w_valid;",
f" rib.wdata = u_user_{target.slot}_burst_rib_if.wdata;",
f" rib.wstrb = u_user_{target.slot}_burst_rib_if.wstrb;",
f" rib.wlast = u_user_{target.slot}_burst_rib_if.wlast;",
f" rib.rsp_ready = u_user_{target.slot}_burst_rib_if.rsp_ready;",
f" u_user_{target.slot}_burst_rib_if.cmd_ready = rib.cmd_ready;",
f" u_user_{target.slot}_burst_rib_if.w_ready = rib.w_ready;",
f" u_user_{target.slot}_burst_rib_if.rsp_valid = rib.rsp_valid;",
f" u_user_{target.slot}_burst_rib_if.rdata = rib.rdata;",
f" u_user_{target.slot}_burst_rib_if.resp_err = rib.resp_err;",
f" u_user_{target.slot}_burst_rib_if.resp_code = rib.resp_code;",
f" u_user_{target.slot}_burst_rib_if.rsp_beat = rib.rsp_beat;",
f" u_user_{target.slot}_burst_rib_if.rsp_last = rib.rsp_last;",
f" rib.cmd_valid = u_user_{target.slot}_rib_if.cmd_valid;",
f" rib.cmd_addr = u_user_{target.slot}_rib_if.cmd_addr;",
f" rib.cmd_write = u_user_{target.slot}_rib_if.cmd_write;",
f" rib.cmd_len = u_user_{target.slot}_rib_if.cmd_len;",
f" rib.w_valid = u_user_{target.slot}_rib_if.w_valid;",
f" rib.wdata = u_user_{target.slot}_rib_if.wdata;",
f" rib.wstrb = u_user_{target.slot}_rib_if.wstrb;",
f" rib.wlast = u_user_{target.slot}_rib_if.wlast;",
f" rib.rsp_ready = u_user_{target.slot}_rib_if.rsp_ready;",
f" u_user_{target.slot}_rib_if.cmd_ready = rib.cmd_ready;",
f" u_user_{target.slot}_rib_if.w_ready = rib.w_ready;",
f" u_user_{target.slot}_rib_if.rsp_valid = rib.rsp_valid;",
f" u_user_{target.slot}_rib_if.rdata = rib.rdata;",
f" u_user_{target.slot}_rib_if.resp_err = rib.resp_err;",
f" u_user_{target.slot}_rib_if.resp_code = rib.resp_code;",
f" u_user_{target.slot}_rib_if.rsp_beat = rib.rsp_beat;",
f" u_user_{target.slot}_rib_if.rsp_last = rib.rsp_last;",
f" s_user_{target.slot}_irq = irq_i;",
" end",
]
@@ -206,18 +206,18 @@ def render_core_bindings(extensions: ExtensionMap) -> str:
lines.extend([" default: ;", " endcase", " end", ""])
for target in extensions.core_targets:
interface = (
f"u_user_{target.slot}_legacy_rib_if"
if target.bus == "legacy"
else f"u_user_{target.slot}_burst_rib_if"
f"u_user_{target.slot}_ribp_if"
if target.bus == "ribp"
else f"u_user_{target.slot}_rib_if"
)
lines.extend(
[
f" // User core {target.slot} uses the {target.bus} RIB contract.",
f" // User core {target.slot} uses the {target.bus.upper()} contract.",
f" {target.module} #({target.slot}) {target.instance} (",
" .clk_i (clk_i),",
f" .rst_n_i(rst_n_i && ~core_reset_i[{target.slot}]),",
f" .irq_i (s_user_{target.slot}_irq),",
f" .rib ({interface})",
f" .{target.bus} ({interface})",
" );",
"",
]
+35 -35
View File
@@ -3,20 +3,20 @@
"gpio_pins": 32,
"irq_vector_width": 32,
"irq_groups": [
{"name": "rib", "width": 10, "top_signal": "s_rib_irq"},
{"name": "ribp", "width": 10, "top_signal": "s_ribp_irq"},
{"name": "apb", "width": 7, "top_signal": "s_apb_irq"}
],
"interrupts": [
{"name": "clint_software", "description": "CLINT machine software interrupt", "group": "rib", "group_bit": 0, "core_bit": 0, "signal": "u_clint_if.sfr_irq_o"},
{"name": "clint_timer", "description": "CLINT machine timer interrupt", "group": "rib", "group_bit": 1, "core_bit": 1, "signal": "u_clint_if.tmr_irq_o"},
{"name": "uart0", "description": "RIB UART0 interrupt", "group": "rib", "group_bit": 2, "core_bit": 2, "signal": "uart.irq_o"},
{"name": "timer0", "description": "RIB timer0 interrupt", "group": "rib", "group_bit": 3, "core_bit": 3, "signal": "s_tim0_irq"},
{"name": "timer1", "description": "RIB timer1 interrupt", "group": "rib", "group_bit": 4, "core_bit": 4, "signal": "s_tim1_irq"},
{"name": "psram", "description": "PSRAM controller interrupt", "group": "rib", "group_bit": 5, "core_bit": 5, "signal": "psram.irq_o"},
{"name": "spisd", "description": "SPI SD controller interrupt", "group": "rib", "group_bit": 6, "core_bit": 6, "signal": "spisd.irq_o"},
{"name": "i2c0", "description": "RIB I2C0 interrupt", "group": "rib", "group_bit": 7, "core_bit": 7, "signal": "i2c0.irq_o"},
{"name": "i2s", "description": "RIB I2S interrupt", "group": "rib", "group_bit": 8, "core_bit": 8, "signal": "i2s.irq_o"},
{"name": "xpi", "description": "XPI controller interrupt", "group": "rib", "group_bit": 9, "core_bit": 9, "signal": "xpi.irq_o"},
{"name": "clint_software", "description": "CLINT machine software interrupt", "group": "ribp", "group_bit": 0, "core_bit": 0, "signal": "u_clint_if.sfr_irq_o"},
{"name": "clint_timer", "description": "CLINT machine timer interrupt", "group": "ribp", "group_bit": 1, "core_bit": 1, "signal": "u_clint_if.tmr_irq_o"},
{"name": "uart0", "description": "RIBP UART0 interrupt", "group": "ribp", "group_bit": 2, "core_bit": 2, "signal": "uart.irq_o"},
{"name": "timer0", "description": "RIBP timer0 interrupt", "group": "ribp", "group_bit": 3, "core_bit": 3, "signal": "s_tim0_irq"},
{"name": "timer1", "description": "RIBP timer1 interrupt", "group": "ribp", "group_bit": 4, "core_bit": 4, "signal": "s_tim1_irq"},
{"name": "psram", "description": "PSRAM controller interrupt", "group": "ribp", "group_bit": 5, "core_bit": 5, "signal": "psram.irq_o"},
{"name": "spisd", "description": "SPI SD controller interrupt", "group": "ribp", "group_bit": 6, "core_bit": 6, "signal": "spisd.irq_o"},
{"name": "i2c0", "description": "RIBP I2C0 interrupt", "group": "ribp", "group_bit": 7, "core_bit": 7, "signal": "i2c0.irq_o"},
{"name": "i2s", "description": "RIBP I2S interrupt", "group": "ribp", "group_bit": 8, "core_bit": 8, "signal": "i2s.irq_o"},
{"name": "xpi", "description": "XPI controller interrupt", "group": "ribp", "group_bit": 9, "core_bit": 9, "signal": "xpi.irq_o"},
{"name": "uart1", "description": "APB UART1 interrupt", "group": "apb", "group_bit": 0, "core_bit": 10, "signal": "uart.irq_o"},
{"name": "pwm", "description": "APB PWM interrupt", "group": "apb", "group_bit": 1, "core_bit": 11, "signal": "pwm.irq_o"},
{"name": "ps2", "description": "APB PS2 interrupt", "group": "apb", "group_bit": 2, "core_bit": 12, "signal": "ps2.irq_o"},
@@ -25,32 +25,32 @@
{"name": "advanced_timer", "description": "APB advanced timer interrupt", "group": "apb", "group_bit": 5, "core_bit": 15, "signal": "u_tmr_if.irq_o"},
{"name": "reserved", "description": "Reserved interrupt slot", "group": "apb", "group_bit": 6, "core_bit": 16, "signal": "1'b0"}
],
"rib_targets": [
{"slot": 0, "name": "uart0", "interface": "u_uart_rib_if", "regions": ["RIB_UART0"]},
{"slot": 1, "name": "gpio", "interface": "u_gpio_rib_if", "regions": ["RIB_GPIO"]},
{"slot": 2, "name": "tim0", "interface": "u_tim0_rib_if", "regions": ["RIB_TIM0"]},
{"slot": 3, "name": "tim1", "interface": "u_tim1_rib_if", "regions": ["RIB_TIM1"]},
{"slot": 4, "name": "psram", "interface": "u_psram_rib_if", "regions": ["RIB_PSRAM", "PSRAM"]},
{"slot": 5, "name": "spisd", "interface": "u_spisd_rib_if", "regions": ["RIB_SPISD", "SPISD"]},
{"slot": 6, "name": "i2c0", "interface": "u_i2c0_rib_if", "regions": ["RIB_I2C0"]},
{"slot": 7, "name": "i2s", "interface": "u_i2s_rib_if", "regions": ["RIB_I2S"]},
{"slot": 8, "name": "onewire", "interface": "u_onewire_rib_if", "regions": ["RIB_ONEWIRE"]},
{"slot": 9, "name": "xpi", "interface": "u_xpi_rib_if", "regions": ["RIB_XPI", "FLASH", "XPI"]},
{"slot": 10, "name": "dma", "interface": "u_dma_rib_if", "regions": ["RIB_DMA"]},
{"slot": 11, "name": "sysctrl", "interface": "u_sysctrl_rib_if", "regions": ["RIB_SYSCTRL"]},
{"slot": 12, "name": "clint", "interface": "u_clint_rib_if", "regions": ["RIB_CLINT"]},
{"slot": 13, "name": "sdram", "interface": "u_sdram_rib_if", "regions": ["RIB_SDRAM", "SDRAM"]},
{"slot": 14, "name": "dvp", "interface": "u_dvp_rib_if", "regions": ["RIB_DVP"]},
{"slot": 15, "name": "sdio", "interface": "u_sdio_rib_if", "disabled": true},
{"slot": 16, "name": "opipsram", "interface": "u_opipsram_rib_if", "disabled": true},
{"slot": 17, "name": "i2c1", "interface": "u_i2c1_rib_if", "regions": ["RIB_I2C1"]}
"ribp_targets": [
{"slot": 0, "name": "uart0", "interface": "u_uart_ribp_if", "regions": ["RIBP_UART0"]},
{"slot": 1, "name": "gpio", "interface": "u_gpio_ribp_if", "regions": ["RIBP_GPIO"]},
{"slot": 2, "name": "tim0", "interface": "u_tim0_ribp_if", "regions": ["RIBP_TIM0"]},
{"slot": 3, "name": "tim1", "interface": "u_tim1_ribp_if", "regions": ["RIBP_TIM1"]},
{"slot": 4, "name": "psram", "interface": "u_psram_ribp_if", "regions": ["RIBP_PSRAM", "PSRAM"]},
{"slot": 5, "name": "spisd", "interface": "u_spisd_ribp_if", "regions": ["RIBP_SPISD", "SPISD"]},
{"slot": 6, "name": "i2c0", "interface": "u_i2c0_ribp_if", "regions": ["RIBP_I2C0"]},
{"slot": 7, "name": "i2s", "interface": "u_i2s_ribp_if", "regions": ["RIBP_I2S"]},
{"slot": 8, "name": "onewire", "interface": "u_onewire_ribp_if", "regions": ["RIBP_ONEWIRE"]},
{"slot": 9, "name": "xpi", "interface": "u_xpi_ribp_if", "regions": ["RIBP_XPI", "FLASH", "XPI"]},
{"slot": 10, "name": "dma", "interface": "u_dma_ribp_if", "regions": ["RIBP_DMA"]},
{"slot": 11, "name": "sysctrl", "interface": "u_sysctrl_ribp_if", "regions": ["RIBP_SYSCTRL"]},
{"slot": 12, "name": "clint", "interface": "u_clint_ribp_if", "regions": ["RIBP_CLINT"]},
{"slot": 13, "name": "sdram", "interface": "u_sdram_ribp_if", "regions": ["RIBP_SDRAM", "SDRAM"]},
{"slot": 14, "name": "dvp", "interface": "u_dvp_ribp_if", "regions": ["RIBP_DVP"]},
{"slot": 15, "name": "sdio", "interface": "u_sdio_ribp_if", "disabled": true},
{"slot": 16, "name": "opipsram", "interface": "u_opipsram_ribp_if", "disabled": true},
{"slot": 17, "name": "i2c1", "interface": "u_i2c1_ribp_if", "regions": ["RIBP_I2C1"]}
],
"fabric_links": [
{"name": "mgmt", "interface": "u_mgmt_rib_if", "protocol": "soc_legacy"},
{"name": "user", "interface": "u_user_rib_if", "protocol": "burst"},
{"name": "dma", "interface": "u_dma_rib_if", "protocol": "burst"},
{"name": "rib", "interface": "u_rib_if", "protocol": "burst"},
{"name": "apb", "interface": "u_apb_rib_if", "protocol": "legacy"}
{"name": "mgmt", "interface": "u_mgmt_ribl_if", "protocol": "ribl"},
{"name": "user", "interface": "u_user_rib_if", "protocol": "rib"},
{"name": "dma", "interface": "u_dma_rib_if", "protocol": "rib"},
{"name": "rib", "interface": "u_rib_if", "protocol": "rib"},
{"name": "apb", "interface": "u_apb_ribp_if", "protocol": "ribp"}
],
"apb_targets": [
{"slot": 0, "name": "archinfo", "timed_interface": "u_archinfo_apb_if", "pure_interface": "u_archinfo_apb_pure_if", "region": "APB_ARCHINFO"},
+6 -6
View File
@@ -4,12 +4,12 @@
"ip_selector_width": 8,
"gpio_width": 32,
"core_targets": [
{"slot": 0, "module": "user_core_design_username1", "instance": "u_user_core_design_username1", "bus": "legacy", "reset": "sync"},
{"slot": 1, "module": "user_core_design_username2", "instance": "u_user_core_design_username2", "bus": "legacy", "reset": "sync"},
{"slot": 2, "module": "user_core_design_username3", "instance": "u_user_core_design_username3", "bus": "legacy", "reset": "async"},
{"slot": 3, "module": "user_core_design_username4", "instance": "u_user_core_design_username4", "bus": "legacy", "reset": "async"},
{"slot": 4, "module": "user_core_design_username5", "instance": "u_user_core_design_username5", "bus": "legacy", "reset": "async"},
{"slot": 5, "module": "user_core_design_username6", "instance": "u_user_core_design_username6", "bus": "legacy", "reset": "async"}
{"slot": 0, "module": "user_core_design_username1", "instance": "u_user_core_design_username1", "bus": "ribp", "reset": "sync"},
{"slot": 1, "module": "user_core_design_username2", "instance": "u_user_core_design_username2", "bus": "ribp", "reset": "sync"},
{"slot": 2, "module": "user_core_design_username3", "instance": "u_user_core_design_username3", "bus": "ribp", "reset": "async"},
{"slot": 3, "module": "user_core_design_username4", "instance": "u_user_core_design_username4", "bus": "ribp", "reset": "async"},
{"slot": 4, "module": "user_core_design_username5", "instance": "u_user_core_design_username5", "bus": "ribp", "reset": "async"},
{"slot": 5, "module": "user_core_design_username6", "instance": "u_user_core_design_username6", "bus": "ribp", "reset": "async"}
],
"ip_targets": [
{"slot": 1, "module": "user_ip_design_username1", "instance": "u_user_ip_design_username1"},
+18 -16
View File
@@ -6,7 +6,7 @@ FORMAL_SOLVER_DIR := $(FORMAL_DIR)/bin
FORMAL_SOLVER_WRAPPER := $(FORMAL_SOLVER_DIR)/bitwuzla
FORMAL_DEPTH ?= 20
FORMAL_TIMEOUT ?= 60
FORMAL_TARGETS := bus rib_adapter spill_register rib2apb sysctrl pll_rcu gpio_user
FORMAL_TARGETS := bus rib_adapter spill_register ribp2apb sysctrl pll_rcu gpio_user
FORMAL_FILELIST_GENERATOR := $(RTL_PATH)/formal/generate_formal_filelist.py
FORMAL_SBY_GENERATOR := $(RTL_PATH)/formal/generate_sby_config.py
FORMAL_RESULT_GENERATOR := $(RTL_PATH)/formal/formal_results.py
@@ -16,8 +16,8 @@ FORMAL_SOURCE_FILES := $(RTL_PATH)/formal/bus_formal.sv \
$(RTL_PATH)/formal/rib_adapter_formal_props.v \
$(RTL_PATH)/formal/spill_register_formal.sv \
$(RTL_PATH)/formal/spill_register_formal_props.v \
$(RTL_PATH)/formal/rib2apb_formal.sv \
$(RTL_PATH)/formal/rib2apb_formal_props.v \
$(RTL_PATH)/formal/ribp2apb_formal.sv \
$(RTL_PATH)/formal/ribp2apb_formal_props.v \
$(RTL_PATH)/formal/sysctrl_formal.sv \
$(RTL_PATH)/formal/sysctrl_formal_props.v \
$(RTL_PATH)/formal/pll_rcu_formal.sv \
@@ -25,20 +25,22 @@ FORMAL_SOURCE_FILES := $(RTL_PATH)/formal/bus_formal.sv \
$(RTL_PATH)/formal/gpio_user_formal.sv \
$(RTL_PATH)/formal/gpio_user_formal_props.v \
$(RTL_PATH)/top/bus.sv \
$(RTL_PATH)/top/soc_rib_burst_error_slave.sv \
$(RTL_PATH)/top/soc_rib_burst_if.sv \
$(RTL_PATH)/top/soc_rib_burst_ram.sv \
$(RTL_PATH)/top/soc_rib_burst_to_legacy.sv \
$(RTL_PATH)/top/soc_rib_legacy_to_burst.sv \
$(ROOT_PATH)/rtl/ip/rib/interconnect/rib2apb.sv \
$(ROOT_PATH)/rtl/ip/rib/interconnect/rib_regslice.sv \
$(ROOT_PATH)/rtl/ip/rib/peripheral/gpio.sv \
$(ROOT_PATH)/rtl/ip/rib/peripheral/pll_ctrl_if.sv \
$(ROOT_PATH)/rtl/ip/rib/peripheral/sysctrl.sv \
$(RTL_PATH)/top/soc_rib_error_slave.sv \
$(RTL_PATH)/top/soc_ribl_if.sv \
$(RTL_PATH)/top/soc_rib_if.sv \
$(RTL_PATH)/top/soc_rib_ram.sv \
$(RTL_PATH)/top/soc_rib2ribp.sv \
$(RTL_PATH)/top/soc_ribl2rib.sv \
$(ROOT_PATH)/rtl/ip/ribp/interconnect/ribp2apb.sv \
$(ROOT_PATH)/rtl/ip/ribp/interconnect/ribp_regslice.sv \
$(ROOT_PATH)/rtl/ip/ribp/peripheral/gpio.sv \
$(ROOT_PATH)/rtl/ip/ribp/peripheral/pll_ctrl_if.sv \
$(ROOT_PATH)/rtl/ip/ribp/peripheral/sysctrl.sv \
$(RTL_PATH)/top/rcu.sv \
$(ROOT_PATH)/rtl/managed/clusterip/common/rtl/interface/rib_if.sv \
$(ROOT_PATH)/rtl/managed/clusterip/common/rtl/interface/ribp_if.sv \
$(ROOT_PATH)/rtl/managed/clusterip/common/rtl/interface/apb4_pure_if.sv \
$(ROOT_PATH)/rtl/managed/clusterip/common/rtl/cdc/cdc_sync.sv \
$(ROOT_PATH)/rtl/managed/clusterip/common/rtl/cdc/cdc_rst_ctrlr.sv \
$(ROOT_PATH)/rtl/managed/clusterip/common/rtl/cdc/cdc_2phase.sv \
$(ROOT_PATH)/rtl/managed/clusterip/common/rtl/utils/edge_det.sv \
$(ROOT_PATH)/rtl/managed/clusterip/common/rtl/utils/register.sv \
@@ -119,7 +121,7 @@ formal-rib-adapter: $(FORMAL_DIR)/rib_adapter/.stamp | manifest
formal-spill-register: $(FORMAL_DIR)/spill_register/.stamp | manifest
formal-rib2apb: $(FORMAL_DIR)/rib2apb/.stamp | manifest
formal-ribp2apb: $(FORMAL_DIR)/ribp2apb/.stamp | manifest
formal-sysctrl: $(FORMAL_DIR)/sysctrl/.stamp | manifest
@@ -133,4 +135,4 @@ formal-doctor:
formal-clean:
python3 $(ROOT_PATH)/scripts/clean.py --root $(ROOT_PATH) --path $(FORMAL_DIR)
.PHONY: formal formal-bus formal-rib-adapter formal-spill-register formal-rib2apb formal-sysctrl formal-pll-rcu formal-gpio-user formal-doctor formal-clean
.PHONY: formal formal-bus formal-rib-adapter formal-spill-register formal-ribp2apb formal-sysctrl formal-pll-rcu formal-gpio-user formal-doctor formal-clean
@@ -11,10 +11,10 @@
`include "soc_rib_defs.svh"
// Management-core AHB-Lite to SoC RIB bridge. It is intentionally separate
// from the managed-compatible ahbl2rib used by externally supplied user cores.
module ahbl2soc_rib (
ahbl_if.slave ahbl,
soc_rib_if.master rib
// from the managed-compatible ahbl2ribp used by externally supplied user cores.
module ahbl2soc_ribl (
ahbl_if.slave ahbl,
soc_ribl_if.master ribl
);
localparam logic [1:0] AHBL_TRANS_NSEQ = 2'b10;
@@ -31,49 +31,49 @@ module ahbl2soc_rib (
logic s_hwrite_d, s_hwrite_q;
logic [2:0] s_hsize_d, s_hsize_q;
assign ahbl.hready = s_fsm_q == STATE_IDLE || rib.ready;
assign ahbl.hresp = rib.ready && rib.resp_err ? AHBL_RESP_ERROR : AHBL_RESP_OKAY;
assign ahbl.hrdata = rib.rdata;
assign rib.valid = s_fsm_q != STATE_IDLE;
assign rib.addr = {s_haddr_q[31:2], 2'b00};
assign ahbl.hready = s_fsm_q == STATE_IDLE || ribl.ready;
assign ahbl.hresp = ribl.ready && ribl.resp_err ? AHBL_RESP_ERROR : AHBL_RESP_OKAY;
assign ahbl.hrdata = ribl.rdata;
assign ribl.valid = s_fsm_q != STATE_IDLE;
assign ribl.addr = {s_haddr_q[31:2], 2'b00};
always_comb begin
rib.wstrb = '0;
rib.wdata = '0;
ribl.wstrb = '0;
ribl.wdata = '0;
if (s_hwrite_q) begin
unique case (s_hsize_q)
AHBL_SIZE_BYTE: begin
unique case (s_haddr_q[1:0])
2'd0: begin
rib.wstrb = 4'b0001;
rib.wdata = {24'd0, ahbl.hwdata[7:0]};
ribl.wstrb = 4'b0001;
ribl.wdata = {24'd0, ahbl.hwdata[7:0]};
end
2'd1: begin
rib.wstrb = 4'b0010;
rib.wdata = {16'd0, ahbl.hwdata[7:0], 8'd0};
ribl.wstrb = 4'b0010;
ribl.wdata = {16'd0, ahbl.hwdata[7:0], 8'd0};
end
2'd2: begin
rib.wstrb = 4'b0100;
rib.wdata = {8'd0, ahbl.hwdata[7:0], 16'd0};
ribl.wstrb = 4'b0100;
ribl.wdata = {8'd0, ahbl.hwdata[7:0], 16'd0};
end
default: begin
rib.wstrb = 4'b1000;
rib.wdata = {ahbl.hwdata[7:0], 24'd0};
ribl.wstrb = 4'b1000;
ribl.wdata = {ahbl.hwdata[7:0], 24'd0};
end
endcase
end
AHBL_SIZE_HWRD: begin
if (s_haddr_q[1]) begin
rib.wstrb = 4'b1100;
rib.wdata = {ahbl.hwdata[15:0], 16'd0};
ribl.wstrb = 4'b1100;
ribl.wdata = {ahbl.hwdata[15:0], 16'd0};
end else begin
rib.wstrb = 4'b0011;
rib.wdata = {16'd0, ahbl.hwdata[15:0]};
ribl.wstrb = 4'b0011;
ribl.wdata = {16'd0, ahbl.hwdata[15:0]};
end
end
default: begin
rib.wstrb = 4'b1111;
rib.wdata = ahbl.hwdata;
ribl.wstrb = 4'b1111;
ribl.wdata = ahbl.hwdata;
end
endcase
end
@@ -94,7 +94,7 @@ module ahbl2soc_rib (
end
end
STATE_DATA: begin
if (!rib.ready) begin
if (!ribl.ready) begin
s_fsm_d = STATE_WAIT;
end else if (ahbl.htrans == AHBL_TRANS_NSEQ) begin
s_haddr_d = ahbl.haddr;
@@ -105,7 +105,7 @@ module ahbl2soc_rib (
end
end
STATE_WAIT: begin
if (rib.ready) begin
if (ribl.ready) begin
if (ahbl.htrans == AHBL_TRANS_NSEQ) begin
s_fsm_d = STATE_DATA;
s_haddr_d = ahbl.haddr;
+238 -238
View File
@@ -18,13 +18,13 @@ module bus (
`ifdef HAVE_SRAM_IF
ram_if.master ram,
`endif
soc_rib_if.slave mgmt_rib,
soc_rib_burst_if.slave user_rib,
soc_rib_burst_if.slave dma_rib,
soc_ribl_if.slave mgmt_ribl,
soc_rib_if.slave user_rib,
soc_rib_if.slave dma_rib,
input logic user_bus_enable_i,
output logic user_bus_idle_o,
soc_rib_burst_if.master rib,
rib_if.master apb_rib,
soc_rib_if.master rib,
ribp_if.master apb_ribp,
input logic apb_resp_err_i,
input logic perf_enable_i,
input logic perf_clear_i,
@@ -38,7 +38,7 @@ module bus (
output logic [63:0] perf_mgmt_wait_o,
output logic [63:0] perf_user_wait_o,
output logic [63:0] perf_dma_wait_o,
output logic [63:0] perf_rib_wait_o,
output logic [63:0] perf_ribp_wait_o,
output logic [63:0] perf_apb_wait_o,
output logic [63:0] perf_sdram_wait_o,
output logic [63:0] perf_psram_wait_o,
@@ -50,16 +50,16 @@ module bus (
localparam logic [1:0] MSTR_USER = 2'd1;
localparam logic [1:0] MSTR_DMA = 2'd2;
localparam logic [1:0] TARGET_RIB = 2'd0;
localparam logic [1:0] TARGET_RIBP = 2'd0;
localparam logic [1:0] TARGET_APB = 2'd1;
localparam logic [1:0] TARGET_RAM = 2'd2;
localparam logic [1:0] TARGET_FAULT = 2'd3;
soc_rib_burst_if u_mgmt_burst_if ();
soc_rib_burst_if u_mstr_burst_if ();
soc_rib_burst_if u_apb_burst_if ();
soc_rib_burst_if u_ram_burst_if ();
soc_rib_burst_if u_fault_burst_if ();
soc_rib_if u_mgmt_rib_if ();
soc_rib_if u_mstr_rib_if ();
soc_rib_if u_apb_rib_if ();
soc_rib_if u_ram_rib_if ();
soc_rib_if u_fault_rib_if ();
logic s_mstr_lock_d, s_mstr_lock_q;
logic s_cmd_accepted_d, s_cmd_accepted_q;
@@ -68,7 +68,7 @@ module bus (
logic [1:0] s_target_d, s_target_q;
logic s_user_request;
logic s_terminal_rsp;
logic s_rib_sel, s_apb_sel, s_ram_sel, s_fault_sel;
logic s_ribp_sel, s_apb_sel, s_ram_sel, s_fault_sel;
logic s_access_denied, s_burst_legal, s_length_legal;
logic s_user_access_allowed;
logic [31:0] s_last_addr;
@@ -85,58 +85,58 @@ module bus (
logic [63:0] s_perf_mgmt_wait_d, s_perf_mgmt_wait_q;
logic [63:0] s_perf_user_wait_d, s_perf_user_wait_q;
logic [63:0] s_perf_dma_wait_d, s_perf_dma_wait_q;
logic [63:0] s_perf_rib_wait_d, s_perf_rib_wait_q;
logic [63:0] s_perf_ribp_wait_d, s_perf_ribp_wait_q;
logic [63:0] s_perf_apb_wait_d, s_perf_apb_wait_q;
logic [63:0] s_perf_sdram_wait_d, s_perf_sdram_wait_q;
logic [63:0] s_perf_psram_wait_d, s_perf_psram_wait_q;
logic [63:0] s_perf_flash_wait_d, s_perf_flash_wait_q;
soc_rib_legacy_to_burst u_mgmt_legacy_to_burst (
soc_ribl2rib u_mgmt_ribl2rib (
.clk_i (clk_i),
.rst_n_i(rst_n_i),
.legacy (mgmt_rib),
.burst (u_mgmt_burst_if)
.ribl (mgmt_ribl),
.rib (u_mgmt_rib_if)
);
soc_rib_burst_to_legacy u_apb_burst_to_legacy (
.clk_i (clk_i),
.rst_n_i (rst_n_i),
.legacy_resp_err_i (apb_resp_err_i),
.legacy_resp_code_i(`SOC_RIB_RESP_SLVERR),
.burst (u_apb_burst_if),
.legacy (apb_rib)
soc_rib2ribp u_apb_rib2ribp (
.clk_i (clk_i),
.rst_n_i (rst_n_i),
.ribp_resp_err_i (apb_resp_err_i),
.ribp_resp_code_i(`SOC_RIB_RESP_SLVERR),
.rib (u_apb_rib_if),
.ribp (apb_ribp)
);
soc_rib_burst_error_slave u_fault_slave (
soc_rib_error_slave u_fault_slave (
.clk_i (clk_i),
.rst_n_i (rst_n_i),
.error_code_i(s_fault_code),
.burst (u_fault_burst_if)
.rib (u_fault_rib_if)
);
`ifdef HAVE_SRAM_IF
soc_rib_burst_ram u_ram_slave (
soc_rib_ram u_ram_slave (
.clk_i (clk_i),
.rst_n_i(rst_n_i),
.burst (u_ram_burst_if),
.rib (u_ram_rib_if),
.ram (ram)
);
`else
assign u_ram_burst_if.cmd_ready = 1'b0;
assign u_ram_burst_if.w_ready = 1'b0;
assign u_ram_burst_if.rsp_valid = 1'b0;
assign u_ram_burst_if.rdata = '0;
assign u_ram_burst_if.resp_err = 1'b0;
assign u_ram_burst_if.resp_code = `SOC_RIB_RESP_OK;
assign u_ram_burst_if.rsp_beat = '0;
assign u_ram_burst_if.rsp_last = 1'b0;
assign u_ram_rib_if.cmd_ready = 1'b0;
assign u_ram_rib_if.w_ready = 1'b0;
assign u_ram_rib_if.rsp_valid = 1'b0;
assign u_ram_rib_if.rdata = '0;
assign u_ram_rib_if.resp_err = 1'b0;
assign u_ram_rib_if.resp_code = `SOC_RIB_RESP_OK;
assign u_ram_rib_if.rsp_beat = '0;
assign u_ram_rib_if.rsp_last = 1'b0;
`endif
assign s_user_request = user_bus_enable_i && user_rib.cmd_valid;
assign user_bus_idle_o = ~s_mstr_lock_q || (s_mstr_id_q != MSTR_USER);
assign s_terminal_rsp = s_cmd_accepted_q && u_mstr_burst_if.rsp_valid &&
u_mstr_burst_if.rsp_ready &&
u_mstr_burst_if.rsp_last;
assign s_terminal_rsp = s_cmd_accepted_q && u_mstr_rib_if.rsp_valid &&
u_mstr_rib_if.rsp_ready &&
u_mstr_rib_if.rsp_last;
always_comb begin
s_mstr_lock_d = s_mstr_lock_q;
@@ -145,7 +145,7 @@ module bus (
if (~s_mstr_lock_q) begin
unique case (s_mstr_rr_q)
MSTR_MGMT: begin
if (u_mgmt_burst_if.cmd_valid) begin
if (u_mgmt_rib_if.cmd_valid) begin
s_mstr_lock_d = 1'b1;
s_mstr_id_d = MSTR_MGMT;
end else if (s_user_request) begin
@@ -163,7 +163,7 @@ module bus (
end else if (dma_rib.cmd_valid) begin
s_mstr_lock_d = 1'b1;
s_mstr_id_d = MSTR_DMA;
end else if (u_mgmt_burst_if.cmd_valid) begin
end else if (u_mgmt_rib_if.cmd_valid) begin
s_mstr_lock_d = 1'b1;
s_mstr_id_d = MSTR_MGMT;
end
@@ -172,7 +172,7 @@ module bus (
if (dma_rib.cmd_valid) begin
s_mstr_lock_d = 1'b1;
s_mstr_id_d = MSTR_DMA;
end else if (u_mgmt_burst_if.cmd_valid) begin
end else if (u_mgmt_rib_if.cmd_valid) begin
s_mstr_lock_d = 1'b1;
s_mstr_id_d = MSTR_MGMT;
end else if (s_user_request) begin
@@ -212,7 +212,7 @@ module bus (
always_comb begin
s_cmd_accepted_d = s_cmd_accepted_q;
if (u_mstr_burst_if.cmd_valid && u_mstr_burst_if.cmd_ready) begin
if (u_mstr_rib_if.cmd_valid && u_mstr_rib_if.cmd_ready) begin
s_cmd_accepted_d = 1'b1;
end else if (s_terminal_rsp) begin
s_cmd_accepted_d = 1'b0;
@@ -227,181 +227,181 @@ module bus (
// Master mux. The grant is held until the terminal response is consumed.
always_comb begin
u_mstr_burst_if.cmd_valid = 1'b0;
u_mstr_burst_if.cmd_addr = '0;
u_mstr_burst_if.cmd_write = 1'b0;
u_mstr_burst_if.cmd_len = `SOC_RIB_BURST_INCR1;
u_mstr_burst_if.w_valid = 1'b0;
u_mstr_burst_if.wdata = '0;
u_mstr_burst_if.wstrb = '0;
u_mstr_burst_if.wlast = 1'b0;
u_mstr_burst_if.rsp_ready = 1'b0;
u_mstr_rib_if.cmd_valid = 1'b0;
u_mstr_rib_if.cmd_addr = '0;
u_mstr_rib_if.cmd_write = 1'b0;
u_mstr_rib_if.cmd_len = `SOC_RIB_LEN_INCR1;
u_mstr_rib_if.w_valid = 1'b0;
u_mstr_rib_if.wdata = '0;
u_mstr_rib_if.wstrb = '0;
u_mstr_rib_if.wlast = 1'b0;
u_mstr_rib_if.rsp_ready = 1'b0;
if (s_mstr_lock_q) begin
unique case (s_mstr_id_q)
MSTR_MGMT: begin
u_mstr_burst_if.cmd_valid = u_mgmt_burst_if.cmd_valid;
u_mstr_burst_if.cmd_addr = u_mgmt_burst_if.cmd_addr;
u_mstr_burst_if.cmd_write = u_mgmt_burst_if.cmd_write;
u_mstr_burst_if.cmd_len = u_mgmt_burst_if.cmd_len;
u_mstr_burst_if.w_valid = u_mgmt_burst_if.w_valid;
u_mstr_burst_if.wdata = u_mgmt_burst_if.wdata;
u_mstr_burst_if.wstrb = u_mgmt_burst_if.wstrb;
u_mstr_burst_if.wlast = u_mgmt_burst_if.wlast;
u_mstr_burst_if.rsp_ready = u_mgmt_burst_if.rsp_ready;
u_mstr_rib_if.cmd_valid = u_mgmt_rib_if.cmd_valid;
u_mstr_rib_if.cmd_addr = u_mgmt_rib_if.cmd_addr;
u_mstr_rib_if.cmd_write = u_mgmt_rib_if.cmd_write;
u_mstr_rib_if.cmd_len = u_mgmt_rib_if.cmd_len;
u_mstr_rib_if.w_valid = u_mgmt_rib_if.w_valid;
u_mstr_rib_if.wdata = u_mgmt_rib_if.wdata;
u_mstr_rib_if.wstrb = u_mgmt_rib_if.wstrb;
u_mstr_rib_if.wlast = u_mgmt_rib_if.wlast;
u_mstr_rib_if.rsp_ready = u_mgmt_rib_if.rsp_ready;
end
MSTR_USER: begin
u_mstr_burst_if.cmd_valid = user_rib.cmd_valid;
u_mstr_burst_if.cmd_addr = user_rib.cmd_addr;
u_mstr_burst_if.cmd_write = user_rib.cmd_write;
u_mstr_burst_if.cmd_len = user_rib.cmd_len;
u_mstr_burst_if.w_valid = user_rib.w_valid;
u_mstr_burst_if.wdata = user_rib.wdata;
u_mstr_burst_if.wstrb = user_rib.wstrb;
u_mstr_burst_if.wlast = user_rib.wlast;
u_mstr_burst_if.rsp_ready = user_rib.rsp_ready;
u_mstr_rib_if.cmd_valid = user_rib.cmd_valid;
u_mstr_rib_if.cmd_addr = user_rib.cmd_addr;
u_mstr_rib_if.cmd_write = user_rib.cmd_write;
u_mstr_rib_if.cmd_len = user_rib.cmd_len;
u_mstr_rib_if.w_valid = user_rib.w_valid;
u_mstr_rib_if.wdata = user_rib.wdata;
u_mstr_rib_if.wstrb = user_rib.wstrb;
u_mstr_rib_if.wlast = user_rib.wlast;
u_mstr_rib_if.rsp_ready = user_rib.rsp_ready;
end
default: begin
u_mstr_burst_if.cmd_valid = dma_rib.cmd_valid;
u_mstr_burst_if.cmd_addr = dma_rib.cmd_addr;
u_mstr_burst_if.cmd_write = dma_rib.cmd_write;
u_mstr_burst_if.cmd_len = dma_rib.cmd_len;
u_mstr_burst_if.w_valid = dma_rib.w_valid;
u_mstr_burst_if.wdata = dma_rib.wdata;
u_mstr_burst_if.wstrb = dma_rib.wstrb;
u_mstr_burst_if.wlast = dma_rib.wlast;
u_mstr_burst_if.rsp_ready = dma_rib.rsp_ready;
u_mstr_rib_if.cmd_valid = dma_rib.cmd_valid;
u_mstr_rib_if.cmd_addr = dma_rib.cmd_addr;
u_mstr_rib_if.cmd_write = dma_rib.cmd_write;
u_mstr_rib_if.cmd_len = dma_rib.cmd_len;
u_mstr_rib_if.w_valid = dma_rib.w_valid;
u_mstr_rib_if.wdata = dma_rib.wdata;
u_mstr_rib_if.wstrb = dma_rib.wstrb;
u_mstr_rib_if.wlast = dma_rib.wlast;
u_mstr_rib_if.rsp_ready = dma_rib.rsp_ready;
end
endcase
end
end
// Responses are visible only to the granted master.
assign u_mgmt_burst_if.cmd_ready = s_mstr_lock_q && (s_mstr_id_q == MSTR_MGMT) ?
u_mstr_burst_if.cmd_ready : 1'b0;
assign u_mgmt_burst_if.w_ready = s_mstr_lock_q && (s_mstr_id_q == MSTR_MGMT) ?
u_mstr_burst_if.w_ready : 1'b0;
assign u_mgmt_burst_if.rsp_valid = s_mstr_lock_q && (s_mstr_id_q == MSTR_MGMT) ?
u_mstr_burst_if.rsp_valid : 1'b0;
assign u_mgmt_burst_if.rdata = u_mstr_burst_if.rdata;
assign u_mgmt_burst_if.resp_err = u_mstr_burst_if.resp_err;
assign u_mgmt_burst_if.resp_code = u_mstr_burst_if.resp_code;
assign u_mgmt_burst_if.rsp_beat = u_mstr_burst_if.rsp_beat;
assign u_mgmt_burst_if.rsp_last = u_mstr_burst_if.rsp_last;
assign u_mgmt_rib_if.cmd_ready = s_mstr_lock_q && (s_mstr_id_q == MSTR_MGMT) ?
u_mstr_rib_if.cmd_ready : 1'b0;
assign u_mgmt_rib_if.w_ready = s_mstr_lock_q && (s_mstr_id_q == MSTR_MGMT) ?
u_mstr_rib_if.w_ready : 1'b0;
assign u_mgmt_rib_if.rsp_valid = s_mstr_lock_q && (s_mstr_id_q == MSTR_MGMT) ?
u_mstr_rib_if.rsp_valid : 1'b0;
assign u_mgmt_rib_if.rdata = u_mstr_rib_if.rdata;
assign u_mgmt_rib_if.resp_err = u_mstr_rib_if.resp_err;
assign u_mgmt_rib_if.resp_code = u_mstr_rib_if.resp_code;
assign u_mgmt_rib_if.rsp_beat = u_mstr_rib_if.rsp_beat;
assign u_mgmt_rib_if.rsp_last = u_mstr_rib_if.rsp_last;
assign user_rib.cmd_ready = s_mstr_lock_q && (s_mstr_id_q == MSTR_USER) ?
u_mstr_burst_if.cmd_ready : 1'b0;
u_mstr_rib_if.cmd_ready : 1'b0;
assign user_rib.w_ready = s_mstr_lock_q && (s_mstr_id_q == MSTR_USER) ?
u_mstr_burst_if.w_ready : 1'b0;
u_mstr_rib_if.w_ready : 1'b0;
assign user_rib.rsp_valid = s_mstr_lock_q && (s_mstr_id_q == MSTR_USER) ?
u_mstr_burst_if.rsp_valid : 1'b0;
assign user_rib.rdata = u_mstr_burst_if.rdata;
assign user_rib.resp_err = u_mstr_burst_if.resp_err;
assign user_rib.resp_code = u_mstr_burst_if.resp_code;
assign user_rib.rsp_beat = u_mstr_burst_if.rsp_beat;
assign user_rib.rsp_last = u_mstr_burst_if.rsp_last;
u_mstr_rib_if.rsp_valid : 1'b0;
assign user_rib.rdata = u_mstr_rib_if.rdata;
assign user_rib.resp_err = u_mstr_rib_if.resp_err;
assign user_rib.resp_code = u_mstr_rib_if.resp_code;
assign user_rib.rsp_beat = u_mstr_rib_if.rsp_beat;
assign user_rib.rsp_last = u_mstr_rib_if.rsp_last;
assign dma_rib.cmd_ready = s_mstr_lock_q && (s_mstr_id_q == MSTR_DMA) ?
u_mstr_burst_if.cmd_ready : 1'b0;
u_mstr_rib_if.cmd_ready : 1'b0;
assign dma_rib.w_ready = s_mstr_lock_q && (s_mstr_id_q == MSTR_DMA) ?
u_mstr_burst_if.w_ready : 1'b0;
u_mstr_rib_if.w_ready : 1'b0;
assign dma_rib.rsp_valid = s_mstr_lock_q && (s_mstr_id_q == MSTR_DMA) ?
u_mstr_burst_if.rsp_valid : 1'b0;
assign dma_rib.rdata = u_mstr_burst_if.rdata;
assign dma_rib.resp_err = u_mstr_burst_if.resp_err;
assign dma_rib.resp_code = u_mstr_burst_if.resp_code;
assign dma_rib.rsp_beat = u_mstr_burst_if.rsp_beat;
assign dma_rib.rsp_last = u_mstr_burst_if.rsp_last;
u_mstr_rib_if.rsp_valid : 1'b0;
assign dma_rib.rdata = u_mstr_rib_if.rdata;
assign dma_rib.resp_err = u_mstr_rib_if.resp_err;
assign dma_rib.resp_code = u_mstr_rib_if.resp_code;
assign dma_rib.rsp_beat = u_mstr_rib_if.rsp_beat;
assign dma_rib.rsp_last = u_mstr_rib_if.rsp_last;
// verilog_format: off
assign s_last_addr = u_mstr_burst_if.cmd_addr +
(u_mstr_burst_if.cmd_len == `SOC_RIB_BURST_INCR4 ? 32'd12 : 32'd0);
assign s_last_addr = u_mstr_rib_if.cmd_addr +
(u_mstr_rib_if.cmd_len == `SOC_RIB_LEN_INCR4 ? 32'd12 : 32'd0);
assign s_length_legal =
(u_mstr_burst_if.cmd_len == `SOC_RIB_BURST_INCR1) ||
(u_mstr_burst_if.cmd_len == `SOC_RIB_BURST_INCR4);
(u_mstr_rib_if.cmd_len == `SOC_RIB_LEN_INCR1) ||
(u_mstr_rib_if.cmd_len == `SOC_RIB_LEN_INCR4);
assign s_burst_legal =
s_length_legal &&
((u_mstr_burst_if.cmd_len == `SOC_RIB_BURST_INCR1) ||
((u_mstr_burst_if.cmd_addr[3:0] == 4'b0000) &&
`SOC_ADDR_SUPPORTS_INCR4(u_mstr_burst_if.cmd_addr) &&
((u_mstr_rib_if.cmd_len == `SOC_RIB_LEN_INCR1) ||
((u_mstr_rib_if.cmd_addr[3:0] == 4'b0000) &&
`SOC_ADDR_SUPPORTS_INCR4(u_mstr_rib_if.cmd_addr) &&
`SOC_ADDR_SUPPORTS_INCR4(s_last_addr)));
assign s_user_access_allowed = u_mstr_burst_if.cmd_write ?
(`SOC_USER_ADDR_WRITABLE(u_mstr_burst_if.cmd_addr) &&
assign s_user_access_allowed = u_mstr_rib_if.cmd_write ?
(`SOC_USER_ADDR_WRITABLE(u_mstr_rib_if.cmd_addr) &&
`SOC_USER_ADDR_WRITABLE(s_last_addr)) :
(`SOC_USER_ADDR_READABLE(u_mstr_burst_if.cmd_addr) &&
(`SOC_USER_ADDR_READABLE(u_mstr_rib_if.cmd_addr) &&
`SOC_USER_ADDR_READABLE(s_last_addr));
// verilog_format: on
assign s_access_denied = (s_mstr_id_q == MSTR_USER) && ~s_user_access_allowed;
// verilog_format: off
assign s_rib_sel = u_mstr_burst_if.cmd_valid && ~s_cmd_accepted_q && ~s_access_denied &&
s_burst_legal && `SOC_ADDR_IS_RIB(u_mstr_burst_if.cmd_addr);
assign s_apb_sel = u_mstr_burst_if.cmd_valid && ~s_cmd_accepted_q && ~s_access_denied &&
(u_mstr_burst_if.cmd_len == `SOC_RIB_BURST_INCR1) &&
`SOC_ADDR_IS_APB(u_mstr_burst_if.cmd_addr);
assign s_ribp_sel = u_mstr_rib_if.cmd_valid && ~s_cmd_accepted_q && ~s_access_denied &&
s_burst_legal && `SOC_ADDR_IS_RIBP(u_mstr_rib_if.cmd_addr);
assign s_apb_sel = u_mstr_rib_if.cmd_valid && ~s_cmd_accepted_q && ~s_access_denied &&
(u_mstr_rib_if.cmd_len == `SOC_RIB_LEN_INCR1) &&
`SOC_ADDR_IS_APB(u_mstr_rib_if.cmd_addr);
`ifdef HAVE_SRAM_IF
assign s_ram_sel = u_mstr_burst_if.cmd_valid && ~s_cmd_accepted_q && ~s_access_denied &&
s_burst_legal && `SOC_ADDR_IS_RAM(u_mstr_burst_if.cmd_addr);
assign s_ram_sel = u_mstr_rib_if.cmd_valid && ~s_cmd_accepted_q && ~s_access_denied &&
s_burst_legal && `SOC_ADDR_IS_RAM(u_mstr_rib_if.cmd_addr);
`else
assign s_ram_sel = 1'b0;
`endif
assign s_fault_sel = u_mstr_burst_if.cmd_valid && ~s_cmd_accepted_q &&
~(s_rib_sel || s_apb_sel || s_ram_sel);
assign s_fault_sel = u_mstr_rib_if.cmd_valid && ~s_cmd_accepted_q &&
~(s_ribp_sel || s_apb_sel || s_ram_sel);
// verilog_format: on
always_comb begin
s_fault_code = `SOC_RIB_RESP_DECERR;
if (s_access_denied) begin
s_fault_code = `SOC_RIB_RESP_PROTERR;
end else if (`SOC_ADDR_IS_RESERVED(u_mstr_burst_if.cmd_addr)) begin
end else if (`SOC_ADDR_IS_RESERVED(u_mstr_rib_if.cmd_addr)) begin
s_fault_code = `SOC_RIB_RESP_RESERVED;
// verilog_format: off
end else if ((`SOC_ADDR_IS_RIB(u_mstr_burst_if.cmd_addr) ||
`SOC_ADDR_IS_APB(u_mstr_burst_if.cmd_addr) ||
`SOC_ADDR_IS_RAM(u_mstr_burst_if.cmd_addr)) &&
end else if ((`SOC_ADDR_IS_RIBP(u_mstr_rib_if.cmd_addr) ||
`SOC_ADDR_IS_APB(u_mstr_rib_if.cmd_addr) ||
`SOC_ADDR_IS_RAM(u_mstr_rib_if.cmd_addr)) &&
(~s_burst_legal ||
(`SOC_ADDR_IS_APB(u_mstr_burst_if.cmd_addr) &&
(u_mstr_burst_if.cmd_len != `SOC_RIB_BURST_INCR1)))) begin
(`SOC_ADDR_IS_APB(u_mstr_rib_if.cmd_addr) &&
(u_mstr_rib_if.cmd_len != `SOC_RIB_LEN_INCR1)))) begin
// verilog_format: on
s_fault_code = `SOC_RIB_RESP_BURSTERR;
end
end
// Command routing. Target selection is captured on command acceptance.
assign rib.cmd_valid = s_rib_sel;
assign rib.cmd_addr = u_mstr_burst_if.cmd_addr;
assign rib.cmd_write = u_mstr_burst_if.cmd_write;
assign rib.cmd_len = u_mstr_burst_if.cmd_len;
assign u_apb_burst_if.cmd_valid = s_apb_sel;
assign u_apb_burst_if.cmd_addr = u_mstr_burst_if.cmd_addr;
assign u_apb_burst_if.cmd_write = u_mstr_burst_if.cmd_write;
assign u_apb_burst_if.cmd_len = u_mstr_burst_if.cmd_len;
assign u_ram_burst_if.cmd_valid = s_ram_sel;
assign u_ram_burst_if.cmd_addr = u_mstr_burst_if.cmd_addr;
assign u_ram_burst_if.cmd_write = u_mstr_burst_if.cmd_write;
assign u_ram_burst_if.cmd_len = u_mstr_burst_if.cmd_len;
assign u_fault_burst_if.cmd_valid = s_fault_sel;
assign u_fault_burst_if.cmd_addr = u_mstr_burst_if.cmd_addr;
assign u_fault_burst_if.cmd_write = u_mstr_burst_if.cmd_write;
assign u_fault_burst_if.cmd_len = u_mstr_burst_if.cmd_len;
assign rib.cmd_valid = s_ribp_sel;
assign rib.cmd_addr = u_mstr_rib_if.cmd_addr;
assign rib.cmd_write = u_mstr_rib_if.cmd_write;
assign rib.cmd_len = u_mstr_rib_if.cmd_len;
assign u_apb_rib_if.cmd_valid = s_apb_sel;
assign u_apb_rib_if.cmd_addr = u_mstr_rib_if.cmd_addr;
assign u_apb_rib_if.cmd_write = u_mstr_rib_if.cmd_write;
assign u_apb_rib_if.cmd_len = u_mstr_rib_if.cmd_len;
assign u_ram_rib_if.cmd_valid = s_ram_sel;
assign u_ram_rib_if.cmd_addr = u_mstr_rib_if.cmd_addr;
assign u_ram_rib_if.cmd_write = u_mstr_rib_if.cmd_write;
assign u_ram_rib_if.cmd_len = u_mstr_rib_if.cmd_len;
assign u_fault_rib_if.cmd_valid = s_fault_sel;
assign u_fault_rib_if.cmd_addr = u_mstr_rib_if.cmd_addr;
assign u_fault_rib_if.cmd_write = u_mstr_rib_if.cmd_write;
assign u_fault_rib_if.cmd_len = u_mstr_rib_if.cmd_len;
always_comb begin
u_mstr_burst_if.cmd_ready = 1'b0;
if (s_rib_sel) begin
u_mstr_burst_if.cmd_ready = rib.cmd_ready;
u_mstr_rib_if.cmd_ready = 1'b0;
if (s_ribp_sel) begin
u_mstr_rib_if.cmd_ready = rib.cmd_ready;
end else if (s_apb_sel) begin
u_mstr_burst_if.cmd_ready = u_apb_burst_if.cmd_ready;
u_mstr_rib_if.cmd_ready = u_apb_rib_if.cmd_ready;
end else if (s_ram_sel) begin
u_mstr_burst_if.cmd_ready = u_ram_burst_if.cmd_ready;
u_mstr_rib_if.cmd_ready = u_ram_rib_if.cmd_ready;
end else if (s_fault_sel) begin
u_mstr_burst_if.cmd_ready = u_fault_burst_if.cmd_ready;
u_mstr_rib_if.cmd_ready = u_fault_rib_if.cmd_ready;
end
end
always_comb begin
s_target_d = s_target_q;
if (u_mstr_burst_if.cmd_valid && u_mstr_burst_if.cmd_ready) begin
if (s_rib_sel) begin
s_target_d = TARGET_RIB;
if (u_mstr_rib_if.cmd_valid && u_mstr_rib_if.cmd_ready) begin
if (s_ribp_sel) begin
s_target_d = TARGET_RIBP;
end else if (s_apb_sel) begin
s_target_d = TARGET_APB;
end else if (s_ram_sel) begin
@@ -419,101 +419,101 @@ module bus (
);
// Write-data and response routing uses the captured target.
assign rib.w_valid = s_mstr_lock_q && s_cmd_accepted_q && (s_target_q == TARGET_RIB) ?
u_mstr_burst_if.w_valid : 1'b0;
assign rib.wdata = u_mstr_burst_if.wdata;
assign rib.wstrb = u_mstr_burst_if.wstrb;
assign rib.wlast = u_mstr_burst_if.wlast;
assign rib.rsp_ready = s_mstr_lock_q && s_cmd_accepted_q && (s_target_q == TARGET_RIB) ?
u_mstr_burst_if.rsp_ready : 1'b0;
assign rib.w_valid = s_mstr_lock_q && s_cmd_accepted_q && (s_target_q == TARGET_RIBP) ?
u_mstr_rib_if.w_valid : 1'b0;
assign rib.wdata = u_mstr_rib_if.wdata;
assign rib.wstrb = u_mstr_rib_if.wstrb;
assign rib.wlast = u_mstr_rib_if.wlast;
assign rib.rsp_ready = s_mstr_lock_q && s_cmd_accepted_q && (s_target_q == TARGET_RIBP) ?
u_mstr_rib_if.rsp_ready : 1'b0;
assign u_apb_burst_if.w_valid = s_mstr_lock_q && s_cmd_accepted_q &&
assign u_apb_rib_if.w_valid = s_mstr_lock_q && s_cmd_accepted_q &&
(s_target_q == TARGET_APB) ?
u_mstr_burst_if.w_valid : 1'b0;
assign u_apb_burst_if.wdata = u_mstr_burst_if.wdata;
assign u_apb_burst_if.wstrb = u_mstr_burst_if.wstrb;
assign u_apb_burst_if.wlast = u_mstr_burst_if.wlast;
assign u_apb_burst_if.rsp_ready = s_mstr_lock_q && s_cmd_accepted_q &&
u_mstr_rib_if.w_valid : 1'b0;
assign u_apb_rib_if.wdata = u_mstr_rib_if.wdata;
assign u_apb_rib_if.wstrb = u_mstr_rib_if.wstrb;
assign u_apb_rib_if.wlast = u_mstr_rib_if.wlast;
assign u_apb_rib_if.rsp_ready = s_mstr_lock_q && s_cmd_accepted_q &&
(s_target_q == TARGET_APB) ?
u_mstr_burst_if.rsp_ready : 1'b0;
u_mstr_rib_if.rsp_ready : 1'b0;
assign u_ram_burst_if.w_valid = s_mstr_lock_q && s_cmd_accepted_q &&
assign u_ram_rib_if.w_valid = s_mstr_lock_q && s_cmd_accepted_q &&
(s_target_q == TARGET_RAM) ?
u_mstr_burst_if.w_valid : 1'b0;
assign u_ram_burst_if.wdata = u_mstr_burst_if.wdata;
assign u_ram_burst_if.wstrb = u_mstr_burst_if.wstrb;
assign u_ram_burst_if.wlast = u_mstr_burst_if.wlast;
assign u_ram_burst_if.rsp_ready = s_mstr_lock_q && s_cmd_accepted_q &&
u_mstr_rib_if.w_valid : 1'b0;
assign u_ram_rib_if.wdata = u_mstr_rib_if.wdata;
assign u_ram_rib_if.wstrb = u_mstr_rib_if.wstrb;
assign u_ram_rib_if.wlast = u_mstr_rib_if.wlast;
assign u_ram_rib_if.rsp_ready = s_mstr_lock_q && s_cmd_accepted_q &&
(s_target_q == TARGET_RAM) ?
u_mstr_burst_if.rsp_ready : 1'b0;
u_mstr_rib_if.rsp_ready : 1'b0;
assign u_fault_burst_if.w_valid = s_mstr_lock_q && s_cmd_accepted_q &&
assign u_fault_rib_if.w_valid = s_mstr_lock_q && s_cmd_accepted_q &&
(s_target_q == TARGET_FAULT) ?
u_mstr_burst_if.w_valid : 1'b0;
assign u_fault_burst_if.wdata = u_mstr_burst_if.wdata;
assign u_fault_burst_if.wstrb = u_mstr_burst_if.wstrb;
assign u_fault_burst_if.wlast = u_mstr_burst_if.wlast;
assign u_fault_burst_if.rsp_ready = s_mstr_lock_q && s_cmd_accepted_q &&
u_mstr_rib_if.w_valid : 1'b0;
assign u_fault_rib_if.wdata = u_mstr_rib_if.wdata;
assign u_fault_rib_if.wstrb = u_mstr_rib_if.wstrb;
assign u_fault_rib_if.wlast = u_mstr_rib_if.wlast;
assign u_fault_rib_if.rsp_ready = s_mstr_lock_q && s_cmd_accepted_q &&
(s_target_q == TARGET_FAULT) ?
u_mstr_burst_if.rsp_ready : 1'b0;
u_mstr_rib_if.rsp_ready : 1'b0;
always_comb begin
u_mstr_burst_if.w_ready = 1'b0;
u_mstr_burst_if.rsp_valid = 1'b0;
u_mstr_burst_if.rdata = '0;
u_mstr_burst_if.resp_err = 1'b0;
u_mstr_burst_if.resp_code = `SOC_RIB_RESP_OK;
u_mstr_burst_if.rsp_beat = '0;
u_mstr_burst_if.rsp_last = 1'b0;
u_mstr_rib_if.w_ready = 1'b0;
u_mstr_rib_if.rsp_valid = 1'b0;
u_mstr_rib_if.rdata = '0;
u_mstr_rib_if.resp_err = 1'b0;
u_mstr_rib_if.resp_code = `SOC_RIB_RESP_OK;
u_mstr_rib_if.rsp_beat = '0;
u_mstr_rib_if.rsp_last = 1'b0;
unique case (s_target_q)
TARGET_RIB: begin
u_mstr_burst_if.w_ready = s_cmd_accepted_q && rib.w_ready;
u_mstr_burst_if.rsp_valid = s_cmd_accepted_q && rib.rsp_valid;
u_mstr_burst_if.rdata = rib.rdata;
u_mstr_burst_if.resp_err = rib.resp_err;
u_mstr_burst_if.resp_code = rib.resp_code;
u_mstr_burst_if.rsp_beat = rib.rsp_beat;
u_mstr_burst_if.rsp_last = rib.rsp_last;
TARGET_RIBP: begin
u_mstr_rib_if.w_ready = s_cmd_accepted_q && rib.w_ready;
u_mstr_rib_if.rsp_valid = s_cmd_accepted_q && rib.rsp_valid;
u_mstr_rib_if.rdata = rib.rdata;
u_mstr_rib_if.resp_err = rib.resp_err;
u_mstr_rib_if.resp_code = rib.resp_code;
u_mstr_rib_if.rsp_beat = rib.rsp_beat;
u_mstr_rib_if.rsp_last = rib.rsp_last;
end
TARGET_APB: begin
u_mstr_burst_if.w_ready = s_cmd_accepted_q && u_apb_burst_if.w_ready;
u_mstr_burst_if.rsp_valid = s_cmd_accepted_q && u_apb_burst_if.rsp_valid;
u_mstr_burst_if.rdata = u_apb_burst_if.rdata;
u_mstr_burst_if.resp_err = u_apb_burst_if.resp_err;
u_mstr_burst_if.resp_code = u_apb_burst_if.resp_code;
u_mstr_burst_if.rsp_beat = u_apb_burst_if.rsp_beat;
u_mstr_burst_if.rsp_last = u_apb_burst_if.rsp_last;
u_mstr_rib_if.w_ready = s_cmd_accepted_q && u_apb_rib_if.w_ready;
u_mstr_rib_if.rsp_valid = s_cmd_accepted_q && u_apb_rib_if.rsp_valid;
u_mstr_rib_if.rdata = u_apb_rib_if.rdata;
u_mstr_rib_if.resp_err = u_apb_rib_if.resp_err;
u_mstr_rib_if.resp_code = u_apb_rib_if.resp_code;
u_mstr_rib_if.rsp_beat = u_apb_rib_if.rsp_beat;
u_mstr_rib_if.rsp_last = u_apb_rib_if.rsp_last;
end
TARGET_RAM: begin
u_mstr_burst_if.w_ready = s_cmd_accepted_q && u_ram_burst_if.w_ready;
u_mstr_burst_if.rsp_valid = s_cmd_accepted_q && u_ram_burst_if.rsp_valid;
u_mstr_burst_if.rdata = u_ram_burst_if.rdata;
u_mstr_burst_if.resp_err = u_ram_burst_if.resp_err;
u_mstr_burst_if.resp_code = u_ram_burst_if.resp_code;
u_mstr_burst_if.rsp_beat = u_ram_burst_if.rsp_beat;
u_mstr_burst_if.rsp_last = u_ram_burst_if.rsp_last;
u_mstr_rib_if.w_ready = s_cmd_accepted_q && u_ram_rib_if.w_ready;
u_mstr_rib_if.rsp_valid = s_cmd_accepted_q && u_ram_rib_if.rsp_valid;
u_mstr_rib_if.rdata = u_ram_rib_if.rdata;
u_mstr_rib_if.resp_err = u_ram_rib_if.resp_err;
u_mstr_rib_if.resp_code = u_ram_rib_if.resp_code;
u_mstr_rib_if.rsp_beat = u_ram_rib_if.rsp_beat;
u_mstr_rib_if.rsp_last = u_ram_rib_if.rsp_last;
end
default: begin
u_mstr_burst_if.w_ready = s_cmd_accepted_q && u_fault_burst_if.w_ready;
u_mstr_burst_if.rsp_valid = s_cmd_accepted_q && u_fault_burst_if.rsp_valid;
u_mstr_burst_if.rdata = u_fault_burst_if.rdata;
u_mstr_burst_if.resp_err = u_fault_burst_if.resp_err;
u_mstr_burst_if.resp_code = u_fault_burst_if.resp_code;
u_mstr_burst_if.rsp_beat = u_fault_burst_if.rsp_beat;
u_mstr_burst_if.rsp_last = u_fault_burst_if.rsp_last;
u_mstr_rib_if.w_ready = s_cmd_accepted_q && u_fault_rib_if.w_ready;
u_mstr_rib_if.rsp_valid = s_cmd_accepted_q && u_fault_rib_if.rsp_valid;
u_mstr_rib_if.rdata = u_fault_rib_if.rdata;
u_mstr_rib_if.resp_err = u_fault_rib_if.resp_err;
u_mstr_rib_if.resp_code = u_fault_rib_if.resp_code;
u_mstr_rib_if.rsp_beat = u_fault_rib_if.rsp_beat;
u_mstr_rib_if.rsp_last = u_fault_rib_if.rsp_last;
end
endcase
end
assign s_fault_cmd_hdshk = s_fault_sel && u_fault_burst_if.cmd_ready;
assign s_fault_cmd_hdshk = s_fault_sel && u_fault_rib_if.cmd_ready;
assign s_fault_w_hdshk = (s_target_q == TARGET_FAULT) &&
u_fault_burst_if.w_valid && u_fault_burst_if.w_ready;
u_fault_rib_if.w_valid && u_fault_rib_if.w_ready;
always_comb begin
s_fault_wstrb_d = s_fault_wstrb_q;
if (s_fault_cmd_hdshk) begin
s_fault_wstrb_d = '0;
end else if (s_fault_w_hdshk && (s_fault_wstrb_q == '0)) begin
s_fault_wstrb_d = u_fault_burst_if.wstrb;
s_fault_wstrb_d = u_fault_rib_if.wstrb;
end
end
dffr #(4) u_fault_wstrb_dffr (
@@ -526,7 +526,7 @@ module bus (
clk_i,
rst_n_i,
s_fault_cmd_hdshk,
u_mstr_burst_if.cmd_addr,
u_mstr_rib_if.cmd_addr,
s_fault_addr_q
);
dffer #(2) u_fault_master_dffer (
@@ -546,13 +546,13 @@ module bus (
dffer #(32) u_xfer_addr_dffer (
clk_i,
rst_n_i,
u_mstr_burst_if.cmd_valid && u_mstr_burst_if.cmd_ready,
u_mstr_burst_if.cmd_addr,
u_mstr_rib_if.cmd_valid && u_mstr_rib_if.cmd_ready,
u_mstr_rib_if.cmd_addr,
s_xfer_addr_q
);
assign fault_valid_o = s_cmd_accepted_q && (s_target_q == TARGET_FAULT) &&
u_fault_burst_if.rsp_valid && u_fault_burst_if.rsp_ready;
u_fault_rib_if.rsp_valid && u_fault_rib_if.rsp_ready;
assign fault_addr_o = s_fault_addr_q;
assign fault_wstrb_o = s_fault_wstrb_q;
assign fault_reserved_o = s_fault_code_q == `SOC_RIB_RESP_RESERVED;
@@ -561,16 +561,16 @@ module bus (
assign fault_code_o = s_fault_code_q;
assign s_xfer_stalled = s_mstr_lock_q &&
((u_mstr_burst_if.cmd_valid && ~u_mstr_burst_if.cmd_ready) ||
(u_mstr_burst_if.w_valid && ~u_mstr_burst_if.w_ready) ||
(~u_mstr_burst_if.cmd_valid && ~u_mstr_burst_if.w_valid &&
~u_mstr_burst_if.rsp_valid));
((u_mstr_rib_if.cmd_valid && ~u_mstr_rib_if.cmd_ready) ||
(u_mstr_rib_if.w_valid && ~u_mstr_rib_if.w_ready) ||
(~u_mstr_rib_if.cmd_valid && ~u_mstr_rib_if.w_valid &&
~u_mstr_rib_if.rsp_valid));
always_comb begin
s_perf_mgmt_wait_d = s_perf_mgmt_wait_q;
s_perf_user_wait_d = s_perf_user_wait_q;
s_perf_dma_wait_d = s_perf_dma_wait_q;
s_perf_rib_wait_d = s_perf_rib_wait_q;
s_perf_ribp_wait_d = s_perf_ribp_wait_q;
s_perf_apb_wait_d = s_perf_apb_wait_q;
s_perf_sdram_wait_d = s_perf_sdram_wait_q;
s_perf_psram_wait_d = s_perf_psram_wait_q;
@@ -579,7 +579,7 @@ module bus (
s_perf_mgmt_wait_d = '0;
s_perf_user_wait_d = '0;
s_perf_dma_wait_d = '0;
s_perf_rib_wait_d = '0;
s_perf_ribp_wait_d = '0;
s_perf_apb_wait_d = '0;
s_perf_sdram_wait_d = '0;
s_perf_psram_wait_d = '0;
@@ -590,7 +590,7 @@ module bus (
MSTR_USER: s_perf_user_wait_d = s_perf_user_wait_q + 1'b1;
default: s_perf_dma_wait_d = s_perf_dma_wait_q + 1'b1;
endcase
if (s_target_q == TARGET_RIB) s_perf_rib_wait_d = s_perf_rib_wait_q + 1'b1;
if (s_target_q == TARGET_RIBP) s_perf_ribp_wait_d = s_perf_ribp_wait_q + 1'b1;
if (s_target_q == TARGET_APB) s_perf_apb_wait_d = s_perf_apb_wait_q + 1'b1;
if (`SOC_ADDR_IS_SDRAM(s_xfer_addr_q)) begin
s_perf_sdram_wait_d = s_perf_sdram_wait_q + 1'b1;
@@ -622,11 +622,11 @@ module bus (
s_perf_dma_wait_d,
s_perf_dma_wait_q
);
dffr #(64) u_perf_rib_wait_dffr (
dffr #(64) u_perf_ribp_wait_dffr (
clk_i,
rst_n_i,
s_perf_rib_wait_d,
s_perf_rib_wait_q
s_perf_ribp_wait_d,
s_perf_ribp_wait_q
);
dffr #(64) u_perf_apb_wait_dffr (
clk_i,
@@ -656,7 +656,7 @@ module bus (
assign perf_mgmt_wait_o = s_perf_mgmt_wait_q;
assign perf_user_wait_o = s_perf_user_wait_q;
assign perf_dma_wait_o = s_perf_dma_wait_q;
assign perf_rib_wait_o = s_perf_rib_wait_q;
assign perf_ribp_wait_o = s_perf_ribp_wait_q;
assign perf_apb_wait_o = s_perf_apb_wait_q;
assign perf_sdram_wait_o = s_perf_sdram_wait_q;
assign perf_psram_wait_o = s_perf_psram_wait_q;
+2 -2
View File
@@ -13,7 +13,7 @@ module core_wrapper (
input logic clk_i,
input logic rst_n_i,
input logic [31:0] irq_i,
soc_rib_if.master rib
soc_ribl_if.master ribl
// verilog_format: on
);
@@ -21,7 +21,7 @@ module core_wrapper (
.clk_i (clk_i),
.rst_n_i(rst_n_i),
.irq_i (irq_i),
.rib (rib)
.ribl (ribl)
);
endmodule
+5 -5
View File
@@ -22,13 +22,13 @@ module ip_apb_wrapper (
input logic clk_aud_i,
input logic rst_aud_n_i,
input logic tmr_capch_i,
rib_if.slave rib,
ribp_if.slave ribp,
uart_if.dut uart,
pwm_if.dut pwm,
ps2_if.dut ps2,
input logic [`USER_IPSEL_WIDTH-1:0] ip_sel_i,
user_gpio_if.user_ip user_gpio,
output logic rib_resp_err_o,
output logic ribp_resp_err_o,
output logic [`SOC_IRQ_APB_WIDTH-1:0] irq_o
// verilog_format: on
);
@@ -63,11 +63,11 @@ module ip_apb_wrapper (
// Generated IRQ ownership and core-vector bit assignments are topology checked.
`include "soc_apb_irq_bindings.svh"
rib2apb u_rib2apb (
ribp2apb u_ribp2apb (
.clk_i (clk_i),
.rst_n_i (rst_n_i),
.rib (rib),
.resp_err_o(rib_resp_err_o),
.ribp (ribp),
.resp_err_o(ribp_resp_err_o),
`include "soc_apb_connections.svh"
);
@@ -12,13 +12,13 @@
`include "soc_irq_config.svh"
`include "soc_rib_defs.svh"
module ip_rib_wrapper (
module ip_ribp_wrapper (
// verilog_format: off
input logic clk_i,
input logic rst_n_i,
input logic clk_aud_i,
input logic rst_aud_n_i,
soc_rib_burst_if.slave burst_rib,
soc_rib_if.slave rib,
gpio_if.dut gpio,
user_gpio_if.padctrl user_gpio,
uart_if.dut uart,
@@ -28,7 +28,7 @@ module ip_rib_wrapper (
i2s_if.dut i2s,
onewire_if.dut onewire,
xpi_if.dut xpi,
soc_rib_burst_if.master dma_rib,
soc_rib_if.master dma_rib,
sysctrl_if.dut sysctrl,
pll_ctrl_if.sysctrl pll_ctrl,
sdram_if.dut sdram,
@@ -40,15 +40,15 @@ module ip_rib_wrapper (
input logic [31:0] fault_addr_i,
input logic [3:0] fault_wstrb_i,
input logic fault_reserved_i,
output logic [`SOC_IRQ_RIB_WIDTH-1:0] irq_o
output logic [`SOC_IRQ_RIBP_WIDTH-1:0] irq_o
// verilog_format: on
);
// verilog_format: off
// Generated RIB target declarations preserve scalar-interface compatibility.
`include "soc_rib_interfaces.svh"
// Generated RIBP target declarations preserve scalar-interface compatibility.
`include "soc_ribp_interfaces.svh"
rib_if rib ();
ribp_if ribp ();
// verilog_format: on
simp_clint_if u_clint_if ();
@@ -59,169 +59,169 @@ module ip_rib_wrapper (
logic s_dma_xfer_done;
logic s_tim0_irq, s_tim1_irq;
soc_rib_burst_to_legacy u_rib_burst_to_legacy (
.clk_i (clk_i),
.rst_n_i (rst_n_i),
.legacy_resp_err_i (1'b0),
.legacy_resp_code_i(`SOC_RIB_RESP_OK),
.burst (burst_rib),
.legacy (rib)
soc_rib2ribp u_rib2ribp (
.clk_i (clk_i),
.rst_n_i (rst_n_i),
.ribp_resp_err_i (1'b0),
.ribp_resp_code_i(`SOC_RIB_RESP_OK),
.rib (rib),
.ribp (ribp)
);
// Generated target routing operates on the legacy boundary behind the
// burst adapter. Register targets therefore remain INCR1-only.
// Generated target routing operates on the RIBP boundary behind the RIB
// adapter. Register targets therefore remain INCR1-only.
assign u_dma_hw_trg_if.i2s_tx_proc = ~s_dma_i2s_tx_stall;
assign u_dma_hw_trg_if.i2s_rx_proc = ~s_dma_i2s_rx_stall;
assign u_dma_hw_trg_if.qspi_tx_proc = ~s_dma_xpi_tx_stall;
assign u_dma_hw_trg_if.qspi_rx_proc = ~s_dma_xpi_rx_stall;
// Uses ClusterIP common rib_if and register.sv dffr through generated bindings.
`include "soc_rib_routes.svh"
// Uses ClusterIP common ribp_if and register.sv dffr through generated bindings.
`include "soc_ribp_routes.svh"
// verilog_format: off
// Generated IRQ ownership and core-vector bit assignments are topology checked.
`include "soc_rib_irq_bindings.svh"
`include "soc_ribp_irq_bindings.svh"
rib_gpio u_rib_gpio (
ribp_gpio u_rib_gpio (
.clk_i (clk_i),
.rst_n_i (rst_n_i),
.rib (u_gpio_rib_if),
.ribp(u_gpio_ribp_if),
.gpio (gpio),
.user_gpio(user_gpio)
);
// verilog_format: on
rib_uart u_rib_uart (
ribp_uart u_rib_uart (
.clk_i (clk_i),
.rst_n_i(rst_n_i),
.rib (u_uart_rib_if),
.ribp (u_uart_ribp_if),
.uart (uart)
);
rib_timer u_rib_timer0 (
ribp_timer u_rib_timer0 (
.clk_i (clk_i),
.rst_n_i(rst_n_i),
.rib (u_tim0_rib_if),
.ribp (u_tim0_ribp_if),
.irq_o (s_tim0_irq)
);
rib_timer u_rib_timer1 (
ribp_timer u_rib_timer1 (
.clk_i (clk_i),
.rst_n_i(rst_n_i),
.rib (u_tim1_rib_if),
.ribp (u_tim1_ribp_if),
.irq_o (s_tim1_irq)
);
rib_psram u_rib_psram (
ribp_psram u_rib_psram (
.clk_i (clk_i),
.rst_n_i(rst_n_i),
.rib (u_psram_rib_if),
.ribp (u_psram_ribp_if),
.psram (psram)
);
rib_spisd u_rib_spisd (
ribp_spisd u_rib_spisd (
.clk_i (clk_i),
.rst_n_i(rst_n_i),
.rib (u_spisd_rib_if),
.ribp (u_spisd_ribp_if),
.spi (spisd)
);
rib_i2c u_rib_i2c0 (
ribp_i2c u_rib_i2c0 (
.clk_i (clk_i),
.rst_n_i(rst_n_i),
.rib (u_i2c0_rib_if),
.ribp (u_i2c0_ribp_if),
.i2c (i2c0)
);
rib_i2s u_rib_i2s (
ribp_i2s u_rib_i2s (
.clk_i (clk_i),
.rst_n_i (rst_n_i),
.clk_aud_i (clk_aud_i),
.rst_aud_n_i (rst_aud_n_i),
.dma_tx_stall_o(s_dma_i2s_tx_stall),
.dma_rx_stall_o(s_dma_i2s_rx_stall),
.rib (u_i2s_rib_if),
.ribp (u_i2s_ribp_if),
.i2s (i2s)
);
rib_onewire u_rib_onewire (
ribp_onewire u_rib_onewire (
.clk_i (clk_i),
.rst_n_i(rst_n_i),
.rib (u_onewire_rib_if),
.ribp (u_onewire_ribp_if),
.onewire(onewire)
);
rib_xpi u_rib_xpi (
ribp_xpi u_rib_xpi (
.clk_i (clk_i),
.rst_n_i (rst_n_i),
.dma_xfer_done_i(s_dma_xfer_done),
.dma_tx_stall_o (s_dma_xpi_tx_stall),
.dma_rx_stall_o (s_dma_xpi_rx_stall),
.rib (u_xpi_rib_if),
.ribp (u_xpi_ribp_if),
.xpi (xpi)
);
rib_dma u_rib_dma (
ribp_dma u_rib_dma (
.clk_i (clk_i),
.rst_n_i (rst_n_i),
.dma_xfer_done_o(s_dma_xfer_done),
.hw_trg (u_dma_hw_trg_if),
.rib (u_dma_rib_if),
.rib_dma (dma_rib)
.ribp (u_dma_ribp_if),
.rib (dma_rib)
);
rib_sysctrl u_rib_sysctrl (
ribp_sysctrl u_rib_sysctrl (
.clk_i (clk_i),
.rst_n_i (rst_n_i),
.fault_valid_i (fault_valid_i),
.fault_addr_i (fault_addr_i),
.fault_wstrb_i (fault_wstrb_i),
.fault_reserved_i(fault_reserved_i),
.rib (u_sysctrl_rib_if),
.ribp (u_sysctrl_ribp_if),
.sysctrl (sysctrl),
.pll_ctrl (pll_ctrl)
);
rib_clint u_rib_clint (
ribp_clint u_rib_clint (
.clk_i (clk_i),
.rst_n_i(rst_n_i),
.rib (u_clint_rib_if),
.ribp (u_clint_ribp_if),
.clint (u_clint_if)
);
rib_sdram u_rib_sdram (
ribp_sdram u_rib_sdram (
.clk_i (clk_i),
.rst_n_i(rst_n_i),
.rib (u_sdram_rib_if),
.ribp (u_sdram_ribp_if),
.sdram (sdram)
);
rib_dvp u_rib_dvp (
ribp_dvp u_rib_dvp (
.clk_i (clk_i),
.rst_n_i(rst_n_i),
.rib (u_dvp_rib_if),
.ribp (u_dvp_ribp_if),
.dvp (dvp)
);
rib_sdio u_rib_sdio (
ribp_sdio u_rib_sdio (
.clk_i (clk_i),
.rst_n_i(rst_n_i),
.rib (u_sdio_rib_if),
.ribp (u_sdio_ribp_if),
.sdio (sdio)
);
rib_opipsram u_rib_opipsram (
ribp_opipsram u_rib_opipsram (
.clk_i (clk_i),
.rst_n_i(rst_n_i),
.rib (u_opipsram_rib_if),
.ribp (u_opipsram_ribp_if),
.psram (opipsram)
);
rib_i2c u_rib_i2c1 (
ribp_i2c u_rib_i2c1 (
.clk_i (clk_i),
.rst_n_i(rst_n_i),
.rib (u_i2c1_rib_if),
.ribp (u_i2c1_ribp_if),
.i2c (i2c1)
);
+8 -8
View File
@@ -15,7 +15,7 @@ module mgmt_core_wrapper (
input logic clk_i,
input logic rst_n_i,
input logic [31:0] irq_i,
soc_rib_if.master rib
soc_ribl_if.master ribl
// verilog_format: on
);
@@ -33,13 +33,13 @@ module mgmt_core_wrapper (
.clk (clk_i),
.resetn (rst_n_i),
.trap (),
.mem_valid (rib.valid),
.mem_valid (ribl.valid),
.mem_instr (),
.mem_addr (rib.addr),
.mem_wdata (rib.wdata),
.mem_wstrb (rib.wstrb),
.mem_rdata (rib.rdata),
.mem_ready (rib.ready),
.mem_addr (ribl.addr),
.mem_wdata (ribl.wdata),
.mem_wstrb (ribl.wstrb),
.mem_rdata (ribl.rdata),
.mem_ready (ribl.ready),
.mem_la_read (),
.mem_la_write(),
.mem_la_addr (),
@@ -62,7 +62,7 @@ module mgmt_core_wrapper (
logic s_pwrup_req;
// verilog_format: off
ahbl_if u_ahbl_if (clk_i, rst_n_i);
ahbl2soc_rib u_ahbl2soc_rib (u_ahbl_if, rib);
ahbl2soc_ribl u_ahbl2soc_ribl (u_ahbl_if, ribl);
// verilog_format: on
hazard3_cpu_1port #(
+56 -6
View File
@@ -55,17 +55,53 @@ module rcu (
logic s_pll_capable;
logic [2:0] s_pll_sel;
logic s_pll_apply;
logic s_select_ext_clk;
logic [2:0] s_pll_cfg_sel;
logic s_pll_cfg_valid;
logic s_pll_cfg_ready;
logic s_pll_cfg_req;
logic s_pll_cfg_sent_d, s_pll_cfg_sent_q;
logic s_select_ext_clk;
tc_clk_buf u_xtal_buf (
.clk_i(xtal_clk_i),
.clk_o(s_xtal_clk_buf)
);
// ext_clk_i and the PLL reference clock are unrelated. A pulse generated
// by the controller must cross this boundary through a handshake.
cdc_2phase #(
.DATA_WIDTH(3)
) u_pll_config_cdc (
.src_clk_i (s_ext_clk_buf),
.src_rst_n_i(s_ext_rst_n_sync),
.src_data_i (s_pll_sel),
.src_valid_i(s_pll_cfg_req),
.src_ready_o(s_pll_cfg_ready),
.dst_clk_i (s_xtal_clk_buf),
.dst_rst_n_i(s_ext_rst_n_sync),
.dst_data_o (s_pll_cfg_sel),
.dst_valid_o(s_pll_cfg_valid),
.dst_ready_i(1'b1)
);
assign s_pll_cfg_req = s_pll_apply && ~s_pll_cfg_sent_q;
always_comb begin
s_pll_cfg_sent_d = s_pll_cfg_sent_q;
if (!s_pll_apply) begin
s_pll_cfg_sent_d = 1'b0;
end else if (s_pll_cfg_req && s_pll_cfg_ready) begin
s_pll_cfg_sent_d = 1'b1;
end
end
dffr #(1) u_pll_cfg_sent_dffr (
s_ext_clk_buf,
s_ext_rst_n_sync,
s_pll_cfg_sent_d,
s_pll_cfg_sent_q
);
tc_pll u_tc_pll (
.fref_i (s_xtal_clk_buf),
.rst_n_i (s_ext_rst_n_sync),
.cfg_sel_i (s_pll_sel),
.cfg_apply_i (s_pll_apply),
.cfg_sel_i (s_pll_cfg_sel),
.cfg_apply_i (s_pll_cfg_valid),
.pll_capable_o(s_pll_capable),
.pll_lock_o (s_pll_lock),
.pll_clk_o (s_pll_clk)
@@ -199,6 +235,7 @@ module pll_rcu_controller #(
logic s_active_valid_d, s_active_valid_q;
logic s_safe_clk_d, s_safe_clk_q;
logic s_lock_d, s_lock_q;
logic s_lock_seen_low_d, s_lock_seen_low_q;
logic [1:0] s_error_d, s_error_q;
logic s_rsp_valid_d, s_rsp_valid_q;
@@ -254,11 +291,13 @@ module pll_rcu_controller #(
s_active_valid_d = s_active_valid_q;
s_safe_clk_d = s_safe_clk_q;
s_lock_d = s_lock_q;
s_lock_seen_low_d = s_lock_seen_low_q;
s_error_d = s_error_q;
s_rsp_valid_d = s_rsp_valid_q;
unique case (s_state_q)
PLL_IDLE: begin
s_lock_seen_low_d = 1'b0;
if (s_req_valid) begin
s_pll_sel_d = s_req_sel;
s_select_ext_clk_d = 1'b1;
@@ -267,6 +306,7 @@ module pll_rcu_controller #(
end
end
PLL_SAFE: begin
s_lock_seen_low_d = 1'b0;
s_select_ext_clk_d = 1'b1;
s_safe_clk_d = 1'b1;
s_lock_d = 1'b0;
@@ -279,11 +319,15 @@ module pll_rcu_controller #(
end
end
PLL_APPLY: begin
s_lock_count_d = '0;
s_state_d = PLL_WAIT_LOCK;
s_lock_count_d = '0;
s_lock_seen_low_d = 1'b0;
s_state_d = PLL_WAIT_LOCK;
end
PLL_WAIT_LOCK: begin
if (pll_lock_i) begin
if (!pll_lock_i) begin
s_lock_seen_low_d = 1'b1;
end
if (s_lock_seen_low_q && pll_lock_i) begin
s_active_sel_d = s_pll_sel_q;
s_active_valid_d = 1'b1;
s_safe_clk_d = 1'b0;
@@ -371,6 +415,12 @@ module pll_rcu_controller #(
s_lock_d,
s_lock_q
);
dffr #(1) u_lock_seen_low_dffr (
ext_clk_i,
ext_rst_n_i,
s_lock_seen_low_d,
s_lock_seen_low_q
);
dffr #(2) u_error_dffr (
ext_clk_i,
ext_rst_n_i,
+20 -20
View File
@@ -31,7 +31,7 @@ module retrosoc (
);
// verilog_format: off
// Generated fabric links reuse the common rib_if contract.
// Generated fabric links reuse the common ribp_if contract.
`include "soc_fabric_interfaces.svh"
user_gpio_if u_user_gpio_if ();
// ip interface
@@ -53,7 +53,7 @@ module retrosoc (
logic s_tmr_capch;
logic [`SOC_IRQ_VECTOR_WIDTH-1:0] s_irq;
logic [ `SOC_IRQ_RIB_WIDTH-1:0] s_rib_irq;
logic [ `SOC_IRQ_RIBP_WIDTH-1:0] s_ribp_irq;
logic [ `SOC_IRQ_APB_WIDTH-1:0] s_apb_irq;
logic s_bus_fault_valid;
logic [ 31:0] s_bus_fault_addr;
@@ -68,7 +68,7 @@ module retrosoc (
logic [ 63:0] s_perf_mgmt_wait;
logic [ 63:0] s_perf_user_wait;
logic [ 63:0] s_perf_dma_wait;
logic [ 63:0] s_perf_rib_wait;
logic [ 63:0] s_perf_ribp_wait;
logic [ 63:0] s_perf_apb_wait;
logic [ 63:0] s_perf_sdram_wait;
logic [ 63:0] s_perf_psram_wait;
@@ -83,7 +83,7 @@ module retrosoc (
assign u_sysctrl_if.perf_mgmt_wait_i = s_perf_mgmt_wait;
assign u_sysctrl_if.perf_user_wait_i = s_perf_user_wait;
assign u_sysctrl_if.perf_dma_wait_i = s_perf_dma_wait;
assign u_sysctrl_if.perf_rib_wait_i = s_perf_rib_wait;
assign u_sysctrl_if.perf_ribp_wait_i = s_perf_ribp_wait;
assign u_sysctrl_if.perf_apb_wait_i = s_perf_apb_wait;
assign u_sysctrl_if.perf_sdram_wait_i = s_perf_sdram_wait;
assign u_sysctrl_if.perf_psram_wait_i = s_perf_psram_wait;
@@ -139,19 +139,19 @@ core_wrapper u_core_wrapper (
.perf_mgmt_wait_o (s_perf_mgmt_wait),
.perf_user_wait_o (s_perf_user_wait),
.perf_dma_wait_o (s_perf_dma_wait),
.perf_rib_wait_o (s_perf_rib_wait),
.perf_ribp_wait_o (s_perf_ribp_wait),
.perf_apb_wait_o (s_perf_apb_wait),
.perf_sdram_wait_o(s_perf_sdram_wait),
.perf_psram_wait_o(s_perf_psram_wait),
.perf_flash_wait_o(s_perf_flash_wait)
);
ip_rib_wrapper u_ip_rib_wrapper (
ip_ribp_wrapper u_ip_ribp_wrapper (
.clk_i (clk_i),
.rst_n_i (rst_n_i),
.clk_aud_i (clk_aud_i),
.rst_aud_n_i (rst_aud_n_i),
`include "soc_ip_rib_wrapper_fabric.svh"
`include "soc_ip_ribp_wrapper_fabric.svh"
.gpio (u_gpio_if),
.user_gpio (u_user_gpio_if),
.uart (uart0),
@@ -172,23 +172,23 @@ core_wrapper u_core_wrapper (
.fault_addr_i (s_bus_fault_addr),
.fault_wstrb_i (s_bus_fault_wstrb),
.fault_reserved_i(s_bus_fault_reserved),
.irq_o (s_rib_irq)
.irq_o (s_ribp_irq)
);
ip_apb_wrapper u_ip_apb_wrapper (
.clk_i (clk_i),
.rst_n_i (rst_n_i),
.clk_aud_i (clk_aud_i),
.rst_aud_n_i (rst_aud_n_i),
.tmr_capch_i (s_tmr_capch),
.clk_i (clk_i),
.rst_n_i (rst_n_i),
.clk_aud_i (clk_aud_i),
.rst_aud_n_i (rst_aud_n_i),
.tmr_capch_i (s_tmr_capch),
`include "soc_ip_apb_wrapper_fabric.svh"
.uart (u_uart1_if),
.pwm (u_pwm_if),
.ps2 (u_ps2_if),
.ip_sel_i (u_sysctrl_if.ip_sel_o),
.user_gpio (u_user_gpio_if),
.rib_resp_err_o(s_apb_resp_err),
.irq_o (s_apb_irq)
.uart (u_uart1_if),
.pwm (u_pwm_if),
.ps2 (u_ps2_if),
.ip_sel_i (u_sysctrl_if.ip_sel_o),
.user_gpio (u_user_gpio_if),
.ribp_resp_err_o(s_apb_resp_err),
.irq_o (s_apb_irq)
);
endmodule
Loaded 100 of 139 files, more files were not shown because too many files have changed in this diff. Show more