| module ibex_core ( |
| clk_i, |
| rst_ni, |
| hart_id_i, |
| boot_addr_i, |
| instr_req_o, |
| instr_gnt_i, |
| instr_rvalid_i, |
| instr_addr_o, |
| instr_rdata_i, |
| instr_err_i, |
| data_req_o, |
| data_gnt_i, |
| data_rvalid_i, |
| data_we_o, |
| data_be_o, |
| data_addr_o, |
| data_wdata_o, |
| data_rdata_i, |
| data_err_i, |
| dummy_instr_id_o, |
| rf_raddr_a_o, |
| rf_raddr_b_o, |
| rf_waddr_wb_o, |
| rf_we_wb_o, |
| rf_wdata_wb_ecc_o, |
| rf_rdata_a_ecc_i, |
| rf_rdata_b_ecc_i, |
| ic_tag_req_o, |
| ic_tag_write_o, |
| ic_tag_addr_o, |
| ic_tag_wdata_o, |
| ic_tag_rdata_i, |
| ic_data_req_o, |
| ic_data_write_o, |
| ic_data_addr_o, |
| ic_data_wdata_o, |
| ic_data_rdata_i, |
| eFPGA_operand_a_o, |
| eFPGA_operand_b_o, |
| eFPGA_result_a_i, |
| eFPGA_result_b_i, |
| eFPGA_result_c_i, |
| eFPGA_write_strobe_o, |
| eFPGA_fpga_done_i, |
| eFPGA_en_o, |
| eFPGA_operator_o, |
| eFPGA_delay_o, |
| irq_software_i, |
| irq_timer_i, |
| irq_external_i, |
| irq_fast_i, |
| irq_nm_i, |
| irq_pending_o, |
| debug_req_i, |
| crash_dump_o, |
| fetch_enable_i, |
| alert_minor_o, |
| alert_major_o, |
| core_busy_o |
| ); |
| parameter [0:0] PMPEnable = 1'b0; |
| parameter [31:0] PMPGranularity = 0; |
| parameter [31:0] PMPNumRegions = 4; |
| parameter [31:0] MHPMCounterNum = 0; |
| parameter [31:0] MHPMCounterWidth = 40; |
| parameter [0:0] RV32E = 1'b0; |
| parameter integer RV32M = 32'sd2; |
| parameter integer RV32B = 32'sd0; |
| parameter integer RV32Zk = 32'sd0; |
| parameter [0:0] BranchTargetALU = 1'b0; |
| parameter [0:0] WritebackStage = 1'b0; |
| parameter [0:0] ICache = 1'b0; |
| parameter [0:0] ICacheECC = 1'b0; |
| localparam [31:0] ibex_pkg_BUS_SIZE = 32; |
| parameter [31:0] BusSizeECC = ibex_pkg_BUS_SIZE; |
| localparam [31:0] ibex_pkg_ADDR_W = 32; |
| localparam [31:0] ibex_pkg_IC_LINE_SIZE = 64; |
| localparam [31:0] ibex_pkg_IC_LINE_BYTES = 8; |
| localparam [31:0] ibex_pkg_IC_NUM_WAYS = 2; |
| localparam [31:0] ibex_pkg_IC_SIZE_BYTES = 4096; |
| localparam [31:0] ibex_pkg_IC_NUM_LINES = (ibex_pkg_IC_SIZE_BYTES / ibex_pkg_IC_NUM_WAYS) / ibex_pkg_IC_LINE_BYTES; |
| localparam [31:0] ibex_pkg_IC_INDEX_W = $clog2(ibex_pkg_IC_NUM_LINES); |
| localparam [31:0] ibex_pkg_IC_LINE_W = 3; |
| localparam [31:0] ibex_pkg_IC_TAG_SIZE = ((ibex_pkg_ADDR_W - ibex_pkg_IC_INDEX_W) - ibex_pkg_IC_LINE_W) + 1; |
| parameter [31:0] TagSizeECC = ibex_pkg_IC_TAG_SIZE; |
| parameter [31:0] LineSizeECC = ibex_pkg_IC_LINE_SIZE; |
| parameter [0:0] BranchPredictor = 1'b0; |
| parameter [0:0] DbgTriggerEn = 1'b0; |
| parameter [31:0] DbgHwBreakNum = 1; |
| parameter [0:0] ResetAll = 1'b0; |
| localparam signed [31:0] ibex_pkg_LfsrWidth = 32; |
| localparam [31:0] ibex_pkg_RndCnstLfsrSeedDefault = 32'hac533bf4; |
| parameter [31:0] RndCnstLfsrSeed = ibex_pkg_RndCnstLfsrSeedDefault; |
| localparam [159:0] ibex_pkg_RndCnstLfsrPermDefault = 160'h1e35ecba467fd1b12e958152c04fa43878a8daed; |
| parameter [159:0] RndCnstLfsrPerm = ibex_pkg_RndCnstLfsrPermDefault; |
| parameter [0:0] SecureIbex = 1'b0; |
| parameter [0:0] DummyInstructions = 1'b0; |
| parameter [0:0] RegFileECC = 1'b0; |
| parameter [31:0] RegFileDataWidth = 32; |
| parameter [31:0] DmHaltAddr = 32'h1a110800; |
| parameter [31:0] DmExceptionAddr = 32'h1a110808; |
| input wire clk_i; |
| input wire rst_ni; |
| input wire [31:0] hart_id_i; |
| input wire [31:0] boot_addr_i; |
| output wire instr_req_o; |
| input wire instr_gnt_i; |
| input wire instr_rvalid_i; |
| output wire [31:0] instr_addr_o; |
| input wire [31:0] instr_rdata_i; |
| input wire instr_err_i; |
| output wire data_req_o; |
| input wire data_gnt_i; |
| input wire data_rvalid_i; |
| output wire data_we_o; |
| output wire [3:0] data_be_o; |
| output wire [31:0] data_addr_o; |
| output wire [31:0] data_wdata_o; |
| input wire [31:0] data_rdata_i; |
| input wire data_err_i; |
| output wire dummy_instr_id_o; |
| output wire [4:0] rf_raddr_a_o; |
| output wire [4:0] rf_raddr_b_o; |
| output wire [4:0] rf_waddr_wb_o; |
| output wire rf_we_wb_o; |
| output wire [RegFileDataWidth - 1:0] rf_wdata_wb_ecc_o; |
| input wire [RegFileDataWidth - 1:0] rf_rdata_a_ecc_i; |
| input wire [RegFileDataWidth - 1:0] rf_rdata_b_ecc_i; |
| output wire [1:0] ic_tag_req_o; |
| output wire ic_tag_write_o; |
| output wire [ibex_pkg_IC_INDEX_W - 1:0] ic_tag_addr_o; |
| output wire [TagSizeECC - 1:0] ic_tag_wdata_o; |
| input wire [(ibex_pkg_IC_NUM_WAYS * TagSizeECC) - 1:0] ic_tag_rdata_i; |
| output wire [1:0] ic_data_req_o; |
| output wire ic_data_write_o; |
| output wire [ibex_pkg_IC_INDEX_W - 1:0] ic_data_addr_o; |
| output wire [LineSizeECC - 1:0] ic_data_wdata_o; |
| input wire [(ibex_pkg_IC_NUM_WAYS * LineSizeECC) - 1:0] ic_data_rdata_i; |
| output wire [31:0] eFPGA_operand_a_o; |
| output wire [31:0] eFPGA_operand_b_o; |
| input wire [31:0] eFPGA_result_a_i; |
| input wire [31:0] eFPGA_result_b_i; |
| input wire [31:0] eFPGA_result_c_i; |
| output wire eFPGA_write_strobe_o; |
| input wire eFPGA_fpga_done_i; |
| output wire eFPGA_en_o; |
| output wire [1:0] eFPGA_operator_o; |
| output wire [3:0] eFPGA_delay_o; |
| input wire irq_software_i; |
| input wire irq_timer_i; |
| input wire irq_external_i; |
| input wire [14:0] irq_fast_i; |
| input wire irq_nm_i; |
| output wire irq_pending_o; |
| input wire debug_req_i; |
| output wire [127:0] crash_dump_o; |
| input wire fetch_enable_i; |
| output wire alert_minor_o; |
| output wire alert_major_o; |
| output wire core_busy_o; |
| localparam [31:0] PMP_NUM_CHAN = 2; |
| localparam [0:0] DataIndTiming = SecureIbex; |
| localparam [0:0] PCIncrCheck = SecureIbex; |
| localparam [0:0] ShadowCSR = 1'b0; |
| localparam [0:0] SpecBranch = PMPEnable & (PMPNumRegions == 16); |
| wire dummy_instr_id; |
| wire instr_valid_id; |
| wire instr_new_id; |
| wire [31:0] instr_rdata_id; |
| wire [31:0] instr_rdata_alu_id; |
| wire [15:0] instr_rdata_c_id; |
| wire instr_is_compressed_id; |
| wire instr_perf_count_id; |
| wire instr_bp_taken_id; |
| wire instr_fetch_err; |
| wire instr_fetch_err_plus2; |
| wire illegal_c_insn_id; |
| wire [31:0] pc_if; |
| wire [31:0] pc_id; |
| wire [31:0] pc_wb; |
| wire [67:0] imd_val_d_ex; |
| wire [67:0] imd_val_q_ex; |
| wire [1:0] imd_val_we_ex; |
| wire data_ind_timing; |
| wire dummy_instr_en; |
| wire [2:0] dummy_instr_mask; |
| wire dummy_instr_seed_en; |
| wire [31:0] dummy_instr_seed; |
| wire icache_enable; |
| wire icache_inval; |
| wire pc_mismatch_alert; |
| wire csr_shadow_err; |
| wire instr_first_cycle_id; |
| wire instr_valid_clear; |
| wire pc_set; |
| wire pc_set_spec; |
| wire nt_branch_mispredict; |
| wire [31:0] nt_branch_addr; |
| wire [2:0] pc_mux_id; |
| wire [1:0] exc_pc_mux_id; |
| wire [5:0] exc_cause; |
| wire lsu_load_err; |
| wire lsu_store_err; |
| wire lsu_addr_incr_req; |
| wire [31:0] lsu_addr_last; |
| wire [31:0] branch_target_ex; |
| wire branch_decision; |
| wire ctrl_busy; |
| wire if_busy; |
| wire lsu_busy; |
| wire [4:0] rf_raddr_a; |
| wire [31:0] rf_rdata_a; |
| wire [4:0] rf_raddr_b; |
| wire [31:0] rf_rdata_b; |
| wire rf_ren_a; |
| wire rf_ren_b; |
| wire [4:0] rf_waddr_wb; |
| wire [31:0] rf_wdata_wb; |
| wire [31:0] rf_wdata_fwd_wb; |
| wire [31:0] rf_wdata_lsu; |
| wire rf_we_wb; |
| wire rf_we_lsu; |
| wire rf_ecc_err_comb; |
| wire [4:0] rf_waddr_id; |
| wire [31:0] rf_wdata_id; |
| wire rf_we_id; |
| wire rf_rd_a_wb_match; |
| wire rf_rd_b_wb_match; |
| wire [6:0] alu_operator_ex; |
| wire [31:0] alu_operand_a_ex; |
| wire [31:0] alu_operand_b_ex; |
| wire [31:0] bt_a_operand; |
| wire [31:0] bt_b_operand; |
| wire [31:0] alu_adder_result_ex; |
| wire [31:0] result_ex; |
| wire mult_en_ex; |
| wire div_en_ex; |
| wire mult_sel_ex; |
| wire div_sel_ex; |
| wire [1:0] multdiv_operator_ex; |
| wire [1:0] multdiv_signed_mode_ex; |
| wire [31:0] multdiv_operand_a_ex; |
| wire [31:0] multdiv_operand_b_ex; |
| wire multdiv_ready_id; |
| wire csr_access; |
| wire [1:0] csr_op; |
| wire csr_op_en; |
| wire [11:0] csr_addr; |
| wire [31:0] csr_rdata; |
| wire [31:0] csr_wdata; |
| wire illegal_csr_insn_id; |
| wire lsu_we; |
| wire [1:0] lsu_type; |
| wire lsu_sign_ext; |
| wire lsu_req; |
| wire [31:0] lsu_wdata; |
| wire lsu_req_done; |
| wire id_in_ready; |
| wire ex_valid; |
| wire lsu_resp_valid; |
| wire lsu_resp_err; |
| wire instr_req_int; |
| wire instr_req_gated; |
| wire en_wb; |
| wire [1:0] instr_type_wb; |
| wire ready_wb; |
| wire rf_write_wb; |
| wire outstanding_load_wb; |
| wire outstanding_store_wb; |
| wire nmi_mode; |
| wire [17:0] irqs; |
| wire csr_mstatus_mie; |
| wire [31:0] csr_mepc; |
| wire [31:0] csr_depc; |
| wire [(PMPNumRegions * 34) - 1:0] csr_pmp_addr; |
| wire [(PMPNumRegions * 6) - 1:0] csr_pmp_cfg; |
| wire [2:0] csr_pmp_mseccfg; |
| wire pmp_req_err [0:1]; |
| wire instr_req_out; |
| wire data_req_out; |
| wire csr_save_if; |
| wire csr_save_id; |
| wire csr_save_wb; |
| wire csr_restore_mret_id; |
| wire csr_restore_dret_id; |
| wire csr_save_cause; |
| wire csr_mtvec_init; |
| wire [31:0] csr_mtvec; |
| wire [31:0] csr_mtval; |
| wire csr_mstatus_tw; |
| wire [1:0] priv_mode_id; |
| wire [1:0] priv_mode_if; |
| wire [1:0] priv_mode_lsu; |
| wire debug_mode; |
| wire [2:0] debug_cause; |
| wire debug_csr_save; |
| wire debug_single_step; |
| wire debug_ebreakm; |
| wire debug_ebreaku; |
| wire trigger_match; |
| wire instr_id_done; |
| wire instr_done_wb; |
| wire perf_instr_ret_wb; |
| wire perf_instr_ret_compressed_wb; |
| wire perf_instr_ret_wb_spec; |
| wire perf_instr_ret_compressed_wb_spec; |
| wire perf_iside_wait; |
| wire perf_dside_wait; |
| wire perf_mul_wait; |
| wire perf_div_wait; |
| wire perf_jump; |
| wire perf_branch; |
| wire perf_tbranch; |
| wire perf_load; |
| wire perf_store; |
| wire illegal_insn_id; |
| wire unused_illegal_insn_id; |
| assign core_busy_o = (ctrl_busy | if_busy) | lsu_busy; |
| localparam [31:0] ibex_pkg_PMP_I = 0; |
| ibex_if_stage #( |
| .DmHaltAddr(DmHaltAddr), |
| .DmExceptionAddr(DmExceptionAddr), |
| .DummyInstructions(DummyInstructions), |
| .ICache(ICache), |
| .ICacheECC(ICacheECC), |
| .BusSizeECC(BusSizeECC), |
| .TagSizeECC(TagSizeECC), |
| .LineSizeECC(LineSizeECC), |
| .PCIncrCheck(PCIncrCheck), |
| .ResetAll(ResetAll), |
| .RndCnstLfsrSeed(RndCnstLfsrSeed), |
| .RndCnstLfsrPerm(RndCnstLfsrPerm), |
| .BranchPredictor(BranchPredictor) |
| ) if_stage_i( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .boot_addr_i(boot_addr_i), |
| .req_i(instr_req_gated), |
| .instr_req_o(instr_req_out), |
| .instr_addr_o(instr_addr_o), |
| .instr_gnt_i(instr_gnt_i), |
| .instr_rvalid_i(instr_rvalid_i), |
| .instr_rdata_i(instr_rdata_i), |
| .instr_err_i(instr_err_i), |
| .instr_pmp_err_i(pmp_req_err[ibex_pkg_PMP_I]), |
| .ic_tag_req_o(ic_tag_req_o), |
| .ic_tag_write_o(ic_tag_write_o), |
| .ic_tag_addr_o(ic_tag_addr_o), |
| .ic_tag_wdata_o(ic_tag_wdata_o), |
| .ic_tag_rdata_i(ic_tag_rdata_i), |
| .ic_data_req_o(ic_data_req_o), |
| .ic_data_write_o(ic_data_write_o), |
| .ic_data_addr_o(ic_data_addr_o), |
| .ic_data_wdata_o(ic_data_wdata_o), |
| .ic_data_rdata_i(ic_data_rdata_i), |
| .instr_valid_id_o(instr_valid_id), |
| .instr_new_id_o(instr_new_id), |
| .instr_rdata_id_o(instr_rdata_id), |
| .instr_rdata_alu_id_o(instr_rdata_alu_id), |
| .instr_rdata_c_id_o(instr_rdata_c_id), |
| .instr_is_compressed_id_o(instr_is_compressed_id), |
| .instr_bp_taken_o(instr_bp_taken_id), |
| .instr_fetch_err_o(instr_fetch_err), |
| .instr_fetch_err_plus2_o(instr_fetch_err_plus2), |
| .illegal_c_insn_id_o(illegal_c_insn_id), |
| .dummy_instr_id_o(dummy_instr_id), |
| .pc_if_o(pc_if), |
| .pc_id_o(pc_id), |
| .instr_valid_clear_i(instr_valid_clear), |
| .pc_set_i(pc_set), |
| .pc_set_spec_i(pc_set_spec), |
| .pc_mux_i(pc_mux_id), |
| .nt_branch_mispredict_i(nt_branch_mispredict), |
| .exc_pc_mux_i(exc_pc_mux_id), |
| .exc_cause(exc_cause), |
| .dummy_instr_en_i(dummy_instr_en), |
| .dummy_instr_mask_i(dummy_instr_mask), |
| .dummy_instr_seed_en_i(dummy_instr_seed_en), |
| .dummy_instr_seed_i(dummy_instr_seed), |
| .icache_enable_i(icache_enable), |
| .icache_inval_i(icache_inval), |
| .branch_target_ex_i(branch_target_ex), |
| .nt_branch_addr_i(nt_branch_addr), |
| .csr_mepc_i(csr_mepc), |
| .csr_depc_i(csr_depc), |
| .csr_mtvec_i(csr_mtvec), |
| .csr_mtvec_init_o(csr_mtvec_init), |
| .id_in_ready_i(id_in_ready), |
| .pc_mismatch_alert_o(pc_mismatch_alert), |
| .if_busy_o(if_busy) |
| ); |
| assign perf_iside_wait = id_in_ready & ~instr_valid_id; |
| assign instr_req_o = instr_req_out & ~pmp_req_err[ibex_pkg_PMP_I]; |
| assign instr_req_gated = instr_req_int & fetch_enable_i; |
| wire eFPGA_en; |
| wire [1:0] eFPGA_operator; |
| wire [3:0] eFPGA_delay; |
| assign eFPGA_en_o = eFPGA_en; |
| assign eFPGA_operator_o = eFPGA_operator; |
| assign eFPGA_delay_o = eFPGA_delay; |
| ibex_id_stage #( |
| .RV32E(RV32E), |
| .RV32M(RV32M), |
| .RV32B(RV32B), |
| .RV32Zk(RV32Zk), |
| .BranchTargetALU(BranchTargetALU), |
| .DataIndTiming(DataIndTiming), |
| .SpecBranch(SpecBranch), |
| .WritebackStage(WritebackStage), |
| .BranchPredictor(BranchPredictor) |
| ) id_stage_i( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .ctrl_busy_o(ctrl_busy), |
| .illegal_insn_o(illegal_insn_id), |
| .instr_valid_i(instr_valid_id), |
| .instr_rdata_i(instr_rdata_id), |
| .instr_rdata_alu_i(instr_rdata_alu_id), |
| .instr_rdata_c_i(instr_rdata_c_id), |
| .instr_is_compressed_i(instr_is_compressed_id), |
| .instr_bp_taken_i(instr_bp_taken_id), |
| .branch_decision_i(branch_decision), |
| .instr_first_cycle_id_o(instr_first_cycle_id), |
| .instr_valid_clear_o(instr_valid_clear), |
| .id_in_ready_o(id_in_ready), |
| .instr_req_o(instr_req_int), |
| .pc_set_o(pc_set), |
| .pc_set_spec_o(pc_set_spec), |
| .pc_mux_o(pc_mux_id), |
| .nt_branch_mispredict_o(nt_branch_mispredict), |
| .nt_branch_addr_o(nt_branch_addr), |
| .exc_pc_mux_o(exc_pc_mux_id), |
| .exc_cause_o(exc_cause), |
| .icache_inval_o(icache_inval), |
| .instr_fetch_err_i(instr_fetch_err), |
| .instr_fetch_err_plus2_i(instr_fetch_err_plus2), |
| .illegal_c_insn_i(illegal_c_insn_id), |
| .pc_id_i(pc_id), |
| .ex_valid_i(ex_valid), |
| .lsu_resp_valid_i(lsu_resp_valid), |
| .alu_operator_ex_o(alu_operator_ex), |
| .alu_operand_a_ex_o(alu_operand_a_ex), |
| .alu_operand_b_ex_o(alu_operand_b_ex), |
| .imd_val_q_ex_o(imd_val_q_ex), |
| .imd_val_d_ex_i(imd_val_d_ex), |
| .imd_val_we_ex_i(imd_val_we_ex), |
| .bt_a_operand_o(bt_a_operand), |
| .bt_b_operand_o(bt_b_operand), |
| .mult_en_ex_o(mult_en_ex), |
| .div_en_ex_o(div_en_ex), |
| .mult_sel_ex_o(mult_sel_ex), |
| .div_sel_ex_o(div_sel_ex), |
| .multdiv_operator_ex_o(multdiv_operator_ex), |
| .multdiv_signed_mode_ex_o(multdiv_signed_mode_ex), |
| .multdiv_operand_a_ex_o(multdiv_operand_a_ex), |
| .multdiv_operand_b_ex_o(multdiv_operand_b_ex), |
| .multdiv_ready_id_o(multdiv_ready_id), |
| .csr_access_o(csr_access), |
| .csr_op_o(csr_op), |
| .csr_op_en_o(csr_op_en), |
| .csr_save_if_o(csr_save_if), |
| .csr_save_id_o(csr_save_id), |
| .csr_save_wb_o(csr_save_wb), |
| .csr_restore_mret_id_o(csr_restore_mret_id), |
| .csr_restore_dret_id_o(csr_restore_dret_id), |
| .csr_save_cause_o(csr_save_cause), |
| .csr_mtval_o(csr_mtval), |
| .priv_mode_i(priv_mode_id), |
| .csr_mstatus_tw_i(csr_mstatus_tw), |
| .illegal_csr_insn_i(illegal_csr_insn_id), |
| .data_ind_timing_i(data_ind_timing), |
| .eFPGA_en_o(eFPGA_en), |
| .eFPGA_operator_o(eFPGA_operator), |
| .eFPGA_operand_a_o(eFPGA_operand_a_o), |
| .eFPGA_operand_b_o(eFPGA_operand_b_o), |
| .eFPGA_delay_o(eFPGA_delay), |
| .lsu_req_o(lsu_req), |
| .lsu_we_o(lsu_we), |
| .lsu_type_o(lsu_type), |
| .lsu_sign_ext_o(lsu_sign_ext), |
| .lsu_wdata_o(lsu_wdata), |
| .lsu_req_done_i(lsu_req_done), |
| .lsu_addr_incr_req_i(lsu_addr_incr_req), |
| .lsu_addr_last_i(lsu_addr_last), |
| .lsu_load_err_i(lsu_load_err), |
| .lsu_store_err_i(lsu_store_err), |
| .csr_mstatus_mie_i(csr_mstatus_mie), |
| .irq_pending_i(irq_pending_o), |
| .irqs_i(irqs), |
| .irq_nm_i(irq_nm_i), |
| .nmi_mode_o(nmi_mode), |
| .debug_mode_o(debug_mode), |
| .debug_cause_o(debug_cause), |
| .debug_csr_save_o(debug_csr_save), |
| .debug_req_i(debug_req_i), |
| .debug_single_step_i(debug_single_step), |
| .debug_ebreakm_i(debug_ebreakm), |
| .debug_ebreaku_i(debug_ebreaku), |
| .trigger_match_i(trigger_match), |
| .result_ex_i(result_ex), |
| .csr_rdata_i(csr_rdata), |
| .rf_raddr_a_o(rf_raddr_a), |
| .rf_rdata_a_i(rf_rdata_a), |
| .rf_raddr_b_o(rf_raddr_b), |
| .rf_rdata_b_i(rf_rdata_b), |
| .rf_ren_a_o(rf_ren_a), |
| .rf_ren_b_o(rf_ren_b), |
| .rf_waddr_id_o(rf_waddr_id), |
| .rf_wdata_id_o(rf_wdata_id), |
| .rf_we_id_o(rf_we_id), |
| .rf_rd_a_wb_match_o(rf_rd_a_wb_match), |
| .rf_rd_b_wb_match_o(rf_rd_b_wb_match), |
| .rf_waddr_wb_i(rf_waddr_wb), |
| .rf_wdata_fwd_wb_i(rf_wdata_fwd_wb), |
| .rf_write_wb_i(rf_write_wb), |
| .en_wb_o(en_wb), |
| .instr_type_wb_o(instr_type_wb), |
| .instr_perf_count_id_o(instr_perf_count_id), |
| .ready_wb_i(ready_wb), |
| .outstanding_load_wb_i(outstanding_load_wb), |
| .outstanding_store_wb_i(outstanding_store_wb), |
| .perf_jump_o(perf_jump), |
| .perf_branch_o(perf_branch), |
| .perf_tbranch_o(perf_tbranch), |
| .perf_dside_wait_o(perf_dside_wait), |
| .perf_mul_wait_o(perf_mul_wait), |
| .perf_div_wait_o(perf_div_wait), |
| .instr_id_done_o(instr_id_done) |
| ); |
| assign unused_illegal_insn_id = illegal_insn_id; |
| ibex_ex_block #( |
| .RV32M(RV32M), |
| .RV32B(RV32B), |
| .RV32Zk(RV32Zk), |
| .BranchTargetALU(BranchTargetALU) |
| ) ex_block_i( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .alu_operator_i(alu_operator_ex), |
| .alu_operand_a_i(alu_operand_a_ex), |
| .alu_operand_b_i(alu_operand_b_ex), |
| .alu_instr_first_cycle_i(instr_first_cycle_id), |
| .bt_a_operand_i(bt_a_operand), |
| .bt_b_operand_i(bt_b_operand), |
| .multdiv_operator_i(multdiv_operator_ex), |
| .mult_en_i(mult_en_ex), |
| .div_en_i(div_en_ex), |
| .mult_sel_i(mult_sel_ex), |
| .div_sel_i(div_sel_ex), |
| .multdiv_signed_mode_i(multdiv_signed_mode_ex), |
| .multdiv_operand_a_i(multdiv_operand_a_ex), |
| .multdiv_operand_b_i(multdiv_operand_b_ex), |
| .multdiv_ready_id_i(multdiv_ready_id), |
| .data_ind_timing_i(data_ind_timing), |
| .imd_val_we_o(imd_val_we_ex), |
| .imd_val_d_o(imd_val_d_ex), |
| .imd_val_q_i(imd_val_q_ex), |
| .eFPGA_en_i(eFPGA_en), |
| .eFPGA_operator_i(eFPGA_operator), |
| .eFPGA_fpga_done_i(eFPGA_fpga_done_i), |
| .eFPGA_result_a_i(eFPGA_result_a_i), |
| .eFPGA_result_b_i(eFPGA_result_b_i), |
| .eFPGA_result_c_i(eFPGA_result_c_i), |
| .eFPGA_delay_i(eFPGA_delay), |
| .eFPGA_write_strobe_o(eFPGA_write_strobe_o), |
| .alu_adder_result_ex_o(alu_adder_result_ex), |
| .result_ex_o(result_ex), |
| .branch_target_o(branch_target_ex), |
| .branch_decision_o(branch_decision), |
| .ex_valid_o(ex_valid) |
| ); |
| localparam [31:0] ibex_pkg_PMP_D = 1; |
| assign data_req_o = data_req_out & ~pmp_req_err[ibex_pkg_PMP_D]; |
| assign lsu_resp_err = lsu_load_err | lsu_store_err; |
| ibex_load_store_unit load_store_unit_i( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .data_req_o(data_req_out), |
| .data_gnt_i(data_gnt_i), |
| .data_rvalid_i(data_rvalid_i), |
| .data_err_i(data_err_i), |
| .data_pmp_err_i(pmp_req_err[ibex_pkg_PMP_D]), |
| .data_addr_o(data_addr_o), |
| .data_we_o(data_we_o), |
| .data_be_o(data_be_o), |
| .data_wdata_o(data_wdata_o), |
| .data_rdata_i(data_rdata_i), |
| .lsu_we_i(lsu_we), |
| .lsu_type_i(lsu_type), |
| .lsu_wdata_i(lsu_wdata), |
| .lsu_sign_ext_i(lsu_sign_ext), |
| .lsu_rdata_o(rf_wdata_lsu), |
| .lsu_rdata_valid_o(rf_we_lsu), |
| .lsu_req_i(lsu_req), |
| .lsu_req_done_o(lsu_req_done), |
| .adder_result_ex_i(alu_adder_result_ex), |
| .addr_incr_req_o(lsu_addr_incr_req), |
| .addr_last_o(lsu_addr_last), |
| .lsu_resp_valid_o(lsu_resp_valid), |
| .load_err_o(lsu_load_err), |
| .store_err_o(lsu_store_err), |
| .busy_o(lsu_busy), |
| .perf_load_o(perf_load), |
| .perf_store_o(perf_store) |
| ); |
| ibex_wb_stage #( |
| .ResetAll(ResetAll), |
| .WritebackStage(WritebackStage) |
| ) wb_stage_i( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .en_wb_i(en_wb), |
| .instr_type_wb_i(instr_type_wb), |
| .pc_id_i(pc_id), |
| .instr_is_compressed_id_i(instr_is_compressed_id), |
| .instr_perf_count_id_i(instr_perf_count_id), |
| .ready_wb_o(ready_wb), |
| .rf_write_wb_o(rf_write_wb), |
| .outstanding_load_wb_o(outstanding_load_wb), |
| .outstanding_store_wb_o(outstanding_store_wb), |
| .pc_wb_o(pc_wb), |
| .perf_instr_ret_wb_o(perf_instr_ret_wb), |
| .perf_instr_ret_compressed_wb_o(perf_instr_ret_compressed_wb), |
| .perf_instr_ret_wb_spec_o(perf_instr_ret_wb_spec), |
| .perf_instr_ret_compressed_wb_spec_o(perf_instr_ret_compressed_wb_spec), |
| .rf_waddr_id_i(rf_waddr_id), |
| .rf_wdata_id_i(rf_wdata_id), |
| .rf_we_id_i(rf_we_id), |
| .rf_wdata_lsu_i(rf_wdata_lsu), |
| .rf_we_lsu_i(rf_we_lsu), |
| .rf_wdata_fwd_wb_o(rf_wdata_fwd_wb), |
| .rf_waddr_wb_o(rf_waddr_wb), |
| .rf_wdata_wb_o(rf_wdata_wb), |
| .rf_we_wb_o(rf_we_wb), |
| .lsu_resp_valid_i(lsu_resp_valid), |
| .lsu_resp_err_i(lsu_resp_err), |
| .instr_done_wb_o(instr_done_wb) |
| ); |
| assign dummy_instr_id_o = dummy_instr_id; |
| assign rf_raddr_a_o = rf_raddr_a; |
| assign rf_waddr_wb_o = rf_waddr_wb; |
| assign rf_we_wb_o = rf_we_wb; |
| assign rf_raddr_b_o = rf_raddr_b; |
| generate |
| if (RegFileECC) begin : gen_regfile_ecc |
| wire [1:0] rf_ecc_err_a; |
| wire [1:0] rf_ecc_err_b; |
| wire rf_ecc_err_a_id; |
| wire rf_ecc_err_b_id; |
| prim_secded_39_32_enc regfile_ecc_enc( |
| .data_i(rf_wdata_wb), |
| .data_o(rf_wdata_wb_ecc_o) |
| ); |
| prim_secded_39_32_dec regfile_ecc_dec_a( |
| .data_i(rf_rdata_a_ecc_i), |
| .data_o(), |
| .syndrome_o(), |
| .err_o(rf_ecc_err_a) |
| ); |
| prim_secded_39_32_dec regfile_ecc_dec_b( |
| .data_i(rf_rdata_b_ecc_i), |
| .data_o(), |
| .syndrome_o(), |
| .err_o(rf_ecc_err_b) |
| ); |
| assign rf_rdata_a = rf_rdata_a_ecc_i[31:0]; |
| assign rf_rdata_b = rf_rdata_b_ecc_i[31:0]; |
| assign rf_ecc_err_a_id = (|rf_ecc_err_a & rf_ren_a) & ~rf_rd_a_wb_match; |
| assign rf_ecc_err_b_id = (|rf_ecc_err_b & rf_ren_b) & ~rf_rd_b_wb_match; |
| assign rf_ecc_err_comb = instr_valid_id & (rf_ecc_err_a_id | rf_ecc_err_b_id); |
| end |
| else begin : gen_no_regfile_ecc |
| wire unused_rf_ren_a; |
| wire unused_rf_ren_b; |
| wire unused_rf_rd_a_wb_match; |
| wire unused_rf_rd_b_wb_match; |
| assign unused_rf_ren_a = rf_ren_a; |
| assign unused_rf_ren_b = rf_ren_b; |
| assign unused_rf_rd_a_wb_match = rf_rd_a_wb_match; |
| assign unused_rf_rd_b_wb_match = rf_rd_b_wb_match; |
| assign rf_wdata_wb_ecc_o = rf_wdata_wb; |
| assign rf_rdata_a = rf_rdata_a_ecc_i; |
| assign rf_rdata_b = rf_rdata_b_ecc_i; |
| assign rf_ecc_err_comb = 1'b0; |
| end |
| endgenerate |
| assign crash_dump_o[127-:32] = pc_id; |
| assign crash_dump_o[95-:32] = pc_if; |
| assign crash_dump_o[63-:32] = lsu_addr_last; |
| assign crash_dump_o[31-:32] = csr_mepc; |
| assign alert_minor_o = 1'b0; |
| assign alert_major_o = (rf_ecc_err_comb | pc_mismatch_alert) | csr_shadow_err; |
| assign csr_wdata = alu_operand_a_ex; |
| function automatic [11:0] sv2v_cast_12; |
| input reg [11:0] inp; |
| sv2v_cast_12 = inp; |
| endfunction |
| assign csr_addr = sv2v_cast_12((csr_access ? alu_operand_b_ex[11:0] : 12'b000000000000)); |
| ibex_cs_registers #( |
| .DbgTriggerEn(DbgTriggerEn), |
| .DbgHwBreakNum(DbgHwBreakNum), |
| .DataIndTiming(DataIndTiming), |
| .DummyInstructions(DummyInstructions), |
| .ShadowCSR(ShadowCSR), |
| .ICache(ICache), |
| .MHPMCounterNum(MHPMCounterNum), |
| .MHPMCounterWidth(MHPMCounterWidth), |
| .PMPEnable(PMPEnable), |
| .PMPGranularity(PMPGranularity), |
| .PMPNumRegions(PMPNumRegions), |
| .RV32E(RV32E), |
| .RV32M(RV32M), |
| .RV32B(RV32B), |
| .RV32Zk(RV32Zk) |
| ) cs_registers_i( |
| .clk_i(clk_i), |
| .rst_ni(rst_ni), |
| .hart_id_i(hart_id_i), |
| .priv_mode_id_o(priv_mode_id), |
| .priv_mode_if_o(priv_mode_if), |
| .priv_mode_lsu_o(priv_mode_lsu), |
| .csr_mtvec_o(csr_mtvec), |
| .csr_mtvec_init_i(csr_mtvec_init), |
| .boot_addr_i(boot_addr_i), |
| .csr_access_i(csr_access), |
| .csr_addr_i(csr_addr), |
| .csr_wdata_i(csr_wdata), |
| .csr_op_i(csr_op), |
| .csr_op_en_i(csr_op_en), |
| .csr_rdata_o(csr_rdata), |
| .irq_software_i(irq_software_i), |
| .irq_timer_i(irq_timer_i), |
| .irq_external_i(irq_external_i), |
| .irq_fast_i(irq_fast_i), |
| .nmi_mode_i(nmi_mode), |
| .irq_pending_o(irq_pending_o), |
| .irqs_o(irqs), |
| .csr_mstatus_mie_o(csr_mstatus_mie), |
| .csr_mstatus_tw_o(csr_mstatus_tw), |
| .csr_mepc_o(csr_mepc), |
| .csr_pmp_cfg_o(csr_pmp_cfg), |
| .csr_pmp_addr_o(csr_pmp_addr), |
| .csr_pmp_mseccfg_o(csr_pmp_mseccfg), |
| .csr_depc_o(csr_depc), |
| .debug_mode_i(debug_mode), |
| .debug_cause_i(debug_cause), |
| .debug_csr_save_i(debug_csr_save), |
| .debug_single_step_o(debug_single_step), |
| .debug_ebreakm_o(debug_ebreakm), |
| .debug_ebreaku_o(debug_ebreaku), |
| .trigger_match_o(trigger_match), |
| .pc_if_i(pc_if), |
| .pc_id_i(pc_id), |
| .pc_wb_i(pc_wb), |
| .data_ind_timing_o(data_ind_timing), |
| .dummy_instr_en_o(dummy_instr_en), |
| .dummy_instr_mask_o(dummy_instr_mask), |
| .dummy_instr_seed_en_o(dummy_instr_seed_en), |
| .dummy_instr_seed_o(dummy_instr_seed), |
| .icache_enable_o(icache_enable), |
| .csr_shadow_err_o(csr_shadow_err), |
| .csr_save_if_i(csr_save_if), |
| .csr_save_id_i(csr_save_id), |
| .csr_save_wb_i(csr_save_wb), |
| .csr_restore_mret_i(csr_restore_mret_id), |
| .csr_restore_dret_i(csr_restore_dret_id), |
| .csr_save_cause_i(csr_save_cause), |
| .csr_mcause_i(exc_cause), |
| .csr_mtval_i(csr_mtval), |
| .illegal_csr_insn_o(illegal_csr_insn_id), |
| .instr_ret_i(perf_instr_ret_wb), |
| .instr_ret_compressed_i(perf_instr_ret_compressed_wb), |
| .instr_ret_spec_i(perf_instr_ret_wb_spec), |
| .instr_ret_compressed_spec_i(perf_instr_ret_compressed_wb_spec), |
| .iside_wait_i(perf_iside_wait), |
| .jump_i(perf_jump), |
| .branch_i(perf_branch), |
| .branch_taken_i(perf_tbranch), |
| .mem_load_i(perf_load), |
| .mem_store_i(perf_store), |
| .dside_wait_i(perf_dside_wait), |
| .mul_wait_i(perf_mul_wait), |
| .div_wait_i(perf_div_wait) |
| ); |
| wire [1:0] unused_priv_lvl_if; |
| wire [1:0] unused_priv_lvl_ls; |
| wire [(PMPNumRegions * 34) - 1:0] unused_csr_pmp_addr; |
| wire [(PMPNumRegions * 6) - 1:0] unused_csr_pmp_cfg; |
| wire [2:0] unused_csr_pmp_mseccfg; |
| assign unused_priv_lvl_if = priv_mode_if; |
| assign unused_priv_lvl_ls = priv_mode_lsu; |
| assign unused_csr_pmp_addr = csr_pmp_addr; |
| assign unused_csr_pmp_cfg = csr_pmp_cfg; |
| assign unused_csr_pmp_mseccfg = csr_pmp_mseccfg; |
| assign pmp_req_err[ibex_pkg_PMP_I] = 1'b0; |
| assign pmp_req_err[ibex_pkg_PMP_D] = 1'b0; |
| wire unused_instr_new_id; |
| wire unused_instr_id_done; |
| wire unused_instr_done_wb; |
| assign unused_instr_id_done = instr_id_done; |
| assign unused_instr_new_id = instr_new_id; |
| assign unused_instr_done_wb = instr_done_wb; |
| endmodule |