[edn/csrng] change REGWEN to be module enable based Signed-off-by: Mark Branstad <mark.branstad@wdc.com>
diff --git a/hw/ip/csrng/rtl/csrng_block_encrypt.sv b/hw/ip/csrng/rtl/csrng_block_encrypt.sv index f3aac3a..5291409 100644 --- a/hw/ip/csrng/rtl/csrng_block_encrypt.sv +++ b/hw/ip/csrng/rtl/csrng_block_encrypt.sv
@@ -166,7 +166,6 @@ assign block_encrypt_id_o = sfifo_blkenc_id; assign block_encrypt_v_o = !aes_cipher_core_enable ? sfifo_blkenc_v : cipher_data_out; assign cipher_out_ready = - (!block_encrypt_enable_i) ? aes_pkg::SP2V_HIGH : // flush out AES in halt case block_encrypt_rdy_i ? aes_pkg::SP2V_HIGH : aes_pkg::SP2V_LOW;
diff --git a/hw/ip/csrng/rtl/csrng_core.sv b/hw/ip/csrng/rtl/csrng_core.sv index 84252f3..9d73239 100644 --- a/hw/ip/csrng/rtl/csrng_core.sv +++ b/hw/ip/csrng/rtl/csrng_core.sv
@@ -1359,7 +1359,6 @@ // es to cs halt request to reduce power spikes assign cs_aes_halt_d = - (!cs_enable) ? '0 : (ctr_drbg_upd_es_ack && ctr_drbg_gen_es_ack && block_encrypt_quiet); assign cs_aes_halt_o.cs_aes_halt_ack = cs_aes_halt_q;
diff --git a/hw/ip/csrng/rtl/csrng_main_sm.sv b/hw/ip/csrng/rtl/csrng_main_sm.sv index c8fc938..a129a03 100644 --- a/hw/ip/csrng/rtl/csrng_main_sm.sv +++ b/hw/ip/csrng/rtl/csrng_main_sm.sv
@@ -101,90 +101,132 @@ main_sm_err_o = 1'b0; unique case (state_q) Idle: begin - if (halt_main_sm_i) begin - state_d = SMHalted; - end else begin - if (ctr_drbg_cmd_req_rdy_i) begin - if (acmd_avail_i) begin - acmd_accept_o = 1'b1; - if (acmd_i == INS) begin - if (acmd_eop_i) begin + if (enable_i) begin + if (halt_main_sm_i) begin + state_d = SMHalted; + end else begin + if (ctr_drbg_cmd_req_rdy_i) begin + if (acmd_avail_i) begin + acmd_accept_o = 1'b1; + if (acmd_i == INS) begin + if (acmd_eop_i) begin + acmd_hdr_capt_o = 1'b1; + state_d = InstantPrep; + end + end else if (acmd_i == RES) begin + if (acmd_eop_i) begin + acmd_hdr_capt_o = 1'b1; + state_d = ReseedPrep; + end + end else if (acmd_i == GEN) begin acmd_hdr_capt_o = 1'b1; - state_d = InstantPrep; - end - end else if (acmd_i == RES) begin - if (acmd_eop_i) begin + state_d = GenerateReq; + end else if (acmd_i == UPD) begin + if (acmd_eop_i) begin + acmd_hdr_capt_o = 1'b1; + state_d = UpdatePrep; + end + end else if (acmd_i == UNI) begin acmd_hdr_capt_o = 1'b1; - state_d = ReseedPrep; + state_d = UninstantReq; end - end else if (acmd_i == GEN) begin - acmd_hdr_capt_o = 1'b1; - state_d = GenerateReq; - end else if (acmd_i == UPD) begin - if (acmd_eop_i) begin - acmd_hdr_capt_o = 1'b1; - state_d = UpdatePrep; - end - end else if (acmd_i == UNI) begin - acmd_hdr_capt_o = 1'b1; - state_d = UninstantReq; end end end end end InstantPrep: begin - if (flag0_i) begin - // assumes all adata is present now - state_d = InstantReq; + if (!enable_i) begin + state_d = Idle; end else begin - // delay one clock to fix timing issue - cmd_entropy_req_o = 1'b1; - if (cmd_entropy_avail_i) begin + if (flag0_i) begin + // assumes all adata is present now state_d = InstantReq; + end else begin + // delay one clock to fix timing issue + cmd_entropy_req_o = 1'b1; + if (cmd_entropy_avail_i) begin + state_d = InstantReq; + end end end end InstantReq: begin - instant_req_o = 1'b1; - state_d = CmdCompWait; + if (!enable_i) begin + state_d = Idle; + end else begin + instant_req_o = 1'b1; + state_d = CmdCompWait; + end end ReseedPrep: begin - cmd_entropy_req_o = 1'b1; - // assumes all adata is present now - if (cmd_entropy_avail_i) begin - state_d = ReseedReq; + if (!enable_i) begin + state_d = Idle; + end else begin + cmd_entropy_req_o = 1'b1; + // assumes all adata is present now + if (cmd_entropy_avail_i) begin + state_d = ReseedReq; + end end end ReseedReq: begin - reseed_req_o = 1'b1; - state_d = CmdCompWait; + if (!enable_i) begin + state_d = Idle; + end else begin + reseed_req_o = 1'b1; + state_d = CmdCompWait; + end end GenerateReq: begin - generate_req_o = 1'b1; - state_d = CmdCompWait; + if (!enable_i) begin + state_d = Idle; + end else begin + generate_req_o = 1'b1; + state_d = CmdCompWait; + end end UpdatePrep: begin - // assumes all adata is present now - state_d = UpdateReq; + if (!enable_i) begin + state_d = Idle; + end else begin + // assumes all adata is present now + state_d = UpdateReq; + end end UpdateReq: begin - update_req_o = 1'b1; - state_d = CmdCompWait; + if (!enable_i) begin + state_d = Idle; + end else begin + update_req_o = 1'b1; + state_d = CmdCompWait; + end end UninstantReq: begin - uninstant_req_o = 1'b1; - state_d = CmdCompWait; + if (!enable_i) begin + state_d = Idle; + end else begin + uninstant_req_o = 1'b1; + state_d = CmdCompWait; + end end CmdCompWait: begin - if (cmd_complete_i) begin + if (!enable_i) begin state_d = Idle; + end else begin + if (cmd_complete_i) begin + state_d = Idle; + end end end SMHalted: begin - main_sm_halted_o = 1'b1; - if (!halt_main_sm_i) begin + if (!enable_i) begin state_d = Idle; + end else begin + main_sm_halted_o = 1'b1; + if (!halt_main_sm_i) begin + state_d = Idle; + end end end Error: begin @@ -192,10 +234,6 @@ end default: state_d = Error; endcase - // Master override for FSM - if (!enable_i) begin - state_d = Idle; - end end endmodule
diff --git a/hw/ip/csrng/rtl/csrng_state_db.sv b/hw/ip/csrng/rtl/csrng_state_db.sv index 2cd40a2..30ec6a5 100644 --- a/hw/ip/csrng/rtl/csrng_state_db.sv +++ b/hw/ip/csrng/rtl/csrng_state_db.sv
@@ -51,6 +51,7 @@ localparam int InternalStateWidth = 2+KeyLen+BlkLen+CtrLen; localparam int RegInternalStateWidth = 30+InternalStateWidth; localparam int RegW = 32; + localparam int StateWidth = 1+1+KeyLen+BlkLen+CtrLen+StateId+1; logic [StateId-1:0] state_db_id; logic [KeyLen-1:0] state_db_key; @@ -170,7 +171,8 @@ assign {state_db_fips,state_db_inst_st, state_db_key, state_db_v,state_db_rc, - state_db_id,state_db_sts} = {state_db_wr_fips_i,instance_status, + state_db_id,state_db_sts} = {StateWidth{state_db_enable_i}} & + {state_db_wr_fips_i,instance_status, state_db_wr_key_i, state_db_wr_v_i,state_db_wr_res_ctr_i, state_db_wr_inst_id_i,state_db_wr_sts_i}; @@ -184,15 +186,12 @@ assign state_db_write = state_db_enable_i && state_db_wr_req_i; assign state_db_sts_ack_d = - (!state_db_enable_i) ? '0 : state_db_write; assign state_db_sts_sts_d = - (!state_db_enable_i) ? '0 : state_db_sts; assign state_db_sts_id_d = - (!state_db_enable_i) ? '0 : state_db_id; assign state_db_sts_ack_o = state_db_sts_ack_q;
diff --git a/hw/ip/entropy_src/data/entropy_src.hjson b/hw/ip/entropy_src/data/entropy_src.hjson index 5513617..839a2dc 100644 --- a/hw/ip/entropy_src/data/entropy_src.hjson +++ b/hw/ip/entropy_src/data/entropy_src.hjson
@@ -73,8 +73,7 @@ { bits: "0", desc: ''' When true, all writeable registers can be modified. - When false, they become read-only. Defaults true, write one to clear. Note that this needs to be - cleared after initial configuration at boot in order to lock in the listed register settings. + When false, they become read-only. ''' resval: 1 }