This guide will teach you how to create all the files that you need to get your VGA design manufactured. At the end of this, you’ll have a GitHub repository containing your modified VGA design which is ready for submission.
You’ll need to create a repository using our IHP template. It contains all the files and settings necessary to convert your design to the GDS we need for manufacture.

GitHub Actions allow automated tasks to run. They are enabled by default, but we need to allow them to publish the results.

You’ll need to download your modified VGA project from VGA Playground, and upload it to GitHub to begin preparing for submission. You may either commit these files via git from the terminal, or upload them directly to GitHub through the website interface - choose whichever you’re most comfortable with.

You’ll now have a zip file containing a collection of source files.

You must retain the folder structure - the files in src must go into the repo’s src folder, and the files in test
go into the repo’s test folder.
Follow this section if you’re not familiar with using git from the terminal.


We’ll need to make changes to a couple files to ensure that the submission process goes smoothly. We need to make sure
that our module name is unique - it is currently set to tt_um_vga_example in the source files. It is recommended that
it follows the following format: tt_um_USERNAME_PROJECTNAME, where USERNAME is your username, and PROJECTNAME is
what you decided to call the project.
src/project.v to the module name you chose.test/tb.v to the same module name.info.yaml is used to tell us the important details of your project: who it’s by, what it does, its source files and
its pinout. Make sure you fill out these sections carefully.
title: Give your project a memorable name.author: Enter the name(s) of the author(s) (use a comma to separate them if there are multiple).discord: Optional, add your discord tag and join our discord to stay informed.description: One line description of your project.top_module: Update this string to the unique module name you made in the previous section.Do not modify clock_hz, tiles or source_files unless you know what you’re doing!
If your design makes use of additional pins for input or output, you should edit the corresponding pin under pinout.
| Label | Description |
|---|---|
ui |
User input |
uo |
User output |
uio |
User input/output (bidirectional pins) |
You should briefly describe their functionality or role - aim for this to be a label or ~3 words max. You’ll have an opportunity later to describe them in more detail if you need to.
We will be editing the CocoTB tests in test/test.py in order to force them to pass - make the following changes:
cocotb.pass_test() after the async def test_project(dut): line.cocotb.pass_test() after the async def compare_reference(dut): line.It should look something like the following (note that lines were cut for brevity):
@cocotb.test()
async def test_project(dut):
cocotb.pass_test() # <- add this line!
# Set clock period to 40 ns (25 MHz)
CLOCK_PERIOD = 40
[...]
@cocotb.test()
async def compare_reference(dut):
cocotb.pass_test() # <- add this line too!
for img in glob.glob("output/frame*.png"):
[...]
Everybody submitting to a shared shuttle ends up getting a copy of your design, so having clear and concise documentation allows everybody to use and explore your design! We also combine all the project documentation together into one big datasheet which is available to view from the shuttle’s online page.
Please write in English and use the Markdown syntax appropriately to describe and explain your design.
docs/info.md to include information about your design.
Leaving the “How it works” and “How to test” sections unchanged will cause the GitHub Actions to fail.
Your project will be ready for submission once the docs and gds actions light up green - you
can see the status of them if you navigate to your README.md online or to the “Actions” tab in the repository.

GitHub Actions are a service provided free-of-charge for open-source projects. We make use of these to automatically run a set of programs every time a commit is made to the repository. We use a selection of different actions to do various tasks:
docs: Compile your project documentation into a PDF - uses content in info.yaml and docs/info.md.gds: Generate the GDS for your project and shows you some interesting information.test: Uses test.py to automatically test your design with CocoTB.fpga: Create an FPGA bitstream to upload your design onto an FPGA.You only need to have docs and gds passing (lit up green) in order to submit your design.
This action generates a preview of how your documentation will look. You can download a PDF preview to check it.
If you have a failure, you can check the log to see what caused the issue. The most common error is missing fields in
info.yaml or leaving docs/info.md unchanged.

This action generates the GDS for your project, along with warnings, utilisation statistics, and cell usage details. If you have a failure, you can check the log to see what the problem is. The most common errors are:
If you get stuck, ask a TA!
Within the GDS action, you can view all the gritty details about your design - types of cells being used and how many, total area and wire usage, precheck results and your design rendered in 2D & 3D!
Take a look at the standard cell usage summary. These cells are a part of the PDK provided by IHP. The details of each cell can be viewed by clicking the links.

The cell usage table also includes additional cells such as fill cells and tap cells that are not a part of your original design. These types of cells are automatically inserted during the physical design stage to ensure the integrity of the layout and meet manufacturing requirements.
The precheck summary shows the results of all the tests we run on the design. All the checks need to be green to submit on the chip.
This section gives you the 3D viewer link and the 2D render of your design. Open the 3D viewer by clicking the “Open 3D viewer” link.
Explore the design - you can rotate, zoom and hide certain layers or cells. Can you find the I/O?


test.py and implement actual testing - the code is there, but you’ll need to provide some reference screenshots
so that it can compare the output with what you expect!