[fpv/pwrmgr] Add pwrmgr and top_earlgrey to FPV
Add pwrmgr_bind.sv file
Add pwrmgr to FPV run
Add formal target in top_eargrey core
Delete FPV folder in pwrmgr
Signed-off-by: Cindy Chen <chencindy@google.com>
diff --git a/hw/formal/fpv_all b/hw/formal/fpv_all
index d4593bf..8585837 100755
--- a/hw/formal/fpv_all
+++ b/hw/formal/fpv_all
@@ -26,6 +26,7 @@
"uart"
"hmac"
"flash_ctrl"
+ "pwrmgr"
"usbuart"
"usbdev"
"usb_fs_nb_pe"
diff --git a/hw/ip/pwrmgr/dv/tb/pwrmgr_bind.sv b/hw/ip/pwrmgr/dv/tb/pwrmgr_bind.sv
new file mode 100644
index 0000000..fe57be2
--- /dev/null
+++ b/hw/ip/pwrmgr/dv/tb/pwrmgr_bind.sv
@@ -0,0 +1,16 @@
+// Copyright lowRISC contributors.
+// Licensed under the Apache License, Version 2.0, see LICENSE for details.
+// SPDX-License-Identifier: Apache-2.0
+
+module pwrmgr_bind;
+
+ bind pwrmgr tlul_assert #(
+ .EndpointType("Device")
+ ) tlul_assert_device (
+ .clk_i,
+ .rst_ni,
+ .h2d (tl_i),
+ .d2h (tl_o)
+ );
+
+endmodule
diff --git a/hw/ip/pwrmgr/fpv/vip/pwrmgr_csr_assert_fpv.sv b/hw/ip/pwrmgr/fpv/vip/pwrmgr_csr_assert_fpv.sv
deleted file mode 100644
index d20d505..0000000
--- a/hw/ip/pwrmgr/fpv/vip/pwrmgr_csr_assert_fpv.sv
+++ /dev/null
@@ -1,134 +0,0 @@
-// Copyright lowRISC contributors.
-// Licensed under the Apache License, Version 2.0, see LICENSE for details.
-// SPDX-License-Identifier: Apache-2.0
-
-// FPV CSR read and write assertions auto-generated by `reggen` containing data structure
-// Do Not Edit directly
-
-
-`include "prim_assert.sv"
-
-// Block: pwrmgr
-module pwrmgr_csr_assert_fpv import tlul_pkg::*; (
- input clk_i,
- input rst_ni,
-
- //tile link ports
- input tl_h2d_t h2d,
- input tl_d2h_t d2h
-);
-
- // mask register to convert byte to bit
- logic [31:0] a_mask_bit;
-
- assign a_mask_bit[7:0] = h2d.a_mask[0] ? '1 : '0;
- assign a_mask_bit[15:8] = h2d.a_mask[1] ? '1 : '0;
- assign a_mask_bit[23:16] = h2d.a_mask[2] ? '1 : '0;
- assign a_mask_bit[31:24] = h2d.a_mask[3] ? '1 : '0;
-
- // declare common read and write sequences
- sequence device_wr_S(logic [5:0] addr);
- h2d.a_address == addr && h2d.a_opcode inside {PutFullData, PutPartialData} && h2d.a_valid && h2d.d_ready && !d2h.d_valid;
- endsequence
-
- sequence device_rd_S(logic [5:0] addr);
- h2d.a_address == addr && h2d.a_opcode inside {Get} && h2d.a_valid && h2d.d_ready && !d2h.d_valid;
- endsequence
-
- // declare common read and write properties
- property wr_P(int width, bit [5:0] addr, bit [31:0] compare_data, bit regen = 1);
- logic [31:0] id;
- logic [width:0] data;
- (device_wr_S(addr),id = h2d.a_source, data = h2d.a_data & a_mask_bit) |->
- strong(##[1:$] (d2h.d_valid && d2h.d_source == id && (d2h.d_error ||
- (!d2h.d_error && compare_data == data) || !regen)));
- endproperty
-
- property wr_ext_P(int width, bit [5:0] addr, bit [31:0] compare_data, bit regen = 1);
- logic [31:0] id;
- logic [width:0] data;
- logic [width:0] compare_value;
- (device_wr_S(addr),id = h2d.a_source, data = h2d.a_data & a_mask_bit,
- compare_value = compare_data) |->
- strong(##[1:$] (d2h.d_valid && d2h.d_source == id && (d2h.d_error ||
- (!d2h.d_error && compare_value == data) || !regen)));
- endproperty
-
- property rd_P(int width, bit [5:0] addr, bit [31:0] compare_data);
- logic [31:0] id;
- logic [width:0] data;
- (device_rd_S(addr), id = h2d.a_source, data = $past(compare_data)) |->
- strong(##[1:$] (d2h.d_valid && d2h.d_source == id && (d2h.d_error ||
- (!d2h.d_error && d2h.d_data == data))));
- endproperty
-
- property rd_ext_P(int width, bit [5:0] addr, bit [31:0] compare_data);
- logic [31:0] id;
- logic [width:0] data;
- (device_rd_S(addr), id = h2d.a_source, data = compare_data) |->
- strong(##[1:$] (d2h.d_valid && d2h.d_source == id && (d2h.d_error ||
- (!d2h.d_error && d2h.d_data == data))));
- endproperty
-
- property wr_regen_stable_P(regen, compare_data);
- (!regen && $stable(regen)) |-> $stable(compare_data);
- endproperty
-
-// for all the regsters, declare assertion
-
- // read/write assertions for register: intr_state
- `ASSERT(intr_state_wr_A, wr_P(0, 6'h0, i_pwrmgr.reg2hw.intr_state.q, 0))
- `ASSERT(intr_state_rd_A, rd_P(0, 6'h0, i_pwrmgr.hw2reg.intr_state.d))
-
- // read/write assertions for register: intr_enable
- `ASSERT(intr_enable_wr_A, wr_P(0, 6'h4, i_pwrmgr.reg2hw.intr_enable.q, 0))
- `ASSERT(intr_enable_rd_A, rd_P(0, 6'h4, i_pwrmgr.reg2hw.intr_enable.q))
-
- // read/write assertions for register: intr_test
- `ASSERT(intr_test_wr_A, wr_ext_P(0, 6'h8, i_pwrmgr.reg2hw.intr_test.q, 0))
-
- // read/write assertions for register: ctrl_cfg_regwen
- `ASSERT(ctrl_cfg_regwen_rd_A, rd_ext_P(0, 6'hc, i_pwrmgr.hw2reg.ctrl_cfg_regwen.d))
-
- // read/write assertions for register: control
- `ASSERT(control_wr_A, wr_P(6, 6'h10, i_pwrmgr.reg2hw.control.q, i_pwrmgr.i_reg_top.ctrl_cfg_regwen_qs))
- `ASSERT(control_stable_A, wr_regen_stable_P(i_pwrmgr.i_reg_top.ctrl_cfg_regwen_qs, i_pwrmgr.reg2hw.control.q))
- `ASSERT(control_rd_A, rd_P(6, 6'h10, i_pwrmgr.hw2reg.control.d))
-
- // read/write assertions for register: cfg_cdc_sync
- `ASSERT(cfg_cdc_sync_wr_A, wr_P(0, 6'h14, i_pwrmgr.reg2hw.cfg_cdc_sync.q, 0))
- `ASSERT(cfg_cdc_sync_rd_A, rd_P(0, 6'h14, i_pwrmgr.hw2reg.cfg_cdc_sync.d))
-
- // read/write assertions for register: wakeup_en_regwen
- `ASSERT(wakeup_en_regwen_wr_A, wr_P(0, 6'h18, i_pwrmgr.i_reg_top.wakeup_en_regwen_we, 0))
- `ASSERT(wakeup_en_regwen_rd_A, rd_P(0, 6'h18, i_pwrmgr.i_reg_top.wakeup_en_regwen_qs))
-
- // read/write assertions for register: wakeup_en
- `ASSERT(wakeup_en_wr_A, wr_P(15, 6'h1c, i_pwrmgr.reg2hw.wakeup_en.q, i_pwrmgr.i_reg_top.wakeup_en_regwen_qs))
- `ASSERT(wakeup_en_stable_A, wr_regen_stable_P(i_pwrmgr.i_reg_top.wakeup_en_regwen_qs, i_pwrmgr.reg2hw.wakeup_en.q))
- `ASSERT(wakeup_en_rd_A, rd_P(15, 6'h1c, i_pwrmgr.reg2hw.wakeup_en.q))
-
- // read/write assertions for register: wake_status
- `ASSERT(wake_status_rd_A, rd_P(15, 6'h20, i_pwrmgr.i_reg_top.wake_status_qs))
-
- // read/write assertions for register: reset_en_regwen
- `ASSERT(reset_en_regwen_wr_A, wr_P(0, 6'h24, i_pwrmgr.i_reg_top.reset_en_regwen_we, 0))
- `ASSERT(reset_en_regwen_rd_A, rd_P(0, 6'h24, i_pwrmgr.i_reg_top.reset_en_regwen_qs))
-
- // read/write assertions for register: reset_en
- `ASSERT(reset_en_wr_A, wr_P(1, 6'h28, i_pwrmgr.reg2hw.reset_en.q, i_pwrmgr.i_reg_top.reset_en_regwen_qs))
- `ASSERT(reset_en_stable_A, wr_regen_stable_P(i_pwrmgr.i_reg_top.reset_en_regwen_qs, i_pwrmgr.reg2hw.reset_en.q))
- `ASSERT(reset_en_rd_A, rd_P(1, 6'h28, i_pwrmgr.reg2hw.reset_en.q))
-
- // read/write assertions for register: reset_status
- `ASSERT(reset_status_rd_A, rd_P(1, 6'h2c, i_pwrmgr.i_reg_top.reset_status_qs))
-
- // read/write assertions for register: wake_info_capture_dis
- `ASSERT(wake_info_capture_dis_wr_A, wr_P(0, 6'h30, i_pwrmgr.reg2hw.wake_info_capture_dis.q, 0))
- `ASSERT(wake_info_capture_dis_rd_A, rd_P(0, 6'h30, i_pwrmgr.reg2hw.wake_info_capture_dis.q))
-
- // read/write assertions for register: wake_info
- `ASSERT(wake_info_wr_A, wr_ext_P(17, 6'h34, i_pwrmgr.reg2hw.wake_info.q, 0))
- `ASSERT(wake_info_rd_A, rd_ext_P(17, 6'h34, i_pwrmgr.hw2reg.wake_info.d))
-
-endmodule
diff --git a/hw/top_earlgrey/top_earlgrey.core b/hw/top_earlgrey/top_earlgrey.core
index 1f4f15b..e018fa9 100644
--- a/hw/top_earlgrey/top_earlgrey.core
+++ b/hw/top_earlgrey/top_earlgrey.core
@@ -109,3 +109,7 @@
parameters:
- SYNTHESIS=true
toplevel: top_earlgrey
+
+ formal:
+ <<: *default_target
+ toplevel: top_earlgrey