[csrng/edn/rtl] Ensure enable/local_escalate in every state in main fsms
Signed-off-by: Steve Nelson <steve.nelson@wdc.com>
diff --git a/hw/ip/csrng/rtl/csrng_cmd_stage.sv b/hw/ip/csrng/rtl/csrng_cmd_stage.sv
index ec988fa..f6e4687 100644
--- a/hw/ip/csrng/rtl/csrng_cmd_stage.sv
+++ b/hw/ip/csrng/rtl/csrng_cmd_stage.sv
@@ -90,6 +90,8 @@
logic cmd_gen_flag_q, cmd_gen_flag_d;
logic [11:0] cmd_gen_cmd_q, cmd_gen_cmd_d;
+ logic local_escalate;
+
always_ff @(posedge clk_i or negedge rst_ni)
if (!rst_ni) begin
@@ -194,6 +196,8 @@
.err_o(cmd_gen_cnt_err_o)
);
+ // For naming consistency
+ assign local_escalate = cmd_gen_cnt_err_o;
//---------------------------------------------------------
// state machine to process command
@@ -254,87 +258,139 @@
cmd_stage_sm_err_o = 1'b0;
unique case (state_q)
Idle: begin
- if (!cmd_fifo_zero) begin
- state_d = ArbGnt;
+ if (local_escalate) begin
+ state_d = Error;
+ end else if (cs_enable_i) begin
+ if (!cmd_fifo_zero) begin
+ state_d = ArbGnt;
+ end
end
end
ArbGnt: begin
- cmd_arb_req_o = 1'b1;
- if (cmd_arb_gnt_i) begin
- state_d = SendSOP;
+ if (local_escalate) begin
+ state_d = Error;
+ end else if (!cs_enable_i) begin
+ state_d = Idle;
+ end else begin
+ cmd_arb_req_o = 1'b1;
+ if (cmd_arb_gnt_i) begin
+ state_d = SendSOP;
+ end
end
end
SendSOP: begin
- cmd_gen_1st_req = 1'b1;
- cmd_arb_sop_o = 1'b1;
- cmd_fifo_pop = 1'b1;
- if (sfifo_cmd_rdata[24:12] == GenBitsCntrWidth'(1)) begin
- cmd_gen_cnt_last = 1'b1;
- end
- if (cmd_len == '0) begin
- cmd_arb_eop_o = 1'b1;
- state_d = GenCmdChk;
+ if (local_escalate) begin
+ state_d = Error;
+ end else if (!cs_enable_i) begin
+ state_d = Idle;
end else begin
- state_d = SendMOP;
- end
- end
- SendMOP: begin
- if (!cmd_fifo_zero) begin
+ cmd_gen_1st_req = 1'b1;
+ cmd_arb_sop_o = 1'b1;
cmd_fifo_pop = 1'b1;
- cmd_len_dec = 1'b1;
- if (cmd_len_q == 4'h1) begin
- cmd_arb_mop_o = 1'b1;
+ if (sfifo_cmd_rdata[24:12] == GenBitsCntrWidth'(1)) begin
+ cmd_gen_cnt_last = 1'b1;
+ end
+ if (cmd_len == '0) begin
cmd_arb_eop_o = 1'b1;
state_d = GenCmdChk;
end else begin
- cmd_arb_mop_o = 1'b1;
+ state_d = SendMOP;
+ end
+ end
+ end
+ SendMOP: begin
+ if (local_escalate) begin
+ state_d = Error;
+ end else if (!cs_enable_i) begin
+ state_d = Idle;
+ end else begin
+ if (!cmd_fifo_zero) begin
+ cmd_fifo_pop = 1'b1;
+ cmd_len_dec = 1'b1;
+ if (cmd_len_q == 4'h1) begin
+ cmd_arb_mop_o = 1'b1;
+ cmd_arb_eop_o = 1'b1;
+ state_d = GenCmdChk;
+ end else begin
+ cmd_arb_mop_o = 1'b1;
+ end
end
end
end
GenCmdChk: begin
- if (cmd_gen_flag_q) begin
- cmd_gen_cnt_dec= 1'b1;
+ if (local_escalate) begin
+ state_d = Error;
+ end else if (!cs_enable_i) begin
+ state_d = Idle;
+ end else begin
+ if (cmd_gen_flag_q) begin
+ cmd_gen_cnt_dec= 1'b1;
+ end
+ state_d = CmdAck;
end
- state_d = CmdAck;
end
CmdAck: begin
- if (cmd_ack_i) begin
- state_d = GenReq;
+ if (local_escalate) begin
+ state_d = Error;
+ end else if (!cs_enable_i) begin
+ state_d = Idle;
+ end else begin
+ if (cmd_ack_i) begin
+ state_d = GenReq;
+ end
end
end
GenReq: begin
- // flag set if a gen request
- if (cmd_gen_flag_q) begin
- // must stall if genbits fifo is not clear
- if (!sfifo_genbits_full) begin
- if (cmd_gen_cnt == '0) begin
- cmd_final_ack = 1'b1;
- state_d = Idle;
- end else begin
- // issue a subsequent gen request
- state_d = GenArbGnt;
- end
- end
- end else begin
- // ack for the non-gen request case
- cmd_final_ack = 1'b1;
+ if (local_escalate) begin
+ state_d = Error;
+ end else if (!cs_enable_i) begin
state_d = Idle;
+ end else begin
+ // flag set if a gen request
+ if (cmd_gen_flag_q) begin
+ // must stall if genbits fifo is not clear
+ if (!sfifo_genbits_full) begin
+ if (cmd_gen_cnt == '0) begin
+ cmd_final_ack = 1'b1;
+ state_d = Idle;
+ end else begin
+ // issue a subsequent gen request
+ state_d = GenArbGnt;
+ end
+ end
+ end else begin
+ // ack for the non-gen request case
+ cmd_final_ack = 1'b1;
+ state_d = Idle;
+ end
end
end
GenArbGnt: begin
- cmd_arb_req_o = 1'b1;
- if (cmd_arb_gnt_i) begin
- state_d = GenSOP;
+ if (local_escalate) begin
+ state_d = Error;
+ end else if (!cs_enable_i) begin
+ state_d = Idle;
+ end else begin
+ cmd_arb_req_o = 1'b1;
+ if (cmd_arb_gnt_i) begin
+ state_d = GenSOP;
+ end
end
end
GenSOP: begin
- cmd_arb_sop_o = 1'b1;
- cmd_arb_eop_o = 1'b1;
- cmd_gen_inc_req = 1'b1;
- state_d = GenCmdChk;
- // check for final genbits beat
- if (cmd_gen_cnt == GenBitsCntrWidth'(1)) begin
- cmd_gen_cnt_last = 1'b1;
+ if (local_escalate) begin
+ state_d = Error;
+ end else if (!cs_enable_i) begin
+ state_d = Idle;
+ end else begin
+ cmd_arb_sop_o = 1'b1;
+ cmd_arb_eop_o = 1'b1;
+ cmd_gen_inc_req = 1'b1;
+ state_d = GenCmdChk;
+ // check for final genbits beat
+ if (cmd_gen_cnt == GenBitsCntrWidth'(1)) begin
+ cmd_gen_cnt_last = 1'b1;
+ end
end
end
Error: begin
diff --git a/hw/ip/csrng/rtl/csrng_main_sm.sv b/hw/ip/csrng/rtl/csrng_main_sm.sv
index c7eb613..dcf02c0 100644
--- a/hw/ip/csrng/rtl/csrng_main_sm.sv
+++ b/hw/ip/csrng/rtl/csrng_main_sm.sv
@@ -53,6 +53,9 @@
main_sm_err_o = 1'b0;
unique case (state_q)
Idle: begin
+ if (local_escalate_i) begin
+ state_d = Error;
+ end else
if (enable_i) begin
if (ctr_drbg_cmd_req_rdy_i) begin
// signal the arbiter to grant this request
@@ -64,7 +67,9 @@
end
end
ParseCmd: begin
- if (!enable_i) begin
+ if (local_escalate_i) begin
+ state_d = Error;
+ end else if (!enable_i) begin
state_d = Idle;
end else begin
if (ctr_drbg_cmd_req_rdy_i) begin
@@ -96,7 +101,9 @@
end
end
InstantPrep: begin
- if (!enable_i) begin
+ if (local_escalate_i) begin
+ state_d = Error;
+ end else if (!enable_i) begin
state_d = Idle;
end else begin
if (flag0_i) begin
@@ -112,7 +119,9 @@
end
end
InstantReq: begin
- if (!enable_i) begin
+ if (local_escalate_i) begin
+ state_d = Error;
+ end else if (!enable_i) begin
state_d = Idle;
end else begin
instant_req_o = 1'b1;
@@ -120,7 +129,9 @@
end
end
ReseedPrep: begin
- if (!enable_i) begin
+ if (local_escalate_i) begin
+ state_d = Error;
+ end else if (!enable_i) begin
state_d = Idle;
end else begin
if (flag0_i) begin
@@ -136,7 +147,9 @@
end
end
ReseedReq: begin
- if (!enable_i) begin
+ if (local_escalate_i) begin
+ state_d = Error;
+ end else if (!enable_i) begin
state_d = Idle;
end else begin
reseed_req_o = 1'b1;
@@ -144,7 +157,9 @@
end
end
GeneratePrep: begin
- if (!enable_i) begin
+ if (local_escalate_i) begin
+ state_d = Error;
+ end else if (!enable_i) begin
state_d = Idle;
end else begin
// assumes all adata is present now
@@ -152,7 +167,9 @@
end
end
GenerateReq: begin
- if (!enable_i) begin
+ if (local_escalate_i) begin
+ state_d = Error;
+ end else if (!enable_i) begin
state_d = Idle;
end else begin
generate_req_o = 1'b1;
@@ -160,7 +177,9 @@
end
end
UpdatePrep: begin
- if (!enable_i) begin
+ if (local_escalate_i) begin
+ state_d = Error;
+ end else if (!enable_i) begin
state_d = Idle;
end else begin
// assumes all adata is present now
@@ -168,7 +187,9 @@
end
end
UpdateReq: begin
- if (!enable_i) begin
+ if (local_escalate_i) begin
+ state_d = Error;
+ end else if (!enable_i) begin
state_d = Idle;
end else begin
update_req_o = 1'b1;
@@ -176,7 +197,9 @@
end
end
UninstantPrep: begin
- if (!enable_i) begin
+ if (local_escalate_i) begin
+ state_d = Error;
+ end else if (!enable_i) begin
state_d = Idle;
end else begin
// assumes all adata is present now
@@ -184,7 +207,9 @@
end
end
UninstantReq: begin
- if (!enable_i) begin
+ if (local_escalate_i) begin
+ state_d = Error;
+ end else if (!enable_i) begin
state_d = Idle;
end else begin
uninstant_req_o = 1'b1;
@@ -192,7 +217,9 @@
end
end
ClrAData: begin
- if (!enable_i) begin
+ if (local_escalate_i) begin
+ state_d = Error;
+ end else if (!enable_i) begin
state_d = Idle;
end else begin
clr_adata_packer_o = 1'b1;
@@ -200,7 +227,9 @@
end
end
CmdCompWait: begin
- if (!enable_i) begin
+ if (local_escalate_i) begin
+ state_d = Error;
+ end else if (!enable_i) begin
state_d = Idle;
end else begin
if (cmd_complete_i) begin
@@ -213,9 +242,6 @@
end
default: state_d = Error;
endcase
- if (local_escalate_i) begin
- state_d = Error;
- end
end
endmodule
diff --git a/hw/ip/edn/rtl/edn_main_sm.sv b/hw/ip/edn/rtl/edn_main_sm.sv
index ee7ce1f..329034d 100644
--- a/hw/ip/edn/rtl/edn_main_sm.sv
+++ b/hw/ip/edn/rtl/edn_main_sm.sv
@@ -104,7 +104,9 @@
main_sm_err_o = 1'b0;
unique case (state_q)
Idle: begin
- if (boot_req_mode_i && edn_enable_i) begin
+ if (local_escalate_i) begin
+ state_d = Error;
+ end else if (boot_req_mode_i && edn_enable_i) begin
state_d = BootLoadIns;
end else if (auto_req_mode_i && edn_enable_i) begin
state_d = AutoLoadIns;
@@ -114,15 +116,31 @@
end
end
BootLoadIns: begin
- boot_wr_cmd_reg_o = 1'b1;
- state_d = BootLoadGen;
+ if (local_escalate_i) begin
+ state_d = Error;
+ end else if (!edn_enable_i) begin
+ state_d = Idle;
+ end
+ else begin
+ boot_wr_cmd_reg_o = 1'b1;
+ state_d = BootLoadGen;
+ end
end
BootLoadGen: begin
- boot_wr_cmd_genfifo_o = 1'b1;
- state_d = BootInsAckWait;
+ if (local_escalate_i) begin
+ state_d = Error;
+ end else if (!edn_enable_i) begin
+ state_d = Idle;
+ end
+ else begin
+ boot_wr_cmd_genfifo_o = 1'b1;
+ state_d = BootInsAckWait;
+ end
end
BootInsAckWait: begin
- if (!edn_enable_i) begin
+ if (local_escalate_i) begin
+ state_d = Error;
+ end else if (!edn_enable_i) begin
state_d = Idle;
end else begin
if (csrng_cmd_ack_i) begin
@@ -131,21 +149,32 @@
end
end
BootCaptGenCnt: begin
- capt_gencmd_fifo_cnt_o = 1'b1;
- state_d = BootSendGenCmd;
+ if (local_escalate_i) begin
+ state_d = Error;
+ end else if (!edn_enable_i) begin
+ state_d = Idle;
+ end
+ else begin
+ capt_gencmd_fifo_cnt_o = 1'b1;
+ state_d = BootSendGenCmd;
+ end
end
BootSendGenCmd: begin
- boot_send_gencmd_o = 1'b1;
- if (!edn_enable_i) begin
+ if (local_escalate_i) begin
+ state_d = Error;
+ end else if (!edn_enable_i) begin
state_d = Idle;
end else begin
+ boot_send_gencmd_o = 1'b1;
if (cmd_sent_i) begin
state_d = BootGenAckWait;
end
end
end
BootGenAckWait: begin
- if (!edn_enable_i) begin
+ if (local_escalate_i) begin
+ state_d = Error;
+ end else if (!edn_enable_i) begin
state_d = Idle;
end else begin
if (csrng_cmd_ack_i) begin
@@ -154,31 +183,43 @@
end
end
BootPulse: begin
- main_sm_done_pulse_o = 1'b1;
- state_d = BootDone;
+ if (local_escalate_i) begin
+ state_d = Error;
+ end else if (!edn_enable_i) begin
+ state_d = Idle;
+ end else begin
+ main_sm_done_pulse_o = 1'b1;
+ state_d = BootDone;
+ end
end
BootDone: begin
- if (!edn_enable_i) begin
+ if (local_escalate_i) begin
+ state_d = Error;
+ end else if (!edn_enable_i) begin
state_d = Idle;
end
end
//-----------------------------------
AutoLoadIns: begin
- auto_set_intr_gate_o = 1'b1;
- auto_first_ack_wait_o = 1'b1;
- if (!edn_enable_i) begin
+ if (local_escalate_i) begin
+ state_d = Error;
+ end else if (!edn_enable_i) begin
state_d = Idle;
end else begin
+ auto_set_intr_gate_o = 1'b1;
+ auto_first_ack_wait_o = 1'b1;
if (sw_cmd_req_load_i) begin
state_d = AutoFirstAckWait;
end
end
end
AutoFirstAckWait: begin
- auto_first_ack_wait_o = 1'b1;
- if (!edn_enable_i) begin
+ if (local_escalate_i) begin
+ state_d = Error;
+ end else if (!edn_enable_i) begin
state_d = Idle;
end else begin
+ auto_first_ack_wait_o = 1'b1;
if (csrng_cmd_ack_i) begin
auto_clr_intr_gate_o = 1'b1;
state_d = AutoDispatch;
@@ -186,20 +227,24 @@
end
end
AutoAckWait: begin
- auto_req_mode_busy_o = 1'b1;
- if (!edn_enable_i) begin
+ if (local_escalate_i) begin
+ state_d = Error;
+ end else if (!edn_enable_i) begin
state_d = Idle;
end else begin
+ auto_req_mode_busy_o = 1'b1;
if (csrng_cmd_ack_i) begin
state_d = AutoDispatch;
end
end
end
AutoDispatch: begin
- auto_req_mode_busy_o = 1'b1;
- if (!edn_enable_i) begin
+ if (local_escalate_i) begin
+ state_d = Error;
+ end else if (!edn_enable_i) begin
state_d = Idle;
end else begin
+ auto_req_mode_busy_o = 1'b1;
if (!auto_req_mode_i) begin
main_sm_done_pulse_o = 1'b1;
state_d = Idle;
@@ -213,39 +258,57 @@
end
end
AutoCaptGenCnt: begin
- auto_req_mode_busy_o = 1'b1;
- capt_gencmd_fifo_cnt_o = 1'b1;
- state_d = AutoSendGenCmd;
- end
- AutoSendGenCmd: begin
- auto_req_mode_busy_o = 1'b1;
- send_gencmd_o = 1'b1;
- if (!edn_enable_i) begin
+ if (local_escalate_i) begin
+ state_d = Error;
+ end else if (!edn_enable_i) begin
state_d = Idle;
end else begin
+ auto_req_mode_busy_o = 1'b1;
+ capt_gencmd_fifo_cnt_o = 1'b1;
+ state_d = AutoSendGenCmd;
+ end
+ end
+ AutoSendGenCmd: begin
+ if (local_escalate_i) begin
+ state_d = Error;
+ end else if (!edn_enable_i) begin
+ state_d = Idle;
+ end else begin
+ auto_req_mode_busy_o = 1'b1;
+ send_gencmd_o = 1'b1;
if (cmd_sent_i) begin
state_d = AutoAckWait;
end
end
end
AutoCaptReseedCnt: begin
- auto_req_mode_busy_o = 1'b1;
- capt_rescmd_fifo_cnt_o = 1'b1;
- state_d = AutoSendReseedCmd;
- end
- AutoSendReseedCmd: begin
- auto_req_mode_busy_o = 1'b1;
- send_rescmd_o = 1'b1;
- if (!edn_enable_i) begin
+ if (local_escalate_i) begin
+ state_d = Error;
+ end else if (!edn_enable_i) begin
state_d = Idle;
end else begin
+ auto_req_mode_busy_o = 1'b1;
+ capt_rescmd_fifo_cnt_o = 1'b1;
+ state_d = AutoSendReseedCmd;
+ end
+ end
+ AutoSendReseedCmd: begin
+ if (local_escalate_i) begin
+ state_d = Error;
+ end else if (!edn_enable_i) begin
+ state_d = Idle;
+ end else begin
+ auto_req_mode_busy_o = 1'b1;
+ send_rescmd_o = 1'b1;
if (cmd_sent_i) begin
state_d = AutoAckWait;
end
end
end
SWPortMode: begin
- if (!edn_enable_i) begin
+ if (local_escalate_i) begin
+ state_d = Error;
+ end else if (!edn_enable_i) begin
state_d = Idle;
end
end
@@ -254,9 +317,6 @@
end
default: state_d = Error;
endcase
- if (local_escalate_i) begin
- state_d = Error;
- end
end
endmodule