| // SPDX-FileCopyrightText: 2020 Efabless Corporation |
| // |
| // Licensed under the Apache License, Version 2.0 (the "License"); |
| // you may not use this file except in compliance with the License. |
| // You may obtain a copy of the License at |
| // |
| // http://www.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, software |
| // distributed under the License is distributed on an "AS IS" BASIS, |
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| // See the License for the specific language governing permissions and |
| // limitations under the License. |
| // SPDX-License-Identifier: Apache-2.0 |
| |
| // `default_nettype none |
| |
| /* Define the array of GPIO pads. Note that the analog project support |
| * version of caravel (caravan) defines fewer GPIO and replaces them |
| * with analog in the chip_io_alt module. Because the pad signalling |
| * remains the same, `MPRJ_IO_PADS does not change, so a local parameter |
| * is made that can be made smaller than `MPRJ_IO_PADS to accommodate |
| * the analog pads. |
| */ |
| |
| module mprj_io #( |
| parameter AREA1PADS = `MPRJ_IO_PADS_1, |
| parameter TOTAL_PADS = `MPRJ_IO_PADS |
| ) ( |
| inout vddio, |
| inout vssio, |
| inout vdda, |
| inout vssa, |
| inout vccd, |
| inout vssd, |
| |
| inout vdda1, |
| inout vdda2, |
| inout vssa1, |
| inout vssa2, |
| |
| input vddio_q, |
| input vssio_q, |
| input analog_a, |
| input analog_b, |
| input porb_h, |
| inout [TOTAL_PADS-1:0] io, |
| input [TOTAL_PADS-1:0] io_out, |
| input [TOTAL_PADS-1:0] oeb, |
| input [TOTAL_PADS-1:0] hldh_n, |
| input [TOTAL_PADS-1:0] enh, |
| input [TOTAL_PADS-1:0] inp_dis, |
| input [TOTAL_PADS-1:0] ib_mode_sel, |
| input [TOTAL_PADS-1:0] vtrip_sel, |
| input [TOTAL_PADS-1:0] slow_sel, |
| input [TOTAL_PADS-1:0] holdover, |
| input [TOTAL_PADS-1:0] analog_en, |
| input [TOTAL_PADS-1:0] analog_sel, |
| input [TOTAL_PADS-1:0] analog_pol, |
| input [TOTAL_PADS*3-1:0] dm, |
| output [TOTAL_PADS-1:0] io_in, |
| output [TOTAL_PADS-1:0] io_in_3v3, |
| inout [TOTAL_PADS-10:0] analog_io, |
| inout [TOTAL_PADS-10:0] analog_noesd_io |
| ); |
| |
| wire [TOTAL_PADS-1:0] loop1_io; |
| wire [6:0] no_connect_1a, no_connect_1b; |
| wire [1:0] no_connect_2a, no_connect_2b; |
| |
| sky130_ef_io__gpiov2_pad_wrapped area1_io_pad [AREA1PADS - 1:0] ( |
| `USER1_ABUTMENT_PINS |
| `ifndef TOP_ROUTING |
| .PAD(io[AREA1PADS - 1:0]), |
| `endif |
| .OUT(io_out[AREA1PADS - 1:0]), |
| .OE_N(oeb[AREA1PADS - 1:0]), |
| .HLD_H_N(hldh_n[AREA1PADS - 1:0]), |
| .ENABLE_H(enh[AREA1PADS - 1:0]), |
| .ENABLE_INP_H(loop1_io[AREA1PADS - 1:0]), |
| .ENABLE_VDDA_H(porb_h), |
| .ENABLE_VSWITCH_H(vssio), |
| .ENABLE_VDDIO(vccd), |
| .INP_DIS(inp_dis[AREA1PADS - 1:0]), |
| .IB_MODE_SEL(ib_mode_sel[AREA1PADS - 1:0]), |
| .VTRIP_SEL(vtrip_sel[AREA1PADS - 1:0]), |
| .SLOW(slow_sel[AREA1PADS - 1:0]), |
| .HLD_OVR(holdover[AREA1PADS - 1:0]), |
| .ANALOG_EN(analog_en[AREA1PADS - 1:0]), |
| .ANALOG_SEL(analog_sel[AREA1PADS - 1:0]), |
| .ANALOG_POL(analog_pol[AREA1PADS - 1:0]), |
| .DM(dm[AREA1PADS*3 - 1:0]), |
| .PAD_A_NOESD_H({analog_noesd_io[AREA1PADS - 8:0], no_connect_1a}), |
| .PAD_A_ESD_0_H({analog_io[AREA1PADS - 8:0], no_connect_1b}), |
| .PAD_A_ESD_1_H(), |
| .IN(io_in[AREA1PADS - 1:0]), |
| .IN_H(io_in_3v3[AREA1PADS - 1:0]), |
| .TIE_HI_ESD(), |
| .TIE_LO_ESD(loop1_io[AREA1PADS - 1:0]) |
| ); |
| |
| sky130_ef_io__gpiov2_pad_wrapped area2_io_pad [TOTAL_PADS - AREA1PADS - 1:0] ( |
| `USER2_ABUTMENT_PINS |
| `ifndef TOP_ROUTING |
| .PAD(io[TOTAL_PADS - 1:AREA1PADS]), |
| `endif |
| .OUT(io_out[TOTAL_PADS - 1:AREA1PADS]), |
| .OE_N(oeb[TOTAL_PADS - 1:AREA1PADS]), |
| .HLD_H_N(hldh_n[TOTAL_PADS - 1:AREA1PADS]), |
| .ENABLE_H(enh[TOTAL_PADS - 1:AREA1PADS]), |
| .ENABLE_INP_H(loop1_io[TOTAL_PADS - 1:AREA1PADS]), |
| .ENABLE_VDDA_H(porb_h), |
| .ENABLE_VSWITCH_H(vssio), |
| .ENABLE_VDDIO(vccd), |
| .INP_DIS(inp_dis[TOTAL_PADS - 1:AREA1PADS]), |
| .IB_MODE_SEL(ib_mode_sel[TOTAL_PADS - 1:AREA1PADS]), |
| .VTRIP_SEL(vtrip_sel[TOTAL_PADS - 1:AREA1PADS]), |
| .SLOW(slow_sel[TOTAL_PADS - 1:AREA1PADS]), |
| .HLD_OVR(holdover[TOTAL_PADS - 1:AREA1PADS]), |
| .ANALOG_EN(analog_en[TOTAL_PADS - 1:AREA1PADS]), |
| .ANALOG_SEL(analog_sel[TOTAL_PADS - 1:AREA1PADS]), |
| .ANALOG_POL(analog_pol[TOTAL_PADS - 1:AREA1PADS]), |
| .DM(dm[TOTAL_PADS*3 - 1:AREA1PADS*3]), |
| .PAD_A_NOESD_H({no_connect_2a, analog_noesd_io[TOTAL_PADS - 10:AREA1PADS - 7]}), |
| .PAD_A_ESD_0_H({no_connect_2b, analog_io[TOTAL_PADS - 10:AREA1PADS - 7]}), |
| .PAD_A_ESD_1_H(), |
| .IN(io_in[TOTAL_PADS - 1:AREA1PADS]), |
| .IN_H(io_in_3v3[TOTAL_PADS - 1:AREA1PADS]), |
| .TIE_HI_ESD(), |
| .TIE_LO_ESD(loop1_io[TOTAL_PADS - 1:AREA1PADS]) |
| ); |
| |
| endmodule |
| // `default_nettype wire |