Cut in->out paths on debug halt/resume request
Should be harmless, because in practice these should always be driven from a register in the DM, but still better to cut the path
This commit is contained in:
parent
5aca1381ac
commit
96c69d0bb0
|
@ -837,21 +837,31 @@ assign illegal = (wen_soon || ren_soon) && !decode_match;
|
|||
// ----------------------------------------------------------------------------
|
||||
// Debug run/halt
|
||||
|
||||
// req_resume_prev is to cut an in->out path from request to trap addr.
|
||||
reg have_just_reset;
|
||||
reg step_halt_req;
|
||||
reg dbg_req_resume_prev;
|
||||
reg dbg_req_halt_prev;
|
||||
reg pending_dbg_resume_prev;
|
||||
|
||||
wire pending_dbg_resume = (pending_dbg_resume_prev || dbg_req_resume) && debug_mode;
|
||||
wire pending_dbg_resume = (pending_dbg_resume_prev || dbg_req_resume_prev) && debug_mode;
|
||||
|
||||
always @ (posedge clk or negedge rst_n) begin
|
||||
if (!rst_n) begin
|
||||
have_just_reset <= |DEBUG_SUPPORT;
|
||||
step_halt_req <= 1'b0;
|
||||
dbg_req_resume_prev <= 1'b0;
|
||||
dbg_req_halt_prev <= 1'b0;
|
||||
pending_dbg_resume_prev <= 1'b0;
|
||||
end else if (DEBUG_SUPPORT) begin
|
||||
if (instr_ret)
|
||||
have_just_reset <= 1'b0;
|
||||
|
||||
// Just a delayed version of the request from outside of the core.
|
||||
// Delay is fine because the DM awaits ack before deasserting.
|
||||
dbg_req_resume_prev <= dbg_req_resume;
|
||||
dbg_req_halt_prev <= dbg_req_halt;
|
||||
|
||||
if (debug_mode) begin
|
||||
step_halt_req <= 1'b0;
|
||||
end else if (dcsr_step && (instr_ret || (trap_enter_vld && trap_enter_rdy))) begin
|
||||
|
@ -898,7 +908,7 @@ wire want_halt_except = DEBUG_SUPPORT && !debug_mode && (
|
|||
// load/store address phase) because at that point we can't suppress the bus
|
||||
// access..
|
||||
wire want_halt_irq_if_no_exception = DEBUG_SUPPORT && !debug_mode && !want_halt_except && (
|
||||
(dbg_req_halt && !delay_irq_entry) ||
|
||||
(dbg_req_halt_prev && !delay_irq_entry) ||
|
||||
(dbg_req_halt_on_reset && have_just_reset) ||
|
||||
step_halt_req
|
||||
);
|
||||
|
@ -911,9 +921,9 @@ wire want_halt_irq = want_halt_irq_if_no_exception && !halt_delayed_by_exception
|
|||
|
||||
assign dcause_next =
|
||||
// Trigger would be highest priority if implemented
|
||||
except == EXCEPT_EBREAK ? 3'h1 : // ebreak (priority 3)
|
||||
dbg_req_halt || (dbg_req_halt_on_reset && have_just_reset) ? 3'h3 : // halt or reset-halt (priority 1, 2)
|
||||
3'h4; // single-step (priority 0)
|
||||
except == EXCEPT_EBREAK ? 3'h1 : // ebreak (priority 3)
|
||||
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;
|
||||
|
||||
|
|
Loading…
Reference in New Issue