blob: b5210929395337e16d5226d70833b083d2cff1a5 [file] [log] [blame]
// Copyright lowRISC contributors.
// Licensed under the Apache License, Version 2.0, see LICENSE for details.
// SPDX-License-Identifier: Apache-2.0
//
// sysrst_ctrl module
`include "prim_assert.sv"
module sysrst_ctrl (
input clk_i,//Always-on 24MHz clock(config)
input clk_aon_i,//Always-on 200KHz clock(logic)
input rst_ni,//power-on reset for the 24MHz clock(config)
input rst_aon_ni,//power-on reset for the 200KHz clock(logic)
output gsc_rst_o,//GSC reset to rstmgr
output intr_sysrst_ctrl_o,//sysrst_ctrl interrupt to PLIC
//Regster interface
input tlul_pkg::tl_h2d_t tl_i,
output tlul_pkg::tl_d2h_t tl_o,
//DIO
input cio_ac_present_i,//AC power is present
input cio_ec_rst_in_l_i,//EC reset is asserted by some other system agent
input cio_key0_in_i,//VolUp button in tablet; column output from the EC in a laptop
input cio_key1_in_i,//VolDown button in tablet; row input from keyboard matrix in a laptop
input cio_key2_in_i,//TBD button in tablet; row input from keyboard matrix in a laptop
input cio_pwrb_in_i,//Power button in both tablet and laptop
output logic cio_bat_disable_o,//Battery is disconnected
output logic cio_ec_rst_out_l_o,//EC reset is asserted by sysrst_ctrl
output logic cio_key0_out_o,//Passthrough from key0_in, can be configured to invert
output logic cio_key1_out_o,//Passthrough from key1_in, can be configured to invert
output logic cio_key2_out_o,//Passthrough from key2_in, can be configured to invert
output logic cio_pwrb_out_o,//Passthrough from pwrb_in, can be configured to invert
output logic cio_bat_disable_en_o,
output logic cio_ec_rst_out_l_en_o,
output logic cio_key0_out_en_o,
output logic cio_key1_out_en_o,
output logic cio_key2_out_en_o,
output logic cio_pwrb_out_en_o
);
import sysrst_ctrl_reg_pkg::* ;
sysrst_ctrl_reg2hw_t reg2hw;
sysrst_ctrl_hw2reg_t hw2reg;
logic pwrb_int, key0_int, key1_int, key2_int, ac_present_int;
logic pwrb_out_hw, key0_out_hw, key1_out_hw, key2_out_hw, ec_rst_l_hw, bat_disable_hw;
logic pwrb_out_int, key0_out_int, key1_out_int, key2_out_int, bat_disable_int;
logic sysrst_ctrl_combo_intr, sysrst_ctrl_key_intr;
logic unused_intg_err_o;//FIXME
//Always-on pins
assign cio_ec_rst_out_l_en_o = 1'b1;
assign cio_pwrb_out_en_o = 1'b1;
assign cio_key0_out_en_o = 1'b1;
assign cio_key1_out_en_o = 1'b1;
assign cio_key2_out_en_o = 1'b1;
assign cio_bat_disable_en_o = 1'b1;
// Register module
sysrst_ctrl_reg_top u_reg (
.clk_i(clk_i),
.rst_ni(rst_ni),
.tl_i(tl_i),
.tl_o(tl_o),
.reg2hw(reg2hw),
.hw2reg(hw2reg),
.intg_err_o(unused_intg_err_o),
.devmode_i (1'b1)
);
//Instantiate the autoblock module
sysrst_ctrl_autoblock u_autoblock (
.clk_i(clk_i),
.rst_ni(rst_ni),
.clk_aon_i(clk_aon_i),
.rst_aon_ni(rst_aon_ni),
.pwrb_int(pwrb_int),
.key0_int(key0_int),
.key1_int(key1_int),
.key2_int(key2_int),
.auto_block_debounce_ctl_i(reg2hw.auto_block_debounce_ctl),
.auto_block_out_ctl_i(reg2hw.auto_block_out_ctl),
.pwrb_out_hw(pwrb_out_hw),
.key0_out_hw(key0_out_hw),
.key1_out_hw(key1_out_hw),
.key2_out_hw(key2_out_hw)
);
//Instantiate the pin inversion module
sysrst_ctrl_inv u_inversion (
.clk_aon_i(clk_aon_i),
.rst_aon_ni(rst_aon_ni),
.cio_pwrb_in_i(cio_pwrb_in_i),
.cio_key0_in_i(cio_key0_in_i),
.cio_key1_in_i(cio_key1_in_i),
.cio_key2_in_i(cio_key2_in_i),
.cio_ac_present_i(cio_ac_present_i),
.pwrb_out_int(pwrb_out_int),
.key0_out_int(key0_out_int),
.key1_out_int(key1_out_int),
.key2_out_int(key2_out_int),
.bat_disable_int(bat_disable_int),
.key_invert_ctl_i(reg2hw.key_invert_ctl),
.pwrb_int(pwrb_int),
.key0_int(key0_int),
.key1_int(key1_int),
.key2_int(key2_int),
.ac_present_int(ac_present_int),
.cio_bat_disable_o(cio_bat_disable_o),
.cio_pwrb_out_o(cio_pwrb_out_o),
.cio_key0_out_o(cio_key0_out_o),
.cio_key1_out_o(cio_key1_out_o),
.cio_key2_out_o(cio_key2_out_o)
);
//Instantiate the pin visibility and override module
sysrst_ctrl_pin u_pin_vis_ovd (
.clk_i(clk_i),
.rst_ni(rst_ni),
.clk_aon_i(clk_aon_i),
.rst_aon_ni(rst_aon_ni),
.cio_pwrb_in_i(cio_pwrb_in_i),
.cio_key0_in_i(cio_key0_in_i),
.cio_key1_in_i(cio_key1_in_i),
.cio_key2_in_i(cio_key2_in_i),
.cio_ac_present_i(cio_ac_present_i),
.cio_ec_rst_in_l_i(cio_ec_rst_in_l_i),
.pwrb_out_hw(pwrb_out_hw),
.key0_out_hw(key0_out_hw),
.key1_out_hw(key1_out_hw),
.key2_out_hw(key2_out_hw),
.bat_disable_hw(bat_disable_hw),
.ec_rst_l_hw(ec_rst_l_hw),
.pin_allowed_ctl_i(reg2hw.pin_allowed_ctl),
.pin_out_ctl_i(reg2hw.pin_out_ctl),
.pin_out_value_i(reg2hw.pin_out_value),
.pin_in_value_o(hw2reg.pin_in_value),
.pwrb_out_int(pwrb_out_int),
.key0_out_int(key0_out_int),
.key1_out_int(key1_out_int),
.key2_out_int(key2_out_int),
.bat_disable_int(bat_disable_int),
.cio_ec_rst_out_l_o(cio_ec_rst_out_l_o)
);
//Instantiate key-triggered interrupt module
sysrst_ctrl_keyintr u_keyintr (
.clk_i(clk_i),
.rst_ni(rst_ni),
.clk_aon_i(clk_aon_i),
.rst_aon_ni(rst_aon_ni),
.pwrb_int(pwrb_int),
.key0_int(key0_int),
.key1_int(key1_int),
.key2_int(key2_int),
.ac_present_int(ac_present_int),
.cio_ec_rst_in_l_i(cio_ec_rst_in_l_i),
.key_intr_ctl_i(reg2hw.key_intr_ctl),
.key_intr_debounce_ctl_i(reg2hw.key_intr_debounce_ctl),
.key_intr_status_o(hw2reg.key_intr_status),
.sysrst_ctrl_key_intr(sysrst_ctrl_key_intr)
);
//Instantiate combo module
sysrst_ctrl_combo u_combo (
.clk_i(clk_i),
.rst_ni(rst_ni),
.clk_aon_i(clk_aon_i),
.rst_aon_ni(rst_aon_ni),
.pwrb_int(pwrb_int),
.key0_int(key0_int),
.key1_int(key1_int),
.key2_int(key2_int),
.ac_present_int(ac_present_int),
.cio_ec_rst_in_l_i(cio_ec_rst_in_l_i),
.ec_rst_ctl_i(reg2hw.ec_rst_ctl),
.key_intr_debounce_ctl_i(reg2hw.key_intr_debounce_ctl),
.com_sel_ctl_i(reg2hw.com_sel_ctl),
.com_det_ctl_i(reg2hw.com_det_ctl),
.com_out_ctl_i(reg2hw.com_out_ctl),
.combo_intr_status_o(hw2reg.combo_intr_status),
.sysrst_ctrl_combo_intr(sysrst_ctrl_combo_intr),
.bat_disable_hw(bat_disable_hw),
.gsc_rst_o(gsc_rst_o),
.ec_rst_l_hw(ec_rst_l_hw)
);
//Instantiate the interrupt module
sysrst_ctrl_intr u_intr (
.clk_i(clk_i),
.rst_ni(rst_ni),
.sysrst_ctrl_combo_intr(sysrst_ctrl_combo_intr),
.sysrst_ctrl_key_intr(sysrst_ctrl_key_intr),
.intr_state_i(reg2hw.intr_state),
.intr_enable_i(reg2hw.intr_enable),
.intr_test_i(reg2hw.intr_test),
.intr_state_o(hw2reg.intr_state),
.sysrst_ctrl_intr_o(intr_sysrst_ctrl_o)
);
// All outputs should be known value after reset
`ASSERT_KNOWN(IntrSysRstCtrlOKnown, intr_sysrst_ctrl_o)
// TODO: delete?
//`ASSERT_KNOWN(GSCRstOKnown, gsc_rst_l_o)
`ASSERT_KNOWN(TlODValidKnown, tl_o.d_valid)
`ASSERT_KNOWN(TlOAReadyKnown, tl_o.a_ready)
`ASSERT_KNOWN(BatOKnown, cio_bat_disable_o)
`ASSERT_KNOWN(ECRSTOKnown, cio_ec_rst_out_l_o)
`ASSERT_KNOWN(PwrbOKnown, cio_pwrb_out_o)
`ASSERT_KNOWN(Key0OKnown, cio_key0_out_o)
`ASSERT_KNOWN(Key1OKnown, cio_key1_out_o)
`ASSERT_KNOWN(Key2OKnown, cio_key2_out_o)
`ASSERT_KNOWN(BatOEnKnown, cio_bat_disable_en_o)
`ASSERT_KNOWN(ECRSTOEnKnown, cio_ec_rst_out_l_en_o)
`ASSERT_KNOWN(PwrbOEnKnown, cio_pwrb_out_en_o)
`ASSERT_KNOWN(Key0OEnKnown, cio_key0_out_en_o)
`ASSERT_KNOWN(Key1OEnKnown, cio_key1_out_en_o)
`ASSERT_KNOWN(Key2OEnKnown, cio_key2_out_en_o)
endmodule