[keymgr] Finalize keymgr hardening
- Fixes #7749
- Fixes #8301
Two more faults are added
- sideload control FSM faults
- reseed counter faults
Two more regwen are added
- reseed interval controls
- sideload clear placed under transactional regwen
Signed-off-by: Timothy Chen <timothytim@google.com>
diff --git a/hw/ip/keymgr/data/keymgr.hjson b/hw/ip/keymgr/data/keymgr.hjson
index 09412d4..9e7a223 100644
--- a/hw/ip/keymgr/data/keymgr.hjson
+++ b/hw/ip/keymgr/data/keymgr.hjson
@@ -382,6 +382,7 @@
desc: "sideload key slots clear"
swaccess: "rw",
hwaccess: "hro",
+ regwen: "CFG_REGWEN",
fields: [
{ bits: "2:0",
name: "VAL",
@@ -422,11 +423,27 @@
]
},
+ { name: "RESEED_INTERVAL_REGWEN",
+ desc: "regwen for reseed interval",
+ swaccess: "rw0c",
+ hwaccess: "none",
+ fields: [
+ { bits: "0",
+ name: "EN",
+ resval: "1"
+ desc: '''
+ Configuration enable for reseed interval
+ '''
+ },
+ ]
+ },
+
{ name: "RESEED_INTERVAL_SHADOWED",
- desc: "reseed interval for key manager entropy reseed",
+ desc: "Reseed interval for key manager entropy reseed",
shadowed: "true",
update_err_alert: "recov_operation_err",
storage_err_alert: "fatal_fault_err",
+ regwen: "RESEED_INTERVAL_REGWEN",
swaccess: "rw",
hwaccess: "hro",
fields: [
@@ -930,6 +947,16 @@
resval: "0x0"
desc: "Control FSM counter integrity error, asynchronous fault",
},
+ { bits: "8",
+ name: "RESEED_CNT",
+ resval: "0x0"
+ desc: "Reseed counter integrity error, asynchronous fault",
+ },
+ { bits: "9",
+ name: "SIDE_CTRL_FSM",
+ resval: "0x0"
+ desc: "Sideload control FSM integrity error, asynchronous fault",
+ },
]
},
diff --git a/hw/ip/keymgr/rtl/keymgr.sv b/hw/ip/keymgr/rtl/keymgr.sv
index c2da1d7..2160692 100644
--- a/hw/ip/keymgr/rtl/keymgr.sv
+++ b/hw/ip/keymgr/rtl/keymgr.sv
@@ -142,6 +142,7 @@
logic [LfsrWidth-1:0] seed;
logic reseed_req;
logic reseed_ack;
+ logic reseed_cnt_err;
keymgr_reseed_ctrl u_reseed_ctrl (
.clk_i,
@@ -154,7 +155,8 @@
.edn_o,
.edn_i,
.seed_en_o(seed_en),
- .seed_o(seed)
+ .seed_o(seed),
+ .cnt_err_o(reseed_cnt_err)
);
logic [63:0] lfsr;
@@ -197,6 +199,7 @@
/////////////////////////////////////
keymgr_stage_e stage_sel;
+ logic invalid_stage_sel;
keymgr_gen_out_e key_sel;
logic adv_en, id_en, gen_en;
logic wipe_key;
@@ -216,6 +219,7 @@
logic [FaultLastPos-1:0] fault_code;
logic sw_binding_unlock;
logic [CdiWidth-1:0] cdi_sel;
+ logic sideload_fsm_err;
for (genvar i = 0; i < Shares; i++) begin : gen_truncate_data
assign kmac_data_truncated[i] = kmac_data[i][KeyWidth-1:0];
@@ -230,6 +234,8 @@
.regfile_intg_err_i(regfile_intg_err),
.shadowed_update_err_i(shadowed_update_err),
.shadowed_storage_err_i(shadowed_storage_err),
+ .reseed_cnt_err_i(reseed_cnt_err),
+ .sideload_fsm_err_i(sideload_fsm_err),
.prng_reseed_req_o(reseed_req),
.prng_reseed_ack_i(reseed_ack),
.prng_en_o(ctrl_lfsr_en),
@@ -249,6 +255,7 @@
.root_key_i(otp_key_i),
.hw_sel_o(key_sel),
.stage_sel_o(stage_sel),
+ .invalid_stage_sel_o(invalid_stage_sel),
.cdi_sel_o(cdi_sel),
.wipe_key_o(wipe_key),
.adv_en_o(adv_en),
@@ -398,10 +405,10 @@
cipher_sel == Kmac ? RndCnstKmacSeed :
cipher_sel == Otbn ? RndCnstOtbnSeed : RndCnstNoneSeed;
assign output_key = (key_sel == HwKey) ? RndCnstHardOutputSeed : RndCnstSoftOutputSeed;
- assign gen_in = (stage_sel == Disable) ? {GenLfsrCopies{lfsr[31:0]}} : {reg2hw.key_version,
- reg2hw.salt,
- cipher_seed,
- output_key};
+ assign gen_in = invalid_stage_sel ? {GenLfsrCopies{lfsr[31:0]}} : {reg2hw.key_version,
+ reg2hw.salt,
+ cipher_seed,
+ output_key};
// Advance state operation input construction
for (genvar i = KeyMgrStages; i < 2**StageWidth; i++) begin : gen_key_version_fill
@@ -487,7 +494,8 @@
.prng_en_o(sideload_lfsr_en),
.aes_key_o,
.otbn_key_o,
- .kmac_key_o
+ .kmac_key_o,
+ .fsm_err_o(sideload_fsm_err)
);
for (genvar i = 0; i < 8; i++) begin : gen_sw_assigns
@@ -523,7 +531,6 @@
assign hw2reg.err_code.invalid_kmac_input.de = err_code[ErrInvalidIn];
assign hw2reg.err_code.invalid_shadow_update.de = err_code[ErrShadowUpdate];
- // detailed breakdown of the invalid_states field above
assign hw2reg.fault_status.cmd.de = fault_code[FaultKmacCmd];
assign hw2reg.fault_status.kmac_fsm.de = fault_code[FaultKmacFsm];
assign hw2reg.fault_status.kmac_op.de = fault_code[FaultKmacOp];
@@ -532,6 +539,8 @@
assign hw2reg.fault_status.shadow.de = fault_code[FaultShadow];
assign hw2reg.fault_status.ctrl_fsm_intg.de = fault_code[FaultCtrlFsm];
assign hw2reg.fault_status.ctrl_fsm_cnt.de = fault_code[FaultCtrlCnt];
+ assign hw2reg.fault_status.reseed_cnt.de = fault_code[FaultReseedCnt];
+ assign hw2reg.fault_status.side_ctrl_fsm.de = fault_code[FaultSideFsm];
assign hw2reg.fault_status.cmd.d = 1'b1;
assign hw2reg.fault_status.kmac_fsm.d = 1'b1;
assign hw2reg.fault_status.kmac_op.d = 1'b1;
@@ -540,6 +549,8 @@
assign hw2reg.fault_status.ctrl_fsm_intg.d = 1'b1;
assign hw2reg.fault_status.shadow.d = 1'b1;
assign hw2reg.fault_status.ctrl_fsm_cnt.d = 1'b1;
+ assign hw2reg.fault_status.reseed_cnt.d = 1'b1;
+ assign hw2reg.fault_status.side_ctrl_fsm.d = 1'b1;
// There are two types of alerts
// - alerts for hardware errors, these could not have been generated by software.
@@ -625,4 +636,8 @@
`ASSERT_INIT(KmacMaskCheck_A, KmacEnMasking == kmac_en_masking_i)
`endif
+ // Ensure all parameters are consistent
+ `ASSERT_INIT(FaultCntMatch_A, FaultLastPos == AsyncFaultLastIdx + SyncFaultLastIdx)
+ `ASSERT_INIT(ErrCntMatch_A, ErrLastPos == AsyncErrLastIdx + SyncErrLastIdx)
+
endmodule // keymgr
diff --git a/hw/ip/keymgr/rtl/keymgr_ctrl.sv b/hw/ip/keymgr/rtl/keymgr_ctrl.sv
index 1dabea3..1537bbf 100644
--- a/hw/ip/keymgr/rtl/keymgr_ctrl.sv
+++ b/hw/ip/keymgr/rtl/keymgr_ctrl.sv
@@ -7,7 +7,10 @@
`include "prim_assert.sv"
-module keymgr_ctrl import keymgr_pkg::*; #(
+module keymgr_ctrl
+ import keymgr_pkg::*;
+ import keymgr_reg_pkg::*;
+#(
parameter bit KmacEnMasking = 1'b1
) (
input clk_i,
@@ -20,6 +23,8 @@
input regfile_intg_err_i,
input shadowed_update_err_i,
input shadowed_storage_err_i,
+ input reseed_cnt_err_i,
+ input sideload_fsm_err_i,
// Software interface
input op_start_i,
@@ -40,6 +45,7 @@
input otp_ctrl_pkg::otp_keymgr_key_t root_key_i,
output keymgr_gen_out_e hw_sel_o,
output keymgr_stage_e stage_sel_o,
+ output logic invalid_stage_sel_o,
output logic [CdiWidth-1:0] cdi_sel_o,
// KMAC ctrl interface
@@ -258,8 +264,9 @@
assign key_o.valid = op_req;
assign cdi_sel_o = advance_sel ? cdi_cnt : op_cdi_sel_i;
+ assign invalid_stage_sel_o = ~(stage_sel_o inside {Creator, OwnerInt, Owner});
for (genvar i = 0; i < Shares; i++) begin : gen_key_out_assign
- assign key_o.key[i] = stage_sel_o == Disable ?
+ assign key_o.key[i] = invalid_stage_sel_o ?
{EntropyRounds{entropy_i[i]}} :
key_state_q[cdi_sel_o][i];
end
@@ -346,6 +353,7 @@
prim_count #(
.Width(CntWidth),
+ .OutSelDnCnt(1'b0),
.CntStyle(prim_count_pkg::DupCnt)
) u_cnt (
.clk_i,
@@ -771,6 +779,8 @@
assign async_fault_d[AsyncFaultShadow ] = shadowed_storage_err_i;
assign async_fault_d[AsyncFaultFsmIntg] = state_intg_err_q;
assign async_fault_d[AsyncFaultCntErr ] = cnt_err;
+ assign async_fault_d[AsyncFaultRCntErr] = reseed_cnt_err_i;
+ assign async_fault_d[AsyncFaultSideErr] = sideload_fsm_err_i;
// output to error code register
assign error_o[ErrInvalidOp] = op_done_o & sync_err[SyncErrInvalidOp];
@@ -778,14 +788,16 @@
assign error_o[ErrShadowUpdate] = async_err[AsyncErrShadowUpdate];
// output to fault code register
- assign fault_o[FaultKmacOp] = op_done_o & sync_fault[SyncFaultKmacOp];
- assign fault_o[FaultKmacOut] = op_done_o & sync_fault[SyncFaultKmacOut];
- assign fault_o[FaultKmacCmd] = async_fault[AsyncFaultKmacCmd];
- assign fault_o[FaultKmacFsm] = async_fault[AsyncFaultKmacFsm];
- assign fault_o[FaultRegIntg] = async_fault[AsyncFaultRegIntg];
- assign fault_o[FaultShadow] = async_fault[AsyncFaultShadow];
- assign fault_o[FaultCtrlFsm] = async_fault[AsyncFaultFsmIntg];
- assign fault_o[FaultCtrlCnt] = async_fault[AsyncFaultCntErr];
+ assign fault_o[FaultKmacOp] = op_done_o & sync_fault[SyncFaultKmacOp];
+ assign fault_o[FaultKmacOut] = op_done_o & sync_fault[SyncFaultKmacOut];
+ assign fault_o[FaultKmacCmd] = async_fault[AsyncFaultKmacCmd];
+ assign fault_o[FaultKmacFsm] = async_fault[AsyncFaultKmacFsm];
+ assign fault_o[FaultRegIntg] = async_fault[AsyncFaultRegIntg];
+ assign fault_o[FaultShadow] = async_fault[AsyncFaultShadow];
+ assign fault_o[FaultCtrlFsm] = async_fault[AsyncFaultFsmIntg];
+ assign fault_o[FaultCtrlCnt] = async_fault[AsyncFaultCntErr];
+ assign fault_o[FaultReseedCnt] = async_fault[AsyncFaultRCntErr];
+ assign fault_o[FaultSideFsm] = async_fault[AsyncFaultSideErr];
always_comb begin
status_o = OpIdle;
@@ -881,6 +893,11 @@
// Assertions
/////////////////////////////////
+ // This assertion will not work if fault_status ever takes on metafields such as
+ // qe / re etc.
+ `ASSERT_INIT(SameErrCnt_A, $bits(keymgr_reg2hw_fault_status_reg_t) ==
+ (SyncFaultLastIdx + AsyncFaultLastIdx))
+
// stage select should always be Disable whenever it is not enabled
`ASSERT(StageDisableSel_A, !en_i |-> stage_sel_o == Disable)
diff --git a/hw/ip/keymgr/rtl/keymgr_kmac_if.sv b/hw/ip/keymgr/rtl/keymgr_kmac_if.sv
index 88d2e11..1c6913f 100644
--- a/hw/ip/keymgr/rtl/keymgr_kmac_if.sv
+++ b/hw/ip/keymgr/rtl/keymgr_kmac_if.sv
@@ -133,7 +133,8 @@
logic cnt_err;
prim_count #(
.Width(CntWidth),
- .OutSelDnCnt(1'b1)
+ .OutSelDnCnt(1'b1),
+ .CntStyle(prim_count_pkg::CrossCnt)
) u_cnt (
.clk_i,
.rst_ni,
diff --git a/hw/ip/keymgr/rtl/keymgr_pkg.sv b/hw/ip/keymgr/rtl/keymgr_pkg.sv
index 64b2be2..b28c9ce 100644
--- a/hw/ip/keymgr/rtl/keymgr_pkg.sv
+++ b/hw/ip/keymgr/rtl/keymgr_pkg.sv
@@ -86,10 +86,10 @@
// Enumeration for operations
typedef enum logic [1:0] {
- Creator = 0,
- OwnerInt = 1,
- Owner = 2,
- Disable = 3
+ Creator,
+ OwnerInt,
+ Owner,
+ Disable
} keymgr_stage_e;
// Enumeration for sideload sel
@@ -157,13 +157,15 @@
SyncFaultLastIdx
} keymgr_sync_fault_e;
- typedef enum logic [2:0] {
+ typedef enum logic [3:0] {
AsyncFaultKmacCmd,
AsyncFaultKmacFsm,
AsyncFaultRegIntg,
AsyncFaultShadow,
AsyncFaultFsmIntg,
AsyncFaultCntErr,
+ AsyncFaultRCntErr,
+ AsyncFaultSideErr,
AsyncFaultLastIdx
} keymgr_async_fault_e;
@@ -187,6 +189,8 @@
FaultShadow,
FaultCtrlFsm,
FaultCtrlCnt,
+ FaultReseedCnt,
+ FaultSideFsm,
FaultLastPos
} keymgr_fault_pos_e;
diff --git a/hw/ip/keymgr/rtl/keymgr_reg_pkg.sv b/hw/ip/keymgr/rtl/keymgr_reg_pkg.sv
index 67a2976..92b5a79 100644
--- a/hw/ip/keymgr/rtl/keymgr_reg_pkg.sv
+++ b/hw/ip/keymgr/rtl/keymgr_reg_pkg.sv
@@ -133,6 +133,12 @@
struct packed {
logic q;
} ctrl_fsm_cnt;
+ struct packed {
+ logic q;
+ } reseed_cnt;
+ struct packed {
+ logic q;
+ } side_ctrl_fsm;
} keymgr_reg2hw_fault_status_reg_t;
typedef struct packed {
@@ -223,40 +229,48 @@
logic d;
logic de;
} ctrl_fsm_cnt;
+ struct packed {
+ logic d;
+ logic de;
+ } reseed_cnt;
+ struct packed {
+ logic d;
+ logic de;
+ } side_ctrl_fsm;
} keymgr_hw2reg_fault_status_reg_t;
// Register -> HW type
typedef struct packed {
- keymgr_reg2hw_intr_state_reg_t intr_state; // [940:940]
- keymgr_reg2hw_intr_enable_reg_t intr_enable; // [939:939]
- keymgr_reg2hw_intr_test_reg_t intr_test; // [938:937]
- keymgr_reg2hw_alert_test_reg_t alert_test; // [936:933]
- keymgr_reg2hw_control_reg_t control; // [932:925]
- keymgr_reg2hw_sideload_clear_reg_t sideload_clear; // [924:922]
- keymgr_reg2hw_reseed_interval_shadowed_reg_t reseed_interval_shadowed; // [921:906]
- keymgr_reg2hw_sw_binding_regwen_reg_t sw_binding_regwen; // [905:904]
- keymgr_reg2hw_sealing_sw_binding_mreg_t [7:0] sealing_sw_binding; // [903:648]
- keymgr_reg2hw_attest_sw_binding_mreg_t [7:0] attest_sw_binding; // [647:392]
- keymgr_reg2hw_salt_mreg_t [7:0] salt; // [391:136]
- keymgr_reg2hw_key_version_mreg_t [0:0] key_version; // [135:104]
- keymgr_reg2hw_max_creator_key_ver_shadowed_reg_t max_creator_key_ver_shadowed; // [103:72]
- keymgr_reg2hw_max_owner_int_key_ver_shadowed_reg_t max_owner_int_key_ver_shadowed; // [71:40]
- keymgr_reg2hw_max_owner_key_ver_shadowed_reg_t max_owner_key_ver_shadowed; // [39:8]
- keymgr_reg2hw_fault_status_reg_t fault_status; // [7:0]
+ keymgr_reg2hw_intr_state_reg_t intr_state; // [942:942]
+ keymgr_reg2hw_intr_enable_reg_t intr_enable; // [941:941]
+ keymgr_reg2hw_intr_test_reg_t intr_test; // [940:939]
+ keymgr_reg2hw_alert_test_reg_t alert_test; // [938:935]
+ keymgr_reg2hw_control_reg_t control; // [934:927]
+ keymgr_reg2hw_sideload_clear_reg_t sideload_clear; // [926:924]
+ keymgr_reg2hw_reseed_interval_shadowed_reg_t reseed_interval_shadowed; // [923:908]
+ keymgr_reg2hw_sw_binding_regwen_reg_t sw_binding_regwen; // [907:906]
+ keymgr_reg2hw_sealing_sw_binding_mreg_t [7:0] sealing_sw_binding; // [905:650]
+ keymgr_reg2hw_attest_sw_binding_mreg_t [7:0] attest_sw_binding; // [649:394]
+ keymgr_reg2hw_salt_mreg_t [7:0] salt; // [393:138]
+ keymgr_reg2hw_key_version_mreg_t [0:0] key_version; // [137:106]
+ keymgr_reg2hw_max_creator_key_ver_shadowed_reg_t max_creator_key_ver_shadowed; // [105:74]
+ keymgr_reg2hw_max_owner_int_key_ver_shadowed_reg_t max_owner_int_key_ver_shadowed; // [73:42]
+ keymgr_reg2hw_max_owner_key_ver_shadowed_reg_t max_owner_key_ver_shadowed; // [41:10]
+ keymgr_reg2hw_fault_status_reg_t fault_status; // [9:0]
} keymgr_reg2hw_t;
// HW -> register type
typedef struct packed {
- keymgr_hw2reg_intr_state_reg_t intr_state; // [562:561]
- keymgr_hw2reg_cfg_regwen_reg_t cfg_regwen; // [560:560]
- keymgr_hw2reg_control_reg_t control; // [559:558]
- keymgr_hw2reg_sw_binding_regwen_reg_t sw_binding_regwen; // [557:557]
- keymgr_hw2reg_sw_share0_output_mreg_t [7:0] sw_share0_output; // [556:293]
- keymgr_hw2reg_sw_share1_output_mreg_t [7:0] sw_share1_output; // [292:29]
- keymgr_hw2reg_working_state_reg_t working_state; // [28:25]
- keymgr_hw2reg_op_status_reg_t op_status; // [24:22]
- keymgr_hw2reg_err_code_reg_t err_code; // [21:16]
- keymgr_hw2reg_fault_status_reg_t fault_status; // [15:0]
+ keymgr_hw2reg_intr_state_reg_t intr_state; // [566:565]
+ keymgr_hw2reg_cfg_regwen_reg_t cfg_regwen; // [564:564]
+ keymgr_hw2reg_control_reg_t control; // [563:562]
+ keymgr_hw2reg_sw_binding_regwen_reg_t sw_binding_regwen; // [561:561]
+ keymgr_hw2reg_sw_share0_output_mreg_t [7:0] sw_share0_output; // [560:297]
+ keymgr_hw2reg_sw_share1_output_mreg_t [7:0] sw_share1_output; // [296:33]
+ keymgr_hw2reg_working_state_reg_t working_state; // [32:29]
+ keymgr_hw2reg_op_status_reg_t op_status; // [28:26]
+ keymgr_hw2reg_err_code_reg_t err_code; // [25:20]
+ keymgr_hw2reg_fault_status_reg_t fault_status; // [19:0]
} keymgr_hw2reg_t;
// Register offsets
@@ -267,59 +281,60 @@
parameter logic [BlockAw-1:0] KEYMGR_CFG_REGWEN_OFFSET = 8'h 10;
parameter logic [BlockAw-1:0] KEYMGR_CONTROL_OFFSET = 8'h 14;
parameter logic [BlockAw-1:0] KEYMGR_SIDELOAD_CLEAR_OFFSET = 8'h 18;
- parameter logic [BlockAw-1:0] KEYMGR_RESEED_INTERVAL_SHADOWED_OFFSET = 8'h 1c;
- parameter logic [BlockAw-1:0] KEYMGR_SW_BINDING_REGWEN_OFFSET = 8'h 20;
- parameter logic [BlockAw-1:0] KEYMGR_SEALING_SW_BINDING_0_OFFSET = 8'h 24;
- parameter logic [BlockAw-1:0] KEYMGR_SEALING_SW_BINDING_1_OFFSET = 8'h 28;
- parameter logic [BlockAw-1:0] KEYMGR_SEALING_SW_BINDING_2_OFFSET = 8'h 2c;
- parameter logic [BlockAw-1:0] KEYMGR_SEALING_SW_BINDING_3_OFFSET = 8'h 30;
- parameter logic [BlockAw-1:0] KEYMGR_SEALING_SW_BINDING_4_OFFSET = 8'h 34;
- parameter logic [BlockAw-1:0] KEYMGR_SEALING_SW_BINDING_5_OFFSET = 8'h 38;
- parameter logic [BlockAw-1:0] KEYMGR_SEALING_SW_BINDING_6_OFFSET = 8'h 3c;
- parameter logic [BlockAw-1:0] KEYMGR_SEALING_SW_BINDING_7_OFFSET = 8'h 40;
- parameter logic [BlockAw-1:0] KEYMGR_ATTEST_SW_BINDING_0_OFFSET = 8'h 44;
- parameter logic [BlockAw-1:0] KEYMGR_ATTEST_SW_BINDING_1_OFFSET = 8'h 48;
- parameter logic [BlockAw-1:0] KEYMGR_ATTEST_SW_BINDING_2_OFFSET = 8'h 4c;
- parameter logic [BlockAw-1:0] KEYMGR_ATTEST_SW_BINDING_3_OFFSET = 8'h 50;
- parameter logic [BlockAw-1:0] KEYMGR_ATTEST_SW_BINDING_4_OFFSET = 8'h 54;
- parameter logic [BlockAw-1:0] KEYMGR_ATTEST_SW_BINDING_5_OFFSET = 8'h 58;
- parameter logic [BlockAw-1:0] KEYMGR_ATTEST_SW_BINDING_6_OFFSET = 8'h 5c;
- parameter logic [BlockAw-1:0] KEYMGR_ATTEST_SW_BINDING_7_OFFSET = 8'h 60;
- parameter logic [BlockAw-1:0] KEYMGR_SALT_0_OFFSET = 8'h 64;
- parameter logic [BlockAw-1:0] KEYMGR_SALT_1_OFFSET = 8'h 68;
- parameter logic [BlockAw-1:0] KEYMGR_SALT_2_OFFSET = 8'h 6c;
- parameter logic [BlockAw-1:0] KEYMGR_SALT_3_OFFSET = 8'h 70;
- parameter logic [BlockAw-1:0] KEYMGR_SALT_4_OFFSET = 8'h 74;
- parameter logic [BlockAw-1:0] KEYMGR_SALT_5_OFFSET = 8'h 78;
- parameter logic [BlockAw-1:0] KEYMGR_SALT_6_OFFSET = 8'h 7c;
- parameter logic [BlockAw-1:0] KEYMGR_SALT_7_OFFSET = 8'h 80;
- parameter logic [BlockAw-1:0] KEYMGR_KEY_VERSION_OFFSET = 8'h 84;
- parameter logic [BlockAw-1:0] KEYMGR_MAX_CREATOR_KEY_VER_REGWEN_OFFSET = 8'h 88;
- parameter logic [BlockAw-1:0] KEYMGR_MAX_CREATOR_KEY_VER_SHADOWED_OFFSET = 8'h 8c;
- parameter logic [BlockAw-1:0] KEYMGR_MAX_OWNER_INT_KEY_VER_REGWEN_OFFSET = 8'h 90;
- parameter logic [BlockAw-1:0] KEYMGR_MAX_OWNER_INT_KEY_VER_SHADOWED_OFFSET = 8'h 94;
- parameter logic [BlockAw-1:0] KEYMGR_MAX_OWNER_KEY_VER_REGWEN_OFFSET = 8'h 98;
- parameter logic [BlockAw-1:0] KEYMGR_MAX_OWNER_KEY_VER_SHADOWED_OFFSET = 8'h 9c;
- parameter logic [BlockAw-1:0] KEYMGR_SW_SHARE0_OUTPUT_0_OFFSET = 8'h a0;
- parameter logic [BlockAw-1:0] KEYMGR_SW_SHARE0_OUTPUT_1_OFFSET = 8'h a4;
- parameter logic [BlockAw-1:0] KEYMGR_SW_SHARE0_OUTPUT_2_OFFSET = 8'h a8;
- parameter logic [BlockAw-1:0] KEYMGR_SW_SHARE0_OUTPUT_3_OFFSET = 8'h ac;
- parameter logic [BlockAw-1:0] KEYMGR_SW_SHARE0_OUTPUT_4_OFFSET = 8'h b0;
- parameter logic [BlockAw-1:0] KEYMGR_SW_SHARE0_OUTPUT_5_OFFSET = 8'h b4;
- parameter logic [BlockAw-1:0] KEYMGR_SW_SHARE0_OUTPUT_6_OFFSET = 8'h b8;
- parameter logic [BlockAw-1:0] KEYMGR_SW_SHARE0_OUTPUT_7_OFFSET = 8'h bc;
- parameter logic [BlockAw-1:0] KEYMGR_SW_SHARE1_OUTPUT_0_OFFSET = 8'h c0;
- parameter logic [BlockAw-1:0] KEYMGR_SW_SHARE1_OUTPUT_1_OFFSET = 8'h c4;
- parameter logic [BlockAw-1:0] KEYMGR_SW_SHARE1_OUTPUT_2_OFFSET = 8'h c8;
- parameter logic [BlockAw-1:0] KEYMGR_SW_SHARE1_OUTPUT_3_OFFSET = 8'h cc;
- parameter logic [BlockAw-1:0] KEYMGR_SW_SHARE1_OUTPUT_4_OFFSET = 8'h d0;
- parameter logic [BlockAw-1:0] KEYMGR_SW_SHARE1_OUTPUT_5_OFFSET = 8'h d4;
- parameter logic [BlockAw-1:0] KEYMGR_SW_SHARE1_OUTPUT_6_OFFSET = 8'h d8;
- parameter logic [BlockAw-1:0] KEYMGR_SW_SHARE1_OUTPUT_7_OFFSET = 8'h dc;
- parameter logic [BlockAw-1:0] KEYMGR_WORKING_STATE_OFFSET = 8'h e0;
- parameter logic [BlockAw-1:0] KEYMGR_OP_STATUS_OFFSET = 8'h e4;
- parameter logic [BlockAw-1:0] KEYMGR_ERR_CODE_OFFSET = 8'h e8;
- parameter logic [BlockAw-1:0] KEYMGR_FAULT_STATUS_OFFSET = 8'h ec;
+ parameter logic [BlockAw-1:0] KEYMGR_RESEED_INTERVAL_REGWEN_OFFSET = 8'h 1c;
+ parameter logic [BlockAw-1:0] KEYMGR_RESEED_INTERVAL_SHADOWED_OFFSET = 8'h 20;
+ parameter logic [BlockAw-1:0] KEYMGR_SW_BINDING_REGWEN_OFFSET = 8'h 24;
+ parameter logic [BlockAw-1:0] KEYMGR_SEALING_SW_BINDING_0_OFFSET = 8'h 28;
+ parameter logic [BlockAw-1:0] KEYMGR_SEALING_SW_BINDING_1_OFFSET = 8'h 2c;
+ parameter logic [BlockAw-1:0] KEYMGR_SEALING_SW_BINDING_2_OFFSET = 8'h 30;
+ parameter logic [BlockAw-1:0] KEYMGR_SEALING_SW_BINDING_3_OFFSET = 8'h 34;
+ parameter logic [BlockAw-1:0] KEYMGR_SEALING_SW_BINDING_4_OFFSET = 8'h 38;
+ parameter logic [BlockAw-1:0] KEYMGR_SEALING_SW_BINDING_5_OFFSET = 8'h 3c;
+ parameter logic [BlockAw-1:0] KEYMGR_SEALING_SW_BINDING_6_OFFSET = 8'h 40;
+ parameter logic [BlockAw-1:0] KEYMGR_SEALING_SW_BINDING_7_OFFSET = 8'h 44;
+ parameter logic [BlockAw-1:0] KEYMGR_ATTEST_SW_BINDING_0_OFFSET = 8'h 48;
+ parameter logic [BlockAw-1:0] KEYMGR_ATTEST_SW_BINDING_1_OFFSET = 8'h 4c;
+ parameter logic [BlockAw-1:0] KEYMGR_ATTEST_SW_BINDING_2_OFFSET = 8'h 50;
+ parameter logic [BlockAw-1:0] KEYMGR_ATTEST_SW_BINDING_3_OFFSET = 8'h 54;
+ parameter logic [BlockAw-1:0] KEYMGR_ATTEST_SW_BINDING_4_OFFSET = 8'h 58;
+ parameter logic [BlockAw-1:0] KEYMGR_ATTEST_SW_BINDING_5_OFFSET = 8'h 5c;
+ parameter logic [BlockAw-1:0] KEYMGR_ATTEST_SW_BINDING_6_OFFSET = 8'h 60;
+ parameter logic [BlockAw-1:0] KEYMGR_ATTEST_SW_BINDING_7_OFFSET = 8'h 64;
+ parameter logic [BlockAw-1:0] KEYMGR_SALT_0_OFFSET = 8'h 68;
+ parameter logic [BlockAw-1:0] KEYMGR_SALT_1_OFFSET = 8'h 6c;
+ parameter logic [BlockAw-1:0] KEYMGR_SALT_2_OFFSET = 8'h 70;
+ parameter logic [BlockAw-1:0] KEYMGR_SALT_3_OFFSET = 8'h 74;
+ parameter logic [BlockAw-1:0] KEYMGR_SALT_4_OFFSET = 8'h 78;
+ parameter logic [BlockAw-1:0] KEYMGR_SALT_5_OFFSET = 8'h 7c;
+ parameter logic [BlockAw-1:0] KEYMGR_SALT_6_OFFSET = 8'h 80;
+ parameter logic [BlockAw-1:0] KEYMGR_SALT_7_OFFSET = 8'h 84;
+ parameter logic [BlockAw-1:0] KEYMGR_KEY_VERSION_OFFSET = 8'h 88;
+ parameter logic [BlockAw-1:0] KEYMGR_MAX_CREATOR_KEY_VER_REGWEN_OFFSET = 8'h 8c;
+ parameter logic [BlockAw-1:0] KEYMGR_MAX_CREATOR_KEY_VER_SHADOWED_OFFSET = 8'h 90;
+ parameter logic [BlockAw-1:0] KEYMGR_MAX_OWNER_INT_KEY_VER_REGWEN_OFFSET = 8'h 94;
+ parameter logic [BlockAw-1:0] KEYMGR_MAX_OWNER_INT_KEY_VER_SHADOWED_OFFSET = 8'h 98;
+ parameter logic [BlockAw-1:0] KEYMGR_MAX_OWNER_KEY_VER_REGWEN_OFFSET = 8'h 9c;
+ parameter logic [BlockAw-1:0] KEYMGR_MAX_OWNER_KEY_VER_SHADOWED_OFFSET = 8'h a0;
+ parameter logic [BlockAw-1:0] KEYMGR_SW_SHARE0_OUTPUT_0_OFFSET = 8'h a4;
+ parameter logic [BlockAw-1:0] KEYMGR_SW_SHARE0_OUTPUT_1_OFFSET = 8'h a8;
+ parameter logic [BlockAw-1:0] KEYMGR_SW_SHARE0_OUTPUT_2_OFFSET = 8'h ac;
+ parameter logic [BlockAw-1:0] KEYMGR_SW_SHARE0_OUTPUT_3_OFFSET = 8'h b0;
+ parameter logic [BlockAw-1:0] KEYMGR_SW_SHARE0_OUTPUT_4_OFFSET = 8'h b4;
+ parameter logic [BlockAw-1:0] KEYMGR_SW_SHARE0_OUTPUT_5_OFFSET = 8'h b8;
+ parameter logic [BlockAw-1:0] KEYMGR_SW_SHARE0_OUTPUT_6_OFFSET = 8'h bc;
+ parameter logic [BlockAw-1:0] KEYMGR_SW_SHARE0_OUTPUT_7_OFFSET = 8'h c0;
+ parameter logic [BlockAw-1:0] KEYMGR_SW_SHARE1_OUTPUT_0_OFFSET = 8'h c4;
+ parameter logic [BlockAw-1:0] KEYMGR_SW_SHARE1_OUTPUT_1_OFFSET = 8'h c8;
+ parameter logic [BlockAw-1:0] KEYMGR_SW_SHARE1_OUTPUT_2_OFFSET = 8'h cc;
+ parameter logic [BlockAw-1:0] KEYMGR_SW_SHARE1_OUTPUT_3_OFFSET = 8'h d0;
+ parameter logic [BlockAw-1:0] KEYMGR_SW_SHARE1_OUTPUT_4_OFFSET = 8'h d4;
+ parameter logic [BlockAw-1:0] KEYMGR_SW_SHARE1_OUTPUT_5_OFFSET = 8'h d8;
+ parameter logic [BlockAw-1:0] KEYMGR_SW_SHARE1_OUTPUT_6_OFFSET = 8'h dc;
+ parameter logic [BlockAw-1:0] KEYMGR_SW_SHARE1_OUTPUT_7_OFFSET = 8'h e0;
+ parameter logic [BlockAw-1:0] KEYMGR_WORKING_STATE_OFFSET = 8'h e4;
+ parameter logic [BlockAw-1:0] KEYMGR_OP_STATUS_OFFSET = 8'h e8;
+ parameter logic [BlockAw-1:0] KEYMGR_ERR_CODE_OFFSET = 8'h ec;
+ parameter logic [BlockAw-1:0] KEYMGR_FAULT_STATUS_OFFSET = 8'h f0;
// Reset values for hwext registers and their fields
parameter logic [0:0] KEYMGR_INTR_TEST_RESVAL = 1'h 0;
@@ -341,6 +356,7 @@
KEYMGR_CFG_REGWEN,
KEYMGR_CONTROL,
KEYMGR_SIDELOAD_CLEAR,
+ KEYMGR_RESEED_INTERVAL_REGWEN,
KEYMGR_RESEED_INTERVAL_SHADOWED,
KEYMGR_SW_BINDING_REGWEN,
KEYMGR_SEALING_SW_BINDING_0,
@@ -397,7 +413,7 @@
} keymgr_id_e;
// Register width information to check illegal writes
- parameter logic [3:0] KEYMGR_PERMIT [60] = '{
+ parameter logic [3:0] KEYMGR_PERMIT [61] = '{
4'b 0001, // index[ 0] KEYMGR_INTR_STATE
4'b 0001, // index[ 1] KEYMGR_INTR_ENABLE
4'b 0001, // index[ 2] KEYMGR_INTR_TEST
@@ -405,59 +421,60 @@
4'b 0001, // index[ 4] KEYMGR_CFG_REGWEN
4'b 0011, // index[ 5] KEYMGR_CONTROL
4'b 0001, // index[ 6] KEYMGR_SIDELOAD_CLEAR
- 4'b 0011, // index[ 7] KEYMGR_RESEED_INTERVAL_SHADOWED
- 4'b 0001, // index[ 8] KEYMGR_SW_BINDING_REGWEN
- 4'b 1111, // index[ 9] KEYMGR_SEALING_SW_BINDING_0
- 4'b 1111, // index[10] KEYMGR_SEALING_SW_BINDING_1
- 4'b 1111, // index[11] KEYMGR_SEALING_SW_BINDING_2
- 4'b 1111, // index[12] KEYMGR_SEALING_SW_BINDING_3
- 4'b 1111, // index[13] KEYMGR_SEALING_SW_BINDING_4
- 4'b 1111, // index[14] KEYMGR_SEALING_SW_BINDING_5
- 4'b 1111, // index[15] KEYMGR_SEALING_SW_BINDING_6
- 4'b 1111, // index[16] KEYMGR_SEALING_SW_BINDING_7
- 4'b 1111, // index[17] KEYMGR_ATTEST_SW_BINDING_0
- 4'b 1111, // index[18] KEYMGR_ATTEST_SW_BINDING_1
- 4'b 1111, // index[19] KEYMGR_ATTEST_SW_BINDING_2
- 4'b 1111, // index[20] KEYMGR_ATTEST_SW_BINDING_3
- 4'b 1111, // index[21] KEYMGR_ATTEST_SW_BINDING_4
- 4'b 1111, // index[22] KEYMGR_ATTEST_SW_BINDING_5
- 4'b 1111, // index[23] KEYMGR_ATTEST_SW_BINDING_6
- 4'b 1111, // index[24] KEYMGR_ATTEST_SW_BINDING_7
- 4'b 1111, // index[25] KEYMGR_SALT_0
- 4'b 1111, // index[26] KEYMGR_SALT_1
- 4'b 1111, // index[27] KEYMGR_SALT_2
- 4'b 1111, // index[28] KEYMGR_SALT_3
- 4'b 1111, // index[29] KEYMGR_SALT_4
- 4'b 1111, // index[30] KEYMGR_SALT_5
- 4'b 1111, // index[31] KEYMGR_SALT_6
- 4'b 1111, // index[32] KEYMGR_SALT_7
- 4'b 1111, // index[33] KEYMGR_KEY_VERSION
- 4'b 0001, // index[34] KEYMGR_MAX_CREATOR_KEY_VER_REGWEN
- 4'b 1111, // index[35] KEYMGR_MAX_CREATOR_KEY_VER_SHADOWED
- 4'b 0001, // index[36] KEYMGR_MAX_OWNER_INT_KEY_VER_REGWEN
- 4'b 1111, // index[37] KEYMGR_MAX_OWNER_INT_KEY_VER_SHADOWED
- 4'b 0001, // index[38] KEYMGR_MAX_OWNER_KEY_VER_REGWEN
- 4'b 1111, // index[39] KEYMGR_MAX_OWNER_KEY_VER_SHADOWED
- 4'b 1111, // index[40] KEYMGR_SW_SHARE0_OUTPUT_0
- 4'b 1111, // index[41] KEYMGR_SW_SHARE0_OUTPUT_1
- 4'b 1111, // index[42] KEYMGR_SW_SHARE0_OUTPUT_2
- 4'b 1111, // index[43] KEYMGR_SW_SHARE0_OUTPUT_3
- 4'b 1111, // index[44] KEYMGR_SW_SHARE0_OUTPUT_4
- 4'b 1111, // index[45] KEYMGR_SW_SHARE0_OUTPUT_5
- 4'b 1111, // index[46] KEYMGR_SW_SHARE0_OUTPUT_6
- 4'b 1111, // index[47] KEYMGR_SW_SHARE0_OUTPUT_7
- 4'b 1111, // index[48] KEYMGR_SW_SHARE1_OUTPUT_0
- 4'b 1111, // index[49] KEYMGR_SW_SHARE1_OUTPUT_1
- 4'b 1111, // index[50] KEYMGR_SW_SHARE1_OUTPUT_2
- 4'b 1111, // index[51] KEYMGR_SW_SHARE1_OUTPUT_3
- 4'b 1111, // index[52] KEYMGR_SW_SHARE1_OUTPUT_4
- 4'b 1111, // index[53] KEYMGR_SW_SHARE1_OUTPUT_5
- 4'b 1111, // index[54] KEYMGR_SW_SHARE1_OUTPUT_6
- 4'b 1111, // index[55] KEYMGR_SW_SHARE1_OUTPUT_7
- 4'b 0001, // index[56] KEYMGR_WORKING_STATE
- 4'b 0001, // index[57] KEYMGR_OP_STATUS
- 4'b 0001, // index[58] KEYMGR_ERR_CODE
- 4'b 0001 // index[59] KEYMGR_FAULT_STATUS
+ 4'b 0001, // index[ 7] KEYMGR_RESEED_INTERVAL_REGWEN
+ 4'b 0011, // index[ 8] KEYMGR_RESEED_INTERVAL_SHADOWED
+ 4'b 0001, // index[ 9] KEYMGR_SW_BINDING_REGWEN
+ 4'b 1111, // index[10] KEYMGR_SEALING_SW_BINDING_0
+ 4'b 1111, // index[11] KEYMGR_SEALING_SW_BINDING_1
+ 4'b 1111, // index[12] KEYMGR_SEALING_SW_BINDING_2
+ 4'b 1111, // index[13] KEYMGR_SEALING_SW_BINDING_3
+ 4'b 1111, // index[14] KEYMGR_SEALING_SW_BINDING_4
+ 4'b 1111, // index[15] KEYMGR_SEALING_SW_BINDING_5
+ 4'b 1111, // index[16] KEYMGR_SEALING_SW_BINDING_6
+ 4'b 1111, // index[17] KEYMGR_SEALING_SW_BINDING_7
+ 4'b 1111, // index[18] KEYMGR_ATTEST_SW_BINDING_0
+ 4'b 1111, // index[19] KEYMGR_ATTEST_SW_BINDING_1
+ 4'b 1111, // index[20] KEYMGR_ATTEST_SW_BINDING_2
+ 4'b 1111, // index[21] KEYMGR_ATTEST_SW_BINDING_3
+ 4'b 1111, // index[22] KEYMGR_ATTEST_SW_BINDING_4
+ 4'b 1111, // index[23] KEYMGR_ATTEST_SW_BINDING_5
+ 4'b 1111, // index[24] KEYMGR_ATTEST_SW_BINDING_6
+ 4'b 1111, // index[25] KEYMGR_ATTEST_SW_BINDING_7
+ 4'b 1111, // index[26] KEYMGR_SALT_0
+ 4'b 1111, // index[27] KEYMGR_SALT_1
+ 4'b 1111, // index[28] KEYMGR_SALT_2
+ 4'b 1111, // index[29] KEYMGR_SALT_3
+ 4'b 1111, // index[30] KEYMGR_SALT_4
+ 4'b 1111, // index[31] KEYMGR_SALT_5
+ 4'b 1111, // index[32] KEYMGR_SALT_6
+ 4'b 1111, // index[33] KEYMGR_SALT_7
+ 4'b 1111, // index[34] KEYMGR_KEY_VERSION
+ 4'b 0001, // index[35] KEYMGR_MAX_CREATOR_KEY_VER_REGWEN
+ 4'b 1111, // index[36] KEYMGR_MAX_CREATOR_KEY_VER_SHADOWED
+ 4'b 0001, // index[37] KEYMGR_MAX_OWNER_INT_KEY_VER_REGWEN
+ 4'b 1111, // index[38] KEYMGR_MAX_OWNER_INT_KEY_VER_SHADOWED
+ 4'b 0001, // index[39] KEYMGR_MAX_OWNER_KEY_VER_REGWEN
+ 4'b 1111, // index[40] KEYMGR_MAX_OWNER_KEY_VER_SHADOWED
+ 4'b 1111, // index[41] KEYMGR_SW_SHARE0_OUTPUT_0
+ 4'b 1111, // index[42] KEYMGR_SW_SHARE0_OUTPUT_1
+ 4'b 1111, // index[43] KEYMGR_SW_SHARE0_OUTPUT_2
+ 4'b 1111, // index[44] KEYMGR_SW_SHARE0_OUTPUT_3
+ 4'b 1111, // index[45] KEYMGR_SW_SHARE0_OUTPUT_4
+ 4'b 1111, // index[46] KEYMGR_SW_SHARE0_OUTPUT_5
+ 4'b 1111, // index[47] KEYMGR_SW_SHARE0_OUTPUT_6
+ 4'b 1111, // index[48] KEYMGR_SW_SHARE0_OUTPUT_7
+ 4'b 1111, // index[49] KEYMGR_SW_SHARE1_OUTPUT_0
+ 4'b 1111, // index[50] KEYMGR_SW_SHARE1_OUTPUT_1
+ 4'b 1111, // index[51] KEYMGR_SW_SHARE1_OUTPUT_2
+ 4'b 1111, // index[52] KEYMGR_SW_SHARE1_OUTPUT_3
+ 4'b 1111, // index[53] KEYMGR_SW_SHARE1_OUTPUT_4
+ 4'b 1111, // index[54] KEYMGR_SW_SHARE1_OUTPUT_5
+ 4'b 1111, // index[55] KEYMGR_SW_SHARE1_OUTPUT_6
+ 4'b 1111, // index[56] KEYMGR_SW_SHARE1_OUTPUT_7
+ 4'b 0001, // index[57] KEYMGR_WORKING_STATE
+ 4'b 0001, // index[58] KEYMGR_OP_STATUS
+ 4'b 0001, // index[59] KEYMGR_ERR_CODE
+ 4'b 0011 // index[60] KEYMGR_FAULT_STATUS
};
endpackage
diff --git a/hw/ip/keymgr/rtl/keymgr_reg_top.sv b/hw/ip/keymgr/rtl/keymgr_reg_top.sv
index 9bf6d5c..cb498e1 100644
--- a/hw/ip/keymgr/rtl/keymgr_reg_top.sv
+++ b/hw/ip/keymgr/rtl/keymgr_reg_top.sv
@@ -134,6 +134,9 @@
logic sideload_clear_we;
logic [2:0] sideload_clear_qs;
logic [2:0] sideload_clear_wd;
+ logic reseed_interval_regwen_we;
+ logic reseed_interval_regwen_qs;
+ logic reseed_interval_regwen_wd;
logic reseed_interval_shadowed_re;
logic reseed_interval_shadowed_we;
logic [15:0] reseed_interval_shadowed_qs;
@@ -305,6 +308,8 @@
logic fault_status_shadow_qs;
logic fault_status_ctrl_fsm_intg_qs;
logic fault_status_ctrl_fsm_cnt_qs;
+ logic fault_status_reseed_cnt_qs;
+ logic fault_status_side_ctrl_fsm_qs;
// Register instances
// R[intr_state]: V(False)
@@ -531,7 +536,7 @@
.rst_ni (rst_ni),
// from register interface
- .we (sideload_clear_we),
+ .we (sideload_clear_we & cfg_regwen_qs),
.wd (sideload_clear_wd),
// from internal hardware
@@ -547,6 +552,32 @@
);
+ // R[reseed_interval_regwen]: V(False)
+ prim_subreg #(
+ .DW (1),
+ .SwAccess(prim_subreg_pkg::SwAccessW0C),
+ .RESVAL (1'h1)
+ ) u_reseed_interval_regwen (
+ .clk_i (clk_i),
+ .rst_ni (rst_ni),
+
+ // from register interface
+ .we (reseed_interval_regwen_we),
+ .wd (reseed_interval_regwen_wd),
+
+ // from internal hardware
+ .de (1'b0),
+ .d ('0),
+
+ // to internal hardware
+ .qe (),
+ .q (),
+
+ // to register interface (read)
+ .qs (reseed_interval_regwen_qs)
+ );
+
+
// R[reseed_interval_shadowed]: V(False)
prim_subreg_shadow #(
.DW (16),
@@ -559,7 +590,7 @@
// from register interface
.re (reseed_interval_shadowed_re),
- .we (reseed_interval_shadowed_we),
+ .we (reseed_interval_shadowed_we & reseed_interval_regwen_qs),
.wd (reseed_interval_shadowed_wd),
// from internal hardware
@@ -2205,9 +2236,59 @@
.qs (fault_status_ctrl_fsm_cnt_qs)
);
+ // F[reseed_cnt]: 8:8
+ prim_subreg #(
+ .DW (1),
+ .SwAccess(prim_subreg_pkg::SwAccessRO),
+ .RESVAL (1'h0)
+ ) u_fault_status_reseed_cnt (
+ .clk_i (clk_i),
+ .rst_ni (rst_ni),
+
+ // from register interface
+ .we (1'b0),
+ .wd ('0),
+
+ // from internal hardware
+ .de (hw2reg.fault_status.reseed_cnt.de),
+ .d (hw2reg.fault_status.reseed_cnt.d),
+
+ // to internal hardware
+ .qe (),
+ .q (reg2hw.fault_status.reseed_cnt.q),
+
+ // to register interface (read)
+ .qs (fault_status_reseed_cnt_qs)
+ );
+
+ // F[side_ctrl_fsm]: 9:9
+ prim_subreg #(
+ .DW (1),
+ .SwAccess(prim_subreg_pkg::SwAccessRO),
+ .RESVAL (1'h0)
+ ) u_fault_status_side_ctrl_fsm (
+ .clk_i (clk_i),
+ .rst_ni (rst_ni),
+
+ // from register interface
+ .we (1'b0),
+ .wd ('0),
+
+ // from internal hardware
+ .de (hw2reg.fault_status.side_ctrl_fsm.de),
+ .d (hw2reg.fault_status.side_ctrl_fsm.d),
+
+ // to internal hardware
+ .qe (),
+ .q (reg2hw.fault_status.side_ctrl_fsm.q),
+
+ // to register interface (read)
+ .qs (fault_status_side_ctrl_fsm_qs)
+ );
- logic [59:0] addr_hit;
+
+ logic [60:0] addr_hit;
always_comb begin
addr_hit = '0;
addr_hit[ 0] = (reg_addr == KEYMGR_INTR_STATE_OFFSET);
@@ -2217,59 +2298,60 @@
addr_hit[ 4] = (reg_addr == KEYMGR_CFG_REGWEN_OFFSET);
addr_hit[ 5] = (reg_addr == KEYMGR_CONTROL_OFFSET);
addr_hit[ 6] = (reg_addr == KEYMGR_SIDELOAD_CLEAR_OFFSET);
- addr_hit[ 7] = (reg_addr == KEYMGR_RESEED_INTERVAL_SHADOWED_OFFSET);
- addr_hit[ 8] = (reg_addr == KEYMGR_SW_BINDING_REGWEN_OFFSET);
- addr_hit[ 9] = (reg_addr == KEYMGR_SEALING_SW_BINDING_0_OFFSET);
- addr_hit[10] = (reg_addr == KEYMGR_SEALING_SW_BINDING_1_OFFSET);
- addr_hit[11] = (reg_addr == KEYMGR_SEALING_SW_BINDING_2_OFFSET);
- addr_hit[12] = (reg_addr == KEYMGR_SEALING_SW_BINDING_3_OFFSET);
- addr_hit[13] = (reg_addr == KEYMGR_SEALING_SW_BINDING_4_OFFSET);
- addr_hit[14] = (reg_addr == KEYMGR_SEALING_SW_BINDING_5_OFFSET);
- addr_hit[15] = (reg_addr == KEYMGR_SEALING_SW_BINDING_6_OFFSET);
- addr_hit[16] = (reg_addr == KEYMGR_SEALING_SW_BINDING_7_OFFSET);
- addr_hit[17] = (reg_addr == KEYMGR_ATTEST_SW_BINDING_0_OFFSET);
- addr_hit[18] = (reg_addr == KEYMGR_ATTEST_SW_BINDING_1_OFFSET);
- addr_hit[19] = (reg_addr == KEYMGR_ATTEST_SW_BINDING_2_OFFSET);
- addr_hit[20] = (reg_addr == KEYMGR_ATTEST_SW_BINDING_3_OFFSET);
- addr_hit[21] = (reg_addr == KEYMGR_ATTEST_SW_BINDING_4_OFFSET);
- addr_hit[22] = (reg_addr == KEYMGR_ATTEST_SW_BINDING_5_OFFSET);
- addr_hit[23] = (reg_addr == KEYMGR_ATTEST_SW_BINDING_6_OFFSET);
- addr_hit[24] = (reg_addr == KEYMGR_ATTEST_SW_BINDING_7_OFFSET);
- addr_hit[25] = (reg_addr == KEYMGR_SALT_0_OFFSET);
- addr_hit[26] = (reg_addr == KEYMGR_SALT_1_OFFSET);
- addr_hit[27] = (reg_addr == KEYMGR_SALT_2_OFFSET);
- addr_hit[28] = (reg_addr == KEYMGR_SALT_3_OFFSET);
- addr_hit[29] = (reg_addr == KEYMGR_SALT_4_OFFSET);
- addr_hit[30] = (reg_addr == KEYMGR_SALT_5_OFFSET);
- addr_hit[31] = (reg_addr == KEYMGR_SALT_6_OFFSET);
- addr_hit[32] = (reg_addr == KEYMGR_SALT_7_OFFSET);
- addr_hit[33] = (reg_addr == KEYMGR_KEY_VERSION_OFFSET);
- addr_hit[34] = (reg_addr == KEYMGR_MAX_CREATOR_KEY_VER_REGWEN_OFFSET);
- addr_hit[35] = (reg_addr == KEYMGR_MAX_CREATOR_KEY_VER_SHADOWED_OFFSET);
- addr_hit[36] = (reg_addr == KEYMGR_MAX_OWNER_INT_KEY_VER_REGWEN_OFFSET);
- addr_hit[37] = (reg_addr == KEYMGR_MAX_OWNER_INT_KEY_VER_SHADOWED_OFFSET);
- addr_hit[38] = (reg_addr == KEYMGR_MAX_OWNER_KEY_VER_REGWEN_OFFSET);
- addr_hit[39] = (reg_addr == KEYMGR_MAX_OWNER_KEY_VER_SHADOWED_OFFSET);
- addr_hit[40] = (reg_addr == KEYMGR_SW_SHARE0_OUTPUT_0_OFFSET);
- addr_hit[41] = (reg_addr == KEYMGR_SW_SHARE0_OUTPUT_1_OFFSET);
- addr_hit[42] = (reg_addr == KEYMGR_SW_SHARE0_OUTPUT_2_OFFSET);
- addr_hit[43] = (reg_addr == KEYMGR_SW_SHARE0_OUTPUT_3_OFFSET);
- addr_hit[44] = (reg_addr == KEYMGR_SW_SHARE0_OUTPUT_4_OFFSET);
- addr_hit[45] = (reg_addr == KEYMGR_SW_SHARE0_OUTPUT_5_OFFSET);
- addr_hit[46] = (reg_addr == KEYMGR_SW_SHARE0_OUTPUT_6_OFFSET);
- addr_hit[47] = (reg_addr == KEYMGR_SW_SHARE0_OUTPUT_7_OFFSET);
- addr_hit[48] = (reg_addr == KEYMGR_SW_SHARE1_OUTPUT_0_OFFSET);
- addr_hit[49] = (reg_addr == KEYMGR_SW_SHARE1_OUTPUT_1_OFFSET);
- addr_hit[50] = (reg_addr == KEYMGR_SW_SHARE1_OUTPUT_2_OFFSET);
- addr_hit[51] = (reg_addr == KEYMGR_SW_SHARE1_OUTPUT_3_OFFSET);
- addr_hit[52] = (reg_addr == KEYMGR_SW_SHARE1_OUTPUT_4_OFFSET);
- addr_hit[53] = (reg_addr == KEYMGR_SW_SHARE1_OUTPUT_5_OFFSET);
- addr_hit[54] = (reg_addr == KEYMGR_SW_SHARE1_OUTPUT_6_OFFSET);
- addr_hit[55] = (reg_addr == KEYMGR_SW_SHARE1_OUTPUT_7_OFFSET);
- addr_hit[56] = (reg_addr == KEYMGR_WORKING_STATE_OFFSET);
- addr_hit[57] = (reg_addr == KEYMGR_OP_STATUS_OFFSET);
- addr_hit[58] = (reg_addr == KEYMGR_ERR_CODE_OFFSET);
- addr_hit[59] = (reg_addr == KEYMGR_FAULT_STATUS_OFFSET);
+ addr_hit[ 7] = (reg_addr == KEYMGR_RESEED_INTERVAL_REGWEN_OFFSET);
+ addr_hit[ 8] = (reg_addr == KEYMGR_RESEED_INTERVAL_SHADOWED_OFFSET);
+ addr_hit[ 9] = (reg_addr == KEYMGR_SW_BINDING_REGWEN_OFFSET);
+ addr_hit[10] = (reg_addr == KEYMGR_SEALING_SW_BINDING_0_OFFSET);
+ addr_hit[11] = (reg_addr == KEYMGR_SEALING_SW_BINDING_1_OFFSET);
+ addr_hit[12] = (reg_addr == KEYMGR_SEALING_SW_BINDING_2_OFFSET);
+ addr_hit[13] = (reg_addr == KEYMGR_SEALING_SW_BINDING_3_OFFSET);
+ addr_hit[14] = (reg_addr == KEYMGR_SEALING_SW_BINDING_4_OFFSET);
+ addr_hit[15] = (reg_addr == KEYMGR_SEALING_SW_BINDING_5_OFFSET);
+ addr_hit[16] = (reg_addr == KEYMGR_SEALING_SW_BINDING_6_OFFSET);
+ addr_hit[17] = (reg_addr == KEYMGR_SEALING_SW_BINDING_7_OFFSET);
+ addr_hit[18] = (reg_addr == KEYMGR_ATTEST_SW_BINDING_0_OFFSET);
+ addr_hit[19] = (reg_addr == KEYMGR_ATTEST_SW_BINDING_1_OFFSET);
+ addr_hit[20] = (reg_addr == KEYMGR_ATTEST_SW_BINDING_2_OFFSET);
+ addr_hit[21] = (reg_addr == KEYMGR_ATTEST_SW_BINDING_3_OFFSET);
+ addr_hit[22] = (reg_addr == KEYMGR_ATTEST_SW_BINDING_4_OFFSET);
+ addr_hit[23] = (reg_addr == KEYMGR_ATTEST_SW_BINDING_5_OFFSET);
+ addr_hit[24] = (reg_addr == KEYMGR_ATTEST_SW_BINDING_6_OFFSET);
+ addr_hit[25] = (reg_addr == KEYMGR_ATTEST_SW_BINDING_7_OFFSET);
+ addr_hit[26] = (reg_addr == KEYMGR_SALT_0_OFFSET);
+ addr_hit[27] = (reg_addr == KEYMGR_SALT_1_OFFSET);
+ addr_hit[28] = (reg_addr == KEYMGR_SALT_2_OFFSET);
+ addr_hit[29] = (reg_addr == KEYMGR_SALT_3_OFFSET);
+ addr_hit[30] = (reg_addr == KEYMGR_SALT_4_OFFSET);
+ addr_hit[31] = (reg_addr == KEYMGR_SALT_5_OFFSET);
+ addr_hit[32] = (reg_addr == KEYMGR_SALT_6_OFFSET);
+ addr_hit[33] = (reg_addr == KEYMGR_SALT_7_OFFSET);
+ addr_hit[34] = (reg_addr == KEYMGR_KEY_VERSION_OFFSET);
+ addr_hit[35] = (reg_addr == KEYMGR_MAX_CREATOR_KEY_VER_REGWEN_OFFSET);
+ addr_hit[36] = (reg_addr == KEYMGR_MAX_CREATOR_KEY_VER_SHADOWED_OFFSET);
+ addr_hit[37] = (reg_addr == KEYMGR_MAX_OWNER_INT_KEY_VER_REGWEN_OFFSET);
+ addr_hit[38] = (reg_addr == KEYMGR_MAX_OWNER_INT_KEY_VER_SHADOWED_OFFSET);
+ addr_hit[39] = (reg_addr == KEYMGR_MAX_OWNER_KEY_VER_REGWEN_OFFSET);
+ addr_hit[40] = (reg_addr == KEYMGR_MAX_OWNER_KEY_VER_SHADOWED_OFFSET);
+ addr_hit[41] = (reg_addr == KEYMGR_SW_SHARE0_OUTPUT_0_OFFSET);
+ addr_hit[42] = (reg_addr == KEYMGR_SW_SHARE0_OUTPUT_1_OFFSET);
+ addr_hit[43] = (reg_addr == KEYMGR_SW_SHARE0_OUTPUT_2_OFFSET);
+ addr_hit[44] = (reg_addr == KEYMGR_SW_SHARE0_OUTPUT_3_OFFSET);
+ addr_hit[45] = (reg_addr == KEYMGR_SW_SHARE0_OUTPUT_4_OFFSET);
+ addr_hit[46] = (reg_addr == KEYMGR_SW_SHARE0_OUTPUT_5_OFFSET);
+ addr_hit[47] = (reg_addr == KEYMGR_SW_SHARE0_OUTPUT_6_OFFSET);
+ addr_hit[48] = (reg_addr == KEYMGR_SW_SHARE0_OUTPUT_7_OFFSET);
+ addr_hit[49] = (reg_addr == KEYMGR_SW_SHARE1_OUTPUT_0_OFFSET);
+ addr_hit[50] = (reg_addr == KEYMGR_SW_SHARE1_OUTPUT_1_OFFSET);
+ addr_hit[51] = (reg_addr == KEYMGR_SW_SHARE1_OUTPUT_2_OFFSET);
+ addr_hit[52] = (reg_addr == KEYMGR_SW_SHARE1_OUTPUT_3_OFFSET);
+ addr_hit[53] = (reg_addr == KEYMGR_SW_SHARE1_OUTPUT_4_OFFSET);
+ addr_hit[54] = (reg_addr == KEYMGR_SW_SHARE1_OUTPUT_5_OFFSET);
+ addr_hit[55] = (reg_addr == KEYMGR_SW_SHARE1_OUTPUT_6_OFFSET);
+ addr_hit[56] = (reg_addr == KEYMGR_SW_SHARE1_OUTPUT_7_OFFSET);
+ addr_hit[57] = (reg_addr == KEYMGR_WORKING_STATE_OFFSET);
+ addr_hit[58] = (reg_addr == KEYMGR_OP_STATUS_OFFSET);
+ addr_hit[59] = (reg_addr == KEYMGR_ERR_CODE_OFFSET);
+ addr_hit[60] = (reg_addr == KEYMGR_FAULT_STATUS_OFFSET);
end
assign addrmiss = (reg_re || reg_we) ? ~|addr_hit : 1'b0 ;
@@ -2336,7 +2418,8 @@
(addr_hit[56] & (|(KEYMGR_PERMIT[56] & ~reg_be))) |
(addr_hit[57] & (|(KEYMGR_PERMIT[57] & ~reg_be))) |
(addr_hit[58] & (|(KEYMGR_PERMIT[58] & ~reg_be))) |
- (addr_hit[59] & (|(KEYMGR_PERMIT[59] & ~reg_be)))));
+ (addr_hit[59] & (|(KEYMGR_PERMIT[59] & ~reg_be))) |
+ (addr_hit[60] & (|(KEYMGR_PERMIT[60] & ~reg_be)))));
end
assign intr_state_we = addr_hit[0] & reg_we & !reg_error;
@@ -2365,162 +2448,165 @@
assign sideload_clear_we = addr_hit[6] & reg_we & !reg_error;
assign sideload_clear_wd = reg_wdata[2:0];
- assign reseed_interval_shadowed_re = addr_hit[7] & reg_re & !reg_error;
- assign reseed_interval_shadowed_we = addr_hit[7] & reg_we & !reg_error;
+ assign reseed_interval_regwen_we = addr_hit[7] & reg_we & !reg_error;
+
+ assign reseed_interval_regwen_wd = reg_wdata[0];
+ assign reseed_interval_shadowed_re = addr_hit[8] & reg_re & !reg_error;
+ assign reseed_interval_shadowed_we = addr_hit[8] & reg_we & !reg_error;
assign reseed_interval_shadowed_wd = reg_wdata[15:0];
- assign sw_binding_regwen_re = addr_hit[8] & reg_re & !reg_error;
- assign sw_binding_regwen_we = addr_hit[8] & reg_we & !reg_error;
+ assign sw_binding_regwen_re = addr_hit[9] & reg_re & !reg_error;
+ assign sw_binding_regwen_we = addr_hit[9] & reg_we & !reg_error;
assign sw_binding_regwen_wd = reg_wdata[0];
- assign sealing_sw_binding_0_we = addr_hit[9] & reg_we & !reg_error;
+ assign sealing_sw_binding_0_we = addr_hit[10] & reg_we & !reg_error;
assign sealing_sw_binding_0_wd = reg_wdata[31:0];
- assign sealing_sw_binding_1_we = addr_hit[10] & reg_we & !reg_error;
+ assign sealing_sw_binding_1_we = addr_hit[11] & reg_we & !reg_error;
assign sealing_sw_binding_1_wd = reg_wdata[31:0];
- assign sealing_sw_binding_2_we = addr_hit[11] & reg_we & !reg_error;
+ assign sealing_sw_binding_2_we = addr_hit[12] & reg_we & !reg_error;
assign sealing_sw_binding_2_wd = reg_wdata[31:0];
- assign sealing_sw_binding_3_we = addr_hit[12] & reg_we & !reg_error;
+ assign sealing_sw_binding_3_we = addr_hit[13] & reg_we & !reg_error;
assign sealing_sw_binding_3_wd = reg_wdata[31:0];
- assign sealing_sw_binding_4_we = addr_hit[13] & reg_we & !reg_error;
+ assign sealing_sw_binding_4_we = addr_hit[14] & reg_we & !reg_error;
assign sealing_sw_binding_4_wd = reg_wdata[31:0];
- assign sealing_sw_binding_5_we = addr_hit[14] & reg_we & !reg_error;
+ assign sealing_sw_binding_5_we = addr_hit[15] & reg_we & !reg_error;
assign sealing_sw_binding_5_wd = reg_wdata[31:0];
- assign sealing_sw_binding_6_we = addr_hit[15] & reg_we & !reg_error;
+ assign sealing_sw_binding_6_we = addr_hit[16] & reg_we & !reg_error;
assign sealing_sw_binding_6_wd = reg_wdata[31:0];
- assign sealing_sw_binding_7_we = addr_hit[16] & reg_we & !reg_error;
+ assign sealing_sw_binding_7_we = addr_hit[17] & reg_we & !reg_error;
assign sealing_sw_binding_7_wd = reg_wdata[31:0];
- assign attest_sw_binding_0_we = addr_hit[17] & reg_we & !reg_error;
+ assign attest_sw_binding_0_we = addr_hit[18] & reg_we & !reg_error;
assign attest_sw_binding_0_wd = reg_wdata[31:0];
- assign attest_sw_binding_1_we = addr_hit[18] & reg_we & !reg_error;
+ assign attest_sw_binding_1_we = addr_hit[19] & reg_we & !reg_error;
assign attest_sw_binding_1_wd = reg_wdata[31:0];
- assign attest_sw_binding_2_we = addr_hit[19] & reg_we & !reg_error;
+ assign attest_sw_binding_2_we = addr_hit[20] & reg_we & !reg_error;
assign attest_sw_binding_2_wd = reg_wdata[31:0];
- assign attest_sw_binding_3_we = addr_hit[20] & reg_we & !reg_error;
+ assign attest_sw_binding_3_we = addr_hit[21] & reg_we & !reg_error;
assign attest_sw_binding_3_wd = reg_wdata[31:0];
- assign attest_sw_binding_4_we = addr_hit[21] & reg_we & !reg_error;
+ assign attest_sw_binding_4_we = addr_hit[22] & reg_we & !reg_error;
assign attest_sw_binding_4_wd = reg_wdata[31:0];
- assign attest_sw_binding_5_we = addr_hit[22] & reg_we & !reg_error;
+ assign attest_sw_binding_5_we = addr_hit[23] & reg_we & !reg_error;
assign attest_sw_binding_5_wd = reg_wdata[31:0];
- assign attest_sw_binding_6_we = addr_hit[23] & reg_we & !reg_error;
+ assign attest_sw_binding_6_we = addr_hit[24] & reg_we & !reg_error;
assign attest_sw_binding_6_wd = reg_wdata[31:0];
- assign attest_sw_binding_7_we = addr_hit[24] & reg_we & !reg_error;
+ assign attest_sw_binding_7_we = addr_hit[25] & reg_we & !reg_error;
assign attest_sw_binding_7_wd = reg_wdata[31:0];
- assign salt_0_we = addr_hit[25] & reg_we & !reg_error;
+ assign salt_0_we = addr_hit[26] & reg_we & !reg_error;
assign salt_0_wd = reg_wdata[31:0];
- assign salt_1_we = addr_hit[26] & reg_we & !reg_error;
+ assign salt_1_we = addr_hit[27] & reg_we & !reg_error;
assign salt_1_wd = reg_wdata[31:0];
- assign salt_2_we = addr_hit[27] & reg_we & !reg_error;
+ assign salt_2_we = addr_hit[28] & reg_we & !reg_error;
assign salt_2_wd = reg_wdata[31:0];
- assign salt_3_we = addr_hit[28] & reg_we & !reg_error;
+ assign salt_3_we = addr_hit[29] & reg_we & !reg_error;
assign salt_3_wd = reg_wdata[31:0];
- assign salt_4_we = addr_hit[29] & reg_we & !reg_error;
+ assign salt_4_we = addr_hit[30] & reg_we & !reg_error;
assign salt_4_wd = reg_wdata[31:0];
- assign salt_5_we = addr_hit[30] & reg_we & !reg_error;
+ assign salt_5_we = addr_hit[31] & reg_we & !reg_error;
assign salt_5_wd = reg_wdata[31:0];
- assign salt_6_we = addr_hit[31] & reg_we & !reg_error;
+ assign salt_6_we = addr_hit[32] & reg_we & !reg_error;
assign salt_6_wd = reg_wdata[31:0];
- assign salt_7_we = addr_hit[32] & reg_we & !reg_error;
+ assign salt_7_we = addr_hit[33] & reg_we & !reg_error;
assign salt_7_wd = reg_wdata[31:0];
- assign key_version_we = addr_hit[33] & reg_we & !reg_error;
+ assign key_version_we = addr_hit[34] & reg_we & !reg_error;
assign key_version_wd = reg_wdata[31:0];
- assign max_creator_key_ver_regwen_we = addr_hit[34] & reg_we & !reg_error;
+ assign max_creator_key_ver_regwen_we = addr_hit[35] & reg_we & !reg_error;
assign max_creator_key_ver_regwen_wd = reg_wdata[0];
- assign max_creator_key_ver_shadowed_re = addr_hit[35] & reg_re & !reg_error;
- assign max_creator_key_ver_shadowed_we = addr_hit[35] & reg_we & !reg_error;
+ assign max_creator_key_ver_shadowed_re = addr_hit[36] & reg_re & !reg_error;
+ assign max_creator_key_ver_shadowed_we = addr_hit[36] & reg_we & !reg_error;
assign max_creator_key_ver_shadowed_wd = reg_wdata[31:0];
- assign max_owner_int_key_ver_regwen_we = addr_hit[36] & reg_we & !reg_error;
+ assign max_owner_int_key_ver_regwen_we = addr_hit[37] & reg_we & !reg_error;
assign max_owner_int_key_ver_regwen_wd = reg_wdata[0];
- assign max_owner_int_key_ver_shadowed_re = addr_hit[37] & reg_re & !reg_error;
- assign max_owner_int_key_ver_shadowed_we = addr_hit[37] & reg_we & !reg_error;
+ assign max_owner_int_key_ver_shadowed_re = addr_hit[38] & reg_re & !reg_error;
+ assign max_owner_int_key_ver_shadowed_we = addr_hit[38] & reg_we & !reg_error;
assign max_owner_int_key_ver_shadowed_wd = reg_wdata[31:0];
- assign max_owner_key_ver_regwen_we = addr_hit[38] & reg_we & !reg_error;
+ assign max_owner_key_ver_regwen_we = addr_hit[39] & reg_we & !reg_error;
assign max_owner_key_ver_regwen_wd = reg_wdata[0];
- assign max_owner_key_ver_shadowed_re = addr_hit[39] & reg_re & !reg_error;
- assign max_owner_key_ver_shadowed_we = addr_hit[39] & reg_we & !reg_error;
+ assign max_owner_key_ver_shadowed_re = addr_hit[40] & reg_re & !reg_error;
+ assign max_owner_key_ver_shadowed_we = addr_hit[40] & reg_we & !reg_error;
assign max_owner_key_ver_shadowed_wd = reg_wdata[31:0];
- assign sw_share0_output_0_re = addr_hit[40] & reg_re & !reg_error;
+ assign sw_share0_output_0_re = addr_hit[41] & reg_re & !reg_error;
assign sw_share0_output_0_wd = '1;
- assign sw_share0_output_1_re = addr_hit[41] & reg_re & !reg_error;
+ assign sw_share0_output_1_re = addr_hit[42] & reg_re & !reg_error;
assign sw_share0_output_1_wd = '1;
- assign sw_share0_output_2_re = addr_hit[42] & reg_re & !reg_error;
+ assign sw_share0_output_2_re = addr_hit[43] & reg_re & !reg_error;
assign sw_share0_output_2_wd = '1;
- assign sw_share0_output_3_re = addr_hit[43] & reg_re & !reg_error;
+ assign sw_share0_output_3_re = addr_hit[44] & reg_re & !reg_error;
assign sw_share0_output_3_wd = '1;
- assign sw_share0_output_4_re = addr_hit[44] & reg_re & !reg_error;
+ assign sw_share0_output_4_re = addr_hit[45] & reg_re & !reg_error;
assign sw_share0_output_4_wd = '1;
- assign sw_share0_output_5_re = addr_hit[45] & reg_re & !reg_error;
+ assign sw_share0_output_5_re = addr_hit[46] & reg_re & !reg_error;
assign sw_share0_output_5_wd = '1;
- assign sw_share0_output_6_re = addr_hit[46] & reg_re & !reg_error;
+ assign sw_share0_output_6_re = addr_hit[47] & reg_re & !reg_error;
assign sw_share0_output_6_wd = '1;
- assign sw_share0_output_7_re = addr_hit[47] & reg_re & !reg_error;
+ assign sw_share0_output_7_re = addr_hit[48] & reg_re & !reg_error;
assign sw_share0_output_7_wd = '1;
- assign sw_share1_output_0_re = addr_hit[48] & reg_re & !reg_error;
+ assign sw_share1_output_0_re = addr_hit[49] & reg_re & !reg_error;
assign sw_share1_output_0_wd = '1;
- assign sw_share1_output_1_re = addr_hit[49] & reg_re & !reg_error;
+ assign sw_share1_output_1_re = addr_hit[50] & reg_re & !reg_error;
assign sw_share1_output_1_wd = '1;
- assign sw_share1_output_2_re = addr_hit[50] & reg_re & !reg_error;
+ assign sw_share1_output_2_re = addr_hit[51] & reg_re & !reg_error;
assign sw_share1_output_2_wd = '1;
- assign sw_share1_output_3_re = addr_hit[51] & reg_re & !reg_error;
+ assign sw_share1_output_3_re = addr_hit[52] & reg_re & !reg_error;
assign sw_share1_output_3_wd = '1;
- assign sw_share1_output_4_re = addr_hit[52] & reg_re & !reg_error;
+ assign sw_share1_output_4_re = addr_hit[53] & reg_re & !reg_error;
assign sw_share1_output_4_wd = '1;
- assign sw_share1_output_5_re = addr_hit[53] & reg_re & !reg_error;
+ assign sw_share1_output_5_re = addr_hit[54] & reg_re & !reg_error;
assign sw_share1_output_5_wd = '1;
- assign sw_share1_output_6_re = addr_hit[54] & reg_re & !reg_error;
+ assign sw_share1_output_6_re = addr_hit[55] & reg_re & !reg_error;
assign sw_share1_output_6_wd = '1;
- assign sw_share1_output_7_re = addr_hit[55] & reg_re & !reg_error;
+ assign sw_share1_output_7_re = addr_hit[56] & reg_re & !reg_error;
assign sw_share1_output_7_wd = '1;
- assign op_status_we = addr_hit[57] & reg_we & !reg_error;
+ assign op_status_we = addr_hit[58] & reg_we & !reg_error;
assign op_status_wd = reg_wdata[1:0];
- assign err_code_we = addr_hit[58] & reg_we & !reg_error;
+ assign err_code_we = addr_hit[59] & reg_we & !reg_error;
assign err_code_invalid_op_wd = reg_wdata[0];
@@ -2565,216 +2651,220 @@
end
addr_hit[7]: begin
- reg_rdata_next[15:0] = reseed_interval_shadowed_qs;
+ reg_rdata_next[0] = reseed_interval_regwen_qs;
end
addr_hit[8]: begin
- reg_rdata_next[0] = sw_binding_regwen_qs;
+ reg_rdata_next[15:0] = reseed_interval_shadowed_qs;
end
addr_hit[9]: begin
- reg_rdata_next[31:0] = sealing_sw_binding_0_qs;
+ reg_rdata_next[0] = sw_binding_regwen_qs;
end
addr_hit[10]: begin
- reg_rdata_next[31:0] = sealing_sw_binding_1_qs;
+ reg_rdata_next[31:0] = sealing_sw_binding_0_qs;
end
addr_hit[11]: begin
- reg_rdata_next[31:0] = sealing_sw_binding_2_qs;
+ reg_rdata_next[31:0] = sealing_sw_binding_1_qs;
end
addr_hit[12]: begin
- reg_rdata_next[31:0] = sealing_sw_binding_3_qs;
+ reg_rdata_next[31:0] = sealing_sw_binding_2_qs;
end
addr_hit[13]: begin
- reg_rdata_next[31:0] = sealing_sw_binding_4_qs;
+ reg_rdata_next[31:0] = sealing_sw_binding_3_qs;
end
addr_hit[14]: begin
- reg_rdata_next[31:0] = sealing_sw_binding_5_qs;
+ reg_rdata_next[31:0] = sealing_sw_binding_4_qs;
end
addr_hit[15]: begin
- reg_rdata_next[31:0] = sealing_sw_binding_6_qs;
+ reg_rdata_next[31:0] = sealing_sw_binding_5_qs;
end
addr_hit[16]: begin
- reg_rdata_next[31:0] = sealing_sw_binding_7_qs;
+ reg_rdata_next[31:0] = sealing_sw_binding_6_qs;
end
addr_hit[17]: begin
- reg_rdata_next[31:0] = attest_sw_binding_0_qs;
+ reg_rdata_next[31:0] = sealing_sw_binding_7_qs;
end
addr_hit[18]: begin
- reg_rdata_next[31:0] = attest_sw_binding_1_qs;
+ reg_rdata_next[31:0] = attest_sw_binding_0_qs;
end
addr_hit[19]: begin
- reg_rdata_next[31:0] = attest_sw_binding_2_qs;
+ reg_rdata_next[31:0] = attest_sw_binding_1_qs;
end
addr_hit[20]: begin
- reg_rdata_next[31:0] = attest_sw_binding_3_qs;
+ reg_rdata_next[31:0] = attest_sw_binding_2_qs;
end
addr_hit[21]: begin
- reg_rdata_next[31:0] = attest_sw_binding_4_qs;
+ reg_rdata_next[31:0] = attest_sw_binding_3_qs;
end
addr_hit[22]: begin
- reg_rdata_next[31:0] = attest_sw_binding_5_qs;
+ reg_rdata_next[31:0] = attest_sw_binding_4_qs;
end
addr_hit[23]: begin
- reg_rdata_next[31:0] = attest_sw_binding_6_qs;
+ reg_rdata_next[31:0] = attest_sw_binding_5_qs;
end
addr_hit[24]: begin
- reg_rdata_next[31:0] = attest_sw_binding_7_qs;
+ reg_rdata_next[31:0] = attest_sw_binding_6_qs;
end
addr_hit[25]: begin
- reg_rdata_next[31:0] = salt_0_qs;
+ reg_rdata_next[31:0] = attest_sw_binding_7_qs;
end
addr_hit[26]: begin
- reg_rdata_next[31:0] = salt_1_qs;
+ reg_rdata_next[31:0] = salt_0_qs;
end
addr_hit[27]: begin
- reg_rdata_next[31:0] = salt_2_qs;
+ reg_rdata_next[31:0] = salt_1_qs;
end
addr_hit[28]: begin
- reg_rdata_next[31:0] = salt_3_qs;
+ reg_rdata_next[31:0] = salt_2_qs;
end
addr_hit[29]: begin
- reg_rdata_next[31:0] = salt_4_qs;
+ reg_rdata_next[31:0] = salt_3_qs;
end
addr_hit[30]: begin
- reg_rdata_next[31:0] = salt_5_qs;
+ reg_rdata_next[31:0] = salt_4_qs;
end
addr_hit[31]: begin
- reg_rdata_next[31:0] = salt_6_qs;
+ reg_rdata_next[31:0] = salt_5_qs;
end
addr_hit[32]: begin
- reg_rdata_next[31:0] = salt_7_qs;
+ reg_rdata_next[31:0] = salt_6_qs;
end
addr_hit[33]: begin
- reg_rdata_next[31:0] = key_version_qs;
+ reg_rdata_next[31:0] = salt_7_qs;
end
addr_hit[34]: begin
- reg_rdata_next[0] = max_creator_key_ver_regwen_qs;
+ reg_rdata_next[31:0] = key_version_qs;
end
addr_hit[35]: begin
- reg_rdata_next[31:0] = max_creator_key_ver_shadowed_qs;
+ reg_rdata_next[0] = max_creator_key_ver_regwen_qs;
end
addr_hit[36]: begin
- reg_rdata_next[0] = max_owner_int_key_ver_regwen_qs;
+ reg_rdata_next[31:0] = max_creator_key_ver_shadowed_qs;
end
addr_hit[37]: begin
- reg_rdata_next[31:0] = max_owner_int_key_ver_shadowed_qs;
+ reg_rdata_next[0] = max_owner_int_key_ver_regwen_qs;
end
addr_hit[38]: begin
- reg_rdata_next[0] = max_owner_key_ver_regwen_qs;
+ reg_rdata_next[31:0] = max_owner_int_key_ver_shadowed_qs;
end
addr_hit[39]: begin
- reg_rdata_next[31:0] = max_owner_key_ver_shadowed_qs;
+ reg_rdata_next[0] = max_owner_key_ver_regwen_qs;
end
addr_hit[40]: begin
- reg_rdata_next[31:0] = sw_share0_output_0_qs;
+ reg_rdata_next[31:0] = max_owner_key_ver_shadowed_qs;
end
addr_hit[41]: begin
- reg_rdata_next[31:0] = sw_share0_output_1_qs;
+ reg_rdata_next[31:0] = sw_share0_output_0_qs;
end
addr_hit[42]: begin
- reg_rdata_next[31:0] = sw_share0_output_2_qs;
+ reg_rdata_next[31:0] = sw_share0_output_1_qs;
end
addr_hit[43]: begin
- reg_rdata_next[31:0] = sw_share0_output_3_qs;
+ reg_rdata_next[31:0] = sw_share0_output_2_qs;
end
addr_hit[44]: begin
- reg_rdata_next[31:0] = sw_share0_output_4_qs;
+ reg_rdata_next[31:0] = sw_share0_output_3_qs;
end
addr_hit[45]: begin
- reg_rdata_next[31:0] = sw_share0_output_5_qs;
+ reg_rdata_next[31:0] = sw_share0_output_4_qs;
end
addr_hit[46]: begin
- reg_rdata_next[31:0] = sw_share0_output_6_qs;
+ reg_rdata_next[31:0] = sw_share0_output_5_qs;
end
addr_hit[47]: begin
- reg_rdata_next[31:0] = sw_share0_output_7_qs;
+ reg_rdata_next[31:0] = sw_share0_output_6_qs;
end
addr_hit[48]: begin
- reg_rdata_next[31:0] = sw_share1_output_0_qs;
+ reg_rdata_next[31:0] = sw_share0_output_7_qs;
end
addr_hit[49]: begin
- reg_rdata_next[31:0] = sw_share1_output_1_qs;
+ reg_rdata_next[31:0] = sw_share1_output_0_qs;
end
addr_hit[50]: begin
- reg_rdata_next[31:0] = sw_share1_output_2_qs;
+ reg_rdata_next[31:0] = sw_share1_output_1_qs;
end
addr_hit[51]: begin
- reg_rdata_next[31:0] = sw_share1_output_3_qs;
+ reg_rdata_next[31:0] = sw_share1_output_2_qs;
end
addr_hit[52]: begin
- reg_rdata_next[31:0] = sw_share1_output_4_qs;
+ reg_rdata_next[31:0] = sw_share1_output_3_qs;
end
addr_hit[53]: begin
- reg_rdata_next[31:0] = sw_share1_output_5_qs;
+ reg_rdata_next[31:0] = sw_share1_output_4_qs;
end
addr_hit[54]: begin
- reg_rdata_next[31:0] = sw_share1_output_6_qs;
+ reg_rdata_next[31:0] = sw_share1_output_5_qs;
end
addr_hit[55]: begin
- reg_rdata_next[31:0] = sw_share1_output_7_qs;
+ reg_rdata_next[31:0] = sw_share1_output_6_qs;
end
addr_hit[56]: begin
- reg_rdata_next[2:0] = working_state_qs;
+ reg_rdata_next[31:0] = sw_share1_output_7_qs;
end
addr_hit[57]: begin
- reg_rdata_next[1:0] = op_status_qs;
+ reg_rdata_next[2:0] = working_state_qs;
end
addr_hit[58]: begin
+ reg_rdata_next[1:0] = op_status_qs;
+ end
+
+ addr_hit[59]: begin
reg_rdata_next[0] = err_code_invalid_op_qs;
reg_rdata_next[1] = err_code_invalid_kmac_input_qs;
reg_rdata_next[2] = err_code_invalid_shadow_update_qs;
end
- addr_hit[59]: begin
+ addr_hit[60]: begin
reg_rdata_next[0] = fault_status_cmd_qs;
reg_rdata_next[1] = fault_status_kmac_fsm_qs;
reg_rdata_next[2] = fault_status_kmac_op_qs;
@@ -2783,6 +2873,8 @@
reg_rdata_next[5] = fault_status_shadow_qs;
reg_rdata_next[6] = fault_status_ctrl_fsm_intg_qs;
reg_rdata_next[7] = fault_status_ctrl_fsm_cnt_qs;
+ reg_rdata_next[8] = fault_status_reseed_cnt_qs;
+ reg_rdata_next[9] = fault_status_side_ctrl_fsm_qs;
end
default: begin
diff --git a/hw/ip/keymgr/rtl/keymgr_reseed_ctrl.sv b/hw/ip/keymgr/rtl/keymgr_reseed_ctrl.sv
index bba83cc..30ef369 100644
--- a/hw/ip/keymgr/rtl/keymgr_reseed_ctrl.sv
+++ b/hw/ip/keymgr/rtl/keymgr_reseed_ctrl.sv
@@ -26,7 +26,10 @@
// interface to lfsr
output logic seed_en_o,
- output logic [LfsrWidth-1:0] seed_o
+ output logic [LfsrWidth-1:0] seed_o,
+
+ // error condition
+ output logic cnt_err_o
);
localparam int unsigned EdnRounds = LfsrWidth / EdnWidth;
@@ -64,21 +67,24 @@
end
end
- // whenever reseed count drops to 0, issue a request and wait for ack
+ // whenever reseed count reaches reseed_interval, issue a request and wait for ack
logic [15:0] reseed_cnt;
- always_ff @(posedge clk_i or negedge rst_ni) begin
- if (!rst_ni) begin
- reseed_cnt <= '{default: 1};
- end else if(edn_done) begin
- reseed_cnt <= reseed_interval_i;
- end else if(reseed_req_i) begin
- reseed_cnt <= '0;
- end else if(|reseed_cnt && !first_use) begin
- reseed_cnt <= reseed_cnt - 1'b1;
- end
- end
+ prim_count #(
+ .Width(16),
+ .OutSelDnCnt(0),
+ .CntStyle(prim_count_pkg::DupCnt)
+ ) u_reseed_cnt (
+ .clk_i,
+ .rst_ni,
+ .clr_i(edn_done),
+ .set_i(reseed_req_i & ~edn_req),
+ .set_cnt_i(reseed_interval_i),
+ .en_i(~edn_req & ~first_use),
+ .cnt_o(reseed_cnt),
+ .err_o(cnt_err_o)
+ );
- assign edn_req = (reseed_cnt == '0);
+ assign edn_req = (reseed_cnt == reseed_interval_i);
assign reseed_ack_o = reseed_req_i & edn_done;
assign seed_en_o = edn_done;
diff --git a/hw/ip/keymgr/rtl/keymgr_sideload_key_ctrl.sv b/hw/ip/keymgr/rtl/keymgr_sideload_key_ctrl.sv
index f535fe5..c7143e2 100644
--- a/hw/ip/keymgr/rtl/keymgr_sideload_key_ctrl.sv
+++ b/hw/ip/keymgr/rtl/keymgr_sideload_key_ctrl.sv
@@ -22,33 +22,63 @@
output logic prng_en_o,
output hw_key_req_t aes_key_o,
output hw_key_req_t kmac_key_o,
- output otbn_key_req_t otbn_key_o
+ output otbn_key_req_t otbn_key_o,
+ output logic fsm_err_o
);
- // Enumeration for working state
- typedef enum logic [2:0] {
- StSideloadReset,
- StSideloadIdle,
- StSideloadWipe,
- StSideloadStop
+ // Encoding generated with:
+ // $ ./util/design/sparse-fsm-encode.py -d 5 -m 4 -n 10 \
+ // -s 1700801647 --language=sv
+ //
+ // Hamming distance histogram:
+ //
+ // 0: --
+ // 1: --
+ // 2: --
+ // 3: --
+ // 4: --
+ // 5: |||||||||||||||||||| (33.33%)
+ // 6: |||||||||| (16.67%)
+ // 7: |||||||||||||||||||| (33.33%)
+ // 8: |||||||||| (16.67%)
+ // 9: --
+ // 10: --
+ //
+ // Minimum Hamming distance: 5
+ // Maximum Hamming distance: 8
+ // Minimum Hamming weight: 3
+ // Maximum Hamming weight: 7
+ //
+ localparam int StateWidth = 10;
+ typedef enum logic [StateWidth-1:0] {
+ StSideloadReset = 10'b0011111011,
+ StSideloadIdle = 10'b0101000101,
+ StSideloadWipe = 10'b1110110010,
+ StSideloadStop = 10'b1000001010
} keymgr_sideload_e;
keymgr_sideload_e state_q, state_d;
- logic keys_en;
+ // This primitive is used to place a size-only constraint on the
+ // flops in order to prevent FSM state encoding optimizations.
+ logic [StateWidth-1:0] state_raw_q;
+ assign state_q = keymgr_sideload_e'(state_raw_q);
+ prim_flop #(
+ .Width(StateWidth),
+ .ResetValue(StateWidth'(StSideloadReset))
+ ) u_state_regs (
+ .clk_i,
+ .rst_ni,
+ .d_i ( state_d ),
+ .q_o ( state_raw_q )
+ );
+
+ logic keys_en;
logic [Shares-1:0][KeyWidth-1:0] data_truncated;
for(genvar i = 0; i < Shares; i++) begin : gen_truncate_data
assign data_truncated[i] = data_i[i][KeyWidth-1:0];
end
- always_ff @(posedge clk_i or negedge rst_ni) begin
- if (!rst_ni) begin
- state_q <= StSideloadReset;
- end else begin
- state_q <= state_d;
- end
- end
-
// clear all keys when selected by software, or when
// wipe command is received
logic clr_all_keys;
@@ -68,6 +98,7 @@
always_comb begin
keys_en = 1'b0;
state_d = state_q;
+ fsm_err_o = 1'b0;
unique case (state_q)
StSideloadReset: begin
@@ -97,7 +128,10 @@
keys_en = 1'b0;
end
- default:;
+ default: begin
+ fsm_err_o = 1'b1;
+ end
+
endcase // unique case (state_q)
end
diff --git a/hw/ip/prim/rtl/prim_count.sv b/hw/ip/prim/rtl/prim_count.sv
index b1deb61..0d82952 100644
--- a/hw/ip/prim/rtl/prim_count.sv
+++ b/hw/ip/prim/rtl/prim_count.sv
@@ -34,6 +34,9 @@
output logic err_o
);
+ // if output selects downcount, it MUST be the cross count style
+ `ASSERT_INIT(CntStyleMatch_A, OutSelDnCnt ? CntStyle == CrossCnt : 1'b1 )
+
localparam int CntCopies = (CntStyle == DupCnt) ? 2 : 1;
cmp_valid_e cmp_valid;
@@ -53,6 +56,7 @@
for (genvar i = 0; i < CntCopies; i++) begin : gen_cnts
// up-count
assign up_cnt_d[i] = (clr_i) ? '0 :
+ (set_i & CntStyle == DupCnt) ? set_cnt_i :
(en_i & up_cnt_q[i] < max_val) ? up_cnt_q[i] + 1'b1 :
up_cnt_q[i];