blob: cd4920e4116fe4be8bb4ee768ae7bb0eccc1a68d [file] [log] [blame]
Mark Branstadb6acfab2020-11-06 07:06:39 -08001// 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
9module 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 Branstad1e7fa2e2021-02-18 08:41:37 -080022 input logic cmd_sent_i,
23 output logic main_sm_err_o
Mark Branstadb6acfab2020-11-06 07:06:39 -080024);
25
Mark Branstad1e7fa2e2021-02-18 08:41:37 -080026// 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 Branstadb6acfab2020-11-06 07:06:39 -080045
46 localparam int StateWidth = 6;
47 typedef enum logic [StateWidth-1:0] {
Mark Branstad1e7fa2e2021-02-18 08:41:37 -080048 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 Branstadb6acfab2020-11-06 07:06:39 -080056 } 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 Branstad1e7fa2e2021-02-18 08:41:37 -080085 main_sm_err_o = 1'b0;
Mark Branstadb6acfab2020-11-06 07:06:39 -080086 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 Branstad1e7fa2e2021-02-18 08:41:37 -0800130 Error: begin
131 main_sm_err_o = 1'b1;
132 end
133 default: state_d = Error;
Mark Branstadb6acfab2020-11-06 07:06:39 -0800134 endcase
135 end
136
137endmodule