Back at AMD
On the SECIP team in Ottawa from November 2026. More here soon.
Finding bugs before they become silicon.
Design verification tests a chip’s design before it is built, because a bug in silicon can never be fixed.
On the SECIP team in Ottawa from November 2026. More here soon.
Verified the boot ROM on two Tenstorrent SoCs. It is the first code a chip runs and the one part that can’t be patched after tape-out, so every path had to hold: flash discovery, image authentication, key revocation, anti-rollback.
Worked on 800G Ethernet IP for data-centre networks. Owned verification of Link Level Retry for Ultra Ethernet: when a frame gets corrupted on the wire, the link resends it from a local buffer instead of waiting on the slow end-to-end path.
Rockport’s network split traffic across many paths at once, so packets showed up out of order. Led verification of the Reorder Manager, the block that lines them back up.
Turn each requirement into something to check and something to measure. Most bugs start as a misread requirement.
Written and reviewed before the testbench is built, and the measure of when verification is finished.
The chip’s control registers are what software talks to, so each one is checked against the register map.
env
├─ agent: seqr · drv · mon
├─ scoreboard expected vs actual
└─ coverage collectorA reusable testbench: drivers feed the design, monitors watch it, a scoreboard checks every result.
assert property (
req |-> ##[1:3] ack);Rules that watch the design on every clock cycle and flag the exact moment one is broken.
constraint c_len {
len inside {[64:9216]};
}SystemVerilog tests that pick random inputs within the rules, to reach cases nobody thought to write by hand.
@cocotb.test()
async def sanity(dut):
await RisingEdge(dut.clk)Tests written in Python that can run unchanged in simulation and on an emulator.
$ vcs -sverilog -f tb.f
$ ./simv +UVM_TESTNAME=sanity_testCompiles the design and the testbench together and runs the simulation.
$ verdi -ssf waves.fsdb &
# trace X back to its driverShows every signal over time, so a wrong value can be followed back to the line that caused it.
stage('Lint') { sh 'make lint' }
stage('Smoke') { sh 'make smoke' }Runs the regressions automatically: build, lint gate, smoke tests, release.
$ grep -l UVM_ERROR */sim.log
seed_4021/sim.logSort the failures, separate real bugs from noise, and report each with a test that reproduces it.
The same design mapped onto emulation hardware, many times faster than simulation, for long tests like a full boot.
# real gate delays from SDF
$ vcs ... -sdf max:dut:top.sdfRe-runs tests on the final wired-up netlist, with real timing, before the chip is made.
coverpoint len {
bins min = {64};
bins max = {9216}; }Measures which planned scenarios have really been tested, so “done” means done.
Sign-off: every planned scenario hit, the code exercised, and every gap explained before the chip is made.