abstractaccelerator/design/dec/dec.sv

585 lines
26 KiB
Systemverilog
Raw Normal View History

2019-06-04 22:57:48 +08:00
// SPDX-License-Identifier: Apache-2.0
// Copyright 2019 Western Digital Corporation or its affiliates.
2020-02-20 10:25:04 +08:00
//
2019-06-04 22:57:48 +08:00
// 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
2020-02-20 10:25:04 +08:00
//
2019-06-04 22:57:48 +08:00
// http://www.apache.org/licenses/LICENSE-2.0
2020-02-20 10:25:04 +08:00
//
2019-06-04 22:57:48 +08:00
// 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.
// dec: decode unit - decode, bypassing, ARF, interrupts
2020-02-20 10:25:04 +08:00
//
2019-06-04 22:57:48 +08:00
//********************************************************************************
// $Id$
//
2020-02-20 10:25:04 +08:00
//
// Function: Decode
2019-06-04 22:57:48 +08:00
// Comments: Decode, dependency scoreboard, ARF
//
2020-02-20 10:25:04 +08:00
//
2019-06-04 22:57:48 +08:00
// A -> D -> EX1 ... WB
2020-02-20 10:25:04 +08:00
//
2019-06-04 22:57:48 +08:00
//********************************************************************************
2020-02-20 10:25:04 +08:00
2019-06-04 22:57:48 +08:00
module dec
import swerv_types::*;
(
input logic clk,
input logic free_clk,
input logic active_clk,
output logic dec_pause_state_cg, // pause state for clock-gating
2020-02-20 10:25:04 +08:00
2019-06-04 22:57:48 +08:00
input logic rst_l, // reset, active low
input logic [31:1] rst_vec, // reset vector, from core pins
input logic nmi_int, // NMI pin
2020-02-20 10:25:04 +08:00
input logic [31:1] nmi_vec, // NMI vector, from pins
2019-06-04 22:57:48 +08:00
input logic i_cpu_halt_req, // Asynchronous Halt request to CPU
input logic i_cpu_run_req, // Asynchronous Restart request to CPU
output logic o_cpu_halt_status, // Halt status of core (pmu/fw)
output logic o_cpu_halt_ack, // Halt request ack
output logic o_cpu_run_ack, // Run request ack
output logic o_debug_mode_status, // Core to the PMU that core is in debug mode. When core is in debug mode, the PMU should refrain from sendng a halt or run request
// external MPC halt/run interface
input logic mpc_debug_halt_req, // Async halt request
input logic mpc_debug_run_req, // Async run request
input logic mpc_reset_run_req, // Run/halt after reset
output logic mpc_debug_halt_ack, // Halt ack
output logic mpc_debug_run_ack, // Run ack
output logic debug_brkpt_status, // debug breakpoint
2020-02-20 10:25:04 +08:00
output logic dec_ib0_valid_eff_d, // effective valid taking decode into account
2019-06-04 22:57:48 +08:00
output logic dec_ib1_valid_eff_d,
input logic exu_pmu_i0_br_misp, // slot 0 branch misp
input logic exu_pmu_i0_br_ataken, // slot 0 branch actual taken
2020-02-20 10:25:04 +08:00
input logic exu_pmu_i0_pc4, // slot 0 4 byte branch
input logic exu_pmu_i1_br_misp, // slot 1 branch misp
2019-06-04 22:57:48 +08:00
input logic exu_pmu_i1_br_ataken, // slot 1 branch actual taken
2020-02-20 10:25:04 +08:00
input logic exu_pmu_i1_pc4, // slot 1 4 byte branch
2019-06-04 22:57:48 +08:00
2020-02-20 10:25:04 +08:00
input logic lsu_nonblock_load_valid_dc3, // valid nonblock load at dc3
input logic [`RV_LSU_NUM_NBLOAD_WIDTH-1:0] lsu_nonblock_load_tag_dc3, // -> corresponding tag
input logic lsu_nonblock_load_inv_dc5, // invalidate request for nonblock load dc5
input logic [`RV_LSU_NUM_NBLOAD_WIDTH-1:0] lsu_nonblock_load_inv_tag_dc5, // -> corresponding tag
input logic lsu_nonblock_load_data_valid, // valid nonblock load data back
input logic lsu_nonblock_load_data_error, // nonblock load bus error
input logic [`RV_LSU_NUM_NBLOAD_WIDTH-1:0] lsu_nonblock_load_data_tag, // -> corresponding tag
2019-06-04 22:57:48 +08:00
input logic [31:0] lsu_nonblock_load_data, // nonblock load data
2020-02-20 10:25:04 +08:00
2019-06-04 22:57:48 +08:00
input logic lsu_pmu_bus_trxn, // D side bus transaction
input logic lsu_pmu_bus_misaligned, // D side bus misaligned
input logic lsu_pmu_bus_error, // D side bus error
input logic lsu_pmu_bus_busy, // D side bus busy
input logic lsu_pmu_misaligned_dc3, // D side load or store misaligned
2020-02-20 10:25:04 +08:00
2019-06-04 22:57:48 +08:00
input logic [1:0] ifu_pmu_instr_aligned, // aligned instructions
input logic ifu_pmu_align_stall, // aligner stalled
input logic ifu_pmu_fetch_stall, // fetch unit stalled
input logic ifu_pmu_ic_miss, // icache miss
input logic ifu_pmu_ic_hit, // icache hit
input logic ifu_pmu_bus_error, // Instruction side bus error
2020-02-20 10:25:04 +08:00
input logic ifu_pmu_bus_busy, // Instruction side bus busy
2019-06-04 22:57:48 +08:00
input logic ifu_pmu_bus_trxn, // Instruction side bus transaction
input logic [3:0] lsu_trigger_match_dc3,
input logic dbg_cmd_valid, // debugger abstract command valid
input logic [1:0] dbg_cmd_size, // size of the abstract mem access debug command
input logic dbg_cmd_write, // command is a write
input logic [1:0] dbg_cmd_type, // command type
input logic [31:0] dbg_cmd_addr, // command address
input logic [1:0] dbg_cmd_wrdata, // command write data, for fence/fence_i
2020-02-20 10:25:04 +08:00
input logic ifu_i0_icaf, // icache access fault
input logic ifu_i1_icaf,
2020-09-19 04:34:02 +08:00
input logic ifu_i0_icaf_second, // i0 has access fault on second 2B of 4B inst
input logic ifu_i1_icaf_second,
2020-02-20 10:25:04 +08:00
input logic ifu_i0_perr, // icache parity error
input logic ifu_i1_perr,
2019-08-14 03:48:48 +08:00
input logic ifu_i0_sbecc, // icache/iccm single-bit error
2020-02-20 10:25:04 +08:00
input logic ifu_i1_sbecc,
2019-08-14 03:48:48 +08:00
input logic ifu_i0_dbecc, // icache/iccm double-bit error
2019-06-04 22:57:48 +08:00
input logic ifu_i1_dbecc,
input logic lsu_freeze_dc3, // freeze pipe: decode -> dc3
input logic lsu_idle_any, // lsu idle for fence instructions
input logic lsu_halt_idle_any, // lsu idle for halting
2020-02-20 10:25:04 +08:00
2019-06-04 22:57:48 +08:00
input br_pkt_t i0_brp, // branch packet
input br_pkt_t i1_brp,
input lsu_error_pkt_t lsu_error_pkt_dc3, // LSU exception/error packet
2020-02-20 10:25:04 +08:00
input logic lsu_single_ecc_error_incr, // Increment the counter for Single ECC error
input logic lsu_load_ecc_stbuf_full_dc3, // STBUF full, ecc errors should be rfpc'd
2019-06-04 22:57:48 +08:00
input logic lsu_imprecise_error_load_any, // LSU imprecise load bus error
input logic lsu_imprecise_error_store_any, // LSU imprecise store bus error
input logic [31:0] lsu_imprecise_error_addr_any, // LSU imprecise bus error address
input logic lsu_freeze_external_ints_dc3, // load to side effect region
input logic exu_i0_flush_lower_e4, // slot 0 flush for mp
input logic exu_i1_flush_lower_e4, // slot 1 flush for mp
input logic [31:1] exu_i0_flush_path_e4, // slot 0 flush target for mp
input logic [31:1] exu_i1_flush_path_e4, // slot 1 flush target for mp
input logic [15:0] ifu_illegal_inst, // 16b opcode for illegal inst
2020-02-20 10:25:04 +08:00
2019-06-04 22:57:48 +08:00
input logic exu_div_stall, // stall decode for div executing
input logic [31:0] exu_div_result, // final div result
input logic exu_div_finish, // cycle div finishes
input logic [31:0] exu_mul_result_e3, // 32b mul result
input logic [31:0] exu_csr_rs1_e1, // rs1 for csr instruction
input logic [31:0] lsu_result_dc3, // load result
input logic [31:0] lsu_result_corr_dc4, // corrected load result
2020-02-20 10:25:04 +08:00
2019-06-04 22:57:48 +08:00
input logic lsu_load_stall_any, // This is for blocking loads
input logic lsu_store_stall_any, // This is for blocking stores
input logic dma_dccm_stall_any, // stall any load/store at decode, pmu event
input logic dma_iccm_stall_any, // iccm stalled, pmu event
input logic iccm_dma_sb_error, // ICCM DMA single bit error
2020-02-20 10:25:04 +08:00
2021-01-28 01:36:43 +08:00
input logic dma_mem_dccm_req,
2019-06-04 22:57:48 +08:00
input logic exu_i0_flush_final, // slot0 flush
input logic exu_i1_flush_final, // slot1 flush
input logic [31:1] exu_npc_e4, // next PC
input logic exu_flush_final, // final flush
input logic [31:0] exu_i0_result_e1, // alu result e1
2020-02-20 10:25:04 +08:00
input logic [31:0] exu_i1_result_e1,
2019-06-04 22:57:48 +08:00
input logic [31:0] exu_i0_result_e4, // alu result e4
2020-02-20 10:25:04 +08:00
input logic [31:0] exu_i1_result_e4,
2019-06-04 22:57:48 +08:00
2019-08-14 03:48:48 +08:00
input logic ifu_i0_valid, ifu_i1_valid, // fetch valids to instruction buffer
2019-06-04 22:57:48 +08:00
input logic [31:0] ifu_i0_instr, ifu_i1_instr, // fetch inst's to instruction buffer
input logic [31:1] ifu_i0_pc, ifu_i1_pc, // pc's for instruction buffer
input logic ifu_i0_pc4, ifu_i1_pc4, // indication of 4B or 2B for corresponding inst
input logic [31:1] exu_i0_pc_e1, // pc's for e1 from the alu's
2020-02-20 10:25:04 +08:00
input logic [31:1] exu_i1_pc_e1,
2019-06-04 22:57:48 +08:00
input logic mexintpend, // External interrupt pending
input logic timer_int, // Timer interrupt pending (from pin)
input logic [7:0] pic_claimid, // PIC claimid
input logic [3:0] pic_pl, // PIC priv level
2020-02-20 10:25:04 +08:00
input logic mhwakeup, // High priority wakeup
2019-06-04 22:57:48 +08:00
output logic [3:0] dec_tlu_meicurpl, // to PIC, Current priv level
output logic [3:0] dec_tlu_meipt, // to PIC
`ifdef RV_ICACHE_ECC
input logic [41:0] ifu_ic_debug_rd_data, // diagnostic icache read data
`else
input logic [33:0] ifu_ic_debug_rd_data, // diagnostic icache read data
`endif
input logic ifu_ic_debug_rd_data_valid, // diagnostic icache read data valid
output cache_debug_pkt_t dec_tlu_ic_diag_pkt, // packet of DICAWICS, DICAD0/1, DICAGO info for icache diagnostics
2020-02-20 10:25:04 +08:00
2019-06-04 22:57:48 +08:00
// Debug start
input logic dbg_halt_req, // DM requests a halt
input logic dbg_resume_req, // DM requests a resume
input logic ifu_miss_state_idle, // I-side miss buffer empty
2020-02-20 10:25:04 +08:00
2019-06-04 22:57:48 +08:00
output logic dec_tlu_flush_noredir_wb , // Tell fetch to idle on this flush
output logic dec_tlu_mpc_halted_only, // Core is halted only due to MPC
output logic dec_tlu_dbg_halted, // Core is halted and ready for debug command
output logic dec_tlu_pmu_fw_halted, // Core is halted due to Power management unit or firmware halt
output logic dec_tlu_debug_mode, // Core is in debug mode
output logic dec_tlu_resume_ack, // Resume acknowledge
output logic dec_tlu_flush_leak_one_wb, // single step
output logic dec_tlu_flush_err_wb, // iside perr/ecc rfpc
output logic dec_tlu_stall_dma, // stall dma access when there's a halt request
2020-02-20 10:25:04 +08:00
2019-06-04 22:57:48 +08:00
output logic dec_debug_wdata_rs1_d, // insert debug write data into rs1 at decode
output logic [31:0] dec_dbg_rddata, // debug command read data
output logic dec_dbg_cmd_done, // abstract command is done
output logic dec_dbg_cmd_fail, // abstract command failed (illegal reg address)
output trigger_pkt_t [3:0] trigger_pkt_any, // info needed by debug trigger blocks
// Debug end
// branch info from pipe0 for errors or counter updates
input logic [`RV_BTB_ADDR_HI:`RV_BTB_ADDR_LO] exu_i0_br_index_e4, // index
input logic [1:0] exu_i0_br_hist_e4, // history
input logic [1:0] exu_i0_br_bank_e4, // bank
input logic exu_i0_br_error_e4, // error
input logic exu_i0_br_start_error_e4, // start error
input logic exu_i0_br_valid_e4, // valid
input logic exu_i0_br_mp_e4, // mispredict
input logic exu_i0_br_middle_e4, // middle of bank
2020-02-20 10:25:04 +08:00
input logic [`RV_BHT_GHR_RANGE] exu_i0_br_fghr_e4, // FGHR when predicted
2019-06-04 22:57:48 +08:00
// branch info from pipe1 for errors or counter updates
input logic [`RV_BTB_ADDR_HI:`RV_BTB_ADDR_LO] exu_i1_br_index_e4, // index
input logic [1:0] exu_i1_br_hist_e4, // history
input logic [1:0] exu_i1_br_bank_e4, // bank
input logic exu_i1_br_error_e4, // error
input logic exu_i1_br_start_error_e4, // start error
input logic exu_i1_br_valid_e4, // valid
input logic exu_i1_br_mp_e4, // mispredict
input logic exu_i1_br_middle_e4, // middle of bank
input logic [`RV_BHT_GHR_RANGE] exu_i1_br_fghr_e4, // FGHR when predicted
`ifdef RV_BTB_48
input logic [1:0] exu_i1_br_way_e4, // way hit or repl
input logic [1:0] exu_i0_br_way_e4, // way hit or repl
2020-02-20 10:25:04 +08:00
`else
2019-06-04 22:57:48 +08:00
input logic exu_i1_br_way_e4, // way hit or repl
input logic exu_i0_br_way_e4, // way hit or repl
2020-02-20 10:25:04 +08:00
`endif
2019-06-04 22:57:48 +08:00
output logic [31:0] gpr_i0_rs1_d, // gpr rs1 data
output logic [31:0] gpr_i0_rs2_d, // gpr rs2 data
2020-02-20 10:25:04 +08:00
output logic [31:0] gpr_i1_rs1_d,
output logic [31:0] gpr_i1_rs2_d,
2019-06-04 22:57:48 +08:00
output logic [31:0] dec_i0_immed_d, // immediate data
2020-02-20 10:25:04 +08:00
output logic [31:0] dec_i1_immed_d,
2019-06-04 22:57:48 +08:00
output logic [12:1] dec_i0_br_immed_d, // br immediate data
2020-02-20 10:25:04 +08:00
output logic [12:1] dec_i1_br_immed_d,
2019-08-14 03:48:48 +08:00
output alu_pkt_t i0_ap, // alu packet
output alu_pkt_t i1_ap,
2019-06-04 22:57:48 +08:00
2019-08-14 03:48:48 +08:00
output logic dec_i0_alu_decode_d, // alu schedule on primary alu
output logic dec_i1_alu_decode_d,
2019-06-04 22:57:48 +08:00
2019-08-14 03:48:48 +08:00
output logic dec_i0_select_pc_d, // select pc onto rs1 for jal's
2020-02-20 10:25:04 +08:00
output logic dec_i1_select_pc_d,
2019-06-04 22:57:48 +08:00
output logic [31:1] dec_i0_pc_d, dec_i1_pc_d, // pc's at decode
2019-08-14 03:48:48 +08:00
output logic dec_i0_rs1_bypass_en_d, // rs1 bypass enable
output logic dec_i0_rs2_bypass_en_d, // rs2 bypass enable
output logic dec_i1_rs1_bypass_en_d,
output logic dec_i1_rs2_bypass_en_d,
2020-02-20 10:25:04 +08:00
2019-06-04 22:57:48 +08:00
output logic [31:0] i0_rs1_bypass_data_d, // rs1 bypass data
output logic [31:0] i0_rs2_bypass_data_d, // rs2 bypass data
output logic [31:0] i1_rs1_bypass_data_d,
output logic [31:0] i1_rs2_bypass_data_d,
2019-08-14 03:48:48 +08:00
output logic dec_ib3_valid_d, // ib3 buffer valid
2019-06-04 22:57:48 +08:00
output logic dec_ib2_valid_d, // ib2 buffer valid
output lsu_pkt_t lsu_p, // lsu packet
output mul_pkt_t mul_p, // mul packet
output div_pkt_t div_p, // div packet
2020-02-20 10:25:04 +08:00
2019-06-04 22:57:48 +08:00
output logic [11:0] dec_lsu_offset_d, // 12b offset for load/store addresses
output logic dec_i0_lsu_d, // is load/store
output logic dec_i1_lsu_d,
2020-02-20 10:25:04 +08:00
2019-06-04 22:57:48 +08:00
output logic flush_final_e3, // final flush
output logic i0_flush_final_e3, // final flush from i0
2020-02-20 10:25:04 +08:00
output logic dec_csr_ren_d, // csr read enable
2019-06-04 22:57:48 +08:00
output logic dec_tlu_cancel_e4, // Cancel lsu op at DC4 due to future trigger hit
output logic dec_tlu_flush_lower_wb, // tlu flush due to late mp, exception, rfpc, or int
output logic [31:1] dec_tlu_flush_path_wb, // tlu flush target
2020-02-20 10:25:04 +08:00
output logic dec_tlu_i0_kill_writeb_wb, // I0 is flushed, don't writeback any results to arch state
output logic dec_tlu_i1_kill_writeb_wb, // I1 is flushed, don't writeback any results to arch state
2019-06-04 22:57:48 +08:00
output logic dec_tlu_fence_i_wb, // flush is a fence_i rfnpc, flush icache
output logic dec_i0_mul_d, // chose which gpr value to use
output logic dec_i1_mul_d,
output logic dec_i0_div_d, // chose which gpr value to use
output logic dec_i1_div_d,
output logic dec_i1_valid_e1, // i1 valid at e1 stage
output logic dec_div_decode_e4, // div at e4 stage
output logic [31:1] pred_correct_npc_e2, // npc if prediction is correct at e2 stage
2020-02-20 10:25:04 +08:00
2019-06-04 22:57:48 +08:00
output logic dec_i0_rs1_bypass_en_e3, // rs1 bypass enable e3
output logic dec_i0_rs2_bypass_en_e3, // rs2 bypass enable e3
2020-02-20 10:25:04 +08:00
output logic dec_i1_rs1_bypass_en_e3,
output logic dec_i1_rs2_bypass_en_e3,
output logic [31:0] i0_rs1_bypass_data_e3, // rs1 bypass data e3
2019-06-04 22:57:48 +08:00
output logic [31:0] i0_rs2_bypass_data_e3, // rs2 bypass data e3
2020-02-20 10:25:04 +08:00
output logic [31:0] i1_rs1_bypass_data_e3,
2019-06-04 22:57:48 +08:00
output logic [31:0] i1_rs2_bypass_data_e3,
output logic dec_i0_sec_decode_e3, // secondary decode e3
output logic dec_i1_sec_decode_e3,
output logic [31:1] dec_i0_pc_e3, // pc at e3
output logic [31:1] dec_i1_pc_e3,
output logic dec_i0_rs1_bypass_en_e2, // rs1 bypass enable e2
output logic dec_i0_rs2_bypass_en_e2, // rs2 bypass enable e2
output logic dec_i1_rs1_bypass_en_e2,
output logic dec_i1_rs2_bypass_en_e2,
output logic [31:0] i0_rs1_bypass_data_e2, // rs1 bypass data e2
output logic [31:0] i0_rs2_bypass_data_e2, // rs2 bypass data e2
output logic [31:0] i1_rs1_bypass_data_e2,
output logic [31:0] i1_rs2_bypass_data_e2,
output br_tlu_pkt_t dec_tlu_br0_wb_pkt, // slot 0 branch predictor update packet
output br_tlu_pkt_t dec_tlu_br1_wb_pkt, // slot 1 branch predictor update packet
output logic [1:0] dec_tlu_perfcnt0, // toggles when perf counter 0 has an event inc
output logic [1:0] dec_tlu_perfcnt1, // toggles when perf counter 1 has an event inc
output logic [1:0] dec_tlu_perfcnt2, // toggles when perf counter 2 has an event inc
output logic [1:0] dec_tlu_perfcnt3, // toggles when perf counter 3 has an event inc
output predict_pkt_t i0_predict_p_d, // prediction packet to alus
2020-02-20 10:25:04 +08:00
output predict_pkt_t i1_predict_p_d,
output logic dec_i0_lsu_decode_d, // load/store decode
2019-06-04 22:57:48 +08:00
2020-02-20 10:25:04 +08:00
output logic [31:0] i0_result_e4_eff, // alu result e4
2019-06-04 22:57:48 +08:00
output logic [31:0] i1_result_e4_eff,
output logic dec_tlu_i0_valid_e4, // slot 0 instruction is valid at e4
output logic dec_tlu_i1_valid_e4, // slot 1 instruction is valid at e4, implies i0_valid_e4
output logic [31:0] i0_result_e2, // i0 result data e2
output logic [31:0] dec_tlu_mrac_ff, // CSR for memory region control
output logic [31:1] dec_tlu_i0_pc_e4, // pc e4
2020-02-20 10:25:04 +08:00
output logic [31:1] dec_tlu_i1_pc_e4,
2019-06-04 22:57:48 +08:00
output logic [4:2] dec_i0_data_en, // clock-gate control logic
2020-02-20 10:25:04 +08:00
output logic [4:1] dec_i0_ctl_en,
2019-06-04 22:57:48 +08:00
output logic [4:2] dec_i1_data_en,
2020-02-20 10:25:04 +08:00
output logic [4:1] dec_i1_ctl_en,
2019-06-04 22:57:48 +08:00
output logic dec_nonblock_load_freeze_dc2, // lsu must freeze nonblock load due to younger dependency in pipe
input logic [15:0] ifu_i0_cinst, // 16b compressed instruction
input logic [15:0] ifu_i1_cinst,
output trace_pkt_t trace_rv_trace_pkt, // trace packet
2020-02-20 10:25:04 +08:00
2019-06-04 22:57:48 +08:00
// feature disable from mfdc
output logic dec_tlu_sideeffect_posted_disable, // disable posted writes to side-effect address
output logic dec_tlu_core_ecc_disable, // disable core ECC
output logic dec_tlu_sec_alu_disable, // disable secondary ALU
2021-01-28 01:36:43 +08:00
output logic dec_tlu_dccm_nonblock_dma_disable, // disable dma nonblock
2019-06-04 22:57:48 +08:00
output logic dec_tlu_non_blocking_disable, // disable non blocking loads
output logic dec_tlu_fast_div_disable, // disable fast divider
output logic dec_tlu_bpred_disable, // disable branch prediction
output logic dec_tlu_wb_coalescing_disable, // disable writebuffer coalescing
output logic dec_tlu_ld_miss_byp_wb_disable, // disable loads miss bypass write buffer
output logic [2:0] dec_tlu_dma_qos_prty, // DMA QoS priority coming from MFDC [18:16]
// clock gating overrides from mcgc
output logic dec_tlu_misc_clk_override, // override misc clock domain gating
output logic dec_tlu_exu_clk_override, // override exu clock domain gating
output logic dec_tlu_ifu_clk_override, // override fetch clock domain gating
output logic dec_tlu_lsu_clk_override, // override load/store clock domain gating
output logic dec_tlu_bus_clk_override, // override bus clock domain gating
output logic dec_tlu_pic_clk_override, // override PIC clock domain gating
output logic dec_tlu_dccm_clk_override, // override DCCM clock domain gating
output logic dec_tlu_icm_clk_override, // override ICCM clock domain gating
2020-02-20 10:25:04 +08:00
input logic scan_mode
2019-06-04 22:57:48 +08:00
);
localparam GPR_BANKS = 1;
localparam GPR_BANKS_LOG2 = (GPR_BANKS == 1) ? 1 : $clog2(GPR_BANKS);
logic dec_tlu_dec_clk_override; // to and from dec blocks
logic clk_override;
2020-02-20 10:25:04 +08:00
2019-08-14 03:48:48 +08:00
logic dec_ib1_valid_d;
logic dec_ib0_valid_d;
2019-06-04 22:57:48 +08:00
2019-08-14 03:48:48 +08:00
logic [1:0] dec_pmu_instr_decoded;
logic dec_pmu_decode_stall;
logic dec_pmu_presync_stall;
logic dec_pmu_postsync_stall;
2020-02-20 10:25:04 +08:00
2019-06-04 22:57:48 +08:00
logic dec_tlu_wr_pause_wb; // CSR write to pause reg is at WB.
2020-02-20 10:25:04 +08:00
2019-08-14 03:48:48 +08:00
logic dec_i0_rs1_en_d;
logic dec_i0_rs2_en_d;
2019-06-04 22:57:48 +08:00
logic dec_fence_pending; // tell TLU to stall DMA
2019-08-14 03:48:48 +08:00
logic [4:0] dec_i0_rs1_d;
logic [4:0] dec_i0_rs2_d;
2020-02-20 10:25:04 +08:00
2019-06-04 22:57:48 +08:00
2019-08-14 03:48:48 +08:00
logic dec_i1_rs1_en_d;
logic dec_i1_rs2_en_d;
2019-06-04 22:57:48 +08:00
2019-08-14 03:48:48 +08:00
logic [4:0] dec_i1_rs1_d;
logic [4:0] dec_i1_rs2_d;
2020-02-20 10:25:04 +08:00
2019-06-04 22:57:48 +08:00
logic [31:0] dec_i0_instr_d, dec_i1_instr_d;
logic dec_tlu_pipelining_disable;
logic dec_tlu_dual_issue_disable;
2020-02-20 10:25:04 +08:00
2019-08-14 03:48:48 +08:00
logic [4:0] dec_i0_waddr_wb;
logic dec_i0_wen_wb;
2019-06-04 22:57:48 +08:00
logic [31:0] dec_i0_wdata_wb;
2020-02-20 10:25:04 +08:00
2019-08-14 03:48:48 +08:00
logic [4:0] dec_i1_waddr_wb;
logic dec_i1_wen_wb;
2019-06-04 22:57:48 +08:00
logic [31:0] dec_i1_wdata_wb;
2020-02-20 10:25:04 +08:00
logic dec_csr_wen_wb; // csr write enable at wb
logic [11:0] dec_csr_rdaddr_d; // read address for csr
2019-06-04 22:57:48 +08:00
logic [11:0] dec_csr_wraddr_wb; // write address for csryes
2020-02-20 10:25:04 +08:00
2019-06-04 22:57:48 +08:00
logic [31:0] dec_csr_wrdata_wb; // csr write data at wb
logic [31:0] dec_csr_rddata_d; // csr read data at wb
2020-02-20 10:25:04 +08:00
logic dec_csr_legal_d; // csr indicates legal operation
2019-06-04 22:57:48 +08:00
logic dec_csr_wen_unq_d; // valid csr with write - for csr legal
2020-02-20 10:25:04 +08:00
logic dec_csr_any_unq_d; // valid csr - for csr legal
2019-06-04 22:57:48 +08:00
logic dec_csr_stall_int_ff; // csr is mie/mstatus
2020-02-20 10:25:04 +08:00
2019-06-04 22:57:48 +08:00
trap_pkt_t dec_tlu_packet_e4;
2020-02-20 10:25:04 +08:00
2019-08-14 03:48:48 +08:00
logic dec_i0_pc4_d, dec_i1_pc4_d;
logic dec_tlu_presync_d;
logic dec_tlu_postsync_d;
logic dec_tlu_debug_stall;
2019-06-04 22:57:48 +08:00
logic [31:0] dec_illegal_inst;
2020-02-20 10:25:04 +08:00
2019-06-04 22:57:48 +08:00
// GPR Bank ID write signals
logic wen_bank_id;
logic [GPR_BANKS_LOG2-1:0] wr_bank_id;
2019-08-14 03:48:48 +08:00
logic dec_i0_icaf_d;
logic dec_i1_icaf_d;
logic dec_i0_perr_d;
logic dec_i1_perr_d;
logic dec_i0_sbecc_d;
logic dec_i1_sbecc_d;
logic dec_i0_dbecc_d;
logic dec_i1_dbecc_d;
2019-06-04 22:57:48 +08:00
2020-09-19 04:34:02 +08:00
logic dec_i0_icaf_second_d;
2019-06-04 22:57:48 +08:00
2019-08-14 03:48:48 +08:00
logic dec_i0_decode_d;
logic dec_i1_decode_d;
2020-02-20 10:25:04 +08:00
2019-08-14 03:48:48 +08:00
logic [3:0] dec_i0_trigger_match_d;
logic [3:0] dec_i1_trigger_match_d;
2019-06-04 22:57:48 +08:00
2020-02-20 10:25:04 +08:00
2019-08-14 03:48:48 +08:00
logic dec_debug_fence_d;
2019-06-04 22:57:48 +08:00
2019-08-14 03:48:48 +08:00
logic dec_nonblock_load_wen;
logic [4:0] dec_nonblock_load_waddr;
logic dec_tlu_flush_pause_wb;
2019-06-04 22:57:48 +08:00
2019-08-14 03:48:48 +08:00
logic dec_i0_load_e4;
2019-06-04 22:57:48 +08:00
2019-08-14 03:48:48 +08:00
logic dec_pause_state;
2020-02-20 10:25:04 +08:00
2019-06-04 22:57:48 +08:00
br_pkt_t dec_i0_brp;
br_pkt_t dec_i1_brp;
2020-02-20 10:25:04 +08:00
2019-06-04 22:57:48 +08:00
assign clk_override = dec_tlu_dec_clk_override;
assign dec_dbg_rddata[31:0] = dec_i0_wdata_wb[31:0];
2020-02-20 10:25:04 +08:00
2019-06-04 22:57:48 +08:00
// Temp hookups
assign wen_bank_id = '0;
assign wr_bank_id = '0;
2020-02-20 10:25:04 +08:00
2019-06-04 22:57:48 +08:00
dec_gpr_ctl #(.GPR_BANKS(GPR_BANKS),
.GPR_BANKS_LOG2(GPR_BANKS_LOG2)) arf (.*,
2019-08-14 03:48:48 +08:00
// inputs
2019-06-04 22:57:48 +08:00
.raddr0(dec_i0_rs1_d[4:0]), .rden0(dec_i0_rs1_en_d),
.raddr1(dec_i0_rs2_d[4:0]), .rden1(dec_i0_rs2_en_d),
.raddr2(dec_i1_rs1_d[4:0]), .rden2(dec_i1_rs1_en_d),
.raddr3(dec_i1_rs2_d[4:0]), .rden3(dec_i1_rs2_en_d),
2020-02-20 10:25:04 +08:00
2019-08-14 03:48:48 +08:00
.waddr0(dec_i0_waddr_wb[4:0]), .wen0(dec_i0_wen_wb), .wd0(dec_i0_wdata_wb[31:0]),
2020-02-20 10:25:04 +08:00
.waddr1(dec_i1_waddr_wb[4:0]), .wen1(dec_i1_wen_wb), .wd1(dec_i1_wdata_wb[31:0]),
.waddr2(dec_nonblock_load_waddr[4:0]), .wen2(dec_nonblock_load_wen), .wd2(lsu_nonblock_load_data[31:0]),
2019-08-14 03:48:48 +08:00
// outputs
2019-06-04 22:57:48 +08:00
.rd0(gpr_i0_rs1_d[31:0]), .rd1(gpr_i0_rs2_d[31:0]),
2020-02-20 10:25:04 +08:00
.rd2(gpr_i1_rs1_d[31:0]), .rd3(gpr_i1_rs2_d[31:0])
2019-08-14 03:48:48 +08:00
);
2020-02-20 10:25:04 +08:00
2019-06-04 22:57:48 +08:00
// Trigger
2020-02-20 10:25:04 +08:00
2019-06-04 22:57:48 +08:00
dec_trigger dec_trigger (.*);
2020-02-20 10:25:04 +08:00
2019-06-04 22:57:48 +08:00
// trace
logic [15:0] dec_i0_cinst_d;
logic [15:0] dec_i1_cinst_d;
2019-08-14 03:48:48 +08:00
logic [31:0] dec_i0_inst_wb1;
logic [31:0] dec_i1_inst_wb1;
logic [31:1] dec_i0_pc_wb1;
logic [31:1] dec_i1_pc_wb1;
2019-06-04 22:57:48 +08:00
logic dec_tlu_i1_valid_wb1, dec_tlu_i0_valid_wb1, dec_tlu_int_valid_wb1;
logic [4:0] dec_tlu_exc_cause_wb1;
logic [31:0] dec_tlu_mtval_wb1;
2019-08-14 03:48:48 +08:00
logic dec_tlu_i0_exc_valid_wb1, dec_tlu_i1_exc_valid_wb1;
2019-06-04 22:57:48 +08:00
// also need retires_p==3
2020-02-20 10:25:04 +08:00
2019-06-04 22:57:48 +08:00
assign trace_rv_trace_pkt.trace_rv_i_insn_ip = { 32'b0, dec_i1_inst_wb1[31:0], dec_i0_inst_wb1[31:0] };
assign trace_rv_trace_pkt.trace_rv_i_address_ip = { 32'b0, dec_i1_pc_wb1[31:1], 1'b0, dec_i0_pc_wb1[31:1], 1'b0 };
assign trace_rv_trace_pkt.trace_rv_i_valid_ip = {dec_tlu_int_valid_wb1, // always int
2019-08-14 03:48:48 +08:00
dec_tlu_i1_valid_wb1 | dec_tlu_i1_exc_valid_wb1, // not interrupts
dec_tlu_i0_valid_wb1 | dec_tlu_i0_exc_valid_wb1
};
2019-06-04 22:57:48 +08:00
assign trace_rv_trace_pkt.trace_rv_i_exception_ip = {dec_tlu_int_valid_wb1, dec_tlu_i1_exc_valid_wb1, dec_tlu_i0_exc_valid_wb1};
assign trace_rv_trace_pkt.trace_rv_i_ecause_ip = dec_tlu_exc_cause_wb1[4:0]; // replicate across ports
assign trace_rv_trace_pkt.trace_rv_i_interrupt_ip = {dec_tlu_int_valid_wb1,2'b0};
assign trace_rv_trace_pkt.trace_rv_i_tval_ip = dec_tlu_mtval_wb1[31:0]; // replicate across ports
dec_ib_ctl instbuff (.*
);
dec_decode_ctl decode (.*);
dec_tlu_ctl tlu (.*);
2020-02-20 10:25:04 +08:00
2019-06-04 22:57:48 +08:00
// end trace
2020-02-20 10:25:04 +08:00
2019-06-04 22:57:48 +08:00
endmodule // dec