blob: d9e118490af1db6d3103c52469121955ff84e011 [file] [log] [blame]
// 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