You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
R3-2 slice 1: read the die's DNA over JTAG (Refs #6655) #7439
Part of epic #6655, Round 3 item R3-2 (device-rooted identity), slice 1.
Goal
Read the XC7A200T die's device DNA live over JTAG, with no user bitstream, and pin every decision about it in a t27 spec. An IDCODE (0x03636093) names the part, not the die, and a host key cannot tell two dies apart; the 57-bit DNA can. This slice only reads and defines the DNA. Binding it into the signed receipt message is a later slice.
Approach
UG470 lists two JTAG routes to the DNA: FUSE_DNA (IR 0x32, 64-bit readout) and XSC_DNA (IR 0x17, between ISC_ENABLE 0x10 and ISC_DISABLE 0x16). Try both on the attached QMTech Wukong board through the existing MPSSE transport (tools/jtag/mpsse_jtag.py), record the raw shifted bits, and work out from the data which 57 bits are the DNA and in which order.
Cross-check against an independent reader: openFPGALoader --read-dna.
specs/verified/device_dna.t27 holds the decisions: IR length, opcodes, how the raw 64-bit shift decodes to the 57-bit DNA, well-formedness (not all-zero, not all-ones, reserved bits as observed), fixed-width hex rendering, and the rule for two reads agreeing. Tests use the live raw values as vectors, plus negative cases.
The Python glue under tools/jtag/ only shifts the instructions and prints the raw DR bits as hex. It does no decoding.
Acceptance
Repeated live reads return identical raw values, and the instructions that work agree on the 57-bit DNA.
t27c test-report specs/verified/device_dna.t27 reports 0 vacuous tests, run on the Railway lab.
A mutation check of about 15 mutants, with the score in the spec header.
Seal committed under .trinity/seals.
Live reading posted on this issue: raw hex, decoded DNA, instruction, repeat count, date, board.
Hand-written foreign code stays inside the own-language budget (at most 40 lines per file, 80 per diff).
Pending: once a second board is attached, distinct dies must give distinct DNA.
Live device DNA reading (evidence for the spec in #7446)
Date: 2026-10-07. The last five openocd reads were at 09:42Z.
Board: QMTech Wukong XC7A200T, IDCODE 0x13636093 as read (0x03636093 with the version nibble masked), Digilent FTDI 0x0403:0x6014, USB bus 000 dev 002 (libftdi index 0). One board attached.
No bitstream was loaded and nothing was flashed.
instruction
raw (first TDO bit = bit 0)
decoded DNA
FUSE_DNA 0x32 (64-bit register)
0x2a19bf1841ab0a4f
050d58218fd9854
XSC_DNA 0x17 between ISC_ENABLE 0x10 and ISC_DISABLE 0x16 (57-bit register, TDI high)
0xfe54337e30835614
050d58218fd9854
Repeats: 14 reads of each instruction (8 over libftdi MPSSE in two sessions, 6 over openocd 0.12.0 in six sessions). All were identical. With TDI low, XSC reads 0x0054337e30835614, which has the same 57 low bits.
Decode: the first shifted bit is the most significant. openFPGALoader --read-dna prints 0x0050d58218fd9854, which agrees.
FUSE raw = (XSC 57 bits) << 7 | 0x4F.
XSC_DNA without ISC_ENABLE reads all ones (negative control).
Pending: distinct dies give distinct DNA, and whether the 0x4F tail is constant. Both need a second board.
Activity
seal: specs/verified/device_dna.t27 on the Railway lab (Refs #7439)
gHashTag commentedon Oct 7, 2026
Live device DNA reading (evidence for the spec in #7446)
0x2a19bf1841ab0a4f050d58218fd98540xfe54337e30835614050d58218fd98540x0054337e30835614, which has the same 57 low bits.openFPGALoader --read-dnaprints0x0050d58218fd9854, which agrees.verified: die_binding's ceiling test runs at runtime (Refs #7439)
seal: die_binding and signed_receipt on the Railway lab (Refs #7439)
verified: receipt_version and dna_read_allowed in die_binding.t27 (Refs
verified: the die's 57-bit DNA, read over JTAG -- R3-2 slice 1 spec (…
seal: specs/verified/device_dna.t27 on the Railway lab (Refs #7439)
verified: the die's DNA as a signed receipt field -- R3-2 slice 2 con…
verified: die_binding's ceiling test runs at runtime (Refs #7439)
seal: die_binding and signed_receipt on the Railway lab (Refs #7439)
verified: receipt_version and dna_read_allowed in die_binding.t27 (Refs
t27c: verify the die's DNA inside a signed receipt -- R3-2 slice 2 to…
verified: independence across dies and operators -- the R3-3 contract…