HARDWARE SECURITY

RTL Anti-Tampering DesignLesson 2 / 16

RTL Anti-Tampering Design Lesson 2: Write a Fault Model You Can Test

A bit flip that misses a request is not evidence of a defense. Define storage, timing, recovery and trust assumptions, then interpret 42 reproducible fault cases.

16 min read

A verification engineer flips one bit near the result register after a failed signature check. No CPU fetch appears, so the report says the fault was blocked. The designer notices that the disturbance ended before the request. Did a defense work, or did the fault miss its opportunity?

Changing stored state instead can leave the error in place until a request arrives. Both tests are called bit flips, but they differ in target, timing and recovery. The name alone does not describe the experiment.

This lesson turns those conditions into a reproducible experiment contract. You will identify what an injector changes and what a trace without unauthorized acceptance actually establishes. A clear model lets someone else rerun and challenge the result.

Start with Lesson 1: why correct RTL can still be unsafe. Allow about 35–45 minutes. The examples use synchronous registers and a simplified valid/ready interface. The circuits, injector and Python exercise are original two-state teaching models. The completed checks are Python enumeration and website acceptance; RTL simulation, synthesis, formal proof and silicon fault testing have not been performed.

1. One bit flip, different outcomes

Think of the whole lesson as a school’s homework-check stamps. A student may collect today’s exam paper only after the record says both check complete and homework passed. This homework is wrong, so the fair teacher’s original decision remains fail. The attempt starts at period 0; checking finishes at period 2; the student visits the door at periods 4 and 6. Period N stands for discrete edge N, not a real class period lasting one hardware clock cycle.

Ask three questions before calling anything a bit flip: which record changes, how long does it change, and does the door see it when the student arrives? In A, a finger hides the saved fail mark at period 3 and briefly makes it look like pass. Removing the finger leaves fail intact, so period 4 sees no illusion. In B, someone changes the saved mark to pass at period 3 and leaves it there. Both visits succeed: one alteration, two consequences. In C, someone swaps the decision being handed over at period 2 while it is being recorded. The wrong decision stays in the record. The same swap at period 3 has no effect because recording has closed. In D, the record stays fail, but the final door permission is changed at period 4. D expands the final-grant fault boundary; it is a separate experiment from A–C.

Keep the teacher’s original decision separate from the saved grade. C changes the signal delivered to storage, not the independent answer as well. D changes the last permission decision; the request and acceptance mechanism still follow the rules.

Keep the fictional boot path from Lesson 1. checked_q records completion and result_q stores whether verification passed. Both must be high for permission. Instruction fetch means reading a program instruction. We observe accepted_commit at the simplified fetch interface, rather than treating it as CPU retirement or the complete execution event.

Fix the schedule: reset at edge 0, verification completes at edge 2, and valid, ready requests occur at edges 4 and 6. The image is unauthorized, so the fault-free stored result stays 0.

Invert only the observed Q at edge 3 and remove the disturbance before edge 4: the consumer sees no error at acceptance. Change the stored Q after edge 3’s update instead, with no later overwrite: the error survives into edge 4. The difference is storage and duration. The checker can remain correct throughout.

Predict what the consumer reads before inspecting the program. You need both the request schedule and the error’s retention rule. Knowing only that a flip occurred cannot determine what the accepting interface sees.

Upstream decision, result storage, observed Q and final grant are four separate targets; the trusted fetch acceptance point lies after grant logic.
Figure 1. Identify the protected event and fault locations first. The numbered sites are separate experiments, not four simultaneous injections. Open any diagram to enlarge it.

2. Write a model card another engineer can run

Write school rules that another teacher could reproduce. Wrong homework must not lead to an exam paper. From period 0 through period 7, allow at most one action, at one location, on one target bit. Visits at 4 and 6 share that opportunity. The assignment and original grade, the clock, completion signal, non-target fields, and acceptance mechanism are trusted for this experiment. That is an analysis premise, not a claim that they cannot be attacked.

School role or recordHardware counterpartDistinction to retain
Fixed homework with wrong answersFixed unauthorized imageThe assignment is not a fault target
Teacher’s original decision and the decision handed overNormal auth_ok_i and injected auth_seenC changes the delivered value; the independent reference remains unchanged
Saved grade field or pass markresult_qB changes storage; A changes only result_seen at the reader
Completed-registration markchecked_qComplete does not mean pass
Completion notice at period 2verify_done_iIt enables write_en; it is not the grade
Door permission decisiongrant_clean / exec_grant_oA–C trust the final gate; D separately targets final permission
Student arrives and the door can receive the requestfetch_valid_i / fetch_ready_iNeither is a fault budget or grade
Record of receiving the exam paperaccepted_commitRequest, ready, and grant must coincide
Independent grade and completion ledgerref_auth_pass / ref_auth_completeA testbench reference, never copied from the altered record

The grade sheet represents DUT storage. The independent ledger represents the reference. The analogy does not add a teacher or a new defense inside the chip.

The model card is a handoff document. Another engineer should be able to configure the injector and monitor from it and identify an authorization failure. Begin with case B: change stored result state once after failed verification. Keep distinct locations separate rather than labeling everything “a single-bit attack.”

FieldExplicit setting for case B
Asset and failure eventAn unauthorized image must receive no accepted_commit
Initial state and workloadReset at 0; fixed unauthorized image; completion at 2; requests at 4 and 6
Target and abstractionOne-bit result_q stored state; RTL state-transition model
Effect and recoveryOne inversion, retained until overwrite/reset; no continuously forced drive
Timing and orderChosen edge 2..7: sample acceptance, perform normal update, then change new state
Budget and unitsAt most 1 event, 1 location and 1 target bit per reset-to-edge-7 boot attempt
Trusted/excluded boundaryImage/policy, independent reference, clock/reset, verify_done, checked_q, non-target logic, handshake/acceptance and injector
Observation windowEdges 0..7 inclusive; both requests share one attempt and budget
Outcome and evidenceRecord raw Q, observed value, grant, commit and reference; no detector is implemented

These capabilities were selected for a bounded question, not measured from a product. Clock, reset and checker attacks require new models; this card does not protect those excluded targets.

Give the reviewer the trust assumptions too. A trusted reference lets the experiment identify a wrong DUT decision; trusted acceptance logic lets it record commit as specified. Faulting those elements requires a revised experiment, not just another name in the target list.

SYNFI describes spatial and temporal fault properties through location, duration and time, and configures experiments with locations, effects and simultaneous-fault counts. We use that discipline without running SYNFI. Author paper, Sections 2.1 and 3.1

3. Count events, locations and bits separately

B alters one pass mark, and both visits produce an exam paper. That still spends one action. Altering it at period 3 and again at period 5 spends two, even at the same location. A single finger held across two sampling edges can represent one two-edge pulse; B’s surviving mark represents a state change’s after-effect. Event count, duration, and acceptance count need separate fields. Reset starts the next experimental budget; this does not bound attempts over a product’s lifetime.

“Only once” needs a unit. One event can affect one location or several bits in a register. Two events can target the same location at different times. These restrictions are not interchangeable.

UnitQuestion to answerThis lesson
EventsHow many injection actions occur?One event per fault trace
LocationsHow many distinct targets are affected?One target per run
Target bitsWhich bits may change at that target?One bit; no multi-bit claim
Active intervalHow many sampled edges can an event affect?A pulse spans 1 or 2 edges; an upset’s state effect can persist
Attempts/reset ruleWhen does a new budget begin?A new boot attempt begins after another reset

A stored upset at edge 3 can affect requests at 4 and 6. That is one event with lasting consequences. Flipping the bit again at edge 5 is a second event, even at the same location, and exceeds this lesson’s budget. Repeated device restarts need another product assumption: we do not bound lifetime attempts.

Two unauthorized acceptances do not imply two injections. Event count describes the attack action; commit count describes its consequences. One retained error can affect several requests, while an event that misses all requests can have no observed consequence.

Tools also use different counting rules. FIRMER separates events per cycle, cycles with events, effect types and logic/memory targets. Its treatment of persistent faults cannot simply be renamed our “one stored-state change with retention.” Align semantics before comparing counts. FIRMER paper, Sections 1 and 3

4. Draw a Q pulse and a stored-state upset

Look at the ink on the grade sheet to distinguish A from B. A changes the reading path: result_seen = result_q XOR fi_q_xor_i. The saved ink stays intact. B acts once but changes the stored mark; later holds read the altered result_q. C swaps the delivered decision while writing is enabled, corresponding to auth_seen. The mark, the obstruction, and the handed-over decision are three different targets. Test them separately rather than changing all three under a one-location claim.

Case A adds an XOR on the observation path: result_seen = result_q ^ fi_q_xor_i. With the control high, the consumer sees the complement. With it low, the consumer sees the original Q again. The XOR does not write the register. Without feedback from that observation into D, this pulse does not change raw result_q.

result_q and fi_q_xor_i feed XOR to form result_seen, then AND with checked_q. There is no XOR feedback to D, so stored Q is unchanged.
Figure 2. Case A: an observation-path pulse. The injector is test infrastructure; no fault detector has been added.

Case B changes stored state. The teaching RTL expresses that effect with a next-state XOR: select the normal next value, invert it under fi_state_xor_i, then load the DFF. Remove the control on the next edge and the hold path reads back the already corrupted Q, retaining it. This models a state transition in RTL; it does not claim that a particle, laser or EM disturbance physically targets D.

write_en selects auth_seen or result_q feedback through a mux. A fi_state_xor_i XOR changes the DFF's next state; the subsequent hold path retains the new Q.
Figure 3. Case B's retained state effect, implemented through a D-side next-state XOR. Active-low reset clears the result; this is not an electrical storage-cell upset model.

Case C inverts auth_ok_i before capture. A pulse covering completion at edge 2 is stored, so the wrong answer survives after the pulse ends. A pulse covering only edge 3 misses the write, which has already closed. Its target is the upstream decision, separate from cases A and B, with its own trace.

force/release, backdoor deposit and an injection mux are ways to implement injection. Check their actual behavior for the simulator, net/variable and normal update process. An API name alone does not specify every upset. OpenTitan’s countermeasure verification framework also uses selected internal targets to exercise defenses; a project must still align the injection model and observation point. Official framework

5. Which value is sampled at the same edge?

At each bell, the door first uses the already stable record to decide that handover, then registration and any stored-mark alteration finish. B’s change after period 3 affects period 4. A change after period 4 cannot revise a handover already recorded at that edge. This follows sampling commit, normal update, then state upset. People can read and write at overlapping times; the teaching model fixes pre-edge and post-edge order and does not simulate those races or physical gate delays.

Read each rising edge in three steps. Stabilize inputs and pulse controls beforehand. Sample old Q, grant and commit at the edge. Complete the register update afterward. Case B’s state XOR affects the new Q, so it cannot retroactively change the commit already sampled at that edge.

Each edge stabilizes pulse controls, samples commit from old state, then updates new Q. Completion is at 2 and requests at 4 and 6; an upset after 3 persists to those requests.
Figure 4. The discrete sampling contract. The order is a model rule, not a measured gate delay; subcycle glitches and metastability are excluded.

Before edge 2’s update, the trusted reference has ref_auth_complete=0; afterward it becomes 1. verify_done_i remains trusted. Case C corrupts only auth_ok_i. Reference pass comes independently from the fixed image and policy, stays 0 for the unauthorized image, and never copies faulted result_q.

Moving acceptance by one edge or changing a state upset to a pre-edge write can change the counterexample. Driving controls with blocking assignments at posedge can also create a testbench race. Stabilize injection controls before sampling and distinguish pre/post-update observations. The Python model does not simulate event-region races.

Record Q before the edge and after the update separately. A change made after edge 3 can affect acceptance at edge 4; it cannot rewrite the event already recorded at edge 3. The Python model and RTL harness must share that ordering contract.

Compare three effects at the same edge 3

With the action fixed at period 3, A returns to fail when the finger moves, B leaves a changed mark, and C reaches a registration window that has already closed. Only B produces unauthorized acceptance at period 4. Move C to period 2 and the open write window saves the false pass. The homework and door visits stay fixed; only effect or timing changes. A and C do not trigger a detector, so their lack of acceptance cannot be reported as detected or blocked.

“Before” means settled values at sampling; “after” means stored values after the normal update and injection. The image fails. After edge 2, checked=1 and result=0. Requests stay at edges 4 and 6, so this comparison does not change the workload.

Experiment at edge 3What is observed or storedGrant at edge 4
A: Q pulse only at edge 3seen=1 but stored Q=0; the pulse then endschecked AND seen = 1 AND 0 = 0
B: flip stored Q after edge 3Q changes from 0 to 1; hold preserves 11 AND 1 = 1
C: source pulse only at edge 3write_en=0; the source is not captured again1 AND 0 = 0

B can therefore cause unauthorized acceptance at edges 4 and 6 with one injection. A and C do not: this schedule neither preserves nor uses their error. No detector blocked them. Move C to the completion sampling at edge 2 and write_en becomes 1, capturing the wrong source. Predict that row before rerunning the Python trace.

6. Match the effects to RTL, then expand a boundary

When reading RTL, treat write_en as the grade-registration window. fi_source_xor_i swaps the handed-over decision, fi_state_xor_i alters the newly stored mark, and fi_q_xor_i obscures the value seen at the door. D’s fi_grant_xor_i changes final permission directly: the record remains fail but the period-4 visit succeeds. D changes the premise that the final gate is trusted, while valid, ready, and the acceptance mechanism remain outside its target.

At an actual exam-paper handover, an auditor checks independent completion and the original grade, corresponding to ref_auth_complete AND ref_auth_pass checked at the same sampled edge whenever accepted_commit is true. The harness must separately enforce the one-action budget. Writing an SVA rule does not automatically prevent a second alteration.

Download the complete teaching injection wrapper. These fragments belong to one module. With every fi_* at 0, it reproduces Lesson 1’s vulnerable gate. The controls are for experiments and must be kept out of production RTL.

assign write_en = verify_done_i && !checked_q;
assign auth_seen = auth_ok_i ^ fi_source_xor_i;
assign result_d = (write_en ? auth_seen : result_q) ^ fi_state_xor_i;

always_ff @(posedge clk_i or negedge rst_ni) begin
  if (!rst_ni) begin
    checked_q <= 1'b0;
    result_q  <= 1'b0;
  end else begin
    if (write_en) checked_q <= 1'b1;
    result_q <= result_d;
  end
end

fi_source_xor_i changes the decision to be sampled. fi_state_xor_i changes the resulting stored state. The campaign permits one event at one target. Holding state XOR high for two edges flips twice, which is not the single-upset model here.

assign result_seen = result_q ^ fi_q_xor_i;
assign grant_clean = checked_q && result_seen;
assign exec_grant_o = grant_clean ^ fi_grant_xor_i;
assign accepted_commit = fetch_valid_i && fetch_ready_i && exec_grant_o;

Cases A, B and C exclude faults in final grant. Case D opens that boundary: fi_grant_xor_i inverts grant, while valid, ready and actual acceptance remain trusted. If the unauthorized image receives grant at edge 4, the consumer can accept it according to its contract. Results for A/B/C cannot establish protection against D.

checked_q and result_seen produce grant_clean, followed by a separate grant XOR and trusted acceptance. An independent verification monitor compares commit with image authorization.
Figure 5. Case D adds grant as a target. The trusted reference belongs to verification infrastructure, not an extra on-chip defense.

The security property remains at actual acceptance:

assert property (@(posedge clk_i) disable iff (!rst_ni)
  accepted_commit |-> ref_auth_complete && ref_auth_pass);

cover property (@(posedge clk_i) disable iff (!rst_ni)
  ref_auth_complete && ref_auth_pass ##[1:8] accepted_commit);

These properties await a testbench or formal harness; they have not been compiled or proved. |-> checks the same sampled edge, and disable iff excludes asserted reset. The cover asks for one reachable authorized path, not successful completion of every authorized attempt. Availability needs progress, timeout and recovery requirements. The harness must enforce the fault budget too; an assertion does not create a one-event model by itself.

7. Run 42 cases and read the trace before PASS

Each of the 42 exercises starts again with the same wrong homework. Report the periods when an exam paper was handed over, then identify the record changed. Altering the saved mark after period 3 leaves two handovers; altering it after period 6 leaves none because the original schedule has no later visit through period 7. These are B traces with different starting edges. The latter may still hold a wrong mark: no later visit is not a guard stopping it. The 18/42 count describes this enumeration, not measured real-world success odds.

Download the Python exercise and run Python 3. The output folder preserves every edge’s trace:

python lesson02_fault_model.py --output-dir lesson02-results

The campaign enumerates six starting edges (2..7). A/C/D each use 1- or 2-edge pulses; B uses one state-upset event per start, giving 42 fault cases. Each run resets independently and uses the same unauthorized image and request schedule. Two separate fault-free controls show the authorized image accepted at 4 and 6 and the unauthorized image accepted at neither.

ExampleUnauthorized acceptance edgesInterpretation
A: Q pulse covers only edge 3NoneNo unauthorized commit observed at 0..7; no detector, so no detection claim
B: stored upset after edge 34, 6One event affects two acceptance opportunities
C: source pulse covers edge 24, 6Completion captures the corrupted decision
C: source pulse covers only edge 3NoneNo unauthorized commit observed at 0..7; missing capture is not complete protection
D: grant pulse covers edge 44The original result remains failure, but grant changes
B: stored upset after edge 6NoneNo later request in the 0..7 schedule; no detector, and later behavior is unknown

Execution produced 18 cases with unauthorized acceptance and 24 without it in the specified window and schedule. PASS means expected controls and counterexamples were reproduced, including failures of deliberately vulnerable logic. It is not an IP security pass. Nor is 18/42 a physical attack success probability: this enumeration measures no distribution, reachability or perturbation strength.

There is no “detected” column because this lesson adds no detector. For cases without a commit, report the observation, then investigate why. Missing a request, missing the capture edge and having no later request in the window are not active blocking by a defense.

Rerun the final row with requests at 4, 6 and 7. The same upset after edge 6 now causes unauthorized acceptance at 7; the script already checks that changed schedule. The earlier negative outcome belonged to its window and workload. It cannot be renamed “fault blocked.”

8. Connect the experiment to a design and product

To improve the school process, identify the segment exposed by altering the mark, swapping the delivered grade, or changing door permission. A more elaborate grade sheet checks some storage alterations; it does not certify the teacher-to-record handover or final door. These are storage integrity, source binding, and the consumer path. The story separates responsibilities rather than proving that extra marks cover every physical fault.

No defense has been added here. The first improvement is an accurate model and reproducible failure. Then choose measures for the target: stored corruption calls for storage integrity analysis; captured wrong decisions call for producer protection and authorization binding; corrupted grant requires analysis of the consumer and final delivery path. Lesson 3 examines register integrity before later lessons cover multi-bit controls and shared failures.

Record design/model versions, target list, injection parameters, initial state, workload, horizon and counterexample trace. Also record whether injection happened and whether the requested property was evaluated. Tool timeouts, failed injection, disabled assertions and absent requests cannot count as security passes.

Track three questions separately: did injection take effect, did a sensitive request arrive, and was the property evaluated? Missing any one leaves an unresolved item. That record reveals verification gaps that a final PASS line can hide.

For prefetch, DMA, debug or secret-read paths, identify each sensitive acceptance event. Clock/reset attacks and repeated or multi-cycle injections need new effect and trust assumptions plus new controls. Changing the reference to reuse a faulted value only hides the error.

Logical analysis leaves a measurement gap. SYNFI states exclusions for subcycle transients, gate propagation delay and physical layout; this smaller Python exercise cannot answer those questions either. Product use needs post-synthesis target correspondence, physical-effect calibration and evidence that detection/blocking precedes delivery. SYNFI, Section 6

9. Read papers without importing the wrong model

Reading another fault model resembles reading another school’s exercise log. If its one action keeps a mark obscured for a whole interval, while ours lasts one sampling edge, the durations already differ. Testing the final door does not transfer a result to saved grades either. Put target, duration, and acceptance deadline on the same comparison card. This is a reading method; it does not turn this lesson into a SYNFI, VerFI, or FIRMER experiment.

SYNFI is useful for reading a specification: which subcircuit, input/expected output, gate mappings and simultaneous-fault count were chosen? Its netlist preprocessing and time assumptions differ from our edge-by-edge model.

VerFI (IEEE HOST 2020) bounds an adversary model before simulating faults with test vectors. It records undetected locations, effects and cycles. Distinguish faults revealed by test-vector comparisons, alerts from a hardware countermeasure and whether protected output escaped first. The Python exercise does not call VerFI. Author paper, Sections II and III

FIRMER parameterizes events, cycles, effects and target classes. Ask whether one event in that tool means the same thing as one injection in your card. We have not reproduced its benchmarks or SAT proofs. Paper

OpenTitan’s hardware guidelines identify sensitive operations and consequences of corrupting internal nodes or final permission signals. Those questions help populate the card’s protected event and target list; they do not prove this teaching gate secure. Official guidelines

Sources were checked on 2026-10-03. Grok completed independent cited research. Claude’s web search did not complete; it instead reviewed Codex-verified sources and the proposed model, followed by a read-only implementation audit. Codex owns source adjudication, code and deployment. Tool claims remain bounded by their own assumptions.

  1. Pascal Nasahl et al., SYNFI: Pre-Silicon Fault Analysis of an Open-Source Secure Element, TCHES 2022(4). Author version. Assignment: map simultaneous count, sites and effects to your card.
  2. Victor Arribas, Felix Wegener, Amir Moradi and Svetla Nikova, Cryptographic Fault Diagnosis using VerFI, IEEE HOST 2020, pp. 229–240. Author paper / Institution record. Assignment: identify the undetected-case fields and add your acceptance event.
  3. Huiyu Tan et al., SAT-based Formal Verification of Fault Injection Countermeasures for Cryptographic Circuits, TCHES 2024(4). CHES-hosted paper version. Assignment: distinguish events per cycle, injectable cycles and target classes from this exercise’s counts.
  4. lowRISC, Secure Hardware Design Guidelines and Security Countermeasure Verification Framework. Design / Verification. These live documents change; pin a version for project experiments.

10. Change a request time and rewrite the contract

Change only the itinerary: visit again at period 7. The pass mark altered after period 6 is still there, so that new visit receives an exam paper. The action budget remains one; the new acceptance opportunity is what changed. This corresponds to extraFetch=true and exposes the after-effect without another injection. Allowing two actions would require a separate model card, rather than changing both the itinerary and the budget while claiming a one-condition comparison.

Add edge 7 to the request schedule and predict the 42 cases again. Before changing expected answers, identify which target’s effects remain and which acceptance edge can see them. Then expand the event budget from one to two. Explain why repeat flips at one site and simultaneous faults at different sites need different enumeration.

Finish with a model card and counterexample trace a colleague can rerun without guessing injection semantics. Next comes “Register integrity,” using this contract to compare parity, complementary encoding and ECC. Publication status and lesson order are maintained in the course outline.

MY ACADEMY · LESSON FILM

Lesson video

The film explains this lesson’s data path. After a section, return to the interactive exercise and change the input or fault conditions. The animation presents a teaching model; it does not replace RTL simulation.

Download MP4 · Captions VTT

Narration uses a synthetic voice. Both the interaction and animation have model boundaries; interpret results using this lesson’s sources and validation scope.

MY ACADEMY · RTL LAB

Operate the fault model: what changed at this edge?

Compare a Q pulse at edge 3 with a state upset. The pulse changes the observed value; the upset changes stored state after the update. Try an upset at edge 6, then add an edge 7 request. The window and request schedule change the result.

Each edge applies pulse controls, samples commit, then updates registers. A state upset occurs after the normal update. The result is captured at edge 2; default requests occur at edges 4 and 6.

Evidence scope: a finite two-state teaching model ported from the existing Python exercise, observing edges 0–7. The independent reference, clock/reset and accepting endpoint remain trusted. No RTL, formal or silicon validation is performed.

result Qconsumer grantaccepted commit

Before this edge samples

After this edge updates

Trace (only edges already visited)
edgeraw Qseen Qsourcegrantcommitunauthorized

No unauthorized commit means none was observed in this window. This model has no detector. Missing a request is not detection or active blocking.

Download the original Python exercise for an independent rerun

Wrap-up: take this lesson into a design review

Threat model and assumptions

The goal is that a fixed unauthorized image receives no accepted fetch. One reset-to-edge-7 attempt includes both requests at 4 and 6, sharing at most one event at one one-bit location. A changes observed Q, B changes new stored state, C changes auth_ok before completion capture, and D separately includes final grant; each has its own trace.

Image/policy, independent reference, clock/reset, verify_done, checked_q, non-target logic and acceptance remain outside the fault scope. These are experimental trust assumptions, not claims that product targets are immune. Pulse controls stabilize before the edge; acceptance samples old Q, while B changes the new state after update.

Why the design fails

A bit flip can mean a temporary inversion on a read path or a change to stored state. The former ends when the injector turns off; the latter can survive through hold until a later accepting edge. An upstream error at completion can become the stored result. A corrupted final grant can also release an operation despite a correct upstream answer.

Reports can fail too: a pulse misses a request, no later request occurs in the window, or the property was never evaluated. Renaming such a trace 'detected and blocked' mistakes missing observation for an implemented defense.

Defenses

First make the failure reproducible with a card specifying target, effect, timing, recovery, counting units, trust and horizon. Then choose defenses for the actual failing stage. Storage integrity, producer authorization binding and consumer permission checks solve different problems.

The XORs and mux are test injectors, not defenses; no detector was added. Keep fi controls out of production and separately verify acceptance deadlines, availability and recovery policy. Lesson 3 begins comparing register countermeasures.

Validation and checks to perform

Two fault-free controls and 42 Python fault cases ran: 18 had unauthorized acceptance and 24 did not within edges 0..7 and the fixed workload. Checks covered unchanged raw Q under observation pulses, retained state upsets, upstream capture timing, untouched reference and the new counterexample after adding a request at 7. PASS reproduces expected behavior; bypass cases are not security passes.

The RTL wrapper and SVA await a harness; RTL simulation, synthesis and formal proof have not run. Further work must enforce budgets, check effective injection, distinguish pre/post-update sampling and separately report detection, timely blocking and unauthorized commit. Website-diagram acceptance is separate evidence from hardware verification.

Limits and unverified claims

This finite two-state, discrete-edge model excludes X, metastability, subcycle glitches, gate delays, layout and disturbance probabilities. The 18/42 count is not a silicon attack probability. A window with no unauthorized commit does not establish protection at later times, under other workloads or at other targets.

Clock/reset, common failures, multi-bit/repeated injections, DMA/debug and leakage are outside this campaign. Netlist and silicon work must align targets and physical effects. The per-attempt budget does not bound total device restarts.

Try a changed assumption

Change requests to edges 4, 6 and 7. Predict which effects remain at 7 before rerunning. Then allow two events in one attempt: separately specify repeat flips at one site and simultaneous injections at different sites, and identify the new traces and budget checks.

This wrap-up summarizes the lesson’s teaching cases, references and experiment scope. Checks not reported as completed remain future work.

Learning guide

RTL Anti-Tampering Design

0 / 16

Open the course outline → · Progress counts published lessons only

Prerequisites

  • Lesson 1; synchronous registers and valid/ready interfaces

What I learned

  • Write a reproducible fault-model card
  • Separate transient observations from retained state
  • Define sampling order and event-budget units
  • Interpret bounded negative results without claiming detection

Key terms

Open glossary →

Further reading

Knowledge check

1. What does a Q-path XOR pulse change?
2. One upset affects requests at 4 and 6 without another reset. How many events?
3. A state upset is applied after edge 6's update. Can it change the commit already sampled at 6?
4. No unauthorized commit appears in edges 0..7 and no detector exists. What can be reported?
5. The model excluded final grant faults. What is needed to include them?

Thanks for reading.

Take the concept with you, not just the terminology.

#RTL#Fault Model#Fault Injection#Secure Boot#Verification#SYNFI#VerFI#FIRMER