# PDK source from skywater. ![image](https://hackmd.io/_uploads/H1Wsp3tL6.png) ## GPIO_MPRJ_IO.by.Willy.pdf - in joplin - ## reference [[2023-03-29] Study Topic - GPIO MPRJ IO by Willy](https://github.com/bol-edu/caravel-soc/discussions/26) ## Start from Makefile in caravel_user_project ``` ifeq ($(PDK),sky130A) SKYWATER_COMMIT=f70d8ca46961ff92719d8870a18a076370b85f6c export OPEN_PDKS_COMMIT?=0059588eebfc704681dc2368bd1d33d96281d10f export OPENLANE_TAG?=2022.11.19 MPW_TAG ?= mpw-8c ifeq ($(CARAVEL_LITE),1) CARAVEL_NAME := caravel-lite CARAVEL_REPO := https://github.com/efabless/caravel-lite CARAVEL_TAG := $(MPW_TAG) else CARAVEL_NAME := caravel CARAVEL_REPO := https://github.com/efabless/caravel CARAVEL_TAG := $(MPW_TAG) endif ``` [Link](https://github.com/TonyHo722/caravel_user_project/blob/7f7c16f19280201d19bc4bf2d134cbc5906765b5/Makefile#L33C1-L47C6) ### use PDK=sky130A ``` export PDK=sky130A ``` [link](https://github.com/TonyHo722/caravel-lab/blob/main/bash_auto/run_la_test1#L55) ### PDK source ``` # PDK setup configs THREADS ?= $(shell nproc) STD_CELL_LIBRARY ?= sky130_fd_sc_hd SPECIAL_VOLTAGE_LIBRARY ?= sky130_fd_sc_hvl IO_LIBRARY ?= sky130_fd_io PRIMITIVES_LIBRARY ?= sky130_fd_pr SKYWATER_COMMIT ?= f70d8ca46961ff92719d8870a18a076370b85f6c OPEN_PDKS_COMMIT ?= 0059588eebfc704681dc2368bd1d33d96281d10f # = 1.0.303 PDK_MAGIC_COMMIT ?= 085131b090cb511d785baf52a10cf6df8a657d44 # = 8.3.294 ``` ``` git clone https://github.com/google/skywater-pdk.git ``` [Link](https://github.com/efabless/caravel-lite/blob/1e3103fd5ffa56f72e2b38e804c9c7bb2738e32a/Makefile#L82C1-L92C12) ## io pad verilog code - black box - functional - behavioral ### block box ``` (* blackbox *) module sky130_fd_io__top_xres4v2 ( XRES_H_N , AMUXBUS_A , AMUXBUS_B , PAD , DISABLE_PULLUP_H, ENABLE_H , EN_VDDIO_SIG_H , INP_SEL_H , FILT_IN_H , PULLUP_H , ENABLE_VDDIO , PAD_A_ESD_H , TIE_HI_ESD , TIE_LO_ESD , TIE_WEAK_HI_H ); output XRES_H_N ; inout AMUXBUS_A ; inout AMUXBUS_B ; inout PAD ; input DISABLE_PULLUP_H; input ENABLE_H ; input EN_VDDIO_SIG_H ; input INP_SEL_H ; input FILT_IN_H ; inout PULLUP_H ; input ENABLE_VDDIO ; inout PAD_A_ESD_H ; output TIE_HI_ESD ; output TIE_LO_ESD ; inout TIE_WEAK_HI_H ; // Voltage supply signals supply1 VCCD ; supply1 VCCHIB ; supply1 VDDA ; supply1 VDDIO ; supply1 VDDIO_Q; supply0 VSSA ; supply0 VSSD ; supply0 VSSIO ; supply0 VSSIO_Q; supply1 VSWITCH; endmodule ``` [code link](https://github.com/google/skywater-pdk-libs-sky130_fd_io/blob/main/cells/top_xres4v2/sky130_fd_io__top_xres4v2.blackbox.v#L33C1-L80C10) ### sky130_fd_io__top_xres4v2.functional.v ``` module sky130_fd_io__top_xres4v2 ( TIE_WEAK_HI_H, XRES_H_N, TIE_HI_ESD, TIE_LO_ESD, AMUXBUS_A, AMUXBUS_B, PAD, PAD_A_ESD_H, ENABLE_H, EN_VDDIO_SIG_H, INP_SEL_H, FILT_IN_H, DISABLE_PULLUP_H, PULLUP_H, ENABLE_VDDIO ); ``` [code link](https://github.com/google/skywater-pdk-libs-sky130_fd_io/blob/main/cells/top_xres4v2/sky130_fd_io__top_xres4v2.functional.v#L19C1-L22C36) ### sky130_fd_io__top_xres4v2.functional.pp.v - add VCCD, VCCHIB, VDDA, VDDIO,VDDIO_Q, VSSA, VSSD, VSSIO, VSSIO_Q, VSWITCH ``` module sky130_fd_io__top_xres4v2 ( TIE_WEAK_HI_H, XRES_H_N, TIE_HI_ESD, TIE_LO_ESD, AMUXBUS_A, AMUXBUS_B, PAD, PAD_A_ESD_H, ENABLE_H, EN_VDDIO_SIG_H, INP_SEL_H, FILT_IN_H, DISABLE_PULLUP_H, PULLUP_H, ENABLE_VDDIO ,VCCD, VCCHIB, VDDA, VDDIO,VDDIO_Q, VSSA, VSSD, VSSIO, VSSIO_Q, VSWITCH ); ``` [code link](https://github.com/google/skywater-pdk-libs-sky130_fd_io/blob/main/cells/top_xres4v2/sky130_fd_io__top_xres4v2.functional.pp.v#L19C1-L23C36) ### sky130_fd_io__top_xres4v2.behavioral.v ``` module sky130_fd_io__top_xres4v2 ( TIE_WEAK_HI_H, XRES_H_N, TIE_HI_ESD, TIE_LO_ESD, AMUXBUS_A, AMUXBUS_B, PAD, PAD_A_ESD_H, ENABLE_H, EN_VDDIO_SIG_H, INP_SEL_H, FILT_IN_H, DISABLE_PULLUP_H, PULLUP_H, ENABLE_VDDIO ); ``` [code link](https://github.com/google/skywater-pdk-libs-sky130_fd_io/blob/main/cells/top_xres4v2/sky130_fd_io__top_xres4v2.behavioral.v#L19C1-L22C36) ### sky130_fd_io__top_xres4v2.behavioral.pp.v - add VCCD, VCCHIB, VDDA, VDDIO,VDDIO_Q, VSSA, VSSD, VSSIO, VSSIO_Q, VSWITCH ``` module sky130_fd_io__top_xres4v2 ( TIE_WEAK_HI_H, XRES_H_N, TIE_HI_ESD, TIE_LO_ESD, AMUXBUS_A, AMUXBUS_B, PAD, PAD_A_ESD_H, ENABLE_H, EN_VDDIO_SIG_H, INP_SEL_H, FILT_IN_H, DISABLE_PULLUP_H, PULLUP_H, ENABLE_VDDIO ,VCCD, VCCHIB, VDDA, VDDIO,VDDIO_Q, VSSA, VSSD, VSSIO, VSSIO_Q, VSWITCH ); ``` [code link](https://github.com/google/skywater-pdk-libs-sky130_fd_io/blob/main/cells/top_xres4v2/sky130_fd_io__top_xres4v2.behavioral.pp.v#L19C1-L23C36) # ``` // User Project Control (0x2300_0000) #define reg_mprj_xfer (*(volatile uint32_t*)0x26000000) #define reg_mprj_pwr (*(volatile uint32_t*)0x26000004) #define reg_mprj_irq (*(volatile uint32_t*)0x26100014) #define reg_mprj_datal (*(volatile uint32_t*)0x2600000c) #define reg_mprj_datah (*(volatile uint32_t*)0x26000010) #define reg_mprj_io_0 (*(volatile uint32_t*)0x26000024) #define reg_mprj_io_1 (*(volatile uint32_t*)0x26000028) #define reg_mprj_io_2 (*(volatile uint32_t*)0x2600002c) #define reg_mprj_io_3 (*(volatile uint32_t*)0x26000030) #define reg_mprj_io_4 (*(volatile uint32_t*)0x26000034) #define reg_mprj_io_5 (*(volatile uint32_t*)0x26000038) #define reg_mprj_io_6 (*(volatile uint32_t*)0x2600003c) #define reg_mprj_io_7 (*(volatile uint32_t*)0x26000040) #define reg_mprj_io_8 (*(volatile uint32_t*)0x26000044) #define reg_mprj_io_9 (*(volatile uint32_t*)0x26000048) #define reg_mprj_io_10 (*(volatile uint32_t*)0x2600004c) #define reg_mprj_io_11 (*(volatile uint32_t*)0x26000050) #define reg_mprj_io_12 (*(volatile uint32_t*)0x26000054) #define reg_mprj_io_13 (*(volatile uint32_t*)0x26000058) #define reg_mprj_io_14 (*(volatile uint32_t*)0x2600005c) #define reg_mprj_io_15 (*(volatile uint32_t*)0x26000060) #define reg_mprj_io_16 (*(volatile uint32_t*)0x26000064) #define reg_mprj_io_17 (*(volatile uint32_t*)0x26000068) #define reg_mprj_io_18 (*(volatile uint32_t*)0x2600006c) #define reg_mprj_io_19 (*(volatile uint32_t*)0x26000070) #define reg_mprj_io_20 (*(volatile uint32_t*)0x26000074) #define reg_mprj_io_21 (*(volatile uint32_t*)0x26000078) #define reg_mprj_io_22 (*(volatile uint32_t*)0x2600007c) #define reg_mprj_io_23 (*(volatile uint32_t*)0x26000080) #define reg_mprj_io_24 (*(volatile uint32_t*)0x26000084) #define reg_mprj_io_25 (*(volatile uint32_t*)0x26000088) #define reg_mprj_io_26 (*(volatile uint32_t*)0x2600008c) #define reg_mprj_io_27 (*(volatile uint32_t*)0x26000090) #define reg_mprj_io_28 (*(volatile uint32_t*)0x26000094) #define reg_mprj_io_29 (*(volatile uint32_t*)0x26000098) #define reg_mprj_io_30 (*(volatile uint32_t*)0x2600009c) #define reg_mprj_io_31 (*(volatile uint32_t*)0x260000a0) #define reg_mprj_io_32 (*(volatile uint32_t*)0x260000a4) #define reg_mprj_io_33 (*(volatile uint32_t*)0x260000a8) #define reg_mprj_io_34 (*(volatile uint32_t*)0x260000ac) #define reg_mprj_io_35 (*(volatile uint32_t*)0x260000b0) #define reg_mprj_io_36 (*(volatile uint32_t*)0x260000b4) #define reg_mprj_io_37 (*(volatile uint32_t*)0x260000b8) ``` [code](https://github.com/bol-edu/caravel-soc/blob/main/firmware/caravel.h#L24C1-L75C57)