[flash_ctrl] Move macro_err from fatal to recoverable error
fixes #15702
Signed-off-by: Timothy Chen <timothytim@google.com>
diff --git a/hw/ip/flash_ctrl/data/flash_ctrl.hjson b/hw/ip/flash_ctrl/data/flash_ctrl.hjson
index 4f3aa6b..abdc2f4 100644
--- a/hw/ip/flash_ctrl/data/flash_ctrl.hjson
+++ b/hw/ip/flash_ctrl/data/flash_ctrl.hjson
@@ -1803,6 +1803,13 @@
This is an asynchronous error.
'''
},
+ { bits: "7",
+ name: "macro_err",
+ desc: '''
+ A recoverable error has been encountered in the flash macro.
+ Please read the flash macro status registers for more details.
+ '''
+ },
]
},
@@ -1928,42 +1935,36 @@
'''
},
{ bits: "6",
- name: "flash_macro_err",
- desc: '''
- The flash life cycle management interface encountered a native flash macro error.
- '''
- },
- { bits: "7",
name: "seed_err",
desc: '''
The seed reading process encountered an unexpected error.
'''
},
- { bits: "8",
+ { bits: "7",
name: "phy_relbl_err",
desc: '''
The flash macro encountered a storage reliability ECC error.
'''
},
- { bits: "9",
+ { bits: "8",
name: "phy_storage_err",
desc: '''
The flash macro encountered a storage integrity ECC error.
'''
},
- { bits: "10",
+ { bits: "9",
name: "spurious_ack",
desc: '''
The flash emitted an unexpected acknowledgement.
'''
},
- { bits: "11",
+ { bits: "10",
name: "arb_err",
desc: '''
The phy arbiter encountered inconsistent results.
'''
},
- { bits: "12",
+ { bits: "11",
name: "host_gnt_err",
desc: '''
A host transaction was granted with illegal properties.
diff --git a/hw/ip/flash_ctrl/data/flash_ctrl.hjson.tpl b/hw/ip/flash_ctrl/data/flash_ctrl.hjson.tpl
index 063aa9e..8854067 100644
--- a/hw/ip/flash_ctrl/data/flash_ctrl.hjson.tpl
+++ b/hw/ip/flash_ctrl/data/flash_ctrl.hjson.tpl
@@ -1278,6 +1278,13 @@
This is an asynchronous error.
'''
},
+ { bits: "7",
+ name: "macro_err",
+ desc: '''
+ A recoverable error has been encountered in the flash macro.
+ Please read the flash macro status registers for more details.
+ '''
+ },
]
},
@@ -1403,42 +1410,36 @@
'''
},
{ bits: "6",
- name: "flash_macro_err",
- desc: '''
- The flash life cycle management interface encountered a native flash macro error.
- '''
- },
- { bits: "7",
name: "seed_err",
desc: '''
The seed reading process encountered an unexpected error.
'''
},
- { bits: "8",
+ { bits: "7",
name: "phy_relbl_err",
desc: '''
The flash macro encountered a storage reliability ECC error.
'''
},
- { bits: "9",
+ { bits: "8",
name: "phy_storage_err",
desc: '''
The flash macro encountered a storage integrity ECC error.
'''
},
- { bits: "10",
+ { bits: "9",
name: "spurious_ack",
desc: '''
The flash emitted an unexpected acknowledgement.
'''
},
- { bits: "11",
+ { bits: "10",
name: "arb_err",
desc: '''
The phy arbiter encountered inconsistent results.
'''
},
- { bits: "12",
+ { bits: "11",
name: "host_gnt_err",
desc: '''
A host transaction was granted with illegal properties.
diff --git a/hw/ip/flash_ctrl/data/flash_ctrl.sv.tpl b/hw/ip/flash_ctrl/data/flash_ctrl.sv.tpl
index b98527d..44b21dd 100644
--- a/hw/ip/flash_ctrl/data/flash_ctrl.sv.tpl
+++ b/hw/ip/flash_ctrl/data/flash_ctrl.sv.tpl
@@ -914,6 +914,7 @@
// An excessive number of recoverable errors may also indicate an attack
logic recov_err;
assign recov_err = (sw_ctrl_done & |sw_ctrl_err) |
+ flash_phy_rsp.macro_err |
update_err;
logic fatal_err;
@@ -1037,6 +1038,7 @@
assign hw2reg.err_code.prog_win_err.d = 1'b1;
assign hw2reg.err_code.prog_type_err.d = 1'b1;
assign hw2reg.err_code.update_err.d = 1'b1;
+ assign hw2reg.err_code.macro_err.d = 1'b1;
assign hw2reg.err_code.op_err.de = sw_ctrl_err.invalid_op_err;
assign hw2reg.err_code.mp_err.de = sw_ctrl_err.mp_err;
assign hw2reg.err_code.rd_err.de = sw_ctrl_err.rd_err;
@@ -1044,6 +1046,7 @@
assign hw2reg.err_code.prog_win_err.de = sw_ctrl_err.prog_win_err;
assign hw2reg.err_code.prog_type_err.de = sw_ctrl_err.prog_type_err;
assign hw2reg.err_code.update_err.de = update_err;
+ assign hw2reg.err_code.macro_err.de = flash_phy_rsp.macro_err;
assign hw2reg.err_addr.d = {ctrl_err_addr, {BusByteWidth{1'h0}}};
assign hw2reg.err_addr.de = sw_ctrl_err.mp_err |
sw_ctrl_err.rd_err |
@@ -1060,7 +1063,6 @@
assign hw2reg.fault_status.prog_err.d = 1'b1;
assign hw2reg.fault_status.prog_win_err.d = 1'b1;
assign hw2reg.fault_status.prog_type_err.d = 1'b1;
- assign hw2reg.fault_status.flash_macro_err.d = 1'b1;
assign hw2reg.fault_status.seed_err.d = 1'b1;
assign hw2reg.fault_status.phy_relbl_err.d = 1'b1;
assign hw2reg.fault_status.phy_storage_err.d = 1'b1;
@@ -1073,7 +1075,6 @@
assign hw2reg.fault_status.prog_err.de = hw_err.prog_err;
assign hw2reg.fault_status.prog_win_err.de = hw_err.prog_win_err;
assign hw2reg.fault_status.prog_type_err.de = hw_err.prog_type_err;
- assign hw2reg.fault_status.flash_macro_err.de = flash_phy_rsp.macro_err;
assign hw2reg.fault_status.seed_err.de = seed_err;
assign hw2reg.fault_status.phy_relbl_err.de = flash_phy_rsp.storage_relbl_err;
assign hw2reg.fault_status.phy_storage_err.de = flash_phy_rsp.storage_intg_err;
diff --git a/hw/ip/flash_ctrl/rtl/flash_ctrl.sv b/hw/ip/flash_ctrl/rtl/flash_ctrl.sv
index 7ea5989..37d86cc 100644
--- a/hw/ip/flash_ctrl/rtl/flash_ctrl.sv
+++ b/hw/ip/flash_ctrl/rtl/flash_ctrl.sv
@@ -915,6 +915,7 @@
// An excessive number of recoverable errors may also indicate an attack
logic recov_err;
assign recov_err = (sw_ctrl_done & |sw_ctrl_err) |
+ flash_phy_rsp.macro_err |
update_err;
logic fatal_err;
@@ -1038,6 +1039,7 @@
assign hw2reg.err_code.prog_win_err.d = 1'b1;
assign hw2reg.err_code.prog_type_err.d = 1'b1;
assign hw2reg.err_code.update_err.d = 1'b1;
+ assign hw2reg.err_code.macro_err.d = 1'b1;
assign hw2reg.err_code.op_err.de = sw_ctrl_err.invalid_op_err;
assign hw2reg.err_code.mp_err.de = sw_ctrl_err.mp_err;
assign hw2reg.err_code.rd_err.de = sw_ctrl_err.rd_err;
@@ -1045,6 +1047,7 @@
assign hw2reg.err_code.prog_win_err.de = sw_ctrl_err.prog_win_err;
assign hw2reg.err_code.prog_type_err.de = sw_ctrl_err.prog_type_err;
assign hw2reg.err_code.update_err.de = update_err;
+ assign hw2reg.err_code.macro_err.de = flash_phy_rsp.macro_err;
assign hw2reg.err_addr.d = {ctrl_err_addr, {BusByteWidth{1'h0}}};
assign hw2reg.err_addr.de = sw_ctrl_err.mp_err |
sw_ctrl_err.rd_err |
@@ -1061,7 +1064,6 @@
assign hw2reg.fault_status.prog_err.d = 1'b1;
assign hw2reg.fault_status.prog_win_err.d = 1'b1;
assign hw2reg.fault_status.prog_type_err.d = 1'b1;
- assign hw2reg.fault_status.flash_macro_err.d = 1'b1;
assign hw2reg.fault_status.seed_err.d = 1'b1;
assign hw2reg.fault_status.phy_relbl_err.d = 1'b1;
assign hw2reg.fault_status.phy_storage_err.d = 1'b1;
@@ -1074,7 +1076,6 @@
assign hw2reg.fault_status.prog_err.de = hw_err.prog_err;
assign hw2reg.fault_status.prog_win_err.de = hw_err.prog_win_err;
assign hw2reg.fault_status.prog_type_err.de = hw_err.prog_type_err;
- assign hw2reg.fault_status.flash_macro_err.de = flash_phy_rsp.macro_err;
assign hw2reg.fault_status.seed_err.de = seed_err;
assign hw2reg.fault_status.phy_relbl_err.de = flash_phy_rsp.storage_relbl_err;
assign hw2reg.fault_status.phy_storage_err.de = flash_phy_rsp.storage_intg_err;
diff --git a/hw/ip/flash_ctrl/rtl/flash_ctrl_core_reg_top.sv b/hw/ip/flash_ctrl/rtl/flash_ctrl_core_reg_top.sv
index 6e01fc0..20aac72 100644
--- a/hw/ip/flash_ctrl/rtl/flash_ctrl_core_reg_top.sv
+++ b/hw/ip/flash_ctrl/rtl/flash_ctrl_core_reg_top.sv
@@ -965,6 +965,8 @@
logic err_code_prog_type_err_wd;
logic err_code_update_err_qs;
logic err_code_update_err_wd;
+ logic err_code_macro_err_qs;
+ logic err_code_macro_err_wd;
logic std_fault_status_reg_intg_err_qs;
logic std_fault_status_prog_intg_err_qs;
logic std_fault_status_lcmgr_err_qs;
@@ -980,7 +982,6 @@
logic fault_status_prog_err_qs;
logic fault_status_prog_win_err_qs;
logic fault_status_prog_type_err_qs;
- logic fault_status_flash_macro_err_qs;
logic fault_status_seed_err_qs;
logic fault_status_phy_relbl_err_qs;
logic fault_status_phy_storage_err_qs;
@@ -10373,6 +10374,32 @@
.qs (err_code_update_err_qs)
);
+ // F[macro_err]: 7:7
+ prim_subreg #(
+ .DW (1),
+ .SwAccess(prim_subreg_pkg::SwAccessW1C),
+ .RESVAL (1'h0)
+ ) u_err_code_macro_err (
+ .clk_i (clk_i),
+ .rst_ni (rst_ni),
+
+ // from register interface
+ .we (err_code_we),
+ .wd (err_code_macro_err_wd),
+
+ // from internal hardware
+ .de (hw2reg.err_code.macro_err.de),
+ .d (hw2reg.err_code.macro_err.d),
+
+ // to internal hardware
+ .qe (),
+ .q (),
+ .ds (),
+
+ // to register interface (read)
+ .qs (err_code_macro_err_qs)
+ );
+
// R[std_fault_status]: V(False)
// F[reg_intg_err]: 0:0
@@ -10767,33 +10794,7 @@
.qs (fault_status_prog_type_err_qs)
);
- // F[flash_macro_err]: 6:6
- prim_subreg #(
- .DW (1),
- .SwAccess(prim_subreg_pkg::SwAccessRO),
- .RESVAL (1'h0)
- ) u_fault_status_flash_macro_err (
- .clk_i (clk_i),
- .rst_ni (rst_ni),
-
- // from register interface
- .we (1'b0),
- .wd ('0),
-
- // from internal hardware
- .de (hw2reg.fault_status.flash_macro_err.de),
- .d (hw2reg.fault_status.flash_macro_err.d),
-
- // to internal hardware
- .qe (),
- .q (reg2hw.fault_status.flash_macro_err.q),
- .ds (),
-
- // to register interface (read)
- .qs (fault_status_flash_macro_err_qs)
- );
-
- // F[seed_err]: 7:7
+ // F[seed_err]: 6:6
prim_subreg #(
.DW (1),
.SwAccess(prim_subreg_pkg::SwAccessRO),
@@ -10819,7 +10820,7 @@
.qs (fault_status_seed_err_qs)
);
- // F[phy_relbl_err]: 8:8
+ // F[phy_relbl_err]: 7:7
prim_subreg #(
.DW (1),
.SwAccess(prim_subreg_pkg::SwAccessRO),
@@ -10845,7 +10846,7 @@
.qs (fault_status_phy_relbl_err_qs)
);
- // F[phy_storage_err]: 9:9
+ // F[phy_storage_err]: 8:8
prim_subreg #(
.DW (1),
.SwAccess(prim_subreg_pkg::SwAccessRO),
@@ -10871,7 +10872,7 @@
.qs (fault_status_phy_storage_err_qs)
);
- // F[spurious_ack]: 10:10
+ // F[spurious_ack]: 9:9
prim_subreg #(
.DW (1),
.SwAccess(prim_subreg_pkg::SwAccessRO),
@@ -10897,7 +10898,7 @@
.qs (fault_status_spurious_ack_qs)
);
- // F[arb_err]: 11:11
+ // F[arb_err]: 10:10
prim_subreg #(
.DW (1),
.SwAccess(prim_subreg_pkg::SwAccessRO),
@@ -10923,7 +10924,7 @@
.qs (fault_status_arb_err_qs)
);
- // F[host_gnt_err]: 12:12
+ // F[host_gnt_err]: 11:11
prim_subreg #(
.DW (1),
.SwAccess(prim_subreg_pkg::SwAccessRO),
@@ -12371,6 +12372,8 @@
assign err_code_prog_type_err_wd = reg_wdata[5];
assign err_code_update_err_wd = reg_wdata[6];
+
+ assign err_code_macro_err_wd = reg_wdata[7];
assign ecc_single_err_cnt_we = addr_hit[98] & reg_we & !reg_error;
assign ecc_single_err_cnt_ecc_single_err_cnt_0_wd = reg_wdata[7:0];
@@ -13143,6 +13146,7 @@
reg_rdata_next[4] = err_code_prog_win_err_qs;
reg_rdata_next[5] = err_code_prog_type_err_qs;
reg_rdata_next[6] = err_code_update_err_qs;
+ reg_rdata_next[7] = err_code_macro_err_qs;
end
addr_hit[95]: begin
@@ -13164,13 +13168,12 @@
reg_rdata_next[3] = fault_status_prog_err_qs;
reg_rdata_next[4] = fault_status_prog_win_err_qs;
reg_rdata_next[5] = fault_status_prog_type_err_qs;
- reg_rdata_next[6] = fault_status_flash_macro_err_qs;
- reg_rdata_next[7] = fault_status_seed_err_qs;
- reg_rdata_next[8] = fault_status_phy_relbl_err_qs;
- reg_rdata_next[9] = fault_status_phy_storage_err_qs;
- reg_rdata_next[10] = fault_status_spurious_ack_qs;
- reg_rdata_next[11] = fault_status_arb_err_qs;
- reg_rdata_next[12] = fault_status_host_gnt_err_qs;
+ reg_rdata_next[6] = fault_status_seed_err_qs;
+ reg_rdata_next[7] = fault_status_phy_relbl_err_qs;
+ reg_rdata_next[8] = fault_status_phy_storage_err_qs;
+ reg_rdata_next[9] = fault_status_spurious_ack_qs;
+ reg_rdata_next[10] = fault_status_arb_err_qs;
+ reg_rdata_next[11] = fault_status_host_gnt_err_qs;
end
addr_hit[97]: begin
diff --git a/hw/ip/flash_ctrl/rtl/flash_ctrl_reg_pkg.sv b/hw/ip/flash_ctrl/rtl/flash_ctrl_reg_pkg.sv
index 85deb10..e463e1e 100644
--- a/hw/ip/flash_ctrl/rtl/flash_ctrl_reg_pkg.sv
+++ b/hw/ip/flash_ctrl/rtl/flash_ctrl_reg_pkg.sv
@@ -433,9 +433,6 @@
} prog_type_err;
struct packed {
logic q;
- } flash_macro_err;
- struct packed {
- logic q;
} seed_err;
struct packed {
logic q;
@@ -594,6 +591,10 @@
logic d;
logic de;
} update_err;
+ struct packed {
+ logic d;
+ logic de;
+ } macro_err;
} flash_ctrl_hw2reg_err_code_reg_t;
typedef struct packed {
@@ -663,10 +664,6 @@
struct packed {
logic d;
logic de;
- } flash_macro_err;
- struct packed {
- logic d;
- logic de;
} seed_err;
struct packed {
logic d;
@@ -731,29 +728,29 @@
// Register -> HW type for core interface
typedef struct packed {
- flash_ctrl_reg2hw_intr_state_reg_t intr_state; // [1326:1321]
- flash_ctrl_reg2hw_intr_enable_reg_t intr_enable; // [1320:1315]
- flash_ctrl_reg2hw_intr_test_reg_t intr_test; // [1314:1303]
- flash_ctrl_reg2hw_alert_test_reg_t alert_test; // [1302:1293]
- flash_ctrl_reg2hw_dis_reg_t dis; // [1292:1289]
- flash_ctrl_reg2hw_exec_reg_t exec; // [1288:1257]
- flash_ctrl_reg2hw_init_reg_t init; // [1256:1256]
- flash_ctrl_reg2hw_control_reg_t control; // [1255:1236]
- flash_ctrl_reg2hw_addr_reg_t addr; // [1235:1216]
- flash_ctrl_reg2hw_prog_type_en_reg_t prog_type_en; // [1215:1214]
- flash_ctrl_reg2hw_erase_suspend_reg_t erase_suspend; // [1213:1213]
- flash_ctrl_reg2hw_mp_region_cfg_mreg_t [7:0] mp_region_cfg; // [1212:989]
- flash_ctrl_reg2hw_mp_region_mreg_t [7:0] mp_region; // [988:837]
- flash_ctrl_reg2hw_default_region_reg_t default_region; // [836:813]
- flash_ctrl_reg2hw_bank0_info0_page_cfg_mreg_t [9:0] bank0_info0_page_cfg; // [812:533]
- flash_ctrl_reg2hw_bank0_info1_page_cfg_mreg_t [0:0] bank0_info1_page_cfg; // [532:505]
- flash_ctrl_reg2hw_bank0_info2_page_cfg_mreg_t [1:0] bank0_info2_page_cfg; // [504:449]
- flash_ctrl_reg2hw_bank1_info0_page_cfg_mreg_t [9:0] bank1_info0_page_cfg; // [448:169]
- flash_ctrl_reg2hw_bank1_info1_page_cfg_mreg_t [0:0] bank1_info1_page_cfg; // [168:141]
- flash_ctrl_reg2hw_bank1_info2_page_cfg_mreg_t [1:0] bank1_info2_page_cfg; // [140:85]
- flash_ctrl_reg2hw_mp_bank_cfg_shadowed_mreg_t [1:0] mp_bank_cfg_shadowed; // [84:83]
- flash_ctrl_reg2hw_std_fault_status_reg_t std_fault_status; // [82:74]
- flash_ctrl_reg2hw_fault_status_reg_t fault_status; // [73:61]
+ flash_ctrl_reg2hw_intr_state_reg_t intr_state; // [1325:1320]
+ flash_ctrl_reg2hw_intr_enable_reg_t intr_enable; // [1319:1314]
+ flash_ctrl_reg2hw_intr_test_reg_t intr_test; // [1313:1302]
+ flash_ctrl_reg2hw_alert_test_reg_t alert_test; // [1301:1292]
+ flash_ctrl_reg2hw_dis_reg_t dis; // [1291:1288]
+ flash_ctrl_reg2hw_exec_reg_t exec; // [1287:1256]
+ flash_ctrl_reg2hw_init_reg_t init; // [1255:1255]
+ flash_ctrl_reg2hw_control_reg_t control; // [1254:1235]
+ flash_ctrl_reg2hw_addr_reg_t addr; // [1234:1215]
+ flash_ctrl_reg2hw_prog_type_en_reg_t prog_type_en; // [1214:1213]
+ flash_ctrl_reg2hw_erase_suspend_reg_t erase_suspend; // [1212:1212]
+ flash_ctrl_reg2hw_mp_region_cfg_mreg_t [7:0] mp_region_cfg; // [1211:988]
+ flash_ctrl_reg2hw_mp_region_mreg_t [7:0] mp_region; // [987:836]
+ flash_ctrl_reg2hw_default_region_reg_t default_region; // [835:812]
+ flash_ctrl_reg2hw_bank0_info0_page_cfg_mreg_t [9:0] bank0_info0_page_cfg; // [811:532]
+ flash_ctrl_reg2hw_bank0_info1_page_cfg_mreg_t [0:0] bank0_info1_page_cfg; // [531:504]
+ flash_ctrl_reg2hw_bank0_info2_page_cfg_mreg_t [1:0] bank0_info2_page_cfg; // [503:448]
+ flash_ctrl_reg2hw_bank1_info0_page_cfg_mreg_t [9:0] bank1_info0_page_cfg; // [447:168]
+ flash_ctrl_reg2hw_bank1_info1_page_cfg_mreg_t [0:0] bank1_info1_page_cfg; // [167:140]
+ flash_ctrl_reg2hw_bank1_info2_page_cfg_mreg_t [1:0] bank1_info2_page_cfg; // [139:84]
+ flash_ctrl_reg2hw_mp_bank_cfg_shadowed_mreg_t [1:0] mp_bank_cfg_shadowed; // [83:82]
+ flash_ctrl_reg2hw_std_fault_status_reg_t std_fault_status; // [81:73]
+ flash_ctrl_reg2hw_fault_status_reg_t fault_status; // [72:61]
flash_ctrl_reg2hw_ecc_single_err_cnt_mreg_t [1:0] ecc_single_err_cnt; // [60:45]
flash_ctrl_reg2hw_phy_alert_cfg_reg_t phy_alert_cfg; // [44:43]
flash_ctrl_reg2hw_scratch_reg_t scratch; // [42:11]
@@ -770,9 +767,9 @@
flash_ctrl_hw2reg_op_status_reg_t op_status; // [179:176]
flash_ctrl_hw2reg_status_reg_t status; // [175:166]
flash_ctrl_hw2reg_debug_state_reg_t debug_state; // [165:155]
- flash_ctrl_hw2reg_err_code_reg_t err_code; // [154:141]
- flash_ctrl_hw2reg_std_fault_status_reg_t std_fault_status; // [140:123]
- flash_ctrl_hw2reg_fault_status_reg_t fault_status; // [122:97]
+ flash_ctrl_hw2reg_err_code_reg_t err_code; // [154:139]
+ flash_ctrl_hw2reg_std_fault_status_reg_t std_fault_status; // [138:121]
+ flash_ctrl_hw2reg_fault_status_reg_t fault_status; // [120:97]
flash_ctrl_hw2reg_err_addr_reg_t err_addr; // [96:76]
flash_ctrl_hw2reg_ecc_single_err_cnt_mreg_t [1:0] ecc_single_err_cnt; // [75:58]
flash_ctrl_hw2reg_ecc_single_err_addr_mreg_t [1:0] ecc_single_err_addr; // [57:16]
diff --git a/hw/top_earlgrey/ip/flash_ctrl/data/autogen/flash_ctrl.hjson b/hw/top_earlgrey/ip/flash_ctrl/data/autogen/flash_ctrl.hjson
index fc7c986..d970dd7 100644
--- a/hw/top_earlgrey/ip/flash_ctrl/data/autogen/flash_ctrl.hjson
+++ b/hw/top_earlgrey/ip/flash_ctrl/data/autogen/flash_ctrl.hjson
@@ -1809,6 +1809,13 @@
This is an asynchronous error.
'''
},
+ { bits: "7",
+ name: "macro_err",
+ desc: '''
+ A recoverable error has been encountered in the flash macro.
+ Please read the flash macro status registers for more details.
+ '''
+ },
]
},
@@ -1934,42 +1941,36 @@
'''
},
{ bits: "6",
- name: "flash_macro_err",
- desc: '''
- The flash life cycle management interface encountered a native flash macro error.
- '''
- },
- { bits: "7",
name: "seed_err",
desc: '''
The seed reading process encountered an unexpected error.
'''
},
- { bits: "8",
+ { bits: "7",
name: "phy_relbl_err",
desc: '''
The flash macro encountered a storage reliability ECC error.
'''
},
- { bits: "9",
+ { bits: "8",
name: "phy_storage_err",
desc: '''
The flash macro encountered a storage integrity ECC error.
'''
},
- { bits: "10",
+ { bits: "9",
name: "spurious_ack",
desc: '''
The flash emitted an unexpected acknowledgement.
'''
},
- { bits: "11",
+ { bits: "10",
name: "arb_err",
desc: '''
The phy arbiter encountered inconsistent results.
'''
},
- { bits: "12",
+ { bits: "11",
name: "host_gnt_err",
desc: '''
A host transaction was granted with illegal properties.
diff --git a/hw/top_earlgrey/ip/flash_ctrl/rtl/autogen/flash_ctrl.sv b/hw/top_earlgrey/ip/flash_ctrl/rtl/autogen/flash_ctrl.sv
index 34bf2df..1e5c205 100644
--- a/hw/top_earlgrey/ip/flash_ctrl/rtl/autogen/flash_ctrl.sv
+++ b/hw/top_earlgrey/ip/flash_ctrl/rtl/autogen/flash_ctrl.sv
@@ -921,6 +921,7 @@
// An excessive number of recoverable errors may also indicate an attack
logic recov_err;
assign recov_err = (sw_ctrl_done & |sw_ctrl_err) |
+ flash_phy_rsp.macro_err |
update_err;
logic fatal_err;
@@ -1044,6 +1045,7 @@
assign hw2reg.err_code.prog_win_err.d = 1'b1;
assign hw2reg.err_code.prog_type_err.d = 1'b1;
assign hw2reg.err_code.update_err.d = 1'b1;
+ assign hw2reg.err_code.macro_err.d = 1'b1;
assign hw2reg.err_code.op_err.de = sw_ctrl_err.invalid_op_err;
assign hw2reg.err_code.mp_err.de = sw_ctrl_err.mp_err;
assign hw2reg.err_code.rd_err.de = sw_ctrl_err.rd_err;
@@ -1051,6 +1053,7 @@
assign hw2reg.err_code.prog_win_err.de = sw_ctrl_err.prog_win_err;
assign hw2reg.err_code.prog_type_err.de = sw_ctrl_err.prog_type_err;
assign hw2reg.err_code.update_err.de = update_err;
+ assign hw2reg.err_code.macro_err.de = flash_phy_rsp.macro_err;
assign hw2reg.err_addr.d = {ctrl_err_addr, {BusByteWidth{1'h0}}};
assign hw2reg.err_addr.de = sw_ctrl_err.mp_err |
sw_ctrl_err.rd_err |
@@ -1067,7 +1070,6 @@
assign hw2reg.fault_status.prog_err.d = 1'b1;
assign hw2reg.fault_status.prog_win_err.d = 1'b1;
assign hw2reg.fault_status.prog_type_err.d = 1'b1;
- assign hw2reg.fault_status.flash_macro_err.d = 1'b1;
assign hw2reg.fault_status.seed_err.d = 1'b1;
assign hw2reg.fault_status.phy_relbl_err.d = 1'b1;
assign hw2reg.fault_status.phy_storage_err.d = 1'b1;
@@ -1080,7 +1082,6 @@
assign hw2reg.fault_status.prog_err.de = hw_err.prog_err;
assign hw2reg.fault_status.prog_win_err.de = hw_err.prog_win_err;
assign hw2reg.fault_status.prog_type_err.de = hw_err.prog_type_err;
- assign hw2reg.fault_status.flash_macro_err.de = flash_phy_rsp.macro_err;
assign hw2reg.fault_status.seed_err.de = seed_err;
assign hw2reg.fault_status.phy_relbl_err.de = flash_phy_rsp.storage_relbl_err;
assign hw2reg.fault_status.phy_storage_err.de = flash_phy_rsp.storage_intg_err;
diff --git a/hw/top_earlgrey/ip/flash_ctrl/rtl/autogen/flash_ctrl_core_reg_top.sv b/hw/top_earlgrey/ip/flash_ctrl/rtl/autogen/flash_ctrl_core_reg_top.sv
index 6e01fc0..20aac72 100644
--- a/hw/top_earlgrey/ip/flash_ctrl/rtl/autogen/flash_ctrl_core_reg_top.sv
+++ b/hw/top_earlgrey/ip/flash_ctrl/rtl/autogen/flash_ctrl_core_reg_top.sv
@@ -965,6 +965,8 @@
logic err_code_prog_type_err_wd;
logic err_code_update_err_qs;
logic err_code_update_err_wd;
+ logic err_code_macro_err_qs;
+ logic err_code_macro_err_wd;
logic std_fault_status_reg_intg_err_qs;
logic std_fault_status_prog_intg_err_qs;
logic std_fault_status_lcmgr_err_qs;
@@ -980,7 +982,6 @@
logic fault_status_prog_err_qs;
logic fault_status_prog_win_err_qs;
logic fault_status_prog_type_err_qs;
- logic fault_status_flash_macro_err_qs;
logic fault_status_seed_err_qs;
logic fault_status_phy_relbl_err_qs;
logic fault_status_phy_storage_err_qs;
@@ -10373,6 +10374,32 @@
.qs (err_code_update_err_qs)
);
+ // F[macro_err]: 7:7
+ prim_subreg #(
+ .DW (1),
+ .SwAccess(prim_subreg_pkg::SwAccessW1C),
+ .RESVAL (1'h0)
+ ) u_err_code_macro_err (
+ .clk_i (clk_i),
+ .rst_ni (rst_ni),
+
+ // from register interface
+ .we (err_code_we),
+ .wd (err_code_macro_err_wd),
+
+ // from internal hardware
+ .de (hw2reg.err_code.macro_err.de),
+ .d (hw2reg.err_code.macro_err.d),
+
+ // to internal hardware
+ .qe (),
+ .q (),
+ .ds (),
+
+ // to register interface (read)
+ .qs (err_code_macro_err_qs)
+ );
+
// R[std_fault_status]: V(False)
// F[reg_intg_err]: 0:0
@@ -10767,33 +10794,7 @@
.qs (fault_status_prog_type_err_qs)
);
- // F[flash_macro_err]: 6:6
- prim_subreg #(
- .DW (1),
- .SwAccess(prim_subreg_pkg::SwAccessRO),
- .RESVAL (1'h0)
- ) u_fault_status_flash_macro_err (
- .clk_i (clk_i),
- .rst_ni (rst_ni),
-
- // from register interface
- .we (1'b0),
- .wd ('0),
-
- // from internal hardware
- .de (hw2reg.fault_status.flash_macro_err.de),
- .d (hw2reg.fault_status.flash_macro_err.d),
-
- // to internal hardware
- .qe (),
- .q (reg2hw.fault_status.flash_macro_err.q),
- .ds (),
-
- // to register interface (read)
- .qs (fault_status_flash_macro_err_qs)
- );
-
- // F[seed_err]: 7:7
+ // F[seed_err]: 6:6
prim_subreg #(
.DW (1),
.SwAccess(prim_subreg_pkg::SwAccessRO),
@@ -10819,7 +10820,7 @@
.qs (fault_status_seed_err_qs)
);
- // F[phy_relbl_err]: 8:8
+ // F[phy_relbl_err]: 7:7
prim_subreg #(
.DW (1),
.SwAccess(prim_subreg_pkg::SwAccessRO),
@@ -10845,7 +10846,7 @@
.qs (fault_status_phy_relbl_err_qs)
);
- // F[phy_storage_err]: 9:9
+ // F[phy_storage_err]: 8:8
prim_subreg #(
.DW (1),
.SwAccess(prim_subreg_pkg::SwAccessRO),
@@ -10871,7 +10872,7 @@
.qs (fault_status_phy_storage_err_qs)
);
- // F[spurious_ack]: 10:10
+ // F[spurious_ack]: 9:9
prim_subreg #(
.DW (1),
.SwAccess(prim_subreg_pkg::SwAccessRO),
@@ -10897,7 +10898,7 @@
.qs (fault_status_spurious_ack_qs)
);
- // F[arb_err]: 11:11
+ // F[arb_err]: 10:10
prim_subreg #(
.DW (1),
.SwAccess(prim_subreg_pkg::SwAccessRO),
@@ -10923,7 +10924,7 @@
.qs (fault_status_arb_err_qs)
);
- // F[host_gnt_err]: 12:12
+ // F[host_gnt_err]: 11:11
prim_subreg #(
.DW (1),
.SwAccess(prim_subreg_pkg::SwAccessRO),
@@ -12371,6 +12372,8 @@
assign err_code_prog_type_err_wd = reg_wdata[5];
assign err_code_update_err_wd = reg_wdata[6];
+
+ assign err_code_macro_err_wd = reg_wdata[7];
assign ecc_single_err_cnt_we = addr_hit[98] & reg_we & !reg_error;
assign ecc_single_err_cnt_ecc_single_err_cnt_0_wd = reg_wdata[7:0];
@@ -13143,6 +13146,7 @@
reg_rdata_next[4] = err_code_prog_win_err_qs;
reg_rdata_next[5] = err_code_prog_type_err_qs;
reg_rdata_next[6] = err_code_update_err_qs;
+ reg_rdata_next[7] = err_code_macro_err_qs;
end
addr_hit[95]: begin
@@ -13164,13 +13168,12 @@
reg_rdata_next[3] = fault_status_prog_err_qs;
reg_rdata_next[4] = fault_status_prog_win_err_qs;
reg_rdata_next[5] = fault_status_prog_type_err_qs;
- reg_rdata_next[6] = fault_status_flash_macro_err_qs;
- reg_rdata_next[7] = fault_status_seed_err_qs;
- reg_rdata_next[8] = fault_status_phy_relbl_err_qs;
- reg_rdata_next[9] = fault_status_phy_storage_err_qs;
- reg_rdata_next[10] = fault_status_spurious_ack_qs;
- reg_rdata_next[11] = fault_status_arb_err_qs;
- reg_rdata_next[12] = fault_status_host_gnt_err_qs;
+ reg_rdata_next[6] = fault_status_seed_err_qs;
+ reg_rdata_next[7] = fault_status_phy_relbl_err_qs;
+ reg_rdata_next[8] = fault_status_phy_storage_err_qs;
+ reg_rdata_next[9] = fault_status_spurious_ack_qs;
+ reg_rdata_next[10] = fault_status_arb_err_qs;
+ reg_rdata_next[11] = fault_status_host_gnt_err_qs;
end
addr_hit[97]: begin
diff --git a/hw/top_earlgrey/ip/flash_ctrl/rtl/autogen/flash_ctrl_reg_pkg.sv b/hw/top_earlgrey/ip/flash_ctrl/rtl/autogen/flash_ctrl_reg_pkg.sv
index 85deb10..e463e1e 100644
--- a/hw/top_earlgrey/ip/flash_ctrl/rtl/autogen/flash_ctrl_reg_pkg.sv
+++ b/hw/top_earlgrey/ip/flash_ctrl/rtl/autogen/flash_ctrl_reg_pkg.sv
@@ -433,9 +433,6 @@
} prog_type_err;
struct packed {
logic q;
- } flash_macro_err;
- struct packed {
- logic q;
} seed_err;
struct packed {
logic q;
@@ -594,6 +591,10 @@
logic d;
logic de;
} update_err;
+ struct packed {
+ logic d;
+ logic de;
+ } macro_err;
} flash_ctrl_hw2reg_err_code_reg_t;
typedef struct packed {
@@ -663,10 +664,6 @@
struct packed {
logic d;
logic de;
- } flash_macro_err;
- struct packed {
- logic d;
- logic de;
} seed_err;
struct packed {
logic d;
@@ -731,29 +728,29 @@
// Register -> HW type for core interface
typedef struct packed {
- flash_ctrl_reg2hw_intr_state_reg_t intr_state; // [1326:1321]
- flash_ctrl_reg2hw_intr_enable_reg_t intr_enable; // [1320:1315]
- flash_ctrl_reg2hw_intr_test_reg_t intr_test; // [1314:1303]
- flash_ctrl_reg2hw_alert_test_reg_t alert_test; // [1302:1293]
- flash_ctrl_reg2hw_dis_reg_t dis; // [1292:1289]
- flash_ctrl_reg2hw_exec_reg_t exec; // [1288:1257]
- flash_ctrl_reg2hw_init_reg_t init; // [1256:1256]
- flash_ctrl_reg2hw_control_reg_t control; // [1255:1236]
- flash_ctrl_reg2hw_addr_reg_t addr; // [1235:1216]
- flash_ctrl_reg2hw_prog_type_en_reg_t prog_type_en; // [1215:1214]
- flash_ctrl_reg2hw_erase_suspend_reg_t erase_suspend; // [1213:1213]
- flash_ctrl_reg2hw_mp_region_cfg_mreg_t [7:0] mp_region_cfg; // [1212:989]
- flash_ctrl_reg2hw_mp_region_mreg_t [7:0] mp_region; // [988:837]
- flash_ctrl_reg2hw_default_region_reg_t default_region; // [836:813]
- flash_ctrl_reg2hw_bank0_info0_page_cfg_mreg_t [9:0] bank0_info0_page_cfg; // [812:533]
- flash_ctrl_reg2hw_bank0_info1_page_cfg_mreg_t [0:0] bank0_info1_page_cfg; // [532:505]
- flash_ctrl_reg2hw_bank0_info2_page_cfg_mreg_t [1:0] bank0_info2_page_cfg; // [504:449]
- flash_ctrl_reg2hw_bank1_info0_page_cfg_mreg_t [9:0] bank1_info0_page_cfg; // [448:169]
- flash_ctrl_reg2hw_bank1_info1_page_cfg_mreg_t [0:0] bank1_info1_page_cfg; // [168:141]
- flash_ctrl_reg2hw_bank1_info2_page_cfg_mreg_t [1:0] bank1_info2_page_cfg; // [140:85]
- flash_ctrl_reg2hw_mp_bank_cfg_shadowed_mreg_t [1:0] mp_bank_cfg_shadowed; // [84:83]
- flash_ctrl_reg2hw_std_fault_status_reg_t std_fault_status; // [82:74]
- flash_ctrl_reg2hw_fault_status_reg_t fault_status; // [73:61]
+ flash_ctrl_reg2hw_intr_state_reg_t intr_state; // [1325:1320]
+ flash_ctrl_reg2hw_intr_enable_reg_t intr_enable; // [1319:1314]
+ flash_ctrl_reg2hw_intr_test_reg_t intr_test; // [1313:1302]
+ flash_ctrl_reg2hw_alert_test_reg_t alert_test; // [1301:1292]
+ flash_ctrl_reg2hw_dis_reg_t dis; // [1291:1288]
+ flash_ctrl_reg2hw_exec_reg_t exec; // [1287:1256]
+ flash_ctrl_reg2hw_init_reg_t init; // [1255:1255]
+ flash_ctrl_reg2hw_control_reg_t control; // [1254:1235]
+ flash_ctrl_reg2hw_addr_reg_t addr; // [1234:1215]
+ flash_ctrl_reg2hw_prog_type_en_reg_t prog_type_en; // [1214:1213]
+ flash_ctrl_reg2hw_erase_suspend_reg_t erase_suspend; // [1212:1212]
+ flash_ctrl_reg2hw_mp_region_cfg_mreg_t [7:0] mp_region_cfg; // [1211:988]
+ flash_ctrl_reg2hw_mp_region_mreg_t [7:0] mp_region; // [987:836]
+ flash_ctrl_reg2hw_default_region_reg_t default_region; // [835:812]
+ flash_ctrl_reg2hw_bank0_info0_page_cfg_mreg_t [9:0] bank0_info0_page_cfg; // [811:532]
+ flash_ctrl_reg2hw_bank0_info1_page_cfg_mreg_t [0:0] bank0_info1_page_cfg; // [531:504]
+ flash_ctrl_reg2hw_bank0_info2_page_cfg_mreg_t [1:0] bank0_info2_page_cfg; // [503:448]
+ flash_ctrl_reg2hw_bank1_info0_page_cfg_mreg_t [9:0] bank1_info0_page_cfg; // [447:168]
+ flash_ctrl_reg2hw_bank1_info1_page_cfg_mreg_t [0:0] bank1_info1_page_cfg; // [167:140]
+ flash_ctrl_reg2hw_bank1_info2_page_cfg_mreg_t [1:0] bank1_info2_page_cfg; // [139:84]
+ flash_ctrl_reg2hw_mp_bank_cfg_shadowed_mreg_t [1:0] mp_bank_cfg_shadowed; // [83:82]
+ flash_ctrl_reg2hw_std_fault_status_reg_t std_fault_status; // [81:73]
+ flash_ctrl_reg2hw_fault_status_reg_t fault_status; // [72:61]
flash_ctrl_reg2hw_ecc_single_err_cnt_mreg_t [1:0] ecc_single_err_cnt; // [60:45]
flash_ctrl_reg2hw_phy_alert_cfg_reg_t phy_alert_cfg; // [44:43]
flash_ctrl_reg2hw_scratch_reg_t scratch; // [42:11]
@@ -770,9 +767,9 @@
flash_ctrl_hw2reg_op_status_reg_t op_status; // [179:176]
flash_ctrl_hw2reg_status_reg_t status; // [175:166]
flash_ctrl_hw2reg_debug_state_reg_t debug_state; // [165:155]
- flash_ctrl_hw2reg_err_code_reg_t err_code; // [154:141]
- flash_ctrl_hw2reg_std_fault_status_reg_t std_fault_status; // [140:123]
- flash_ctrl_hw2reg_fault_status_reg_t fault_status; // [122:97]
+ flash_ctrl_hw2reg_err_code_reg_t err_code; // [154:139]
+ flash_ctrl_hw2reg_std_fault_status_reg_t std_fault_status; // [138:121]
+ flash_ctrl_hw2reg_fault_status_reg_t fault_status; // [120:97]
flash_ctrl_hw2reg_err_addr_reg_t err_addr; // [96:76]
flash_ctrl_hw2reg_ecc_single_err_cnt_mreg_t [1:0] ecc_single_err_cnt; // [75:58]
flash_ctrl_hw2reg_ecc_single_err_addr_mreg_t [1:0] ecc_single_err_addr; // [57:16]