caravel/verilog/rtl/chip_io_openframe.v

518 lines
16 KiB
Coq
Raw Normal View History

// 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
/* chip_io_openframe ---
*
* RTL verilog definition of the padframe for the open-frame version
* of the Caravel harness chip, sky130 process
*
* Written by Tim Edwards
* March 27, 2023
*/
// `default_nettype none
module chip_io_openframe #(
parameter USER_PROJECT_ID = 32'h00000000
) (
// Package Pins
inout vddio_pad, // Common padframe/ESD supply
inout vddio_pad2,
inout vssio_pad, // Common padframe/ESD ground
inout vssio_pad2,
inout vccd_pad, // Common 1.8V supply
inout vssd_pad, // Common digital ground
inout vdda_pad, // User area 0 3.3V supply
inout vssa_pad, // User area 0 analog ground
inout vdda1_pad, // User area 1 3.3V supply
inout vdda1_pad2,
inout vdda2_pad, // User area 2 3.3V supply
inout vssa1_pad, // User area 1 analog ground
inout vssa1_pad2,
inout vssa2_pad, // User area 2 analog ground
inout vccd1_pad, // User area 1 1.8V supply
inout vccd2_pad, // User area 2 1.8V supply
inout vssd1_pad, // User area 1 digital ground
inout vssd2_pad, // User area 2 digital ground
// Core Side
inout vddio, // Common padframe/ESD supply
inout vssio, // Common padframe/ESD ground
inout vccd, // Common 1.8V supply
inout vssd, // Common digital ground
inout vdda, // User area 0 3.3V supply
inout vssa, // User area 0 analog ground
inout vdda1, // User area 1 3.3V supply
inout vdda2, // User area 2 3.3V supply
inout vssa1, // User area 1 analog ground
inout vssa2, // User area 2 analog ground
inout vccd1, // User area 1 1.8V supply
inout vccd2, // User area 2 1.8V supply
inout vssd1, // User area 1 digital ground
inout vssd2, // User area 2 digital ground
input resetb_pad,
// Chip Core Interface
output porb_h,
output porb_l,
output por_l,
output resetb_h,
output resetb_l,
output [31:0] mask_rev,
// User project IOs
inout [`OPENFRAME_IO_PADS-1:0] gpio,
input [`OPENFRAME_IO_PADS-1:0] gpio_out,
input [`OPENFRAME_IO_PADS-1:0] gpio_oeb,
input [`OPENFRAME_IO_PADS-1:0] gpio_inp_dis,
input [`OPENFRAME_IO_PADS-1:0] gpio_ib_mode_sel,
input [`OPENFRAME_IO_PADS-1:0] gpio_vtrip_sel,
input [`OPENFRAME_IO_PADS-1:0] gpio_slow_sel,
input [`OPENFRAME_IO_PADS-1:0] gpio_holdover,
input [`OPENFRAME_IO_PADS-1:0] gpio_analog_en,
input [`OPENFRAME_IO_PADS-1:0] gpio_analog_sel,
input [`OPENFRAME_IO_PADS-1:0] gpio_analog_pol,
input [`OPENFRAME_IO_PADS-1:0] gpio_dm0,
input [`OPENFRAME_IO_PADS-1:0] gpio_dm1,
input [`OPENFRAME_IO_PADS-1:0] gpio_dm2,
output [`OPENFRAME_IO_PADS-1:0] gpio_in,
output [`OPENFRAME_IO_PADS-1:0] gpio_in_h,
output [`OPENFRAME_IO_PADS-1:0] gpio_loopback_zero,
output [`OPENFRAME_IO_PADS-1:0] gpio_loopback_one,
inout [`OPENFRAME_IO_PADS-1:0] analog_io,
inout [`OPENFRAME_IO_PADS-1:0] analog_noesd_io
);
// To be considered: Individual hold signals on all GPIO pads
// For now, set holdh_n to 1 internally (NOTE: This is in the
// VDDIO 3.3V domain) and set enh to porb_h for all GPIO pads.
wire [`OPENFRAME_IO_PADS-1:0] gpio_enh;
assign gpio_enh = {`OPENFRAME_IO_PADS{porb_h}};
// Internal bus wires
wire analog_a, analog_b;
wire vddio_q, vssio_q;
// Instantiate power and ground pads for management domain
// 12 pads: vddio, vssio, vdda, vssa, vccd, vssd
// One each HV and LV clamp.
// HV clamps connect between one HV power rail and one ground
// LV clamps have two clamps connecting between any two LV power
// rails and grounds, and one back-to-back diode which connects
// between the first LV clamp ground and any other ground.
sky130_ef_io__vddio_hvc_clamped_pad user0_vddio_hvclamp_pad_0 (
`MGMT_ABUTMENT_PINS
`ifndef TOP_ROUTING
.VDDIO_PAD(vddio_pad)
`endif
);
// lies in user area 2
sky130_ef_io__vddio_hvc_clamped_pad user0_vddio_hvclamp_pad_1 (
`USER2_ABUTMENT_PINS
`ifndef TOP_ROUTING
.VDDIO_PAD(vddio_pad2)
`endif
);
sky130_ef_io__vdda_hvc_clamped_pad user0_vdda_hvclamp_pad (
`MGMT_ABUTMENT_PINS
`ifndef TOP_ROUTING
.VDDA_PAD(vdda_pad)
`endif
);
sky130_ef_io__vccd_lvc_clamped_pad user0_vccd_lvclamp_pad (
`MGMT_ABUTMENT_PINS
`ifndef TOP_ROUTING
.VCCD_PAD(vccd_pad)
`endif
);
sky130_ef_io__vssio_hvc_clamped_pad user0_vssio_hvclamp_pad_0 (
`MGMT_ABUTMENT_PINS
`ifndef TOP_ROUTING
.VSSIO_PAD(vssio_pad)
`endif
);
sky130_ef_io__vssio_hvc_clamped_pad user0_vssio_hvclamp_pad_1 (
`USER2_ABUTMENT_PINS
`ifndef TOP_ROUTING
.VSSIO_PAD(vssio_pad2)
`endif
);
sky130_ef_io__vssa_hvc_clamped_pad user0_vssa_hvclamp_pad (
`MGMT_ABUTMENT_PINS
`ifndef TOP_ROUTING
.VSSA_PAD(vssa_pad)
`endif
);
sky130_ef_io__vssd_lvc_clamped_pad user0_vssd_lvclamp_pad (
`MGMT_ABUTMENT_PINS
`ifndef TOP_ROUTING
.VSSD_PAD(vssd_pad)
`endif
);
// Instantiate power and ground pads for user 1 domain
// 8 pads: vdda, vssa, vccd, vssd; One each HV and LV clamp.
sky130_ef_io__vdda_hvc_clamped_pad user1_vdda_hvclamp_pad_0 (
`USER1_ABUTMENT_PINS
`ifndef TOP_ROUTING
.VDDA_PAD(vdda1_pad)
`endif
);
sky130_ef_io__vdda_hvc_clamped_pad user1_vdda_hvclamp_pad_1 (
`USER1_ABUTMENT_PINS
`ifndef TOP_ROUTING
.VDDA_PAD(vdda1_pad2)
`endif
);
sky130_ef_io__vccd_lvc_clamped3_pad user1_vccd_lvclamp_pad (
`USER1_ABUTMENT_PINS
.VCCD1(vccd1),
.VSSD1(vssd1),
`ifndef TOP_ROUTING
.VCCD_PAD(vccd1_pad)
`endif
);
sky130_ef_io__vssa_hvc_clamped_pad user1_vssa_hvclamp_pad_0 (
`USER1_ABUTMENT_PINS
`ifndef TOP_ROUTING
.VSSA_PAD(vssa1_pad)
`endif
);
sky130_ef_io__vssa_hvc_clamped_pad user1_vssa_hvclamp_pad_1 (
`USER1_ABUTMENT_PINS
`ifndef TOP_ROUTING
.VSSA_PAD(vssa1_pad2)
`endif
);
sky130_ef_io__vssd_lvc_clamped3_pad user1_vssd_lvclamp_pad (
`USER1_ABUTMENT_PINS
.VCCD1(vccd1),
.VSSD1(vssd1),
`ifndef TOP_ROUTING
.VSSD_PAD(vssd1_pad)
`endif
);
// Instantiate power and ground pads for user 2 domain
// 8 pads: vdda, vssa, vccd, vssd; One each HV and LV clamp.
sky130_ef_io__vdda_hvc_clamped_pad user2_vdda_hvclamp_pad (
`USER2_ABUTMENT_PINS
`ifndef TOP_ROUTING
.VDDA_PAD(vdda2_pad)
`endif
);
sky130_ef_io__vccd_lvc_clamped3_pad user2_vccd_lvclamp_pad (
`USER2_ABUTMENT_PINS
.VCCD1(vccd2),
.VSSD1(vssd2),
`ifndef TOP_ROUTING
.VCCD_PAD(vccd2_pad)
`endif
);
sky130_ef_io__vssa_hvc_clamped_pad user2_vssa_hvclamp_pad (
`USER2_ABUTMENT_PINS
`ifndef TOP_ROUTING
.VSSA_PAD(vssa2_pad)
`endif
);
sky130_ef_io__vssd_lvc_clamped3_pad user2_vssd_lvclamp_pad (
`USER2_ABUTMENT_PINS
.VCCD1(vccd2),
.VSSD1(vssd2),
`ifndef TOP_ROUTING
.VSSD_PAD(vssd2_pad)
`endif
);
// Constant values in 1.8V domain to drive constant signals on GPIO pads
// These are exported to the user project for direct loopback if needed.
constant_block constant_value_inst [`OPENFRAME_IO_PADS-1:0] (
.vccd(vccd),
.vssd(vssd),
.one(gpio_loopback_one),
.zero(gpio_loopback_zero)
);
// One additional constant block provides the constant one value
// for the reset pad (see below)
wire xres_loopback_one;
wire xres_loopback_zero;
constant_block constant_value_xres_inst (
.vccd(vccd),
.vssd(vssd),
.one(xres_loopback_one),
.zero(xres_loopback_zero) // (unused)
);
// Master reset pad (only digital pad not assigned as GPIO)
wire xresloop;
wire xres_vss_loop;
sky130_fd_io__top_xres4v2 master_resetb_pad (
`MGMT_ABUTMENT_PINS
`ifndef TOP_ROUTING
.PAD(resetb_pad),
`endif
.TIE_WEAK_HI_H(xresloop), // Loop-back connection to pad through pad_a_esd_h
.TIE_HI_ESD(),
.TIE_LO_ESD(xres_vss_loop),
.PAD_A_ESD_H(xresloop),
.XRES_H_N(resetb_h),
.DISABLE_PULLUP_H(xres_vss_loop), // 0 = enable pull-up on reset pad
.ENABLE_H(porb_h), // Power-on-reset
.EN_VDDIO_SIG_H(xres_vss_loop), // No idea.
.INP_SEL_H(xres_vss_loop), // 1 = use filt_in_h else filter the pad input
.FILT_IN_H(xres_vss_loop), // Alternate input for glitch filter
.PULLUP_H(xres_vss_loop), // Pullup connection for alternate filter input
.ENABLE_VDDIO(xres_loopback_one)
);
// Buffer the reset pad output to generate a signal in the 1.8V domain
xres_buf rstb_level (
`ifdef USE_POWER_PINS
.VPWR(vddio),
.LVPWR(vccd),
.LVGND(vssd),
.VGND(vssio),
`endif
.A(resetb_h),
.X(resetb_l)
);
// Power-on-reset circuit
simple_por por (
`ifdef USE_POWER_PINS
.vdd3v3(vddio),
.vdd1v8(vccd),
.vss3v3(vssio),
.vss1v8(vssd),
`endif
.porb_h(porb_h),
.porb_l(porb_l),
.por_l(por_l)
);
// User ID block
user_id_programming #(
.USER_PROJECT_ID(USER_PROJECT_ID)
) user_id_value (
`ifdef USE_POWER_PINS
.VPWR(vccd),
.VGND(vssd),
`endif
.mask_rev(mask_rev)
);
// Corner cells (These are overlay cells; it is not clear what is normally
// supposed to go under them.)
sky130_ef_io__corner_pad user0_corner [1:0] (
`ifndef TOP_ROUTING
.VSSIO(vssio),
.VDDIO(vddio),
.VDDIO_Q(vddio_q),
.VSSIO_Q(vssio_q),
.AMUXBUS_A(analog_a),
.AMUXBUS_B(analog_b),
.VSSD(vssd),
.VSSA(vssa),
.VSWITCH(vddio),
.VDDA(vdda),
.VCCD(vccd),
.VCCHIB(vccd)
`endif
);
sky130_ef_io__corner_pad user1_corner (
`ifndef TOP_ROUTING
.VSSIO(vssio),
.VDDIO(vddio),
.VDDIO_Q(vddio_q),
.VSSIO_Q(vssio_q),
.AMUXBUS_A(analog_a),
.AMUXBUS_B(analog_b),
.VSSD(vssd),
.VSSA(vssa1),
.VSWITCH(vddio),
.VDDA(vdda1),
.VCCD(vccd),
.VCCHIB(vccd)
`endif
);
sky130_ef_io__corner_pad user2_corner (
`ifndef TOP_ROUTING
.VSSIO(vssio),
.VDDIO(vddio),
.VDDIO_Q(vddio_q),
.VSSIO_Q(vssio_q),
.AMUXBUS_A(analog_a),
.AMUXBUS_B(analog_b),
.VSSD(vssd),
.VSSA(vssa2),
.VSWITCH(vddio),
.VDDA(vdda2),
.VCCD(vccd),
.VCCHIB(vccd)
`endif
);
wire [`OPENFRAME_IO_PADS-1:0] loop0_gpio; // Internal loopback to 3.3V domain ground
wire [`OPENFRAME_IO_PADS-1:0] loop1_gpio; // Internal loopback to 3.3V domain power
/* Digital mode signal DM is the interleaved concatenation of */
/* GPIO signals dm2, dm1, and dm0 when passed to the GPIO pad */
/* array, so generated the concatenated signal dm_all. */
wire [(`OPENFRAME_IO_PADS * 3)-1:0] gpio_dm_all;
genvar i;
generate
for (i = 0; i < `OPENFRAME_IO_PADS; i = i+1) begin
assign gpio_dm_all[(i*3) + 2] = gpio_dm2[i];
assign gpio_dm_all[(i*3) + 1] = gpio_dm1[i];
assign gpio_dm_all[(i*3) + 0] = gpio_dm0[i];
end
endgenerate
/* Openframe pads (right side, power domain 1) */
sky130_ef_io__gpiov2_pad_wrapped area1_gpio_pad [`MPRJ_IO_PADS_1 - 1:0] (
`USER1_ABUTMENT_PINS
`ifndef TOP_ROUTING
.PAD(gpio[`MPRJ_IO_PADS_1 - 1:0]),
`endif
.OUT(gpio_out[`MPRJ_IO_PADS_1 - 1:0]),
.OE_N(gpio_oeb[`MPRJ_IO_PADS_1 - 1:0]),
.HLD_H_N(loop1_gpio[`MPRJ_IO_PADS_1 - 1:0]),
.ENABLE_H(gpio_enh[`MPRJ_IO_PADS_1 - 1:0]),
.ENABLE_INP_H(loop0_gpio[`MPRJ_IO_PADS_1 - 1:0]),
.ENABLE_VDDA_H(porb_h),
.ENABLE_VSWITCH_H(loop0_gpio[`MPRJ_IO_PADS_1 - 1:0]),
.ENABLE_VDDIO(gpio_loopback_one[`MPRJ_IO_PADS_1 - 1:0]),
.INP_DIS(gpio_inp_dis[`MPRJ_IO_PADS_1 - 1:0]),
.IB_MODE_SEL(gpio_ib_mode_sel[`MPRJ_IO_PADS_1 - 1:0]),
.VTRIP_SEL(gpio_vtrip_sel[`MPRJ_IO_PADS_1 - 1:0]),
.SLOW(gpio_slow_sel[`MPRJ_IO_PADS_1 - 1:0]),
.HLD_OVR(gpio_holdover[`MPRJ_IO_PADS_1 - 1:0]),
.ANALOG_EN(gpio_analog_en[`MPRJ_IO_PADS_1 - 1:0]),
.ANALOG_SEL(gpio_analog_sel[`MPRJ_IO_PADS_1 - 1:0]),
.ANALOG_POL(gpio_analog_pol[`MPRJ_IO_PADS_1 - 1:0]),
.DM(gpio_dm_all[(`MPRJ_IO_PADS_1)*3 - 1:0]),
.PAD_A_NOESD_H(analog_noesd_io[`MPRJ_IO_PADS_1 - 1:0]),
.PAD_A_ESD_0_H(analog_io[`MPRJ_IO_PADS_1 - 1:0]),
.PAD_A_ESD_1_H(),
.IN(gpio_in[`MPRJ_IO_PADS_1 - 1:0]),
.IN_H(gpio_in_h[`MPRJ_IO_PADS_1 - 1:0]),
.TIE_HI_ESD(loop1_gpio[`MPRJ_IO_PADS_1 - 1:0]),
.TIE_LO_ESD(loop0_gpio[`MPRJ_IO_PADS_1 - 1:0])
);
/* Openframe pads (left side, power domain 2) */
sky130_ef_io__gpiov2_pad_wrapped area2_gpio_pad [`MPRJ_IO_PADS_2 - 1:0] (
`USER2_ABUTMENT_PINS
`ifndef TOP_ROUTING
.PAD(gpio[`MPRJ_IO_PADS_1 + `MPRJ_IO_PADS_2 - 1:`MPRJ_IO_PADS_1]),
`endif
.OUT(gpio_out[`MPRJ_IO_PADS_1 + `MPRJ_IO_PADS_2 - 1:`MPRJ_IO_PADS_1]),
.OE_N(gpio_oeb[`MPRJ_IO_PADS_1 + `MPRJ_IO_PADS_2 - 1:`MPRJ_IO_PADS_1]),
.HLD_H_N(loop1_gpio[`MPRJ_IO_PADS_1 + `MPRJ_IO_PADS_2 - 1:`MPRJ_IO_PADS_1]),
.ENABLE_H(gpio_enh[`MPRJ_IO_PADS_1 + `MPRJ_IO_PADS_2 - 1:`MPRJ_IO_PADS_1]),
.ENABLE_INP_H(loop0_gpio[`MPRJ_IO_PADS_1 + `MPRJ_IO_PADS_2 - 1:`MPRJ_IO_PADS_1]),
.ENABLE_VDDA_H(porb_h),
.ENABLE_VSWITCH_H(loop0_gpio[`MPRJ_IO_PADS_1 + `MPRJ_IO_PADS_2 - 1:`MPRJ_IO_PADS_1]),
.ENABLE_VDDIO(gpio_loopback_one[`MPRJ_IO_PADS_1 + `MPRJ_IO_PADS_2 - 1:`MPRJ_IO_PADS_1]),
.INP_DIS(gpio_inp_dis[`MPRJ_IO_PADS_1 + `MPRJ_IO_PADS_2 - 1:`MPRJ_IO_PADS_1]),
.IB_MODE_SEL(gpio_ib_mode_sel[`MPRJ_IO_PADS_1 + `MPRJ_IO_PADS_2 - 1:`MPRJ_IO_PADS_1]),
.VTRIP_SEL(gpio_vtrip_sel[`MPRJ_IO_PADS_1 + `MPRJ_IO_PADS_2 - 1:`MPRJ_IO_PADS_1]),
.SLOW(gpio_slow_sel[`MPRJ_IO_PADS_1 + `MPRJ_IO_PADS_2 - 1:`MPRJ_IO_PADS_1]),
.HLD_OVR(gpio_holdover[`MPRJ_IO_PADS_1 + `MPRJ_IO_PADS_2 - 1:`MPRJ_IO_PADS_1]),
.ANALOG_EN(gpio_analog_en[`MPRJ_IO_PADS_1 + `MPRJ_IO_PADS_2 - 1:`MPRJ_IO_PADS_1]),
.ANALOG_SEL(gpio_analog_sel[`MPRJ_IO_PADS_1 + `MPRJ_IO_PADS_2 - 1:`MPRJ_IO_PADS_1]),
.ANALOG_POL(gpio_analog_pol[`MPRJ_IO_PADS_1 + `MPRJ_IO_PADS_2 - 1:`MPRJ_IO_PADS_1]),
.DM(gpio_dm_all[(`MPRJ_IO_PADS_1 + `MPRJ_IO_PADS_2)*3 - 1:(`MPRJ_IO_PADS_1)*3]),
.PAD_A_NOESD_H(analog_noesd_io[`MPRJ_IO_PADS_1 + `MPRJ_IO_PADS_2 - 1:`MPRJ_IO_PADS_1]),
.PAD_A_ESD_0_H(analog_io[`MPRJ_IO_PADS_1 + `MPRJ_IO_PADS_2 - 1:`MPRJ_IO_PADS_1]),
.PAD_A_ESD_1_H(),
.IN(gpio_in[`MPRJ_IO_PADS_1 + `MPRJ_IO_PADS_2 - 1:`MPRJ_IO_PADS_1]),
.IN_H(gpio_in_h[`MPRJ_IO_PADS_1 + `MPRJ_IO_PADS_2 - 1:`MPRJ_IO_PADS_1]),
.TIE_HI_ESD(loop1_gpio[`MPRJ_IO_PADS_1 + `MPRJ_IO_PADS_2 - 1:`MPRJ_IO_PADS_1]),
.TIE_LO_ESD(loop0_gpio[`MPRJ_IO_PADS_1 + `MPRJ_IO_PADS_2 - 1:`MPRJ_IO_PADS_1])
);
/* Openframe pads (bottom side, power domain 0) */
sky130_ef_io__gpiov2_pad_wrapped area0_gpio_pad [`OPENFRAME_IO_PADS - (`MPRJ_IO_PADS_1 + `MPRJ_IO_PADS_2) - 1:0] (
`MGMT_ABUTMENT_PINS
`ifndef TOP_ROUTING
.PAD(gpio[`OPENFRAME_IO_PADS - 1:`MPRJ_IO_PADS_1 + `MPRJ_IO_PADS_2]),
`endif
.OUT(gpio_out[`OPENFRAME_IO_PADS - 1:`MPRJ_IO_PADS_1 + `MPRJ_IO_PADS_2]),
.OE_N(gpio_oeb[`OPENFRAME_IO_PADS - 1:`MPRJ_IO_PADS_1 + `MPRJ_IO_PADS_2]),
.HLD_H_N(loop1_gpio[`OPENFRAME_IO_PADS - 1:`MPRJ_IO_PADS_1 + `MPRJ_IO_PADS_2]),
.ENABLE_H(gpio_enh[`OPENFRAME_IO_PADS - 1:`MPRJ_IO_PADS_1 + `MPRJ_IO_PADS_2]),
.ENABLE_INP_H(loop0_gpio[`OPENFRAME_IO_PADS - 1:`MPRJ_IO_PADS_1 + `MPRJ_IO_PADS_2]),
.ENABLE_VDDA_H(porb_h),
.ENABLE_VSWITCH_H(loop0_gpio[`OPENFRAME_IO_PADS - 1:`MPRJ_IO_PADS_1 + `MPRJ_IO_PADS_2]),
.ENABLE_VDDIO(gpio_loopback_one[`OPENFRAME_IO_PADS - 1:`MPRJ_IO_PADS_1 + `MPRJ_IO_PADS_2]),
.INP_DIS(gpio_inp_dis[`OPENFRAME_IO_PADS - 1:`MPRJ_IO_PADS_1 + `MPRJ_IO_PADS_2]),
.IB_MODE_SEL(gpio_ib_mode_sel[`OPENFRAME_IO_PADS - 1:`MPRJ_IO_PADS_1 + `MPRJ_IO_PADS_2]),
.VTRIP_SEL(gpio_vtrip_sel[`OPENFRAME_IO_PADS - 1:`MPRJ_IO_PADS_1 + `MPRJ_IO_PADS_2]),
.SLOW(gpio_slow_sel[`OPENFRAME_IO_PADS - 1:`MPRJ_IO_PADS_1 + `MPRJ_IO_PADS_2]),
.HLD_OVR(gpio_holdover[`OPENFRAME_IO_PADS - 1:`MPRJ_IO_PADS_1 + `MPRJ_IO_PADS_2]),
.ANALOG_EN(gpio_analog_en[`OPENFRAME_IO_PADS - 1:`MPRJ_IO_PADS_1 + `MPRJ_IO_PADS_2]),
.ANALOG_SEL(gpio_analog_sel[`OPENFRAME_IO_PADS - 1:`MPRJ_IO_PADS_1 + `MPRJ_IO_PADS_2]),
.ANALOG_POL(gpio_analog_pol[`OPENFRAME_IO_PADS - 1:`MPRJ_IO_PADS_1 + `MPRJ_IO_PADS_2]),
.DM(gpio_dm_all[(`OPENFRAME_IO_PADS)*3 - 1:(`MPRJ_IO_PADS_1 + `MPRJ_IO_PADS_2)*3]),
.PAD_A_NOESD_H(analog_noesd_io[`OPENFRAME_IO_PADS - 1:`MPRJ_IO_PADS_1 + `MPRJ_IO_PADS_2]),
.PAD_A_ESD_0_H(analog_io[`OPENFRAME_IO_PADS - 1:`MPRJ_IO_PADS_1 + `MPRJ_IO_PADS_2]),
.PAD_A_ESD_1_H(),
.IN(gpio_in[`OPENFRAME_IO_PADS - 1:`MPRJ_IO_PADS_1 + `MPRJ_IO_PADS_2]),
.IN_H(gpio_in_h[`OPENFRAME_IO_PADS - 1:`MPRJ_IO_PADS_1 + `MPRJ_IO_PADS_2]),
.TIE_HI_ESD(loop1_gpio[`OPENFRAME_IO_PADS - 1:`MPRJ_IO_PADS_1 + `MPRJ_IO_PADS_2]),
.TIE_LO_ESD(loop0_gpio[`OPENFRAME_IO_PADS - 1:`MPRJ_IO_PADS_1 + `MPRJ_IO_PADS_2])
);
endmodule
// `default_nettype wire