Skip to content

Commit 0b6a805

Browse files
authored
[RTL] Add RDC gated clocks and resets (#279)
* Add RDC controls to mci_boot_seqr * [RTL] Connect RDC reset and Clocks to IPs RDC gated clockes have been connected to MCI and MCU due to reset domain crossings Connect I3C, LCC, MCI, and FC to new synchronized reset generated by MCI. This reset is alsigned with RDC gated clocks. It isn't required for I3C, LCC, and FC since they don't have RDC issues due to one clock domain. But this is a cleaner design to have all these IPs come out of reset at the same time. Note: RDC architecture mirrors Caliptra RDC implementation. * MICROSOFT AUTOMATED PIPELINE: Stamp 'ckuchta-rdc-changes-2' with updated timestamp and hash after successful run
1 parent 9e3a0fe commit 0b6a805

File tree

6 files changed

+185
-98
lines changed

6 files changed

+185
-98
lines changed

.github/workflow_metadata/pr_hash

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
cc6f0ba0d9d73005640a2a8b9170976922320a504cecf11e087acd9a41d475f1edae2e326d1363eca081ecdb3afdfc4a
1+
8fcecd8df0e636fa5009731edf28dac6c9ffc6071041ffe139fd6462a024f6bd05fdf35aed46eaff8c0ac28bb8359b16
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
1744455972
1+
1744604477

src/integration/rtl/caliptra_ss_top.sv

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -290,6 +290,10 @@ module caliptra_ss_top
290290
logic [11:0] wb_csr_dest;
291291
logic [31:0] wb_csr_data;
292292

293+
logic cptra_ss_rst_b_o;
294+
295+
logic mcu_clk_cg;
296+
293297
logic mcu_dmi_core_enable;
294298
logic mcu_dmi_uncore_enable;
295299
logic mcu_dmi_uncore_en;
@@ -569,12 +573,12 @@ module caliptra_ss_top
569573

570574
mci_mcu_sram_if cptra_ss_mcu_rom_mbox0_sram_req_if (
571575
.clk(cptra_ss_clk_i),
572-
.rst_b(cptra_ss_rst_b_i)
576+
.rst_b(cptra_ss_rst_b_o)
573577
);
574578

575579
mci_mcu_sram_if cptra_ss_mcu_rom_mbox1_sram_req_if (
576580
.clk(cptra_ss_clk_i),
577-
.rst_b(cptra_ss_rst_b_i)
581+
.rst_b(cptra_ss_rst_b_o)
578582
);
579583

580584

@@ -778,7 +782,7 @@ module caliptra_ss_top
778782
mcu_top rvtop_wrapper (
779783
.rst_l ( mcu_rst_b ),
780784
.dbg_rst_l ( cptra_ss_pwrgood_i ), //FIXME same as caliptra?
781-
.clk ( cptra_ss_clk_i ),
785+
.clk ( mcu_clk_cg ),
782786
.rst_vec ( reset_vector[31:1]),
783787
.nmi_int ( mci_mcu_nmi_int),
784788
.nmi_vec ( mci_mcu_nmi_vector[31:1]),
@@ -1075,7 +1079,7 @@ module caliptra_ss_top
10751079
.AxiIdWidth (`AXI_ID_WIDTH )
10761080
) i3c (
10771081
.clk_i (cptra_ss_clk_i),
1078-
.rst_ni(cptra_ss_rst_b_i),
1082+
.rst_ni(cptra_ss_rst_b_o),
10791083

10801084
.arvalid_i (cptra_ss_i3c_s_axi_if.arvalid),
10811085
.arready_o (cptra_ss_i3c_s_axi_if.arready),
@@ -1141,7 +1145,7 @@ module caliptra_ss_top
11411145
.IW(8)
11421146
) mcu_rom_i (
11431147
.clk(cptra_ss_clk_i),
1144-
.rst_n(cptra_ss_rst_b_i),
1148+
.rst_n(cptra_ss_rst_b_o),
11451149

11461150
.s_axi_r_if(cptra_ss_mcu_rom_s_axi_if.r_sub),
11471151
.s_axi_w_if(cptra_ss_mcu_rom_s_axi_if.w_sub),
@@ -1172,8 +1176,13 @@ module caliptra_ss_top
11721176
) mci_top_i (
11731177

11741178
.clk(cptra_ss_clk_i),
1179+
.mcu_clk_cg(mcu_clk_cg),
1180+
.cptra_ss_rdc_clk_cg(), // Unused since no IPs on warm reset. MCU has different clock and Cptra has its own RDC.
1181+
1182+
11751183
.mci_rst_b(cptra_ss_rst_b_i),
11761184
.mci_pwrgood(cptra_ss_pwrgood_i),
1185+
.cptra_ss_rst_b_o(cptra_ss_rst_b_o),
11771186

11781187
// DFT
11791188
.scan_mode (cptra_ss_cptra_core_scan_mode_i),
@@ -1316,7 +1325,7 @@ module caliptra_ss_top
13161325

13171326
lc_ctrl u_lc_ctrl (
13181327
.clk_i(cptra_ss_clk_i),
1319-
.rst_ni(cptra_ss_rst_b_i),
1328+
.rst_ni(cptra_ss_rst_b_o),
13201329
.Allow_RMA_or_SCRAP_on_PPD(cptra_ss_lc_Allow_RMA_or_SCRAP_on_PPD_i),
13211330
.axi_wr_req(cptra_ss_lc_axi_wr_req_i),
13221331
.axi_wr_rsp(cptra_ss_lc_axi_wr_rsp_o),
@@ -1384,7 +1393,7 @@ module caliptra_ss_top
13841393
.MemInitFile ("otp-img.2048.vmem")
13851394
) u_otp_ctrl (
13861395
.clk_i (cptra_ss_clk_i),
1387-
.rst_ni (cptra_ss_rst_b_i),
1396+
.rst_ni (cptra_ss_rst_b_o),
13881397
.FIPS_ZEROIZATION_CMD_i (FIPS_ZEROIZATION_CMD),
13891398

13901399
.cptra_ss_strap_mcu_lsu_axi_user_i (cptra_ss_strap_mcu_lsu_axi_user_i),
@@ -1436,9 +1445,4 @@ module caliptra_ss_top
14361445
.cio_test_en_o () //TODO: Needs to be checked
14371446
);
14381447

1439-
// assign fuse_ctrl_rdy = 1;
1440-
// De-assert cptra_rst_b only after fuse_ctrl has initialized
1441-
logic cptra_rst_b; //fixme resets
1442-
assign cptra_rst_b = cptra_ss_rst_b_i;//fuse_ctrl_rdy ? cptra_soc_bfm_rst_b : 1'b0;
1443-
14441448
endmodule

src/mci/rtl/mci_boot_seqr.sv

Lines changed: 95 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -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::*;
6268
mci_boot_fsm_state_e boot_fsm_nxt;
6369
mci_boot_fsm_state_e boot_fsm_prev;
6470

65-
logic lc_done_sync;
6671
logic lc_init_nxt;
6772

68-
logic fc_opt_done_sync;
6973
logic fc_opt_init_nxt;
7074

7175
logic mci_boot_seq_brkpoint_sync;
76+
logic mcu_cpu_halt_ack_i_sync;
77+
logic mcu_cpu_halt_status_i_sync;
7278

7379
logic mcu_no_rom_config_sync;
7480

7581
logic mcu_rst_b_ff ;
7682
logic cptra_rst_b_ff;
83+
logic cptra_ss_rst_b_o_ff;
7784
logic mcu_rst_b_nxt;
7885
logic 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

8093
logic 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
/////////////////////////////////////////////////
97138
caliptra_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

105146
caliptra_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

113155
caliptra_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

121163
caliptra_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
155200
end
156201

157202

158203
always_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
255305
end
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

src/mci/rtl/mci_reg_top.sv

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -553,7 +553,6 @@ always_comb mcu_sram_dmi_uncore_wdata = mcu_dmi_uncore_wdata;
553553

554554
always_comb mci_reg_hwif_in.intr_block_rf.error0_internal_intr_r.error_mcu_sram_dmi_axi_collision_sts.hwset = mcu_sram_dmi_axi_collision_error; // Set by any protocol error violation (mirrors the bits in CPTRA_HW_ERROR_NON_FATAL)
555555

556-
// FIXME RDC clock?
557556
always_ff @(posedge clk or negedge mci_pwrgood) begin
558557
if (~mci_pwrgood) begin
559558
mcu_dmi_uncore_rdata <= '0;
@@ -821,7 +820,7 @@ assign mcu_nmi_vector = mci_reg_hwif_out.MCU_NMI_VECTOR.vec;
821820
// Write-enables for HW_ERROR_FATAL and HW_ERROR_NON_FATAL
822821
// Also calculate whether or not an unmasked event is being set, so we can
823822
// trigger the SOC interrupt signal
824-
always_comb mci_reg_hwif_in.HW_ERROR_FATAL.mcu_sram_ecc_unc.we = mcu_sram_double_ecc_error; // FIXME do we need to add a reset window disable like in caliptra?
823+
always_comb mci_reg_hwif_in.HW_ERROR_FATAL.mcu_sram_ecc_unc.we = mcu_sram_double_ecc_error;
825824
always_comb mci_reg_hwif_in.HW_ERROR_FATAL.nmi_pin .we = nmi_intr;
826825
always_comb mci_reg_hwif_in.HW_ERROR_FATAL.mcu_sram_dmi_axi_collision.we = mcu_sram_dmi_axi_collision_error;
827826
// Using we+next instead of hwset allows us to encode the reserved fields in some fashion
@@ -1268,7 +1267,7 @@ assign mci_reg_hwif_in.intr_block_rf.notif0_internal_intr_r.notif_mcu_sram_ecc_c
12681267
mci_reg i_mci_reg (
12691268

12701269
.clk (clk),
1271-
.rst ('0), // FIXME why is this tied off in soc_ifc?
1270+
.rst ('0),
12721271

12731272
.s_cpuif_req (cif_resp_if.dv),
12741273
.s_cpuif_req_is_wr (cif_resp_if.req_data.write),

0 commit comments

Comments
 (0)