[csrng/rtl] halt feature added
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 ac1d329..f3aac3a 100644
--- a/hw/ip/csrng/rtl/csrng_block_encrypt.sv
+++ b/hw/ip/csrng/rtl/csrng_block_encrypt.sv
@@ -165,7 +165,10 @@
assign block_encrypt_cmd_o = sfifo_blkenc_cmd;
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_rdy_i ? aes_pkg::SP2V_HIGH : aes_pkg::SP2V_LOW;
+ 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;
assign block_encrypt_sfifo_blkenc_err_o =
{(sfifo_blkenc_push && sfifo_blkenc_full),
diff --git a/hw/ip/csrng/rtl/csrng_cmd_stage.sv b/hw/ip/csrng/rtl/csrng_cmd_stage.sv
index d899b0e..21f31fd 100644
--- a/hw/ip/csrng/rtl/csrng_cmd_stage.sv
+++ b/hw/ip/csrng/rtl/csrng_cmd_stage.sv
@@ -155,19 +155,26 @@
assign cmd_len = sfifo_cmd_rdata[7:4];
// capture the length of csrng command
- assign cmd_len_d = cmd_arb_sop_o ? cmd_len :
+ assign cmd_len_d =
+ (!cs_enable_i) ? '0 :
+ cmd_arb_sop_o ? cmd_len :
cmd_len_dec ? (cmd_len_q-1) :
cmd_len_q;
// for gen commands, capture information from the orignal command for use later
- assign cmd_gen_flag_d = cmd_gen_1st_req ? (sfifo_cmd_rdata[2:0] == GEN) :
+ assign cmd_gen_flag_d =
+ (!cs_enable_i) ? '0 :
+ cmd_gen_1st_req ? (sfifo_cmd_rdata[2:0] == GEN) :
cmd_gen_flag_q;
- assign cmd_gen_cnt_d = cmd_gen_1st_req ? sfifo_cmd_rdata[30:12] :
+ assign cmd_gen_cnt_d =
+ (!cs_enable_i) ? '0 :
+ cmd_gen_1st_req ? sfifo_cmd_rdata[30:12] :
cmd_gen_cnt_dec ? (cmd_gen_cnt_q-1) :
cmd_gen_cnt_q;
assign cmd_gen_cmd_d =
+ (!cs_enable_i) ? '0 :
cmd_gen_1st_req ? {sfifo_cmd_rdata[11:0]} :
cmd_gen_cmd_q;
@@ -357,10 +364,17 @@
// ack logic
//---------------------------------------------------------
- assign cmd_ack_d = cmd_final_ack;
+ assign cmd_ack_d =
+ (!cs_enable_i) ? '0 :
+ cmd_final_ack;
+
assign cmd_stage_ack_o = cmd_ack_q;
- assign cmd_ack_sts_d = cmd_final_ack ? cmd_ack_sts_i : cmd_ack_sts_q;
+ assign cmd_ack_sts_d =
+ (!cs_enable_i) ? '0 :
+ cmd_final_ack ? cmd_ack_sts_i :
+ cmd_ack_sts_q;
+
assign cmd_stage_ack_sts_o = cmd_ack_sts_q;
endmodule
diff --git a/hw/ip/csrng/rtl/csrng_core.sv b/hw/ip/csrng/rtl/csrng_core.sv
index dae50eb..84252f3 100644
--- a/hw/ip/csrng/rtl/csrng_core.sv
+++ b/hw/ip/csrng/rtl/csrng_core.sv
@@ -725,7 +725,8 @@
);
// flops for SW fips status
- assign genbits_stage_fips_sw_d = !cs_enable ? 1'b0 :
+ assign genbits_stage_fips_sw_d =
+ (!cs_enable) ? 1'b0 :
(genbits_stage_rdy[NApps-1] && genbits_stage_vld[NApps-1]) ? genbits_stage_fips[NApps-1] :
genbits_stage_fips_sw_q;
@@ -806,16 +807,27 @@
assign flag0 = acmd_bus[8];
assign shid = acmd_bus[15:12];
- assign acmd_d = acmd_sop ? acmd_bus[2:0] : acmd_q;
- assign shid_d = acmd_sop ? shid :
+ assign acmd_d =
+ (!cs_enable) ? '0 :
+ acmd_sop ? acmd_bus[2:0] :
+ acmd_q;
+
+ assign shid_d =
+ (!cs_enable) ? '0 :
+ acmd_sop ? shid :
state_db_reg_rd_id_pulse ? state_db_reg_rd_id :
shid_q;
- assign flag0_d = acmd_sop ? flag0 : flag0_q;
+
+ assign flag0_d =
+ (!cs_enable) ? '0 :
+ acmd_sop ? flag0 :
+ flag0_q;
// sm to process all instantiation requests
csrng_main_sm u_csrng_main_sm (
.clk_i(clk_i),
.rst_ni(rst_ni),
+ .enable_i(cs_enable),
.acmd_avail_i(acmd_avail),
.acmd_accept_o(acmd_accept),
.acmd_hdr_capt_o(acmd_hdr_capt),
@@ -937,7 +949,10 @@
.state_db_sts_id_o(state_db_sts_id)
);
- assign statedb_wr_select_d = !statedb_wr_select_q;
+ assign statedb_wr_select_d =
+ (!cs_enable) ? '0 :
+ !statedb_wr_select_q;
+
assign cmd_blk_select = !statedb_wr_select_q;
assign gen_blk_select = statedb_wr_select_q;
@@ -998,11 +1013,16 @@
- assign cmd_req_ccmd_dly_d = acmd_hold;
+ assign cmd_req_ccmd_dly_d =
+ (!cs_enable) ? '0 :
+ acmd_hold;
+
assign ctr_drbg_cmd_ccmd = cmd_req_ccmd_dly_q;
+
assign cmd_req_dly_d =
- instant_req || reseed_req || generate_req || update_req || uninstant_req;
+ (!cs_enable) ? '0 :
+ (instant_req || reseed_req || generate_req || update_req || uninstant_req);
assign ctr_drbg_cmd_req = cmd_req_dly_q;
@@ -1178,8 +1198,13 @@
assign lc_hw_debug_on = (lc_hw_debug_en_out[1] == lc_ctrl_pkg::On);
// flop for better timing
- assign lc_hw_debug_not_on_d = lc_hw_debug_not_on;
- assign lc_hw_debug_on_d = lc_hw_debug_on;
+ assign lc_hw_debug_not_on_d =
+ (!cs_enable) ? '0 :
+ lc_hw_debug_not_on;
+
+ assign lc_hw_debug_on_d =
+ (!cs_enable) ? '0 :
+ lc_hw_debug_on;
//-------------------------------------
// csrng_block_encrypt instantiation
@@ -1333,7 +1358,10 @@
// es to cs halt request to reduce power spikes
- assign cs_aes_halt_d = ctr_drbg_upd_es_ack && ctr_drbg_gen_es_ack && block_encrypt_quiet;
+ 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_ctr_drbg_gen.sv b/hw/ip/csrng/rtl/csrng_ctr_drbg_gen.sv
index 4e03032..690beff 100644
--- a/hw/ip/csrng/rtl/csrng_ctr_drbg_gen.sv
+++ b/hw/ip/csrng/rtl/csrng_ctr_drbg_gen.sv
@@ -284,14 +284,17 @@
assign v_first = genreq_v + 1;
end
- assign v_ctr_d = v_ctr_load ? v_first[CtrLen-1:0] :
- v_ctr_inc ? (v_ctr_q + 1) :
- v_ctr_q;
+ assign v_ctr_d =
+ (!ctr_drbg_gen_enable_i) ? '0 :
+ v_ctr_load ? v_first[CtrLen-1:0] :
+ v_ctr_inc ? (v_ctr_q + 1) :
+ v_ctr_q;
assign v_sized = {v_first[BlkLen-1:CtrLen],v_ctr_q};
// interation counter
assign interate_ctr_d =
+ (!ctr_drbg_gen_enable_i) ? '0 :
interate_ctr_done ? '0 :
interate_ctr_inc ? (interate_ctr_q + 1) :
interate_ctr_q;
diff --git a/hw/ip/csrng/rtl/csrng_ctr_drbg_upd.sv b/hw/ip/csrng/rtl/csrng_ctr_drbg_upd.sv
index 2610db9..b29033b 100644
--- a/hw/ip/csrng/rtl/csrng_ctr_drbg_upd.sv
+++ b/hw/ip/csrng/rtl/csrng_ctr_drbg_upd.sv
@@ -310,14 +310,17 @@
assign v_first = sfifo_updreq_v + 1;
end
- assign v_ctr_d = v_ctr_load ? v_first[CtrLen-1:0] :
- v_ctr_inc ? (v_ctr_q + 1) :
- v_ctr_q;
+ assign v_ctr_d =
+ (!ctr_drbg_upd_enable_i) ? '0 :
+ v_ctr_load ? v_first[CtrLen-1:0] :
+ v_ctr_inc ? (v_ctr_q + 1) :
+ v_ctr_q;
assign v_sized = {v_first[BlkLen-1:CtrLen],v_ctr_q};
// interation counter
assign interate_ctr_d =
+ (!ctr_drbg_upd_enable_i) ? '0 :
interate_ctr_done ? '0 :
interate_ctr_inc ? (interate_ctr_q + 1) :
interate_ctr_q;
@@ -489,6 +492,7 @@
assign concat_outblk_shifted_value = {concat_outblk_q, {BlkLen{1'b0}}};
assign concat_outblk_d =
+ (!ctr_drbg_upd_enable_i) ? '0 :
sfifo_bencack_pop ? {concat_outblk_q[SeedLen-1:BlkLen],sfifo_bencack_v} :
concat_outblk_shift ? concat_outblk_shifted_value[SeedLen-1:0] :
concat_outblk_q;
@@ -499,14 +503,22 @@
// concatination counter
assign concat_ctr_d =
+ (!ctr_drbg_upd_enable_i) ? '0 :
concat_ctr_done ? '0 :
concat_ctr_inc ? (concat_ctr_q + 1) :
concat_ctr_q;
assign concat_ctr_done = (int'(concat_ctr_q) >= (SeedLen/BlkLen));
- assign concat_inst_id_d = sfifo_bencack_pop ? sfifo_bencack_inst_id : concat_inst_id_q;
- assign concat_ccmd_d = sfifo_bencack_pop ? sfifo_bencack_ccmd : concat_ccmd_q;
+ assign concat_inst_id_d =
+ (!ctr_drbg_upd_enable_i) ? '0 :
+ sfifo_bencack_pop ? sfifo_bencack_inst_id :
+ concat_inst_id_q;
+
+ assign concat_ccmd_d =
+ (!ctr_drbg_upd_enable_i) ? '0 :
+ sfifo_bencack_pop ? sfifo_bencack_ccmd :
+ concat_ccmd_q;
//--------------------------------------------
// state machine to receive values from block_encrypt
diff --git a/hw/ip/csrng/rtl/csrng_main_sm.sv b/hw/ip/csrng/rtl/csrng_main_sm.sv
index 18f3c17..c8fc938 100644
--- a/hw/ip/csrng/rtl/csrng_main_sm.sv
+++ b/hw/ip/csrng/rtl/csrng_main_sm.sv
@@ -2,15 +2,15 @@
// Licensed under the Apache License, Version 2.0, see LICENSE for details.
// SPDX-License-Identifier: Apache-2.0
//
-// Description: csrng instantiation request state machine module
+// Description: csrng app cmd request state machine module
//
-// handles instantiation requests from all requesting interfaces
+// - handles all app cmd requests from all requesting interfaces
module csrng_main_sm import csrng_pkg::*; (
input logic clk_i,
input logic rst_ni,
- // ins req interface
+ input logic enable_i,
input logic acmd_avail_i,
output logic acmd_accept_o,
output logic acmd_hdr_capt_o,
@@ -192,6 +192,10 @@
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 23d74a1..2cd40a2 100644
--- a/hw/ip/csrng/rtl/csrng_state_db.sv
+++ b/hw/ip/csrng/rtl/csrng_state_db.sv
@@ -146,8 +146,8 @@
assign reg_rd_ptr_inc = state_db_reg_rd_sel_i;
assign reg_rd_ptr_d =
- !state_db_enable_i ? 4'hf :
- !state_db_lc_en_i ? 4'hf :
+ (!state_db_enable_i) ? 4'hf :
+ (!state_db_lc_en_i) ? 4'hf :
(reg_rd_ptr_q == 4'he) ? '0 :
state_db_reg_rd_id_pulse_i ? '0 :
reg_rd_ptr_inc ? (reg_rd_ptr_q+1) :
@@ -183,9 +183,17 @@
assign state_db_write = state_db_enable_i && state_db_wr_req_i;
- assign state_db_sts_ack_d = state_db_write;
- assign state_db_sts_sts_d = state_db_sts;
- assign state_db_sts_id_d = state_db_id;
+ 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;
assign state_db_sts_sts_o = state_db_sts_sts_q;