mirror of
https://github.com/retroSoC/retroSoC.git
synced 2026-11-04 22:32:36 +00:00
- Updated the formal file list generator to include CLINT source files. - Added CLINT timebase to the clock and reset domains configuration. - Enhanced the SOC topology generation to include CLINT interrupts and their mappings. - Introduced a new CLINT testbench to validate multi-hart and timebase functionality. - Modified the software build configuration to define CLINT timebase frequency. - Updated the RCU module to integrate CLINT timebase generation. - Adjusted the IRQ configuration to reflect changes in CLINT interrupt signals. - Added user-visible flags for interrupts in the topology configuration. - Enhanced the clock reset domain checks to include CLINT timebase. - Updated the memory map tests to validate CLINT peripheral integration.
213 lines
8.2 KiB
Systemverilog
213 lines
8.2 KiB
Systemverilog
// 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 FITNESS FOR A PARTICULAR PURPOSE.
|
|
// See the Mulan PSL v2 for more details.
|
|
|
|
`include "mmap_define.svh"
|
|
`include "user_extensions.svh"
|
|
`include "soc_irq_config.svh"
|
|
|
|
module retrosoc (
|
|
// verilog_format: off
|
|
input logic clk_i,
|
|
input logic rst_n_i,
|
|
input logic clk_aud_i,
|
|
input logic rst_aud_n_i,
|
|
input logic clkdiv4_i,
|
|
input logic timebase_tick_i,
|
|
pll_ctrl_if.sysctrl pll_ctrl,
|
|
`ifdef HAVE_SRAM_IF
|
|
ram_if.master ram,
|
|
`endif
|
|
gpio_if.soc_pad gpio,
|
|
uart_if.dut uart0,
|
|
xpi_if.dut xpi,
|
|
sdram_if.dut sdram,
|
|
input logic jtag_tck_i,
|
|
input logic jtag_tms_i,
|
|
input logic jtag_tdi_i,
|
|
input logic jtag_trst_n_i,
|
|
output logic jtag_tdo_o,
|
|
output logic test_done_o,
|
|
output logic test_pass_o,
|
|
output logic [7:0] test_code_o
|
|
// verilog_format: on
|
|
);
|
|
|
|
// verilog_format: off
|
|
// Generated fabric links reuse the common ribp_if contract.
|
|
`include "soc_fabric_interfaces.svh"
|
|
user_gpio_if u_user_gpio_if ();
|
|
// ip interface
|
|
gpio_if u_gpio_if ();
|
|
psram_if u_psram_if ();
|
|
spi_if u_spisd_if ();
|
|
i2c_if u_i2c0_if ();
|
|
i2s_if u_i2s_if ();
|
|
ws2812_if u_ws2812_if ();
|
|
sysctrl_if u_sysctrl_if ();
|
|
dvp_if u_dvp_if ();
|
|
sdio_if u_sdio_if ();
|
|
opipsram_if u_opipsram_if ();
|
|
i2c_if u_i2c1_if ();
|
|
uart_if u_uart1_if ();
|
|
pwm_if u_pwm_if ();
|
|
ps2_if u_ps2_if ();
|
|
// verilog_format: on
|
|
|
|
logic s_tmr_capch;
|
|
logic s_mgmt_debug_halted;
|
|
logic [`SOC_IRQ_VECTOR_WIDTH-1:0] s_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;
|
|
logic [ 3:0] s_bus_fault_wstrb;
|
|
logic s_bus_fault_reserved;
|
|
logic s_bus_fault_access;
|
|
logic [ 1:0] s_bus_fault_master;
|
|
logic [ 2:0] s_bus_fault_code;
|
|
logic s_perf_enable;
|
|
logic s_perf_clear;
|
|
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_ribp_wait;
|
|
logic [ 63:0] s_perf_apb_wait;
|
|
logic [ 63:0] s_perf_sdram_wait;
|
|
logic [ 63:0] s_perf_psram_wait;
|
|
logic [ 63:0] s_perf_flash_wait;
|
|
logic [`SOC_IRQ_VECTOR_WIDTH-1:0] s_user_irq;
|
|
|
|
assign u_sysctrl_if.fault_access_i = s_bus_fault_access;
|
|
assign u_sysctrl_if.fault_master_i = s_bus_fault_master;
|
|
assign u_sysctrl_if.fault_code_i = s_bus_fault_code;
|
|
assign s_perf_enable = u_sysctrl_if.perf_enable_o;
|
|
assign s_perf_clear = u_sysctrl_if.perf_clear_o;
|
|
assign test_done_o = u_sysctrl_if.test_done_o;
|
|
assign test_pass_o = u_sysctrl_if.test_pass_o;
|
|
assign test_code_o = u_sysctrl_if.test_code_o;
|
|
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_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;
|
|
assign u_sysctrl_if.perf_flash_wait_i = s_perf_flash_wait;
|
|
|
|
gpio_pad_bridge u_gpio_pad_bridge (
|
|
.inner(u_gpio_if),
|
|
.outer(gpio)
|
|
);
|
|
|
|
// Generated IRQ vector wiring defaults all unallocated core IRQ bits low.
|
|
`include "soc_irq_wiring.svh"
|
|
|
|
// Generated GPIO alternate-function wiring is checked against soc_topology.json.
|
|
`include "soc_gpio_alt_bindings.svh"
|
|
|
|
core_wrapper u_core_wrapper (
|
|
.clk_i (clk_i),
|
|
.rst_n_i (rst_n_i),
|
|
`include "soc_mgmt_core_wrapper_fabric.svh"
|
|
.irq_i (s_irq),
|
|
.jtag_tck_i (jtag_tck_i),
|
|
.jtag_tms_i (jtag_tms_i),
|
|
.jtag_tdi_i (jtag_tdi_i),
|
|
.jtag_trst_n_i (jtag_trst_n_i),
|
|
.jtag_tdo_o (jtag_tdo_o),
|
|
.debug_halted_o(s_mgmt_debug_halted)
|
|
);
|
|
|
|
assign s_user_irq = u_sysctrl_if.user_bus_enable_o ? (s_irq & `SOC_USER_IRQ_MASK) : '0;
|
|
user_core_top u_user_core_top (
|
|
.clk_i (clk_i),
|
|
.rst_n_i (rst_n_i),
|
|
.irq_i (s_user_irq),
|
|
.sel_i (u_sysctrl_if.core_sel_o),
|
|
`include "soc_user_core_fabric.svh"
|
|
.core_reset_i(u_sysctrl_if.core_reset_o)
|
|
);
|
|
|
|
bus u_bus (
|
|
.clk_i (clk_i),
|
|
.rst_n_i (rst_n_i),
|
|
`ifdef HAVE_SRAM_IF
|
|
.ram (ram),
|
|
`endif
|
|
.user_bus_enable_i(u_sysctrl_if.user_bus_enable_o),
|
|
.user_bus_idle_o (u_sysctrl_if.user_bus_idle_i),
|
|
`include "soc_bus_fabric.svh"
|
|
.perf_enable_i (s_perf_enable),
|
|
.perf_clear_i (s_perf_clear),
|
|
.fault_valid_o (s_bus_fault_valid),
|
|
.fault_addr_o (s_bus_fault_addr),
|
|
.fault_wstrb_o (s_bus_fault_wstrb),
|
|
.fault_reserved_o (s_bus_fault_reserved),
|
|
.fault_access_o (s_bus_fault_access),
|
|
.fault_master_o (s_bus_fault_master),
|
|
.fault_code_o (s_bus_fault_code),
|
|
.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_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_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),
|
|
.debug_halted_i (s_mgmt_debug_halted),
|
|
.timebase_tick_i (timebase_tick_i),
|
|
`include "ip_ribp_wrapper_fabric.svh"
|
|
.gpio (u_gpio_if),
|
|
.user_gpio (u_user_gpio_if),
|
|
.uart (uart0),
|
|
.psram (u_psram_if),
|
|
.spisd (u_spisd_if),
|
|
.i2c0 (u_i2c0_if),
|
|
.i2s (u_i2s_if),
|
|
.ws2812 (u_ws2812_if),
|
|
.xpi (xpi),
|
|
.sysctrl (u_sysctrl_if),
|
|
.pll_ctrl (pll_ctrl),
|
|
.sdram (sdram),
|
|
.dvp (u_dvp_if),
|
|
.sdio (u_sdio_if),
|
|
.opipsram (u_opipsram_if),
|
|
.i2c1 (u_i2c1_if),
|
|
.fault_valid_i (s_bus_fault_valid),
|
|
.fault_addr_i (s_bus_fault_addr),
|
|
.fault_wstrb_i (s_bus_fault_wstrb),
|
|
.fault_reserved_i(s_bus_fault_reserved),
|
|
.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),
|
|
`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),
|
|
.irq_o (s_apb_irq)
|
|
);
|
|
|
|
endmodule
|