This supplemental lesson extends number systems with worked examples with expected waveforms. Study it after the core sub-lessons in this topic.
Section context: foundations. Use the diagrams, code, and exercises below together with the main lessons — they are not optional fluff; they mirror what senior engineers attach to block delivery packages.
Reproduce the worked example without looking at the solution
Explain one failure mode and how your TB catches it
State one timing or protocol assumption explicitly
Document one integration dependency on other blocks
TOPIC: number-systems
LESSON: Worked Examples and Waveforms
FLOW: spec → RTL → TB → lint → review → mergeThis lesson deepens Worked Examples and Waveforms within foundations. Senior reviewers expect you to connect mechanism to HDL fluency, width, and simulation habits — not just define terms.
Start from the spec invariant: what must always be true each cycle? Write it as a Boolean relation, timing budget, or protocol rule before coding. That invariant becomes your reference model, assertion, or waveform check.
At tape-out quality, every block needs a sign-off story: lint clean, self-checking TB, width documented. Treat this lesson as building one paragraph of that story for your project documentation.
WORKED EXAMPLES AND WAVEFORMS
inputs ──► [foundations] ──► mechanism ──► outputs
│ │
number-systems verify in sim + lintSynthesizable pattern for this topic — simulate locally and compare against your reference.
logic signed [7:0] a, b;
logic signed [8:0] sum_wide;
assign sum_wide = a + b;
wire ovf = (a[7]==b[7]) && (sum_wide[7]!=a[7]);Write the spec invariant (truth table, timing, or protocol rule).
Sketch block diagram — inputs, outputs, clock/reset domains.
Code the minimal correct version (no optimizations yet).
Run self-checking TB with corners: min, max, reset, idle.
Lint and review: width, latch, clock, CDC if applicable.
Iterate for timing/area only after functionally proven.
METRIC TYPICAL LEVER
Logic levels algebra / pipelining
Register count retiming / sharing
Wire fanout duplication / pipeline
Power clock gating / operand isolation
Debug visibility status flags / SVA / waveform probesCompare DUT vs reference on every stimulus vector
Capture first cycle of mismatch — not last
Log seed and plusargs for random regressions
Check reset release and clock alignment in TB
If waveform is ambiguous, add temporary assertions
Explain blocking vs non-blocking with a flop example.
MODEL ANSWER SKELETON
1. MECHANISM — one-sentence technical truth
2. MOTIVATION — why this structure vs alternatives
3. WHEN TO USE / SKIP — scope and assumptions
4. PITFALL — common junior mistake
5. EXAMPLE — Verilog or waveform scenarioExtend the worked example for "Worked Examples and Waveforms": add one corner case, write a self-checking test, and document one intentional pitfall you avoided. Timebox: 30–45 minutes.
Connect Worked Examples and Waveforms to HDL fluency, width, and simulation habits.
Spec → diagram → code → TB → lint is the default loop.
Document assumptions at block boundaries (width, signedness, latency).
Interview answers need mechanism + trade-off + example.
Skipping reference model — passes wrong together with DUT.
Optimizing before correct — ECO cost goes up 10×.
Ignoring tool warnings — lint/CDC/STA warnings are technical debt.
Undocumented clock/reset domain — integration surprises.
Scenario for Worked Examples and Waveforms: Lint reports latch — find incomplete case in always_comb; add defaults and re-run.
Reproduce with minimal TB — one stimulus, one check.
Isolate failing cone (logic, FSM state, or bus beat).
Fix root cause — not symptom — in RTL or TB alignment.
Add regression test that fails without the fix.
Document invariant in comment or SVA for permanence.
// Corner-case TB fragment
initial begin
for (int i = 0; i < 256; i++) begin
drive(i[7:0]);
@(posedge clk);
check(ref(i[7:0]), dut_out);
end
endElaborate clean — no OOM from unconstrained generate
Constraints cover all clocks and I/O delays
Cross-check RTL parameters vs integration top
Attach sim log + seed to code review
Implement or extend the worked example for "Worked Examples and Waveforms". Add two new test vectors that target different branches. Write a one-paragraph sign-off note covering function, corners, and what you would still verify in SoC context.
Next topics in Part: follow nav_order in sidebar.
Cross-part: timing ↔ sequential, CDC ↔ senior interview,
combinational ↔ foundations number systems.Foundations are the compression algorithm for the rest of the course: every multi-bit bus, FSM output, and STA report ultimately rests on whether you sized, signed, and simulated the bit-level behavior correctly.
For "Worked Examples and Waveforms", the invariant you defend in review is: behavior matches spec under all legal input sequences, reset flows, and backpressure patterns—not just the happy path shown in introductory diagrams.
Write the invariant as a comment above the module or as an SVA property when possible. Future you (and formal tools) will treat it as the contract.
WAVEFORM NARRATIVE — Worked Examples and Waveforms
cycle 0: reset asserted, outputs safe/idle
cycle 1-2: reset held, clocks running
cycle 3: reset released, first legal inputs
cycle 4+: check output latency (N cycles)
mark FIRST mismatch cycle — not lastAlternate pattern emphasizing debug, coverage, or integration:
// Self-checking scoreboard pattern
class Scoreboard;
int err;
function void check(string name, logic [31:0] exp, act);
if (exp !== act) begin
$error("%s exp=%h act=%h", name, exp, act);
err++;
end
endfunction
endclassNAIVE APPROACH PRODUCTION APPROACH
quick hack, one sim vector self-checking TB + corners
ignore lint warnings zero new waivers
implicit widths explicit casts/parameters
undocumented latency latency in module header commentExplain Worked Examples and Waveforms to a verification engineer — what would they assert?
What breaks first at high frequency or low voltage?
What is your rollback plan if synthesis QoR is unacceptable?
How would you debug this block with only a 32-bit GPIO trace?
Q: What is the #1 mistake with Worked Examples and Waveforms?
A:
MECHANISM: [core rule in one line]
MOTIVATION: why teams care in tape-out
PITFALL: what juniors do wrong
EXAMPLE: one Verilog line or one waveform eventFork the worked example; add one assertion or SVA cover.
Inject a bug deliberately; confirm TB or assertion catches it.
Write 5-bullet PR description for your change.
Peer review: can a teammate enable the block without asking you?
Directed sim log attached (PASS, seed noted)
Lint report clean for touched files
If sequential: reset + clocking section in README
If bus-facing: protocol cheat sheet in module doc
If timing-critical: note expected critical path endpoint