Danube River: Difference between revisions
| Line 105: | Line 105: | ||
pip install git+<nowiki>https://gitlab.libresilicon.com/generator-tools/librepdk.git</nowiki> | pip install git+<nowiki>https://gitlab.libresilicon.com/generator-tools/librepdk.git</nowiki> | ||
git clone <nowiki>https://gitlab.libresilicon.com/generator-tools/danube-river.git</nowiki> | git clone <nowiki>https://gitlab.libresilicon.com/generator-tools/danube-river.git</nowiki> | ||
cd danube-river && pip install . && cd .. | |||
You can for instance run this command for generating the wafer for LS1U (LibreSilicon 1 micron) | You can for instance run this command for generating the wafer for LS1U (LibreSilicon 1 micron) | ||
. .venv/bin/activate | . .venv/bin/activate | ||
Revision as of 14:39, 19 July 2025
Danube River is a tool, which generates you GDS2 files which you then can manufacture with your prototype process flow in order to validate parameters and adjust your recipes until the values are within a desired range.
Use cases
Setting up a new fab
In case you wanna build a new factory, you basically tape out your Danube River layout over and over again while adjusting the recipes and design rules until the structures aren't broken anymore under the microscope and the values you measure match the predictions you've calculated.

Setting up support for an existing fab
In case you already have a working process and foundry available, but you're not sure that the timing characteristics they've provided are accurate, you can use Danube River for extracting your own timing characteristics.

Successful tapeouts
So far, the only opportunity we had to try the new test layout generator, was with Global Foundries on their 180nm node, of which the result can be seen in the picture below:

The tapeout happened with the GDS2 files from the patch level at commit 42f33bb0988a81749da30af46769e721983bb5b1:
GDS2 view
The upper left section in the above image corresponds with the layout extracted from KLayout, when opening up the layout used for the tape-out

Structures
The Danube test wafer has the purpose of allowing to characterize basic analog properties resulting from the manufacturing process flow.
Each of those properties measured can be linked to a specific recipe in the process flow, which allows to fine tune a process and all its process recipes through repeatedly manufacturing and measuring the Danube river layout.
The Danube river contains 3 types of devices, which allows you to determine edge parameters:
- Resistors
- Capacitors
- Transistors
Resistors
There's three types of resistive test structures on Danube River, due to variations in sheet resistance vs. area and length requirements.
For each sheet resistance characterization there's each a vertical and horizontal configuration in order to catch any potential variance in sheet resistance due to the orientation, which might occur due to the crystal orientation of the substrate being used, like <100>, <110>, and <111>[1]
After having determined the voltage over each test resistor, when applying a constant current, the resistance can be calculated using simple Ohm's law
Strip Resistors
The most simple form of a resistor simply is a straight sheet resistor between pad 1/2 and 3/4 for the vertical sheet resistance characterization and pad 1/4 to 2/3 for horizontal characterization respectively.

The resistance is being measured by applying a constant current between two of the pads and measuring the voltage over the other two pads.
Horizontal resistor: Apply constant current over 1 (one) and 2 (two), measure voltage over 4 (four) and 3 (three)
Vertical resistor: Apply constant current over 2 (two) and 3 (three), measure voltage over 1 (one) and 4 (four)
Small Meander Resistors
Danube River checks during generation whether the initial sheet resistance estimate in the initial calculated value map would result in a straight sheet resistor which still fits between the pads.
If the target resistance of for instance 100 Ohms can not be fit between the pads using a straight resistor, Danube River will generate a Meander structure instead, which if small enough for fitting between the pads will be placed as shown below.

The resistance is being measured by applying a constant current between two of the pads and measuring the voltage over the other two pads.
Horizontal resistor: Apply constant current over 2 (two) and 3 (three), measure voltage over 1 (one) and 4 (four)
Vertical resistor: Apply constant current over 1 (one) and 2 (two), measure voltage over 4 (four) and 3 (three)
Large Meander Resistors

The resistance is being measured by applying a constant current between two of the pads and measuring the voltage over the other two pads.
Horizontal resistor: Apply constant current over 1 (one) and 4 (four), measure voltage over 2 (two) and 3 (three)
Vertical resistor: Apply constant current over 4 (four) and 3 (three), measure voltage over 1 (one) and 2 (two)
Capacitors
Those capacitors are of interest when it comes to determining parasitic factors like leakage current as well as parasitic capacity between layers.
The values extracted from measuring those structures will go into the optimization functions of the StdCellLib generator as well as the Pad Cell Generator
Below some of the capacitors on the test wafer can be seen in more detail.

With each capacitor pad 3 (three) and 4 (four) are connected to one electrode, 1 (one) and 2 (two) to the second electrode.
There's several ways of measuring the impedance of those structures,. Devices like keysight can directly measure the capacity and also an impedance vs. frequency curve.
Transistors
On Danube River there are those very small structures connected the four pads, which for a change aren't connected and configured in a Kelvin configuration, because the pads go to source, drain, gate and bulk each.

In the closeup below you can see an annotated zoom in onto one of the structures, with each contact being labeled.

Those structures are probably the most difficult ones to identify.
It's the smallest ones without any pads being shorted to each other with large strips.
Simply use the Field Effect characterization function in your keysight or so and determine the gain and other values.
The pad assignments are:
- ONE: Source
- TWO: Gate
- THREE: Bulk
- FOUR: Drain
Setup and Generation
You can either pull the latest Docker image, build your own Docker image using the Docker file linked below, or go through the Docker file and install the dependencies locally:
https://gitlab.libresilicon.com/leviathan/docker-files/-/blob/master/tools/Dockerfile?ref_type=heads'
A pre-built Docker image has been pushed to leviathan's Dockerhub, and can be retrieved by running
docker pull leviathanch/libresilicon-tools:latest
In case you are adding a new technology node in LibrePDK, it's better you install everything locally, make a pull request and wait until your technology node is being included in the Docker build
Generating a new test wafer is as easy as providing it the wafer configuration as well as the name of the output GDSII file, it will also generate you a PDF with all the structures and info on how to measure it as well as a CSV file with the coordinates for automated measurement.
Installing the dependencies, minus the LaTeX stuff (see the Docker file for it), basically goes something like
python3 -m venv .venv . .venv/bin/activate pip install git+https://gitlab.libresilicon.com/generator-tools/librepdk.git git clone https://gitlab.libresilicon.com/generator-tools/danube-river.git cd danube-river && pip install . && cd ..
You can for instance run this command for generating the wafer for LS1U (LibreSilicon 1 micron)
. .venv/bin/activate cd danube-river danube_generate -c configs/kacst-ls1u.cfg -o tapeout/kacst-ls1u.gds