Clear local monitor on non-debug trap entry/exit
This commit is contained in:
parent
a7cb214501
commit
edfe7f601e
|
@ -277,6 +277,7 @@ wire x_alu_cmp;
|
|||
|
||||
wire [W_DATA-1:0] m_trap_addr;
|
||||
wire m_trap_is_irq;
|
||||
wire m_trap_is_debug_entry;
|
||||
wire m_trap_enter_vld;
|
||||
wire m_trap_enter_soon;
|
||||
wire m_trap_enter_rdy = f_jump_rdy;
|
||||
|
@ -900,6 +901,7 @@ hazard3_csr #(
|
|||
// Trap signalling
|
||||
.trap_addr (m_trap_addr),
|
||||
.trap_is_irq (m_trap_is_irq),
|
||||
.m_trap_is_debug_entry (m_trap_is_debug_entry),
|
||||
.trap_enter_soon (m_trap_enter_soon),
|
||||
.trap_enter_vld (m_trap_enter_vld),
|
||||
.trap_enter_rdy (m_trap_enter_rdy),
|
||||
|
@ -1086,21 +1088,26 @@ end
|
|||
// Local monitor update.
|
||||
// - Set on a load-reserved with good response from global monitor
|
||||
// - Cleared by any store-conditional
|
||||
// - Not affected by trap entry (permitted by RISC-V spec)
|
||||
// - Cleared by non-debug-related trap entry/exit
|
||||
|
||||
always @ (posedge clk or negedge rst_n) begin
|
||||
if (!rst_n) begin
|
||||
mw_local_exclusive_reserved <= 1'b0;
|
||||
end else if (|EXTENSION_A && (!m_stall || bus_dph_err_d)) begin
|
||||
if (d_memop_is_amo) begin
|
||||
end else begin
|
||||
if (|EXTENSION_A && (!m_stall || bus_dph_err_d)) begin
|
||||
if (d_memop_is_amo) begin
|
||||
mw_local_exclusive_reserved <= 1'b0;
|
||||
end else if (xm_memop == MEMOP_SC_W && (bus_dph_ready_d || bus_dph_err_d)) begin
|
||||
mw_local_exclusive_reserved <= 1'b0;
|
||||
end else if (xm_memop == MEMOP_LR_W && bus_dph_ready_d) begin
|
||||
// In theory, the bus should never report HEXOKAY when HRESP is asserted.
|
||||
// Still might happen (e.g. if HEXOKAY is tied high), so mask HEXOKAY with
|
||||
// HREADY to be sure a failed lr.w clears the monitor.
|
||||
mw_local_exclusive_reserved <= bus_dph_exokay_d && !bus_dph_err_d;
|
||||
end
|
||||
end
|
||||
if (m_trap_enter_vld && m_trap_enter_rdy && !(debug_mode || m_trap_is_debug_entry)) begin
|
||||
mw_local_exclusive_reserved <= 1'b0;
|
||||
end else if (xm_memop == MEMOP_SC_W && (bus_dph_ready_d || bus_dph_err_d)) begin
|
||||
mw_local_exclusive_reserved <= 1'b0;
|
||||
end else if (xm_memop == MEMOP_LR_W && bus_dph_ready_d) begin
|
||||
// In theory, the bus should never report HEXOKAY when HRESP is asserted.
|
||||
// Still might happen (e.g. if HEXOKAY is tied high), so mask HEXOKAY with
|
||||
// HREADY to be sure a failed lr.w clears the monitor.
|
||||
mw_local_exclusive_reserved <= bus_dph_exokay_d && !bus_dph_err_d;
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
@ -67,6 +67,7 @@ module hazard3_csr #(
|
|||
// case we lower trap_enter_vld.
|
||||
output wire [XLEN-1:0] trap_addr,
|
||||
output wire trap_is_irq,
|
||||
output wire trap_is_debug_entry,
|
||||
output wire trap_enter_vld,
|
||||
input wire trap_enter_rdy,
|
||||
// True when we are about to trap, but are waiting for an excepting or
|
||||
|
@ -1068,7 +1069,8 @@ assign dcause_next =
|
|||
dbg_req_halt_prev || (dbg_req_halt_on_reset && have_just_reset) ? 3'h3 : // halt or reset-halt (priority 1, 2)
|
||||
3'h4; // single-step (priority 0)
|
||||
|
||||
assign enter_debug_mode = !debug_mode && (want_halt_irq || want_halt_except) && trap_enter_rdy;
|
||||
assign trap_is_debug_entry = |DEBUG_SUPPORT && !debug_mode && (want_halt_irq || want_halt_except);
|
||||
assign enter_debug_mode = trap_is_debug_entry && trap_enter_rdy;
|
||||
|
||||
assign exit_debug_mode = debug_mode && pending_dbg_resume && trap_enter_rdy;
|
||||
|
||||
|
|
Loading…
Reference in New Issue