[source]

Module ibex_cs_registers

DbgTriggerEnDbgHwBreakNumDataIndTimingDummyInstructionsShadowCSRICacheMHPMCounterNumMHPMCounterWidthPMPEnablePMPGranularityPMPNumRegionsPMPRstCfgPMPRstAddrPMPRstMsecCfgRV32ERV32MRV32Bclk_ilogicrst_nilogichart_id_i[31:0]logiccsr_mtvec_init_ilogicboot_addr_i[31:0]logiccsr_access_ilogiccsr_addr_iibex_pkg::csr_num_ecsr_wdata_i[31:0]logiccsr_op_iibex_pkg::csr_op_ecsr_op_en_ilogicirq_software_ilogicirq_timer_ilogicirq_external_ilogicirq_fast_i[14:0]logicnmi_mode_ilogicdebug_mode_ilogicdebug_mode_entering_ilogicdebug_cause_iibex_pkg::dbg_cause_edebug_csr_save_ilogicpc_if_i[31:0]logicpc_id_i[31:0]logicpc_wb_i[31:0]logicic_scr_key_valid_ilogiccsr_save_if_ilogiccsr_save_id_ilogiccsr_save_wb_ilogiccsr_restore_mret_ilogiccsr_restore_dret_ilogiccsr_save_cause_ilogiccsr_mcause_iibex_pkg::exc_cause_tcsr_mtval_i[31:0]logicinstr_ret_ilogicinstr_ret_compressed_ilogicinstr_ret_spec_ilogicinstr_ret_compressed_spec_ilogiciside_wait_ilogicjump_ilogicbranch_ilogicbranch_taken_ilogicmem_load_ilogicmem_store_ilogicdside_wait_ilogicmul_wait_ilogicdiv_wait_ilogicpriv_mode_id_oibex_pkg::priv_lvl_epriv_mode_lsu_oibex_pkg::priv_lvl_ecsr_mstatus_tw_ologiccsr_mtvec_ologic[31:0]csr_rdata_ologic[31:0]irq_pending_ologicirqs_oibex_pkg::irqs_tcsr_mstatus_mie_ologiccsr_mepc_ologic[31:0]csr_mtval_ologic[31:0]csr_pmp_cfg_oibex_pkg::pmp_cfg_tcsr_pmp_addr_ologic[33:0]csr_pmp_mseccfg_oibex_pkg::pmp_mseccfg_tcsr_depc_ologic[31:0]debug_single_step_ologicdebug_ebreakm_ologicdebug_ebreaku_ologictrigger_match_ologicdata_ind_timing_ologicdummy_instr_en_ologicdummy_instr_mask_ologic[2:0]dummy_instr_seed_en_ologicdummy_instr_seed_ologic[31:0]icache_enable_ologiccsr_shadow_err_ologicillegal_csr_insn_ologicdouble_fault_seen_ologic

Block Diagram of ibex_cs_registers

Parameters

Name

Default

Description

DbgTriggerEn

0

DbgHwBreakNum

1

DataIndTiming

1'b0

DummyInstructions

1'b0

ShadowCSR

1'b0

ICache

1'b0

MHPMCounterNum

10

MHPMCounterWidth

40

PMPEnable

0

PMPGranularity

0

PMPNumRegions

4

PMPRstCfg

ibex_pkg::PmpCfgRst

PMPRstAddr

ibex_pkg::PmpAddrRst

PMPRstMsecCfg

ibex_pkg::PmpMseccfgRst

RV32E

0

RV32M

ibex_pkg::RV32MFast

RV32B

ibex_pkg::RV32BNone

Ports

Name

Type

Direction

Description

clk_i

wire logic

input

Clock and Reset

rst_ni

wire logic

input

hart_id_i

wire logic [31 : 0]

input

Hart ID

priv_mode_id_o

var ibex_pkg::priv_lvl_e

output

Privilege mode

priv_mode_lsu_o

var ibex_pkg::priv_lvl_e

output

csr_mstatus_tw_o

var logic

output

csr_mtvec_o

var logic [31 : 0]

output

mtvec

csr_mtvec_init_i

wire logic

input

boot_addr_i

wire logic [31 : 0]

input

csr_access_i

wire logic

input

Interface to registers (SRAM like)

csr_addr_i

wire ibex_pkg::csr_num_e

input

csr_wdata_i

wire logic [31 : 0]

input

csr_op_i

wire ibex_pkg::csr_op_e

input

csr_op_en_i

wire logic

input

csr_rdata_o

var logic [31 : 0]

output

irq_software_i

wire logic

input

interrupts

irq_timer_i

wire logic

input

irq_external_i

wire logic

input

irq_fast_i

wire logic [14 : 0]

input

nmi_mode_i

wire logic

input

irq_pending_o

var logic

output

interrupt request pending

irqs_o

var ibex_pkg::irqs_t

output

interrupt requests qualified with mie

csr_mstatus_mie_o

var logic

output

csr_mepc_o

var logic [31 : 0]

output

csr_mtval_o

var logic [31 : 0]

output

csr_pmp_cfg_o

var pmp_cfg_t

output

PMP

csr_pmp_addr_o

var logic [33 : 0]

output

csr_pmp_mseccfg_o

var ibex_pkg::pmp_mseccfg_t

output

debug_mode_i

wire logic

input

debug

debug_mode_entering_i

wire logic

input

debug_cause_i

wire ibex_pkg::dbg_cause_e

input

debug_csr_save_i

wire logic

input

csr_depc_o

var logic [31 : 0]

output

debug_single_step_o

var logic

output

debug_ebreakm_o

var logic

output

debug_ebreaku_o

var logic

output

trigger_match_o

var logic

output

pc_if_i

wire logic [31 : 0]

input

pc_id_i

wire logic [31 : 0]

input

pc_wb_i

wire logic [31 : 0]

input

data_ind_timing_o

var logic

output

CPU control and status bits

dummy_instr_en_o

var logic

output

dummy_instr_mask_o

var logic [2 : 0]

output

dummy_instr_seed_en_o

var logic

output

dummy_instr_seed_o

var logic [31 : 0]

output

icache_enable_o

var logic

output

csr_shadow_err_o

var logic

output

ic_scr_key_valid_i

wire logic

input

csr_save_if_i

wire logic

input

Exception save/restore

csr_save_id_i

wire logic

input

csr_save_wb_i

wire logic

input

csr_restore_mret_i

wire logic

input

csr_restore_dret_i

wire logic

input

csr_save_cause_i

wire logic

input

csr_mcause_i

wire ibex_pkg::exc_cause_t

input

csr_mtval_i

wire logic [31 : 0]

input

illegal_csr_insn_o

var logic

output

access to non-existent CSR,

double_fault_seen_o

var logic

output

with wrong priviledge level, or missing write permissions

instr_ret_i

wire logic

input

Performance Counters instr retired in ID/EX stage

instr_ret_compressed_i

wire logic

input

compressed instr retired

instr_ret_spec_i

wire logic

input

speculative instr_ret_i

instr_ret_compressed_spec_i

wire logic

input

speculative instr_ret_compressed_i

iside_wait_i

wire logic

input

core waiting for the iside

jump_i

wire logic

input

jump instr seen (j, jr, jal, jalr)

branch_i

wire logic

input

branch instr seen (bf, bnf)

branch_taken_i

wire logic

input

branch was taken

mem_load_i

wire logic

input

load from memory in this cycle

mem_store_i

wire logic

input

store to memory in this cycle

dside_wait_i

wire logic

input

core waiting for the dside

mul_wait_i

wire logic

input

core waiting for multiply

div_wait_i

wire logic

input

core waiting for divide

Assertions

Name

Kind

Description

ibex_cs_registers.PMPAddrRstLowBitsZero_A

immediate assert

(PMPRstAddr[i][33 - PMPAddrWidth : 0] == '0)

ibex_cs_registers.IbexCsrOpEnRequiresAccess

concurent assert

////////////// Assertions // //////////////

disable iff((!rst_ni)!=='0)(csr_op_en_i |-> csr_access_i)

Structs

typedef struct status_t
typedef struct status_stk_t
typedef struct dcsr_t
typedef struct cpu_ctrl_sts_part_t

Partial CPU control and status register fields ICache scramble key valid (ic_scr_key_valid) is registered seperately to this struct. This is because it is sampled from the top-level every cycle whilst the other fields only change occasionally.

Always Blocks

always_comb @()

read logic

always_comb @()

write logic

always_ff @(posedge clk_i or negedge rst_ni)

Update current priv level

always_comb @()

CSR operation logic

always_comb @()

update enable signals

always_comb @()

event selection (hardwired) & control

always_comb @()

event selector (hardwired, 0 means no event)

Functions

is_mml_m_exec_cfg(ibex_pkg::pmp_cfg_t pmp_cfg)

Is a PMP config a locked one that allows M-mode execution when MSECCFG.MML is set (either M mode alone or shared M/U mode execution)?

Parameters:

pmp_cfg (ibex_pkg::pmp_cfg_t)

Instances

Submodules

mcycle_counter_i (ibex_counter) minstret_counter_i (ibex_counter) u_cpuctrlsts_part_csr (ibex_csr) u_dcsr_csr (ibex_csr) u_depc_csr (ibex_csr) u_dscratch0_csr (ibex_csr) u_dscratch1_csr (ibex_csr) u_mcause_csr (ibex_csr) u_mepc_csr (ibex_csr) u_mie_csr (ibex_csr) u_mscratch_csr (ibex_csr) u_mstack_cause_csr (ibex_csr) u_mstack_csr (ibex_csr) u_mstack_epc_csr (ibex_csr) u_mstatus_csr (ibex_csr) u_mtval_csr (ibex_csr) u_mtvec_csr (ibex_csr) cs_registers_i (ibex_cs_registers)

Flow Diagram of ibex_cs_registers

mcycle_counter_i (ibex_counter) clk_i rst_ni counterh_we_i counter_we_i counter_val_i counter_val_upd_o minstret_counter_i (ibex_counter) clk_i rst_ni counterh_we_i counter_we_i counter_val_i u_cpuctrlsts_part_csr (ibex_csr) clk_i rst_ni u_dcsr_csr (ibex_csr) clk_i rst_ni rd_error_o u_depc_csr (ibex_csr) clk_i rst_ni rd_error_o u_dscratch0_csr (ibex_csr) clk_i rst_ni wr_data_i rd_error_o u_dscratch1_csr (ibex_csr) clk_i rst_ni wr_data_i rd_error_o u_mcause_csr (ibex_csr) clk_i rst_ni rd_error_o u_mepc_csr (ibex_csr) clk_i rst_ni rd_error_o u_mie_csr (ibex_csr) clk_i rst_ni rd_error_o u_mscratch_csr (ibex_csr) clk_i rst_ni wr_data_i rd_error_o u_mstack_cause_csr (ibex_csr) clk_i rst_ni wr_en_i rd_error_o u_mstack_csr (ibex_csr) clk_i rst_ni wr_en_i rd_error_o u_mstack_epc_csr (ibex_csr) clk_i rst_ni wr_en_i rd_error_o u_mstatus_csr (ibex_csr) clk_i rst_ni u_mtval_csr (ibex_csr) clk_i rst_ni rd_error_o u_mtvec_csr (ibex_csr) clk_i rst_ni g_mcountinhibit_reduced g_outputs g_rdata g_no_pmp_tieoffs gen_no_compressed_instr_cnt gen_unimp gen_cntrs gen_no_dit gen_no_dummy gen_no_icache gen_no_trigger_regs cs_registers_i (ibex_cs_registers) clk_i rst_ni

Sub-Instances Diagram of ibex_cs_registers

mcycle_counter_i (ibex_counter) clk_i rst_ni counter_inc_i counterh_we_i counter_we_i counter_val_i counter_val_o counter_val_upd_o minstret_counter_i (ibex_counter) clk_i rst_ni counter_inc_i counterh_we_i counter_we_i counter_val_i counter_val_o counter_val_upd_o u_cpuctrlsts_part_csr (ibex_csr) clk_i rst_ni wr_data_i wr_en_i rd_data_o rd_error_o u_dcsr_csr (ibex_csr) clk_i rst_ni wr_data_i wr_en_i rd_data_o rd_error_o u_depc_csr (ibex_csr) clk_i rst_ni wr_data_i wr_en_i rd_data_o rd_error_o u_dscratch0_csr (ibex_csr) clk_i rst_ni wr_data_i wr_en_i rd_data_o rd_error_o u_dscratch1_csr (ibex_csr) clk_i rst_ni wr_data_i wr_en_i rd_data_o rd_error_o u_mcause_csr (ibex_csr) clk_i rst_ni wr_data_i wr_en_i rd_data_o rd_error_o u_mepc_csr (ibex_csr) clk_i rst_ni wr_data_i wr_en_i rd_data_o rd_error_o u_mie_csr (ibex_csr) clk_i rst_ni wr_data_i wr_en_i rd_data_o rd_error_o u_mscratch_csr (ibex_csr) clk_i rst_ni wr_data_i wr_en_i rd_data_o rd_error_o u_mstack_cause_csr (ibex_csr) clk_i rst_ni wr_data_i wr_en_i rd_data_o rd_error_o u_mstack_csr (ibex_csr) clk_i rst_ni wr_data_i wr_en_i rd_data_o rd_error_o u_mstack_epc_csr (ibex_csr) clk_i rst_ni wr_data_i wr_en_i rd_data_o rd_error_o u_mstatus_csr (ibex_csr) clk_i rst_ni wr_data_i wr_en_i rd_data_o rd_error_o u_mtval_csr (ibex_csr) clk_i rst_ni wr_data_i wr_en_i rd_data_o rd_error_o u_mtvec_csr (ibex_csr) clk_i rst_ni wr_data_i wr_en_i rd_data_o rd_error_o (mhpmcounter_incr[0] & ~ mcountinhibit[0]) mhpmcounter_incr mcountinhibit (mhpmcounter_incr[2] & ~ mcountinhibit[2]) mhpmcounter_incr mcountinhibit {cpuctrlsts_part_d} cpuctrlsts_part_d {dcsr_d} dcsr_d {mcause_d} mcause_d {mie_d} mie_d {mstack_d} mstack_d {mstatus_d} mstatus_d unused_boot_addr boot_addr_i csr_addr csr_addr_i unused_csr_addr csr_addr mhpmcounter_idx csr_addr illegal_csr_dbg dbg_csr debug_mode_i illegal_csr_priv csr_addr priv_lvl_q illegal_csr_write csr_addr csr_wr illegal_csr_insn_o csr_access_i illegal_csr illegal_csr_write illegal_csr_priv illegal_csr_dbg mip.irq_software irq_software_i mip.irq_timer irq_timer_i mip.irq_external irq_external_i mip.irq_fast irq_fast_i priv_mode_id_o priv_lvl_q priv_mode_lsu_o mstatus_q.mpp mstatus_q.mprv priv_lvl_q csr_wr csr_op_i csr_we_int csr_wr csr_op_en_i illegal_csr_insn_o csr_rdata_o csr_rdata_int csr_mepc_o mepc_q csr_depc_o depc_q csr_mtvec_o mtvec_q csr_mtval_o mtval_q csr_mstatus_mie_o mstatus_q.mie csr_mstatus_tw_o mstatus_q.tw debug_single_step_o dcsr_q.step debug_ebreakm_o dcsr_q.ebreakm debug_ebreaku_o dcsr_q.ebreaku irqs_o mip mie_q irq_pending_o irqs_o mie_d.irq_software csr_wdata_int mie_d.irq_timer csr_wdata_int mie_d.irq_external csr_wdata_int mie_d.irq_fast csr_wdata_int csr_pmp_mseccfg_o pmp_mseccfg mhpmcounter minstret_next instr_ret_spec_i mcountinhibit minstret_raw mhpmcounter unused_mhpmcounter_we_1 mhpmcounter_we unused_mhpmcounterh_we_1 mhpmcounterh_we unused_mhpmcounter_incr_1 mhpmcounter_incr cpuctrlsts_part_wdata_raw csr_wdata_int data_ind_timing_o cpuctrlsts_part_q.data_ind_timing dummy_instr_en_o cpuctrlsts_part_q.dummy_instr_en dummy_instr_mask_o cpuctrlsts_part_q.dummy_instr_mask cpuctrlsts_part_wdata.double_fault_seen cpuctrlsts_part_wdata_raw.double_fault_seen cpuctrlsts_part_wdata.sync_exc_seen cpuctrlsts_part_wdata_raw.sync_exc_seen icache_enable_o cpuctrlsts_part_q.icache_enable debug_mode_i debug_mode_entering_i csr_shadow_err_o mstatus_err mtvec_err pmp_csr_err cpuctrlsts_part_err cpuctrlsts_ic_scr_key_err csr_rdata_int csr_addr_i hart_id_i mscratch_q mtvec_q mepc_q mcause_q.lower_cause mcause_q.irq_int mcause_q.irq_ext mtval_q pmp_cfg_rdata pmp_addr_rdata mcountinhibit mhpmevent mhpmcounter_idx mhpmcounter cpuctrlsts_part_q cpuctrlsts_ic_scr_key_valid_q mstatus_q.mie mstatus_q.mpie mstatus_q.mpp mstatus_q.mprv mstatus_q.tw mie_q.irq_software mie_q.irq_timer mie_q.irq_external mie_q.irq_fast mip.irq_software mip.irq_timer mip.irq_external mip.irq_fast dcsr_q depc_q dscratch0_q dscratch1_q tselect_rdata tmatch_control_rdata tmatch_value_rdata pmp_mseccfg.mml pmp_mseccfg.mmwp pmp_mseccfg.rlb illegal_csr csr_addr dbg_csr exception_pc pc_id_i pc_if_i csr_save_cause_i csr_save_if_i csr_save_id_i pc_wb_i csr_save_wb_i priv_lvl_d priv_lvl_q dcsr_q.prv csr_restore_dret_i mstatus_q.mpp csr_restore_mret_i mstatus_en csr_we_int csr_addr_i debug_csr_save_i debug_mode_i mstatus_d mstatus_q mie_en mscratch_en mepc_en nmi_mode_i mepc_d csr_wdata_int exception_pc mstack_epc_q mcause_en irq_ext irq_int lower_cause mtval_en mtval_d csr_mtval_i mtvec_en csr_mtvec_init_i dcsr_en dcsr_d dcsr_q depc_d depc_en dscratch0_en dscratch1_en mstack_en mstack_d.mpie mstatus_q.mpie mstack_d.mpp mstack_epc_d mepc_q mstack_cause_d mcause_q mcountinhibit_we mhpmcounter_we mhpmcounter_idx mhpmcounterh_we cpuctrlsts_part_we mcause_d.irq_ext mcause_d.irq_int cpuctrlsts_part_d cpuctrlsts_part_q cpuctrlsts_part_wdata double_fault_seen_o cpuctrlsts_part_q.sync_exc_seen mcause_d csr_mcause_i mstack_cause_q mtvec_d boot_addr_i mstatus_d.mie cpuctrlsts_part_d.sync_exc_seen mie mpie mpp mprv tw dcsr_d.xdebugver dcsr_d.cause dcsr_q.cause debug_cause_i dcsr_d.stepie dcsr_d.nmip dcsr_d.mprven dcsr_d.stopcount dcsr_d.stoptime dcsr_d.zero0 dcsr_d.zero1 dcsr_d.zero2 mstatus_d.mprv mstatus_d.mpp mstatus_d.mpp mstack_q.mpp dcsr_d.prv dcsr_d.prv mstatus_d.mpie mstatus_q.mie mstack_q.mpie cpuctrlsts_part_d.double_fault_seen csr_wdata_int csr_wdata_i csr_op_i csr_rdata_o mcountinhibit_d csr_wdata_int mcountinhibit_we mcountinhibit_q mhpmcounter_incr instr_ret_i dside_wait_i iside_wait_i mem_load_i mem_store_i jump_i branch_i branch_taken_i instr_ret_compressed_i mul_wait_i div_wait_i mhpmevent priv_lvl_q rst_ni clk_i priv_lvl_d mcountinhibit_q rst_ni clk_i mcountinhibit_d mcountinhibit mcountinhibit_q unused_mhphcounter_we mhpmcounter_we unused_mhphcounterh_we mhpmcounterh_we unused_mhphcounter_incr mhpmcounter_incr g_mcountinhibit_reduced pmp_csr_err pmp_mseccfg csr_pmp_cfg_o csr_pmp_addr_o g_outputs pmp_addr_rdata pmp_cfg_rdata g_rdata g_no_pmp_tieoffs mhpmcounter unused_instr_ret_compressed_spec_i instr_ret_compressed_spec_i gen_no_compressed_instr_cnt gen_unimp gen_cntrs unused_dit cpuctrlsts_part_wdata_raw.data_ind_timing cpuctrlsts_part_wdata.data_ind_timing gen_no_dit unused_dummy_en cpuctrlsts_part_wdata_raw.dummy_instr_en unused_dummy_mask cpuctrlsts_part_wdata_raw.dummy_instr_mask cpuctrlsts_part_wdata.dummy_instr_en cpuctrlsts_part_wdata.dummy_instr_mask dummy_instr_seed_en_o dummy_instr_seed_o gen_no_dummy unused_icen cpuctrlsts_part_wdata_raw.icache_enable cpuctrlsts_part_wdata.icache_enable unused_ic_scr_key_valid ic_scr_key_valid_i cpuctrlsts_ic_scr_key_valid_q cpuctrlsts_ic_scr_key_err gen_no_icache tselect_rdata tmatch_control_rdata tmatch_value_rdata trigger_match_o gen_no_trigger_regs cs_registers_i (ibex_cs_registers) clk_i rst_ni hart_id_i priv_mode_id_o priv_mode_lsu_o csr_mstatus_tw_o csr_mtvec_o csr_mtvec_init_i boot_addr_i csr_access_i csr_addr_i csr_wdata_i csr_op_i csr_op_en_i csr_rdata_o irq_software_i irq_timer_i irq_external_i irq_fast_i nmi_mode_i irq_pending_o irqs_o csr_mstatus_mie_o csr_mepc_o csr_mtval_o csr_pmp_cfg_o csr_pmp_addr_o csr_pmp_mseccfg_o debug_mode_i debug_mode_entering_i debug_cause_i debug_csr_save_i csr_depc_o debug_single_step_o debug_ebreakm_o debug_ebreaku_o trigger_match_o pc_if_i pc_id_i pc_wb_i data_ind_timing_o dummy_instr_en_o dummy_instr_mask_o dummy_instr_seed_en_o dummy_instr_seed_o icache_enable_o csr_shadow_err_o ic_scr_key_valid_i csr_save_if_i csr_save_id_i csr_save_wb_i csr_restore_mret_i csr_restore_dret_i csr_save_cause_i csr_mcause_i csr_mtval_i illegal_csr_insn_o double_fault_seen_o instr_ret_i instr_ret_compressed_i instr_ret_spec_i instr_ret_compressed_spec_i iside_wait_i jump_i branch_i branch_taken_i mem_load_i mem_store_i dside_wait_i mul_wait_i div_wait_i

Schematic Diagram of ibex_cs_registers