Fix IRQ mcause not being set correctly when vectoring is disabled
This commit is contained in:
parent
c56c75e14b
commit
d30fc46f5b
|
@ -384,7 +384,7 @@ end
|
|||
|
||||
// Interrupt enable (reserved bits are tied to 0)
|
||||
reg [XLEN-1:0] mie;
|
||||
localparam MIE_WMASK = 32'h00000888; // meie, mtip, msip
|
||||
localparam MIE_WMASK = 32'h00000888; // meie, mtie, msie
|
||||
|
||||
always @ (posedge clk or negedge rst_n) begin
|
||||
if (!rst_n) begin
|
||||
|
@ -999,6 +999,9 @@ hazard3_priority_encode #(
|
|||
// depending on dcsr.ebreakm.
|
||||
wire exception_req_any = except != EXCEPT_NONE && !(except == EXCEPT_EBREAK && dcsr_ebreakm);
|
||||
|
||||
// Note when eivect=0 external interrupts also count as standard interrupts,
|
||||
// so the standard mapping (collapsed into a single vector) always takes
|
||||
// priority.
|
||||
wire [5:0] vector_sel =
|
||||
exception_req_any || !irq_vector_enable ? 6'd0 :
|
||||
standard_irq_active ? {2'h0, standard_irq_num} :
|
||||
|
@ -1019,7 +1022,8 @@ assign trap_enter_vld =
|
|||
DEBUG_SUPPORT && (want_halt_irq || want_halt_except || pending_dbg_resume);
|
||||
|
||||
assign mcause_irq_next = !exception_req_any;
|
||||
assign mcause_code_next = exception_req_any ? {2'h0, except} : vector_sel;
|
||||
assign mcause_code_next = exception_req_any ? {2'h0, except} :
|
||||
standard_irq_active ? standard_irq_num : external_irq_num;
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
|
|
Loading…
Reference in New Issue