|
| 1 | +// Copyright 2021 Thales DIS design services SAS |
| 2 | +// |
| 3 | +// Licensed under the Solderpad Hardware Licence, Version 2.0 (the "License"); |
| 4 | +// you may not use this file except in compliance with the License. |
| 5 | +// SPDX-License-Identifier: Apache-2.0 WITH SHL-2.0 |
| 6 | +// You may obtain a copy of the License at https://solderpad.org/licenses/ |
| 7 | +// |
| 8 | +// Original Author: Jean-Roch COULON (jean-roch.coulon@thalesgroup.com) |
| 9 | + |
| 10 | +module ariane_wrapper import ariane_pkg::*; #( |
| 11 | + parameter ariane_pkg::ariane_cfg_t ArianeCfg = ariane_pkg::ArianeDefaultConfig |
| 12 | +) ( |
| 13 | + input logic clk_i, |
| 14 | + input logic rst_ni, |
| 15 | + // Core ID, Cluster ID and boot address are considered more or less static |
| 16 | + input logic [63:0] boot_addr_i, // reset boot address |
| 17 | + input logic [63:0] hart_id_i, // hart id in a multicore environment (reflected in a CSR) |
| 18 | + |
| 19 | + // Interrupt inputs |
| 20 | + input logic [1:0] irq_i, // level sensitive IR lines, mip & sip (async) |
| 21 | + input logic ipi_i, // inter-processor interrupts (async) |
| 22 | + // Timer facilities |
| 23 | + input logic time_irq_i, // timer interrupt in (async) |
| 24 | + input logic debug_req_i, // debug request (async) |
| 25 | +`ifdef FIRESIM_TRACE |
| 26 | + // firesim trace port |
| 27 | + output traced_instr_pkg::trace_port_t trace_o, |
| 28 | +`endif |
| 29 | + // RISC-V formal interface port (`rvfi`): |
| 30 | + // Can be left open when formal tracing is not needed. |
| 31 | + output logic rvfi_valid_1, |
| 32 | + output logic[63:0] rvfi_order_1, |
| 33 | + output logic[31:0] rvfi_insn_1, |
| 34 | + output logic rvfi_trap_1, |
| 35 | + output logic rvfi_halt_1, |
| 36 | + output logic rvfi_intr_1, |
| 37 | + output logic[2:0] rvfi_mode_1, |
| 38 | + output logic[2:0] rvfi_ixl_1, |
| 39 | + output logic[4:0] rvfi_rs1_addr_1, |
| 40 | + output logic[4:0] rvfi_rs2_addr_1, |
| 41 | + output logic[riscv::XLEN-1:0] rvfi_rs1_rdata_1, |
| 42 | + output logic[riscv::XLEN-1:0] rvfi_rs2_rdata_1, |
| 43 | + output logic[4:0] rvfi_rd_addr_1, |
| 44 | + output logic[riscv::XLEN-1:0] rvfi_rd_wdata_1, |
| 45 | + output logic[riscv::XLEN-1:0] rvfi_pc_rdata_1, |
| 46 | + output logic[riscv::XLEN-1:0] rvfi_pc_wdata_1, |
| 47 | + output logic[riscv::XLEN-1:0] rvfi_mem_addr_1, |
| 48 | + output logic[(riscv::XLEN)/8-1:0] rvfi_mem_rmask_1, |
| 49 | + output logic[(riscv::XLEN)/8-1:0] rvfi_mem_wmask_1, |
| 50 | + output logic[riscv::XLEN-1:0] rvfi_mem_rdata_1, |
| 51 | + output logic[riscv::XLEN-1:0] rvfi_mem_wdata_1, |
| 52 | + output logic rvfi_valid_0, |
| 53 | + output logic[63:0] rvfi_order_0, |
| 54 | + output logic[31:0] rvfi_insn_0, |
| 55 | + output logic rvfi_trap_0, |
| 56 | + output logic rvfi_halt_0, |
| 57 | + output logic rvfi_intr_0, |
| 58 | + output logic[2:0] rvfi_mode_0, |
| 59 | + output logic[2:0] rvfi_ixl_0, |
| 60 | + output logic[4:0] rvfi_rs1_addr_0, |
| 61 | + output logic[4:0] rvfi_rs2_addr_0, |
| 62 | + output logic[riscv::XLEN-1:0] rvfi_rs1_rdata_0, |
| 63 | + output logic[riscv::XLEN-1:0] rvfi_rs2_rdata_0, |
| 64 | + output logic[4:0] rvfi_rd_addr_0, |
| 65 | + output logic[riscv::XLEN-1:0] rvfi_rd_wdata_0, |
| 66 | + output logic[riscv::XLEN-1:0] rvfi_pc_rdata_0, |
| 67 | + output logic[riscv::XLEN-1:0] rvfi_pc_wdata_0, |
| 68 | + output logic[riscv::XLEN-1:0] rvfi_mem_addr_0, |
| 69 | + output logic[(riscv::XLEN)/8-1:0] rvfi_mem_rmask_0, |
| 70 | + output logic[(riscv::XLEN)/8-1:0] rvfi_mem_wmask_0, |
| 71 | + output logic[riscv::XLEN-1:0] rvfi_mem_rdata_0, |
| 72 | + output logic[riscv::XLEN-1:0] rvfi_mem_wdata_0, |
| 73 | +`ifdef PITON_ARIANE |
| 74 | + // L15 (memory side) |
| 75 | + output wt_cache_pkg::l15_req_t l15_req_o, |
| 76 | + input wt_cache_pkg::l15_rtrn_t l15_rtrn_i |
| 77 | +`else |
| 78 | + // memory side, AXI Master |
| 79 | + output ariane_axi::id_t aw_id_o, |
| 80 | + output ariane_axi::addr_t aw_addr_o, |
| 81 | + output axi_pkg::len_t aw_len_o, |
| 82 | + output axi_pkg::size_t aw_size_o, |
| 83 | + output axi_pkg::burst_t aw_burst_o, |
| 84 | + output logic aw_lock_o, |
| 85 | + output axi_pkg::cache_t aw_cache_o, |
| 86 | + output axi_pkg::prot_t aw_prot_o, |
| 87 | + output axi_pkg::qos_t aw_qos_o, |
| 88 | + output axi_pkg::region_t aw_region_o, |
| 89 | + output axi_pkg::atop_t aw_atop_o, |
| 90 | + output ariane_axi::user_t aw_user_o, |
| 91 | + output logic aw_valid_o, |
| 92 | + output ariane_axi::data_t w_data_o, |
| 93 | + output ariane_axi::strb_t w_strb_o, |
| 94 | + output logic w_last_o, |
| 95 | + output ariane_axi::user_t w_user_o, |
| 96 | + output logic w_valid_o, |
| 97 | + output logic b_ready_o, |
| 98 | + output ariane_axi::id_t ar_id_o, |
| 99 | + output ariane_axi::addr_t ar_addr_o, |
| 100 | + output axi_pkg::len_t ar_len_o, |
| 101 | + output axi_pkg::size_t ar_size_o, |
| 102 | + output axi_pkg::burst_t ar_burst_o, |
| 103 | + output logic ar_lock_o, |
| 104 | + output axi_pkg::cache_t ar_cache_o, |
| 105 | + output axi_pkg::prot_t ar_prot_o, |
| 106 | + output axi_pkg::qos_t ar_qos_o, |
| 107 | + output axi_pkg::region_t ar_region_o, |
| 108 | + output ariane_axi::user_t ar_user_o, |
| 109 | + output logic ar_valid_o, |
| 110 | + output logic r_ready_o, |
| 111 | + input logic aw_ready_i, |
| 112 | + input logic ar_ready_i, |
| 113 | + input logic w_ready_i, |
| 114 | + input logic b_valid_i, |
| 115 | + input ariane_axi::id_t b_id_i, |
| 116 | + input axi_pkg::resp_t b_resp_i, |
| 117 | + input ariane_axi::user_t b_user_i, |
| 118 | + input logic r_valid_i, |
| 119 | + input ariane_axi::id_t r_id_i, |
| 120 | + input ariane_axi::data_t r_data_i, |
| 121 | + input axi_pkg::resp_t r_resp_i, |
| 122 | + input logic r_last_i, |
| 123 | + input ariane_axi::user_t r_user_i |
| 124 | +`endif |
| 125 | +); |
| 126 | + |
| 127 | + ariane_axi::req_t axi_ariane_req; |
| 128 | + ariane_axi::resp_t axi_ariane_resp; |
| 129 | + ariane_rvfi_pkg::rvfi_port_t rvfi; |
| 130 | + |
| 131 | + assign aw_id_o = axi_ariane_req.aw.id; |
| 132 | + assign aw_addr_o = axi_ariane_req.aw.addr; |
| 133 | + assign aw_len_o = axi_ariane_req.aw.len; |
| 134 | + assign aw_size_o = axi_ariane_req.aw.size; |
| 135 | + assign aw_burst_o = axi_ariane_req.aw.burst; |
| 136 | + assign aw_lock_o = axi_ariane_req.aw.lock; |
| 137 | + assign aw_cache_o = axi_ariane_req.aw.cache; |
| 138 | + assign aw_prot_o = axi_ariane_req.aw.prot; |
| 139 | + assign aw_qos_o = axi_ariane_req.aw.qos; |
| 140 | + assign aw_region_o = axi_ariane_req.aw.region; |
| 141 | + assign aw_atop_o = axi_ariane_req.aw.atop; |
| 142 | + assign aw_user_o = axi_ariane_req.aw.user; |
| 143 | + assign aw_valid_o = axi_ariane_req.aw_valid; |
| 144 | + assign w_data_o = axi_ariane_req.w.data; |
| 145 | + assign w_strb_o = axi_ariane_req.w.strb; |
| 146 | + assign w_last_o = axi_ariane_req.w.last; |
| 147 | + assign w_user_o = axi_ariane_req.w.user; |
| 148 | + assign w_valid_o = axi_ariane_req.w_valid; |
| 149 | + assign b_ready_o = axi_ariane_req.b_ready; |
| 150 | + assign ar_id_o = axi_ariane_req.ar.id; |
| 151 | + assign ar_addr_o = axi_ariane_req.ar.addr; |
| 152 | + assign ar_len_o = axi_ariane_req.ar.len; |
| 153 | + assign ar_size_o = axi_ariane_req.ar.size; |
| 154 | + assign ar_burst_o = axi_ariane_req.ar.burst; |
| 155 | + assign ar_lock_o = axi_ariane_req.ar.lock; |
| 156 | + assign ar_cache_o = axi_ariane_req.ar.cache; |
| 157 | + assign ar_prot_o = axi_ariane_req.ar.prot; |
| 158 | + assign ar_qos_o = axi_ariane_req.ar.qos; |
| 159 | + assign ar_region_o = axi_ariane_req.ar.region; |
| 160 | + assign ar_user_o = axi_ariane_req.ar.user; |
| 161 | + assign ar_valid_o = axi_ariane_req.ar_valid; |
| 162 | + assign r_ready_o = axi_ariane_req.r_ready; |
| 163 | + |
| 164 | + assign axi_ariane_resp.aw_ready = aw_ready_i; |
| 165 | + assign axi_ariane_resp.ar_ready = ar_ready_i; |
| 166 | + assign axi_ariane_resp.w_ready = w_ready_i; |
| 167 | + assign axi_ariane_resp.b_valid = b_valid_i; |
| 168 | + assign axi_ariane_resp.b.id = b_id_i; |
| 169 | + assign axi_ariane_resp.b.resp = b_resp_i; |
| 170 | + assign axi_ariane_resp.b.user = b_user_i; |
| 171 | + assign axi_ariane_resp.r_valid = r_valid_i; |
| 172 | + assign axi_ariane_resp.r.id = r_id_i; |
| 173 | + assign axi_ariane_resp.r.data = r_data_i; |
| 174 | + assign axi_ariane_resp.r.resp = r_resp_i; |
| 175 | + assign axi_ariane_resp.r.last = r_last_i; |
| 176 | + assign axi_ariane_resp.r.user = r_user_i; |
| 177 | + |
| 178 | + assign rvfi_valid_1 = rvfi[1].valid; |
| 179 | + assign rvfi_order_1 = rvfi[1].order; |
| 180 | + assign rvfi_insn_1 = rvfi[1].insn; |
| 181 | + assign rvfi_trap_1 = rvfi[1].trap; |
| 182 | + assign rvfi_halt_1 = rvfi[1].halt; |
| 183 | + assign rvfi_intr_1 = rvfi[1].intr; |
| 184 | + assign rvfi_mode_1 = rvfi[1].mode; |
| 185 | + assign rvfi_ixl_1 = rvfi[1].ixl; |
| 186 | + assign rvfi_rs1_addr_1 = rvfi[1].rs1_addr; |
| 187 | + assign rvfi_rs2_addr_1 = rvfi[1].rs2_addr; |
| 188 | + assign rvfi_rs1_rdata_1 = rvfi[1].rs1_rdata; |
| 189 | + assign rvfi_rs2_rdata_1 = rvfi[1].rs2_rdata; |
| 190 | + assign rvfi_rd_addr_1 = rvfi[1].rd_addr; |
| 191 | + assign rvfi_rd_wdata_1 = rvfi[1].rd_wdata; |
| 192 | + assign rvfi_pc_rdata_1 = rvfi[1].pc_rdata; |
| 193 | + assign rvfi_pc_wdata_1 = rvfi[1].pc_wdata; |
| 194 | + assign rvfi_mem_addr_1 = rvfi[1].mem_addr; |
| 195 | + assign rvfi_mem_rmask_1 = rvfi[1].mem_rmask; |
| 196 | + assign rvfi_mem_wmask_1 = rvfi[1].mem_wmask; |
| 197 | + assign rvfi_mem_rdata_1 = rvfi[1].mem_rdata; |
| 198 | + assign rvfi_mem_wdata_1 = rvfi[1].mem_wdata; |
| 199 | + assign rvfi_valid_0 = rvfi[0].valid; |
| 200 | + assign rvfi_order_0 = rvfi[0].order; |
| 201 | + assign rvfi_insn_0 = rvfi[0].insn; |
| 202 | + assign rvfi_trap_0 = rvfi[0].trap; |
| 203 | + assign rvfi_halt_0 = rvfi[0].halt; |
| 204 | + assign rvfi_intr_0 = rvfi[0].intr; |
| 205 | + assign rvfi_mode_0 = rvfi[0].mode; |
| 206 | + assign rvfi_ixl_0 = rvfi[0].ixl; |
| 207 | + assign rvfi_rs1_addr_0 = rvfi[0].rs1_addr; |
| 208 | + assign rvfi_rs2_addr_0 = rvfi[0].rs2_addr; |
| 209 | + assign rvfi_rs1_rdata_0 = rvfi[0].rs1_rdata; |
| 210 | + assign rvfi_rs2_rdata_0 = rvfi[0].rs2_rdata; |
| 211 | + assign rvfi_rd_addr_0 = rvfi[0].rd_addr; |
| 212 | + assign rvfi_rd_wdata_0 = rvfi[0].rd_wdata; |
| 213 | + assign rvfi_pc_rdata_0 = rvfi[0].pc_rdata; |
| 214 | + assign rvfi_pc_wdata_0 = rvfi[0].pc_wdata; |
| 215 | + assign rvfi_mem_addr_0 = rvfi[0].mem_addr; |
| 216 | + assign rvfi_mem_rmask_0 = rvfi[0].mem_rmask; |
| 217 | + assign rvfi_mem_wmask_0 = rvfi[0].mem_wmask; |
| 218 | + assign rvfi_mem_rdata_0 = rvfi[0].mem_rdata; |
| 219 | + assign rvfi_mem_wdata_0 = rvfi[0].mem_wdata; |
| 220 | + |
| 221 | + ariane #( |
| 222 | + .ArianeCfg ( ariane_soc::ArianeSocCfg ) |
| 223 | + ) i_ariane ( |
| 224 | + .clk_i ( clk_i ), |
| 225 | + .rst_ni ( rst_ni ), |
| 226 | + .boot_addr_i ( boot_addr_i ), |
| 227 | + .hart_id_i ( hart_id_i ), |
| 228 | + .irq_i ( irq_i ), |
| 229 | + .ipi_i ( ipi_i ), |
| 230 | + .time_irq_i ( time_irq_i ), |
| 231 | + .rvfi_o ( rvfi ), |
| 232 | + .debug_req_i ( debug_req_i ), |
| 233 | + .axi_req_o ( axi_ariane_req ), |
| 234 | + .axi_resp_i ( axi_ariane_resp ) |
| 235 | + ); |
| 236 | + |
| 237 | +endmodule // ariane_wrapper |
0 commit comments