Skip to content

feat(fpga): Vivado CI pipeline for gf16_heartbeat_uart_top (UART telemetry on K20)#604

Open
gHashTag wants to merge 1 commit into
masterfrom
feat/vivado-ci
Open

feat(fpga): Vivado CI pipeline for gf16_heartbeat_uart_top (UART telemetry on K20)#604
gHashTag wants to merge 1 commit into
masterfrom
feat/vivado-ci

Conversation

@gHashTag
Copy link
Copy Markdown
Owner

Vivado CI pipeline for UART-telemetry bitstream

Adds a Vivado batch build pipeline for gf16_heartbeat_uart_top so we can produce a .bit with 115200-baud UART TX telemetry on K20, on top of the silicon-verified gf16_heartbeat_top baseline (LEDs blinking confirmed via JTAG SRAM load).

What's in here

fpga/vivado/uart/

  • build.tcl — in-memory Vivado project (xc7a100tfgg676-1), synth → opt → place → route → write_bitstream, produces build/output/*.bit + timing/utilisation reports
  • gf16_heartbeat_uart_top.v — heartbeat + uart_tx_8n1 (115200, DIV=564) + frame builder emitting "T:HH R:HHHH\r\n" on layer transitions, clocked from STARTUPE2.CFGMCLK (~65 MHz)
  • gf16_heartbeat_uart_top.xdc — LEDs R23/T23/J26 (active-LOW), uart_tx on K20 (J2 pin 5), BITSTREAM.STARTUP.STARTUPCLK JtagClk
  • Dockerfile — Ubuntu 22.04 base, expects /opt/Xilinx/Vivado/2023.2 bind-mounted from host
  • SETUP_RUNNER.md — AMD account → Vivado 2023.2 Standard Edition → /opt/Xilinx install → license → runner registration with labels self-hosted,linux,vivado. Includes libtinfo5 fix for Ubuntu 22.04.
  • README.md / SUMMARY.md — overview + next-steps

.github/workflows/vivado-build.yml

  • Triggers: push to feat/vivado-ci, workflow_dispatch, PRs with label build:vivado
  • Runner: [self-hosted, linux, vivado], 30 min timeout
  • Extends PATH from $XILINX_VIVADO/bin, runs vivado -mode batch -nojournal -nolog -source build.tcl
  • Uploads .bit + .rpt artifacts; SHA-256 to step summary
  • No .sh / .py (L7 compliant)

Why a new workflow (not extending the existing one)

.github/workflows/fpga-build.yml is the openXC7 "Zero Vivado" path — it does not model STARTUPE2, which is why the openXC7-built blink_j26.bit failed on real silicon (STAT=0x4000190C, DONE=0) while the Vivado-built gf16_heartbeat_top.bit works (STAT=0x401079FC, DONE=1, LEDs blink). Vivado CI is additive, not a replacement.

Expected CI state on merge

CI will fail until a self-hosted runner with Vivado 2023.2 is registered (SETUP_RUNNER.md covers this). The workflow is gated behind workflow_dispatch + the build:vivado PR label so it doesn't block other CI.

Hardware target (verified)

QMTech XC7A100T Wukong V1, FGG676 — same board on which gf16_heartbeat_top.bit is currently blinking via JTAG SRAM. After CI produces the UART bitstream, the plan is: artifact → SRAM load → wire FT232RL (VID 0403:6001) to K20/GND → read tok/s on host.

Compliance

  • L7: no new .sh / .py
  • L1: Closes #592 already shipped on feat/dlc10-rust@a301834d; this PR is independent infrastructure (no ticket — Vivado-CI tracking can be opened separately if needed)

- fpga/vivado/uart/build.tcl: batch TCL script (in-memory project,
  xc7a100tfgg676-1, synth→opt→place→route→write_bitstream)
- fpga/vivado/uart/gf16_heartbeat_uart_top.v: 115200-baud UART TX
  telemetry top (282 lines, heartbeat + GF(2^4) dot4 result)
- fpga/vivado/uart/gf16_heartbeat_uart_top.xdc: pin constraints
  (K20=uart_tx, LEDs R23/T23/J26, bitstream config)
- .github/workflows/vivado-build.yml: CI workflow triggering on push
  to feat/vivado-ci, workflow_dispatch, and PRs labelled build:vivado;
  uploads .bit + .rpt artifacts; SHA-256 in step summary
- fpga/vivado/uart/Dockerfile: self-hosted runner base image (Vivado
  volume-mounted from host, Ubuntu 22.04)
- fpga/vivado/uart/SETUP_RUNNER.md: end-to-end runner setup guide
- fpga/vivado/uart/README.md: directory overview and quick-start

No .sh or .py scripts added (L7 compliance).
@github-actions
Copy link
Copy Markdown

📓 NotebookLM Notebook linked to this PR

This notebook contains session context, decisions, and artifacts for this work.

@github-actions
Copy link
Copy Markdown

PR Dashboard

Generated at: 2026-05-13 15:21:14 UTC

Summary

Status Count
READY 4
FAILING 12
PENDING 0

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant