blob: 1c660e68f84e14432a9c837b0236abcfb952b9cc [file] [log] [blame]
// Copyright lowRISC contributors.
// Licensed under the Apache License, Version 2.0, see LICENSE for details.
// SPDX-License-Identifier: Apache-2.0
//
// Description: RBOX pin visibility and override Module
//
module rbox_pin import rbox_reg_pkg::*; (
input clk_aon_i,
input rst_slow_ni,
input clk_i,
input rst_ni,
input cio_pwrb_in_i,
input cio_key0_in_i,
input cio_key1_in_i,
input cio_key2_in_i,
input cio_ac_present_i,
input cio_ec_rst_l_i,
input pwrb_out_hw,
input key0_out_hw,
input key1_out_hw,
input key2_out_hw,
input bat_disable_hw,
input ec_rst_l_hw,
input rbox_reg2hw_pin_allowed_ctl_reg_t pin_allowed_ctl_i,
input rbox_reg2hw_pin_out_ctl_reg_t pin_out_ctl_i,
input rbox_reg2hw_pin_out_value_reg_t pin_out_value_i,
output rbox_hw2reg_pin_in_value_reg_t pin_in_value_o,
output pwrb_out_int,
output key0_out_int,
output key1_out_int,
output key2_out_int,
output bat_disable_int,
output cio_ec_rst_l_o
);
logic cfg_ac_present_i_pin;
logic cfg_ec_rst_l_i_pin;
logic cfg_pwrb_in_i_pin;
logic cfg_key0_in_i_pin;
logic cfg_key1_in_i_pin;
logic cfg_key2_in_i_pin;
logic cfg_bat_disable_0_allow;
logic cfg_ec_rst_l_0_allow;
logic cfg_pwrb_out_0_allow;
logic cfg_key0_out_0_allow;
logic cfg_key1_out_0_allow;
logic cfg_key2_out_0_allow;
logic cfg_bat_disable_1_allow;
logic cfg_ec_rst_l_1_allow;
logic cfg_pwrb_out_1_allow;
logic cfg_key0_out_1_allow;
logic cfg_key1_out_1_allow;
logic cfg_key2_out_1_allow;
logic cfg_bat_disable_ov;
logic cfg_ec_rst_l_ov;
logic cfg_pwrb_out_ov;
logic cfg_key0_out_ov;
logic cfg_key1_out_ov;
logic cfg_key2_out_ov;
logic cfg_bat_disable_q;
logic cfg_ec_rst_l_q;
logic cfg_pwrb_out_q;
logic cfg_key0_out_q;
logic cfg_key1_out_q;
logic cfg_key2_out_q;
//Synchronize between GPIO and cfg(24MHz)
prim_flop_2sync # (
.Width(1)
) i_cfg_ac_present_i_pin (
.clk_i(clk_i),
.rst_ni(rst_ni),
.d_i(cio_ac_present_i),
.q_o(cfg_ac_present_i_pin)
);
prim_flop_2sync # (
.Width(1)
) i_cfg_ec_rst_l_i_pin (
.clk_i(clk_i),
.rst_ni(rst_ni),
.d_i(cio_ec_rst_l_i),
.q_o(cfg_ec_rst_l_i_pin)
);
prim_flop_2sync # (
.Width(1)
) i_cfg_pwrb_in_i_pin (
.clk_i(clk_i),
.rst_ni(rst_ni),
.d_i(cio_pwrb_in_i),
.q_o(cfg_pwrb_in_i_pin)
);
prim_flop_2sync # (
.Width(1)
) i_cfg_key0_in_i_pin (
.clk_i(clk_i),
.rst_ni(rst_ni),
.d_i(cio_key0_in_i),
.q_o(cfg_key0_in_i_pin)
);
prim_flop_2sync # (
.Width(1)
) i_cfg_key1_in_i_pin (
.clk_i(clk_i),
.rst_ni(rst_ni),
.d_i(cio_key1_in_i),
.q_o(cfg_key1_in_i_pin)
);
prim_flop_2sync # (
.Width(1)
) i_cfg_key2_in_i_pin (
.clk_i(clk_i),
.rst_ni(rst_ni),
.d_i(cio_key2_in_i),
.q_o(cfg_key2_in_i_pin)
);
//Use the raw input(not inverted)
assign pin_in_value_o.ac_present.d = cfg_ac_present_i_pin;
assign pin_in_value_o.ec_rst_l.d = cfg_ec_rst_l_i_pin;
assign pin_in_value_o.pwrb_in.d = cfg_pwrb_in_i_pin;
assign pin_in_value_o.key0_in.d = cfg_key0_in_i_pin;
assign pin_in_value_o.key1_in.d = cfg_key1_in_i_pin;
assign pin_in_value_o.key2_in.d = cfg_key2_in_i_pin;
assign pin_in_value_o.ac_present.de = 1'b1;
assign pin_in_value_o.ec_rst_l.de = 1'b1;
assign pin_in_value_o.pwrb_in.de = 1'b1;
assign pin_in_value_o.key0_in.de = 1'b1;
assign pin_in_value_o.key1_in.de = 1'b1;
assign pin_in_value_o.key2_in.de = 1'b1;
//synchronize between cfg(24MHz) and always-on(200KHz)
prim_flop_2sync # (
.Width(1),
.ResetValue('0)
) i_cfg_bat_disable_0_allow (
.clk_i(clk_aon_i),
.rst_ni(rst_slow_ni),
.d_i(pin_allowed_ctl_i.bat_disable_0.q),
.q_o(cfg_bat_disable_0_allow)
);
prim_flop_2sync # (
.Width(1),
.ResetValue(1'b1)//ec_rst_l_0_allow is enabled by default
) i_cfg_ec_rst_l_0_allow (
.clk_i(clk_aon_i),
.rst_ni(rst_slow_ni),
.d_i(pin_allowed_ctl_i.ec_rst_l_0.q),
.q_o(cfg_ec_rst_l_0_allow)
);
prim_flop_2sync # (
.Width(1),
.ResetValue('0)
) i_cfg_pwrb_out_0_allow (
.clk_i(clk_aon_i),
.rst_ni(rst_slow_ni),
.d_i(pin_allowed_ctl_i.pwrb_out_0.q),
.q_o(cfg_pwrb_out_0_allow)
);
prim_flop_2sync # (
.Width(1),
.ResetValue('0)
) i_cfg_key0_out_0_allow (
.clk_i(clk_aon_i),
.rst_ni(rst_slow_ni),
.d_i(pin_allowed_ctl_i.key0_out_0.q),
.q_o(cfg_key0_out_0_allow)
);
prim_flop_2sync # (
.Width(1),
.ResetValue('0)
) i_cfg_key1_out_0_allow (
.clk_i(clk_aon_i),
.rst_ni(rst_slow_ni),
.d_i(pin_allowed_ctl_i.key1_out_0.q),
.q_o(cfg_key1_out_0_allow)
);
prim_flop_2sync # (
.Width(1),
.ResetValue('0)
) i_cfg_key2_out_0_allow (
.clk_i(clk_aon_i),
.rst_ni(rst_slow_ni),
.d_i(pin_allowed_ctl_i.key2_out_0.q),
.q_o(cfg_key2_out_0_allow)
);
prim_flop_2sync # (
.Width(1),
.ResetValue('0)
) i_cfg_bat_disable_1_allow (
.clk_i(clk_aon_i),
.rst_ni(rst_slow_ni),
.d_i(pin_allowed_ctl_i.bat_disable_1.q),
.q_o(cfg_bat_disable_1_allow)
);
prim_flop_2sync # (
.Width(1),
.ResetValue('0)
) i_cfg_ec_rst_l_1_allow (
.clk_i(clk_aon_i),
.rst_ni(rst_slow_ni),
.d_i(pin_allowed_ctl_i.ec_rst_l_1.q),
.q_o(cfg_ec_rst_l_1_allow)
);
prim_flop_2sync # (
.Width(1),
.ResetValue('0)
) i_cfg_pwrb_out_1_allow (
.clk_i(clk_aon_i),
.rst_ni(rst_slow_ni),
.d_i(pin_allowed_ctl_i.pwrb_out_1.q),
.q_o(cfg_pwrb_out_1_allow)
);
prim_flop_2sync # (
.Width(1),
.ResetValue('0)
) i_cfg_key0_out_1_allow (
.clk_i(clk_aon_i),
.rst_ni(rst_slow_ni),
.d_i(pin_allowed_ctl_i.key0_out_1.q),
.q_o(cfg_key0_out_1_allow)
);
prim_flop_2sync # (
.Width(1),
.ResetValue('0)
) i_cfg_key1_out_1_allow (
.clk_i(clk_aon_i),
.rst_ni(rst_slow_ni),
.d_i(pin_allowed_ctl_i.key1_out_1.q),
.q_o(cfg_key1_out_1_allow)
);
prim_flop_2sync # (
.Width(1),
.ResetValue('0)
) i_cfg_key2_out_1_allow (
.clk_i(clk_aon_i),
.rst_ni(rst_slow_ni),
.d_i(pin_allowed_ctl_i.key2_out_1.q),
.q_o(cfg_key2_out_1_allow)
);
prim_flop_2sync # (
.Width(1),
.ResetValue('0)
) i_cfg_bat_disable_ov (
.clk_i(clk_aon_i),
.rst_ni(rst_slow_ni),
.d_i(pin_out_ctl_i.bat_disable.q),
.q_o(cfg_bat_disable_ov)
);
prim_flop_2sync # (
.Width(1),
.ResetValue(1'b1)//ec_rst_l override is enabled by default
) i_cfg_ec_rst_l_ov (
.clk_i(clk_aon_i),
.rst_ni(rst_slow_ni),
.d_i(pin_out_ctl_i.ec_rst_l.q),
.q_o(cfg_ec_rst_l_ov)
);
prim_flop_2sync # (
.Width(1),
.ResetValue('0)
) i_cfg_pwrb_out_ov (
.clk_i(clk_aon_i),
.rst_ni(rst_slow_ni),
.d_i(pin_out_ctl_i.pwrb_out.q),
.q_o(cfg_pwrb_out_ov)
);
prim_flop_2sync # (
.Width(1),
.ResetValue('0)
) i_cfg_key0_out_ov (
.clk_i(clk_aon_i),
.rst_ni(rst_slow_ni),
.d_i(pin_out_ctl_i.key0_out.q),
.q_o(cfg_key0_out_ov)
);
prim_flop_2sync # (
.Width(1),
.ResetValue('0)
) i_cfg_key1_out_ov (
.clk_i(clk_aon_i),
.rst_ni(rst_slow_ni),
.d_i(pin_out_ctl_i.key1_out.q),
.q_o(cfg_key1_out_ov)
);
prim_flop_2sync # (
.Width(1),
.ResetValue('0)
) i_cfg_key2_out_ov (
.clk_i(clk_aon_i),
.rst_ni(rst_slow_ni),
.d_i(pin_out_ctl_i.key2_out.q),
.q_o(cfg_key2_out_ov)
);
prim_flop_2sync # (
.Width(1),
.ResetValue('0)
) i_cfg_bat_disable_q (
.clk_i(clk_aon_i),
.rst_ni(rst_slow_ni),
.d_i(pin_out_value_i.bat_disable.q),
.q_o(cfg_bat_disable_q)
);
prim_flop_2sync # (
.Width(1),
.ResetValue('0)
) i_cfg_ec_rst_l_q (
.clk_i(clk_aon_i),
.rst_ni(rst_slow_ni),
.d_i(pin_out_value_i.ec_rst_l.q),
.q_o(cfg_ec_rst_l_q)
);
prim_flop_2sync # (
.Width(1),
.ResetValue('0)
) i_cfg_pwrb_out_q (
.clk_i(clk_aon_i),
.rst_ni(rst_slow_ni),
.d_i(pin_out_value_i.pwrb_out.q),
.q_o(cfg_pwrb_out_q)
);
prim_flop_2sync # (
.Width(1),
.ResetValue('0)
) i_cfg_key0_out_q (
.clk_i(clk_aon_i),
.rst_ni(rst_slow_ni),
.d_i(pin_out_value_i.key0_out.q),
.q_o(cfg_key0_out_q)
);
prim_flop_2sync # (
.Width(1),
.ResetValue('0)
) i_cfg_key1_out_q (
.clk_i(clk_aon_i),
.rst_ni(rst_slow_ni),
.d_i(pin_out_value_i.key1_out.q),
.q_o(cfg_key1_out_q)
);
prim_flop_2sync # (
.Width(1),
.ResetValue('0)
) i_cfg_key2_out_q (
.clk_i(clk_aon_i),
.rst_ni(rst_slow_ni),
.d_i(pin_out_value_i.key2_out.q),
.q_o(cfg_key2_out_q)
);
assign pwrb_out_int = (cfg_pwrb_out_ov && cfg_pwrb_out_0_allow && !cfg_pwrb_out_q) ? 1'b0 :
((cfg_pwrb_out_ov && cfg_pwrb_out_1_allow && cfg_pwrb_out_q) ? 1'b1 : pwrb_out_hw);
assign key0_out_int = (cfg_key0_out_ov && cfg_key0_out_0_allow && !cfg_key0_out_q) ? 1'b0 :
((cfg_key0_out_ov && cfg_key0_out_1_allow && cfg_key0_out_q) ? 1'b1 : key0_out_hw);
assign key1_out_int = (cfg_key1_out_ov && cfg_key1_out_0_allow && !cfg_key1_out_q) ? 1'b0 :
((cfg_key1_out_ov && cfg_key1_out_1_allow && cfg_key1_out_q) ? 1'b1 : key1_out_hw);
assign key2_out_int = (cfg_key2_out_ov && cfg_key2_out_0_allow && !cfg_key2_out_q) ? 1'b0 :
((cfg_key2_out_ov && cfg_key2_out_1_allow && cfg_key2_out_q) ? 1'b1 : key2_out_hw);
assign bat_disable_int =
(cfg_bat_disable_ov && cfg_bat_disable_0_allow && !cfg_bat_disable_q) ? 1'b0 :
((cfg_bat_disable_ov && cfg_bat_disable_1_allow && cfg_bat_disable_q) ? 1'b1 :
bat_disable_hw);
assign cio_ec_rst_l_o = (cfg_ec_rst_l_ov && cfg_ec_rst_l_0_allow && !cfg_ec_rst_l_q) ? 1'b0 :
((cfg_ec_rst_l_ov && cfg_ec_rst_l_1_allow && cfg_ec_rst_l_q) ? 1'b1 : ec_rst_l_hw);
endmodule