Skip to content

Commit 08fffa0

Browse files
author
Maurus Item
committed
Changed done_o mechanism to be fault tolerant.
1 parent 2926867 commit 08fffa0

File tree

1 file changed

+16
-1
lines changed

1 file changed

+16
-1
lines changed

rtl/hwpe_ctrl_slave.sv

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,8 @@ module hwpe_ctrl_slave
6969

7070
logic triggered_q;
7171

72+
logic done_q1, done_q2;
73+
7274
always_ff @(posedge clk_i or negedge rst_ni)
7375
begin
7476
if(rst_ni == 1'b0)
@@ -198,7 +200,7 @@ module hwpe_ctrl_slave
198200
regfile_flags.is_testset = (cfg.req == 1'b1 && cfg.wen == 1'b1 && cfg.add[LOG_REGS+2-1:2] == REGFILE_MANDATORY_ACQUIRE) ? 1 : 0; // Operation is a test&set to register context_ts
199201
regfile_flags.is_trigger = (cfg.req == 1'b1 && cfg.wen == 1'b0 && cfg.add[LOG_REGS+2-1:2] == REGFILE_MANDATORY_TRIGGER && cfg.data == '0) ? 1 : 0; // Operation is a trigger
200202
regfile_flags.is_commit = (cfg.req == 1'b1 && cfg.wen == 1'b0 && cfg.add[LOG_REGS+2-1:2] == REGFILE_MANDATORY_TRIGGER) ? 1 : 0; // Operation is a commit (or commit & trigger)
201-
regfile_flags.true_done = ctrl_i.done & flags_o.is_working; // This is necessary because sometimes done is asserted as soon as rst_ni becomes 1
203+
regfile_flags.true_done = (ctrl_i.done | done_q1) & ~done_q2; // This is necessary because sometimes done is asserted as soon as rst_ni becomes 1
202204
flags_o.enable = s_enable_after[3]; // Enable after three cycles from rst_ni
203205
end
204206

@@ -465,6 +467,19 @@ module hwpe_ctrl_slave
465467
cfg_req_q <= cfg_req_d;
466468
end
467469

470+
// FF to make flags_o.done a pulse, pulse should be two cycles long so no single event upset can completely destroy it
471+
always_ff @(posedge clk_i or negedge rst_ni)
472+
begin
473+
if(!rst_ni) begin
474+
done_q1 <= 1'b1;
475+
done_q2 <= 1'b1;
476+
end
477+
else begin
478+
done_q1 <= ctrl_i.done;
479+
done_q2 <= done_q1;
480+
end
481+
end
482+
468483
assign cfg_id_d = cfg.id;
469484
assign cfg_req_d = cfg.req;
470485
assign cfg.r_id = cfg_id_q;

0 commit comments

Comments
 (0)