-
Notifications
You must be signed in to change notification settings - Fork 38
Expand file tree
/
Copy pathmci_reg.rdl
More file actions
2427 lines (2202 loc) · 218 KB
/
mci_reg.rdl
File metadata and controls
2427 lines (2202 loc) · 218 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
// SPDX-License-Identifier: Apache-2.0
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
////////////////////////////////////////////////////////////////
// MCI Registers
addrmap mci_reg {
////////////////////////////////////////////////////////////////
// Properties
desc="Address map for Manufacturer Control Interface Block architectural registers";
addressing = regalign; // This is the default if not specified
lsb0 = true; // lsb0 property is implicit/default. See docs for
// SystemRDL 2.0 sections 9.1 and 13.4
littleendian = true;
default hw = na;
signal {activelow; async; cpuif_reset; field_reset;} mci_rst_b;
signal {activelow; async;} mci_pwrgood;
// AXI Request Signals
signal {
desc = "Asserted when a there is a valid AXI request from MCU.";
} axi_mcu_req;
// SS_CONFIG_DONE Signals
signal {
desc = "Indicates when SS configuration is unlocked, inverse of SS_CONFIG_DONE.";
} ss_config_unlock;
signal {
desc = "Indicates when SS sticky configuration is unlocked, inverse of SS_CONFIG_DONE_STICKY.";
} ss_config_unlock_sticky;
// Capabilities Lock Signals
signal {
desc = "Indicates when there is a valid AXI request from MCU or SoC Config Agent AND the CAP_LOCK register is not set";
} axi_mcu_req_or_mci_soc_config_req__cap_unlock;
signal {
desc = "Indicates when there is a valid AXI request from MCU or the SoC Config Agent.";
} axi_mcu_or_mcu_sram_config_req;
// AXI Request + SS_CONFIG_DONE Signals
signal {
desc = "Indicates when there is a valid AXI request from MCU or the SoC Config Agent.";
} axi_mcu_or_mci_soc_config_req;
signal {
desc = "Indicates when there is a valid AXI request from MCU or the SoC Config Agent AND the SS configuration is unlocked, inverse of SS_CONFIG_DONE.";
} axi_mcu_or_mci_soc_config_req__ss_config_unlock;
signal {
desc = "Indicates when there is a valid AXI request from MCU or the SoC Config Agent AND the SS configuration is unlocked, inverse of SS_CONFIG_DONE_STICKY.";
} axi_mcu_or_mci_soc_config_req__ss_config_unlock_sticky;
//defined fields by access type
field rw_ro_ro_hw {swwe = axi_mcu_or_mci_soc_config_req; hw = r;}; //writes enabled only for MCU, hw readable
field rw_rw_sticky_hw { sw=rw; hw=rw; we=true; woclr = true; resetsignal = mci_pwrgood;}; //W1C - used by HW ERROR regs
field rw_rw_sticky { sw=rw; hw=rw; we=true; swmod = true; resetsignal = mci_pwrgood;}; //writes enabled - used by FW ERROR regs
////////////////////////////////////////////////////////////////
// Registers
// ----------------------------------------
// ------------ IDENTIFICATION ------------
reg {
name = "Manufacturer Control Interface HW Capabilities";
desc = "MCU HW Capabilities. Initialized with reset values, rewritable by MCU FW.
[br]Read-only once locked.";
field {sw=rw; swwe=axi_mcu_req_or_mci_soc_config_req__cap_unlock; resetsignal=mci_rst_b;} cap[32]=32'h0;
} HW_CAPABILITIES;
reg {
name = "Manufacturer Control Interface FW Capabilities";
desc = "MCU FW Capabilities. Initialized with reset values. rewrtitable by MCU FW.
[br]Read-only once locked.";
field {sw=rw; swwe=axi_mcu_req_or_mci_soc_config_req__cap_unlock; resetsignal=mci_rst_b;} cap[32]=32'h0;
} FW_CAPABILITIES;
reg {
name = "MCI Capabilities Lock";
desc = "Lock register to disable further firmware modifications to capabilities registers.
[br]Once set, this register may not be cleared until a warm reset. If set, the values in HW_CAPABILITIES and FW_CAPABILITIES may not be modified.
[br]Read-only once locked.";
field {sw=rw; hw=r; swwe=axi_mcu_req_or_mci_soc_config_req__cap_unlock; resetsignal=mci_rst_b;} lock = 1'b0;
} CAP_LOCK;
reg {
name = "MCI/MCU HW RevID";
desc = "HW revision ID for Manufacturer Control components (MCU & MCI) that matches the official
final release milestone of Caliptra Subsystem.";
field {desc = "Official release version. Bit field encoding is:
[br][lb]15:12[rb] Major version
[br][lb]11: 8[rb] Minor version
[br][lb] 7: 0[rb] Patch version";
sw=r;} MC_GENERATION[16]=0x1000;
} HW_REV_ID;
reg {
name = "MCU FW RevID";
desc = "MCU FW revision ID";
field {sw=rw; swwe = axi_mcu_or_mci_soc_config_req; resetsignal = mci_rst_b;} REV_ID[32]=0;
} FW_REV_ID[2];
reg {
name = "MCU HW Config";
desc = "MCU HW Configuration
";
// No storage, i.e. no resetsignal
field {desc = "MCU MBOX1 SRAM SIZE KB. If 0 there is no mailbox"; hw=w; sw=r;} MCU_MBOX1_SRAM_SIZE[12];
field {desc = "MCU MBOX0 SRAM SIZE KB. If 0 there is no mailbox"; hw=w; sw=r;} MCU_MBOX0_SRAM_SIZE[12];
} HW_CONFIG0;
reg {
name = "MCU HW Config";
desc = "MCU HW Configuration";
// No storage, i.e. no resetsignal
field {desc = "Size of MCU reset counter"; hw=w; sw=r;} MIN_MCU_RST_COUNTER_WIDTH[5];
field {desc = "MCU SRAM Size KB"; hw=w; sw=r;} MCU_SRAM_SIZE[12];
} HW_CONFIG1;
// ----------------------------------------
// ---------------- STATUS ----------------
reg {
name = "FW Flow Status";
desc = "Reports the status of the firmware flows.
[br]TAP Access [with debug intent set]: RO";
field {swwe = axi_mcu_or_mci_soc_config_req; hw=r; resetsignal = mci_rst_b;} status[32]=0;
} FW_FLOW_STATUS @0x20;
reg {
name = "Flow Status";
desc = "Reports the status of HW FSMs and other flows.
[br]TAP Access [with debug intent set]: RO";
field {desc="MCI Boot FSM State"; sw=r; hw=rw ; /* no storage, no reset */} boot_fsm[4];
} HW_FLOW_STATUS;
reg {
name = "Reset Reason";
desc = "Indicates to ROM the originating cause for the PC to be reset to 0.
Firmware Update Reset indicator is reset by the warm reset and updated by SW applying MCU FW updated.
Warm Reset indicator is reset by the cold reset.
[br]TAP Access [with debug intent set]: RO";
field {desc = "FW update reset has been executed for the second+ time since MCI reset"; swwe = axi_mcu_or_mcu_sram_config_req; sw=rw; resetsignal = mci_rst_b; } FW_HITLESS_UPD_RESET=0;
field {desc = "FW update reset has been executed first time since MCI reset";swwe = axi_mcu_or_mcu_sram_config_req; sw=rw; resetsignal = mci_rst_b; } FW_BOOT_UPD_RESET=0;
field {desc = "Warm reset has been executed"; swwe = axi_mcu_or_mcu_sram_config_req; sw=rw; hw=rw; we; resetsignal = mci_pwrgood;} WARM_RESET=0;
} RESET_REASON;
reg {
name = "Reset Status";
desc = "Reports the status of the rests controlled by MCI.
[br]TAP Access [with debug intent set]: RO";
field {desc="caliptra reset status. 1: Reset asserted. 0: Reset deasserted"; sw=r; hw=rw ;} cptra_reset_sts=0;
field {desc="MCU reset status. 1: Reset asserted. 0: Reset deasserted"; sw=r; hw=rw ;} mcu_reset_sts=0;
} RESET_STATUS;
reg {
name = "Security State";
desc = "Indicates current hardware security state.";
enum device_lifecycle_e {
DEVICE_UNPROVISIONED = 2'b00 {
desc = "Unprovisioned";
};
DEVICE_MANUFACTURING = 2'b01 {
desc = "Manufacturing";
};
DEVICE_PRODUCTION = 2'b11 {
desc = "Production";
};
};
field {desc = "Device Lifecycle"; sw=r; hw=w; encode = device_lifecycle_e; resetsignal = mci_rst_b;} device_lifecycle[2]=0;
field {desc = "Debug Locked" ; sw=r; hw=w; resetsignal = mci_rst_b;} debug_locked=0;
field {desc = "scan mode signal observed at caliptra interface - only for debug mode as its used to flush assets -
when truly in scan mode, everything will be BROKEN for functional reads!";
sw=r; hw=w; resetsignal = mci_rst_b;} scan_mode=0;
} SECURITY_STATE;
// ----------------------------------------
// ---------------- ERROR -----------------
reg {
name = "Hardware Error Fatal";
desc = "Indicates fatal hardware error. Assertion of any bit in this
register results in the assertion of the SoC interrupt pin,
mci_error_fatal, unless that bit is masked using the internal
mask register. After the output interrupt is asserted, clearing
the bit in this register will not cause the interrupt to deassert.
Only an MCI reset will clear the fatal error interrupt.
[br]AXI Access: RW1C
[br]TAP Access [with debug intent set]: RO";
rw_rw_sticky_hw mcu_sram_ecc_unc=1'b0; /* Uncorrectable double-bit error in MCU SRAM */
rw_rw_sticky_hw nmi_pin=1'b0; /* Non-Maskable Interrupt due to WDT timeout */
rw_rw_sticky_hw mcu_sram_dmi_axi_collision=1'b0; /* Collision between AXI and DMI MCU SRAM. No what data is in SRAM */
} HW_ERROR_FATAL @0x40;
reg {
name = "Aggregate Error Fatal";
desc = "Indicates fatal error from another IP within Caliptra SS. Assertion of any bit in this
register results in the assertion of the SoC interrupt pin,
mci_error_fatal, unless that bit is masked using the internal
mask register. After the output interrupt is asserted, clearing
the bit in this register will not cause the interrupt to deassert.
Only an MCI reset will clear the fatal error interrupt.
[br]AXI Access: RW1C
[br]TAP Access [with debug intent set]: RO";
rw_rw_sticky_hw agg_error_fatal31 = 1'b0;
rw_rw_sticky_hw agg_error_fatal30 = 1'b0;
rw_rw_sticky_hw agg_error_fatal29 = 1'b0;
rw_rw_sticky_hw agg_error_fatal28 = 1'b0;
rw_rw_sticky_hw agg_error_fatal27 = 1'b0;
rw_rw_sticky_hw agg_error_fatal26 = 1'b0;
rw_rw_sticky_hw agg_error_fatal25 = 1'b0;
rw_rw_sticky_hw agg_error_fatal24 = 1'b0;
rw_rw_sticky_hw agg_error_fatal23 = 1'b0;
rw_rw_sticky_hw agg_error_fatal22 = 1'b0;
rw_rw_sticky_hw agg_error_fatal21 = 1'b0;
rw_rw_sticky_hw agg_error_fatal20 = 1'b0;
rw_rw_sticky_hw agg_error_fatal19 = 1'b0;
rw_rw_sticky_hw agg_error_fatal18 = 1'b0;
rw_rw_sticky_hw agg_error_fatal17 = 1'b0;
rw_rw_sticky_hw agg_error_fatal16 = 1'b0;
rw_rw_sticky_hw agg_error_fatal15 = 1'b0;
rw_rw_sticky_hw agg_error_fatal14 = 1'b0;
rw_rw_sticky_hw agg_error_fatal13 = 1'b0;
rw_rw_sticky_hw agg_error_fatal12 = 1'b0;
rw_rw_sticky_hw agg_error_fatal11 = 1'b0;
rw_rw_sticky_hw agg_error_fatal10 = 1'b0;
rw_rw_sticky_hw agg_error_fatal9 = 1'b0;
rw_rw_sticky_hw agg_error_fatal8 = 1'b0;
rw_rw_sticky_hw agg_error_fatal7 = 1'b0;
rw_rw_sticky_hw agg_error_fatal6 = 1'b0;
rw_rw_sticky_hw agg_error_fatal5 = 1'b0;
rw_rw_sticky_hw agg_error_fatal4 = 1'b0;
rw_rw_sticky_hw agg_error_fatal3 = 1'b0;
rw_rw_sticky_hw agg_error_fatal2 = 1'b0;
rw_rw_sticky_hw agg_error_fatal1 = 1'b0;
rw_rw_sticky_hw agg_error_fatal0 = 1'b0;
} AGG_ERROR_FATAL;
reg {
name = "Hardware Error Non-Fatal";
desc = "Indicates non-fatal hardware error. Assertion of any bit in this
register results in the assertion of the SoC interrupt pin,
mci_error_non_fatal, unless that bit is masked using the internal
mask register. After the output interrupt is asserted, any
change by firmware that results in all set non-fatal errors
being masked will immediately deassert the interrupt output. This means
that firmware may cause the mci_error_non_fatal signal to deassert by
writing to any of these registers, if the write results in all error
bits being cleared or masked:
[br][list]
[br] [*] HW_ERROR_NON_FATAL
[br] [*] AGG_ERROR_NON_FATAL
[br] [*] FW_ERROR_NON_FATAL
[br] [*] hw_error_non_fatal_mask
[br] [*] agg_error_non_fatal_mask
[br] [*] fw_error_non_fatal_mask
[/list]
[br]AXI Access: RW1C
[br]TAP Access [with debug intent set]: RO";
rw_rw_sticky_hw mbox0_ecc_unc=0; /* Uncorrectable double-bit error in MBOX0 */
rw_rw_sticky_hw mbox1_ecc_unc=0; /* Uncorrectable double-bit error in MBOX1 */
} HW_ERROR_NON_FATAL;
reg {
name = "Aggregate Error Non-Fatal";
desc = "Indicates non-fatal error from another IP within the Caliptra SS. Assertion of any bit in this
register results in the assertion of the SoC interrupt pin,
mci_error_non_fatal, unless that bit is masked using the internal
mask register. After the output interrupt is asserted, any
change by firmware that results in all set non-fatal errors
being masked will immediately deassert the interrupt output. This means
that firmware may cause the mci_error_non_fatal signal to deassert by
writing to any of these registers, if the write results in all error
bits being cleared or masked:
[br][list]
[br] [*] HW_ERROR_NON_FATAL
[br] [*] AGG_ERROR_NON_FATAL
[br] [*] FW_ERROR_NON_FATAL
[br] [*] hw_error_non_fatal_mask
[br] [*] agg_error_non_fatal_mask
[br] [*] fw_error_non_fatal_mask
[/list]
[br]AXI Access: RW1C
[br]TAP Access [with debug intent set]: RO";
rw_rw_sticky_hw agg_error_non_fatal31 = 1'b0;
rw_rw_sticky_hw agg_error_non_fatal30 = 1'b0;
rw_rw_sticky_hw agg_error_non_fatal29 = 1'b0;
rw_rw_sticky_hw agg_error_non_fatal28 = 1'b0;
rw_rw_sticky_hw agg_error_non_fatal27 = 1'b0;
rw_rw_sticky_hw agg_error_non_fatal26 = 1'b0;
rw_rw_sticky_hw agg_error_non_fatal25 = 1'b0;
rw_rw_sticky_hw agg_error_non_fatal24 = 1'b0;
rw_rw_sticky_hw agg_error_non_fatal23 = 1'b0;
rw_rw_sticky_hw agg_error_non_fatal22 = 1'b0;
rw_rw_sticky_hw agg_error_non_fatal21 = 1'b0;
rw_rw_sticky_hw agg_error_non_fatal20 = 1'b0;
rw_rw_sticky_hw agg_error_non_fatal19 = 1'b0;
rw_rw_sticky_hw agg_error_non_fatal18 = 1'b0;
rw_rw_sticky_hw agg_error_non_fatal17 = 1'b0;
rw_rw_sticky_hw agg_error_non_fatal16 = 1'b0;
rw_rw_sticky_hw agg_error_non_fatal15 = 1'b0;
rw_rw_sticky_hw agg_error_non_fatal14 = 1'b0;
rw_rw_sticky_hw agg_error_non_fatal13 = 1'b0;
rw_rw_sticky_hw agg_error_non_fatal12 = 1'b0;
rw_rw_sticky_hw agg_error_non_fatal11 = 1'b0;
rw_rw_sticky_hw agg_error_non_fatal10 = 1'b0;
rw_rw_sticky_hw agg_error_non_fatal9 = 1'b0;
rw_rw_sticky_hw agg_error_non_fatal8 = 1'b0;
rw_rw_sticky_hw agg_error_non_fatal7 = 1'b0;
rw_rw_sticky_hw agg_error_non_fatal6 = 1'b0;
rw_rw_sticky_hw agg_error_non_fatal5 = 1'b0;
rw_rw_sticky_hw agg_error_non_fatal4 = 1'b0;
rw_rw_sticky_hw agg_error_non_fatal3 = 1'b0;
rw_rw_sticky_hw agg_error_non_fatal2 = 1'b0;
rw_rw_sticky_hw agg_error_non_fatal1 = 1'b0;
rw_rw_sticky_hw agg_error_non_fatal0 = 1'b0;
} AGG_ERROR_NON_FATAL;
reg {
name = "Firmware Error Fatal";
desc = "Indicates fatal firmware error. Assertion of any bit in this
register results in the assertion of the SoC interrupt pin,
mci_error_fatal, unless that bit is masked using the internal
mask register. After the output interrupt is asserted, clearing
the bit in this register will not cause the interrupt to deassert.
Only an MCI reset will clear the fatal error interrupt.
[br]TAP Access [with debug intent set]: RO";
rw_rw_sticky error_code[32]=0;
} FW_ERROR_FATAL;
reg {
name = "Firmware Error Non-Fatal";
desc = "Indicates non-fatal firmware error. Assertion of any bit in this
register results in the assertion of the SoC interrupt pin,
mci_error_non_fatal, unless that bit is masked using the internal
mask register. After the output interrupt is asserted, any
change by firmware that results in all set non-fatal errors
being masked will immediately deassert the interrupt output. This means
that firmware may cause the mci_error_non_fatal signal to deassert by
writing to any of these registers, if the write results in all error
bits being cleared or masked:
[br][list]
[br] [*] HW_ERROR_NON_FATAL
[br] [*] AGG_ERROR_NON_FATAL
[br] [*] FW_ERROR_NON_FATAL
[br] [*] hw_error_non_fatal_mask
[br] [*] agg_error_non_fatal_mask
[br] [*] fw_error_non_fatal_mask
[/list]
[br]TAP Access [with debug intent set]: RO";
rw_rw_sticky error_code[32]=0;
} FW_ERROR_NON_FATAL;
reg {
name = "Hardware Error Encoding";
desc = "Encoded error value for hardware errors.
[br]TAP Access [with debug intent set]: RO";
field {resetsignal = mci_pwrgood; sw=rw; hw=r;}error_code[32]=0;
} HW_ERROR_ENC;
reg {
name = "Firmware Error Encoding";
desc = "Encoded error value for firmware errors.
[br]TAP Access [with debug intent set]: RO";
field {resetsignal = mci_pwrgood; sw=rw; hw=r;} error_code[32]=0;
} FW_ERROR_ENC;
reg {
name = "Firmware Extended Error Information";
desc = "Firmware Extended Error information for firmware errors.
[br]TAP Access [with debug intent set]: RO";
field {resetsignal = mci_pwrgood;sw=rw; hw=r;} error_info[32]=0;
} FW_EXTENDED_ERROR_INFO[8];
reg {
name = "Hardware Error Fatal Mask";
desc = "Bit mask for the register HW_ERROR_FATAL to determine
which bits are disabled for interrupt generation on the
mci_error_fatal output signal.
[br]A value of 1 in a field of this register means the corresponding bit
position in HW_ERROR_FATAL will not produce an interrupt
output assertion. If a hardware error bit is set and was previously
masked, and firmware performs a write to clear the corresponding mask
bit in this register, the interrupt output will not be asserted. Only
the same error condition reoccurring while it is unmasked will cause
a new assertion of the interrupt output.
[br]Firmware can not cause the interrupt output to deassert by setting
mask bits for fatal error conditions that have already triggered the
interrupt.";
rw_ro_ro_hw mask_mcu_sram_ecc_unc=1'b0; /* Uncorrectable double-bit error in MCU SRAM */
rw_ro_ro_hw mask_nmi_pin=1'b0; /* Non-Maskable Interrupt due to WDT timeout */
rw_ro_ro_hw mask_mcu_sram_dmi_axi_collision=1'b0; /* Collision between AXI and DMI MCU SRAM. No what data is in SRAM */
} internal_hw_error_fatal_mask;
reg {
name = "Hardware Error Non-Fatal Mask";
desc = "Bit mask for the register HW_ERROR_NON_FATAL to determine
which bits are disabled for interrupt generation on the
mci_error_non_fatal output signal.
[br]A value of 1 in a field of this register means the corresponding bit
position in HW_ERROR_NON_FATAL will not produce an interrupt
output assertion. If a hardware error bit is set that was previously
masked, and firmware performs a write to clear the corresponding mask
bit in this register, the interrupt output will not be asserted. Only
the same error condition reoccurring while it is unmasked will cause
a new assertion of the interrupt output.
[br]Any change by firmware that results in all set non-fatal errors
being masked will immediately deassert the interrupt output. This means
that firmware may cause the mci_error_non_fatal signal to deassert by
writing to any of these registers, if the write results in all error
bits being cleared or masked:
[br][list]
[br] [*] HW_ERROR_NON_FATAL
[br] [*] AGG_ERROR_NON_FATAL
[br] [*] FW_ERROR_NON_FATAL
[br] [*] hw_error_non_fatal_mask
[br] [*] agg_error_non_fatal_mask
[br] [*] fw_error_non_fatal_mask
[/list]";
rw_ro_ro_hw mask_mbox0_ecc_unc=0; /* Uncorrectable double-bit error in DCCM */
rw_ro_ro_hw mask_mbox1_ecc_unc=0; /* Uncorrectable double-bit error in DCCM */
} internal_hw_error_non_fatal_mask;
reg {
name = "Aggregate Error Fatal Mask";
desc = "Bit mask for the register AGG_ERROR_FATAL to determine
which bits are disabled for interrupt generation on the
mci_error_fatal output signal.
[br]A value of 1 in a field of this register means the corresponding bit
position in AGG_ERROR_FATAL will not produce an interrupt
output assertion. If a hardware error bit is set and was previously
masked, and firmware performs a write to clear the corresponding mask
bit in this register, the interrupt output will not be asserted. Only
the same error condition reoccurring while it is unmasked will cause
a new assertion of the interrupt output.
[br]Firmware can not cause the interrupt output to deassert by setting
mask bits for fatal error conditions that have already triggered the
interrupt.";
rw_ro_ro_hw mask_agg_error_fatal31 = 1'b0;
rw_ro_ro_hw mask_agg_error_fatal30 = 1'b0;
rw_ro_ro_hw mask_agg_error_fatal29 = 1'b0;
rw_ro_ro_hw mask_agg_error_fatal28 = 1'b0;
rw_ro_ro_hw mask_agg_error_fatal27 = 1'b0;
rw_ro_ro_hw mask_agg_error_fatal26 = 1'b0;
rw_ro_ro_hw mask_agg_error_fatal25 = 1'b0;
rw_ro_ro_hw mask_agg_error_fatal24 = 1'b0;
rw_ro_ro_hw mask_agg_error_fatal23 = 1'b0;
rw_ro_ro_hw mask_agg_error_fatal22 = 1'b0;
rw_ro_ro_hw mask_agg_error_fatal21 = 1'b0;
rw_ro_ro_hw mask_agg_error_fatal20 = 1'b0;
rw_ro_ro_hw mask_agg_error_fatal19 = 1'b0;
rw_ro_ro_hw mask_agg_error_fatal18 = 1'b0;
rw_ro_ro_hw mask_agg_error_fatal17 = 1'b0;
rw_ro_ro_hw mask_agg_error_fatal16 = 1'b0;
rw_ro_ro_hw mask_agg_error_fatal15 = 1'b0;
rw_ro_ro_hw mask_agg_error_fatal14 = 1'b0;
rw_ro_ro_hw mask_agg_error_fatal13 = 1'b0;
rw_ro_ro_hw mask_agg_error_fatal12 = 1'b0;
rw_ro_ro_hw mask_agg_error_fatal11 = 1'b0;
rw_ro_ro_hw mask_agg_error_fatal10 = 1'b0;
rw_ro_ro_hw mask_agg_error_fatal9 = 1'b0;
rw_ro_ro_hw mask_agg_error_fatal8 = 1'b0;
rw_ro_ro_hw mask_agg_error_fatal7 = 1'b0;
rw_ro_ro_hw mask_agg_error_fatal6 = 1'b0;
rw_ro_ro_hw mask_agg_error_fatal5 = 1'b0;
rw_ro_ro_hw mask_agg_error_fatal4 = 1'b0;
rw_ro_ro_hw mask_agg_error_fatal3 = 1'b0;
rw_ro_ro_hw mask_agg_error_fatal2 = 1'b0;
rw_ro_ro_hw mask_agg_error_fatal1 = 1'b0;
rw_ro_ro_hw mask_agg_error_fatal0 = 1'b0;
} internal_agg_error_fatal_mask;
reg {
name = "Aggregate Error Non-Fatal Mask";
desc = "Bit mask for the register AGG_ERROR_NON_FATAL to determine
which bits are disabled for interrupt generation on the
mci_error_non_fatal output signal.
[br]A value of 1 in a field of this register means the corresponding bit
position in AGG_ERROR_NON_FATAL will not produce an interrupt
output assertion. If a hardware error bit is set that was previously
masked, and firmware performs a write to clear the corresponding mask
bit in this register, the interrupt output will not be asserted. Only
the same error condition reoccurring while it is unmasked will cause
a new assertion of the interrupt output.
[br]Any change by firmware that results in all set non-fatal errors
being masked will immediately deassert the interrupt output. This means
that firmware may cause the mci_error_non_fatal signal to deassert by
writing to any of these registers, if the write results in all error
bits being cleared or masked:
[br][list]
[br] [*] HW_ERROR_NON_FATAL
[br] [*] AGG_ERROR_NON_FATAL
[br] [*] FW_ERROR_NON_FATAL
[br] [*] hw_error_non_fatal_mask
[br] [*] agg_error_non_fatal_mask
[br] [*] fw_error_non_fatal_mask
[/list]";
rw_ro_ro_hw mask_agg_error_non_fatal31 = 1'b0;
rw_ro_ro_hw mask_agg_error_non_fatal30 = 1'b0;
rw_ro_ro_hw mask_agg_error_non_fatal29 = 1'b0;
rw_ro_ro_hw mask_agg_error_non_fatal28 = 1'b0;
rw_ro_ro_hw mask_agg_error_non_fatal27 = 1'b0;
rw_ro_ro_hw mask_agg_error_non_fatal26 = 1'b0;
rw_ro_ro_hw mask_agg_error_non_fatal25 = 1'b0;
rw_ro_ro_hw mask_agg_error_non_fatal24 = 1'b0;
rw_ro_ro_hw mask_agg_error_non_fatal23 = 1'b0;
rw_ro_ro_hw mask_agg_error_non_fatal22 = 1'b0;
rw_ro_ro_hw mask_agg_error_non_fatal21 = 1'b0;
rw_ro_ro_hw mask_agg_error_non_fatal20 = 1'b0;
rw_ro_ro_hw mask_agg_error_non_fatal19 = 1'b0;
rw_ro_ro_hw mask_agg_error_non_fatal18 = 1'b0;
rw_ro_ro_hw mask_agg_error_non_fatal17 = 1'b0;
rw_ro_ro_hw mask_agg_error_non_fatal16 = 1'b0;
rw_ro_ro_hw mask_agg_error_non_fatal15 = 1'b0;
rw_ro_ro_hw mask_agg_error_non_fatal14 = 1'b0;
rw_ro_ro_hw mask_agg_error_non_fatal13 = 1'b0;
rw_ro_ro_hw mask_agg_error_non_fatal12 = 1'b0;
rw_ro_ro_hw mask_agg_error_non_fatal11 = 1'b0;
rw_ro_ro_hw mask_agg_error_non_fatal10 = 1'b0;
rw_ro_ro_hw mask_agg_error_non_fatal9 = 1'b0;
rw_ro_ro_hw mask_agg_error_non_fatal8 = 1'b0;
rw_ro_ro_hw mask_agg_error_non_fatal7 = 1'b0;
rw_ro_ro_hw mask_agg_error_non_fatal6 = 1'b0;
rw_ro_ro_hw mask_agg_error_non_fatal5 = 1'b0;
rw_ro_ro_hw mask_agg_error_non_fatal4 = 1'b0;
rw_ro_ro_hw mask_agg_error_non_fatal3 = 1'b0;
rw_ro_ro_hw mask_agg_error_non_fatal2 = 1'b0;
rw_ro_ro_hw mask_agg_error_non_fatal1 = 1'b0;
rw_ro_ro_hw mask_agg_error_non_fatal0 = 1'b0;
} internal_agg_error_non_fatal_mask;
reg {
name = "Firmware Error Fatal Mask";
desc = "Bit mask for the register FW_ERROR_FATAL to determine
which bits are disabled for interrupt generation on the
mci_error_fatal output signal.
[br]A value of 1 in a field of this register means the corresponding bit
position in FW_ERROR_FATAL will not produce an interrupt
output assertion. If a firmware error bit is set and was previously
masked, and firmware performs a write to clear the corresponding mask
bit in this register, the interrupt output will not be asserted. Only
the same error bit being cleared then set again while it is unmasked will cause
a new assertion of the interrupt output.
[br]Firmware can not cause the interrupt output to deassert by setting
mask bits for fatal error conditions that have already triggered the
interrupt.";
rw_ro_ro_hw mask[32]=0;
} internal_fw_error_fatal_mask;
reg {
name = "Firmware Error Non-Fatal Mask";
desc = "Bit mask for the register FW_ERROR_NON_FATAL to determine
which bits are disabled for interrupt generation on the
mci_error_non_fatal output signal.
[br]A value of 1 in a field of this register means the corresponding bit
position in FW_ERROR_NON_FATAL will not produce an interrupt
output assertion. If a firmware error bit is set that was previously
masked, and firmware performs a write to clear the corresponding mask
bit in this register, the interrupt output will not be asserted. Only
the same error bit being cleared then set again while it is unmasked will cause
a new assertion of the interrupt output.
[br]Any change by firmware that results in all set non-fatal errors
being masked will immediately deassert the interrupt output. This means
that firmware may cause the mci_error_non_fatal signal to deassert by
writing to any of these registers, if the write results in all error
bits being cleared or masked:
[br][list]
[br] [*] HW_ERROR_NON_FATAL
[br] [*] AGG_ERROR_NON_FATAL
[br] [*] FW_ERROR_NON_FATAL
[br] [*] hw_error_non_fatal_mask
[br] [*] agg_error_non_fatal_mask
[br] [*] fw_error_non_fatal_mask
[/list]";
rw_ro_ro_hw mask[32]=0;
} internal_fw_error_non_fatal_mask;
// ----------------------------------------
// ----------------- WDT ------------------
//Timer1
reg {
name = "WDT Timer1 EN register";
desc = "Watchdog timer1 enable register";
field {desc = "WDT timer1 enable"; hw = r; sw = rw; swwe = axi_mcu_or_mci_soc_config_req; resetsignal = mci_rst_b;} timer1_en = 1'b0;
} WDT_TIMER1_EN @0xA0;
reg {
name = "WDT Timer1 CTRL register";
desc = "Watchdog timer1 control register";
field {desc = "WDT timer1 restart"; hw = r; sw = rw; swwe = axi_mcu_or_mci_soc_config_req; resetsignal = mci_rst_b; singlepulse;} timer1_restart = 1'b0;
} WDT_TIMER1_CTRL;
reg {
name = "WDT Timer1 Timeout Period register";
desc = "Watchdog timer1 timeout register";
field {desc = "WDT timer1 timeout period"; hw = r; sw = rw; swwe = axi_mcu_or_mci_soc_config_req; resetsignal = mci_rst_b;} timer1_timeout_period[32] = 32'hFFFFFFFF;
} WDT_TIMER1_TIMEOUT_PERIOD[2]; // This reflects WDT_TIMEOUT_PERIOD_NUM_DWORDS in mci_pkg.sv
//Timer2
reg {
name = "WDT Timer2 EN register";
desc = "Watchdog timer2 enable register. Note: Setting this to 1 will disable the default cascaded mode and will have both timers count independently.";
field {desc = "WDT timer2 enable"; hw = r; sw = rw; swwe = axi_mcu_or_mci_soc_config_req; resetsignal = mci_rst_b;} timer2_en = 1'b0;
} WDT_TIMER2_EN;
reg {
name = "WDT Timer2 CTRL register";
desc = "Watchdog timer2 control register";
field {desc = "WDT timer2 restart"; hw = r; sw = rw; swwe = axi_mcu_or_mci_soc_config_req; resetsignal = mci_rst_b; singlepulse;} timer2_restart = 1'b0;
} WDT_TIMER2_CTRL;
reg {
name = "WDT Timer2 Timeout Period register";
desc = "Watchdog timer2 timeout register";
field {desc = "WDT timer2 timeout period"; hw = r; sw = rw; swwe = axi_mcu_or_mci_soc_config_req; resetsignal = mci_rst_b;} timer2_timeout_period[32] = 32'hFFFFFFFF;
} WDT_TIMER2_TIMEOUT_PERIOD[2]; //This reflects WDT_TIMEOUT_PERIOD_NUM_DWORDS in mci_pkg.sv
//Status
reg {
name = "WDT STATUS register";
desc = "Watchdog timer status register";
field {desc = "Timer1 timed out, timer2 enabled"; hw = rw; sw = r; resetsignal = mci_rst_b;} t1_timeout = 1'b0;
field {desc = "Timer2 timed out"; hw = rw; sw = r; resetsignal = mci_rst_b;} t2_timeout = 1'b0;
} WDT_STATUS;
// Req
reg {
name = "WDT1 Config";
desc = "SOC provided count in cycles for WDT1 timeout.";
field {sw=rw; hw=na; resetsignal = mci_pwrgood;} TIMEOUT[32]=0;
} WDT_CFG[2] @0xD0;
// ----------------------------------------
// ---------------- TIMER -----------------
reg {
name = "Timer Config";
desc = "Provides the clock period of the system clock.
Used to standardize the RISC-V Standard MTIME count register.
Clock Period is indicated as an integer number of picoseconds.";
field {desc = "Period in (ps)"; sw=rw; hw=na; resetsignal = mci_pwrgood;} clk_period[32] = 32'h0;
} MCU_TIMER_CONFIG @0xE0;
reg {
name = "mtime low";
desc = "RISC-V Standard Machine-mode Time Counter, lower 32-bits.
[br]Frequency of counter is indicated in MCU_TIMER_CONFIG.clk_period.";
field {desc = "Counter Low" ; sw = rw; precedence = sw; swmod = true; hw = r; swwe = axi_mcu_req; counter = true; incrvalue = 1; overflow = true; resetsignal = mci_pwrgood;} count_l[32] = 32'h0;
} MCU_RV_MTIME_L;
reg {
name = "mtime high";
desc = "RISC-V Standard Machine-mode Time Counter, upper 32-bits.
[br]Frequency of counter is indicated in MCU_TIMER_CONFIG.clk_period.";
field {desc = "Counter High"; sw = rw; precedence = sw; swmod = true; hw = r; swwe = axi_mcu_req; counter = true; incrvalue = 1; resetsignal = mci_pwrgood;} count_h[32] = 32'h0;
} MCU_RV_MTIME_H;
reg {
name = "mtimecmp low";
desc = "RISC-V Standard Machine-mode Time Counter Compare Value, lower 32-bits.";
field {desc = "Count Compare Low" ; sw = rw; hw = r; swwe = axi_mcu_req; resetsignal = mci_pwrgood;} compare_l[32] = 32'h0;
} MCU_RV_MTIMECMP_L;
reg {
name = "mtimecmp high";
desc = "RISC-V Standard Machine-mode Time Counter Compare Value, upper 32-bits.";
field {desc = "Count Compare High"; sw = rw; hw = r; swwe = axi_mcu_req; resetsignal = mci_pwrgood;} compare_h[32] = 32'h0;
} MCU_RV_MTIMECMP_H;
// ----------------------------------------
// ----------- RESET/BOOT MGMT ------------
reg {
name = "Reset Request;
[br]TAP Access [in debug mode]: RW";
field { desc = "Request. Writable by MCU. Causes MCU reset to be asserted by MCI. Cleared when reset is asserted."; sw=rw; hw=rw; hwclr=true; swwe=axi_mcu_or_mci_soc_config_req; resetsignal=mci_rst_b; we;} mcu_req=1'b0;
} RESET_REQUEST @0x100;
reg {
name = "MCI BOOT FSM GO";
desc = "Request MCI BootFSM to continue past the breakpoint allowing MCU and Caliptra to be brought out of reset.
[br]TAP Access [with debug intent set]: RW";
field { sw=rw; hw = rw; we;} go=1'b0;
} MCI_BOOTFSM_GO;
reg {
name = "Caliptra Boot Go";
desc = "Request Caliptra Reset to be deasserted by the MCI Boot FSM.
[br]TAP Access [in debug mode]: RW";
field { sw=rw; hw = rw; we;} go=1'b0;
} CPTRA_BOOT_GO;
reg {
name = "Firmware SRAM Exec Region Size";
desc = "Dynamic size assignment for the region of sram that contains executable instructions for MCU. Locked when SS_CONFIG_DONE is set.
[br]TAP Access [in debug mode]: RW";
field { desc="Size (in multiples of 4KiB)"; sw=rw; hw=rw; swwe=axi_mcu_or_mci_soc_config_req__ss_config_unlock; we;} size[16] = 16'h0;
} FW_SRAM_EXEC_REGION_SIZE;
reg {
name = "MCU NMI Vector";
desc = "32-bit register providing the jump vector for RISC-V to transition for NMI handling code.
Default is the base address of ROM, but may be updated for enhanced handling by runtime images.
Bit [0] is ignored to enforce half-word alignment of address.
[br]TAP Access [in debug mode]: RW";
field {desc = "NMI Vector"; hw = rw; we; sw = rw; swwe = axi_mcu_or_mci_soc_config_req__ss_config_unlock;} vec[32] = 32'h0;
} MCU_NMI_VECTOR;
reg {
name = "MCU Reset Vector";
desc = "32-bit register providing the reset vector for RISC-V do the initial fetch.
Default is determined by a HW strap strap_mcu_reset_vector and is sampled on mci_rst_b deassertions, but may be modified by SW while in debug mode.
Bit [0] is ignored to enforce half-word alignment of address.
[br]TAP Access [in debug mode]: RW";
field {desc = "NMI Vector"; hw = rw; we; sw = rw; swwe = axi_mcu_or_mci_soc_config_req__ss_config_unlock;} vec[32] = 32'h0;
} MCU_RESET_VECTOR;
// ----------------------------------------
// ------------ AxUSER CONFIG -------------
reg {
name = "Valid USER Registers";
desc = "Valid AXI USER attributes for requests from SoC AXI Interface. Only valid once LOCK is set.
[br]Read-Only once locked by AXI_USER_LOCK.";
field {sw=rw; hw=r; swwel;resetsignal = mci_rst_b;} AXI_USER[32]=0xFFFF_FFFF;
} MBOX0_VALID_AXI_USER[5] @0x180;
reg {
name = "Valid USER Register Lock";
desc = "Valid AXI_USER attributes for requests from SoC AXI Interface.
[br]Each bit corresponds to locking the associated MBO0X_VALID_AXI_USER register.
[br]Associated MBOX0_VALID_AXI_USER register is only valid once locked by this bit.
[br]AXI Access: RW1-S
[br]Read-Only once locked.";
field {sw=rw; hw=r; swwel; resetsignal = mci_rst_b;} LOCK=0;
} MBOX0_AXI_USER_LOCK[5] @0x1A0;
reg {
name = "Valid USER Registers";
desc = "Valid AXI USER attributes for requests from SoC AXI Interface. Only valid once LOCK is set.
[br]Read-Only once locked by AXI_USER_LOCK.";
field {sw=rw; hw=r; swwel;resetsignal = mci_rst_b;} AXI_USER[32]=0xFFFF_FFFF;
} MBOX1_VALID_AXI_USER[5] @0x1C0;
reg {
name = "Valid USER Register Lock";
desc = "Valid AXI_USER attributes for requests from SoC AXI Interface.
[br]Each bit corresponds to locking the associated MBO0X_VALID_AXI_USER register.
[br]Associated MBOX0_VALID_AXI_USER register is only valid once locked by this bit.
[br]AXI Access: RW1-S
[br]Read-Only once locked.";
field {sw=rw; hw=r; swwel; resetsignal = mci_rst_b;} LOCK=0;
} MBOX1_AXI_USER_LOCK[5] @0x1E0;
// ----------------------------------------
// ------------ LCC GASKET ----------------
reg {
name = "SOC DFT Enable Mask";
desc = "Masks Caliptra's SS_SOC_DBG_UNLOCK_LEVEL to enable DFT for the SOC.
[br]If a MASK bit is set along with a corresponding bit in SS_DOC_DBG_UNLOCK, SOC_DFT_EN will be enabled.
[br]Otherwise SOC_DFT_EN can only be set via LCC.";
field {sw=rw; hw=r; resetsignal = mci_pwrgood;swwe = axi_mcu_or_mci_soc_config_req__ss_config_unlock_sticky;} MASK[32]=0;
} SOC_DFT_EN[2] @0x300;
reg {
name = "SOC HW Debug Enable Mask";
desc = "Masks Caliptra's SS_SOC_DBG_UNLOCK_LEVEL to enable HW Debug for the SOC.
[br]If a MASK bit is set along with a corresponding bit in SS_DOC_DBG_UNLOCK, SOC_HW_DEBUG_EN will be enabled.
[br]Otherwise SOC_HW_DEBUG_EN can only be set via LCC.";
field {sw=rw; hw=r; resetsignal = mci_pwrgood;swwe = axi_mcu_or_mci_soc_config_req__ss_config_unlock_sticky;} MASK[32]=0;
} SOC_HW_DEBUG_EN[2];
reg {
name = "SOC Poduction Debug State Mask";
desc = "Masks Caliptra's SS_SOC_DBG_UNLOCK_LEVEL to enable Production Debug Mode State.
[br]If a MASK bit is set along with a corresponding bit in SS_DOC_DBG_UNLOCK, Security State will transition to Production Debug Mode from Production Non-Debug state.
[br]Otherwise Production Debug Mode can only be entered via LCC.";
field {sw=rw; hw=r; resetsignal = mci_pwrgood;swwe = axi_mcu_or_mci_soc_config_req__ss_config_unlock_sticky;} MASK[32]=0;
} SOC_PROD_DEBUG_STATE[2];
reg {
name = "Fuse Controller FIPS Zeroization Mask";
desc = "Masks SOC's cptra_ss_FIPS_ZEROIZATION_PPD_i to send zeroization request to the Fuse Controller. This bit shall be set by MCU ROM and is locked via SS_CONFIG_DONE.
[br]If any bit is set to 0, FIPS_ZEROIZATION_PPD_i is masked and no command is sent to the Fuse Controller.
[br]If all bits are set to 1 and FPIS_ZEROIZATION_PPD_i is set, FIPS zeriozation command sent to the Fuse Controller.
[br]Once SS_CONFIG_DONE is set, this register is read-only.";
field {sw=rw; hw=r; resetsignal = mci_pwrgood;swwe = axi_mcu_or_mci_soc_config_req__ss_config_unlock_sticky;} MASK[32]=0;
} FC_FIPS_ZEROZATION;
// ----------------------------------------
// ------------ DEBUG/GENERIC -------------
reg {
desc = "Generic input wires connected to SoC interface.";
field {sw=r; hw=rw;} wires[32]=32'b0;
} GENERIC_INPUT_WIRES[2] @0x400;
reg {
name = "Generic Output Wires";
desc = "Generic output wires connected to SoC interface.";
field {sw=rw; hw=r;} wires[32]=32'b0;
} GENERIC_OUTPUT_WIRES[2];
reg {
field {sw=rw; hw=na; resetsignal = mci_rst_b;} DATA=0;
} DEBUG_IN; // i.e. stdin
reg {
field {sw=rw; hw=na; resetsignal = mci_rst_b;} DATA=0;
} DEBUG_OUT; // i.e. stdout
reg {
name = "DEBUG INTENT";
desc = "Strap from SoC in Subsystem configuration that indicates if this boot cycle will be used for debug. In passive mode this register always reflects a value of 0.
[br]TAP Access [in debug/manuf mode]: RW";
field strap {sw = r; hw = rw; we; resetsignal = mci_pwrgood;} debug_intent=1'b0;
} SS_DEBUG_INTENT;
reg {
name = "Subsystem Config Done Sticky";
desc = "Set to indicate that all sticky configuration registers have been populated in MCI.
Locks configuration registers from further modification.
[br]Sticky until cold reset once set.
[br]TAP Access [in debug/manuf mode]: RW";
field {sw = rw; hw=rw; we; swwe=ss_config_unlock_sticky; swmod=true; resetsignal = mci_pwrgood;} done=1'h0;
} SS_CONFIG_DONE_STICKY @0x440;
reg {
name = "Subsystem Config Done";
desc = "Set to indicate that all configuration registers have been populated in MCI.
Locks configuration registers from further modification.
[br]Sticky until warm reset once set.
[br]TAP Access [in debug/manuf mode]: RW";
field {sw = rw; hw=rw; we; swwe=ss_config_unlock; swmod=true; resetsignal = mci_rst_b;} done=1'h0;
} SS_CONFIG_DONE;
reg {
name = "Production Debug Unlock PK HASH";
desc = "Production Debug Unlock PK HASH. Configured by MCU and locked when SS_CONFIG_DONE_STICKY is set.
Once SS_CONFIG_DONE_STICKY is set value persists until cold reset.";
field {sw = rw; hw = r; swwe=ss_config_unlock_sticky; resetsignal = mci_pwrgood;} hash[32]=32'h0;
} PROD_DEBUG_UNLOCK_PK_HASH_REG[8][12] @0x480;
// ----------------------------------------
// ----- DATA_VAULT/SCRATCH/RESERVED ------
// TODO: Add datavalue and lockable scratch registers in the future
// reg {
// name = "STICKY DATA VAULT CTRL";
// desc = "Controls for the Sticky Data Vault Entries (cleared on cold reset)
// [br]Caliptra Access: RO
// [br]MCU Access: RW
// [br]SOC Access: RO";
// field {desc="Lock writes to this entry. Writes will be suppressed when locked.";
// sw=rw; swwel=true; hw=r; resetsignal=mci_pwrgood;} lock_entry=0; //TODO Shoud reflect STICKY_DV_NUM_ENTRIES from dv_defines_pkg.sv
// } STICKY_DATA_VAULT_CTRL[10] @0x800;
// reg {
// name = "STICKY DATA VAULT ENTRY";
// desc = "Sticky Data Vault Entry (cleared on cold reset). Lockable.
// [br]Caliptra Access: RO
// [br]MCU Access: RW
// [br]SOC Access: RO";
// field {desc="DataVault Entry (cleared on cold reset)"; sw=rw; hw=na; swwel=true; resetsignal = mci_pwrgood;} lock_entry=0;
// } STICKY_DATA_VAULT_ENTRY[10][12];//TODO Shoud reflect STICKY_DV_NUM_ENTRIES and DV_NUM_DWORDS from dv_defines_pkg.sv
// reg {
// name = "DATA VAULT CTRL";
// desc = "Controls for the Data Vault Entries (cleared on warm reset)
// [br]Caliptra Access: RO
// [br]MCU Access: RW
// [br]SOC Access: RO";
// field {desc="Lock writes to this entry. Writes will be suppressed when locked.";
// sw=rw; swwel=true; hw=r; resetsignal=mcu_rst_b;} lock_entry=0; // TODO Shoud reflect DV_NUM_ENTRIES and DV_NUM_DWORDS from dv_defines_pkg.sv
// } DATA_VAULT_CTRL[10];// CAREFUL with the address extensions
// reg {
// name = "DATA VAULT ENTRY";
// desc = "Data Vault Entry (cleared on cold reset). Lockable.
// [br]Caliptra Access: RO
// [br]MCU Access: RW
// [br]SOC Access: RO";
// field {desc="DataVault Entry (cleared on cold reset)"; sw=rw; hw=na; swwel=true; resetsignal = mci_pwrgood;} lock_entry=0;
// } DATA_VAULT_ENTRY[10][12];// TODO Shoud reflect DV_NUM_ENTRIES and DV_NUM_DWORDS from dv_defines_pkg.sv
// reg {
// name = "STICKY LOCKABLE SCRATCH REG CTRL";
// desc = "Sticky Scratch Register Controls (cleared on cold reset)
// [br]Caliptra Access: RO
// [br]MCU Access: RW
// [br]SOC Access: RO";
// field {desc="Lock writes to the Scratch registers. Writes will be suppressed when locked.";
// sw=rw; swwel=true; hw=r; resetsignal=mci_pwrgood;} lock_entry=0;
// } STICKY_LOCKABLE_SCRATCH_REG_CTRL[8]; // TODO should reflect STICKY_LOCKQ_SCRATCH_NUM_ENTRIES
//reg {
// name = "STICKY LOCKABLE SCRATCH REG";
// desc = "Sticky Scratch Register Entries (cleared on cold reset)
// [br]Caliptra Access: RO
// [br]MCU Access: RW
// [br]SOC Access: RO";
// field {sw=rw; swwel=true; hw=na; resetsignal=mci_pwrgood;} data[32]=0;
//} STICKY_LOCKABLE_SCRATCH_REG[8]; // TODO should reflect STICKY_LOCKQ_SCRATCH_NUM_ENTRIES
//reg {
// name = "LOCKABLE SCRATCH REG CTRL";
// desc = "Scratch Register Controls (cleared on warm reset)
// [br]Caliptra Access: RO
// [br]MCU Access: RW
// [br]SOC Access: RO";
// field {desc="Lock writes to the Scratch registers. Writes will be suppressed when locked.";
// sw=rw; swwel=true; hw=r; resetsignal=mcu_rst_b;} lock_entry=0;
//} LOCKABLE_SCRATCH_REG_CTRL[10]; // TODO Shoud reflect LOCK_SCRATCH_NUM_ENTRIES from dv_defines_pkg.sv & CAREFUL with the address extensions
//reg {
// name = "LOCKABLE SCRATCH REG";
// desc = "Scratch Register Entry (cleared on cold reset)
// [br]Caliptra Access: RO
// [br]MCU Access: RW
// [br]SOC Access: RO";
// field {sw=rw; swwel=true; hw=na; resetsignal=mci_pwrgood;} data[32]=0;
//} LOCKABLE_SCRATCH_REG[10]; // TODO Shoud reflect LOCK_SCRATCH_NUM_ENTRIES from dv_defines_pkg.sv
// reg {
// name = "NON STICKY GENERIC SCRATCH REG";
// desc = "
// [br]Caliptra Access: RO
// [br]MCU Access: RW
// [br]SOC Access: RO";
// field {sw=rw; hw=na; resetsignal=mci_rst_b;} data[32]=0;
// } NON_STICKY_GENERIC_SCRATCH_REG[8]; // TODO Shoud reflect NONSTICKY_SCRATCH_NUM_ENTRIES from dv_defines_pkg.sv & CAREFUL with the address extensions
////////////////////////////////////////////////////////////////
// Interrupts
/* -----------------------
* Register File definitive definition
* ----------------------- */
// Notifications are non-error events that occur during normal operation of the module.
// E.g. a completion of a job may produce a notification.
// Error and notification events are separated into separate status/trigger registers
// to allow effective priority allocation by software
regfile intr_block_t {
/* -----------------------
* Default properties for Register File
* ----------------------- */
name = "Interrupt Register Block";
desc = "Set of registers to implement interrupt functionality
for soc interface.
All registers have the following access privileges:
[br]MCU Access: RW
[br]SOC Access: RO";
default regwidth = 32; // reg property
default accesswidth = 32; // reg property
default hw = na; // field property
default swwe = axi_mcu_or_mci_soc_config_req; // MCU should be the only entity that can control the interrupt registers
/* -----------------------
* Register definitive definitions
* ----------------------- */
/* ---- Global Interrupt Enable ---- */
reg global_intr_en_t {
name = "Per-Type Interrupt Enable Register";
desc = "Dedicated register with one bit for each event type that may produce an interrupt.";
default hw = na;
default sw = rw;
// Global enablement (for interrupts of the event types defined for this module)
field {desc = "Global enable bit for all events of type 'Error'"; } error_en = 1'b0;
field {desc = "Global enable bit for all events of type 'Notification'";} notif_en = 1'b0;
};
/* ---- Error Interrupt Enable ---- */
reg error0_intr_en_t {
name = "Per-Event Interrupt Enable Register";
desc = "Dedicated register with one bit for each event that may produce an interrupt.";
default hw = na;
default sw = rw;
// Specific enables for the events defined in this
// event type in the instantiating peripheral.
field {desc = "Enable bit for Collision between AXI and DMI port in MCU SRAM."; } error_mcu_sram_dmi_axi_collision_en = 1'b0;
field {desc = "Enable bit for Internal Errors"; } error_internal_en = 1'b0;
field {desc = "Enable bit for Mailbox ECC Double-bit Error (uncorrectable)"; } error_mbox0_ecc_unc_en = 1'b0;
field {desc = "Enable bit for Mailbox ECC Double-bit Error (uncorrectable)"; } error_mbox1_ecc_unc_en = 1'b0;
field {desc = "Enable bit for WDT Timer1 timeout"; } error_wdt_timer1_timeout_en = 1'b0;
field {desc = "Enable bit for WDT Timer2 timeout, applicable if timer2 is enabled as an independent timer";} error_wdt_timer2_timeout_en = 1'b0;
};
reg error1_intr_en_t {
name = "Per-Event Interrupt Enable Register";
desc = "Dedicated register with one bit for each event that may produce an interrupt.";
default hw = na;
default sw = rw;
field {desc = "Enable bit MCI Aggregate Error fatal bit 31"; } error_agg_error_fatal31_en = 1'b0;