diff --git a/.cf/openframe_default.json b/.cf/openframe_default.json new file mode 100644 index 0000000..7c4afb4 --- /dev/null +++ b/.cf/openframe_default.json @@ -0,0 +1,97 @@ +{ + "schema_version": 1, + "gpio": { + "unused_mode": "analog", + "pads": [ + { + "pad": 0, + "mode": "input", + "signal": "clk" + }, + { + "pad": 1, + "mode": "input_pu", + "signal": "rst" + }, + { + "pad": 2, + "mode": "output", + "signal": "out", + "bit": 0 + }, + { + "pad": 3, + "mode": "output", + "signal": "out", + "bit": 1 + }, + { + "pad": 4, + "mode": "output", + "signal": "out", + "bit": 2 + }, + { + "pad": 5, + "mode": "output", + "signal": "out", + "bit": 3 + }, + { + "pad": 6, + "mode": "output", + "signal": "out", + "bit": 4 + }, + { + "pad": 7, + "mode": "output", + "signal": "out", + "bit": 5 + }, + { + "pad": 8, + "mode": "output", + "signal": "out", + "bit": 6 + }, + { + "pad": 9, + "mode": "output", + "signal": "out", + "bit": 7 + }, + { + "pad": 10, + "mode": "output", + "signal": "out", + "bit": 8 + }, + { + "pad": 11, + "mode": "output", + "signal": "out", + "bit": 9 + }, + { + "pad": 12, + "mode": "output", + "signal": "out", + "bit": 10 + } + ] + }, + "power": { + "domains": [ + "vccd1" + ], + "macros": [ + { + "instance": "mprj", + "domain": "vccd1", + "vdd_pin": "vccd1", + "gnd_pin": "vssd1" + } + ] + } +} diff --git a/README.md b/README.md index 9de112c..e43044a 100644 --- a/README.md +++ b/README.md @@ -106,6 +106,48 @@ This is required for GPIO pad configuration and any other IPM-managed blocks in ## Development Flow +### Configuring the GPIO pads and power domains + +The pad configuration and power domains live in one spec, the `project.openframe` block of +`.cf/project.json`. `cf init` seeds it from `.cf/openframe_default.json`, which reproduces the example +timer pinout: + +| Pads | Mode | Signal | +| :--- | :--- | :--- | +| 0 | input | `clk` | +| 1 | input with pull-up | `rst` | +| 2-12 | output | `out[10:0]` | +| 13-43 | analog (unused) | - | + +Power: domain `vccd1`/`vssd1`, feeding macro instance `mprj`. + +Edit the spec, then regenerate the derived files: + +```bash +cf gpio-config # 44-pad grid: mode, signal/bus bit, pad overrides, power (p) +cf gpio-config --view # print the current pinout +cf openframe generate # regenerate after editing or importing the spec +cf openframe generate --check # fail if the generated files are stale (useful in CI) +cf openframe export pinout.yaml # standalone YAML/JSON copy, e.g. for review or the web configurator +cf openframe import pinout.yaml # validate and store a YAML/JSON spec, then regenerate +``` + +Generated files (do not edit by hand; they carry a `spec-sha256` of the spec they came from): + +- `verilog/rtl/openframe_gpio.v`: one `CF_gpio_config` instance per pad. Its user ports are named after + the spec signals (a `bidir` signal `x` becomes `x_in`, `x_out`, `x_oeb`). +- `openlane/openframe_project_wrapper/power.json`: `VDD_NETS`, `GND_NETS` and `PDN_MACRO_CONNECTIONS` + for the wrapper PDN. + +> [!NOTE] +> The current wrapper flow (LibreLane 2.4.x, `config.json`) does not read `power.json` yet; the wrapper +> still uses the single `vccd1`/`vssd1` domain set in `config.json`. Multi-domain power from the spec +> arrives with the LibreLane 3.x wrapper PDN. + +`verilog/rtl/openframe_project_wrapper.v` instantiates `openframe_gpio` and wires its named ports to your +macro. When you rename or add signals in the spec, update those connections in the wrapper. Pads in +`analog` mode have no digital signal; use `analog_io[n]` / `analog_noesd_io[n]` on the wrapper directly. + ### Hardening the Design Hardening is the process of synthesizing your RTL and performing Place & Route (P&R) to create a GDSII layout. @@ -118,7 +160,8 @@ cf harden # Harden a specific macro ``` #### Integration -Instantiate your module(s) in `verilog/rtl/openframe_project_wrapper.v`. +Instantiate your module(s) in `verilog/rtl/openframe_project_wrapper.v` and connect them to the named +ports of the generated `openframe_gpio` instance (see above). Update `openlane/openframe_project_wrapper/config.json` environment variables (`VERILOG_FILES_BLACKBOX`, `EXTRA_LEFS`, `EXTRA_GDS_FILES`) to point to your new macros. diff --git a/ip/dependencies.json b/ip/dependencies.json index 831b646..e44df29 100644 --- a/ip/dependencies.json +++ b/ip/dependencies.json @@ -1,7 +1,7 @@ { "IP": [ { - "CF_gpio_config": "v1.1.4" + "CF_gpio_config": "v1.2.0" } ] } diff --git a/openlane/openframe_project_wrapper/config.json b/openlane/openframe_project_wrapper/config.json index b75d267..1561483 100644 --- a/openlane/openframe_project_wrapper/config.json +++ b/openlane/openframe_project_wrapper/config.json @@ -4,6 +4,7 @@ "VERILOG_FILES": [ "dir::/../../verilog/rtl/openframe_project_netlists.v", "dir::/../../verilog/rtl/openframe_project_wrapper.v", + "dir::/../../verilog/rtl/openframe_gpio.v", "dir::../../ip/CF_gpio_config/rtl/CF_gpio_config.v" ], "VERILOG_FILES_BLACKBOX": [ diff --git a/openlane/openframe_project_wrapper/power.json b/openlane/openframe_project_wrapper/power.json new file mode 100644 index 0000000..c00a3eb --- /dev/null +++ b/openlane/openframe_project_wrapper/power.json @@ -0,0 +1,13 @@ +{ + "//": "Generated by `cf openframe generate` from project.openframe.power in .cf/project.json. Do not edit.", + "// spec-sha256": "151733931264b0fe1416e572d7fd11d76a4effdec5bf42e1cd0eb14fcdb1db11", + "VDD_NETS": [ + "vccd1" + ], + "GND_NETS": [ + "vssd1" + ], + "PDN_MACRO_CONNECTIONS": [ + "mprj vccd1 vssd1 vccd1 vssd1" + ] +} diff --git a/verilog/includes/includes.rtl.caravel_user_project b/verilog/includes/includes.rtl.caravel_user_project index 656289d..5d4c9a2 100644 --- a/verilog/includes/includes.rtl.caravel_user_project +++ b/verilog/includes/includes.rtl.caravel_user_project @@ -1,6 +1,7 @@ # Caravel user project includes -v $(USER_PROJECT_VERILOG)/dv/firmware/spiflash.v -v $(USER_PROJECT_VERILOG)/../ip/CF_gpio_config/rtl/CF_gpio_config.v +-v $(USER_PROJECT_VERILOG)/rtl/openframe_gpio.v -v $(USER_PROJECT_VERILOG)/rtl/openframe_project_wrapper.v -v $(USER_PROJECT_VERILOG)/rtl/picosoc.v -v $(USER_PROJECT_VERILOG)/rtl/picorv32.v diff --git a/verilog/rtl/openframe_gpio.v b/verilog/rtl/openframe_gpio.v new file mode 100644 index 0000000..e52a88f --- /dev/null +++ b/verilog/rtl/openframe_gpio.v @@ -0,0 +1,1101 @@ +// ----------------------------------------------------------------------------- +// openframe_gpio +// +// GENERATED FILE - DO NOT EDIT. +// Generated by `cf openframe generate` from the +// project.openframe block in .cf/project.json. Edit the spec with +// `cf gpio-config` or `cf openframe import`, then regenerate. +// spec-sha256: 151733931264b0fe1416e572d7fd11d76a4effdec5bf42e1cd0eb14fcdb1db11 +// +// Pad map: +// pad 0 input clk +// pad 1 input_pu rst +// pad 2 output out[0] +// pad 3 output out[1] +// pad 4 output out[2] +// pad 5 output out[3] +// pad 6 output out[4] +// pad 7 output out[5] +// pad 8 output out[6] +// pad 9 output out[7] +// pad 10 output out[8] +// pad 11 output out[9] +// pad 12 output out[10] +// pad 13 analog (unused) +// pad 14 analog (unused) +// pad 15 analog (unused) +// pad 16 analog (unused) +// pad 17 analog (unused) +// pad 18 analog (unused) +// pad 19 analog (unused) +// pad 20 analog (unused) +// pad 21 analog (unused) +// pad 22 analog (unused) +// pad 23 analog (unused) +// pad 24 analog (unused) +// pad 25 analog (unused) +// pad 26 analog (unused) +// pad 27 analog (unused) +// pad 28 analog (unused) +// pad 29 analog (unused) +// pad 30 analog (unused) +// pad 31 analog (unused) +// pad 32 analog (unused) +// pad 33 analog (unused) +// pad 34 analog (unused) +// pad 35 analog (unused) +// pad 36 analog (unused) +// pad 37 analog (unused) +// pad 38 analog (unused) +// pad 39 analog (unused) +// pad 40 analog (unused) +// pad 41 analog (unused) +// pad 42 analog (unused) +// pad 43 analog (unused) +// ----------------------------------------------------------------------------- + +`default_nettype none + +// io_in is left open on pads that have no input signal. +/* verilator lint_off PINCONNECTEMPTY */ +module openframe_gpio ( + // User design ports + output wire clk, + output wire rst, + input wire [10:0] out, + + // Openframe pad interface: connect to the openframe_project_wrapper ports of the same name + input wire [43:0] gpio_in, + output wire [43:0] gpio_out, + output wire [43:0] gpio_oeb, + output wire [43:0] gpio_inp_dis, + output wire [43:0] gpio_ib_mode_sel, + output wire [43:0] gpio_vtrip_sel, + output wire [43:0] gpio_slow_sel, + output wire [43:0] gpio_holdover, + output wire [43:0] gpio_analog_en, + output wire [43:0] gpio_analog_sel, + output wire [43:0] gpio_analog_pol, + output wire [43:0] gpio_dm2, + output wire [43:0] gpio_dm1, + output wire [43:0] gpio_dm0, + input wire [43:0] gpio_loopback_one, + input wire [43:0] gpio_loopback_zero +); + + // pad 0: input clk + CF_gpio_config #( + .MODE(3'd1) + ) gpio_cfg_00 ( + .io_out (gpio_loopback_zero[0]), + .io_in (clk), + .io_oeb (gpio_loopback_one[0]), + .gpio_zero (gpio_loopback_zero[0]), + .gpio_one (gpio_loopback_one[0]), + .gpio_in (gpio_in[0]), + .gpio_dm ({gpio_dm2[0], gpio_dm1[0], gpio_dm0[0]}), + .gpio_inp_dis (gpio_inp_dis[0]), + .gpio_oeb_out (gpio_oeb[0]), + .gpio_out_val (gpio_out[0]), + .gpio_analog_en (gpio_analog_en[0]), + .gpio_analog_sel (gpio_analog_sel[0]), + .gpio_analog_pol (gpio_analog_pol[0]), + .gpio_ib_mode_sel (gpio_ib_mode_sel[0]), + .gpio_vtrip_sel (gpio_vtrip_sel[0]), + .gpio_slow_sel (gpio_slow_sel[0]), + .gpio_holdover (gpio_holdover[0]) + ); + + // pad 1: input_pu rst + CF_gpio_config #( + .MODE(3'd3) + ) gpio_cfg_01 ( + .io_out (gpio_loopback_zero[1]), + .io_in (rst), + .io_oeb (gpio_loopback_one[1]), + .gpio_zero (gpio_loopback_zero[1]), + .gpio_one (gpio_loopback_one[1]), + .gpio_in (gpio_in[1]), + .gpio_dm ({gpio_dm2[1], gpio_dm1[1], gpio_dm0[1]}), + .gpio_inp_dis (gpio_inp_dis[1]), + .gpio_oeb_out (gpio_oeb[1]), + .gpio_out_val (gpio_out[1]), + .gpio_analog_en (gpio_analog_en[1]), + .gpio_analog_sel (gpio_analog_sel[1]), + .gpio_analog_pol (gpio_analog_pol[1]), + .gpio_ib_mode_sel (gpio_ib_mode_sel[1]), + .gpio_vtrip_sel (gpio_vtrip_sel[1]), + .gpio_slow_sel (gpio_slow_sel[1]), + .gpio_holdover (gpio_holdover[1]) + ); + + // pad 2: output out[0] + CF_gpio_config #( + .MODE(3'd4) + ) gpio_cfg_02 ( + .io_out (out[0]), + .io_in (), + .io_oeb (gpio_loopback_one[2]), + .gpio_zero (gpio_loopback_zero[2]), + .gpio_one (gpio_loopback_one[2]), + .gpio_in (gpio_in[2]), + .gpio_dm ({gpio_dm2[2], gpio_dm1[2], gpio_dm0[2]}), + .gpio_inp_dis (gpio_inp_dis[2]), + .gpio_oeb_out (gpio_oeb[2]), + .gpio_out_val (gpio_out[2]), + .gpio_analog_en (gpio_analog_en[2]), + .gpio_analog_sel (gpio_analog_sel[2]), + .gpio_analog_pol (gpio_analog_pol[2]), + .gpio_ib_mode_sel (gpio_ib_mode_sel[2]), + .gpio_vtrip_sel (gpio_vtrip_sel[2]), + .gpio_slow_sel (gpio_slow_sel[2]), + .gpio_holdover (gpio_holdover[2]) + ); + + // pad 3: output out[1] + CF_gpio_config #( + .MODE(3'd4) + ) gpio_cfg_03 ( + .io_out (out[1]), + .io_in (), + .io_oeb (gpio_loopback_one[3]), + .gpio_zero (gpio_loopback_zero[3]), + .gpio_one (gpio_loopback_one[3]), + .gpio_in (gpio_in[3]), + .gpio_dm ({gpio_dm2[3], gpio_dm1[3], gpio_dm0[3]}), + .gpio_inp_dis (gpio_inp_dis[3]), + .gpio_oeb_out (gpio_oeb[3]), + .gpio_out_val (gpio_out[3]), + .gpio_analog_en (gpio_analog_en[3]), + .gpio_analog_sel (gpio_analog_sel[3]), + .gpio_analog_pol (gpio_analog_pol[3]), + .gpio_ib_mode_sel (gpio_ib_mode_sel[3]), + .gpio_vtrip_sel (gpio_vtrip_sel[3]), + .gpio_slow_sel (gpio_slow_sel[3]), + .gpio_holdover (gpio_holdover[3]) + ); + + // pad 4: output out[2] + CF_gpio_config #( + .MODE(3'd4) + ) gpio_cfg_04 ( + .io_out (out[2]), + .io_in (), + .io_oeb (gpio_loopback_one[4]), + .gpio_zero (gpio_loopback_zero[4]), + .gpio_one (gpio_loopback_one[4]), + .gpio_in (gpio_in[4]), + .gpio_dm ({gpio_dm2[4], gpio_dm1[4], gpio_dm0[4]}), + .gpio_inp_dis (gpio_inp_dis[4]), + .gpio_oeb_out (gpio_oeb[4]), + .gpio_out_val (gpio_out[4]), + .gpio_analog_en (gpio_analog_en[4]), + .gpio_analog_sel (gpio_analog_sel[4]), + .gpio_analog_pol (gpio_analog_pol[4]), + .gpio_ib_mode_sel (gpio_ib_mode_sel[4]), + .gpio_vtrip_sel (gpio_vtrip_sel[4]), + .gpio_slow_sel (gpio_slow_sel[4]), + .gpio_holdover (gpio_holdover[4]) + ); + + // pad 5: output out[3] + CF_gpio_config #( + .MODE(3'd4) + ) gpio_cfg_05 ( + .io_out (out[3]), + .io_in (), + .io_oeb (gpio_loopback_one[5]), + .gpio_zero (gpio_loopback_zero[5]), + .gpio_one (gpio_loopback_one[5]), + .gpio_in (gpio_in[5]), + .gpio_dm ({gpio_dm2[5], gpio_dm1[5], gpio_dm0[5]}), + .gpio_inp_dis (gpio_inp_dis[5]), + .gpio_oeb_out (gpio_oeb[5]), + .gpio_out_val (gpio_out[5]), + .gpio_analog_en (gpio_analog_en[5]), + .gpio_analog_sel (gpio_analog_sel[5]), + .gpio_analog_pol (gpio_analog_pol[5]), + .gpio_ib_mode_sel (gpio_ib_mode_sel[5]), + .gpio_vtrip_sel (gpio_vtrip_sel[5]), + .gpio_slow_sel (gpio_slow_sel[5]), + .gpio_holdover (gpio_holdover[5]) + ); + + // pad 6: output out[4] + CF_gpio_config #( + .MODE(3'd4) + ) gpio_cfg_06 ( + .io_out (out[4]), + .io_in (), + .io_oeb (gpio_loopback_one[6]), + .gpio_zero (gpio_loopback_zero[6]), + .gpio_one (gpio_loopback_one[6]), + .gpio_in (gpio_in[6]), + .gpio_dm ({gpio_dm2[6], gpio_dm1[6], gpio_dm0[6]}), + .gpio_inp_dis (gpio_inp_dis[6]), + .gpio_oeb_out (gpio_oeb[6]), + .gpio_out_val (gpio_out[6]), + .gpio_analog_en (gpio_analog_en[6]), + .gpio_analog_sel (gpio_analog_sel[6]), + .gpio_analog_pol (gpio_analog_pol[6]), + .gpio_ib_mode_sel (gpio_ib_mode_sel[6]), + .gpio_vtrip_sel (gpio_vtrip_sel[6]), + .gpio_slow_sel (gpio_slow_sel[6]), + .gpio_holdover (gpio_holdover[6]) + ); + + // pad 7: output out[5] + CF_gpio_config #( + .MODE(3'd4) + ) gpio_cfg_07 ( + .io_out (out[5]), + .io_in (), + .io_oeb (gpio_loopback_one[7]), + .gpio_zero (gpio_loopback_zero[7]), + .gpio_one (gpio_loopback_one[7]), + .gpio_in (gpio_in[7]), + .gpio_dm ({gpio_dm2[7], gpio_dm1[7], gpio_dm0[7]}), + .gpio_inp_dis (gpio_inp_dis[7]), + .gpio_oeb_out (gpio_oeb[7]), + .gpio_out_val (gpio_out[7]), + .gpio_analog_en (gpio_analog_en[7]), + .gpio_analog_sel (gpio_analog_sel[7]), + .gpio_analog_pol (gpio_analog_pol[7]), + .gpio_ib_mode_sel (gpio_ib_mode_sel[7]), + .gpio_vtrip_sel (gpio_vtrip_sel[7]), + .gpio_slow_sel (gpio_slow_sel[7]), + .gpio_holdover (gpio_holdover[7]) + ); + + // pad 8: output out[6] + CF_gpio_config #( + .MODE(3'd4) + ) gpio_cfg_08 ( + .io_out (out[6]), + .io_in (), + .io_oeb (gpio_loopback_one[8]), + .gpio_zero (gpio_loopback_zero[8]), + .gpio_one (gpio_loopback_one[8]), + .gpio_in (gpio_in[8]), + .gpio_dm ({gpio_dm2[8], gpio_dm1[8], gpio_dm0[8]}), + .gpio_inp_dis (gpio_inp_dis[8]), + .gpio_oeb_out (gpio_oeb[8]), + .gpio_out_val (gpio_out[8]), + .gpio_analog_en (gpio_analog_en[8]), + .gpio_analog_sel (gpio_analog_sel[8]), + .gpio_analog_pol (gpio_analog_pol[8]), + .gpio_ib_mode_sel (gpio_ib_mode_sel[8]), + .gpio_vtrip_sel (gpio_vtrip_sel[8]), + .gpio_slow_sel (gpio_slow_sel[8]), + .gpio_holdover (gpio_holdover[8]) + ); + + // pad 9: output out[7] + CF_gpio_config #( + .MODE(3'd4) + ) gpio_cfg_09 ( + .io_out (out[7]), + .io_in (), + .io_oeb (gpio_loopback_one[9]), + .gpio_zero (gpio_loopback_zero[9]), + .gpio_one (gpio_loopback_one[9]), + .gpio_in (gpio_in[9]), + .gpio_dm ({gpio_dm2[9], gpio_dm1[9], gpio_dm0[9]}), + .gpio_inp_dis (gpio_inp_dis[9]), + .gpio_oeb_out (gpio_oeb[9]), + .gpio_out_val (gpio_out[9]), + .gpio_analog_en (gpio_analog_en[9]), + .gpio_analog_sel (gpio_analog_sel[9]), + .gpio_analog_pol (gpio_analog_pol[9]), + .gpio_ib_mode_sel (gpio_ib_mode_sel[9]), + .gpio_vtrip_sel (gpio_vtrip_sel[9]), + .gpio_slow_sel (gpio_slow_sel[9]), + .gpio_holdover (gpio_holdover[9]) + ); + + // pad 10: output out[8] + CF_gpio_config #( + .MODE(3'd4) + ) gpio_cfg_10 ( + .io_out (out[8]), + .io_in (), + .io_oeb (gpio_loopback_one[10]), + .gpio_zero (gpio_loopback_zero[10]), + .gpio_one (gpio_loopback_one[10]), + .gpio_in (gpio_in[10]), + .gpio_dm ({gpio_dm2[10], gpio_dm1[10], gpio_dm0[10]}), + .gpio_inp_dis (gpio_inp_dis[10]), + .gpio_oeb_out (gpio_oeb[10]), + .gpio_out_val (gpio_out[10]), + .gpio_analog_en (gpio_analog_en[10]), + .gpio_analog_sel (gpio_analog_sel[10]), + .gpio_analog_pol (gpio_analog_pol[10]), + .gpio_ib_mode_sel (gpio_ib_mode_sel[10]), + .gpio_vtrip_sel (gpio_vtrip_sel[10]), + .gpio_slow_sel (gpio_slow_sel[10]), + .gpio_holdover (gpio_holdover[10]) + ); + + // pad 11: output out[9] + CF_gpio_config #( + .MODE(3'd4) + ) gpio_cfg_11 ( + .io_out (out[9]), + .io_in (), + .io_oeb (gpio_loopback_one[11]), + .gpio_zero (gpio_loopback_zero[11]), + .gpio_one (gpio_loopback_one[11]), + .gpio_in (gpio_in[11]), + .gpio_dm ({gpio_dm2[11], gpio_dm1[11], gpio_dm0[11]}), + .gpio_inp_dis (gpio_inp_dis[11]), + .gpio_oeb_out (gpio_oeb[11]), + .gpio_out_val (gpio_out[11]), + .gpio_analog_en (gpio_analog_en[11]), + .gpio_analog_sel (gpio_analog_sel[11]), + .gpio_analog_pol (gpio_analog_pol[11]), + .gpio_ib_mode_sel (gpio_ib_mode_sel[11]), + .gpio_vtrip_sel (gpio_vtrip_sel[11]), + .gpio_slow_sel (gpio_slow_sel[11]), + .gpio_holdover (gpio_holdover[11]) + ); + + // pad 12: output out[10] + CF_gpio_config #( + .MODE(3'd4) + ) gpio_cfg_12 ( + .io_out (out[10]), + .io_in (), + .io_oeb (gpio_loopback_one[12]), + .gpio_zero (gpio_loopback_zero[12]), + .gpio_one (gpio_loopback_one[12]), + .gpio_in (gpio_in[12]), + .gpio_dm ({gpio_dm2[12], gpio_dm1[12], gpio_dm0[12]}), + .gpio_inp_dis (gpio_inp_dis[12]), + .gpio_oeb_out (gpio_oeb[12]), + .gpio_out_val (gpio_out[12]), + .gpio_analog_en (gpio_analog_en[12]), + .gpio_analog_sel (gpio_analog_sel[12]), + .gpio_analog_pol (gpio_analog_pol[12]), + .gpio_ib_mode_sel (gpio_ib_mode_sel[12]), + .gpio_vtrip_sel (gpio_vtrip_sel[12]), + .gpio_slow_sel (gpio_slow_sel[12]), + .gpio_holdover (gpio_holdover[12]) + ); + + // pad 13: analog (unused) + CF_gpio_config #( + .MODE(3'd0) + ) gpio_cfg_13 ( + .io_out (gpio_loopback_zero[13]), + .io_in (), + .io_oeb (gpio_loopback_one[13]), + .gpio_zero (gpio_loopback_zero[13]), + .gpio_one (gpio_loopback_one[13]), + .gpio_in (gpio_in[13]), + .gpio_dm ({gpio_dm2[13], gpio_dm1[13], gpio_dm0[13]}), + .gpio_inp_dis (gpio_inp_dis[13]), + .gpio_oeb_out (gpio_oeb[13]), + .gpio_out_val (gpio_out[13]), + .gpio_analog_en (gpio_analog_en[13]), + .gpio_analog_sel (gpio_analog_sel[13]), + .gpio_analog_pol (gpio_analog_pol[13]), + .gpio_ib_mode_sel (gpio_ib_mode_sel[13]), + .gpio_vtrip_sel (gpio_vtrip_sel[13]), + .gpio_slow_sel (gpio_slow_sel[13]), + .gpio_holdover (gpio_holdover[13]) + ); + + // pad 14: analog (unused) + CF_gpio_config #( + .MODE(3'd0) + ) gpio_cfg_14 ( + .io_out (gpio_loopback_zero[14]), + .io_in (), + .io_oeb (gpio_loopback_one[14]), + .gpio_zero (gpio_loopback_zero[14]), + .gpio_one (gpio_loopback_one[14]), + .gpio_in (gpio_in[14]), + .gpio_dm ({gpio_dm2[14], gpio_dm1[14], gpio_dm0[14]}), + .gpio_inp_dis (gpio_inp_dis[14]), + .gpio_oeb_out (gpio_oeb[14]), + .gpio_out_val (gpio_out[14]), + .gpio_analog_en (gpio_analog_en[14]), + .gpio_analog_sel (gpio_analog_sel[14]), + .gpio_analog_pol (gpio_analog_pol[14]), + .gpio_ib_mode_sel (gpio_ib_mode_sel[14]), + .gpio_vtrip_sel (gpio_vtrip_sel[14]), + .gpio_slow_sel (gpio_slow_sel[14]), + .gpio_holdover (gpio_holdover[14]) + ); + + // pad 15: analog (unused) + CF_gpio_config #( + .MODE(3'd0) + ) gpio_cfg_15 ( + .io_out (gpio_loopback_zero[15]), + .io_in (), + .io_oeb (gpio_loopback_one[15]), + .gpio_zero (gpio_loopback_zero[15]), + .gpio_one (gpio_loopback_one[15]), + .gpio_in (gpio_in[15]), + .gpio_dm ({gpio_dm2[15], gpio_dm1[15], gpio_dm0[15]}), + .gpio_inp_dis (gpio_inp_dis[15]), + .gpio_oeb_out (gpio_oeb[15]), + .gpio_out_val (gpio_out[15]), + .gpio_analog_en (gpio_analog_en[15]), + .gpio_analog_sel (gpio_analog_sel[15]), + .gpio_analog_pol (gpio_analog_pol[15]), + .gpio_ib_mode_sel (gpio_ib_mode_sel[15]), + .gpio_vtrip_sel (gpio_vtrip_sel[15]), + .gpio_slow_sel (gpio_slow_sel[15]), + .gpio_holdover (gpio_holdover[15]) + ); + + // pad 16: analog (unused) + CF_gpio_config #( + .MODE(3'd0) + ) gpio_cfg_16 ( + .io_out (gpio_loopback_zero[16]), + .io_in (), + .io_oeb (gpio_loopback_one[16]), + .gpio_zero (gpio_loopback_zero[16]), + .gpio_one (gpio_loopback_one[16]), + .gpio_in (gpio_in[16]), + .gpio_dm ({gpio_dm2[16], gpio_dm1[16], gpio_dm0[16]}), + .gpio_inp_dis (gpio_inp_dis[16]), + .gpio_oeb_out (gpio_oeb[16]), + .gpio_out_val (gpio_out[16]), + .gpio_analog_en (gpio_analog_en[16]), + .gpio_analog_sel (gpio_analog_sel[16]), + .gpio_analog_pol (gpio_analog_pol[16]), + .gpio_ib_mode_sel (gpio_ib_mode_sel[16]), + .gpio_vtrip_sel (gpio_vtrip_sel[16]), + .gpio_slow_sel (gpio_slow_sel[16]), + .gpio_holdover (gpio_holdover[16]) + ); + + // pad 17: analog (unused) + CF_gpio_config #( + .MODE(3'd0) + ) gpio_cfg_17 ( + .io_out (gpio_loopback_zero[17]), + .io_in (), + .io_oeb (gpio_loopback_one[17]), + .gpio_zero (gpio_loopback_zero[17]), + .gpio_one (gpio_loopback_one[17]), + .gpio_in (gpio_in[17]), + .gpio_dm ({gpio_dm2[17], gpio_dm1[17], gpio_dm0[17]}), + .gpio_inp_dis (gpio_inp_dis[17]), + .gpio_oeb_out (gpio_oeb[17]), + .gpio_out_val (gpio_out[17]), + .gpio_analog_en (gpio_analog_en[17]), + .gpio_analog_sel (gpio_analog_sel[17]), + .gpio_analog_pol (gpio_analog_pol[17]), + .gpio_ib_mode_sel (gpio_ib_mode_sel[17]), + .gpio_vtrip_sel (gpio_vtrip_sel[17]), + .gpio_slow_sel (gpio_slow_sel[17]), + .gpio_holdover (gpio_holdover[17]) + ); + + // pad 18: analog (unused) + CF_gpio_config #( + .MODE(3'd0) + ) gpio_cfg_18 ( + .io_out (gpio_loopback_zero[18]), + .io_in (), + .io_oeb (gpio_loopback_one[18]), + .gpio_zero (gpio_loopback_zero[18]), + .gpio_one (gpio_loopback_one[18]), + .gpio_in (gpio_in[18]), + .gpio_dm ({gpio_dm2[18], gpio_dm1[18], gpio_dm0[18]}), + .gpio_inp_dis (gpio_inp_dis[18]), + .gpio_oeb_out (gpio_oeb[18]), + .gpio_out_val (gpio_out[18]), + .gpio_analog_en (gpio_analog_en[18]), + .gpio_analog_sel (gpio_analog_sel[18]), + .gpio_analog_pol (gpio_analog_pol[18]), + .gpio_ib_mode_sel (gpio_ib_mode_sel[18]), + .gpio_vtrip_sel (gpio_vtrip_sel[18]), + .gpio_slow_sel (gpio_slow_sel[18]), + .gpio_holdover (gpio_holdover[18]) + ); + + // pad 19: analog (unused) + CF_gpio_config #( + .MODE(3'd0) + ) gpio_cfg_19 ( + .io_out (gpio_loopback_zero[19]), + .io_in (), + .io_oeb (gpio_loopback_one[19]), + .gpio_zero (gpio_loopback_zero[19]), + .gpio_one (gpio_loopback_one[19]), + .gpio_in (gpio_in[19]), + .gpio_dm ({gpio_dm2[19], gpio_dm1[19], gpio_dm0[19]}), + .gpio_inp_dis (gpio_inp_dis[19]), + .gpio_oeb_out (gpio_oeb[19]), + .gpio_out_val (gpio_out[19]), + .gpio_analog_en (gpio_analog_en[19]), + .gpio_analog_sel (gpio_analog_sel[19]), + .gpio_analog_pol (gpio_analog_pol[19]), + .gpio_ib_mode_sel (gpio_ib_mode_sel[19]), + .gpio_vtrip_sel (gpio_vtrip_sel[19]), + .gpio_slow_sel (gpio_slow_sel[19]), + .gpio_holdover (gpio_holdover[19]) + ); + + // pad 20: analog (unused) + CF_gpio_config #( + .MODE(3'd0) + ) gpio_cfg_20 ( + .io_out (gpio_loopback_zero[20]), + .io_in (), + .io_oeb (gpio_loopback_one[20]), + .gpio_zero (gpio_loopback_zero[20]), + .gpio_one (gpio_loopback_one[20]), + .gpio_in (gpio_in[20]), + .gpio_dm ({gpio_dm2[20], gpio_dm1[20], gpio_dm0[20]}), + .gpio_inp_dis (gpio_inp_dis[20]), + .gpio_oeb_out (gpio_oeb[20]), + .gpio_out_val (gpio_out[20]), + .gpio_analog_en (gpio_analog_en[20]), + .gpio_analog_sel (gpio_analog_sel[20]), + .gpio_analog_pol (gpio_analog_pol[20]), + .gpio_ib_mode_sel (gpio_ib_mode_sel[20]), + .gpio_vtrip_sel (gpio_vtrip_sel[20]), + .gpio_slow_sel (gpio_slow_sel[20]), + .gpio_holdover (gpio_holdover[20]) + ); + + // pad 21: analog (unused) + CF_gpio_config #( + .MODE(3'd0) + ) gpio_cfg_21 ( + .io_out (gpio_loopback_zero[21]), + .io_in (), + .io_oeb (gpio_loopback_one[21]), + .gpio_zero (gpio_loopback_zero[21]), + .gpio_one (gpio_loopback_one[21]), + .gpio_in (gpio_in[21]), + .gpio_dm ({gpio_dm2[21], gpio_dm1[21], gpio_dm0[21]}), + .gpio_inp_dis (gpio_inp_dis[21]), + .gpio_oeb_out (gpio_oeb[21]), + .gpio_out_val (gpio_out[21]), + .gpio_analog_en (gpio_analog_en[21]), + .gpio_analog_sel (gpio_analog_sel[21]), + .gpio_analog_pol (gpio_analog_pol[21]), + .gpio_ib_mode_sel (gpio_ib_mode_sel[21]), + .gpio_vtrip_sel (gpio_vtrip_sel[21]), + .gpio_slow_sel (gpio_slow_sel[21]), + .gpio_holdover (gpio_holdover[21]) + ); + + // pad 22: analog (unused) + CF_gpio_config #( + .MODE(3'd0) + ) gpio_cfg_22 ( + .io_out (gpio_loopback_zero[22]), + .io_in (), + .io_oeb (gpio_loopback_one[22]), + .gpio_zero (gpio_loopback_zero[22]), + .gpio_one (gpio_loopback_one[22]), + .gpio_in (gpio_in[22]), + .gpio_dm ({gpio_dm2[22], gpio_dm1[22], gpio_dm0[22]}), + .gpio_inp_dis (gpio_inp_dis[22]), + .gpio_oeb_out (gpio_oeb[22]), + .gpio_out_val (gpio_out[22]), + .gpio_analog_en (gpio_analog_en[22]), + .gpio_analog_sel (gpio_analog_sel[22]), + .gpio_analog_pol (gpio_analog_pol[22]), + .gpio_ib_mode_sel (gpio_ib_mode_sel[22]), + .gpio_vtrip_sel (gpio_vtrip_sel[22]), + .gpio_slow_sel (gpio_slow_sel[22]), + .gpio_holdover (gpio_holdover[22]) + ); + + // pad 23: analog (unused) + CF_gpio_config #( + .MODE(3'd0) + ) gpio_cfg_23 ( + .io_out (gpio_loopback_zero[23]), + .io_in (), + .io_oeb (gpio_loopback_one[23]), + .gpio_zero (gpio_loopback_zero[23]), + .gpio_one (gpio_loopback_one[23]), + .gpio_in (gpio_in[23]), + .gpio_dm ({gpio_dm2[23], gpio_dm1[23], gpio_dm0[23]}), + .gpio_inp_dis (gpio_inp_dis[23]), + .gpio_oeb_out (gpio_oeb[23]), + .gpio_out_val (gpio_out[23]), + .gpio_analog_en (gpio_analog_en[23]), + .gpio_analog_sel (gpio_analog_sel[23]), + .gpio_analog_pol (gpio_analog_pol[23]), + .gpio_ib_mode_sel (gpio_ib_mode_sel[23]), + .gpio_vtrip_sel (gpio_vtrip_sel[23]), + .gpio_slow_sel (gpio_slow_sel[23]), + .gpio_holdover (gpio_holdover[23]) + ); + + // pad 24: analog (unused) + CF_gpio_config #( + .MODE(3'd0) + ) gpio_cfg_24 ( + .io_out (gpio_loopback_zero[24]), + .io_in (), + .io_oeb (gpio_loopback_one[24]), + .gpio_zero (gpio_loopback_zero[24]), + .gpio_one (gpio_loopback_one[24]), + .gpio_in (gpio_in[24]), + .gpio_dm ({gpio_dm2[24], gpio_dm1[24], gpio_dm0[24]}), + .gpio_inp_dis (gpio_inp_dis[24]), + .gpio_oeb_out (gpio_oeb[24]), + .gpio_out_val (gpio_out[24]), + .gpio_analog_en (gpio_analog_en[24]), + .gpio_analog_sel (gpio_analog_sel[24]), + .gpio_analog_pol (gpio_analog_pol[24]), + .gpio_ib_mode_sel (gpio_ib_mode_sel[24]), + .gpio_vtrip_sel (gpio_vtrip_sel[24]), + .gpio_slow_sel (gpio_slow_sel[24]), + .gpio_holdover (gpio_holdover[24]) + ); + + // pad 25: analog (unused) + CF_gpio_config #( + .MODE(3'd0) + ) gpio_cfg_25 ( + .io_out (gpio_loopback_zero[25]), + .io_in (), + .io_oeb (gpio_loopback_one[25]), + .gpio_zero (gpio_loopback_zero[25]), + .gpio_one (gpio_loopback_one[25]), + .gpio_in (gpio_in[25]), + .gpio_dm ({gpio_dm2[25], gpio_dm1[25], gpio_dm0[25]}), + .gpio_inp_dis (gpio_inp_dis[25]), + .gpio_oeb_out (gpio_oeb[25]), + .gpio_out_val (gpio_out[25]), + .gpio_analog_en (gpio_analog_en[25]), + .gpio_analog_sel (gpio_analog_sel[25]), + .gpio_analog_pol (gpio_analog_pol[25]), + .gpio_ib_mode_sel (gpio_ib_mode_sel[25]), + .gpio_vtrip_sel (gpio_vtrip_sel[25]), + .gpio_slow_sel (gpio_slow_sel[25]), + .gpio_holdover (gpio_holdover[25]) + ); + + // pad 26: analog (unused) + CF_gpio_config #( + .MODE(3'd0) + ) gpio_cfg_26 ( + .io_out (gpio_loopback_zero[26]), + .io_in (), + .io_oeb (gpio_loopback_one[26]), + .gpio_zero (gpio_loopback_zero[26]), + .gpio_one (gpio_loopback_one[26]), + .gpio_in (gpio_in[26]), + .gpio_dm ({gpio_dm2[26], gpio_dm1[26], gpio_dm0[26]}), + .gpio_inp_dis (gpio_inp_dis[26]), + .gpio_oeb_out (gpio_oeb[26]), + .gpio_out_val (gpio_out[26]), + .gpio_analog_en (gpio_analog_en[26]), + .gpio_analog_sel (gpio_analog_sel[26]), + .gpio_analog_pol (gpio_analog_pol[26]), + .gpio_ib_mode_sel (gpio_ib_mode_sel[26]), + .gpio_vtrip_sel (gpio_vtrip_sel[26]), + .gpio_slow_sel (gpio_slow_sel[26]), + .gpio_holdover (gpio_holdover[26]) + ); + + // pad 27: analog (unused) + CF_gpio_config #( + .MODE(3'd0) + ) gpio_cfg_27 ( + .io_out (gpio_loopback_zero[27]), + .io_in (), + .io_oeb (gpio_loopback_one[27]), + .gpio_zero (gpio_loopback_zero[27]), + .gpio_one (gpio_loopback_one[27]), + .gpio_in (gpio_in[27]), + .gpio_dm ({gpio_dm2[27], gpio_dm1[27], gpio_dm0[27]}), + .gpio_inp_dis (gpio_inp_dis[27]), + .gpio_oeb_out (gpio_oeb[27]), + .gpio_out_val (gpio_out[27]), + .gpio_analog_en (gpio_analog_en[27]), + .gpio_analog_sel (gpio_analog_sel[27]), + .gpio_analog_pol (gpio_analog_pol[27]), + .gpio_ib_mode_sel (gpio_ib_mode_sel[27]), + .gpio_vtrip_sel (gpio_vtrip_sel[27]), + .gpio_slow_sel (gpio_slow_sel[27]), + .gpio_holdover (gpio_holdover[27]) + ); + + // pad 28: analog (unused) + CF_gpio_config #( + .MODE(3'd0) + ) gpio_cfg_28 ( + .io_out (gpio_loopback_zero[28]), + .io_in (), + .io_oeb (gpio_loopback_one[28]), + .gpio_zero (gpio_loopback_zero[28]), + .gpio_one (gpio_loopback_one[28]), + .gpio_in (gpio_in[28]), + .gpio_dm ({gpio_dm2[28], gpio_dm1[28], gpio_dm0[28]}), + .gpio_inp_dis (gpio_inp_dis[28]), + .gpio_oeb_out (gpio_oeb[28]), + .gpio_out_val (gpio_out[28]), + .gpio_analog_en (gpio_analog_en[28]), + .gpio_analog_sel (gpio_analog_sel[28]), + .gpio_analog_pol (gpio_analog_pol[28]), + .gpio_ib_mode_sel (gpio_ib_mode_sel[28]), + .gpio_vtrip_sel (gpio_vtrip_sel[28]), + .gpio_slow_sel (gpio_slow_sel[28]), + .gpio_holdover (gpio_holdover[28]) + ); + + // pad 29: analog (unused) + CF_gpio_config #( + .MODE(3'd0) + ) gpio_cfg_29 ( + .io_out (gpio_loopback_zero[29]), + .io_in (), + .io_oeb (gpio_loopback_one[29]), + .gpio_zero (gpio_loopback_zero[29]), + .gpio_one (gpio_loopback_one[29]), + .gpio_in (gpio_in[29]), + .gpio_dm ({gpio_dm2[29], gpio_dm1[29], gpio_dm0[29]}), + .gpio_inp_dis (gpio_inp_dis[29]), + .gpio_oeb_out (gpio_oeb[29]), + .gpio_out_val (gpio_out[29]), + .gpio_analog_en (gpio_analog_en[29]), + .gpio_analog_sel (gpio_analog_sel[29]), + .gpio_analog_pol (gpio_analog_pol[29]), + .gpio_ib_mode_sel (gpio_ib_mode_sel[29]), + .gpio_vtrip_sel (gpio_vtrip_sel[29]), + .gpio_slow_sel (gpio_slow_sel[29]), + .gpio_holdover (gpio_holdover[29]) + ); + + // pad 30: analog (unused) + CF_gpio_config #( + .MODE(3'd0) + ) gpio_cfg_30 ( + .io_out (gpio_loopback_zero[30]), + .io_in (), + .io_oeb (gpio_loopback_one[30]), + .gpio_zero (gpio_loopback_zero[30]), + .gpio_one (gpio_loopback_one[30]), + .gpio_in (gpio_in[30]), + .gpio_dm ({gpio_dm2[30], gpio_dm1[30], gpio_dm0[30]}), + .gpio_inp_dis (gpio_inp_dis[30]), + .gpio_oeb_out (gpio_oeb[30]), + .gpio_out_val (gpio_out[30]), + .gpio_analog_en (gpio_analog_en[30]), + .gpio_analog_sel (gpio_analog_sel[30]), + .gpio_analog_pol (gpio_analog_pol[30]), + .gpio_ib_mode_sel (gpio_ib_mode_sel[30]), + .gpio_vtrip_sel (gpio_vtrip_sel[30]), + .gpio_slow_sel (gpio_slow_sel[30]), + .gpio_holdover (gpio_holdover[30]) + ); + + // pad 31: analog (unused) + CF_gpio_config #( + .MODE(3'd0) + ) gpio_cfg_31 ( + .io_out (gpio_loopback_zero[31]), + .io_in (), + .io_oeb (gpio_loopback_one[31]), + .gpio_zero (gpio_loopback_zero[31]), + .gpio_one (gpio_loopback_one[31]), + .gpio_in (gpio_in[31]), + .gpio_dm ({gpio_dm2[31], gpio_dm1[31], gpio_dm0[31]}), + .gpio_inp_dis (gpio_inp_dis[31]), + .gpio_oeb_out (gpio_oeb[31]), + .gpio_out_val (gpio_out[31]), + .gpio_analog_en (gpio_analog_en[31]), + .gpio_analog_sel (gpio_analog_sel[31]), + .gpio_analog_pol (gpio_analog_pol[31]), + .gpio_ib_mode_sel (gpio_ib_mode_sel[31]), + .gpio_vtrip_sel (gpio_vtrip_sel[31]), + .gpio_slow_sel (gpio_slow_sel[31]), + .gpio_holdover (gpio_holdover[31]) + ); + + // pad 32: analog (unused) + CF_gpio_config #( + .MODE(3'd0) + ) gpio_cfg_32 ( + .io_out (gpio_loopback_zero[32]), + .io_in (), + .io_oeb (gpio_loopback_one[32]), + .gpio_zero (gpio_loopback_zero[32]), + .gpio_one (gpio_loopback_one[32]), + .gpio_in (gpio_in[32]), + .gpio_dm ({gpio_dm2[32], gpio_dm1[32], gpio_dm0[32]}), + .gpio_inp_dis (gpio_inp_dis[32]), + .gpio_oeb_out (gpio_oeb[32]), + .gpio_out_val (gpio_out[32]), + .gpio_analog_en (gpio_analog_en[32]), + .gpio_analog_sel (gpio_analog_sel[32]), + .gpio_analog_pol (gpio_analog_pol[32]), + .gpio_ib_mode_sel (gpio_ib_mode_sel[32]), + .gpio_vtrip_sel (gpio_vtrip_sel[32]), + .gpio_slow_sel (gpio_slow_sel[32]), + .gpio_holdover (gpio_holdover[32]) + ); + + // pad 33: analog (unused) + CF_gpio_config #( + .MODE(3'd0) + ) gpio_cfg_33 ( + .io_out (gpio_loopback_zero[33]), + .io_in (), + .io_oeb (gpio_loopback_one[33]), + .gpio_zero (gpio_loopback_zero[33]), + .gpio_one (gpio_loopback_one[33]), + .gpio_in (gpio_in[33]), + .gpio_dm ({gpio_dm2[33], gpio_dm1[33], gpio_dm0[33]}), + .gpio_inp_dis (gpio_inp_dis[33]), + .gpio_oeb_out (gpio_oeb[33]), + .gpio_out_val (gpio_out[33]), + .gpio_analog_en (gpio_analog_en[33]), + .gpio_analog_sel (gpio_analog_sel[33]), + .gpio_analog_pol (gpio_analog_pol[33]), + .gpio_ib_mode_sel (gpio_ib_mode_sel[33]), + .gpio_vtrip_sel (gpio_vtrip_sel[33]), + .gpio_slow_sel (gpio_slow_sel[33]), + .gpio_holdover (gpio_holdover[33]) + ); + + // pad 34: analog (unused) + CF_gpio_config #( + .MODE(3'd0) + ) gpio_cfg_34 ( + .io_out (gpio_loopback_zero[34]), + .io_in (), + .io_oeb (gpio_loopback_one[34]), + .gpio_zero (gpio_loopback_zero[34]), + .gpio_one (gpio_loopback_one[34]), + .gpio_in (gpio_in[34]), + .gpio_dm ({gpio_dm2[34], gpio_dm1[34], gpio_dm0[34]}), + .gpio_inp_dis (gpio_inp_dis[34]), + .gpio_oeb_out (gpio_oeb[34]), + .gpio_out_val (gpio_out[34]), + .gpio_analog_en (gpio_analog_en[34]), + .gpio_analog_sel (gpio_analog_sel[34]), + .gpio_analog_pol (gpio_analog_pol[34]), + .gpio_ib_mode_sel (gpio_ib_mode_sel[34]), + .gpio_vtrip_sel (gpio_vtrip_sel[34]), + .gpio_slow_sel (gpio_slow_sel[34]), + .gpio_holdover (gpio_holdover[34]) + ); + + // pad 35: analog (unused) + CF_gpio_config #( + .MODE(3'd0) + ) gpio_cfg_35 ( + .io_out (gpio_loopback_zero[35]), + .io_in (), + .io_oeb (gpio_loopback_one[35]), + .gpio_zero (gpio_loopback_zero[35]), + .gpio_one (gpio_loopback_one[35]), + .gpio_in (gpio_in[35]), + .gpio_dm ({gpio_dm2[35], gpio_dm1[35], gpio_dm0[35]}), + .gpio_inp_dis (gpio_inp_dis[35]), + .gpio_oeb_out (gpio_oeb[35]), + .gpio_out_val (gpio_out[35]), + .gpio_analog_en (gpio_analog_en[35]), + .gpio_analog_sel (gpio_analog_sel[35]), + .gpio_analog_pol (gpio_analog_pol[35]), + .gpio_ib_mode_sel (gpio_ib_mode_sel[35]), + .gpio_vtrip_sel (gpio_vtrip_sel[35]), + .gpio_slow_sel (gpio_slow_sel[35]), + .gpio_holdover (gpio_holdover[35]) + ); + + // pad 36: analog (unused) + CF_gpio_config #( + .MODE(3'd0) + ) gpio_cfg_36 ( + .io_out (gpio_loopback_zero[36]), + .io_in (), + .io_oeb (gpio_loopback_one[36]), + .gpio_zero (gpio_loopback_zero[36]), + .gpio_one (gpio_loopback_one[36]), + .gpio_in (gpio_in[36]), + .gpio_dm ({gpio_dm2[36], gpio_dm1[36], gpio_dm0[36]}), + .gpio_inp_dis (gpio_inp_dis[36]), + .gpio_oeb_out (gpio_oeb[36]), + .gpio_out_val (gpio_out[36]), + .gpio_analog_en (gpio_analog_en[36]), + .gpio_analog_sel (gpio_analog_sel[36]), + .gpio_analog_pol (gpio_analog_pol[36]), + .gpio_ib_mode_sel (gpio_ib_mode_sel[36]), + .gpio_vtrip_sel (gpio_vtrip_sel[36]), + .gpio_slow_sel (gpio_slow_sel[36]), + .gpio_holdover (gpio_holdover[36]) + ); + + // pad 37: analog (unused) + CF_gpio_config #( + .MODE(3'd0) + ) gpio_cfg_37 ( + .io_out (gpio_loopback_zero[37]), + .io_in (), + .io_oeb (gpio_loopback_one[37]), + .gpio_zero (gpio_loopback_zero[37]), + .gpio_one (gpio_loopback_one[37]), + .gpio_in (gpio_in[37]), + .gpio_dm ({gpio_dm2[37], gpio_dm1[37], gpio_dm0[37]}), + .gpio_inp_dis (gpio_inp_dis[37]), + .gpio_oeb_out (gpio_oeb[37]), + .gpio_out_val (gpio_out[37]), + .gpio_analog_en (gpio_analog_en[37]), + .gpio_analog_sel (gpio_analog_sel[37]), + .gpio_analog_pol (gpio_analog_pol[37]), + .gpio_ib_mode_sel (gpio_ib_mode_sel[37]), + .gpio_vtrip_sel (gpio_vtrip_sel[37]), + .gpio_slow_sel (gpio_slow_sel[37]), + .gpio_holdover (gpio_holdover[37]) + ); + + // pad 38: analog (unused) + CF_gpio_config #( + .MODE(3'd0) + ) gpio_cfg_38 ( + .io_out (gpio_loopback_zero[38]), + .io_in (), + .io_oeb (gpio_loopback_one[38]), + .gpio_zero (gpio_loopback_zero[38]), + .gpio_one (gpio_loopback_one[38]), + .gpio_in (gpio_in[38]), + .gpio_dm ({gpio_dm2[38], gpio_dm1[38], gpio_dm0[38]}), + .gpio_inp_dis (gpio_inp_dis[38]), + .gpio_oeb_out (gpio_oeb[38]), + .gpio_out_val (gpio_out[38]), + .gpio_analog_en (gpio_analog_en[38]), + .gpio_analog_sel (gpio_analog_sel[38]), + .gpio_analog_pol (gpio_analog_pol[38]), + .gpio_ib_mode_sel (gpio_ib_mode_sel[38]), + .gpio_vtrip_sel (gpio_vtrip_sel[38]), + .gpio_slow_sel (gpio_slow_sel[38]), + .gpio_holdover (gpio_holdover[38]) + ); + + // pad 39: analog (unused) + CF_gpio_config #( + .MODE(3'd0) + ) gpio_cfg_39 ( + .io_out (gpio_loopback_zero[39]), + .io_in (), + .io_oeb (gpio_loopback_one[39]), + .gpio_zero (gpio_loopback_zero[39]), + .gpio_one (gpio_loopback_one[39]), + .gpio_in (gpio_in[39]), + .gpio_dm ({gpio_dm2[39], gpio_dm1[39], gpio_dm0[39]}), + .gpio_inp_dis (gpio_inp_dis[39]), + .gpio_oeb_out (gpio_oeb[39]), + .gpio_out_val (gpio_out[39]), + .gpio_analog_en (gpio_analog_en[39]), + .gpio_analog_sel (gpio_analog_sel[39]), + .gpio_analog_pol (gpio_analog_pol[39]), + .gpio_ib_mode_sel (gpio_ib_mode_sel[39]), + .gpio_vtrip_sel (gpio_vtrip_sel[39]), + .gpio_slow_sel (gpio_slow_sel[39]), + .gpio_holdover (gpio_holdover[39]) + ); + + // pad 40: analog (unused) + CF_gpio_config #( + .MODE(3'd0) + ) gpio_cfg_40 ( + .io_out (gpio_loopback_zero[40]), + .io_in (), + .io_oeb (gpio_loopback_one[40]), + .gpio_zero (gpio_loopback_zero[40]), + .gpio_one (gpio_loopback_one[40]), + .gpio_in (gpio_in[40]), + .gpio_dm ({gpio_dm2[40], gpio_dm1[40], gpio_dm0[40]}), + .gpio_inp_dis (gpio_inp_dis[40]), + .gpio_oeb_out (gpio_oeb[40]), + .gpio_out_val (gpio_out[40]), + .gpio_analog_en (gpio_analog_en[40]), + .gpio_analog_sel (gpio_analog_sel[40]), + .gpio_analog_pol (gpio_analog_pol[40]), + .gpio_ib_mode_sel (gpio_ib_mode_sel[40]), + .gpio_vtrip_sel (gpio_vtrip_sel[40]), + .gpio_slow_sel (gpio_slow_sel[40]), + .gpio_holdover (gpio_holdover[40]) + ); + + // pad 41: analog (unused) + CF_gpio_config #( + .MODE(3'd0) + ) gpio_cfg_41 ( + .io_out (gpio_loopback_zero[41]), + .io_in (), + .io_oeb (gpio_loopback_one[41]), + .gpio_zero (gpio_loopback_zero[41]), + .gpio_one (gpio_loopback_one[41]), + .gpio_in (gpio_in[41]), + .gpio_dm ({gpio_dm2[41], gpio_dm1[41], gpio_dm0[41]}), + .gpio_inp_dis (gpio_inp_dis[41]), + .gpio_oeb_out (gpio_oeb[41]), + .gpio_out_val (gpio_out[41]), + .gpio_analog_en (gpio_analog_en[41]), + .gpio_analog_sel (gpio_analog_sel[41]), + .gpio_analog_pol (gpio_analog_pol[41]), + .gpio_ib_mode_sel (gpio_ib_mode_sel[41]), + .gpio_vtrip_sel (gpio_vtrip_sel[41]), + .gpio_slow_sel (gpio_slow_sel[41]), + .gpio_holdover (gpio_holdover[41]) + ); + + // pad 42: analog (unused) + CF_gpio_config #( + .MODE(3'd0) + ) gpio_cfg_42 ( + .io_out (gpio_loopback_zero[42]), + .io_in (), + .io_oeb (gpio_loopback_one[42]), + .gpio_zero (gpio_loopback_zero[42]), + .gpio_one (gpio_loopback_one[42]), + .gpio_in (gpio_in[42]), + .gpio_dm ({gpio_dm2[42], gpio_dm1[42], gpio_dm0[42]}), + .gpio_inp_dis (gpio_inp_dis[42]), + .gpio_oeb_out (gpio_oeb[42]), + .gpio_out_val (gpio_out[42]), + .gpio_analog_en (gpio_analog_en[42]), + .gpio_analog_sel (gpio_analog_sel[42]), + .gpio_analog_pol (gpio_analog_pol[42]), + .gpio_ib_mode_sel (gpio_ib_mode_sel[42]), + .gpio_vtrip_sel (gpio_vtrip_sel[42]), + .gpio_slow_sel (gpio_slow_sel[42]), + .gpio_holdover (gpio_holdover[42]) + ); + + // pad 43: analog (unused) + CF_gpio_config #( + .MODE(3'd0) + ) gpio_cfg_43 ( + .io_out (gpio_loopback_zero[43]), + .io_in (), + .io_oeb (gpio_loopback_one[43]), + .gpio_zero (gpio_loopback_zero[43]), + .gpio_one (gpio_loopback_one[43]), + .gpio_in (gpio_in[43]), + .gpio_dm ({gpio_dm2[43], gpio_dm1[43], gpio_dm0[43]}), + .gpio_inp_dis (gpio_inp_dis[43]), + .gpio_oeb_out (gpio_oeb[43]), + .gpio_out_val (gpio_out[43]), + .gpio_analog_en (gpio_analog_en[43]), + .gpio_analog_sel (gpio_analog_sel[43]), + .gpio_analog_pol (gpio_analog_pol[43]), + .gpio_ib_mode_sel (gpio_ib_mode_sel[43]), + .gpio_vtrip_sel (gpio_vtrip_sel[43]), + .gpio_slow_sel (gpio_slow_sel[43]), + .gpio_holdover (gpio_holdover[43]) + ); + +endmodule // openframe_gpio +/* verilator lint_on PINCONNECTEMPTY */ + +`default_nettype wire diff --git a/verilog/rtl/openframe_project_wrapper.v b/verilog/rtl/openframe_project_wrapper.v index 61f50d2..e6b1e42 100644 --- a/verilog/rtl/openframe_project_wrapper.v +++ b/verilog/rtl/openframe_project_wrapper.v @@ -126,102 +126,32 @@ module openframe_project_wrapper ( (* keep *) vccd1_connection vccd1_connection (); (* keep *) vssd1_connection vssd1_connection (); - // CF_gpio_config modes - // 0: analog - // 1: input - // 2: input pull down - // 3: input pull up - // 4: output - // 5: bidirectional - - CF_gpio_config #(.MODE(3'd1)) gpio_clk_config ( // clk input at gpio 0 - .io_out(), - .io_in(clk), - .io_oeb(), - .gpio_zero(gpio_loopback_zero[0]), - .gpio_one(gpio_loopback_one[0]), - .gpio_in(gpio_in[0]), - .gpio_dm({gpio_dm2[0], gpio_dm1[0], gpio_dm0[0]}), - .gpio_inp_dis(gpio_inp_dis[0]), - .gpio_oeb_out(gpio_oeb[0]), - .gpio_out_val(gpio_out[0]), - .gpio_analog_en(gpio_analog_en[0]), - .gpio_analog_sel(gpio_analog_sel[0]), - .gpio_analog_pol(gpio_analog_pol[0]), - .gpio_ib_mode_sel(gpio_ib_mode_sel[0]), - .gpio_vtrip_sel(gpio_vtrip_sel[0]), - .gpio_slow_sel(gpio_slow_sel[0]), - .gpio_holdover(gpio_holdover[0]) - ); - - CF_gpio_config #(.MODE(3'd3)) gpio_rst_config ( // rst pull up input at gpio 1 - .io_out(), - .io_in(rst), - .io_oeb(), - .gpio_zero(gpio_loopback_zero[1]), - .gpio_one(gpio_loopback_one[1]), - .gpio_in(gpio_in[1]), - .gpio_dm({gpio_dm2[1], gpio_dm1[1], gpio_dm0[1]}), - .gpio_inp_dis(gpio_inp_dis[1]), - .gpio_oeb_out(gpio_oeb[1]), - .gpio_out_val(gpio_out[1]), - .gpio_analog_en(gpio_analog_en[1]), - .gpio_analog_sel(gpio_analog_sel[1]), - .gpio_analog_pol(gpio_analog_pol[1]), - .gpio_ib_mode_sel(gpio_ib_mode_sel[1]), - .gpio_vtrip_sel(gpio_vtrip_sel[1]), - .gpio_slow_sel(gpio_slow_sel[1]), - .gpio_holdover(gpio_holdover[1]) - ); - - genvar i; - generate - for (i = 0; i <= 10; i = i + 1) begin : gpio_out_config - CF_gpio_config #(.MODE(3'd4)) u_cfg ( - .io_out(out[i]), - .io_in(), - .io_oeb(), - .gpio_zero(gpio_loopback_zero[i + 2]), - .gpio_one(gpio_loopback_one[i + 2]), - .gpio_in(gpio_in[i + 2]), - .gpio_dm({gpio_dm2[i + 2], gpio_dm1[i + 2], gpio_dm0[i + 2]}), - .gpio_inp_dis(gpio_inp_dis[i + 2]), - .gpio_oeb_out(gpio_oeb[i + 2]), - .gpio_out_val(gpio_out[i + 2]), - .gpio_analog_en(gpio_analog_en[i + 2]), - .gpio_analog_sel(gpio_analog_sel[i + 2]), - .gpio_analog_pol(gpio_analog_pol[i + 2]), - .gpio_ib_mode_sel(gpio_ib_mode_sel[i + 2]), - .gpio_vtrip_sel(gpio_vtrip_sel[i + 2]), - .gpio_slow_sel(gpio_slow_sel[i + 2]), - .gpio_holdover(gpio_holdover[i + 2]) - ); - end - endgenerate - - genvar j; - generate - for (j = 13; j < `OPENFRAME_IO_PADS; j = j + 1) begin : gpio_unused - CF_gpio_config #(.MODE(3'd0)) u_cfg ( - .io_out(), - .io_in(), - .io_oeb(), - .gpio_zero(gpio_loopback_zero[j]), - .gpio_one(gpio_loopback_one[j]), - .gpio_in(gpio_in[j]), - .gpio_dm({gpio_dm2[j], gpio_dm1[j], gpio_dm0[j]}), - .gpio_inp_dis(gpio_inp_dis[j]), - .gpio_oeb_out(gpio_oeb[j]), - .gpio_out_val(gpio_out[j]), - .gpio_analog_en(gpio_analog_en[j]), - .gpio_analog_sel(gpio_analog_sel[j]), - .gpio_analog_pol(gpio_analog_pol[j]), - .gpio_ib_mode_sel(gpio_ib_mode_sel[j]), - .gpio_vtrip_sel(gpio_vtrip_sel[j]), - .gpio_slow_sel(gpio_slow_sel[j]), - .gpio_holdover(gpio_holdover[j]) - ); - end - endgenerate + // Pad configuration is generated from the project.openframe spec in + // .cf/project.json by `cf openframe generate` (see verilog/rtl/openframe_gpio.v). + // Do not instantiate CF_gpio_config here; change the spec and regenerate. + openframe_gpio gpio ( + // User design ports (named by the spec) + .clk(clk), + .rst(rst), + .out(out), + + // Openframe pad interface + .gpio_in(gpio_in), + .gpio_out(gpio_out), + .gpio_oeb(gpio_oeb), + .gpio_inp_dis(gpio_inp_dis), + .gpio_ib_mode_sel(gpio_ib_mode_sel), + .gpio_vtrip_sel(gpio_vtrip_sel), + .gpio_slow_sel(gpio_slow_sel), + .gpio_holdover(gpio_holdover), + .gpio_analog_en(gpio_analog_en), + .gpio_analog_sel(gpio_analog_sel), + .gpio_analog_pol(gpio_analog_pol), + .gpio_dm2(gpio_dm2), + .gpio_dm1(gpio_dm1), + .gpio_dm0(gpio_dm0), + .gpio_loopback_one(gpio_loopback_one), + .gpio_loopback_zero(gpio_loopback_zero) + ); endmodule // openframe_project_wrapper diff --git a/verilog/rtl/user_proj_timer.v b/verilog/rtl/user_proj_timer.v index 309cb9f..aab32e4 100644 --- a/verilog/rtl/user_proj_timer.v +++ b/verilog/rtl/user_proj_timer.v @@ -46,7 +46,7 @@ module user_proj_timer ( input wb_rst_i, // IOs - output [10:0] io_out, + output [10:0] io_out ); wire [6:0] seven_seg;