[alert_handler/top] Integration of alert handler LPGs
Signed-off-by: Michael Schaffner <msf@google.com>
diff --git a/hw/top_earlgrey/data/autogen/top_earlgrey.gen.hjson b/hw/top_earlgrey/data/autogen/top_earlgrey.gen.hjson
index 0b91197..c0901b3 100644
--- a/hw/top_earlgrey/data/autogen/top_earlgrey.gen.hjson
+++ b/hw/top_earlgrey/data/autogen/top_earlgrey.gen.hjson
@@ -29,6 +29,7 @@
{
top: clkmgr_aon_clocks.
ext: ""
+ lpg: clkmgr_aon_cg_en.
}
srcs:
[
@@ -178,6 +179,7 @@
{
top: rstmgr_aon_resets.
ext: ""
+ lpg: rstmgr_aon_rst_en.
}
nodes:
[
@@ -2685,6 +2687,8 @@
act: req
width: 1
inst_name: rstmgr_aon
+ default: ""
+ top_signame: rstmgr_aon_rst_en
index: -1
}
{
@@ -2857,6 +2861,8 @@
act: req
width: 1
inst_name: clkmgr_aon
+ default: ""
+ top_signame: clkmgr_aon_cg_en
index: -1
}
{
@@ -7508,7 +7514,9 @@
top:
[
clkmgr_aon.clocks
+ clkmgr_aon.cg_en
rstmgr_aon.resets
+ rstmgr_aon.rst_en
rv_core_ibex.irq_timer
rv_core_ibex.hart_id
rv_core_ibex.boot_addr
@@ -13113,6 +13121,8 @@
type: alert
async: "1"
module_name: uart0
+ lpg_name: peri_sys_io_div4_0
+ lpg_idx: 0
}
{
name: uart1_fatal_fault
@@ -13120,6 +13130,8 @@
type: alert
async: "1"
module_name: uart1
+ lpg_name: peri_sys_io_div4_0
+ lpg_idx: 0
}
{
name: uart2_fatal_fault
@@ -13127,6 +13139,8 @@
type: alert
async: "1"
module_name: uart2
+ lpg_name: peri_sys_io_div4_0
+ lpg_idx: 0
}
{
name: uart3_fatal_fault
@@ -13134,6 +13148,8 @@
type: alert
async: "1"
module_name: uart3
+ lpg_name: peri_sys_io_div4_0
+ lpg_idx: 0
}
{
name: gpio_fatal_fault
@@ -13141,6 +13157,8 @@
type: alert
async: "1"
module_name: gpio
+ lpg_name: peri_sys_io_div4_0
+ lpg_idx: 0
}
{
name: spi_device_fatal_fault
@@ -13148,6 +13166,8 @@
type: alert
async: "1"
module_name: spi_device
+ lpg_name: peri_spi_device_0
+ lpg_idx: 1
}
{
name: spi_host0_fatal_fault
@@ -13155,6 +13175,8 @@
type: alert
async: "1"
module_name: spi_host0
+ lpg_name: peri_spi_host0_0
+ lpg_idx: 2
}
{
name: spi_host1_fatal_fault
@@ -13162,6 +13184,8 @@
type: alert
async: "1"
module_name: spi_host1
+ lpg_name: peri_spi_host1_0
+ lpg_idx: 3
}
{
name: i2c0_fatal_fault
@@ -13169,6 +13193,8 @@
type: alert
async: "1"
module_name: i2c0
+ lpg_name: peri_i2c0_0
+ lpg_idx: 4
}
{
name: i2c1_fatal_fault
@@ -13176,6 +13202,8 @@
type: alert
async: "1"
module_name: i2c1
+ lpg_name: peri_i2c1_0
+ lpg_idx: 5
}
{
name: i2c2_fatal_fault
@@ -13183,6 +13211,8 @@
type: alert
async: "1"
module_name: i2c2
+ lpg_name: peri_i2c2_0
+ lpg_idx: 6
}
{
name: pattgen_fatal_fault
@@ -13190,6 +13220,8 @@
type: alert
async: "1"
module_name: pattgen
+ lpg_name: peri_sys_io_div4_0
+ lpg_idx: 0
}
{
name: rv_timer_fatal_fault
@@ -13197,6 +13229,8 @@
type: alert
async: "1"
module_name: rv_timer
+ lpg_name: timers_sys_io_div4_0
+ lpg_idx: 7
}
{
name: usbdev_fatal_fault
@@ -13204,6 +13238,8 @@
type: alert
async: "1"
module_name: usbdev
+ lpg_name: peri_usb_0
+ lpg_idx: 8
}
{
name: otp_ctrl_fatal_macro_error
@@ -13211,6 +13247,8 @@
type: alert
async: "1"
module_name: otp_ctrl
+ lpg_name: secure_lc_io_div4_0
+ lpg_idx: 9
}
{
name: otp_ctrl_fatal_check_error
@@ -13218,6 +13256,8 @@
type: alert
async: "1"
module_name: otp_ctrl
+ lpg_name: secure_lc_io_div4_0
+ lpg_idx: 9
}
{
name: otp_ctrl_fatal_bus_integ_error
@@ -13225,6 +13265,8 @@
type: alert
async: "1"
module_name: otp_ctrl
+ lpg_name: secure_lc_io_div4_0
+ lpg_idx: 9
}
{
name: lc_ctrl_fatal_prog_error
@@ -13232,6 +13274,8 @@
type: alert
async: "1"
module_name: lc_ctrl
+ lpg_name: secure_lc_io_div4_0
+ lpg_idx: 9
}
{
name: lc_ctrl_fatal_state_error
@@ -13239,6 +13283,8 @@
type: alert
async: "1"
module_name: lc_ctrl
+ lpg_name: secure_lc_io_div4_0
+ lpg_idx: 9
}
{
name: lc_ctrl_fatal_bus_integ_error
@@ -13246,6 +13292,8 @@
type: alert
async: "1"
module_name: lc_ctrl
+ lpg_name: secure_lc_io_div4_0
+ lpg_idx: 9
}
{
name: pwrmgr_aon_fatal_fault
@@ -13253,6 +13301,8 @@
type: alert
async: "1"
module_name: pwrmgr_aon
+ lpg_name: powerup_por_io_div4_Aon
+ lpg_idx: 10
}
{
name: rstmgr_aon_fatal_fault
@@ -13260,6 +13310,8 @@
type: alert
async: "1"
module_name: rstmgr_aon
+ lpg_name: powerup_por_io_div4_Aon
+ lpg_idx: 10
}
{
name: clkmgr_aon_recov_fault
@@ -13267,6 +13319,8 @@
type: alert
async: "1"
module_name: clkmgr_aon
+ lpg_name: powerup_por_io_div4_Aon
+ lpg_idx: 10
}
{
name: clkmgr_aon_fatal_fault
@@ -13274,6 +13328,8 @@
type: alert
async: "1"
module_name: clkmgr_aon
+ lpg_name: powerup_por_io_div4_Aon
+ lpg_idx: 10
}
{
name: sysrst_ctrl_aon_fatal_fault
@@ -13281,6 +13337,8 @@
type: alert
async: "1"
module_name: sysrst_ctrl_aon
+ lpg_name: infra_sys_io_div4_Aon
+ lpg_idx: 11
}
{
name: adc_ctrl_aon_fatal_fault
@@ -13288,6 +13346,8 @@
type: alert
async: "1"
module_name: adc_ctrl_aon
+ lpg_name: peri_sys_io_div4_Aon
+ lpg_idx: 12
}
{
name: pwm_aon_fatal_fault
@@ -13295,6 +13355,8 @@
type: alert
async: "1"
module_name: pwm_aon
+ lpg_name: powerup_sys_io_div4_Aon
+ lpg_idx: 13
}
{
name: pinmux_aon_fatal_fault
@@ -13302,6 +13364,8 @@
type: alert
async: "1"
module_name: pinmux_aon
+ lpg_name: powerup_sys_io_div4_Aon
+ lpg_idx: 13
}
{
name: aon_timer_aon_fatal_fault
@@ -13309,6 +13373,8 @@
type: alert
async: "1"
module_name: aon_timer_aon
+ lpg_name: timers_lc_io_div4_Aon
+ lpg_idx: 14
}
{
name: sensor_ctrl_recov_alert
@@ -13316,6 +13382,8 @@
type: alert
async: "1"
module_name: sensor_ctrl
+ lpg_name: secure_lc_io_div4_Aon
+ lpg_idx: 15
}
{
name: sensor_ctrl_fatal_alert
@@ -13323,6 +13391,8 @@
type: alert
async: "1"
module_name: sensor_ctrl
+ lpg_name: secure_lc_io_div4_Aon
+ lpg_idx: 15
}
{
name: sram_ctrl_ret_aon_fatal_error
@@ -13330,6 +13400,8 @@
type: alert
async: "1"
module_name: sram_ctrl_ret_aon
+ lpg_name: infra_sys_io_div4_Aon
+ lpg_idx: 11
}
{
name: flash_ctrl_recov_err
@@ -13337,6 +13409,8 @@
type: alert
async: "1"
module_name: flash_ctrl
+ lpg_name: infra_lc_0
+ lpg_idx: 16
}
{
name: flash_ctrl_fatal_err
@@ -13344,6 +13418,8 @@
type: alert
async: "1"
module_name: flash_ctrl
+ lpg_name: infra_lc_0
+ lpg_idx: 16
}
{
name: rv_dm_fatal_fault
@@ -13351,6 +13427,8 @@
type: alert
async: "1"
module_name: rv_dm
+ lpg_name: infra_lc_0
+ lpg_idx: 16
}
{
name: rv_plic_fatal_fault
@@ -13358,6 +13436,8 @@
type: alert
async: "1"
module_name: rv_plic
+ lpg_name: secure_sys_0
+ lpg_idx: 17
}
{
name: aes_recov_ctrl_update_err
@@ -13365,6 +13445,8 @@
type: alert
async: "1"
module_name: aes
+ lpg_name: trans_sys_0
+ lpg_idx: 18
}
{
name: aes_fatal_fault
@@ -13372,6 +13454,8 @@
type: alert
async: "1"
module_name: aes
+ lpg_name: trans_sys_0
+ lpg_idx: 18
}
{
name: hmac_fatal_fault
@@ -13379,6 +13463,8 @@
type: alert
async: "1"
module_name: hmac
+ lpg_name: trans_sys_0
+ lpg_idx: 18
}
{
name: kmac_fatal_fault
@@ -13386,6 +13472,8 @@
type: alert
async: "1"
module_name: kmac
+ lpg_name: trans_sys_0
+ lpg_idx: 18
}
{
name: otbn_fatal
@@ -13393,6 +13481,8 @@
type: alert
async: "1"
module_name: otbn
+ lpg_name: trans_sys_0
+ lpg_idx: 18
}
{
name: otbn_recov
@@ -13400,6 +13490,8 @@
type: alert
async: "1"
module_name: otbn
+ lpg_name: trans_sys_0
+ lpg_idx: 18
}
{
name: keymgr_fatal_fault_err
@@ -13407,6 +13499,8 @@
type: alert
async: "1"
module_name: keymgr
+ lpg_name: secure_sys_0
+ lpg_idx: 17
}
{
name: keymgr_recov_operation_err
@@ -13414,6 +13508,8 @@
type: alert
async: "1"
module_name: keymgr
+ lpg_name: secure_sys_0
+ lpg_idx: 17
}
{
name: csrng_recov_alert
@@ -13421,6 +13517,8 @@
type: alert
async: "1"
module_name: csrng
+ lpg_name: secure_sys_0
+ lpg_idx: 17
}
{
name: csrng_fatal_alert
@@ -13428,6 +13526,8 @@
type: alert
async: "1"
module_name: csrng
+ lpg_name: secure_sys_0
+ lpg_idx: 17
}
{
name: entropy_src_recov_alert
@@ -13435,6 +13535,8 @@
type: alert
async: "1"
module_name: entropy_src
+ lpg_name: secure_sys_0
+ lpg_idx: 17
}
{
name: entropy_src_fatal_alert
@@ -13442,6 +13544,8 @@
type: alert
async: "1"
module_name: entropy_src
+ lpg_name: secure_sys_0
+ lpg_idx: 17
}
{
name: edn0_recov_alert
@@ -13449,6 +13553,8 @@
type: alert
async: "1"
module_name: edn0
+ lpg_name: secure_sys_0
+ lpg_idx: 17
}
{
name: edn0_fatal_alert
@@ -13456,6 +13562,8 @@
type: alert
async: "1"
module_name: edn0
+ lpg_name: secure_sys_0
+ lpg_idx: 17
}
{
name: edn1_recov_alert
@@ -13463,6 +13571,8 @@
type: alert
async: "1"
module_name: edn1
+ lpg_name: secure_sys_0
+ lpg_idx: 17
}
{
name: edn1_fatal_alert
@@ -13470,6 +13580,8 @@
type: alert
async: "1"
module_name: edn1
+ lpg_name: secure_sys_0
+ lpg_idx: 17
}
{
name: sram_ctrl_main_fatal_error
@@ -13477,6 +13589,8 @@
type: alert
async: "1"
module_name: sram_ctrl_main
+ lpg_name: infra_sys_0
+ lpg_idx: 19
}
{
name: rom_ctrl_fatal
@@ -13484,6 +13598,8 @@
type: alert
async: "1"
module_name: rom_ctrl
+ lpg_name: infra_sys_0
+ lpg_idx: 19
}
{
name: rv_core_ibex_fatal_sw_err
@@ -13491,6 +13607,8 @@
type: alert
async: "1"
module_name: rv_core_ibex
+ lpg_name: infra_sys_0
+ lpg_idx: 19
}
{
name: rv_core_ibex_recov_sw_err
@@ -13498,6 +13616,8 @@
type: alert
async: "1"
module_name: rv_core_ibex
+ lpg_name: infra_sys_0
+ lpg_idx: 19
}
{
name: rv_core_ibex_fatal_hw_err
@@ -13505,6 +13625,8 @@
type: alert
async: "1"
module_name: rv_core_ibex
+ lpg_name: infra_sys_0
+ lpg_idx: 19
}
{
name: rv_core_ibex_recov_hw_err
@@ -13512,9 +13634,214 @@
type: alert
async: "1"
module_name: rv_core_ibex
+ lpg_name: infra_sys_0
+ lpg_idx: 19
}
]
exported_rsts: {}
+ alert_lpgs:
+ [
+ {
+ name: peri_sys_io_div4_0
+ clock_group: peri
+ clock_connection: clkmgr_aon_clocks.clk_io_div4_peri
+ reset_connection:
+ {
+ name: sys_io_div4
+ domain: "0"
+ }
+ }
+ {
+ name: peri_spi_device_0
+ clock_group: peri
+ clock_connection: clkmgr_aon_clocks.clk_io_div4_peri
+ reset_connection:
+ {
+ name: spi_device
+ domain: "0"
+ }
+ }
+ {
+ name: peri_spi_host0_0
+ clock_group: peri
+ clock_connection: clkmgr_aon_clocks.clk_io_div4_peri
+ reset_connection:
+ {
+ name: spi_host0
+ domain: "0"
+ }
+ }
+ {
+ name: peri_spi_host1_0
+ clock_group: peri
+ clock_connection: clkmgr_aon_clocks.clk_io_div4_peri
+ reset_connection:
+ {
+ name: spi_host1
+ domain: "0"
+ }
+ }
+ {
+ name: peri_i2c0_0
+ clock_group: peri
+ clock_connection: clkmgr_aon_clocks.clk_io_div4_peri
+ reset_connection:
+ {
+ name: i2c0
+ domain: "0"
+ }
+ }
+ {
+ name: peri_i2c1_0
+ clock_group: peri
+ clock_connection: clkmgr_aon_clocks.clk_io_div4_peri
+ reset_connection:
+ {
+ name: i2c1
+ domain: "0"
+ }
+ }
+ {
+ name: peri_i2c2_0
+ clock_group: peri
+ clock_connection: clkmgr_aon_clocks.clk_io_div4_peri
+ reset_connection:
+ {
+ name: i2c2
+ domain: "0"
+ }
+ }
+ {
+ name: timers_sys_io_div4_0
+ clock_group: timers
+ clock_connection: clkmgr_aon_clocks.clk_io_div4_timers
+ reset_connection:
+ {
+ name: sys_io_div4
+ domain: "0"
+ }
+ }
+ {
+ name: peri_usb_0
+ clock_group: peri
+ clock_connection: clkmgr_aon_clocks.clk_io_div4_peri
+ reset_connection:
+ {
+ name: usb
+ domain: "0"
+ }
+ }
+ {
+ name: secure_lc_io_div4_0
+ clock_group: secure
+ clock_connection: clkmgr_aon_clocks.clk_io_div4_secure
+ reset_connection:
+ {
+ name: lc_io_div4
+ domain: "0"
+ }
+ }
+ {
+ name: powerup_por_io_div4_Aon
+ clock_group: powerup
+ clock_connection: clkmgr_aon_clocks.clk_io_div4_powerup
+ reset_connection:
+ {
+ name: por_io_div4
+ domain: Aon
+ }
+ }
+ {
+ name: infra_sys_io_div4_Aon
+ clock_group: infra
+ clock_connection: clkmgr_aon_clocks.clk_io_div4_infra
+ reset_connection:
+ {
+ name: sys_io_div4
+ domain: Aon
+ }
+ }
+ {
+ name: peri_sys_io_div4_Aon
+ clock_group: peri
+ clock_connection: clkmgr_aon_clocks.clk_io_div4_peri
+ reset_connection:
+ {
+ name: sys_io_div4
+ domain: Aon
+ }
+ }
+ {
+ name: powerup_sys_io_div4_Aon
+ clock_group: powerup
+ clock_connection: clkmgr_aon_clocks.clk_io_div4_powerup
+ reset_connection:
+ {
+ name: sys_io_div4
+ domain: Aon
+ }
+ }
+ {
+ name: timers_lc_io_div4_Aon
+ clock_group: timers
+ clock_connection: clkmgr_aon_clocks.clk_io_div4_timers
+ reset_connection:
+ {
+ name: lc_io_div4
+ domain: Aon
+ }
+ }
+ {
+ name: secure_lc_io_div4_Aon
+ clock_group: secure
+ clock_connection: clkmgr_aon_clocks.clk_io_div4_secure
+ reset_connection:
+ {
+ name: lc_io_div4
+ domain: Aon
+ }
+ }
+ {
+ name: infra_lc_0
+ clock_group: infra
+ clock_connection: clkmgr_aon_clocks.clk_main_infra
+ reset_connection:
+ {
+ name: lc
+ domain: "0"
+ }
+ }
+ {
+ name: secure_sys_0
+ clock_group: secure
+ clock_connection: clkmgr_aon_clocks.clk_main_secure
+ reset_connection:
+ {
+ name: sys
+ domain: "0"
+ }
+ }
+ {
+ name: trans_sys_0
+ clock_group: trans
+ clock_connection: clkmgr_aon_clocks.clk_main_aes
+ reset_connection:
+ {
+ name: sys
+ domain: "0"
+ }
+ }
+ {
+ name: infra_sys_0
+ clock_group: infra
+ clock_connection: clkmgr_aon_clocks.clk_main_infra
+ reset_connection:
+ {
+ name: sys
+ domain: "0"
+ }
+ }
+ ]
inter_signal:
{
signals:
@@ -14868,6 +15195,8 @@
act: req
width: 1
inst_name: rstmgr_aon
+ default: ""
+ top_signame: rstmgr_aon_rst_en
index: -1
}
{
@@ -14951,6 +15280,8 @@
act: req
width: 1
inst_name: clkmgr_aon
+ default: ""
+ top_signame: clkmgr_aon_cg_en
index: -1
}
{
@@ -20484,6 +20815,15 @@
default: ""
}
{
+ package: clkmgr_pkg
+ struct: clkmgr_cg_en
+ signame: clkmgr_aon_cg_en
+ width: 1
+ type: uni
+ end_idx: -1
+ default: ""
+ }
+ {
package: rstmgr_pkg
struct: rstmgr_out
signame: rstmgr_aon_resets
@@ -20493,6 +20833,15 @@
default: ""
}
{
+ package: rstmgr_pkg
+ struct: rstmgr_rst_en
+ signame: rstmgr_aon_rst_en
+ width: 1
+ type: uni
+ end_idx: -1
+ default: ""
+ }
+ {
package: ""
struct: logic
signame: rv_core_ibex_irq_timer
diff --git a/hw/top_earlgrey/data/top_earlgrey.hjson b/hw/top_earlgrey/data/top_earlgrey.hjson
index 53a92f7..e3c16fb 100644
--- a/hw/top_earlgrey/data/top_earlgrey.hjson
+++ b/hw/top_earlgrey/data/top_earlgrey.hjson
@@ -36,6 +36,7 @@
hier_paths: {
top: "clkmgr_aon_clocks.", // top level is a struct
ext: "", // ext is a port of the clock name
+ lpg: "clkmgr_aon_cg_en.", // top level struct for alert lpg reset enables
},
// Clock Source attributes
@@ -106,6 +107,7 @@
hier_paths: {
top: "rstmgr_aon_resets.", // top level is a struct
ext: "", // ext is a port of the clock name
+ lpg: "rstmgr_aon_rst_en.", // top level struct for alert lpg reset enables
},
// Reset node attributes
@@ -898,9 +900,15 @@
// top level net for clocks
'clkmgr_aon.clocks',
- // top levle net for reset
+ // top level clock gating indications for alert subsystem
+ 'clkmgr_aon.cg_en',
+
+ // top level net for reset
'rstmgr_aon.resets',
+ // top level reset asserted indications for alert subsystem
+ 'rstmgr_aon.rst_en',
+
// dedicated timer interrupt
'rv_core_ibex.irq_timer',
diff --git a/hw/top_earlgrey/ip/alert_handler/data/autogen/alert_handler.hjson b/hw/top_earlgrey/ip/alert_handler/data/autogen/alert_handler.hjson
index 300c18b..b4719fa 100644
--- a/hw/top_earlgrey/ip/alert_handler/data/autogen/alert_handler.hjson
+++ b/hw/top_earlgrey/ip/alert_handler/data/autogen/alert_handler.hjson
@@ -56,13 +56,13 @@
{ name: "NLpg",
desc: "Number of LPGs.",
type: "int",
- default: "1",
+ default: "20",
local: "true"
},
{ name: "NLpgWidth",
desc: "Width of LPG ID.",
type: "int",
- default: "1",
+ default: "5",
local: "true"
},
{ name: "LpgMap",
@@ -71,7 +71,64 @@
'''
type: "logic [NAlerts-1:0][NLpgWidth-1:0]",
default: '''
-'0
+{5'd19,
+5'd19,
+5'd19,
+5'd19,
+5'd19,
+5'd19,
+5'd17,
+5'd17,
+5'd17,
+5'd17,
+5'd17,
+5'd17,
+5'd17,
+5'd17,
+5'd17,
+5'd17,
+5'd18,
+5'd18,
+5'd18,
+5'd18,
+5'd18,
+5'd18,
+5'd17,
+5'd16,
+5'd16,
+5'd16,
+5'd11,
+5'd15,
+5'd15,
+5'd14,
+5'd13,
+5'd13,
+5'd12,
+5'd11,
+5'd10,
+5'd10,
+5'd10,
+5'd10,
+5'd9,
+5'd9,
+5'd9,
+5'd9,
+5'd9,
+5'd9,
+5'd8,
+5'd7,
+5'd0,
+5'd6,
+5'd5,
+5'd4,
+5'd3,
+5'd2,
+5'd1,
+5'd0,
+5'd0,
+5'd0,
+5'd0,
+5'd0}
''',
local: "true"
},
diff --git a/hw/top_earlgrey/ip/alert_handler/rtl/autogen/alert_handler_reg_pkg.sv b/hw/top_earlgrey/ip/alert_handler/rtl/autogen/alert_handler_reg_pkg.sv
index 185e320..151974d 100644
--- a/hw/top_earlgrey/ip/alert_handler/rtl/autogen/alert_handler_reg_pkg.sv
+++ b/hw/top_earlgrey/ip/alert_handler/rtl/autogen/alert_handler_reg_pkg.sv
@@ -8,9 +8,66 @@
// Param list
parameter int NAlerts = 58;
- parameter int NLpg = 1;
- parameter int NLpgWidth = 1;
- parameter logic [NAlerts-1:0][NLpgWidth-1:0] LpgMap = '0;
+ parameter int NLpg = 20;
+ parameter int NLpgWidth = 5;
+ parameter logic [NAlerts-1:0][NLpgWidth-1:0] LpgMap = {5'd19,
+5'd19,
+5'd19,
+5'd19,
+5'd19,
+5'd19,
+5'd17,
+5'd17,
+5'd17,
+5'd17,
+5'd17,
+5'd17,
+5'd17,
+5'd17,
+5'd17,
+5'd17,
+5'd18,
+5'd18,
+5'd18,
+5'd18,
+5'd18,
+5'd18,
+5'd17,
+5'd16,
+5'd16,
+5'd16,
+5'd11,
+5'd15,
+5'd15,
+5'd14,
+5'd13,
+5'd13,
+5'd12,
+5'd11,
+5'd10,
+5'd10,
+5'd10,
+5'd10,
+5'd9,
+5'd9,
+5'd9,
+5'd9,
+5'd9,
+5'd9,
+5'd8,
+5'd7,
+5'd0,
+5'd6,
+5'd5,
+5'd4,
+5'd3,
+5'd2,
+5'd1,
+5'd0,
+5'd0,
+5'd0,
+5'd0,
+5'd0};
parameter int EscCntDw = 32;
parameter int AccuCntDw = 16;
parameter logic [NAlerts-1:0] AsyncOn = 58'h3ffffffffffffff;
diff --git a/hw/top_earlgrey/rtl/autogen/top_earlgrey.sv b/hw/top_earlgrey/rtl/autogen/top_earlgrey.sv
index fb36769..3b181ec 100644
--- a/hw/top_earlgrey/rtl/autogen/top_earlgrey.sv
+++ b/hw/top_earlgrey/rtl/autogen/top_earlgrey.sv
@@ -709,7 +709,9 @@
tlul_pkg::tl_h2d_t adc_ctrl_aon_tl_req;
tlul_pkg::tl_d2h_t adc_ctrl_aon_tl_rsp;
clkmgr_pkg::clkmgr_out_t clkmgr_aon_clocks;
+ clkmgr_pkg::clkmgr_cg_en_t clkmgr_aon_cg_en;
rstmgr_pkg::rstmgr_out_t rstmgr_aon_resets;
+ rstmgr_pkg::rstmgr_rst_en_t rstmgr_aon_rst_en;
logic rv_core_ibex_irq_timer;
logic [31:0] rv_core_ibex_hart_id;
logic [31:0] rv_core_ibex_boot_addr;
@@ -799,6 +801,71 @@
.tdo_oe_i (1'b0)
);
+ // Wire up alert handler LPGs
+ lc_ctrl_pkg::lc_tx_t [alert_pkg::NLpg-1:0] lpg_cg_en;
+ lc_ctrl_pkg::lc_tx_t [alert_pkg::NLpg-1:0] lpg_rst_en;
+ // peri_sys_io_div4_0
+ assign lpg_cg_en[0] = clkmgr_aon_cg_en.io_div4_peri;
+ assign lpg_rst_en[0] = rstmgr_aon_rst_en.sys_io_div4[rstmgr_pkg::Domain0Sel];
+ // peri_spi_device_0
+ assign lpg_cg_en[1] = clkmgr_aon_cg_en.io_div4_peri;
+ assign lpg_rst_en[1] = rstmgr_aon_rst_en.spi_device[rstmgr_pkg::Domain0Sel];
+ // peri_spi_host0_0
+ assign lpg_cg_en[2] = clkmgr_aon_cg_en.io_div4_peri;
+ assign lpg_rst_en[2] = rstmgr_aon_rst_en.spi_host0[rstmgr_pkg::Domain0Sel];
+ // peri_spi_host1_0
+ assign lpg_cg_en[3] = clkmgr_aon_cg_en.io_div4_peri;
+ assign lpg_rst_en[3] = rstmgr_aon_rst_en.spi_host1[rstmgr_pkg::Domain0Sel];
+ // peri_i2c0_0
+ assign lpg_cg_en[4] = clkmgr_aon_cg_en.io_div4_peri;
+ assign lpg_rst_en[4] = rstmgr_aon_rst_en.i2c0[rstmgr_pkg::Domain0Sel];
+ // peri_i2c1_0
+ assign lpg_cg_en[5] = clkmgr_aon_cg_en.io_div4_peri;
+ assign lpg_rst_en[5] = rstmgr_aon_rst_en.i2c1[rstmgr_pkg::Domain0Sel];
+ // peri_i2c2_0
+ assign lpg_cg_en[6] = clkmgr_aon_cg_en.io_div4_peri;
+ assign lpg_rst_en[6] = rstmgr_aon_rst_en.i2c2[rstmgr_pkg::Domain0Sel];
+ // timers_sys_io_div4_0
+ assign lpg_cg_en[7] = clkmgr_aon_cg_en.io_div4_timers;
+ assign lpg_rst_en[7] = rstmgr_aon_rst_en.sys_io_div4[rstmgr_pkg::Domain0Sel];
+ // peri_usb_0
+ assign lpg_cg_en[8] = clkmgr_aon_cg_en.io_div4_peri;
+ assign lpg_rst_en[8] = rstmgr_aon_rst_en.usb[rstmgr_pkg::Domain0Sel];
+ // secure_lc_io_div4_0
+ assign lpg_cg_en[9] = clkmgr_aon_cg_en.io_div4_secure;
+ assign lpg_rst_en[9] = rstmgr_aon_rst_en.lc_io_div4[rstmgr_pkg::Domain0Sel];
+ // powerup_por_io_div4_Aon
+ assign lpg_cg_en[10] = clkmgr_aon_cg_en.io_div4_powerup;
+ assign lpg_rst_en[10] = rstmgr_aon_rst_en.por_io_div4[rstmgr_pkg::DomainAonSel];
+ // infra_sys_io_div4_Aon
+ assign lpg_cg_en[11] = clkmgr_aon_cg_en.io_div4_infra;
+ assign lpg_rst_en[11] = rstmgr_aon_rst_en.sys_io_div4[rstmgr_pkg::DomainAonSel];
+ // peri_sys_io_div4_Aon
+ assign lpg_cg_en[12] = clkmgr_aon_cg_en.io_div4_peri;
+ assign lpg_rst_en[12] = rstmgr_aon_rst_en.sys_io_div4[rstmgr_pkg::DomainAonSel];
+ // powerup_sys_io_div4_Aon
+ assign lpg_cg_en[13] = clkmgr_aon_cg_en.io_div4_powerup;
+ assign lpg_rst_en[13] = rstmgr_aon_rst_en.sys_io_div4[rstmgr_pkg::DomainAonSel];
+ // timers_lc_io_div4_Aon
+ assign lpg_cg_en[14] = clkmgr_aon_cg_en.io_div4_timers;
+ assign lpg_rst_en[14] = rstmgr_aon_rst_en.lc_io_div4[rstmgr_pkg::DomainAonSel];
+ // secure_lc_io_div4_Aon
+ assign lpg_cg_en[15] = clkmgr_aon_cg_en.io_div4_secure;
+ assign lpg_rst_en[15] = rstmgr_aon_rst_en.lc_io_div4[rstmgr_pkg::DomainAonSel];
+ // infra_lc_0
+ assign lpg_cg_en[16] = clkmgr_aon_cg_en.main_infra;
+ assign lpg_rst_en[16] = rstmgr_aon_rst_en.lc[rstmgr_pkg::Domain0Sel];
+ // secure_sys_0
+ assign lpg_cg_en[17] = clkmgr_aon_cg_en.main_secure;
+ assign lpg_rst_en[17] = rstmgr_aon_rst_en.sys[rstmgr_pkg::Domain0Sel];
+ // trans_sys_0
+ assign lpg_cg_en[18] = clkmgr_aon_cg_en.main_aes;
+ assign lpg_rst_en[18] = rstmgr_aon_rst_en.sys[rstmgr_pkg::Domain0Sel];
+ // infra_sys_0
+ assign lpg_cg_en[19] = clkmgr_aon_cg_en.main_infra;
+ assign lpg_rst_en[19] = rstmgr_aon_rst_en.sys[rstmgr_pkg::Domain0Sel];
+
+ // Peripheral Instantiation
uart #(
@@ -833,7 +900,6 @@
.clk_i (clkmgr_aon_clocks.clk_io_div4_peri),
.rst_ni (rstmgr_aon_resets.rst_sys_io_div4_n[rstmgr_pkg::Domain0Sel])
);
-
uart #(
.AlertAsyncOn(alert_handler_reg_pkg::AsyncOn[1:1])
) u_uart1 (
@@ -866,7 +932,6 @@
.clk_i (clkmgr_aon_clocks.clk_io_div4_peri),
.rst_ni (rstmgr_aon_resets.rst_sys_io_div4_n[rstmgr_pkg::Domain0Sel])
);
-
uart #(
.AlertAsyncOn(alert_handler_reg_pkg::AsyncOn[2:2])
) u_uart2 (
@@ -899,7 +964,6 @@
.clk_i (clkmgr_aon_clocks.clk_io_div4_peri),
.rst_ni (rstmgr_aon_resets.rst_sys_io_div4_n[rstmgr_pkg::Domain0Sel])
);
-
uart #(
.AlertAsyncOn(alert_handler_reg_pkg::AsyncOn[3:3])
) u_uart3 (
@@ -932,7 +996,6 @@
.clk_i (clkmgr_aon_clocks.clk_io_div4_peri),
.rst_ni (rstmgr_aon_resets.rst_sys_io_div4_n[rstmgr_pkg::Domain0Sel])
);
-
gpio #(
.AlertAsyncOn(alert_handler_reg_pkg::AsyncOn[4:4])
) u_gpio (
@@ -958,7 +1021,6 @@
.clk_i (clkmgr_aon_clocks.clk_io_div4_peri),
.rst_ni (rstmgr_aon_resets.rst_sys_io_div4_n[rstmgr_pkg::Domain0Sel])
);
-
spi_device #(
.AlertAsyncOn(alert_handler_reg_pkg::AsyncOn[5:5])
) u_spi_device (
@@ -1001,7 +1063,6 @@
.scan_clk_i (clkmgr_aon_clocks.clk_io_div2_peri),
.rst_ni (rstmgr_aon_resets.rst_spi_device_n[rstmgr_pkg::Domain0Sel])
);
-
spi_host #(
.AlertAsyncOn(alert_handler_reg_pkg::AsyncOn[6:6])
) u_spi_host0 (
@@ -1037,7 +1098,6 @@
.rst_ni (rstmgr_aon_resets.rst_spi_host0_n[rstmgr_pkg::Domain0Sel]),
.rst_core_ni (rstmgr_aon_resets.rst_spi_host0_core_n[rstmgr_pkg::Domain0Sel])
);
-
spi_host #(
.AlertAsyncOn(alert_handler_reg_pkg::AsyncOn[7:7])
) u_spi_host1 (
@@ -1073,7 +1133,6 @@
.rst_ni (rstmgr_aon_resets.rst_spi_host1_n[rstmgr_pkg::Domain0Sel]),
.rst_core_ni (rstmgr_aon_resets.rst_spi_host1_core_n[rstmgr_pkg::Domain0Sel])
);
-
i2c #(
.AlertAsyncOn(alert_handler_reg_pkg::AsyncOn[8:8])
) u_i2c0 (
@@ -1117,7 +1176,6 @@
.clk_i (clkmgr_aon_clocks.clk_io_div4_peri),
.rst_ni (rstmgr_aon_resets.rst_i2c0_n[rstmgr_pkg::Domain0Sel])
);
-
i2c #(
.AlertAsyncOn(alert_handler_reg_pkg::AsyncOn[9:9])
) u_i2c1 (
@@ -1161,7 +1219,6 @@
.clk_i (clkmgr_aon_clocks.clk_io_div4_peri),
.rst_ni (rstmgr_aon_resets.rst_i2c1_n[rstmgr_pkg::Domain0Sel])
);
-
i2c #(
.AlertAsyncOn(alert_handler_reg_pkg::AsyncOn[10:10])
) u_i2c2 (
@@ -1205,7 +1262,6 @@
.clk_i (clkmgr_aon_clocks.clk_io_div4_peri),
.rst_ni (rstmgr_aon_resets.rst_i2c2_n[rstmgr_pkg::Domain0Sel])
);
-
pattgen #(
.AlertAsyncOn(alert_handler_reg_pkg::AsyncOn[11:11])
) u_pattgen (
@@ -1235,7 +1291,6 @@
.clk_i (clkmgr_aon_clocks.clk_io_div4_peri),
.rst_ni (rstmgr_aon_resets.rst_sys_io_div4_n[rstmgr_pkg::Domain0Sel])
);
-
rv_timer #(
.AlertAsyncOn(alert_handler_reg_pkg::AsyncOn[12:12])
) u_rv_timer (
@@ -1254,7 +1309,6 @@
.clk_i (clkmgr_aon_clocks.clk_io_div4_timers),
.rst_ni (rstmgr_aon_resets.rst_sys_io_div4_n[rstmgr_pkg::Domain0Sel])
);
-
usbdev #(
.AlertAsyncOn(alert_handler_reg_pkg::AsyncOn[13:13])
) u_usbdev (
@@ -1327,7 +1381,6 @@
.rst_aon_ni (rstmgr_aon_resets.rst_sys_aon_n[rstmgr_pkg::Domain0Sel]),
.rst_usb_48mhz_ni (rstmgr_aon_resets.rst_usbif_n[rstmgr_pkg::Domain0Sel])
);
-
otp_ctrl #(
.AlertAsyncOn(alert_handler_reg_pkg::AsyncOn[16:14]),
.MemInitFile(OtpCtrlMemInitFile),
@@ -1389,7 +1442,6 @@
.rst_ni (rstmgr_aon_resets.rst_lc_io_div4_n[rstmgr_pkg::Domain0Sel]),
.rst_edn_ni (rstmgr_aon_resets.rst_sys_n[rstmgr_pkg::Domain0Sel])
);
-
lc_ctrl #(
.AlertAsyncOn(alert_handler_reg_pkg::AsyncOn[19:17]),
.RndCnstLcKeymgrDivInvalid(RndCnstLcCtrlLcKeymgrDivInvalid),
@@ -1449,7 +1501,6 @@
.rst_ni (rstmgr_aon_resets.rst_lc_io_div4_n[rstmgr_pkg::Domain0Sel]),
.rst_kmac_ni (rstmgr_aon_resets.rst_sys_n[rstmgr_pkg::Domain0Sel])
);
-
alert_handler #(
.RndCnstLfsrSeed(RndCnstAlertHandlerLfsrSeed),
.RndCnstLfsrPerm(RndCnstAlertHandlerLfsrPerm)
@@ -1472,10 +1523,10 @@
// alert signals
.alert_rx_o ( alert_rx ),
.alert_tx_i ( alert_tx ),
-
- // TODO(#8174): top-level integration for LPGs
- .lpg_cg_en_i ( {lc_ctrl_pkg::Off} ),
- .lpg_rst_en_i ( {lc_ctrl_pkg::Off} ),
+ // synchronized clock gated / reset asserted
+ // indications for each alert
+ .lpg_cg_en_i ( lpg_cg_en ),
+ .lpg_rst_en_i ( lpg_rst_en ),
// Clock and reset connections
.clk_i (clkmgr_aon_clocks.clk_io_div4_secure),
@@ -1484,7 +1535,6 @@
.rst_ni (rstmgr_aon_resets.rst_lc_io_div4_n[rstmgr_pkg::Domain0Sel]),
.rst_edn_ni (rstmgr_aon_resets.rst_sys_n[rstmgr_pkg::Domain0Sel])
);
-
pwrmgr #(
.AlertAsyncOn(alert_handler_reg_pkg::AsyncOn[20:20])
) u_pwrmgr_aon (
@@ -1528,7 +1578,6 @@
.rst_esc_ni (rstmgr_aon_resets.rst_lc_io_div4_n[rstmgr_pkg::Domain0Sel]),
.rst_slow_ni (rstmgr_aon_resets.rst_por_aon_n[rstmgr_pkg::DomainAonSel])
);
-
rstmgr #(
.AlertAsyncOn(alert_handler_reg_pkg::AsyncOn[21:21])
) u_rstmgr_aon (
@@ -1541,7 +1590,7 @@
.pwr_i(pwrmgr_aon_pwr_rst_req),
.pwr_o(pwrmgr_aon_pwr_rst_rsp),
.resets_o(rstmgr_aon_resets),
- .rst_en_o(),
+ .rst_en_o(rstmgr_aon_rst_en),
.rst_cpu_n_i(rv_core_ibex_rst_cpu_n),
.ndmreset_req_i(rv_dm_ndmreset_req),
.alert_dump_i(alert_handler_crashdump),
@@ -1561,7 +1610,6 @@
.clk_io_div4_i (clkmgr_aon_clocks.clk_io_div4_powerup),
.rst_ni (rstmgr_aon_resets.rst_por_io_div4_n[rstmgr_pkg::DomainAonSel])
);
-
clkmgr #(
.AlertAsyncOn(alert_handler_reg_pkg::AsyncOn[23:22])
) u_clkmgr_aon (
@@ -1572,7 +1620,7 @@
// Inter-module signals
.clocks_o(clkmgr_aon_clocks),
- .cg_en_o(),
+ .cg_en_o(clkmgr_aon_cg_en),
.lc_dft_en_i(lc_ctrl_lc_dft_en),
.ast_clk_byp_req_o(ast_clk_byp_req_o),
.ast_clk_byp_ack_i(ast_clk_byp_ack_i),
@@ -1600,7 +1648,6 @@
.rst_io_div4_ni (rstmgr_aon_resets.rst_por_io_div4_n[rstmgr_pkg::DomainAonSel]),
.rst_aon_ni (rstmgr_aon_resets.rst_por_aon_n[rstmgr_pkg::DomainAonSel])
);
-
sysrst_ctrl #(
.AlertAsyncOn(alert_handler_reg_pkg::AsyncOn[24:24])
) u_sysrst_ctrl_aon (
@@ -1650,7 +1697,6 @@
.rst_ni (rstmgr_aon_resets.rst_sys_io_div4_n[rstmgr_pkg::DomainAonSel]),
.rst_aon_ni (rstmgr_aon_resets.rst_sys_aon_n[rstmgr_pkg::DomainAonSel])
);
-
adc_ctrl #(
.AlertAsyncOn(alert_handler_reg_pkg::AsyncOn[25:25])
) u_adc_ctrl_aon (
@@ -1674,7 +1720,6 @@
.rst_ni (rstmgr_aon_resets.rst_sys_io_div4_n[rstmgr_pkg::DomainAonSel]),
.rst_aon_ni (rstmgr_aon_resets.rst_sys_aon_n[rstmgr_pkg::DomainAonSel])
);
-
pwm #(
.AlertAsyncOn(alert_handler_reg_pkg::AsyncOn[26:26])
) u_pwm_aon (
@@ -1696,7 +1741,6 @@
.rst_ni (rstmgr_aon_resets.rst_sys_io_div4_n[rstmgr_pkg::DomainAonSel]),
.rst_core_ni (rstmgr_aon_resets.rst_sys_aon_n[rstmgr_pkg::DomainAonSel])
);
-
pinmux #(
.AlertAsyncOn(alert_handler_reg_pkg::AsyncOn[27:27]),
.TargetCfg(PinmuxAonTargetCfg)
@@ -1754,7 +1798,6 @@
.rst_ni (rstmgr_aon_resets.rst_sys_io_div4_n[rstmgr_pkg::DomainAonSel]),
.rst_aon_ni (rstmgr_aon_resets.rst_sys_aon_n[rstmgr_pkg::DomainAonSel])
);
-
aon_timer #(
.AlertAsyncOn(alert_handler_reg_pkg::AsyncOn[28:28])
) u_aon_timer_aon (
@@ -1781,7 +1824,6 @@
.rst_ni (rstmgr_aon_resets.rst_lc_io_div4_n[rstmgr_pkg::DomainAonSel]),
.rst_aon_ni (rstmgr_aon_resets.rst_lc_aon_n[rstmgr_pkg::DomainAonSel])
);
-
sensor_ctrl #(
.AlertAsyncOn(alert_handler_reg_pkg::AsyncOn[30:29])
) u_sensor_ctrl (
@@ -1810,7 +1852,6 @@
.rst_ni (rstmgr_aon_resets.rst_lc_io_div4_n[rstmgr_pkg::DomainAonSel]),
.rst_aon_ni (rstmgr_aon_resets.rst_lc_aon_n[rstmgr_pkg::DomainAonSel])
);
-
sram_ctrl #(
.AlertAsyncOn(alert_handler_reg_pkg::AsyncOn[31:31]),
.RndCnstSramKey(RndCnstSramCtrlRetAonSramKey),
@@ -1842,7 +1883,6 @@
.rst_ni (rstmgr_aon_resets.rst_sys_io_div4_n[rstmgr_pkg::DomainAonSel]),
.rst_otp_ni (rstmgr_aon_resets.rst_lc_io_div4_n[rstmgr_pkg::DomainAonSel])
);
-
flash_ctrl #(
.AlertAsyncOn(alert_handler_reg_pkg::AsyncOn[33:32]),
.RndCnstAddrKey(RndCnstFlashCtrlAddrKey),
@@ -1910,7 +1950,6 @@
.rst_ni (rstmgr_aon_resets.rst_lc_n[rstmgr_pkg::Domain0Sel]),
.rst_otp_ni (rstmgr_aon_resets.rst_lc_io_div4_n[rstmgr_pkg::Domain0Sel])
);
-
rv_dm #(
.AlertAsyncOn(alert_handler_reg_pkg::AsyncOn[34:34]),
.IdcodeValue(RvDmIdcodeValue)
@@ -1940,7 +1979,6 @@
.clk_i (clkmgr_aon_clocks.clk_main_infra),
.rst_ni (rstmgr_aon_resets.rst_lc_n[rstmgr_pkg::Domain0Sel])
);
-
rv_plic #(
.AlertAsyncOn(alert_handler_reg_pkg::AsyncOn[35:35])
) u_rv_plic (
@@ -1960,7 +1998,6 @@
.clk_i (clkmgr_aon_clocks.clk_main_secure),
.rst_ni (rstmgr_aon_resets.rst_sys_n[rstmgr_pkg::Domain0Sel])
);
-
aes #(
.AlertAsyncOn(alert_handler_reg_pkg::AsyncOn[37:36]),
.AES192Enable(1'b1),
@@ -1996,7 +2033,6 @@
.rst_ni (rstmgr_aon_resets.rst_sys_n[rstmgr_pkg::Domain0Sel]),
.rst_edn_ni (rstmgr_aon_resets.rst_sys_n[rstmgr_pkg::Domain0Sel])
);
-
hmac #(
.AlertAsyncOn(alert_handler_reg_pkg::AsyncOn[38:38])
) u_hmac (
@@ -2018,7 +2054,6 @@
.clk_i (clkmgr_aon_clocks.clk_main_hmac),
.rst_ni (rstmgr_aon_resets.rst_sys_n[rstmgr_pkg::Domain0Sel])
);
-
kmac #(
.AlertAsyncOn(alert_handler_reg_pkg::AsyncOn[39:39]),
.EnMasking(KmacEnMasking),
@@ -2053,7 +2088,6 @@
.rst_ni (rstmgr_aon_resets.rst_sys_n[rstmgr_pkg::Domain0Sel]),
.rst_edn_ni (rstmgr_aon_resets.rst_sys_n[rstmgr_pkg::Domain0Sel])
);
-
otbn #(
.AlertAsyncOn(alert_handler_reg_pkg::AsyncOn[41:40]),
.Stub(OtbnStub),
@@ -2093,7 +2127,6 @@
.rst_edn_ni (rstmgr_aon_resets.rst_sys_n[rstmgr_pkg::Domain0Sel]),
.rst_otp_ni (rstmgr_aon_resets.rst_lc_io_div4_n[rstmgr_pkg::Domain0Sel])
);
-
keymgr #(
.AlertAsyncOn(alert_handler_reg_pkg::AsyncOn[43:42]),
.KmacEnMasking(KeymgrKmacEnMasking),
@@ -2144,7 +2177,6 @@
.rst_ni (rstmgr_aon_resets.rst_sys_n[rstmgr_pkg::Domain0Sel]),
.rst_edn_ni (rstmgr_aon_resets.rst_sys_n[rstmgr_pkg::Domain0Sel])
);
-
csrng #(
.AlertAsyncOn(alert_handler_reg_pkg::AsyncOn[45:44]),
.RndCnstCsKeymgrDivNonProduction(RndCnstCsrngCsKeymgrDivNonProduction),
@@ -2178,7 +2210,6 @@
.clk_i (clkmgr_aon_clocks.clk_main_secure),
.rst_ni (rstmgr_aon_resets.rst_sys_n[rstmgr_pkg::Domain0Sel])
);
-
entropy_src #(
.AlertAsyncOn(alert_handler_reg_pkg::AsyncOn[47:46]),
.Stub(EntropySrcStub)
@@ -2213,7 +2244,6 @@
.clk_i (clkmgr_aon_clocks.clk_main_secure),
.rst_ni (rstmgr_aon_resets.rst_sys_n[rstmgr_pkg::Domain0Sel])
);
-
edn #(
.AlertAsyncOn(alert_handler_reg_pkg::AsyncOn[49:48])
) u_edn0 (
@@ -2238,7 +2268,6 @@
.clk_i (clkmgr_aon_clocks.clk_main_secure),
.rst_ni (rstmgr_aon_resets.rst_sys_n[rstmgr_pkg::Domain0Sel])
);
-
edn #(
.AlertAsyncOn(alert_handler_reg_pkg::AsyncOn[51:50])
) u_edn1 (
@@ -2263,7 +2292,6 @@
.clk_i (clkmgr_aon_clocks.clk_main_secure),
.rst_ni (rstmgr_aon_resets.rst_sys_n[rstmgr_pkg::Domain0Sel])
);
-
sram_ctrl #(
.AlertAsyncOn(alert_handler_reg_pkg::AsyncOn[52:52]),
.RndCnstSramKey(RndCnstSramCtrlMainSramKey),
@@ -2295,7 +2323,6 @@
.rst_ni (rstmgr_aon_resets.rst_sys_n[rstmgr_pkg::Domain0Sel]),
.rst_otp_ni (rstmgr_aon_resets.rst_lc_io_div4_n[rstmgr_pkg::Domain0Sel])
);
-
rom_ctrl #(
.AlertAsyncOn(alert_handler_reg_pkg::AsyncOn[53:53]),
.BootRomInitFile(RomCtrlBootRomInitFile),
@@ -2322,7 +2349,6 @@
.clk_i (clkmgr_aon_clocks.clk_main_infra),
.rst_ni (rstmgr_aon_resets.rst_sys_n[rstmgr_pkg::Domain0Sel])
);
-
rv_core_ibex #(
.AlertAsyncOn(alert_handler_reg_pkg::AsyncOn[57:54]),
.RndCnstLfsrSeed(RndCnstRvCoreIbexLfsrSeed),
@@ -2385,7 +2411,6 @@
.rst_ni (rstmgr_aon_resets.rst_sys_n[rstmgr_pkg::Domain0Sel]),
.rst_esc_ni (rstmgr_aon_resets.rst_lc_io_div4_n[rstmgr_pkg::Domain0Sel])
);
-
// interrupt assignments
assign intr_vector = {
intr_edn1_edn_fatal_err, // IDs [180 +: 1]
diff --git a/hw/top_englishbreakfast/data/top_englishbreakfast.hjson b/hw/top_englishbreakfast/data/top_englishbreakfast.hjson
index 2045e9d..dc6a966 100644
--- a/hw/top_englishbreakfast/data/top_englishbreakfast.hjson
+++ b/hw/top_englishbreakfast/data/top_englishbreakfast.hjson
@@ -36,6 +36,7 @@
hier_paths: {
top: "clkmgr_aon_clocks.", // top level is a struct
ext: "", // ext is a port of the clock name
+ lpg: "clkmgr_aon_cg_en.", // top level struct for alert lpg reset enables
},
// Clock Source attributes
@@ -115,6 +116,7 @@
hier_paths: {
top: "rstmgr_aon_resets.", // top level is a struct
ext: "", // ext is a port of the clock name
+ lpg: "rstmgr_aon_rst_en.", // top level struct for alert lpg reset enables
},
// Reset node attributes
@@ -586,8 +588,17 @@
// It defines the signal in the top and connect from the module,
// use of the signal is up to top template
'top': [
- // reset and clock connections
- 'rstmgr_aon.resets', 'clkmgr_aon.clocks',
+ // top level net for clocks
+ 'clkmgr_aon.clocks',
+
+ // top level clock gating indications for alert subsystem
+ 'clkmgr_aon.cg_en',
+
+ // top level net for reset
+ 'rstmgr_aon.resets',
+
+ // top level reset asserted indications for alert subsystem
+ 'rstmgr_aon.rst_en',
// dedicated timer interrupt
'rv_core_ibex.irq_timer',
diff --git a/util/topgen.py b/util/topgen.py
index c8b1be5..ebabb61 100755
--- a/util/topgen.py
+++ b/util/topgen.py
@@ -35,7 +35,7 @@
from topgen.gen_top_docs import gen_top_docs
from topgen.top import Top
from topgen.clocks import Clocks
-from topgen.merge import extract_clocks, connect_clocks
+from topgen.merge import extract_clocks, connect_clocks, create_alert_lpgs
from topgen.resets import Resets
# Common header for generated files
@@ -140,19 +140,26 @@
async_on = "'0"
# leave this constant
n_classes = 4
- # TODO(#8174): topgen integration for LPGs
+ # low power groups
n_lpg = 1
lpg_map = "'0"
topname = top["name"]
- if esc_cnt_dw < 1:
- log.error("EscCntDw must be larger than 0")
- if accu_cnt_dw < 1:
- log.error("AccuCntDw must be larger than 0")
-
- # Count number of alerts
+ # Count number of alerts and LPGs
n_alerts = sum([x["width"] if "width" in x else 1 for x in top["alert"]])
+ n_lpg = len(top['alert_lpgs'])
+ n_lpg_width = n_lpg.bit_length()
+ # format used to print out LPG map indices in binary format
+ lpg_idx_format = str(n_lpg_width) + "'d{:d},\n"
+
+ # Double check that all these values are greated than 0
+ if esc_cnt_dw < 1:
+ raise ValueError("esc_cnt_dw must be larger than 0")
+ if accu_cnt_dw < 1:
+ raise ValueError("accu_cnt_dw must be larger than 0")
+ if n_lpg < 1:
+ raise ValueError("n_lpg must be larger than 0")
if n_alerts < 1:
# set number of alerts to 1 such that the config is still valid
@@ -161,17 +168,22 @@
log.warning("no alerts are defined in the system")
else:
async_on = ""
+ lpg_map = ""
for alert in top['alert']:
for k in range(alert['width']):
async_on = str(alert['async']) + async_on
+ lpg_map = lpg_idx_format.format(alert['lpg_idx']) + lpg_map
# convert to hexstring to shorten line length
async_on = ("%d'h" % n_alerts) + hex(int(async_on, 2))[2:]
+ lpg_map = '{' + lpg_map[:-2] + '}'
log.info("alert handler parameterization:")
log.info("NAlerts = %d" % n_alerts)
log.info("EscCntDw = %d" % esc_cnt_dw)
log.info("AccuCntDw = %d" % accu_cnt_dw)
log.info("AsyncOn = %s" % async_on)
+ log.info("NLpg = %s" % n_lpg)
+ log.info("LpgMap = %s" % lpg_map)
# Define target path
rtl_path = out_path / 'ip/alert_handler/rtl/autogen'
@@ -892,6 +904,10 @@
if args.plic_only:
sys.exit()
+ # Create Alert Handler LPGs before
+ # generating the Alert Handler
+ create_alert_lpgs(topcfg, name_to_block)
+
# Generate Alert Handler
if not args.xbar_only:
generate_alert_handler(completecfg, out_path)
diff --git a/util/topgen/lib.py b/util/topgen/lib.py
index c3559e7..429fd6b 100644
--- a/util/topgen/lib.py
+++ b/util/topgen/lib.py
@@ -315,6 +315,12 @@
return top['resets'].get_path(reset['name'], reset['domain'], shadow_sel)
+def get_reset_lpg_path(top: object, reset: str):
+ """Return the appropriate LPG reset path given name
+ """
+ return top['resets'].get_lpg_path(reset['name'], reset['domain'])
+
+
def get_unused_resets(top):
"""Return dict of unused resets and associated domain
"""
diff --git a/util/topgen/merge.py b/util/topgen/merge.py
index 0ecb3be..56336d6 100644
--- a/util/topgen/merge.py
+++ b/util/topgen/merge.py
@@ -760,6 +760,52 @@
top["resets"] = top_resets
+def create_alert_lpgs(top, name_to_block: Dict[str, IpBlock]):
+ '''Loop over modules and determine number of unique LPGs'''
+ num_lpg = 0
+ lpg_dict = {}
+ top['alert_lpgs'] = []
+ for module in top["module"]:
+ # the alert senders are attached to the primary clock of this block,
+ # so let's start by getting that primary clock.
+ block = name_to_block[module['type']]
+ block_clock = block.get_primary_clock()
+ primary_reset = module['reset_connections'][block_clock.reset]
+
+ # for the purposes of alert handler LPGs, we need to know:
+ # 1) the clock group of the primary clock
+ # 2) the primary reset name
+ # 3) the domain of the primary reset
+ clock_group = module['clock_group']
+ reset_name = primary_reset['name']
+ reset_domain = primary_reset['domain']
+
+ # using this info, we can create an LPG identifier
+ # and uniquify it via a dict.
+ lpg_name = '_'.join([clock_group, reset_name, reset_domain])
+ if lpg_name not in lpg_dict:
+ lpg_dict.update({lpg_name: num_lpg})
+ # since the alert handler can tolerate timing delays on LPG
+ # indication signals, we can just use the clock / reset signals
+ # of the first block that belongs to a new unique LPG.
+ clock = module['clock_connections'][block_clock.clock]
+ top['alert_lpgs'].append({
+ 'name': lpg_name,
+ 'clock_group': clock_group,
+ 'clock_connection': clock,
+ 'reset_connection': primary_reset
+ })
+ num_lpg += 1
+
+ # annotate all alerts of this module to use this LPG
+ for alert in top['alert']:
+ if alert['module_name'] == module['name']:
+ alert.update({
+ 'lpg_name': lpg_name,
+ 'lpg_idx': lpg_dict[lpg_name]
+ })
+
+
def ensure_interrupt_modules(top: OrderedDict, name_to_block: Dict[str, IpBlock]):
'''Populate top['interrupt_module'] if necessary
diff --git a/util/topgen/resets.py b/util/topgen/resets.py
index 264de81..1dd1e8f 100644
--- a/util/topgen/resets.py
+++ b/util/topgen/resets.py
@@ -19,6 +19,7 @@
self.path = ""
if self.rst_type == 'top':
self.path = f"{hier['top']}rst_{self.name}_n"
+ self.lpg_path = f"{hier['lpg']}{self.name}"
elif self.rst_type == 'ext':
self.path = f"{hier['ext']}{self.name}"
@@ -154,6 +155,24 @@
return path
+
+ def get_lpg_path(self, name: str, domain: Optional[str]) -> str:
+ '''Get path to lpg indication signals'''
+
+ reset = self.get_reset_by_name(name)
+ if reset.rst_type == 'int':
+ raise ValueError(f'Reset {name} is not a reset exported from rstmgr')
+
+ if reset.rst_type == 'ext':
+ raise ValueError(f'External reset cannot be associated with an LPG')
+
+ path = reset.lpg_path
+ if domain:
+ path += f'[rstmgr_pkg::Domain{domain}Sel]'
+
+ return path
+
+
def get_unused_resets(self, domains: list) -> Dict[str, str]:
'''Get unused resets'''
diff --git a/util/topgen/templates/toplevel.sv.tpl b/util/topgen/templates/toplevel.sv.tpl
index b974d25..c1e713f 100644
--- a/util/topgen/templates/toplevel.sv.tpl
+++ b/util/topgen/templates/toplevel.sv.tpl
@@ -296,7 +296,21 @@
.tdo_oe_i (1'b0)
);
-## Peripheral Instantiation
+ // Wire up alert handler LPGs
+ lc_ctrl_pkg::lc_tx_t [alert_pkg::NLpg-1:0] lpg_cg_en;
+ lc_ctrl_pkg::lc_tx_t [alert_pkg::NLpg-1:0] lpg_rst_en;
+% for k, lpg in enumerate(top['alert_lpgs']):
+ // ${lpg['name']}
+<%
+ ## TODO: need to find a better way to assemble the clock path here.
+ cg_en = top['clocks'].hier_paths['lpg'] + lpg['clock_connection'].split('.clk_')[-1]
+ rst_en = lib.get_reset_lpg_path(top, lpg['reset_connection'])
+%>\
+ assign lpg_cg_en[${k}] = ${cg_en};
+ assign lpg_rst_en[${k}] = ${rst_en};
+% endfor
+
+ // Peripheral Instantiation
<% alert_idx = 0 %>
% for m in top["module"]:
@@ -403,10 +417,10 @@
// alert signals
.alert_rx_o ( alert_rx ),
.alert_tx_i ( alert_tx ),
-
- // TODO(#8174): top-level integration for LPGs
- .lpg_cg_en_i ( {lc_ctrl_pkg::Off} ),
- .lpg_rst_en_i ( {lc_ctrl_pkg::Off} ),
+ // synchronized clock gated / reset asserted
+ // indications for each alert
+ .lpg_cg_en_i ( lpg_cg_en ),
+ .lpg_rst_en_i ( lpg_rst_en ),
% endif
% if block.scan:
.scanmode_i,
@@ -429,7 +443,6 @@
.${port} (${lib.get_reset_path(top, reset)})${"," if not loop.last else ""}
% endfor
);
-
% endfor
// interrupt assignments
<% base = interrupt_num %>\