blob: 3f61b7c21353035c1b51605f8996ef7b24e55206 [file] [log] [blame]
// Copyright 2025 Google LLC
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
module kelvin_soc
#(parameter MemInitFile = "",
parameter int ClockFrequencyMhz = 80)
(input clk_i,
input rst_ni,
input spi_clk_i,
input spi_csb_i,
input spi_mosi_i,
output logic spi_miso_o,
input prim_mubi_pkg::mubi4_t scanmode_i,
input top_pkg::uart_sideband_i_t[1 : 0] uart_sideband_i,
output top_pkg::uart_sideband_o_t[1 : 0] uart_sideband_o,
output logic io_halted,
output logic io_fault);
import tlul_pkg::*;
import top_pkg::*;
kelvin_tlul_pkg_128::tl_h2d_t tl_kelvin_core_i;
kelvin_tlul_pkg_128::tl_d2h_t tl_kelvin_core_o;
kelvin_tlul_pkg_128::tl_h2d_t tl_kelvin_device_o;
kelvin_tlul_pkg_128::tl_d2h_t tl_kelvin_device_i;
kelvin_tlul_pkg_32::tl_h2d_t tl_rom_o_32;
kelvin_tlul_pkg_32::tl_d2h_t tl_rom_i_32;
tl_h2d_t tl_sram_o;
tl_d2h_t tl_sram_i;
tl_h2d_t tl_uart0_o;
tl_d2h_t tl_uart0_i;
tl_h2d_t tl_uart1_o;
tl_d2h_t tl_uart1_i;
uart i_uart0(.clk_i(clk_i),
.rst_ni(rst_ni),
.tl_i(tl_uart0_o),
.tl_o(tl_uart0_i),
.alert_rx_i(1'b0),
.alert_tx_o(),
.racl_policies_i(1'b0),
.racl_error_o(),
.cio_rx_i(uart_sideband_i[0].cio_rx),
.cio_tx_o(uart_sideband_o[0].cio_tx),
.cio_tx_en_o(uart_sideband_o[0].cio_tx_en),
.intr_tx_watermark_o(uart_sideband_o[0].intr_tx_watermark),
.intr_tx_empty_o(uart_sideband_o[0].intr_tx_empty),
.intr_rx_watermark_o(uart_sideband_o[0].intr_rx_watermark),
.intr_tx_done_o(uart_sideband_o[0].intr_tx_done),
.intr_rx_overflow_o(uart_sideband_o[0].intr_rx_overflow),
.intr_rx_frame_err_o(uart_sideband_o[0].intr_rx_frame_err),
.intr_rx_break_err_o(uart_sideband_o[0].intr_rx_break_err),
.intr_rx_timeout_o(uart_sideband_o[0].intr_rx_timeout),
.intr_rx_parity_err_o(uart_sideband_o[0].intr_rx_parity_err),
.lsio_trigger_o(uart_sideband_o[0].lsio_trigger));
uart i_uart1(.clk_i(clk_i),
.rst_ni(rst_ni),
.tl_i(tl_uart1_o),
.tl_o(tl_uart1_i),
.alert_rx_i(1'b0),
.alert_tx_o(),
.racl_policies_i(1'b0),
.racl_error_o(),
.cio_rx_i(uart_sideband_i[1].cio_rx),
.cio_tx_o(uart_sideband_o[1].cio_tx),
.cio_tx_en_o(uart_sideband_o[1].cio_tx_en),
.intr_tx_watermark_o(uart_sideband_o[1].intr_tx_watermark),
.intr_tx_empty_o(uart_sideband_o[1].intr_tx_empty),
.intr_rx_watermark_o(uart_sideband_o[1].intr_rx_watermark),
.intr_tx_done_o(uart_sideband_o[1].intr_tx_done),
.intr_rx_overflow_o(uart_sideband_o[1].intr_rx_overflow),
.intr_rx_frame_err_o(uart_sideband_o[1].intr_rx_frame_err),
.intr_rx_break_err_o(uart_sideband_o[1].intr_rx_break_err),
.intr_rx_timeout_o(uart_sideband_o[1].intr_rx_timeout),
.intr_rx_parity_err_o(uart_sideband_o[1].intr_rx_parity_err),
.lsio_trigger_o(uart_sideband_o[1].lsio_trigger));
logic rom_req;
logic [10 : 0] rom_addr;
logic [31 : 0] rom_rdata;
logic rom_we;
logic [31 : 0] rom_wdata;
logic [3 : 0] rom_wmask;
logic rom_rvalid;
tlul_adapter_sram #(.SramAw(11),
.SramDw(32),
.ErrOnWrite(1),
.CmdIntgCheck(1'b1),
.EnableRspIntgGen(1'b1),
.EnableDataIntgGen(1'b1))
i_rom_adapter(.clk_i(clk_i),
.rst_ni(rst_ni),
.tl_i(tl_rom_o_32),
.tl_o(tl_rom_i_32),
.req_o(rom_req),
.we_o(rom_we),
.addr_o(rom_addr),
.wdata_o(rom_wdata),
.wmask_o(rom_wmask),
.rdata_i(rom_rdata),
.gnt_i(1'b1),
.rvalid_i(rom_rvalid),
.en_ifetch_i(prim_mubi_pkg::MuBi4True),
.req_type_o(),
.intg_error_o(),
.user_rsvd_o(),
.rerror_i(2'b0),
.compound_txn_in_progress_o(),
.readback_en_i(4'b0),
.readback_error_o(),
.wr_collision_i(1'b0),
.write_pending_i(1'b0));
prim_rom_adv #(.Width(32),
.Depth(2048),
.MemInitFile(MemInitFile))
i_rom(.clk_i(clk_i),
.rst_ni(rst_ni),
.req_i(rom_req),
.addr_i(rom_addr),
.rvalid_o(rom_rvalid),
.rdata_o(rom_rdata),
.cfg_i('0));
logic sram_req;
logic sram_we;
logic [11 : 0] sram_addr;
logic [31 : 0] sram_wdata;
logic [3 : 0] sram_wmask;
logic [31 : 0] sram_rdata;
logic sram_rvalid;
tlul_adapter_sram #(.SramAw(12),
.SramDw(32),
.CmdIntgCheck(1'b1),
.EnableRspIntgGen(1'b1),
.EnableDataIntgGen(1'b1))
i_sram_adapter(.clk_i(clk_i),
.rst_ni(rst_ni),
.tl_i(tl_sram_o),
.tl_o(tl_sram_i),
.req_o(sram_req),
.we_o(sram_we),
.addr_o(sram_addr),
.wdata_o(sram_wdata),
.wmask_o(sram_wmask),
.rdata_i(sram_rdata),
.gnt_i(1'b1),
.rvalid_i(sram_rvalid),
.en_ifetch_i(prim_mubi_pkg::MuBi4True),
.req_type_o(),
.intg_error_o(),
.user_rsvd_o(),
.rerror_i(2'b0),
.compound_txn_in_progress_o(),
.readback_en_i(4'b0),
.readback_error_o(),
.wr_collision_i(1'b0),
.write_pending_i(1'b0));
Sram #(.Width(32),
.Depth(1048576))
i_sram(.clk_i(clk_i),
.req_i(sram_req),
.we_i(sram_we),
.addr_i(sram_addr),
.wdata_i(sram_wdata),
.wmask_i(sram_wmask),
.rdata_o(sram_rdata),
.rvalid_o(sram_rvalid));
KelvinChiselSubsystem i_chisel_subsystem (
.io_clk_i(clk_i),
.io_rst_ni(rst_ni),
// External Device Port 0: rom
.io_external_devices_ports_0_a_valid(tl_rom_o_32.a_valid),
.io_external_devices_ports_0_a_bits_opcode(tl_rom_o_32.a_opcode),
.io_external_devices_ports_0_a_bits_param(tl_rom_o_32.a_param),
.io_external_devices_ports_0_a_bits_size(tl_rom_o_32.a_size),
.io_external_devices_ports_0_a_bits_source(tl_rom_o_32.a_source),
.io_external_devices_ports_0_a_bits_address(tl_rom_o_32.a_address),
.io_external_devices_ports_0_a_bits_mask(tl_rom_o_32.a_mask),
.io_external_devices_ports_0_a_bits_data(tl_rom_o_32.a_data),
.io_external_devices_ports_0_a_bits_user_rsvd(tl_rom_o_32.a_user.rsvd),
.io_external_devices_ports_0_a_bits_user_instr_type(tl_rom_o_32.a_user.instr_type),
.io_external_devices_ports_0_a_bits_user_cmd_intg(tl_rom_o_32.a_user.cmd_intg),
.io_external_devices_ports_0_a_bits_user_data_intg(tl_rom_o_32.a_user.data_intg),
.io_external_devices_ports_0_d_ready(tl_rom_o_32.d_ready),
.io_external_devices_ports_0_a_ready(tl_rom_i_32.a_ready),
.io_external_devices_ports_0_d_valid(tl_rom_i_32.d_valid),
.io_external_devices_ports_0_d_bits_opcode(tl_rom_i_32.d_opcode),
.io_external_devices_ports_0_d_bits_param(tl_rom_i_32.d_param),
.io_external_devices_ports_0_d_bits_size(tl_rom_i_32.d_size),
.io_external_devices_ports_0_d_bits_source(tl_rom_i_32.d_source),
.io_external_devices_ports_0_d_bits_sink(tl_rom_i_32.d_sink),
.io_external_devices_ports_0_d_bits_data(tl_rom_i_32.d_data),
.io_external_devices_ports_0_d_bits_error(tl_rom_i_32.d_error),
.io_external_devices_ports_0_d_bits_user_rsp_intg(tl_rom_i_32.d_user.rsp_intg),
.io_external_devices_ports_0_d_bits_user_data_intg(tl_rom_i_32.d_user.data_intg),
// External Device Port 1: sram
.io_external_devices_ports_1_a_valid(tl_sram_o.a_valid),
.io_external_devices_ports_1_a_bits_opcode(tl_sram_o.a_opcode),
.io_external_devices_ports_1_a_bits_param(tl_sram_o.a_param),
.io_external_devices_ports_1_a_bits_size(tl_sram_o.a_size),
.io_external_devices_ports_1_a_bits_source(tl_sram_o.a_source),
.io_external_devices_ports_1_a_bits_address(tl_sram_o.a_address),
.io_external_devices_ports_1_a_bits_mask(tl_sram_o.a_mask),
.io_external_devices_ports_1_a_bits_data(tl_sram_o.a_data),
.io_external_devices_ports_1_a_bits_user_rsvd(tl_sram_o.a_user.rsvd),
.io_external_devices_ports_1_a_bits_user_instr_type(tl_sram_o.a_user.instr_type),
.io_external_devices_ports_1_a_bits_user_cmd_intg(tl_sram_o.a_user.cmd_intg),
.io_external_devices_ports_1_a_bits_user_data_intg(tl_sram_o.a_user.data_intg),
.io_external_devices_ports_1_d_ready(tl_sram_o.d_ready),
.io_external_devices_ports_1_a_ready(tl_sram_i.a_ready),
.io_external_devices_ports_1_d_valid(tl_sram_i.d_valid),
.io_external_devices_ports_1_d_bits_opcode(tl_sram_i.d_opcode),
.io_external_devices_ports_1_d_bits_param(tl_sram_i.d_param),
.io_external_devices_ports_1_d_bits_size(tl_sram_i.d_size),
.io_external_devices_ports_1_d_bits_source(tl_sram_i.d_source),
.io_external_devices_ports_1_d_bits_sink(tl_sram_i.d_sink),
.io_external_devices_ports_1_d_bits_data(tl_sram_i.d_data),
.io_external_devices_ports_1_d_bits_error(tl_sram_i.d_error),
.io_external_devices_ports_1_d_bits_user_rsp_intg(tl_sram_i.d_user.rsp_intg),
.io_external_devices_ports_1_d_bits_user_data_intg(tl_sram_i.d_user.data_intg),
// External Device Port 2: uart0
.io_external_devices_ports_2_a_valid(tl_uart0_o.a_valid),
.io_external_devices_ports_2_a_bits_opcode(tl_uart0_o.a_opcode),
.io_external_devices_ports_2_a_bits_param(tl_uart0_o.a_param),
.io_external_devices_ports_2_a_bits_size(tl_uart0_o.a_size),
.io_external_devices_ports_2_a_bits_source(tl_uart0_o.a_source),
.io_external_devices_ports_2_a_bits_address(tl_uart0_o.a_address),
.io_external_devices_ports_2_a_bits_mask(tl_uart0_o.a_mask),
.io_external_devices_ports_2_a_bits_data(tl_uart0_o.a_data),
.io_external_devices_ports_2_a_bits_user_rsvd(tl_uart0_o.a_user.rsvd),
.io_external_devices_ports_2_a_bits_user_instr_type(tl_uart0_o.a_user.instr_type),
.io_external_devices_ports_2_a_bits_user_cmd_intg(tl_uart0_o.a_user.cmd_intg),
.io_external_devices_ports_2_a_bits_user_data_intg(tl_uart0_o.a_user.data_intg),
.io_external_devices_ports_2_d_ready(tl_uart0_o.d_ready),
.io_external_devices_ports_2_a_ready(tl_uart0_i.a_ready),
.io_external_devices_ports_2_d_valid(tl_uart0_i.d_valid),
.io_external_devices_ports_2_d_bits_opcode(tl_uart0_i.d_opcode),
.io_external_devices_ports_2_d_bits_param(tl_uart0_i.d_param),
.io_external_devices_ports_2_d_bits_size(tl_uart0_i.d_size),
.io_external_devices_ports_2_d_bits_source(tl_uart0_i.d_source),
.io_external_devices_ports_2_d_bits_sink(tl_uart0_i.d_sink),
.io_external_devices_ports_2_d_bits_data(tl_uart0_i.d_data),
.io_external_devices_ports_2_d_bits_error(tl_uart0_i.d_error),
.io_external_devices_ports_2_d_bits_user_rsp_intg(tl_uart0_i.d_user.rsp_intg),
.io_external_devices_ports_2_d_bits_user_data_intg(tl_uart0_i.d_user.data_intg),
// External Device Port 3: uart1
.io_external_devices_ports_3_a_valid(tl_uart1_o.a_valid),
.io_external_devices_ports_3_a_bits_opcode(tl_uart1_o.a_opcode),
.io_external_devices_ports_3_a_bits_param(tl_uart1_o.a_param),
.io_external_devices_ports_3_a_bits_size(tl_uart1_o.a_size),
.io_external_devices_ports_3_a_bits_source(tl_uart1_o.a_source),
.io_external_devices_ports_3_a_bits_address(tl_uart1_o.a_address),
.io_external_devices_ports_3_a_bits_mask(tl_uart1_o.a_mask),
.io_external_devices_ports_3_a_bits_data(tl_uart1_o.a_data),
.io_external_devices_ports_3_a_bits_user_rsvd(tl_uart1_o.a_user.rsvd),
.io_external_devices_ports_3_a_bits_user_instr_type(tl_uart1_o.a_user.instr_type),
.io_external_devices_ports_3_a_bits_user_cmd_intg(tl_uart1_o.a_user.cmd_intg),
.io_external_devices_ports_3_a_bits_user_data_intg(tl_uart1_o.a_user.data_intg),
.io_external_devices_ports_3_d_ready(tl_uart1_o.d_ready),
.io_external_devices_ports_3_a_ready(tl_uart1_i.a_ready),
.io_external_devices_ports_3_d_valid(tl_uart1_i.d_valid),
.io_external_devices_ports_3_d_bits_opcode(tl_uart1_i.d_opcode),
.io_external_devices_ports_3_d_bits_param(tl_uart1_i.d_param),
.io_external_devices_ports_3_d_bits_size(tl_uart1_i.d_size),
.io_external_devices_ports_3_d_bits_source(tl_uart1_i.d_source),
.io_external_devices_ports_3_d_bits_sink(tl_uart1_i.d_sink),
.io_external_devices_ports_3_d_bits_data(tl_uart1_i.d_data),
.io_external_devices_ports_3_d_bits_error(tl_uart1_i.d_error),
.io_external_devices_ports_3_d_bits_user_rsp_intg(tl_uart1_i.d_user.rsp_intg),
.io_external_devices_ports_3_d_bits_user_data_intg(tl_uart1_i.d_user.data_intg),
// Peripheral Ports (indexed based on SoCChiselConfig order)
.io_external_ports_0(io_halted), // halted
.io_external_ports_1(io_fault), // fault
.io_external_ports_2(), // wfi (unused)
.io_external_ports_3(1'b0), // irq (tied off)
.io_external_ports_4(1'b0), // te (tied off)
.io_external_ports_5(spi_clk_i), // spi_clk
.io_external_ports_6(spi_csb_i), // spi_csb
.io_external_ports_7(spi_mosi_i), // spi_mosi
.io_external_ports_8(spi_miso_o) // spi_miso
);
endmodule