[csrng/rtl] instantiate and generate bug fixes
Fixes rtl problems that now enable instantiate and generate to work.
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 e79749b..221e6dc 100644
--- a/hw/ip/csrng/rtl/csrng_block_encrypt.sv
+++ b/hw/ip/csrng/rtl/csrng_block_encrypt.sv
@@ -5,7 +5,7 @@
// Description: csrng block encrypt module
//
-module csrng_block_encrypt #(
+module csrng_block_encrypt import csrng_pkg::*; #(
parameter aes_pkg::sbox_impl_e SBoxImpl = aes_pkg::SBoxImplLut,
parameter int Cmd = 3,
parameter int StateId = 4,
@@ -70,11 +70,11 @@
assign prd_clearing[0] = '0;
- assign state_init[0] = aes_pkg::aes_transpose(block_encrypt_v_i);
+ assign state_init[0] = aes_pkg::aes_transpose({<<8{block_encrypt_v_i}});
- assign key_init[0] = block_encrypt_key_i;
+ assign key_init[0] = {<<8{block_encrypt_key_i}};
assign state_out = aes_pkg::aes_transpose(state_done[0]);
- assign cipher_data_out = state_out;
+ assign cipher_data_out = {<<8{state_out}};
//--------------------------------------------
diff --git a/hw/ip/csrng/rtl/csrng_cmd_stage.sv b/hw/ip/csrng/rtl/csrng_cmd_stage.sv
index f9fa396..e182e56 100644
--- a/hw/ip/csrng/rtl/csrng_cmd_stage.sv
+++ b/hw/ip/csrng/rtl/csrng_cmd_stage.sv
@@ -48,6 +48,7 @@
localparam int GenBitsFifoWidth = 1+128;
localparam int GenBitsFifoDepth = 1;
+ localparam int GenBitsCntrWidth = 19;
// signals
// command fifo
@@ -76,6 +77,7 @@
logic cmd_gen_cnt_dec;
logic cmd_gen_1st_req;
logic cmd_gen_inc_req;
+ logic cmd_gen_cnt_last;
logic cmd_final_ack;
// flops
@@ -83,7 +85,7 @@
logic cmd_ack_sts_q, cmd_ack_sts_d;
logic [3:0] cmd_len_q, cmd_len_d;
logic cmd_gen_flag_q, cmd_gen_flag_d;
- logic [18:0] cmd_gen_cnt_q, cmd_gen_cnt_d; // max_nuber_of_bits_per_request = 2^19
+ logic [GenBitsCntrWidth-1:0] cmd_gen_cnt_q, cmd_gen_cnt_d; // max_nuber_of_bits_per_request = 2^19
logic [11:0] cmd_gen_cmd_q, cmd_gen_cmd_d;
@@ -137,10 +139,11 @@
assign sfifo_cmd_pop = cs_enable_i && cmd_fifo_pop;
assign cmd_arb_bus_o =
- cmd_gen_inc_req ? {16'b0,cmd_stage_shid_i,cmd_gen_cmd_q} :
- cmd_gen_1st_req ? {16'b0,cmd_stage_shid_i,sfifo_cmd_rdata[11:0]} : // pad,id,f,clen,cmd
- cmd_arb_mop_o ? sfifo_cmd_rdata :
- '0;
+ cmd_gen_inc_req ? {15'b0,cmd_gen_cnt_last,cmd_stage_shid_i,cmd_gen_cmd_q} :
+ // pad,glast,id,f,clen,cmd
+ cmd_gen_1st_req ? {15'b0,cmd_gen_cnt_last,cmd_stage_shid_i,sfifo_cmd_rdata[11:0]} :
+ cmd_arb_mop_o ? sfifo_cmd_rdata :
+ '0;
assign cmd_stage_rdy_o = !sfifo_cmd_full;
@@ -239,6 +242,7 @@
cmd_gen_cnt_dec= 1'b0;
cmd_gen_1st_req = 1'b0;
cmd_gen_inc_req = 1'b0;
+ cmd_gen_cnt_last = 1'b0;
cmd_final_ack = 1'b0;
cmd_arb_req_o = 1'b0;
cmd_arb_sop_o = 1'b0;
@@ -257,6 +261,9 @@
cmd_gen_1st_req = 1'b1;
cmd_arb_sop_o = 1'b1;
cmd_fifo_pop = 1'b1;
+ if (sfifo_cmd_rdata[30:12] == 20'h00001) begin
+ cmd_gen_cnt_last = 1'b1;
+ end
if (cmd_len == '0) begin
cmd_arb_eop_o = 1'b1;
state_d = GenCmdChk;
@@ -306,6 +313,10 @@
cmd_arb_eop_o = 1'b1;
cmd_gen_inc_req = 1'b1;
state_d = GenCmdChk;
+ // check for final genbits beat
+ if (cmd_gen_cnt_q == GenBitsCntrWidth'(1)) begin
+ cmd_gen_cnt_last = 1'b1;
+ end
end
end
end
diff --git a/hw/ip/csrng/rtl/csrng_core.sv b/hw/ip/csrng/rtl/csrng_core.sv
index 9a0468a..a1f8436 100644
--- a/hw/ip/csrng/rtl/csrng_core.sv
+++ b/hw/ip/csrng/rtl/csrng_core.sv
@@ -101,6 +101,7 @@
logic [Cmd-1:0] cmd_result_ccmd;
logic cmd_result_ack_rdy;
logic [StateId-1:0] cmd_result_inst_id;
+ logic cmd_result_glast;
logic cmd_result_fips;
logic [SeedLen-1:0] cmd_result_adata;
logic [KeyLen-1:0] cmd_result_key;
@@ -114,6 +115,7 @@
logic gen_result_wr_req;
logic gen_result_ack_sts;
logic gen_result_ack_rdy;
+ logic [Cmd-1:0] gen_result_ccmd;
logic [StateId-1:0] gen_result_inst_id;
logic gen_result_fips;
logic [KeyLen-1:0] gen_result_key;
@@ -183,6 +185,7 @@
logic state_db_rd_fips;
logic [2:0] acmd_hold;
logic [3:0] shid;
+ logic gen_last;
logic flag0;
// blk encrypt arbiter
@@ -320,6 +323,7 @@
// flops
logic [2:0] acmd_q, acmd_d;
logic [3:0] shid_q, shid_d;
+ logic gen_last_q, gen_last_d;
logic flag0_q, flag0_d;
logic statedb_wr_select_q, statedb_wr_select_d;
logic genbits_stage_fips_sw_q, genbits_stage_fips_sw_d;
@@ -336,6 +340,7 @@
if (!rst_ni) begin
acmd_q <= '0;
shid_q <= '0;
+ gen_last_q <= '0;
flag0_q <= '0;
statedb_wr_select_q <= '0;
genbits_stage_fips_sw_q <= '0;
@@ -350,6 +355,7 @@
end else begin
acmd_q <= acmd_d;
shid_q <= shid_d;
+ gen_last_q <= gen_last_d;
flag0_q <= flag0_d;
statedb_wr_select_q <= statedb_wr_select_d;
genbits_stage_fips_sw_q <= genbits_stage_fips_sw_d;
@@ -817,6 +823,7 @@
assign acmd_hold = acmd_sop ? acmd_bus[2:0] : acmd_q;
assign flag0 = acmd_bus[8];
assign shid = acmd_bus[15:12];
+ assign gen_last = acmd_bus[16];
assign acmd_d =
(!cs_enable) ? '0 :
@@ -829,6 +836,11 @@
state_db_reg_rd_id_pulse ? state_db_reg_rd_id :
shid_q;
+ assign gen_last_d =
+ (!cs_enable) ? '0 :
+ acmd_sop ? gen_last :
+ gen_last_q;
+
assign flag0_d =
(!cs_enable) ? '0 :
acmd_sop ? flag0 :
@@ -974,8 +986,8 @@
// muxes for statedb block inputs
assign state_db_wr_req = gen_blk_select ? gen_result_wr_req : cmd_result_wr_req;
assign state_db_wr_inst_id = gen_blk_select ? gen_result_inst_id : cmd_result_inst_id;
- assign state_db_wr_fips = cmd_result_fips;
- assign state_db_wr_ccmd = cmd_result_ccmd;
+ assign state_db_wr_fips = gen_blk_select ? gen_result_fips : cmd_result_fips;
+ assign state_db_wr_ccmd = gen_blk_select ? gen_result_ccmd : cmd_result_ccmd;
assign state_db_wr_key = gen_blk_select ? gen_result_key : cmd_result_key;
assign state_db_wr_v = gen_blk_select ? gen_result_v : cmd_result_v;
assign state_db_wr_rc = gen_blk_select ? gen_result_rc : cmd_result_rc;
@@ -1058,6 +1070,7 @@
.ctr_drbg_cmd_rdy_o(ctr_drbg_cmd_req_rdy),
.ctr_drbg_cmd_ccmd_i(ctr_drbg_cmd_ccmd),
.ctr_drbg_cmd_inst_id_i(shid_q),
+ .ctr_drbg_cmd_glast_i(gen_last_q),
.ctr_drbg_cmd_entropy_i(cmd_entropy),
.ctr_drbg_cmd_entropy_fips_i(cmd_entropy_fips), // send to state_db
.ctr_drbg_cmd_adata_i(packer_adata),
@@ -1071,6 +1084,7 @@
.ctr_drbg_cmd_rdy_i(cmd_result_ack_rdy),
.ctr_drbg_cmd_ccmd_o(cmd_result_ccmd),
.ctr_drbg_cmd_inst_id_o(cmd_result_inst_id),
+ .ctr_drbg_cmd_glast_o(cmd_result_glast),
.ctr_drbg_cmd_fips_o(cmd_result_fips),
.ctr_drbg_cmd_adata_o(cmd_result_adata),
.ctr_drbg_cmd_key_o(cmd_result_key),
@@ -1316,6 +1330,7 @@
.ctr_drbg_gen_rdy_o(ctr_drbg_gen_req_rdy),
.ctr_drbg_gen_ccmd_i(cmd_result_ccmd),
.ctr_drbg_gen_inst_id_i(cmd_result_inst_id),
+ .ctr_drbg_gen_glast_i(cmd_result_glast),
.ctr_drbg_gen_fips_i(cmd_result_fips),
.ctr_drbg_gen_adata_i(cmd_result_adata),
.ctr_drbg_gen_key_i(cmd_result_key),
@@ -1325,7 +1340,7 @@
.ctr_drbg_gen_ack_o(gen_result_wr_req),
.ctr_drbg_gen_sts_o(gen_result_ack_sts),
.ctr_drbg_gen_rdy_i(gen_result_ack_rdy),
- .ctr_drbg_gen_ccmd_o(), // NC
+ .ctr_drbg_gen_ccmd_o(gen_result_ccmd),
.ctr_drbg_gen_inst_id_o(gen_result_inst_id),
.ctr_drbg_gen_fips_o(gen_result_fips),
.ctr_drbg_gen_key_o(gen_result_key),
diff --git a/hw/ip/csrng/rtl/csrng_ctr_drbg_cmd.sv b/hw/ip/csrng/rtl/csrng_ctr_drbg_cmd.sv
index 8fe0b2d..f71a51c 100644
--- a/hw/ip/csrng/rtl/csrng_ctr_drbg_cmd.sv
+++ b/hw/ip/csrng/rtl/csrng_ctr_drbg_cmd.sv
@@ -23,6 +23,7 @@
output logic ctr_drbg_cmd_rdy_o, // ready to process the req above
input logic [Cmd-1:0] ctr_drbg_cmd_ccmd_i, // current command
input logic [StateId-1:0] ctr_drbg_cmd_inst_id_i, // instantance id
+ input logic ctr_drbg_cmd_glast_i, // gen cmd last beat
input logic [SeedLen-1:0] ctr_drbg_cmd_entropy_i, // es entropy
input logic ctr_drbg_cmd_entropy_fips_i, // es entropy)fips
input logic [SeedLen-1:0] ctr_drbg_cmd_adata_i, // additional data
@@ -36,6 +37,7 @@
input logic ctr_drbg_cmd_rdy_i, // ready to process the ack above
output logic [Cmd-1:0] ctr_drbg_cmd_ccmd_o,
output logic [StateId-1:0] ctr_drbg_cmd_inst_id_o,
+ output logic ctr_drbg_cmd_glast_o,
output logic ctr_drbg_cmd_fips_o,
output logic [SeedLen-1:0] ctr_drbg_cmd_adata_o,
output logic [KeyLen-1:0] ctr_drbg_cmd_key_o,
@@ -64,16 +66,17 @@
);
localparam int CmdreqFifoDepth = 1;
- localparam int CmdreqFifoWidth = KeyLen+BlkLen+CtrLen+1+2*SeedLen+StateId+Cmd;
+ localparam int CmdreqFifoWidth = KeyLen+BlkLen+CtrLen+1+2*SeedLen+1+StateId+Cmd;
localparam int RCStageFifoDepth = 1;
- localparam int RCStageFifoWidth = KeyLen+BlkLen+StateId+CtrLen+1+SeedLen+Cmd;
+ localparam int RCStageFifoWidth = KeyLen+BlkLen+StateId+CtrLen+1+SeedLen+1+Cmd;
localparam int KeyVRCFifoDepth = 1;
- localparam int KeyVRCFifoWidth = KeyLen+BlkLen+CtrLen+1+SeedLen+StateId+Cmd;
+ localparam int KeyVRCFifoWidth = KeyLen+BlkLen+CtrLen+1+SeedLen+1+StateId+Cmd;
// signals
logic [Cmd-1:0] cmdreq_ccmd;
logic [StateId-1:0] cmdreq_id;
+ logic cmdreq_glast;
logic [SeedLen-1:0] cmdreq_entropy;
logic cmdreq_entropy_fips;
logic [SeedLen-1:0] cmdreq_adata;
@@ -91,6 +94,7 @@
logic [StateId-1:0] rcstage_id;
logic [CtrLen-1:0] rcstage_rc;
logic [Cmd-1:0] rcstage_ccmd;
+ logic rcstage_glast;
logic [SeedLen-1:0] rcstage_adata;
logic rcstage_fips;
logic fips_modified;
@@ -159,6 +163,7 @@
assign sfifo_cmdreq_wdata = {ctr_drbg_cmd_key_i,ctr_drbg_cmd_v_i,
ctr_drbg_cmd_rc_i,fips_modified,
ctr_drbg_cmd_entropy_i,ctr_drbg_cmd_adata_i,
+ ctr_drbg_cmd_glast_i,
ctr_drbg_cmd_inst_id_i,ctr_drbg_cmd_ccmd_i};
assign sfifo_cmdreq_push = ctr_drbg_cmd_enable_i && ctr_drbg_cmd_req_i;
@@ -168,7 +173,7 @@
assign {cmdreq_key,cmdreq_v,cmdreq_rc,
cmdreq_entropy_fips,cmdreq_entropy,cmdreq_adata,
- cmdreq_id,cmdreq_ccmd} = sfifo_cmdreq_rdata;
+ cmdreq_glast,cmdreq_id,cmdreq_ccmd} = sfifo_cmdreq_rdata;
assign ctr_drbg_cmd_rdy_o = !sfifo_cmdreq_full;
@@ -210,8 +215,7 @@
(cmdreq_ccmd == UPD) ? cmdreq_rc :
'0;
- assign prep_gen_adata_null = (cmdreq_ccmd == GEN) && (cmdreq_adata == '0) &&
- sfifo_cmdreq_not_empty;
+ assign prep_gen_adata_null = (cmdreq_ccmd == GEN) && (cmdreq_adata == '0);
assign gen_adata_null_d = prep_gen_adata_null;
@@ -250,10 +254,10 @@
assign sfifo_rcstage_push = sfifo_cmdreq_pop;
assign sfifo_rcstage_wdata = {prep_key,prep_v,cmdreq_id,prep_rc,cmdreq_entropy_fips,
- cmdreq_adata,cmdreq_ccmd};
+ cmdreq_adata,cmdreq_glast,cmdreq_ccmd};
assign sfifo_rcstage_pop = sfifo_rcstage_not_empty && (upd_cmd_ack_i || gen_adata_null_q);
assign {rcstage_key,rcstage_v,rcstage_id,rcstage_rc,rcstage_fips,
- rcstage_adata,rcstage_ccmd} = sfifo_rcstage_rdata;
+ rcstage_adata,rcstage_glast,rcstage_ccmd} = sfifo_rcstage_rdata;
assign ctr_drbg_cmd_sfifo_rcstage_err_o =
@@ -290,16 +294,16 @@
// if a UNI command, reset the state values
assign sfifo_keyvrc_wdata = (rcstage_ccmd == UNI) ?
- {{(KeyLen+BlkLen+CtrLen+1+SeedLen){1'b0}},upd_cmd_inst_id_i,upd_cmd_ccmd_i} :
+ {{(KeyLen+BlkLen+CtrLen+1+SeedLen){1'b0}},rcstage_glast,upd_cmd_inst_id_i,upd_cmd_ccmd_i} :
gen_adata_null_q ?
{rcstage_key,rcstage_v,rcstage_rc,rcstage_fips,
- rcstage_adata,rcstage_id,rcstage_ccmd} :
+ rcstage_adata,rcstage_glast,rcstage_id,rcstage_ccmd} :
{upd_cmd_key_i,upd_cmd_v_i,rcstage_rc,rcstage_fips,
- rcstage_adata,upd_cmd_inst_id_i,upd_cmd_ccmd_i};
+ rcstage_adata,rcstage_glast,upd_cmd_inst_id_i,upd_cmd_ccmd_i};
assign sfifo_keyvrc_pop = ctr_drbg_cmd_rdy_i && sfifo_keyvrc_not_empty;
assign {ctr_drbg_cmd_key_o,ctr_drbg_cmd_v_o,ctr_drbg_cmd_rc_o,
- ctr_drbg_cmd_fips_o,ctr_drbg_cmd_adata_o,
+ ctr_drbg_cmd_fips_o,ctr_drbg_cmd_adata_o,ctr_drbg_cmd_glast_o,
ctr_drbg_cmd_inst_id_o,ctr_drbg_cmd_ccmd_o} = sfifo_keyvrc_rdata;
assign ctr_drbg_cmd_sfifo_keyvrc_err_o =
diff --git a/hw/ip/csrng/rtl/csrng_ctr_drbg_gen.sv b/hw/ip/csrng/rtl/csrng_ctr_drbg_gen.sv
index 9068f64..e68483c 100644
--- a/hw/ip/csrng/rtl/csrng_ctr_drbg_gen.sv
+++ b/hw/ip/csrng/rtl/csrng_ctr_drbg_gen.sv
@@ -25,6 +25,7 @@
output logic ctr_drbg_gen_rdy_o, // ready to process the req above
input logic [Cmd-1:0] ctr_drbg_gen_ccmd_i, // current command
input logic [StateId-1:0] ctr_drbg_gen_inst_id_i, // instantance id
+ input logic ctr_drbg_gen_glast_i, // gen cmd last beat
input logic ctr_drbg_gen_fips_i, // fips
input logic [SeedLen-1:0] ctr_drbg_gen_adata_i, // additional data
input logic [KeyLen-1:0] ctr_drbg_gen_key_i,
@@ -83,19 +84,20 @@
);
localparam int GenreqFifoDepth = 1;
- localparam int GenreqFifoWidth = KeyLen+BlkLen+CtrLen+1+SeedLen+StateId+Cmd;
+ localparam int GenreqFifoWidth = KeyLen+BlkLen+CtrLen+1+SeedLen+1+StateId+Cmd;
localparam int BlkEncAckFifoDepth = 1;
localparam int BlkEncAckFifoWidth = BlkLen+StateId+Cmd;
localparam int AdstageFifoDepth = 1;
- localparam int AdstageFifoWidth = KeyLen+BlkLen+CtrLen+1+SeedLen;
+ localparam int AdstageFifoWidth = KeyLen+BlkLen+CtrLen+1+SeedLen+1;
localparam int RCStageFifoDepth = 1;
- localparam int RCStageFifoWidth = BlkLen+CtrLen+1;
+ localparam int RCStageFifoWidth = KeyLen+BlkLen+BlkLen+CtrLen+1+1+StateId+Cmd;
localparam int GenbitsFifoDepth = 1;
localparam int GenbitsFifoWidth = 1+BlkLen+KeyLen+BlkLen+CtrLen+StateId+Cmd;
// signals
logic [Cmd-1:0] genreq_ccmd;
logic [StateId-1:0] genreq_id;
+ logic genreq_glast;
logic [SeedLen-1:0] genreq_adata;
logic genreq_fips;
logic [KeyLen-1:0] genreq_key;
@@ -106,12 +108,18 @@
logic [BlkLen-1:0] adstage_v;
logic [CtrLen-1:0] adstage_rc;
logic adstage_fips;
+ logic adstage_glast;
logic [SeedLen-1:0] adstage_adata;
+ logic [KeyLen-1:0] rcstage_key;
+ logic [BlkLen-1:0] rcstage_v;
logic [BlkLen-1:0] rcstage_bits;
logic [CtrLen-1:0] rcstage_rc;
+ logic rcstage_glast;
logic rcstage_fips;
logic [CtrLen-1:0] rcstage_rc_plus1;
+ logic [Cmd-1:0] rcstage_ccmd;
+ logic [StateId-1:0] rcstage_inst_id;
logic [Cmd-1:0] genreq_ccmd_modified;
logic [Cmd-1:0] bencack_ccmd_modified;
@@ -254,13 +262,13 @@
assign genreq_ccmd_modified = (ctr_drbg_gen_ccmd_i == GEN) ? GENB : INV;
assign sfifo_genreq_wdata = {ctr_drbg_gen_key_i,ctr_drbg_gen_v_i,ctr_drbg_gen_rc_i,
- ctr_drbg_gen_fips_i,ctr_drbg_gen_adata_i,
+ ctr_drbg_gen_fips_i,ctr_drbg_gen_adata_i,ctr_drbg_gen_glast_i,
ctr_drbg_gen_inst_id_i,genreq_ccmd_modified};
assign sfifo_genreq_push = ctr_drbg_gen_enable_i && ctr_drbg_gen_req_i;
assign {genreq_key,genreq_v,genreq_rc,
- genreq_fips,genreq_adata,
+ genreq_fips,genreq_adata,genreq_glast,
genreq_id,genreq_ccmd} = sfifo_genreq_rdata;
assign ctr_drbg_gen_rdy_o = !sfifo_genreq_full;
@@ -381,9 +389,10 @@
.depth_o ()
);
- assign sfifo_adstage_wdata = {genreq_key,v_sized,genreq_rc,genreq_fips,genreq_adata};
+ assign sfifo_adstage_wdata = {genreq_key,v_sized,genreq_rc,genreq_fips,genreq_adata,genreq_glast};
assign sfifo_adstage_pop = sfifo_adstage_not_empty && sfifo_bencack_pop;
- assign {adstage_key,adstage_v,adstage_rc,adstage_fips,adstage_adata} = sfifo_adstage_rdata;
+ assign {adstage_key,adstage_v,adstage_rc,adstage_fips,
+ adstage_adata,adstage_glast} = sfifo_adstage_rdata;
assign ctr_drbg_gen_sfifo_gadstage_err_o =
{(sfifo_adstage_push && sfifo_adstage_full),
@@ -421,7 +430,8 @@
assign sfifo_bencack_wdata = {block_encrypt_v_i,block_encrypt_inst_id_i,bencack_ccmd_modified};
assign block_encrypt_rdy_o = !sfifo_bencack_full;
- assign sfifo_bencack_pop = !sfifo_rcstage_full && sfifo_bencack_not_empty && upd_gen_rdy_i;
+ assign sfifo_bencack_pop = !sfifo_rcstage_full && sfifo_bencack_not_empty &&
+ (upd_gen_rdy_i || !adstage_glast);
assign {sfifo_bencack_bits,sfifo_bencack_inst_id,sfifo_bencack_ccmd} = sfifo_bencack_rdata;
@@ -436,7 +446,7 @@
//--------------------------------------------
// send to the update block
- assign gen_upd_req_o = sfifo_bencack_not_empty;
+ assign gen_upd_req_o = sfifo_bencack_not_empty && adstage_glast;
assign gen_upd_ccmd_o = sfifo_bencack_ccmd;
assign gen_upd_inst_id_o = sfifo_bencack_inst_id;
assign gen_upd_pdata_o = adstage_adata;
@@ -469,9 +479,14 @@
);
assign sfifo_rcstage_push = sfifo_adstage_pop;
- assign sfifo_rcstage_wdata = {sfifo_bencack_bits,adstage_rc,adstage_fips};
- assign sfifo_rcstage_pop = sfifo_rcstage_not_empty && upd_gen_ack_i;
- assign {rcstage_bits,rcstage_rc,rcstage_fips} = sfifo_rcstage_rdata;
+ assign sfifo_rcstage_wdata = {adstage_key,adstage_v,sfifo_bencack_bits,
+ adstage_rc,adstage_fips,adstage_glast,
+ sfifo_bencack_inst_id,sfifo_bencack_ccmd};
+
+ assign sfifo_rcstage_pop = sfifo_rcstage_not_empty && (upd_gen_ack_i || !rcstage_glast);
+
+ assign {rcstage_key,rcstage_v,rcstage_bits,rcstage_rc,rcstage_fips,rcstage_glast,
+ rcstage_inst_id,rcstage_ccmd} = sfifo_rcstage_rdata;
assign ctr_drbg_gen_sfifo_grcstage_err_o =
@@ -509,9 +524,11 @@
assign rcstage_rc_plus1 = (rcstage_rc+1);
- assign sfifo_genbits_wdata =
- {rcstage_fips,rcstage_bits,upd_gen_key_i,upd_gen_v_i,
- rcstage_rc_plus1,upd_gen_inst_id_i,upd_gen_ccmd_i};
+ assign sfifo_genbits_wdata = rcstage_glast ?
+ {rcstage_fips,rcstage_bits,upd_gen_key_i,upd_gen_v_i,
+ rcstage_rc_plus1,upd_gen_inst_id_i,upd_gen_ccmd_i} :
+ {rcstage_fips,rcstage_bits,rcstage_key,rcstage_v,
+ rcstage_rc,rcstage_inst_id,rcstage_ccmd};
assign sfifo_genbits_pop = ctr_drbg_gen_rdy_i && sfifo_genbits_not_empty;
assign {ctr_drbg_gen_fips_o,ctr_drbg_gen_bits_o,
diff --git a/hw/ip/csrng/rtl/csrng_state_db.sv b/hw/ip/csrng/rtl/csrng_state_db.sv
index bb9ab02..c3b1dd0 100644
--- a/hw/ip/csrng/rtl/csrng_state_db.sv
+++ b/hw/ip/csrng/rtl/csrng_state_db.sv
@@ -180,7 +180,7 @@
assign instance_status =
(state_db_wr_ccmd_i == INS) ||
(state_db_wr_ccmd_i == RES) ||
- (state_db_wr_ccmd_i == GEN) ||
+ (state_db_wr_ccmd_i == GENU) ||
(state_db_wr_ccmd_i == UPD);