Mark Branstad | 12ba5ff | 2020-10-16 13:25:46 -0700 | [diff] [blame] | 1 | // 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 Branstad | 3ff4287 | 2020-12-15 15:18:28 -0800 | [diff] [blame] | 10 | `include "prim_assert.sv" |
| 11 | |
Mark Branstad | 12ba5ff | 2020-10-16 13:25:46 -0700 | [diff] [blame] | 12 | module csrng_state_db import csrng_pkg::*; #( |
Mark Branstad | 33e387f | 2020-11-06 15:00:34 -0800 | [diff] [blame] | 13 | 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 Branstad | 12ba5ff | 2020-10-16 13:25:46 -0700 | [diff] [blame] | 19 | ) ( |
| 20 | input logic clk_i, |
| 21 | input logic rst_ni, |
| 22 | |
| 23 | // read interface |
| 24 | input logic state_db_enable_i, |
Mark Branstad | 12ba5ff | 2020-10-16 13:25:46 -0700 | [diff] [blame] | 25 | 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 Branstad | 3ff4287 | 2020-12-15 15:18:28 -0800 | [diff] [blame] | 42 | input logic state_db_lc_en_i, |
| 43 | input logic state_db_reg_rd_sel_i, |
Mark Branstad | 3ff4287 | 2020-12-15 15:18:28 -0800 | [diff] [blame] | 44 | input logic state_db_reg_rd_id_pulse_i, |
| 45 | output logic [31:0] state_db_reg_rd_val_o, |
Mark Branstad | 12ba5ff | 2020-10-16 13:25:46 -0700 | [diff] [blame] | 46 | 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 Branstad | 33e387f | 2020-11-06 15:00:34 -0800 | [diff] [blame] | 51 | localparam int InternalStateWidth = 2+KeyLen+BlkLen+CtrLen; |
Mark Branstad | 3ff4287 | 2020-12-15 15:18:28 -0800 | [diff] [blame] | 52 | localparam int RegInternalStateWidth = 30+InternalStateWidth; |
| 53 | localparam int RegW = 32; |
Mark Branstad | b41d0c8 | 2021-04-16 10:18:32 -0700 | [diff] [blame] | 54 | localparam int StateWidth = 1+1+KeyLen+BlkLen+CtrLen+StateId+1; |
Mark Branstad | 12ba5ff | 2020-10-16 13:25:46 -0700 | [diff] [blame] | 55 | |
| 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 Branstad | 50a83be | 2021-02-22 10:44:19 -0800 | [diff] [blame] | 65 | logic [NApps-1:0] int_st_out_sel; |
| 66 | logic [InternalStateWidth-1:0] internal_states_out[NApps]; |
Mark Branstad | 3ff4287 | 2020-12-15 15:18:28 -0800 | [diff] [blame] | 67 | logic [RegInternalStateWidth-1:0] internal_state_diag; |
| 68 | logic reg_rd_ptr_inc; |
Mark Branstad | 12ba5ff | 2020-10-16 13:25:46 -0700 | [diff] [blame] | 69 | |
| 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 Branstad | 3ff4287 | 2020-12-15 15:18:28 -0800 | [diff] [blame] | 74 | logic [StateId-1:0] reg_rd_ptr_q, reg_rd_ptr_d; |
Mark Branstad | 12ba5ff | 2020-10-16 13:25:46 -0700 | [diff] [blame] | 75 | |
| 76 | always_ff @(posedge clk_i or negedge rst_ni) |
| 77 | if (!rst_ni) begin |
| 78 | state_db_sts_ack_q <= '0; |
Mark Branstad | 3ff4287 | 2020-12-15 15:18:28 -0800 | [diff] [blame] | 79 | state_db_sts_sts_q <= '0; |
Mark Branstad | 12ba5ff | 2020-10-16 13:25:46 -0700 | [diff] [blame] | 80 | state_db_sts_id_q <= '0; |
Mark Branstad | 3ff4287 | 2020-12-15 15:18:28 -0800 | [diff] [blame] | 81 | reg_rd_ptr_q <= '0; |
Mark Branstad | 12ba5ff | 2020-10-16 13:25:46 -0700 | [diff] [blame] | 82 | end else begin |
| 83 | state_db_sts_ack_q <= state_db_sts_ack_d; |
Mark Branstad | 3ff4287 | 2020-12-15 15:18:28 -0800 | [diff] [blame] | 84 | state_db_sts_sts_q <= state_db_sts_sts_d; |
Mark Branstad | 12ba5ff | 2020-10-16 13:25:46 -0700 | [diff] [blame] | 85 | state_db_sts_id_q <= state_db_sts_id_d; |
Mark Branstad | 3ff4287 | 2020-12-15 15:18:28 -0800 | [diff] [blame] | 86 | reg_rd_ptr_q <= reg_rd_ptr_d; |
Mark Branstad | 12ba5ff | 2020-10-16 13:25:46 -0700 | [diff] [blame] | 87 | end |
| 88 | |
| 89 | // flops - no reset |
| 90 | logic [InternalStateWidth-1:0] internal_states_q[NApps], internal_states_d[NApps]; |
Mark Branstad | 50a83be | 2021-02-22 10:44:19 -0800 | [diff] [blame] | 91 | logic [InternalStateWidth-1:0] internal_state_pl_q, internal_state_pl_d; |
Mark Branstad | 12ba5ff | 2020-10-16 13:25:46 -0700 | [diff] [blame] | 92 | |
| 93 | |
| 94 | // no reset on state |
| 95 | always_ff @(posedge clk_i) |
| 96 | begin |
| 97 | internal_states_q <= internal_states_d; |
Mark Branstad | 50a83be | 2021-02-22 10:44:19 -0800 | [diff] [blame] | 98 | internal_state_pl_q <= internal_state_pl_d; |
Mark Branstad | 12ba5ff | 2020-10-16 13:25:46 -0700 | [diff] [blame] | 99 | end |
| 100 | |
| 101 | |
| 102 | //-------------------------------------------- |
Mark Branstad | 3ff4287 | 2020-12-15 15:18:28 -0800 | [diff] [blame] | 103 | // internal state read logic |
Mark Branstad | 12ba5ff | 2020-10-16 13:25:46 -0700 | [diff] [blame] | 104 | //-------------------------------------------- |
| 105 | for (genvar rd = 0; rd < NApps; rd = rd+1) begin : gen_state_rd |
Mark Branstad | 50a83be | 2021-02-22 10:44:19 -0800 | [diff] [blame] | 106 | assign int_st_out_sel[rd] = (state_db_rd_inst_id_i == rd); |
Mark Branstad | 3ff4287 | 2020-12-15 15:18:28 -0800 | [diff] [blame] | 107 | assign internal_states_out[rd] = int_st_out_sel[rd] ? internal_states_q[rd] : '0; |
Mark Branstad | 12ba5ff | 2020-10-16 13:25:46 -0700 | [diff] [blame] | 108 | end |
| 109 | |
Mark Branstad | 3ff4287 | 2020-12-15 15:18:28 -0800 | [diff] [blame] | 110 | // 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 Branstad | 50a83be | 2021-02-22 10:44:19 -0800 | [diff] [blame] | 112 | 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 Branstad | 3ff4287 | 2020-12-15 15:18:28 -0800 | [diff] [blame] | 118 | |
| 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 Branstad | 50a83be | 2021-02-22 10:44:19 -0800 | [diff] [blame] | 121 | state_db_rd_res_ctr_o} = internal_state_pl_q; |
Mark Branstad | 3ff4287 | 2020-12-15 15:18:28 -0800 | [diff] [blame] | 122 | |
| 123 | |
Mark Branstad | 50a83be | 2021-02-22 10:44:19 -0800 | [diff] [blame] | 124 | // re-using the internal state pipeline version for better timing |
Rupert Swarbrick | 44fe217 | 2021-03-26 11:22:05 +0000 | [diff] [blame] | 125 | assign internal_state_diag = {30'b0,internal_state_pl_q}; |
Mark Branstad | 3ff4287 | 2020-12-15 15:18:28 -0800 | [diff] [blame] | 126 | |
| 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 Branstad | 7b87068 | 2021-04-15 09:40:09 -0700 | [diff] [blame] | 150 | (!state_db_enable_i) ? 4'hf : |
| 151 | (!state_db_lc_en_i) ? 4'hf : |
Mark Branstad | 3ff4287 | 2020-12-15 15:18:28 -0800 | [diff] [blame] | 152 | (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 Branstad | 12ba5ff | 2020-10-16 13:25:46 -0700 | [diff] [blame] | 157 | |
| 158 | //-------------------------------------------- |
| 159 | // write state logic |
| 160 | //-------------------------------------------- |
| 161 | |
| 162 | for (genvar wr = 0; wr < NApps; wr = wr+1) begin : gen_state_wr |
| 163 | |
Mark Branstad | 50a83be | 2021-02-22 10:44:19 -0800 | [diff] [blame] | 164 | assign internal_states_d[wr] = !state_db_enable_i ? '0 : // better timing |
| 165 | (state_db_write && (state_db_id == wr)) ? |
Mark Branstad | 12ba5ff | 2020-10-16 13:25:46 -0700 | [diff] [blame] | 166 | {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 Branstad | b41d0c8 | 2021-04-16 10:18:32 -0700 | [diff] [blame] | 174 | state_db_id,state_db_sts} = {StateWidth{state_db_enable_i}} & |
| 175 | {state_db_wr_fips_i,instance_status, |
Mark Branstad | 12ba5ff | 2020-10-16 13:25:46 -0700 | [diff] [blame] | 176 | 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 Branstad | 535275b | 2021-05-14 10:13:35 -0700 | [diff] [blame] | 183 | (state_db_wr_ccmd_i == GEN) || |
Mark Branstad | 12ba5ff | 2020-10-16 13:25:46 -0700 | [diff] [blame] | 184 | (state_db_wr_ccmd_i == UPD); |
| 185 | |
| 186 | |
| 187 | assign state_db_write = state_db_enable_i && state_db_wr_req_i; |
| 188 | |
Mark Branstad | 7b87068 | 2021-04-15 09:40:09 -0700 | [diff] [blame] | 189 | assign state_db_sts_ack_d = |
Mark Branstad | 7b87068 | 2021-04-15 09:40:09 -0700 | [diff] [blame] | 190 | state_db_write; |
| 191 | |
| 192 | assign state_db_sts_sts_d = |
Mark Branstad | 7b87068 | 2021-04-15 09:40:09 -0700 | [diff] [blame] | 193 | state_db_sts; |
| 194 | |
| 195 | assign state_db_sts_id_d = |
Mark Branstad | 7b87068 | 2021-04-15 09:40:09 -0700 | [diff] [blame] | 196 | state_db_id; |
Mark Branstad | 12ba5ff | 2020-10-16 13:25:46 -0700 | [diff] [blame] | 197 | |
| 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 Branstad | 3ff4287 | 2020-12-15 15:18:28 -0800 | [diff] [blame] | 203 | |
| 204 | // Assertions |
| 205 | `ASSERT_KNOWN(IntStOutSelOneHot_A, $onehot(int_st_out_sel)) |
Mark Branstad | 3ff4287 | 2020-12-15 15:18:28 -0800 | [diff] [blame] | 206 | |
Mark Branstad | 12ba5ff | 2020-10-16 13:25:46 -0700 | [diff] [blame] | 207 | endmodule |