@@ -23,11 +23,17 @@ import mci_pkg::*;
2323(
2424 input logic clk,
2525 input logic mci_rst_b,
26+ input logic mci_pwrgood,
27+
28+ // Clock Controls
29+ output logic rdc_clk_dis,
30+ output logic fw_update_rdc_clk_dis,
2631
2732 // DFT
2833 input scan_mode,
2934
3035 // Reset controls
36+ output logic cptra_ss_rst_b_o,
3137 output logic mcu_rst_b,
3238 output logic cptra_rst_b,
3339
@@ -62,20 +68,27 @@ import mci_pkg::*;
6268mci_boot_fsm_state_e boot_fsm_nxt;
6369mci_boot_fsm_state_e boot_fsm_prev;
6470
65- logic lc_done_sync;
6671logic lc_init_nxt;
6772
68- logic fc_opt_done_sync;
6973logic fc_opt_init_nxt;
7074
7175logic mci_boot_seq_brkpoint_sync;
76+ logic mcu_cpu_halt_ack_i_sync;
77+ logic mcu_cpu_halt_status_i_sync;
7278
7379logic mcu_no_rom_config_sync;
7480
7581logic mcu_rst_b_ff ;
7682logic cptra_rst_b_ff;
83+ logic cptra_ss_rst_b_o_ff;
7784logic mcu_rst_b_nxt;
7885logic cptra_rst_b_nxt;
86+ logic cptra_ss_rst_b_o_nxt;
87+
88+ logic mci_rst_window;
89+ logic mci_rst_window_sync;
90+ logic fw_update_rst_window;
91+ logic warm_reset;
7992
8093logic mcu_reset_once_nxt;
8194
@@ -88,97 +101,134 @@ logic min_mcu_rst_count_elapsed_nxt;
88101// ///////////////////////////////////////////////
89102// DFT
90103// ///////////////////////////////////////////////
91- assign mcu_rst_b = scan_mode ? mcu_rst_b : mcu_rst_b_ff;
92- assign cptra_rst_b = scan_mode ? cptra_rst_b : cptra_rst_b_ff;
104+ assign cptra_ss_rst_b_o = scan_mode ? mci_rst_b : cptra_ss_rst_b_o_ff;
105+ assign mcu_rst_b = scan_mode ? mci_rst_b : mcu_rst_b_ff;
106+ assign cptra_rst_b = scan_mode ? mci_rst_b : cptra_rst_b_ff;
107+
108+ // ///////////////////////////////////////////////
109+ // Reset Window
110+ // ///////////////////////////////////////////////
111+
112+ // uC reset generation
113+ always_ff @ (posedge clk or negedge mci_rst_b) begin
114+ if (~ mci_rst_b) begin
115+ mci_rst_window <= '1 ;
116+ end
117+ else begin
118+ mci_rst_window <= 0 ;
119+ end
120+ end
121+
122+ caliptra_2ff_sync # (.WIDTH (1 ), .RST_VAL ('d1 )) i_rst_window_sync (.clk (clk), .rst_b (mci_pwrgood), .din (mci_rst_window), . dout (mci_rst_window_sync));
123+
124+ // clock gate all flops on warm reset to prevent RDC metastability issues
125+ always_comb rdc_clk_dis = mci_rst_window_sync;
126+
127+
128+ assign warm_reset = mci_rst_window_sync;
129+
130+ assign fw_update_rst_window = (boot_fsm_nxt == BOOT_RST_MCU ) || (boot_fsm == BOOT_RST_MCU );
131+
132+ // clock gate all flops on MCU FW update
133+ assign fw_update_rdc_clk_dis = fw_update_rst_window;
93134
94135// ///////////////////////////////////////////////
95136// Sync signals into local clock domain
96137// ///////////////////////////////////////////////
97138caliptra_prim_flop_2sync # (
98139 .Width (1 )
99- ) u_prim_flop_2sync_lc_done (
140+ ) u_prim_flop_2sync_mci_boot_seq_brkpoint (
100141 .clk_i (clk),
101- .rst_ni (mci_rst_b ),
102- .d_i (lc_done ),
103- .q_o (lc_done_sync ));
142+ .rst_ni (mci_pwrgood ),
143+ .d_i (mci_boot_seq_brkpoint ),
144+ .q_o (mci_boot_seq_brkpoint_sync ));
104145
105146caliptra_prim_flop_2sync # (
106147 .Width (1 )
107- ) u_prim_flop_2sync_fc_opt_done (
148+ ) u_prim_flop_2sync_mcu_no_rom_config (
108149 .clk_i (clk),
109- .rst_ni (mci_rst_b),
110- .d_i (fc_opt_done),
111- .q_o (fc_opt_done_sync));
150+ .rst_ni (mci_pwrgood),
151+ .d_i (mcu_no_rom_config),
152+ .q_o (mcu_no_rom_config_sync));
153+
112154
113155caliptra_prim_flop_2sync # (
114156 .Width (1 )
115- ) u_prim_flop_2sync_mci_boot_seq_brkpoint (
157+ ) u_prim_flop_2sync_mcu_cpu_halt_ack_i (
116158 .clk_i (clk),
117- .rst_ni (mci_rst_b ),
118- .d_i (mci_boot_seq_brkpoint ),
119- .q_o (mci_boot_seq_brkpoint_sync ));
159+ .rst_ni (mci_pwrgood ),
160+ .d_i (mcu_cpu_halt_ack_i ),
161+ .q_o (mcu_cpu_halt_ack_i_sync ));
120162
121163caliptra_prim_flop_2sync # (
122164 .Width (1 )
123- ) u_prim_flop_2sync_mcu_no_rom_config (
165+ ) u_prim_flop_2sync_mcu_cpu_halt_status_i (
124166 .clk_i (clk),
125- .rst_ni (mci_rst_b),
126- .d_i (mcu_no_rom_config),
127- .q_o (mcu_no_rom_config_sync));
167+ .rst_ni (mci_pwrgood),
168+ .d_i (mcu_cpu_halt_status_i),
169+ .q_o (mcu_cpu_halt_status_i_sync));
170+
128171
129172// ///////////////////////////////////////////////
130173// Boot FSM
131174// ///////////////////////////////////////////////
132- always_ff @ (posedge clk or negedge mci_rst_b ) begin
133- if (! mci_rst_b ) begin
175+ always_ff @ (posedge clk or negedge mci_pwrgood ) begin
176+ if (! mci_pwrgood ) begin
134177 boot_fsm <= BOOT_IDLE ;
135178 boot_fsm_prev <= BOOT_IDLE ;
136179 fc_opt_init <= '0 ;
137180 lc_init <= '0 ;
181+ cptra_ss_rst_b_o_ff <= '0 ;
138182 mcu_rst_b_ff <= '0 ;
139183 cptra_rst_b_ff <= '0 ;
140184 mcu_reset_once <= '0 ;
141185 min_mcu_rst_count_elapsed <= '0 ;
142186 min_mcu_rst_count <= '0 ;
143187 end
144188 else begin
145- boot_fsm <= boot_fsm_nxt;
146- boot_fsm_prev <= (boot_fsm != boot_fsm_nxt) ? boot_fsm : boot_fsm_prev; // Capture where FSM came from
147- fc_opt_init <= fc_opt_init_nxt;
148- lc_init <= lc_init_nxt;
149- mcu_rst_b_ff <= mcu_rst_b_nxt;
150- cptra_rst_b_ff <= cptra_rst_b_nxt;
151- mcu_reset_once <= mcu_reset_once_nxt;
152- min_mcu_rst_count_elapsed <= min_mcu_rst_count_elapsed_nxt;
153- min_mcu_rst_count <= min_mcu_rst_count_nxt;
189+ boot_fsm <= warm_reset ? BOOT_IDLE : boot_fsm_nxt;
190+ boot_fsm_prev <= (boot_fsm != boot_fsm_nxt) ? boot_fsm : boot_fsm_prev; // Capture where FSM came from
191+ fc_opt_init <= fc_opt_init_nxt;
192+ lc_init <= lc_init_nxt;
193+ cptra_ss_rst_b_o_ff <= cptra_ss_rst_b_o_nxt;
194+ mcu_rst_b_ff <= mcu_rst_b_nxt;
195+ cptra_rst_b_ff <= cptra_rst_b_nxt;
196+ mcu_reset_once <= mcu_reset_once_nxt;
197+ min_mcu_rst_count_elapsed <= min_mcu_rst_count_elapsed_nxt;
198+ min_mcu_rst_count <= min_mcu_rst_count_nxt;
154199 end
155200end
156201
157202
158203always_comb begin
159- boot_fsm_nxt = boot_fsm;
160- fc_opt_init_nxt = fc_opt_init;
161- lc_init_nxt = lc_init;
162- mcu_rst_b_nxt = mcu_rst_b_ff;
163- cptra_rst_b_nxt = cptra_rst_b_ff;
164- mcu_reset_once_nxt = mcu_reset_once;
165- mcu_cpu_halt_req_nxt = 1'b0 ;
204+ boot_fsm_nxt = boot_fsm;
205+ fc_opt_init_nxt = fc_opt_init;
206+ lc_init_nxt = lc_init;
207+ cptra_ss_rst_b_o_nxt = cptra_ss_rst_b_o_ff;
208+ mcu_rst_b_nxt = mcu_rst_b_ff;
209+ cptra_rst_b_nxt = cptra_rst_b_ff;
210+ mcu_reset_once_nxt = mcu_reset_once;
211+ mcu_cpu_halt_req_nxt = 1'b0 ;
166212 unique case (boot_fsm)
167213 BOOT_IDLE : begin
168214 // Can only transition into IDLE on MCI reset
169215 // If this changes we need to add init signal values
170216 // for FC, LCC, MCU, CPTRA
171- boot_fsm_nxt = BOOT_OTP_FC ;
217+ boot_fsm_nxt = BOOT_OTP_FC ;
218+ cptra_ss_rst_b_o_nxt = 1'b0 ;
219+ mcu_rst_b_nxt = 1'b0 ;
220+ cptra_rst_b_nxt = 1'b0 ;
172221 end
173222 BOOT_OTP_FC : begin
223+ cptra_ss_rst_b_o_nxt = 1'b1 ;
174224 fc_opt_init_nxt = 1'b1 ;
175- if (fc_opt_done_sync ) begin
225+ if (fc_opt_done ) begin
176226 boot_fsm_nxt = BOOT_LCC ;
177227 end
178228 end
179229 BOOT_LCC : begin
180230 lc_init_nxt = 1'b1 ;
181- if (lc_done_sync ) begin
231+ if (lc_done ) begin
182232 boot_fsm_nxt = BOOT_BREAKPOINT_CHECK ;
183233 end
184234 end
@@ -227,13 +277,13 @@ always_comb begin
227277 end
228278 end
229279 BOOT_HALT_MCU : begin
230- if (mcu_cpu_halt_ack_i ) begin
280+ if (mcu_cpu_halt_ack_i_sync ) begin
231281 boot_fsm_nxt = BOOT_WAIT_MCU_HALTED ;
232282 end
233283 mcu_cpu_halt_req_nxt = 1'b1 ;
234284 end
235285 BOOT_WAIT_MCU_HALTED : begin
236- if (mcu_cpu_halt_status_i ) begin
286+ if (mcu_cpu_halt_status_i_sync ) begin
237287 boot_fsm_nxt = BOOT_RST_MCU ;
238288 end
239289 end
@@ -254,8 +304,8 @@ always_comb begin
254304 endcase
255305end
256306
257- always_ff @ (posedge clk or negedge mci_rst_b ) begin
258- if (! mci_rst_b ) begin
307+ always_ff @ (posedge clk or negedge mci_pwrgood ) begin
308+ if (! mci_pwrgood ) begin
259309 mcu_cpu_halt_req_o <= 1'b0 ;
260310 end
261311 else begin
0 commit comments