Mark Branstad | b6acfab | 2020-11-06 07:06:39 -0800 | [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: edn csrng application request state machine module |
| 6 | // |
| 7 | // does hardware-based csrng app interface command requests |
| 8 | |
| 9 | module edn_main_sm ( |
| 10 | input logic clk_i, |
| 11 | input logic rst_ni, |
| 12 | |
| 13 | input logic auto_req_mode_i, |
| 14 | output logic seq_auto_req_mode_o, |
| 15 | output logic auto_req_mode_end_o, |
| 16 | input logic csrng_cmd_ack_i, |
| 17 | output logic capt_gencmd_fifo_cnt_o, |
| 18 | output logic send_gencmd_o, |
| 19 | input logic max_reqs_cnt_zero_i, |
| 20 | output logic capt_rescmd_fifo_cnt_o, |
| 21 | output logic send_rescmd_o, |
Mark Branstad | 1e7fa2e | 2021-02-18 08:41:37 -0800 | [diff] [blame] | 22 | input logic cmd_sent_i, |
| 23 | output logic main_sm_err_o |
Mark Branstad | b6acfab | 2020-11-06 07:06:39 -0800 | [diff] [blame] | 24 | ); |
| 25 | |
Mark Branstad | 1e7fa2e | 2021-02-18 08:41:37 -0800 | [diff] [blame] | 26 | // Encoding generated with: |
| 27 | // $ ./util/design/sparse-fsm-encode.py -d 3 -m 8 -n 6 \ |
| 28 | // -s 3370065314 --language=sv |
| 29 | // |
| 30 | // Hamming distance histogram: |
| 31 | // |
| 32 | // 0: -- |
| 33 | // 1: -- |
| 34 | // 2: -- |
| 35 | // 3: |||||||||||||||||||| (57.14%) |
| 36 | // 4: ||||||||||||||| (42.86%) |
| 37 | // 5: -- |
| 38 | // 6: -- |
| 39 | // |
| 40 | // Minimum Hamming distance: 3 |
| 41 | // Maximum Hamming distance: 4 |
| 42 | // Minimum Hamming weight: 1 |
| 43 | // Maximum Hamming weight: 5 |
| 44 | // |
Mark Branstad | b6acfab | 2020-11-06 07:06:39 -0800 | [diff] [blame] | 45 | |
| 46 | localparam int StateWidth = 6; |
| 47 | typedef enum logic [StateWidth-1:0] { |
Mark Branstad | 1e7fa2e | 2021-02-18 08:41:37 -0800 | [diff] [blame] | 48 | Idle = 6'b111011, // idle (hamming distance = 3) |
| 49 | AckWait = 6'b010111, // wait for csrng req ack |
| 50 | Dispatch = 6'b011100, // dispatch the next cmd after ack |
| 51 | CaptGenCnt = 6'b110000, // capture the generate fifo count |
| 52 | SendGenCmd = 6'b001001, // send the generate cmd req |
| 53 | CaptReseedCnt = 6'b101110, // capture the reseed fifo count |
| 54 | SendReseedCmd = 6'b000010, // send the reseed cmd req |
| 55 | Error = 6'b100101 // illegal state reached and hang |
Mark Branstad | b6acfab | 2020-11-06 07:06:39 -0800 | [diff] [blame] | 56 | } state_e; |
| 57 | |
| 58 | state_e state_d, state_q; |
| 59 | |
| 60 | logic [StateWidth-1:0] state_raw_q; |
| 61 | |
| 62 | // This primitive is used to place a size-only constraint on the |
| 63 | // flops in order to prevent FSM state encoding optimizations. |
| 64 | |
| 65 | prim_flop #( |
| 66 | .Width(StateWidth), |
| 67 | .ResetValue(StateWidth'(Idle)) |
| 68 | ) u_state_regs ( |
| 69 | .clk_i, |
| 70 | .rst_ni, |
| 71 | .d_i ( state_d ), |
| 72 | .q_o ( state_raw_q ) |
| 73 | ); |
| 74 | |
| 75 | assign state_q = state_e'(state_raw_q); |
| 76 | |
| 77 | always_comb begin |
| 78 | state_d = state_q; |
| 79 | capt_gencmd_fifo_cnt_o = 1'b0; |
| 80 | send_gencmd_o = 1'b0; |
| 81 | capt_rescmd_fifo_cnt_o = 1'b0; |
| 82 | send_rescmd_o = 1'b0; |
| 83 | seq_auto_req_mode_o = 1'b1; |
| 84 | auto_req_mode_end_o = 1'b0; |
Mark Branstad | 1e7fa2e | 2021-02-18 08:41:37 -0800 | [diff] [blame] | 85 | main_sm_err_o = 1'b0; |
Mark Branstad | b6acfab | 2020-11-06 07:06:39 -0800 | [diff] [blame] | 86 | unique case (state_q) |
| 87 | Idle: begin |
| 88 | seq_auto_req_mode_o = 1'b0; |
| 89 | if (auto_req_mode_i) begin |
| 90 | state_d = AckWait; |
| 91 | end |
| 92 | end |
| 93 | AckWait: begin |
| 94 | if (csrng_cmd_ack_i) begin |
| 95 | state_d = Dispatch; |
| 96 | end |
| 97 | end |
| 98 | Dispatch: begin |
| 99 | if (!auto_req_mode_i) begin |
| 100 | auto_req_mode_end_o = 1'b1; |
| 101 | state_d = Idle; |
| 102 | end else begin |
| 103 | if (max_reqs_cnt_zero_i) begin |
| 104 | state_d = CaptReseedCnt; |
| 105 | end else begin |
| 106 | state_d = CaptGenCnt; |
| 107 | end |
| 108 | end |
| 109 | end |
| 110 | CaptGenCnt: begin |
| 111 | capt_gencmd_fifo_cnt_o = 1'b1; |
| 112 | state_d = SendGenCmd; |
| 113 | end |
| 114 | SendGenCmd: begin |
| 115 | send_gencmd_o = 1'b1; |
| 116 | if (cmd_sent_i) begin |
| 117 | state_d = AckWait; |
| 118 | end |
| 119 | end |
| 120 | CaptReseedCnt: begin |
| 121 | capt_rescmd_fifo_cnt_o = 1'b1; |
| 122 | state_d = SendReseedCmd; |
| 123 | end |
| 124 | SendReseedCmd: begin |
| 125 | send_rescmd_o = 1'b1; |
| 126 | if (cmd_sent_i) begin |
| 127 | state_d = AckWait; |
| 128 | end |
| 129 | end |
Mark Branstad | 1e7fa2e | 2021-02-18 08:41:37 -0800 | [diff] [blame] | 130 | Error: begin |
| 131 | main_sm_err_o = 1'b1; |
| 132 | end |
| 133 | default: state_d = Error; |
Mark Branstad | b6acfab | 2020-11-06 07:06:39 -0800 | [diff] [blame] | 134 | endcase |
| 135 | end |
| 136 | |
| 137 | endmodule |