[pwrmgr] template pwrmgr hjson
- There are now 3 seprate core files
- only_reg, pkg, and component (similar to alert_handler)
- The only_reg core file will be duplicated at the top level,
while the pkg / component core files will be top agnostic
and can be referenced by other modules
Signed-off-by: Timothy Chen <timothytim@google.com>
[pwrmgr] Various fixes for python lint
Signed-off-by: Timothy Chen <timothytim@google.com>
[pwrmgr] Fix typo
Signed-off-by: Timothy Chen <timothytim@google.com>
diff --git a/hw/ip/pwrmgr/data/pwrmgr.hjson b/hw/ip/pwrmgr/data/pwrmgr.hjson
index a7e48f3..c32ed85 100644
--- a/hw/ip/pwrmgr/data/pwrmgr.hjson
+++ b/hw/ip/pwrmgr/data/pwrmgr.hjson
@@ -62,16 +62,31 @@
package: "pwrmgr_pkg",
},
- { struct: "pwr_peri",
+ { struct: "logic",
+ width: 3,
type: "uni",
- name: "pwr_peri",
+ name: "wakeups",
act: "rcv",
- package: "pwrmgr_pkg",
+ package: "",
+ },
+
+ { struct: "logic",
+ width: 2,
+ type: "uni",
+ name: "rstreqs",
+ act: "rcv",
+ package: "",
},
],
param_list: [
+ { name: "NumWkups",
+ desc: "Number of wakeups",
+ type: "int",
+ default: "16",
+ local: "true"
+ },
],
regwidth: "32",
@@ -254,36 +269,44 @@
]
},
- { name: "WAKEUP_EN",
- desc: "Bit mask for enabled wakeups",
- swaccess: "rw",
- hwaccess: "hro",
- regwen: "WAKEUP_EN_REGWEN",
- resval: "0"
- fields: [
- { bits: "15:0",
- name: "EN",
- desc: '''
- Whenever a particular bit is set to 1, that wakeup is also enabled.
- Whenever a particular bit is set to 0, that wakeup cannot wake the device from low power.
- ''',
- },
- ]
+ { multireg:
+ { name: "WAKEUP_EN",
+ desc: "Bit mask for enabled wakeups",
+ swaccess: "rw",
+ hwaccess: "hro",
+ regwen: "WAKEUP_EN_REGWEN",
+ resval: "0"
+ cname: "wakeup_en",
+ count: "NumWkups"
+ fields: [
+ { bits: "0",
+ name: "EN",
+ desc: '''
+ Whenever a particular bit is set to 1, that wakeup is also enabled.
+ Whenever a particular bit is set to 0, that wakeup cannot wake the device from low power.
+ ''',
+ },
+ ]
+ },
},
- { name: "WAKE_STATUS",
- desc: "A read only register of all current wake requests post enable mask",
- swaccess: "ro",
- hwaccess: "none",
- resval: "0"
- fields: [
- { bits: "15:0",
- name: "VAL",
- desc: '''
- Current value of wake requests
- ''',
- },
- ]
+ { multireg:
+ { name: "WAKE_STATUS",
+ desc: "A read only register of all current wake requests post enable mask",
+ swaccess: "ro",
+ hwaccess: "none",
+ resval: "0"
+ cname: "wake_status",
+ count: "NumWkups",
+ fields: [
+ { bits: "0",
+ name: "VAL",
+ desc: '''
+ Current value of wake requests
+ ''',
+ },
+ ]
+ },
},
{ name: "RESET_EN_REGWEN",
@@ -394,3 +417,4 @@
},
]
}
+
diff --git a/hw/ip/pwrmgr/pwrmgr.core b/hw/ip/pwrmgr/pwrmgr.core
index 09a72ed..a7719f4 100644
--- a/hw/ip/pwrmgr/pwrmgr.core
+++ b/hw/ip/pwrmgr/pwrmgr.core
@@ -8,18 +8,9 @@
filesets:
files_rtl:
depend:
- - lowrisc:ip:tlul
- - lowrisc:prim:all
+ - lowrisc:ip:pwrmgr_component
+ - lowrisc:ip:pwrmgr_only_reg
- lowrisc:ip:pwrmgr_pkg
- files:
- - rtl/pwrmgr_reg_pkg.sv
- - rtl/pwrmgr_reg_top.sv
- - rtl/pwrmgr.sv
- - rtl/pwrmgr_cdc.sv
- - rtl/pwrmgr_slow_fsm.sv
- - rtl/pwrmgr_fsm.sv
- - rtl/pwrmgr_wake_info.sv
- file_type: systemVerilogSource
files_verilator_waiver:
depend:
diff --git a/hw/ip/pwrmgr/pwrmgr_component.core b/hw/ip/pwrmgr/pwrmgr_component.core
new file mode 100644
index 0000000..9034b53
--- /dev/null
+++ b/hw/ip/pwrmgr/pwrmgr_component.core
@@ -0,0 +1,24 @@
+CAPI=2:
+# Copyright lowRISC contributors.
+# Licensed under the Apache License, Version 2.0, see LICENSE for details.
+# SPDX-License-Identifier: Apache-2.0
+name: "lowrisc:ip:pwrmgr_component:0.1"
+description: "Power manager comopnents"
+
+filesets:
+ files_rtl:
+ depend:
+ - lowrisc:ip:tlul
+ - lowrisc:ip:pwrmgr_pkg
+ files:
+ - rtl/pwrmgr.sv
+ - rtl/pwrmgr_cdc.sv
+ - rtl/pwrmgr_slow_fsm.sv
+ - rtl/pwrmgr_fsm.sv
+ - rtl/pwrmgr_wake_info.sv
+ file_type: systemVerilogSource
+
+targets:
+ default:
+ filesets:
+ - files_rtl
diff --git a/hw/ip/pwrmgr/pwrmgr_only_reg.core b/hw/ip/pwrmgr/pwrmgr_only_reg.core
new file mode 100644
index 0000000..c6baa50
--- /dev/null
+++ b/hw/ip/pwrmgr/pwrmgr_only_reg.core
@@ -0,0 +1,20 @@
+CAPI=2:
+# Copyright lowRISC contributors.
+# Licensed under the Apache License, Version 2.0, see LICENSE for details.
+# SPDX-License-Identifier: Apache-2.0
+name: "lowrisc:ip:pwrmgr_only_reg:0.1"
+description: "pwrmgr IP only register"
+
+filesets:
+ files_rtl:
+ depend:
+ - lowrisc:tlul:headers
+ files:
+ - rtl/pwrmgr_reg_pkg.sv
+ - rtl/pwrmgr_reg_top.sv
+ file_type: systemVerilogSource
+
+targets:
+ default:
+ filesets:
+ - files_rtl
diff --git a/hw/ip/pwrmgr/pwrmgr_pkg.core b/hw/ip/pwrmgr/pwrmgr_pkg.core
index 73cbca7..7723ab7 100644
--- a/hw/ip/pwrmgr/pwrmgr_pkg.core
+++ b/hw/ip/pwrmgr/pwrmgr_pkg.core
@@ -3,12 +3,14 @@
# Licensed under the Apache License, Version 2.0, see LICENSE for details.
# SPDX-License-Identifier: Apache-2.0
name: "lowrisc:ip:pwrmgr_pkg:0.1"
-description: "Flash Package"
+description: "Power manager package"
+# pwrmgr pkg does not actually depend on ip:tlul
+# but it's used as "serialization" point for the ip/top level split
filesets:
files_rtl:
depend:
- - lowrisc:constants:top_pkg
+ - lowrisc:ip:tlul
files:
- rtl/pwrmgr_pkg.sv
file_type: systemVerilogSource
diff --git a/hw/ip/pwrmgr/rtl/pwrmgr.sv b/hw/ip/pwrmgr/rtl/pwrmgr.sv
index b86cf17..02375ce 100644
--- a/hw/ip/pwrmgr/rtl/pwrmgr.sv
+++ b/hw/ip/pwrmgr/rtl/pwrmgr.sv
@@ -7,7 +7,7 @@
`include "prim_assert.sv"
-module pwrmgr import pwrmgr_pkg::*;
+module pwrmgr import pwrmgr_pkg::*; import pwrmgr_reg_pkg::*;
(
// Clocks and resets
input clk_slow_i,
@@ -45,14 +45,21 @@
// processor interface
input pwr_cpu_t pwr_cpu_i,
- // peripherals interface, includes pinmux
- input pwr_peri_t pwr_peri_i,
+ // peripherals wakeup and reset requests
+ input [NumWkups-1:0] wakeups_i,
+ input [HwRstReqs-1:0] rstreqs_i,
output intr_wakeup_o
);
- import pwrmgr_reg_pkg::*;
+ ////////////////////////////
+ /// async declarations
+ ////////////////////////////
+ pwr_peri_t peri_reqs_raw;
+
+ assign peri_reqs_raw.wakeups = wakeups_i;
+ assign peri_reqs_raw.rstreqs = rstreqs_i;
////////////////////////////
/// clk_i domain declarations
@@ -78,7 +85,7 @@
// Captured signals
// These signals, though on clk_i domain, are safe for clk_slow_i to use
- pwrmgr_reg2hw_wakeup_en_reg_t slow_wakeup_en;
+ logic [NumWkups-1:0] slow_wakeup_en;
pwrmgr_reg2hw_reset_en_reg_t slow_reset_en;
pwr_ast_rsp_t slow_ast;
@@ -161,7 +168,7 @@
.ack_pwrup_i(ack_pwrup),
.cfg_cdc_sync_i(reg2hw.cfg_cdc_sync.qe & reg2hw.cfg_cdc_sync.q),
.cdc_sync_done_o(hw2reg.cfg_cdc_sync.de),
- .wakeup_en_i(reg2hw.wakeup_en.q),
+ .wakeup_en_i(reg2hw.wakeup_en),
.reset_en_i(reg2hw.reset_en.q),
.main_pd_ni(reg2hw.control.main_pd_n.q),
.io_clk_en_i(reg2hw.control.io_clk_en.q),
@@ -175,7 +182,7 @@
.ast_i(pwr_ast_i),
// peripheral signals
- .peri_i(pwr_peri_i)
+ .peri_i(peri_reqs_raw)
);
assign hw2reg.cfg_cdc_sync.d = 1'b0;
diff --git a/hw/ip/pwrmgr/rtl/pwrmgr_cdc.sv b/hw/ip/pwrmgr/rtl/pwrmgr_cdc.sv
index 9f71c17..34bf19a 100644
--- a/hw/ip/pwrmgr/rtl/pwrmgr_cdc.sv
+++ b/hw/ip/pwrmgr/rtl/pwrmgr_cdc.sv
@@ -7,7 +7,7 @@
`include "prim_assert.sv"
-module pwrmgr_cdc import pwrmgr_pkg::*;
+module pwrmgr_cdc import pwrmgr_pkg::*; import pwrmgr_reg_pkg::*;
(
// Clocks and resets
input clk_slow_i,
@@ -20,7 +20,7 @@
input slow_ack_pwrdn_i,
input slow_pwrup_cause_toggle_i,
input pwrup_cause_e slow_pwrup_cause_i,
- output pwrmgr_reg_pkg::pwrmgr_reg2hw_wakeup_en_reg_t slow_wakeup_en_o,
+ output logic [NumWkups-1:0] slow_wakeup_en_o,
output pwrmgr_reg_pkg::pwrmgr_reg2hw_reset_en_reg_t slow_reset_en_o,
output logic slow_main_pd_no,
output logic slow_io_clk_en_o,
@@ -35,7 +35,7 @@
input req_pwrdn_i,
input ack_pwrup_i,
input cfg_cdc_sync_i,
- input pwrmgr_reg_pkg::pwrmgr_reg2hw_wakeup_en_reg_t wakeup_en_i,
+ input [NumWkups-1:0] wakeup_en_i,
input pwrmgr_reg_pkg::pwrmgr_reg2hw_reset_en_reg_t reset_en_i,
input main_pd_ni,
input io_clk_en_i,
@@ -92,7 +92,7 @@
// So there is no general concern about recombining as there is
// no intent to use them in a related manner.
prim_flop_2sync # (
- .Width(HwRstReqs + WakeUpPeris)
+ .Width(HwRstReqs + NumWkups)
) i_slow_ext_req_sync (
.clk_i (clk_slow_i),
.rst_ni (rst_slow_ni),
@@ -213,7 +213,7 @@
end
prim_flop_2sync # (
- .Width(HwRstReqs + WakeUpPeris)
+ .Width(HwRstReqs + NumWkups)
) i_ext_req_sync (
.clk_i,
.rst_ni,
diff --git a/hw/ip/pwrmgr/rtl/pwrmgr_pkg.sv b/hw/ip/pwrmgr/rtl/pwrmgr_pkg.sv
index 79f238a..f3f5378 100644
--- a/hw/ip/pwrmgr/rtl/pwrmgr_pkg.sv
+++ b/hw/ip/pwrmgr/rtl/pwrmgr_pkg.sv
@@ -15,9 +15,8 @@
parameter PowerDomains = 2; // this maybe needs to be a topgen populated number, or from topcfg?
// variables referenced only by pwrmgr
- localparam WakeUpPeris = 16; // this needs to be a topgen populated number, or from topcfg?
- localparam TotalWakeWidth = WakeUpPeris + 2; // Abort and fall through are added
-
+ // pwrmgr_reg_pkg::NumWkups; // should this be coming from top_pkg instead?
+ localparam TotalWakeWidth = pwrmgr_reg_pkg::NumWkups + 2; // Abort and fall through are added
// pwrmgr to ast
typedef struct packed {
@@ -141,21 +140,18 @@
core_sleeping: 1'b0
};
- // peripherals to pwrmgr
- // TODO, switch this to two logic arrays once the option to support
- // logic during intermodule.py is in.
- // Structs are used for now since these happen to support dangling port
- // defaults.
- typedef struct packed {
- logic [WakeUpPeris-1:0] wakeups;
- logic [HwRstReqs-1:0] rstreqs;
- } pwr_peri_t;
+ logic [pwrmgr_reg_pkg::NumWkups-1:0] wakeups;
+ logic [HwRstReqs-1:0] rstreqs;
// default value (for dangling ports)
- parameter pwr_peri_t PWR_PERI_DEFAULT = '{
- wakeups: WakeUpPeris'(1'b1),
- rstreqs: '0
- };
+ parameter WAKEUPS_DEFAULT = '0;
+ parameter RSTREQS_DEFAULT = '0;
+
+ // peripherals to pwrmgr
+ typedef struct packed {
+ logic [pwrmgr_reg_pkg::NumWkups-1:0] wakeups;
+ logic [HwRstReqs-1:0] rstreqs;
+ } pwr_peri_t;
// power-up causes
typedef enum logic [1:0] {
diff --git a/hw/ip/pwrmgr/rtl/pwrmgr_reg_pkg.sv b/hw/ip/pwrmgr/rtl/pwrmgr_reg_pkg.sv
index 6b48a62..4a6a9d7 100644
--- a/hw/ip/pwrmgr/rtl/pwrmgr_reg_pkg.sv
+++ b/hw/ip/pwrmgr/rtl/pwrmgr_reg_pkg.sv
@@ -6,6 +6,9 @@
package pwrmgr_reg_pkg;
+ // Param list
+ parameter int NumWkups = 16;
+
////////////////////////////
// Typedefs for registers //
////////////////////////////
@@ -43,8 +46,8 @@
} pwrmgr_reg2hw_cfg_cdc_sync_reg_t;
typedef struct packed {
- logic [15:0] q;
- } pwrmgr_reg2hw_wakeup_en_reg_t;
+ logic q;
+ } pwrmgr_reg2hw_wakeup_en_mreg_t;
typedef struct packed {
logic [1:0] q;
@@ -113,7 +116,7 @@
pwrmgr_reg2hw_intr_test_reg_t intr_test; // [47:46]
pwrmgr_reg2hw_control_reg_t control; // [45:42]
pwrmgr_reg2hw_cfg_cdc_sync_reg_t cfg_cdc_sync; // [41:40]
- pwrmgr_reg2hw_wakeup_en_reg_t wakeup_en; // [39:24]
+ pwrmgr_reg2hw_wakeup_en_mreg_t [15:0] wakeup_en; // [39:24]
pwrmgr_reg2hw_reset_en_reg_t reset_en; // [23:22]
pwrmgr_reg2hw_wake_info_capture_dis_reg_t wake_info_capture_dis; // [21:21]
pwrmgr_reg2hw_wake_info_reg_t wake_info; // [20:0]
diff --git a/hw/ip/pwrmgr/rtl/pwrmgr_reg_top.sv b/hw/ip/pwrmgr/rtl/pwrmgr_reg_top.sv
index 1253a40..6080cf4 100644
--- a/hw/ip/pwrmgr/rtl/pwrmgr_reg_top.sv
+++ b/hw/ip/pwrmgr/rtl/pwrmgr_reg_top.sv
@@ -99,10 +99,70 @@
logic wakeup_en_regwen_qs;
logic wakeup_en_regwen_wd;
logic wakeup_en_regwen_we;
- logic [15:0] wakeup_en_qs;
- logic [15:0] wakeup_en_wd;
- logic wakeup_en_we;
- logic [15:0] wake_status_qs;
+ logic wakeup_en_en0_qs;
+ logic wakeup_en_en0_wd;
+ logic wakeup_en_en0_we;
+ logic wakeup_en_en1_qs;
+ logic wakeup_en_en1_wd;
+ logic wakeup_en_en1_we;
+ logic wakeup_en_en2_qs;
+ logic wakeup_en_en2_wd;
+ logic wakeup_en_en2_we;
+ logic wakeup_en_en3_qs;
+ logic wakeup_en_en3_wd;
+ logic wakeup_en_en3_we;
+ logic wakeup_en_en4_qs;
+ logic wakeup_en_en4_wd;
+ logic wakeup_en_en4_we;
+ logic wakeup_en_en5_qs;
+ logic wakeup_en_en5_wd;
+ logic wakeup_en_en5_we;
+ logic wakeup_en_en6_qs;
+ logic wakeup_en_en6_wd;
+ logic wakeup_en_en6_we;
+ logic wakeup_en_en7_qs;
+ logic wakeup_en_en7_wd;
+ logic wakeup_en_en7_we;
+ logic wakeup_en_en8_qs;
+ logic wakeup_en_en8_wd;
+ logic wakeup_en_en8_we;
+ logic wakeup_en_en9_qs;
+ logic wakeup_en_en9_wd;
+ logic wakeup_en_en9_we;
+ logic wakeup_en_en10_qs;
+ logic wakeup_en_en10_wd;
+ logic wakeup_en_en10_we;
+ logic wakeup_en_en11_qs;
+ logic wakeup_en_en11_wd;
+ logic wakeup_en_en11_we;
+ logic wakeup_en_en12_qs;
+ logic wakeup_en_en12_wd;
+ logic wakeup_en_en12_we;
+ logic wakeup_en_en13_qs;
+ logic wakeup_en_en13_wd;
+ logic wakeup_en_en13_we;
+ logic wakeup_en_en14_qs;
+ logic wakeup_en_en14_wd;
+ logic wakeup_en_en14_we;
+ logic wakeup_en_en15_qs;
+ logic wakeup_en_en15_wd;
+ logic wakeup_en_en15_we;
+ logic wake_status_val0_qs;
+ logic wake_status_val1_qs;
+ logic wake_status_val2_qs;
+ logic wake_status_val3_qs;
+ logic wake_status_val4_qs;
+ logic wake_status_val5_qs;
+ logic wake_status_val6_qs;
+ logic wake_status_val7_qs;
+ logic wake_status_val8_qs;
+ logic wake_status_val9_qs;
+ logic wake_status_val10_qs;
+ logic wake_status_val11_qs;
+ logic wake_status_val12_qs;
+ logic wake_status_val13_qs;
+ logic wake_status_val14_qs;
+ logic wake_status_val15_qs;
logic reset_en_regwen_qs;
logic reset_en_regwen_wd;
logic reset_en_regwen_we;
@@ -373,19 +433,22 @@
);
+
+ // Subregister 0 of Multireg wakeup_en
// R[wakeup_en]: V(False)
+ // F[en0]: 0:0
prim_subreg #(
- .DW (16),
+ .DW (1),
.SWACCESS("RW"),
- .RESVAL (16'h0)
- ) u_wakeup_en (
+ .RESVAL (1'h0)
+ ) u_wakeup_en_en0 (
.clk_i (clk_i ),
.rst_ni (rst_ni ),
// from register interface (qualified with register enable)
- .we (wakeup_en_we & wakeup_en_regwen_qs),
- .wd (wakeup_en_wd),
+ .we (wakeup_en_en0_we & wakeup_en_regwen_qs),
+ .wd (wakeup_en_en0_wd),
// from internal hardware
.de (1'b0),
@@ -393,17 +456,487 @@
// to internal hardware
.qe (),
- .q (reg2hw.wakeup_en.q ),
+ .q (reg2hw.wakeup_en[0].q ),
// to register interface (read)
- .qs (wakeup_en_qs)
+ .qs (wakeup_en_en0_qs)
);
+ // F[en1]: 1:1
+ prim_subreg #(
+ .DW (1),
+ .SWACCESS("RW"),
+ .RESVAL (1'h0)
+ ) u_wakeup_en_en1 (
+ .clk_i (clk_i ),
+ .rst_ni (rst_ni ),
+
+ // from register interface (qualified with register enable)
+ .we (wakeup_en_en1_we & wakeup_en_regwen_qs),
+ .wd (wakeup_en_en1_wd),
+
+ // from internal hardware
+ .de (1'b0),
+ .d ('0 ),
+
+ // to internal hardware
+ .qe (),
+ .q (reg2hw.wakeup_en[1].q ),
+
+ // to register interface (read)
+ .qs (wakeup_en_en1_qs)
+ );
+
+
+ // F[en2]: 2:2
+ prim_subreg #(
+ .DW (1),
+ .SWACCESS("RW"),
+ .RESVAL (1'h0)
+ ) u_wakeup_en_en2 (
+ .clk_i (clk_i ),
+ .rst_ni (rst_ni ),
+
+ // from register interface (qualified with register enable)
+ .we (wakeup_en_en2_we & wakeup_en_regwen_qs),
+ .wd (wakeup_en_en2_wd),
+
+ // from internal hardware
+ .de (1'b0),
+ .d ('0 ),
+
+ // to internal hardware
+ .qe (),
+ .q (reg2hw.wakeup_en[2].q ),
+
+ // to register interface (read)
+ .qs (wakeup_en_en2_qs)
+ );
+
+
+ // F[en3]: 3:3
+ prim_subreg #(
+ .DW (1),
+ .SWACCESS("RW"),
+ .RESVAL (1'h0)
+ ) u_wakeup_en_en3 (
+ .clk_i (clk_i ),
+ .rst_ni (rst_ni ),
+
+ // from register interface (qualified with register enable)
+ .we (wakeup_en_en3_we & wakeup_en_regwen_qs),
+ .wd (wakeup_en_en3_wd),
+
+ // from internal hardware
+ .de (1'b0),
+ .d ('0 ),
+
+ // to internal hardware
+ .qe (),
+ .q (reg2hw.wakeup_en[3].q ),
+
+ // to register interface (read)
+ .qs (wakeup_en_en3_qs)
+ );
+
+
+ // F[en4]: 4:4
+ prim_subreg #(
+ .DW (1),
+ .SWACCESS("RW"),
+ .RESVAL (1'h0)
+ ) u_wakeup_en_en4 (
+ .clk_i (clk_i ),
+ .rst_ni (rst_ni ),
+
+ // from register interface (qualified with register enable)
+ .we (wakeup_en_en4_we & wakeup_en_regwen_qs),
+ .wd (wakeup_en_en4_wd),
+
+ // from internal hardware
+ .de (1'b0),
+ .d ('0 ),
+
+ // to internal hardware
+ .qe (),
+ .q (reg2hw.wakeup_en[4].q ),
+
+ // to register interface (read)
+ .qs (wakeup_en_en4_qs)
+ );
+
+
+ // F[en5]: 5:5
+ prim_subreg #(
+ .DW (1),
+ .SWACCESS("RW"),
+ .RESVAL (1'h0)
+ ) u_wakeup_en_en5 (
+ .clk_i (clk_i ),
+ .rst_ni (rst_ni ),
+
+ // from register interface (qualified with register enable)
+ .we (wakeup_en_en5_we & wakeup_en_regwen_qs),
+ .wd (wakeup_en_en5_wd),
+
+ // from internal hardware
+ .de (1'b0),
+ .d ('0 ),
+
+ // to internal hardware
+ .qe (),
+ .q (reg2hw.wakeup_en[5].q ),
+
+ // to register interface (read)
+ .qs (wakeup_en_en5_qs)
+ );
+
+
+ // F[en6]: 6:6
+ prim_subreg #(
+ .DW (1),
+ .SWACCESS("RW"),
+ .RESVAL (1'h0)
+ ) u_wakeup_en_en6 (
+ .clk_i (clk_i ),
+ .rst_ni (rst_ni ),
+
+ // from register interface (qualified with register enable)
+ .we (wakeup_en_en6_we & wakeup_en_regwen_qs),
+ .wd (wakeup_en_en6_wd),
+
+ // from internal hardware
+ .de (1'b0),
+ .d ('0 ),
+
+ // to internal hardware
+ .qe (),
+ .q (reg2hw.wakeup_en[6].q ),
+
+ // to register interface (read)
+ .qs (wakeup_en_en6_qs)
+ );
+
+
+ // F[en7]: 7:7
+ prim_subreg #(
+ .DW (1),
+ .SWACCESS("RW"),
+ .RESVAL (1'h0)
+ ) u_wakeup_en_en7 (
+ .clk_i (clk_i ),
+ .rst_ni (rst_ni ),
+
+ // from register interface (qualified with register enable)
+ .we (wakeup_en_en7_we & wakeup_en_regwen_qs),
+ .wd (wakeup_en_en7_wd),
+
+ // from internal hardware
+ .de (1'b0),
+ .d ('0 ),
+
+ // to internal hardware
+ .qe (),
+ .q (reg2hw.wakeup_en[7].q ),
+
+ // to register interface (read)
+ .qs (wakeup_en_en7_qs)
+ );
+
+
+ // F[en8]: 8:8
+ prim_subreg #(
+ .DW (1),
+ .SWACCESS("RW"),
+ .RESVAL (1'h0)
+ ) u_wakeup_en_en8 (
+ .clk_i (clk_i ),
+ .rst_ni (rst_ni ),
+
+ // from register interface (qualified with register enable)
+ .we (wakeup_en_en8_we & wakeup_en_regwen_qs),
+ .wd (wakeup_en_en8_wd),
+
+ // from internal hardware
+ .de (1'b0),
+ .d ('0 ),
+
+ // to internal hardware
+ .qe (),
+ .q (reg2hw.wakeup_en[8].q ),
+
+ // to register interface (read)
+ .qs (wakeup_en_en8_qs)
+ );
+
+
+ // F[en9]: 9:9
+ prim_subreg #(
+ .DW (1),
+ .SWACCESS("RW"),
+ .RESVAL (1'h0)
+ ) u_wakeup_en_en9 (
+ .clk_i (clk_i ),
+ .rst_ni (rst_ni ),
+
+ // from register interface (qualified with register enable)
+ .we (wakeup_en_en9_we & wakeup_en_regwen_qs),
+ .wd (wakeup_en_en9_wd),
+
+ // from internal hardware
+ .de (1'b0),
+ .d ('0 ),
+
+ // to internal hardware
+ .qe (),
+ .q (reg2hw.wakeup_en[9].q ),
+
+ // to register interface (read)
+ .qs (wakeup_en_en9_qs)
+ );
+
+
+ // F[en10]: 10:10
+ prim_subreg #(
+ .DW (1),
+ .SWACCESS("RW"),
+ .RESVAL (1'h0)
+ ) u_wakeup_en_en10 (
+ .clk_i (clk_i ),
+ .rst_ni (rst_ni ),
+
+ // from register interface (qualified with register enable)
+ .we (wakeup_en_en10_we & wakeup_en_regwen_qs),
+ .wd (wakeup_en_en10_wd),
+
+ // from internal hardware
+ .de (1'b0),
+ .d ('0 ),
+
+ // to internal hardware
+ .qe (),
+ .q (reg2hw.wakeup_en[10].q ),
+
+ // to register interface (read)
+ .qs (wakeup_en_en10_qs)
+ );
+
+
+ // F[en11]: 11:11
+ prim_subreg #(
+ .DW (1),
+ .SWACCESS("RW"),
+ .RESVAL (1'h0)
+ ) u_wakeup_en_en11 (
+ .clk_i (clk_i ),
+ .rst_ni (rst_ni ),
+
+ // from register interface (qualified with register enable)
+ .we (wakeup_en_en11_we & wakeup_en_regwen_qs),
+ .wd (wakeup_en_en11_wd),
+
+ // from internal hardware
+ .de (1'b0),
+ .d ('0 ),
+
+ // to internal hardware
+ .qe (),
+ .q (reg2hw.wakeup_en[11].q ),
+
+ // to register interface (read)
+ .qs (wakeup_en_en11_qs)
+ );
+
+
+ // F[en12]: 12:12
+ prim_subreg #(
+ .DW (1),
+ .SWACCESS("RW"),
+ .RESVAL (1'h0)
+ ) u_wakeup_en_en12 (
+ .clk_i (clk_i ),
+ .rst_ni (rst_ni ),
+
+ // from register interface (qualified with register enable)
+ .we (wakeup_en_en12_we & wakeup_en_regwen_qs),
+ .wd (wakeup_en_en12_wd),
+
+ // from internal hardware
+ .de (1'b0),
+ .d ('0 ),
+
+ // to internal hardware
+ .qe (),
+ .q (reg2hw.wakeup_en[12].q ),
+
+ // to register interface (read)
+ .qs (wakeup_en_en12_qs)
+ );
+
+
+ // F[en13]: 13:13
+ prim_subreg #(
+ .DW (1),
+ .SWACCESS("RW"),
+ .RESVAL (1'h0)
+ ) u_wakeup_en_en13 (
+ .clk_i (clk_i ),
+ .rst_ni (rst_ni ),
+
+ // from register interface (qualified with register enable)
+ .we (wakeup_en_en13_we & wakeup_en_regwen_qs),
+ .wd (wakeup_en_en13_wd),
+
+ // from internal hardware
+ .de (1'b0),
+ .d ('0 ),
+
+ // to internal hardware
+ .qe (),
+ .q (reg2hw.wakeup_en[13].q ),
+
+ // to register interface (read)
+ .qs (wakeup_en_en13_qs)
+ );
+
+
+ // F[en14]: 14:14
+ prim_subreg #(
+ .DW (1),
+ .SWACCESS("RW"),
+ .RESVAL (1'h0)
+ ) u_wakeup_en_en14 (
+ .clk_i (clk_i ),
+ .rst_ni (rst_ni ),
+
+ // from register interface (qualified with register enable)
+ .we (wakeup_en_en14_we & wakeup_en_regwen_qs),
+ .wd (wakeup_en_en14_wd),
+
+ // from internal hardware
+ .de (1'b0),
+ .d ('0 ),
+
+ // to internal hardware
+ .qe (),
+ .q (reg2hw.wakeup_en[14].q ),
+
+ // to register interface (read)
+ .qs (wakeup_en_en14_qs)
+ );
+
+
+ // F[en15]: 15:15
+ prim_subreg #(
+ .DW (1),
+ .SWACCESS("RW"),
+ .RESVAL (1'h0)
+ ) u_wakeup_en_en15 (
+ .clk_i (clk_i ),
+ .rst_ni (rst_ni ),
+
+ // from register interface (qualified with register enable)
+ .we (wakeup_en_en15_we & wakeup_en_regwen_qs),
+ .wd (wakeup_en_en15_wd),
+
+ // from internal hardware
+ .de (1'b0),
+ .d ('0 ),
+
+ // to internal hardware
+ .qe (),
+ .q (reg2hw.wakeup_en[15].q ),
+
+ // to register interface (read)
+ .qs (wakeup_en_en15_qs)
+ );
+
+
+
+
+ // Subregister 0 of Multireg wake_status
// R[wake_status]: V(False)
+ // F[val0]: 0:0
// constant-only read
- assign wake_status_qs = 16'h0;
+ assign wake_status_val0_qs = 1'h0;
+
+
+ // F[val1]: 1:1
+ // constant-only read
+ assign wake_status_val1_qs = 1'h0;
+
+
+ // F[val2]: 2:2
+ // constant-only read
+ assign wake_status_val2_qs = 1'h0;
+
+
+ // F[val3]: 3:3
+ // constant-only read
+ assign wake_status_val3_qs = 1'h0;
+
+
+ // F[val4]: 4:4
+ // constant-only read
+ assign wake_status_val4_qs = 1'h0;
+
+
+ // F[val5]: 5:5
+ // constant-only read
+ assign wake_status_val5_qs = 1'h0;
+
+
+ // F[val6]: 6:6
+ // constant-only read
+ assign wake_status_val6_qs = 1'h0;
+
+
+ // F[val7]: 7:7
+ // constant-only read
+ assign wake_status_val7_qs = 1'h0;
+
+
+ // F[val8]: 8:8
+ // constant-only read
+ assign wake_status_val8_qs = 1'h0;
+
+
+ // F[val9]: 9:9
+ // constant-only read
+ assign wake_status_val9_qs = 1'h0;
+
+
+ // F[val10]: 10:10
+ // constant-only read
+ assign wake_status_val10_qs = 1'h0;
+
+
+ // F[val11]: 11:11
+ // constant-only read
+ assign wake_status_val11_qs = 1'h0;
+
+
+ // F[val12]: 12:12
+ // constant-only read
+ assign wake_status_val12_qs = 1'h0;
+
+
+ // F[val13]: 13:13
+ // constant-only read
+ assign wake_status_val13_qs = 1'h0;
+
+
+ // F[val14]: 14:14
+ // constant-only read
+ assign wake_status_val14_qs = 1'h0;
+
+
+ // F[val15]: 15:15
+ // constant-only read
+ assign wake_status_val15_qs = 1'h0;
+
// R[reset_en_regwen]: V(False)
@@ -611,8 +1144,68 @@
assign wakeup_en_regwen_we = addr_hit[6] & reg_we & ~wr_err;
assign wakeup_en_regwen_wd = reg_wdata[0];
- assign wakeup_en_we = addr_hit[7] & reg_we & ~wr_err;
- assign wakeup_en_wd = reg_wdata[15:0];
+ assign wakeup_en_en0_we = addr_hit[7] & reg_we & ~wr_err;
+ assign wakeup_en_en0_wd = reg_wdata[0];
+
+ assign wakeup_en_en1_we = addr_hit[7] & reg_we & ~wr_err;
+ assign wakeup_en_en1_wd = reg_wdata[1];
+
+ assign wakeup_en_en2_we = addr_hit[7] & reg_we & ~wr_err;
+ assign wakeup_en_en2_wd = reg_wdata[2];
+
+ assign wakeup_en_en3_we = addr_hit[7] & reg_we & ~wr_err;
+ assign wakeup_en_en3_wd = reg_wdata[3];
+
+ assign wakeup_en_en4_we = addr_hit[7] & reg_we & ~wr_err;
+ assign wakeup_en_en4_wd = reg_wdata[4];
+
+ assign wakeup_en_en5_we = addr_hit[7] & reg_we & ~wr_err;
+ assign wakeup_en_en5_wd = reg_wdata[5];
+
+ assign wakeup_en_en6_we = addr_hit[7] & reg_we & ~wr_err;
+ assign wakeup_en_en6_wd = reg_wdata[6];
+
+ assign wakeup_en_en7_we = addr_hit[7] & reg_we & ~wr_err;
+ assign wakeup_en_en7_wd = reg_wdata[7];
+
+ assign wakeup_en_en8_we = addr_hit[7] & reg_we & ~wr_err;
+ assign wakeup_en_en8_wd = reg_wdata[8];
+
+ assign wakeup_en_en9_we = addr_hit[7] & reg_we & ~wr_err;
+ assign wakeup_en_en9_wd = reg_wdata[9];
+
+ assign wakeup_en_en10_we = addr_hit[7] & reg_we & ~wr_err;
+ assign wakeup_en_en10_wd = reg_wdata[10];
+
+ assign wakeup_en_en11_we = addr_hit[7] & reg_we & ~wr_err;
+ assign wakeup_en_en11_wd = reg_wdata[11];
+
+ assign wakeup_en_en12_we = addr_hit[7] & reg_we & ~wr_err;
+ assign wakeup_en_en12_wd = reg_wdata[12];
+
+ assign wakeup_en_en13_we = addr_hit[7] & reg_we & ~wr_err;
+ assign wakeup_en_en13_wd = reg_wdata[13];
+
+ assign wakeup_en_en14_we = addr_hit[7] & reg_we & ~wr_err;
+ assign wakeup_en_en14_wd = reg_wdata[14];
+
+ assign wakeup_en_en15_we = addr_hit[7] & reg_we & ~wr_err;
+ assign wakeup_en_en15_wd = reg_wdata[15];
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
assign reset_en_regwen_we = addr_hit[9] & reg_we & ~wr_err;
@@ -673,11 +1266,41 @@
end
addr_hit[7]: begin
- reg_rdata_next[15:0] = wakeup_en_qs;
+ reg_rdata_next[0] = wakeup_en_en0_qs;
+ reg_rdata_next[1] = wakeup_en_en1_qs;
+ reg_rdata_next[2] = wakeup_en_en2_qs;
+ reg_rdata_next[3] = wakeup_en_en3_qs;
+ reg_rdata_next[4] = wakeup_en_en4_qs;
+ reg_rdata_next[5] = wakeup_en_en5_qs;
+ reg_rdata_next[6] = wakeup_en_en6_qs;
+ reg_rdata_next[7] = wakeup_en_en7_qs;
+ reg_rdata_next[8] = wakeup_en_en8_qs;
+ reg_rdata_next[9] = wakeup_en_en9_qs;
+ reg_rdata_next[10] = wakeup_en_en10_qs;
+ reg_rdata_next[11] = wakeup_en_en11_qs;
+ reg_rdata_next[12] = wakeup_en_en12_qs;
+ reg_rdata_next[13] = wakeup_en_en13_qs;
+ reg_rdata_next[14] = wakeup_en_en14_qs;
+ reg_rdata_next[15] = wakeup_en_en15_qs;
end
addr_hit[8]: begin
- reg_rdata_next[15:0] = wake_status_qs;
+ reg_rdata_next[0] = wake_status_val0_qs;
+ reg_rdata_next[1] = wake_status_val1_qs;
+ reg_rdata_next[2] = wake_status_val2_qs;
+ reg_rdata_next[3] = wake_status_val3_qs;
+ reg_rdata_next[4] = wake_status_val4_qs;
+ reg_rdata_next[5] = wake_status_val5_qs;
+ reg_rdata_next[6] = wake_status_val6_qs;
+ reg_rdata_next[7] = wake_status_val7_qs;
+ reg_rdata_next[8] = wake_status_val8_qs;
+ reg_rdata_next[9] = wake_status_val9_qs;
+ reg_rdata_next[10] = wake_status_val10_qs;
+ reg_rdata_next[11] = wake_status_val11_qs;
+ reg_rdata_next[12] = wake_status_val12_qs;
+ reg_rdata_next[13] = wake_status_val13_qs;
+ reg_rdata_next[14] = wake_status_val14_qs;
+ reg_rdata_next[15] = wake_status_val15_qs;
end
addr_hit[9]: begin
diff --git a/hw/ip/pwrmgr/rtl/pwrmgr_wake_info.sv b/hw/ip/pwrmgr/rtl/pwrmgr_wake_info.sv
index 50eabc9..fd84c4e 100644
--- a/hw/ip/pwrmgr/rtl/pwrmgr_wake_info.sv
+++ b/hw/ip/pwrmgr/rtl/pwrmgr_wake_info.sv
@@ -7,14 +7,15 @@
`include "prim_assert.sv"
-module pwrmgr_wake_info import pwrmgr_pkg::*; (
+module pwrmgr_wake_info import pwrmgr_pkg::*; import pwrmgr_reg_pkg::*;
+(
input clk_i,
input rst_ni,
input wr_i,
input [TotalWakeWidth-1:0] data_i,
input start_capture_i,
input record_dis_i,
- input [WakeUpPeris-1:0] wakeups_i,
+ input [NumWkups-1:0] wakeups_i,
input fall_through_i,
input abort_i,
output logic [TotalWakeWidth-1:0] info_o
@@ -45,8 +46,8 @@
end else if (wr_i) begin
info_o <= info_o & ~data_i; // W1C
end else if (record_en) begin // If set once, hold until clear
- info_o[0 +: WakeUpPeris] <= info_o[0 +: WakeUpPeris] | wakeups_i;
- info_o[WakeUpPeris +: 2] <= info_o[WakeUpPeris +: 2] | {abort_i, fall_through_i};
+ info_o[0 +: NumWkups] <= info_o[0 +: NumWkups] | wakeups_i;
+ info_o[NumWkups +: 2] <= info_o[NumWkups +: 2] | {abort_i, fall_through_i};
end
end
diff --git a/hw/ip/pwrmgr/util/reg_pwrmgr.py b/hw/ip/pwrmgr/util/reg_pwrmgr.py
new file mode 100755
index 0000000..4c74ce0
--- /dev/null
+++ b/hw/ip/pwrmgr/util/reg_pwrmgr.py
@@ -0,0 +1,42 @@
+#!/usr/bin/env python3
+# Copyright lowRISC contributors.
+# Licensed under the Apache License, Version 2.0, see LICENSE for details.
+# SPDX-License-Identifier: Apache-2.0
+r"""Convert mako template to Hjson register description
+"""
+import argparse
+import sys
+from io import StringIO
+
+from mako.template import Template
+
+
+def main():
+ parser = argparse.ArgumentParser(prog="reg_pwrmgr")
+ parser.add_argument('input',
+ nargs='?',
+ metavar='file',
+ type=argparse.FileType('r'),
+ default=sys.stdin,
+ help='input template file')
+ parser.add_argument('--n_wkups',
+ type=int,
+ default=16,
+ help='Number of Wakeup sources')
+
+ args = parser.parse_args()
+
+ # Determine output: if stdin then stdout if not then ??
+ out = StringIO()
+
+ reg_tpl = Template(args.input.read())
+ out.write(
+ reg_tpl.render(NumWkups=args.n_wkups))
+
+ print(out.getvalue())
+
+ out.close()
+
+
+if __name__ == "__main__":
+ main()
diff --git a/hw/ip/rstmgr/rstmgr_pkg.core b/hw/ip/rstmgr/rstmgr_pkg.core
index 8ebf4d0..dd1ef82 100644
--- a/hw/ip/rstmgr/rstmgr_pkg.core
+++ b/hw/ip/rstmgr/rstmgr_pkg.core
@@ -9,6 +9,7 @@
files_rtl:
depend:
- lowrisc:constants:top_pkg
+ - lowrisc:ip:pwrmgr_pkg
files:
- rtl/rstmgr_pkg.sv
file_type: systemVerilogSource