blob: bb9ab02420c78615c27b46bfdda810c13c1fe8d5 [file] [log] [blame]
Mark Branstad12ba5ff2020-10-16 13:25:46 -07001// Copyright lowRISC contributors.
2// Licensed under the Apache License, Version 2.0, see LICENSE for details.
3// SPDX-License-Identifier: Apache-2.0
4//
5// Description: csrng state data base module
6//
7// This is the container for accessing the current
8// working state for a given drbg instance.
9
Mark Branstad3ff42872020-12-15 15:18:28 -080010`include "prim_assert.sv"
11
Mark Branstad12ba5ff2020-10-16 13:25:46 -070012module csrng_state_db import csrng_pkg::*; #(
Mark Branstad33e387f2020-11-06 15:00:34 -080013 parameter int NApps = 4,
14 parameter int StateId = 4,
15 parameter int BlkLen = 128,
16 parameter int KeyLen = 256,
17 parameter int CtrLen = 32,
18 parameter int Cmd = 3
Mark Branstad12ba5ff2020-10-16 13:25:46 -070019) (
20 input logic clk_i,
21 input logic rst_ni,
22
23 // read interface
24 input logic state_db_enable_i,
Mark Branstad12ba5ff2020-10-16 13:25:46 -070025 input logic [StateId-1:0] state_db_rd_inst_id_i,
26 output logic [KeyLen-1:0] state_db_rd_key_o,
27 output logic [BlkLen-1:0] state_db_rd_v_o,
28 output logic [CtrLen-1:0] state_db_rd_res_ctr_o,
29 output logic state_db_rd_inst_st_o,
30 output logic state_db_rd_fips_o,
31 // write interface
32 input logic state_db_wr_req_i,
33 output logic state_db_wr_req_rdy_o,
34 input logic [StateId-1:0] state_db_wr_inst_id_i,
35 input logic state_db_wr_fips_i,
36 input logic [Cmd-1:0] state_db_wr_ccmd_i,
37 input logic [KeyLen-1:0] state_db_wr_key_i,
38 input logic [BlkLen-1:0] state_db_wr_v_i,
39 input logic [CtrLen-1:0] state_db_wr_res_ctr_i,
40 input logic state_db_wr_sts_i,
41 // status interface
Mark Branstad3ff42872020-12-15 15:18:28 -080042 input logic state_db_lc_en_i,
43 input logic state_db_reg_rd_sel_i,
Mark Branstad3ff42872020-12-15 15:18:28 -080044 input logic state_db_reg_rd_id_pulse_i,
45 output logic [31:0] state_db_reg_rd_val_o,
Mark Branstad12ba5ff2020-10-16 13:25:46 -070046 output logic state_db_sts_ack_o,
47 output logic state_db_sts_sts_o,
48 output logic [StateId-1:0] state_db_sts_id_o
49);
50
Mark Branstad33e387f2020-11-06 15:00:34 -080051 localparam int InternalStateWidth = 2+KeyLen+BlkLen+CtrLen;
Mark Branstad3ff42872020-12-15 15:18:28 -080052 localparam int RegInternalStateWidth = 30+InternalStateWidth;
53 localparam int RegW = 32;
Mark Branstadb41d0c82021-04-16 10:18:32 -070054 localparam int StateWidth = 1+1+KeyLen+BlkLen+CtrLen+StateId+1;
Mark Branstad12ba5ff2020-10-16 13:25:46 -070055
56 logic [StateId-1:0] state_db_id;
57 logic [KeyLen-1:0] state_db_key;
58 logic [BlkLen-1:0] state_db_v;
59 logic [CtrLen-1:0] state_db_rc;
60 logic state_db_fips;
61 logic state_db_inst_st;
62 logic state_db_sts;
63 logic state_db_write;
64 logic instance_status;
Mark Branstad50a83be2021-02-22 10:44:19 -080065 logic [NApps-1:0] int_st_out_sel;
66 logic [InternalStateWidth-1:0] internal_states_out[NApps];
Mark Branstad3ff42872020-12-15 15:18:28 -080067 logic [RegInternalStateWidth-1:0] internal_state_diag;
68 logic reg_rd_ptr_inc;
Mark Branstad12ba5ff2020-10-16 13:25:46 -070069
70 // flops
71 logic state_db_sts_ack_q, state_db_sts_ack_d;
72 logic state_db_sts_sts_q, state_db_sts_sts_d;
73 logic [StateId-1:0] state_db_sts_id_q, state_db_sts_id_d;
Mark Branstad3ff42872020-12-15 15:18:28 -080074 logic [StateId-1:0] reg_rd_ptr_q, reg_rd_ptr_d;
Mark Branstad12ba5ff2020-10-16 13:25:46 -070075
76 always_ff @(posedge clk_i or negedge rst_ni)
77 if (!rst_ni) begin
78 state_db_sts_ack_q <= '0;
Mark Branstad3ff42872020-12-15 15:18:28 -080079 state_db_sts_sts_q <= '0;
Mark Branstad12ba5ff2020-10-16 13:25:46 -070080 state_db_sts_id_q <= '0;
Mark Branstad3ff42872020-12-15 15:18:28 -080081 reg_rd_ptr_q <= '0;
Mark Branstad12ba5ff2020-10-16 13:25:46 -070082 end else begin
83 state_db_sts_ack_q <= state_db_sts_ack_d;
Mark Branstad3ff42872020-12-15 15:18:28 -080084 state_db_sts_sts_q <= state_db_sts_sts_d;
Mark Branstad12ba5ff2020-10-16 13:25:46 -070085 state_db_sts_id_q <= state_db_sts_id_d;
Mark Branstad3ff42872020-12-15 15:18:28 -080086 reg_rd_ptr_q <= reg_rd_ptr_d;
Mark Branstad12ba5ff2020-10-16 13:25:46 -070087 end
88
89 // flops - no reset
90 logic [InternalStateWidth-1:0] internal_states_q[NApps], internal_states_d[NApps];
Mark Branstad50a83be2021-02-22 10:44:19 -080091 logic [InternalStateWidth-1:0] internal_state_pl_q, internal_state_pl_d;
Mark Branstad12ba5ff2020-10-16 13:25:46 -070092
93
94 // no reset on state
95 always_ff @(posedge clk_i)
96 begin
97 internal_states_q <= internal_states_d;
Mark Branstad50a83be2021-02-22 10:44:19 -080098 internal_state_pl_q <= internal_state_pl_d;
Mark Branstad12ba5ff2020-10-16 13:25:46 -070099 end
100
101
102 //--------------------------------------------
Mark Branstad3ff42872020-12-15 15:18:28 -0800103 // internal state read logic
Mark Branstad12ba5ff2020-10-16 13:25:46 -0700104 //--------------------------------------------
105 for (genvar rd = 0; rd < NApps; rd = rd+1) begin : gen_state_rd
Mark Branstad50a83be2021-02-22 10:44:19 -0800106 assign int_st_out_sel[rd] = (state_db_rd_inst_id_i == rd);
Mark Branstad3ff42872020-12-15 15:18:28 -0800107 assign internal_states_out[rd] = int_st_out_sel[rd] ? internal_states_q[rd] : '0;
Mark Branstad12ba5ff2020-10-16 13:25:46 -0700108 end
109
Mark Branstad3ff42872020-12-15 15:18:28 -0800110 // since only one of the internal states is active at a time, a
111 // logical "or" is made of all of the buses into one
Mark Branstad50a83be2021-02-22 10:44:19 -0800112 always_comb begin
113 internal_state_pl_d = '0;
114 for (int i = 0; i < NApps; i = i+1) begin
115 internal_state_pl_d |= internal_states_out[i];
116 end
117 end
Mark Branstad3ff42872020-12-15 15:18:28 -0800118
119 assign {state_db_rd_fips_o,state_db_rd_inst_st_o,
120 state_db_rd_key_o,state_db_rd_v_o,
Mark Branstad50a83be2021-02-22 10:44:19 -0800121 state_db_rd_res_ctr_o} = internal_state_pl_q;
Mark Branstad3ff42872020-12-15 15:18:28 -0800122
123
Mark Branstad50a83be2021-02-22 10:44:19 -0800124 // re-using the internal state pipeline version for better timing
Rupert Swarbrick44fe2172021-03-26 11:22:05 +0000125 assign internal_state_diag = {30'b0,internal_state_pl_q};
Mark Branstad3ff42872020-12-15 15:18:28 -0800126
127
128 // Register access of internal state
129 assign state_db_reg_rd_val_o =
130 (reg_rd_ptr_q == 4'h0) ? internal_state_diag[RegW-1:0] :
131 (reg_rd_ptr_q == 4'h1) ? internal_state_diag[2*RegW-1:RegW] :
132 (reg_rd_ptr_q == 4'h2) ? internal_state_diag[3*RegW-1:2*RegW] :
133 (reg_rd_ptr_q == 4'h3) ? internal_state_diag[4*RegW-1:3*RegW] :
134 (reg_rd_ptr_q == 4'h4) ? internal_state_diag[5*RegW-1:4*RegW] :
135 (reg_rd_ptr_q == 4'h5) ? internal_state_diag[6*RegW-1:5*RegW] :
136 (reg_rd_ptr_q == 4'h6) ? internal_state_diag[7*RegW-1:6*RegW] :
137 (reg_rd_ptr_q == 4'h7) ? internal_state_diag[8*RegW-1:7*RegW] :
138 (reg_rd_ptr_q == 4'h8) ? internal_state_diag[9*RegW-1:8*RegW] :
139 (reg_rd_ptr_q == 4'h9) ? internal_state_diag[10*RegW-1:9*RegW] :
140 (reg_rd_ptr_q == 4'ha) ? internal_state_diag[11*RegW-1:10*RegW] :
141 (reg_rd_ptr_q == 4'hb) ? internal_state_diag[12*RegW-1:11*RegW] :
142 (reg_rd_ptr_q == 4'hc) ? internal_state_diag[13*RegW-1:12*RegW] :
143 (reg_rd_ptr_q == 4'hd) ? internal_state_diag[14*RegW-1:13*RegW] :
144 '0;
145
146 // selects 32b fields from the internal state to be read out for diagnostics
147 assign reg_rd_ptr_inc = state_db_reg_rd_sel_i;
148
149 assign reg_rd_ptr_d =
Mark Branstad7b870682021-04-15 09:40:09 -0700150 (!state_db_enable_i) ? 4'hf :
151 (!state_db_lc_en_i) ? 4'hf :
Mark Branstad3ff42872020-12-15 15:18:28 -0800152 (reg_rd_ptr_q == 4'he) ? '0 :
153 state_db_reg_rd_id_pulse_i ? '0 :
154 reg_rd_ptr_inc ? (reg_rd_ptr_q+1) :
155 reg_rd_ptr_q;
156
Mark Branstad12ba5ff2020-10-16 13:25:46 -0700157
158 //--------------------------------------------
159 // write state logic
160 //--------------------------------------------
161
162 for (genvar wr = 0; wr < NApps; wr = wr+1) begin : gen_state_wr
163
Mark Branstad50a83be2021-02-22 10:44:19 -0800164 assign internal_states_d[wr] = !state_db_enable_i ? '0 : // better timing
165 (state_db_write && (state_db_id == wr)) ?
Mark Branstad12ba5ff2020-10-16 13:25:46 -0700166 {state_db_fips,state_db_inst_st,state_db_key,
167 state_db_v,state_db_rc} : internal_states_q[wr];
168 end : gen_state_wr
169
170
171 assign {state_db_fips,state_db_inst_st,
172 state_db_key,
173 state_db_v,state_db_rc,
Mark Branstadb41d0c82021-04-16 10:18:32 -0700174 state_db_id,state_db_sts} = {StateWidth{state_db_enable_i}} &
175 {state_db_wr_fips_i,instance_status,
Mark Branstad12ba5ff2020-10-16 13:25:46 -0700176 state_db_wr_key_i,
177 state_db_wr_v_i,state_db_wr_res_ctr_i,
178 state_db_wr_inst_id_i,state_db_wr_sts_i};
179
180 assign instance_status =
181 (state_db_wr_ccmd_i == INS) ||
182 (state_db_wr_ccmd_i == RES) ||
Mark Branstad535275b2021-05-14 10:13:35 -0700183 (state_db_wr_ccmd_i == GEN) ||
Mark Branstad12ba5ff2020-10-16 13:25:46 -0700184 (state_db_wr_ccmd_i == UPD);
185
186
187 assign state_db_write = state_db_enable_i && state_db_wr_req_i;
188
Mark Branstad7b870682021-04-15 09:40:09 -0700189 assign state_db_sts_ack_d =
Mark Branstad7b870682021-04-15 09:40:09 -0700190 state_db_write;
191
192 assign state_db_sts_sts_d =
Mark Branstad7b870682021-04-15 09:40:09 -0700193 state_db_sts;
194
195 assign state_db_sts_id_d =
Mark Branstad7b870682021-04-15 09:40:09 -0700196 state_db_id;
Mark Branstad12ba5ff2020-10-16 13:25:46 -0700197
198 assign state_db_sts_ack_o = state_db_sts_ack_q;
199 assign state_db_sts_sts_o = state_db_sts_sts_q;
200 assign state_db_sts_id_o = state_db_sts_id_q;
201 assign state_db_wr_req_rdy_o = 1'b1;
202
Mark Branstad3ff42872020-12-15 15:18:28 -0800203
204 // Assertions
205 `ASSERT_KNOWN(IntStOutSelOneHot_A, $onehot(int_st_out_sel))
Mark Branstad3ff42872020-12-15 15:18:28 -0800206
Mark Branstad12ba5ff2020-10-16 13:25:46 -0700207endmodule