This repository provides a fully open-source test setup solution for a temperature sensor chip taped-out in SkyWater 130nm with 64 openFASOC-generated temperature sensor instances. The setup is highly automated with Python and open-source libraries, where the chip is controlled through low-cost commercially-available USB devices, and control of testing equipments like temperature chamber and source measurement unit is also seamlessly embedded in the test flow using Python.
Author: Qirui Zhang from the University of Michigan, Ann Arbor
A host computer with Windows 10 operating system is required. Either a desktop or laptop should work.
Please install the latest version of Anaconda (Python3) on the host computer and use Spyder for running the test scripts.
The daughter board could be as simple as one that directly connects all the chip I/Os to headers and power supplies to SMA or banana connectors. No level conversion should be needed as the chip uses 3.3V I/O voltage. It is suggested to use 64-pin ceramic PGA packages for packaging the dice and a Zero-Insertion-Force (ZIF) socket for holding the chip. The daughter board designed for validating this setup is shown below as a reference:
Fig. 1. Top view of the daughter boardFig. 2. Bottom view of the daughter board
Three FT232H USB-to-GPIO bridge boards from AdaFruit are needed in this setup for controlling the chip. Please purchase them online from Adafruit. After getting the boards, follow this page to install driver for the boards using Zadig on the host computer. Note: you only need to follow thePlug in FT232H & Fix Driver with Zadig
part on this page, as we do not use the boards in the same way as they suggest.
After the driver is installed, open an Anaconda prompt on the host computer, install pyftdi and pyusb libraries:
pip install pyftdi
pip install pyusb
After the installations, connect the three bridges to the daughter board via jumper wires according to PinMap.txt
in this repository. The pin numbers of bridge boards are already printed on-board, like what is shown in Fig. 3, while the chip I/O names are printed on the bottom of the daughter board shown in Fig. 2. The three bridges are named Input-bridge
, Output-bridge1
and Output-bridge0
, where the input bridge is used for all the input pins of the chip and the output bridges are used for chip output pins. After connecting the chip I/Os, also remember to connect the ground pins of each bridge to the daughter board ground for a common ground.
The last step for setting-up the bridges is to connect them to the host computer via USB cables (note the latest bridge version uses USB type-C) and figure out what their USB addresses are. Use find_usb_addr.py
in this repository to achieve that. For example, when running line 25
and line 27
for checking which bridge board has the USB address of gpio0
, use a saleae logic analyzer or simply a multimeter to probe pin D0 of each board. The one that toggles should have the USB address from the first check. Correspondances can be established similarly for the second and third checks and eventually you can figure out the USB addresses for the input bridge and output bridges. After that, replace line 17 ~ 19
in tempsensor_ctrl.py
with the correct USB addresses you get.
Please make sure you use a TestEquity temperature chamber with the F4 controller from Watlow Electric. Any other temperature chambers are not guaranteed to work with this setup. The temperature chamber can be automated through Python using an RS232 cable and the Modbus protocol. Install the minimalmodbus library in Python on the host computer:
pip install minimalmodbus
After installation of minimalmodbus, connect the temperature chamber's RS232 port to your host computer through a null-modem RS232 cable. It is best if your host computer is a desktop made for electronic testing, which typically comes with an RS232 port. If not, you may need a USB-to-RS232 converter, which is commonly available on Amazon. MODBUS_EXP.py
in this repository provides an example on how to control the temperature chamber through Python.
Though theoretically you could use any SMU from Agilent/Keysight, it is highly recommended that you have Agilent/Keysight B2902A available as the control commands used in this repository are B2902A-specific. To automate SMU B2902A, first download the Keysight Instrument Control Bundle, install "IO Libraries Suite" and "Command Expert" on the host computer. After installing those, connect the SMU to the host computer via a USB type-A or printer cable. Open Keysight Connection Expert
and check whether the SMU is detected. Then, install the pyvisa library in Python on the host computer:
pip install pyvisa
B2902A_EXP.py
in this repository provides an example on how to control the SMU through Python.
If you use any SMU other than B2902A, you may connect it to the host computer in the same way as B2902A, check for its existance in Keysight Connection Expert
and then open Command Expert
. There you can experiment your SMU with the commands you may need. After that, simply click File->Export Sequence
through the menu, select Python with calls to PyVISA
for Language
and click Save to File
to get the Python codes to automate your SMU of choice. You may also need to replace all the B2902A commands in the scripts with corresponding commands for your SMU.
A clock source is required to generate input for the CLK_REF
pin of the chip. It is recommended to use a commonly-seen waveform generator to generate a 32.768kHz
square wave with 3.0V
peak-to-peak voltage and connect that clock to CLK_REF
. An oscilloscope is also very helpful, where the CLK_OUT
pin can be connected to and observed for debugging the chip. It is also recommended to have a saleae logic analyzer for early-stage debugging of the test setup.
This script provides a sanity check for testing whether a selected temperature sensor instance works. The script will ask the user to turn on the clock source and power supplies, and input configurations to the chip. Then the script will ask the user whether to release reset, and the counter output (DOUT) corresponding to the selected instance and configurations will be returned after the reset is released.
This script tests the ring-oscillator output frequencies or raw temperature measurement data of all instances across a temperature range. Before running the script, make sure your chip is seated in the temperature chamber. Create folder MeasResults
in the same path as the script. Change line 101
in the script to assign a number to the current chip under test, and make sure to create its folder ChipNoX
in MeasResults
. For example, if you set ChipNo
to 10, make sure the folder ChipNo10
exists in MeasResults
. Change line 102
to modify the temperature range and step. It is recommended to not set temperature higher than 120°C
or plastic components in the setup may melt. Change line 103
to add supply voltages you want to test. For example, if you change it to [(3.0, 1.8), (3.0, 1.2)]
, the chip will also be tested under 3.0V
IO voltage and 1.2V
core voltage. The csv files for raw measurement data will be stored in ./MeasResults/ChipNoX
.
This script tests the powers and resolutions (raw) of all instances under a given temperature and nominal supply voltages. Before running the script, make sure your chip is seated in the temperature chamber. Make sure the folder MeasResults
exists in the same path as the script. Also make sure the folder Power
and Resolution
exist in MeasResults
. Change line 95
in the script to assign a number to the current chip under test. Change line 97
to modify the temperature. It is recommended to use 20°C
or room temperature for this test. The csv files for raw measurement data will be stored in ./MeasResults/Power
and ./MeasResults/Resolution
.
The author would like to thank Google and SkyWater for fabrication of the test chip.
The source code is released under Apache License 2.0.
For any technical issues, please contact Qirui Zhang (qiruizh@umich.com) and Mehdi Saligane (mehdi@umich.edu).