| // Copyright lowRISC contributors. |
| // Licensed under the Apache License, Version 2.0, see LICENSE for details. |
| // SPDX-License-Identifier: Apache-2.0 |
| // |
| // Description: csrng command tracking state machine module |
| // |
| // provides debugging of command flow through csrng |
| |
| module csrng_track_sm import csrng_pkg::*; #( |
| parameter int Cmd = 3, |
| parameter int StateId = 4 |
| ) ( |
| input logic clk_i, |
| input logic rst_ni, |
| |
| // ins req interface |
| input logic [StateId-1:0] inst_id_i, |
| input logic acmd_hdr_capt_i, |
| input logic [Cmd-1:0] acmd_i, |
| input logic [StateId-1:0] shid_i, |
| input logic ctr_drbg_cmd_req_i, |
| input logic ctr_drbg_cmd_req_rdy_i, |
| input logic [Cmd-1:0] ctr_drbg_cmd_ccmd_i, |
| input logic [StateId-1:0] ctr_drbg_cmd_inst_id_i, |
| input logic updblk_arb_vld_i, |
| input logic updblk_arb_rdy_i, |
| input logic [Cmd-1:0] updblk_arb_ccmd_i, |
| input logic [StateId-1:0] updblk_arb_inst_id_i, |
| input logic benblk_arb_vld_i, |
| input logic benblk_arb_rdy_i, |
| input logic [Cmd-1:0] benblk_arb_ccmd_i, |
| input logic [StateId-1:0] benblk_arb_inst_id_i, |
| input logic benblk_updblk_ack_i, |
| input logic updblk_benblk_ack_rdy_i, |
| input logic [Cmd-1:0] benblk_cmd_i, |
| input logic [StateId-1:0] benblk_inst_id_i, |
| input logic updblk_cmdblk_ack_i, |
| input logic cmdblk_updblk_ack_rdy_i, |
| input logic [Cmd-1:0] updblk_cmdblk_ccmd_i, |
| input logic [StateId-1:0] updblk_cmdblk_inst_id_i, |
| input logic ctr_drbg_gen_req_i, |
| input logic ctr_drbg_gen_req_rdy_i, |
| input logic [Cmd-1:0] ctr_drbg_gen_ccmd_i, |
| input logic [StateId-1:0] ctr_drbg_gen_inst_id_i, |
| input logic benblk_genblk_ack_i, |
| input logic genblk_benblk_ack_rdy_i, |
| input logic updblk_genblk_ack_i, |
| input logic genblk_updblk_ack_rdy_i, |
| input logic [Cmd-1:0] updblk_ccmd_i, |
| input logic [StateId-1:0] updblk_inst_id_i, |
| input logic state_db_wr_req_i, |
| input logic state_db_wr_req_rdy_i, |
| input logic genbits_stage_vld_i, |
| input logic genbits_stage_rdy_i, |
| input logic [Cmd-1:0] state_db_wr_ccmd_i, |
| input logic [StateId-1:0] state_db_wr_inst_id_i, |
| input logic cmd_core_ack_i, |
| input logic cmd_stage_ack_i, |
| output logic [7:0] track_sm_o |
| ); |
| |
| // signals |
| logic ben_ack_cntr_inc; |
| logic ben_ack_cntr_clr; |
| |
| // flops |
| logic [1:0] ben_ack_cntr_q, ben_ack_cntr_d; |
| |
| |
| localparam int StateWidth = 8; |
| typedef enum logic [StateWidth-1:0] { |
| Idle = 8'h00, |
| InsCmdCap = 8'h11, |
| InsDrbgCmdIn = 8'h12, |
| InsDrbgUpdIn = 8'h13, |
| InsBlkEncIn = 8'h14, |
| InsDrbgCmdRtn = 8'h15, |
| InsStateDBIn = 8'h16, |
| InsCmdStageRtn = 8'h17, |
| InsAppCmdBus = 8'h18, |
| |
| ResCmdCap = 8'h21, |
| ResDrbgCmdIn = 8'h22, |
| ResDrbgUpdIn = 8'h23, |
| ResBlkEncIn = 8'h24, |
| ResDrbgCmdRtn = 8'h25, |
| ResStateDBIn = 8'h26, |
| ResCmdStageRtn = 8'h27, |
| ResAppCmdBus = 8'h28, |
| |
| GenCmdCap = 8'h31, |
| GenDrbgCmdIn = 8'h32, |
| GenDrbgUpd1In = 8'h33, |
| GenBlkEnc1In = 8'h34, |
| GenDrbgUpd1Rtn = 8'h35, |
| GenDrbgCmd1Rtn = 8'h36, |
| GenDrbgGenIn = 8'h37, |
| GenDrbgUpd2In = 8'h38, |
| GenBlkEnc2In = 8'h39, |
| GenDrbgUpd2Rtn = 8'h3a, |
| GenDrbgGen1Rtn = 8'h3b, |
| GenBlkEnc3In = 8'h3c, |
| GenDrbgGen2Rtn = 8'h3d, |
| GenStateDBIn = 8'h3e, |
| GenAppCmdBus = 8'h3f, |
| |
| UpdCmdCap = 8'h41, |
| UpdDrbgCmdIn = 8'h42, |
| UpdDrbgUpdIn = 8'h43, |
| UpdBlkEncIn = 8'h44, |
| UpdDrbgCmdRtn = 8'h45, |
| UpdStateDBIn = 8'h46, |
| UpdCmdStageRtn = 8'h47, |
| UpdAppCmdBus = 8'h48, |
| |
| UniCmdCap = 8'h51, |
| UniDrbgCmdIn = 8'h52, |
| UniDrbgUpdIn = 8'h53, |
| UniBlkEncIn = 8'h54, |
| UniDrbgCmdRtn = 8'h55, |
| UniStateDBIn = 8'h56, |
| UniCmdStageRtn = 8'h57, |
| UniAppCmdBus = 8'h58 |
| } state_e; |
| |
| state_e state_d, state_q; |
| |
| logic [StateWidth-1:0] state_raw_q; |
| |
| // This primitive is used to place a size-only constraint on the |
| // flops in order to prevent FSM state encoding optimizations. |
| prim_flop #( |
| .Width(StateWidth), |
| .ResetValue(StateWidth'(Idle)) |
| ) u_state_regs ( |
| .clk_i, |
| .rst_ni, |
| .d_i ( state_d ), |
| .q_o ( state_raw_q ) |
| ); |
| |
| always_ff @(posedge clk_i or negedge rst_ni) |
| if (!rst_ni) begin |
| ben_ack_cntr_q <= '0; |
| end else begin |
| ben_ack_cntr_q <= ben_ack_cntr_d; |
| end |
| |
| assign ben_ack_cntr_d = ben_ack_cntr_inc ? (ben_ack_cntr_q+1) : |
| ben_ack_cntr_clr ? '0 : |
| ben_ack_cntr_q; |
| |
| assign state_q = state_e'(state_raw_q); |
| assign track_sm_o = state_raw_q; |
| |
| always_comb begin |
| state_d = state_q; |
| ben_ack_cntr_inc = 1'b0; |
| ben_ack_cntr_clr = 1'b0; |
| unique case (state_q) |
| Idle: begin |
| if (acmd_hdr_capt_i && (inst_id_i == shid_i)) begin |
| if (acmd_i == INS) begin |
| state_d = InsCmdCap; |
| end else if (acmd_i == RES) begin |
| state_d = ResCmdCap; |
| end else if (acmd_i == GEN) begin |
| state_d = GenCmdCap; |
| end else if (acmd_i == UPD) begin |
| state_d = UpdCmdCap; |
| end else if (acmd_i == UNI) begin |
| state_d = UniCmdCap; |
| end |
| end |
| end |
| //-Start of Ins Cmd----------------------------------------------------------------- |
| InsCmdCap: begin |
| state_d = InsDrbgCmdIn; |
| end |
| InsDrbgCmdIn: begin |
| if (ctr_drbg_cmd_req_i && ctr_drbg_cmd_req_rdy_i && |
| (ctr_drbg_cmd_ccmd_i == INS) && (ctr_drbg_cmd_inst_id_i == inst_id_i)) begin |
| state_d = InsDrbgUpdIn; |
| end |
| end |
| InsDrbgUpdIn: begin |
| if (updblk_arb_vld_i && updblk_arb_rdy_i && |
| (updblk_arb_ccmd_i == INS) && (updblk_arb_inst_id_i == inst_id_i)) begin |
| state_d = InsBlkEncIn; |
| end |
| end |
| InsBlkEncIn: begin |
| if (benblk_arb_vld_i && benblk_arb_rdy_i && |
| (benblk_arb_ccmd_i == INS) && (benblk_arb_inst_id_i == inst_id_i)) begin |
| state_d = InsDrbgCmdRtn; |
| end |
| end |
| InsDrbgCmdRtn: begin |
| if (updblk_cmdblk_ack_i && cmdblk_updblk_ack_rdy_i && |
| (updblk_cmdblk_ccmd_i == INS) && (updblk_cmdblk_inst_id_i == inst_id_i)) begin |
| state_d = InsStateDBIn; |
| end |
| end |
| InsStateDBIn: begin |
| if (state_db_wr_req_i && state_db_wr_req_rdy_i && |
| (state_db_wr_ccmd_i == INS) && (state_db_wr_inst_id_i == inst_id_i)) begin |
| state_d = InsCmdStageRtn; |
| end |
| end |
| InsCmdStageRtn: begin |
| if (cmd_core_ack_i) begin |
| state_d = InsAppCmdBus; |
| end |
| end |
| InsAppCmdBus: begin |
| if (cmd_stage_ack_i) begin |
| state_d = Idle; |
| end |
| end |
| //-Start of Res Cmd----------------------------------------------------------------- |
| ResCmdCap: begin |
| state_d = ResDrbgCmdIn; |
| end |
| ResDrbgCmdIn: begin |
| if (ctr_drbg_cmd_req_i && ctr_drbg_cmd_req_rdy_i && |
| (ctr_drbg_cmd_ccmd_i == RES) && (ctr_drbg_cmd_inst_id_i == inst_id_i)) begin |
| state_d = ResDrbgUpdIn; |
| end |
| end |
| ResDrbgUpdIn: begin |
| if (updblk_arb_vld_i && updblk_arb_rdy_i && |
| (updblk_arb_ccmd_i == RES) && (updblk_arb_inst_id_i == inst_id_i)) begin |
| state_d = ResBlkEncIn; |
| end |
| end |
| ResBlkEncIn: begin |
| if (benblk_arb_vld_i && benblk_arb_rdy_i && |
| (benblk_arb_ccmd_i == RES) && (benblk_arb_inst_id_i == inst_id_i)) begin |
| state_d = ResDrbgCmdRtn; |
| end |
| end |
| ResDrbgCmdRtn: begin |
| if (updblk_cmdblk_ack_i && cmdblk_updblk_ack_rdy_i && |
| (updblk_cmdblk_ccmd_i == RES) && (updblk_cmdblk_inst_id_i == inst_id_i)) begin |
| state_d = ResStateDBIn; |
| end |
| end |
| ResStateDBIn: begin |
| if (state_db_wr_req_i && state_db_wr_req_rdy_i && |
| (state_db_wr_ccmd_i == RES) && (state_db_wr_inst_id_i == inst_id_i)) begin |
| state_d = ResCmdStageRtn; |
| end |
| end |
| ResCmdStageRtn: begin |
| if (cmd_core_ack_i) begin |
| state_d = ResAppCmdBus; |
| end |
| end |
| ResAppCmdBus: begin |
| if (cmd_stage_ack_i) begin |
| state_d = Idle; |
| end |
| end |
| //-Start of Gen Cmd----------------------------------------------------------------- |
| GenCmdCap: begin |
| state_d = GenDrbgCmdIn; |
| end |
| GenDrbgCmdIn: begin |
| if (ctr_drbg_cmd_req_i && ctr_drbg_cmd_req_rdy_i && |
| (ctr_drbg_cmd_ccmd_i == GEN) && (ctr_drbg_cmd_inst_id_i == inst_id_i)) begin |
| state_d = GenDrbgUpd1In; |
| end |
| end |
| GenDrbgUpd1In: begin |
| if (updblk_arb_vld_i && updblk_arb_rdy_i && |
| (updblk_arb_ccmd_i == GEN) && (updblk_arb_inst_id_i == inst_id_i)) begin |
| state_d = GenBlkEnc1In; |
| end |
| end |
| GenBlkEnc1In: begin |
| if (benblk_arb_vld_i && benblk_arb_rdy_i && |
| (benblk_arb_ccmd_i == GEN) && (benblk_arb_inst_id_i == inst_id_i)) begin |
| state_d = GenDrbgUpd1Rtn; |
| end |
| end |
| GenDrbgUpd1Rtn: begin // wait for 3 acks |
| if (benblk_updblk_ack_i && updblk_benblk_ack_rdy_i && |
| (benblk_cmd_i == GEN) && (benblk_inst_id_i == inst_id_i)) begin |
| if (ben_ack_cntr_q != 2) begin |
| ben_ack_cntr_inc = 1'b1; |
| end else begin |
| ben_ack_cntr_clr = 1'b1; |
| state_d = GenDrbgCmd1Rtn; |
| end |
| end |
| end |
| GenDrbgCmd1Rtn: begin |
| if (updblk_cmdblk_ack_i && cmdblk_updblk_ack_rdy_i && |
| (updblk_cmdblk_ccmd_i == GEN) && (updblk_cmdblk_inst_id_i == inst_id_i)) begin |
| state_d = GenDrbgGenIn; |
| end |
| end |
| GenDrbgGenIn: begin |
| if (ctr_drbg_gen_req_i && ctr_drbg_gen_req_rdy_i && |
| (ctr_drbg_gen_ccmd_i == GEN) && (ctr_drbg_gen_inst_id_i == inst_id_i)) begin |
| state_d = GenBlkEnc2In; |
| end |
| end |
| GenBlkEnc2In: begin |
| if (benblk_arb_vld_i && benblk_arb_rdy_i && |
| (benblk_arb_ccmd_i == GENB) && (benblk_arb_inst_id_i == inst_id_i)) begin |
| state_d = GenDrbgGen1Rtn; |
| end |
| end |
| GenDrbgGen1Rtn: begin |
| if (benblk_genblk_ack_i && genblk_benblk_ack_rdy_i && |
| (benblk_cmd_i == GENB) && (benblk_inst_id_i == inst_id_i)) begin |
| state_d = GenDrbgUpd2In; |
| end |
| end |
| GenDrbgUpd2In: begin |
| if (updblk_arb_vld_i && updblk_arb_rdy_i && |
| (updblk_arb_ccmd_i == GENU) && (updblk_arb_inst_id_i == inst_id_i)) begin |
| state_d = GenBlkEnc3In; |
| end |
| end |
| GenBlkEnc3In: begin |
| if (benblk_arb_vld_i && benblk_arb_rdy_i && |
| (benblk_arb_ccmd_i == GENU) && (benblk_arb_inst_id_i == inst_id_i)) begin |
| state_d = GenDrbgUpd2Rtn; |
| end |
| end |
| GenDrbgUpd2Rtn: begin // wait for 3 acks |
| if (benblk_updblk_ack_i && updblk_benblk_ack_rdy_i && |
| (benblk_cmd_i == GENU) && (benblk_inst_id_i == inst_id_i)) begin |
| if (ben_ack_cntr_q != 2) begin |
| ben_ack_cntr_inc = 1'b1; |
| end else begin |
| ben_ack_cntr_clr = 1'b1; |
| state_d = GenDrbgGen2Rtn; |
| end |
| end |
| end |
| GenDrbgGen2Rtn: begin |
| if (updblk_genblk_ack_i && genblk_updblk_ack_rdy_i && |
| (updblk_ccmd_i == GENU) && (updblk_inst_id_i == inst_id_i)) begin |
| state_d = GenStateDBIn; |
| end |
| end |
| GenStateDBIn: begin |
| if (state_db_wr_req_i && state_db_wr_req_rdy_i && |
| (state_db_wr_ccmd_i == GEN) && (state_db_wr_inst_id_i == inst_id_i)) begin |
| state_d = GenAppCmdBus; |
| end |
| end |
| GenAppCmdBus: begin |
| if (genbits_stage_vld_i && genbits_stage_rdy_i) begin |
| state_d = Idle; |
| end |
| end |
| //-Start of Upd Cmd----------------------------------------------------------------- |
| UpdCmdCap: begin |
| state_d = UpdDrbgCmdIn; |
| end |
| UpdDrbgCmdIn: begin |
| if (ctr_drbg_cmd_req_i && ctr_drbg_cmd_req_rdy_i && |
| (ctr_drbg_cmd_ccmd_i == UPD) && (ctr_drbg_cmd_inst_id_i == inst_id_i)) begin |
| state_d = UpdDrbgUpdIn; |
| end |
| end |
| UpdDrbgUpdIn: begin |
| if (updblk_arb_vld_i && updblk_arb_rdy_i && |
| (updblk_arb_ccmd_i == UPD) && (updblk_arb_inst_id_i == inst_id_i)) begin |
| state_d = UpdBlkEncIn; |
| end |
| end |
| UpdBlkEncIn: begin |
| if (benblk_arb_vld_i && benblk_arb_rdy_i && |
| (benblk_arb_ccmd_i == UPD) && (benblk_arb_inst_id_i == inst_id_i)) begin |
| state_d = UpdDrbgCmdRtn; |
| end |
| end |
| UpdDrbgCmdRtn: begin |
| if (updblk_cmdblk_ack_i && cmdblk_updblk_ack_rdy_i && |
| (updblk_cmdblk_ccmd_i == UPD) && (updblk_cmdblk_inst_id_i == inst_id_i)) begin |
| state_d = UpdStateDBIn; |
| end |
| end |
| UpdStateDBIn: begin |
| if (state_db_wr_req_i && state_db_wr_req_rdy_i && |
| (state_db_wr_ccmd_i == UPD) && (state_db_wr_inst_id_i == inst_id_i)) begin |
| state_d = UpdCmdStageRtn; |
| end |
| end |
| UpdCmdStageRtn: begin |
| if (cmd_core_ack_i) begin |
| state_d = UpdAppCmdBus; |
| end |
| end |
| UpdAppCmdBus: begin |
| if (cmd_stage_ack_i) begin |
| state_d = Idle; |
| end |
| end |
| //-Start of Uni Cmd----------------------------------------------------------------- |
| UniCmdCap: begin |
| state_d = UniDrbgCmdIn; |
| end |
| UniDrbgCmdIn: begin |
| if (ctr_drbg_cmd_req_i && ctr_drbg_cmd_req_rdy_i && |
| (ctr_drbg_cmd_ccmd_i == UNI) && (ctr_drbg_cmd_inst_id_i == inst_id_i)) begin |
| state_d = UniDrbgUpdIn; |
| end |
| end |
| UniDrbgUpdIn: begin |
| if (updblk_arb_vld_i && updblk_arb_rdy_i && |
| (updblk_arb_ccmd_i == UNI) && (updblk_arb_inst_id_i == inst_id_i)) begin |
| state_d = UniBlkEncIn; |
| end |
| end |
| UniBlkEncIn: begin |
| if (benblk_arb_vld_i && benblk_arb_rdy_i && |
| (benblk_arb_ccmd_i == UNI) && (benblk_arb_inst_id_i == inst_id_i)) begin |
| state_d = UniDrbgCmdRtn; |
| end |
| end |
| UniDrbgCmdRtn: begin |
| if (updblk_cmdblk_ack_i && cmdblk_updblk_ack_rdy_i && |
| (updblk_cmdblk_ccmd_i == UNI) && (updblk_cmdblk_inst_id_i == inst_id_i)) begin |
| state_d = UniStateDBIn; |
| end |
| end |
| UniStateDBIn: begin |
| if (state_db_wr_req_i && state_db_wr_req_rdy_i && |
| (state_db_wr_ccmd_i == UNI) && (state_db_wr_inst_id_i == inst_id_i)) begin |
| state_d = UniCmdStageRtn; |
| end |
| end |
| UniCmdStageRtn: begin |
| if (cmd_core_ack_i) begin |
| state_d = UniAppCmdBus; |
| end |
| end |
| UniAppCmdBus: begin |
| if (cmd_stage_ack_i) begin |
| state_d = Idle; |
| end |
| end |
| default: state_d = Idle; |
| endcase |
| end |
| |
| endmodule |