UVM
Why Scoreboards Exist
The foundation of automated checking — why observing what the DUT did isn't deciding whether it's right, how a scoreboard compares the observed result against an independently determined expected, and why that expected must come from a reference, not the DUT.
Scoreboards · Module 18 · Page 18.1
The Engineering Problem
The previous modules built a testbench that drives stimulus (agents, sequences) and observes responses (monitors broadcasting transactions, Module 13–16). But there's a gap between observing and verifying: a monitor tells you what the DUT did — it does not tell you whether what the DUT did was correct. Someone has to decide: is this output right or wrong? At small scale you might check by eye — but a real verification run is millions of transactions across thousands of random tests, and no human can inspect them. So the correctness decision must be automated — and automating it raises the real question: to decide if the output is right, you must know what the right output is — independently. Where does that expected result come from? You cannot ask the DUT (that's circular — comparing the DUT against itself always passes). The problem this chapter solves is automated checking: independently determining the expected result and comparing it against what the DUT actually did.
The answer is the scoreboard — the component that decides whether the DUT is correct by comparing the observed result (what the DUT did, from the monitor) against the expected result (what it should have done, computed independently). Its job has two ingredients: the observed (received via the analysis backbone, Module 16.7) and the expected (computed by an independent reference model / predictor from the input, Modules 18.2–18.3). The scoreboard brings them together and compares: match → pass, differ → a bug. The crucial property is the independence of the expected: it must be computed from the input by a reference that models the intended behavior, not derived from the DUT's own output — or the check is circular and always passes, catching nothing. The scoreboard is the verdict of the testbench — the automated correctness decision that makes verification able to find bugs at scale, which is exactly what enables constrained-random verification. This chapter is why scoreboards exist: observing vs deciding, the observed-vs-expected comparison, the independence of the expected, and automated checking at scale.
Why does a testbench need a scoreboard — what is the gap between observing what the DUT did and deciding whether it's correct, and why must the expected result be independently determined (from a reference model), not taken from the DUT?
Motivation — why observing isn't checking
A testbench that observes but doesn't check has seen the bug but not caught it. The reasons a scoreboard is needed:
- Observing tells you what happened, not whether it's right. A monitor reconstructs and broadcasts what the DUT did — faithfully (Module 13). But faithful observation of a wrong result is still wrong — someone must judge the result against what it should be.
- The correctness decision must be automated. A real run is millions of transactions across thousands of random tests. No human can inspect them. The only way to check at scale is to automate the pass/fail decision — which is the scoreboard's job.
- Automated checking is what enables constrained-random. Constrained-random verification generates huge volumes of unpredictable stimulus — valuable precisely because it hits cases a human wouldn't write. But random stimulus is useless without an automated checker that knows the expected result for each random case — the scoreboard is what makes random verification check anything.
- You must know the expected result to decide. To decide if an output is right, you must know the right output — for that specific input. That requires independently computing the expected result from the input — a reference model (Modules 18.2–18.3).
- The expected must be independent of the DUT. If the expected comes from the DUT (the DUT's own output, or shared state), the check is circular — comparing the DUT against itself always passes. The independence is what makes the check meaningful.
The motivation, in one line: a monitor observes what the DUT did but cannot decide if it's right, and a real run has millions of transactions no human can inspect — so the correctness decision must be automated by a scoreboard that independently computes the expected result (from the input, via a reference) and compares it against the observed, which is what makes verification able to find bugs at scale (and what makes constrained-random check anything).
Mental Model
Hold the scoreboard as the grader with an independently-computed answer key:
A scoreboard is a grader: it grades the DUT's answer against an answer key it computed itself from the question — independently — not by copying the student's paper. The grade is meaningful only because the key is independent; an answer key copied from the student always agrees with the student. Picture grading an exam. The student is the DUT; the student's answers are the DUT's outputs (what it did, observed by the monitor). To grade, you need an answer key — the correct answers (the expected results). The crucial part is where the key comes from: a good grader works out the correct answer themselves — independently, from the question (the input), using their own understanding of the subject (a reference model of the intended behavior). Then they compare the student's answer against their independently-computed key: match → correct (pass), differ → wrong (a bug). The grade is meaningful precisely because the key is independent — it represents what the answer should be, regardless of what the student wrote. Now the fatal mistake: a lazy grader who "computes" the answer key by copying the student's own paper. Of course the student's answer then "matches" the key — they're the same paper! The grader passes everyone, catching no mistakes, because the key isn't independent — it's the student's own work, so the comparison is circular. A real grader never copies the student; they compute the correct answer from the question, independently, so the comparison means something. The whole value of the grader is the independent key.
So the scoreboard is the grader with an independent answer key: it computes the expected result itself, from the input, via a reference model of the intended behavior (not from the DUT), and grades the DUT's observed output against it — match → pass, differ → bug. The independence of the key (expected) is what makes the grade meaningful: a key copied from the DUT always agrees with the DUT (circular, catches nothing); a key computed independently from the input represents the truth and catches the DUT's errors. Compute the right answer from the question yourself — never grade by copying the student's paper.
Visual Explanation — the scoreboard compares observed against expected
The defining picture is the comparison: the scoreboard takes the observed (from the monitor) and the expected (from an independent reference) and compares them to a verdict.
The figure shows the scoreboard's defining structure — the comparison of observed against expected, from independent sources. The input stimulus (the test) goes to both the DUT and an independent reference model. The DUT produces an output, which the monitor observes and sends to the scoreboard (the observed — what the DUT did). The reference model independently computes what the output should be (the expected — from the same input) and sends that to the scoreboard. The scoreboard compares: match → pass, differ → a bug (the verdict). The crucial reading is the two independent paths into the comparison: the observed comes from the DUT (via the monitor), and the expected comes from the reference model — both fed the same input, but computing the output independently. The brand-colored reference model is what produces the independent expected; the success-colored scoreboard is where the comparison happens; the verdict is the output. This is the anatomy of automated checking: fork the input to both the DUT and a reference, let each produce an output, and compare — the DUT's output (observed) against the reference's output (expected). The independence is structural: the reference model computes the expected from the input, not from the DUT's output, so the comparison means something — a DUT bug makes the observed differ from the expected, and the scoreboard catches it. The diagram is the scoreboard's essence: two independent computations of the same operation — the DUT's (observed) and the reference's (expected) — brought together and compared, with the verdict being the testbench's decision on whether the DUT is correct.
RTL / Simulation Perspective — the scoreboard's compare
In code, the scoreboard receives the observed and expected (often via analysis writes), pairs them, and compares — declaring pass or flagging a bug. The code shows the core.
class my_scoreboard extends uvm_scoreboard;
`uvm_component_utils(my_scoreboard)
// two analysis inputs: the EXPECTED (from the reference/predictor) and the ACTUAL (from the monitor)
`uvm_analysis_imp_decl(_expected)
`uvm_analysis_imp_decl(_actual)
uvm_analysis_imp_expected #(bus_txn, my_scoreboard) exp_imp;
uvm_analysis_imp_actual #(bus_txn, my_scoreboard) act_imp;
bus_txn expected_q[$];
// EXPECTED comes from the reference model (computed INDEPENDENTLY from the input)
function void write_expected(bus_txn t); expected_q.push_back(t); endfunction
// ACTUAL comes from the monitor (what the DUT actually did) → COMPARE against expected
function void write_actual(bus_txn t);
bus_txn e = expected_q.pop_front(); // the matching expected
if (t.compare(e)) `uvm_info("SB", "MATCH (pass)", UVM_HIGH)
else `uvm_error("SB", $sformatf("MISMATCH: got %0h, expected %0h", t.data, e.data))
endfunction
endclass
// the EXPECTED must be computed by an INDEPENDENT reference — NOT taken from the DUT (DebugLab).The code shows the scoreboard's core mechanism. It has two analysis inputs (distinguished by uvm_analysis_imp_decl, Module 16.4): the expected (from the reference model / predictor) and the actual (from the monitor). write_expected receives the expected result — computed independently from the input — and queues it. write_actual receives what the DUT actually did and compares it against the matching expected (t.compare(e)): a match is a pass (uvm_info), a mismatch is a bug (uvm_error with the got vs expected values). The closing comment states the crucial property: the expected must be computed by an independent reference — not taken from the DUT (the DebugLab). The shape to carry: a scoreboard receives two streams — the expected (from an independent reference) and the actual (from the monitor) — pairs them, and compares; match → pass, differ → flag a bug with the values. The two analysis inputs are the observed-vs-expected structure in code; the comparison (compare) is the correctness decision; and the independence of the expected (from a reference, not the DUT) is what makes the comparison meaningful. This is automated checking: every transaction the monitor broadcasts arrives at write_actual and is checked against the expected — automatically, at scale, without a human looking. The scoreboard turns the monitor's observations into a stream of pass/fail verdicts — the testbench's correctness decision, automated.
Verification Perspective — the independence of the expected
The one property that makes a scoreboard work is the independence of the expected — it must be computed from the input, not derived from the DUT. Seeing the circular failure is seeing why.
The figure contrasts the correct (independent) and broken (circular) ways to get the expected. Correct (top): the expected is computed from the input by a reference model, independently of the DUT — so it represents what the output should be, and a DUT bug makes the observed differ from the expected, caught (a meaningful check). Circular (bottom): the expected is derived from the DUT's own output — so it always matches the observed (they're the same thing), and the scoreboard compares the DUT against itself and always passes, catching nothing (a no-op). The verification insight is that independence is the entire value of the scoreboard. A scoreboard's job is to catch the case where the DUT did something different from what it should. That requires two independent computations of what the output should be: the DUT's (which might be wrong) and the reference's (which is correct by construction — it models the intended behavior). If the expected is taken from the DUT, there's only one computation, compared to itself — so the scoreboard can never see a difference, because there's nothing to differ from. The warning-colored circular path is the most insidious scoreboard bug precisely because it looks like a working scoreboard (it runs, it compares, it reports passes) while checking nothing — a false sense of security on a grand scale (it passes every test, including broken DUTs). The brand-colored independent reference is what makes the check real. The figure is the core principle of the entire module: the expected must come from an independent source (a reference model of the intended behavior, computed from the input) — never from the DUT — because the whole point of checking is to compare the DUT's result against an independent notion of correct, and a DUT-derived expected destroys that independence, making the check a no-op. Independence is not a detail — it is the check.
Runtime / Execution Flow — automated checking at scale
At run time, the scoreboard runs a checking loop — every transaction, automatically: receive observed, get expected, compare, verdict. The flow shows the loop that scales.
The flow shows the automated checking loop — the engine of verification at scale. Observe (step 1): the monitor observes the DUT output — the observed result arrives at the scoreboard. Compute expected (step 2): the reference model has independently computed what the output should be, from the same input. Compare (step 3): the scoreboard compares observed vs expected — match → pass, differ → a bug (the automated correctness decision). Repeat (step 4): the loop runs automatically for every transaction — millions across thousands of random tests — no human inspecting. The runtime insight is that this loop is what makes verification scale: the correctness decision — which a human would make one transaction at a time — is automated and runs on every transaction, unattended. This is what enables constrained-random verification: random stimulus generates huge volumes of unpredictable cases (Module 8's value), but random cases are only useful if each is checked — and the scoreboard checks each against its independently-computed expected, automatically. Without the scoreboard, random stimulus would exercise the DUT but check nothing (you'd see activity but not know if it's right). With it, every random case is a checked case — so the verification finds bugs in cases a human would never have written (or checked). The flow is the reason the scoreboard is the foundation of automated checking: it turns the testbench's observations into a continuous stream of automated verdicts, scaling the correctness decision from one-at-a-time human inspection to millions-per-run automated comparison — which is what makes modern verification possible. The scoreboard is where the testbench decides, automatically and at scale, whether the DUT is right.
Waveform Perspective — observed vs expected, transaction by transaction
The scoreboard's checking is visible on a timeline: for each transaction, the observed and expected values are compared — a match (pass) and, when the DUT is wrong, a mismatch (the caught bug). The waveform shows both.
The scoreboard compares observed against expected per transaction — a match (pass) and a caught mismatch (bug)
12 cyclesThe waveform shows the scoreboard checking transaction by transaction. For the first transaction, the observed DUT output (obs=A4) equals the independently-computed expected (exp=A4): sb_match pulses (a pass). For the second, the DUT produced obs=B0 but the reference computed exp=C1 — they differ, so sb_mismatch pulses (a bug caught). The crucial reading is that each transaction gets a verdict — the scoreboard compares the two independent values and declares pass or fail — and the mismatch (B0 ≠ C1) is a real DUT error because the expected (C1) came from the reference model, not the DUT. The picture to carry is the per-transaction comparison: two values (obs, exp) side by side, a verdict (sb_match / sb_mismatch) for each — the scoreboard's output is a stream of verdicts, one per transaction. The match (txn 1) confirms the DUT was right for that case; the mismatch (txn 2) catches the DUT being wrong. The independence is what makes the mismatch meaningful: because exp=C1 was computed by the reference (not taken from the DUT), the fact that obs=B0 ≠ exp=C1 means the DUT produced the wrong result — a real bug. Reading a scoreboard's checking — for each transaction, does the observed equal the independently-computed expected? — is reading the verdict stream. The observed-vs-expected comparison per transaction, with an independent expected is the essence of automated checking: every transaction judged against what it should have been, automatically — pass when the DUT is right, bug when it's wrong, caught the moment it happens.
DebugLab — the scoreboard that passed everything because expected came from the DUT
A scoreboard that caught nothing because its expected was derived from the DUT's own output
A scoreboard passed every test — thousands of random tests, zero mismatches. The team had high confidence. Then a deliberately broken DUT (a known functional bug injected) was run through the same scoreboard — and it still passed, zero mismatches. The scoreboard reported passes on a DUT known to be wrong. It was comparing something, running fine, emitting "MATCH" — but it caught nothing, not even a deliberate bug.
The scoreboard's expected was derived from the DUT's own output (not computed independently from the input), so the expected always equaled the observed — the scoreboard was comparing the DUT against itself, which always matches:
✗ EXPECTED derived from the DUT's output (circular — always matches):
function void write_actual(bus_txn t);
bus_txn e = t.clone(); // ✗ "expected" is just a COPY of the DUT's own output
if (t.compare(e)) ... // t == e ALWAYS (same data) → always MATCH → catches nothing
// the scoreboard compares the DUT's output to a copy of itself → passes everything, even a broken DUT
✓ EXPECTED computed INDEPENDENTLY from the input by a reference model:
function void write_expected(bus_txn predicted); expected_q.push_back(predicted); endfunction
function void write_actual(bus_txn t);
bus_txn e = expected_q.pop_front(); // ✓ expected = reference's INDEPENDENT computation
if (t.compare(e)) ... else `uvm_error(...) // now a DUT bug → observed != expected → CAUGHT
// the reference models the INTENDED behavior, computes expected FROM THE INPUT, independent of the DUTThis is the circular-check bug — the most fundamental and most dangerous scoreboard failure, because it looks like a working scoreboard while checking nothing. The scoreboard's write_actual derived the expected from the DUT's own output (here, a clone of t — but it could be any path where the expected originates from the DUT, not an independent reference). So the expected always equaled the observed — they were the same value — and t.compare(e) always returned match. The scoreboard was comparing the DUT against itself, which can never differ, so it passed everything — including a deliberately broken DUT. The tell is exactly this: a scoreboard that passes every test, even an injected bug — it's running, comparing, reporting matches, but the expected is not independent, so the comparison is a no-op. The danger is the false confidence: the team believed the DUT was verified (thousands of passing tests), but the scoreboard was never checking anything — a broken DUT would ship. The fix is to compute the expected independently from the input, via a reference model that models the intended behavior: write_expected receives the reference's independent computation, and write_actual compares the DUT's output against that — so a DUT bug makes observed ≠ expected and is caught. The general lesson, and the chapter's thesis: the scoreboard's expected must be independently determined — computed from the input by a reference that models the intended behavior, not derived from the DUT's output — because the whole point of checking is to compare the DUT against an independent notion of correct, and a DUT-derived expected makes the scoreboard compare the DUT against itself (circular), which always passes and catches nothing. Always verify the scoreboard catches an injected bug — a scoreboard that passes a known-broken DUT is not checking; the independence of the expected is the check. Compute the answer key from the question — never from the student's paper.
The tell is a scoreboard that passes everything, including a known-broken DUT. Diagnose circular checks:
- Inject a known bug and confirm it's caught. A scoreboard that passes a deliberately broken DUT is not checking; the expected isn't independent.
- Trace where the expected comes from. If it's derived from the DUT's output (a clone, shared state, or the same monitor stream), it's circular.
- Confirm an independent reference computes the expected. A real scoreboard has a reference model that computes expected from the input, separate from the DUT.
- Be suspicious of a perfect pass rate. Thousands of passes with zero mismatches across random tests can mean a no-op check, not a perfect DUT.
Compute the expected independently, and prove the check works:
- Compute expected from the input via a reference model. The expected must model the intended behavior and be computed independently of the DUT.
- Never derive expected from the DUT's output. A clone, shared state, or the DUT's own stream makes the check circular.
- Always test with an injected bug. Confirm a deliberate DUT bug is caught — proof the scoreboard actually checks.
- Keep the reference and DUT separate. The reference's computation must not depend on the DUT's result in any way.
The one-sentence lesson: the scoreboard's expected must be independently determined — computed from the input by a reference model that models the intended behavior, not derived from the DUT's output — because a DUT-derived expected makes the scoreboard compare the DUT against itself (circular), which always passes and catches nothing; always confirm the scoreboard catches an injected bug.
Common Mistakes
- Deriving the expected from the DUT. A clone, shared state, or the DUT's own output makes the check circular and always passing; compute expected independently from the input.
- Observing without checking. A monitor that broadcasts observations isn't checking; a scoreboard must compare them against an expected, or you see activity but catch no bugs.
- Trusting a perfect pass rate. Thousands of passes with zero mismatches can be a no-op check; always confirm an injected bug is caught.
- No reference model for the expected. Without an independent computation of the intended behavior, there's no meaningful expected to compare against.
- Checking by eye at scale. Millions of random transactions can't be inspected manually; automate the correctness decision in a scoreboard.
- Forgetting the scoreboard is what makes random useful. Constrained-random stimulus checks nothing without a scoreboard that knows the expected for each random case.
Senior Design Review Notes
Interview Insights
Because observing what the DUT did is not the same as deciding whether it's correct, and at scale that correctness decision must be automated. A testbench drives stimulus and observes responses — the agents drive, the monitors observe and broadcast what the DUT did. But a monitor faithfully reporting a wrong result is still reporting something wrong; someone has to judge the result against what it should be. That judgment is the scoreboard's job. It's needed because a real verification run is millions of transactions across thousands of random tests, and no human can inspect them, so the pass/fail decision must be automated. The scoreboard automates it by comparing the observed result, what the DUT actually did, against the expected result, what it should have done. Its two ingredients are the observed, received from the monitor via the analysis backbone, and the expected, computed independently by a reference model or predictor from the input. The scoreboard pairs them and compares: a match is a pass, a difference is a bug. This is also what makes constrained-random verification useful — random stimulus generates huge volumes of unpredictable cases, valuable because they hit cases a human wouldn't write, but random cases are only useful if each is checked, and the scoreboard checks each against its independently-computed expected result. Without a scoreboard, random stimulus would exercise the DUT but check nothing; you'd see activity but not know if it's right. The mental model is a grader with an independently-computed answer key: it grades the DUT's answer against the correct answer it worked out itself from the question. So the scoreboard exists to automate the correctness decision — to turn observations into pass/fail verdicts — which is the foundation of being able to find bugs at scale.
Because the whole point of checking is to compare the DUT's result against an independent notion of correct, and if the expected comes from the DUT, the comparison is circular and always passes. A scoreboard's job is to catch the case where the DUT did something different from what it should. That requires two independent computations of what the output should be: the DUT's computation, which might be wrong, and a reference's computation, which is correct by construction because it models the intended behavior. The scoreboard compares them, and a difference means the DUT is wrong. But if the expected is taken from the DUT — a clone of its output, shared state, or the DUT's own stream — then there's really only one computation, compared to itself. The expected always equals the observed, so the comparison can never see a difference, and the scoreboard passes everything, including a deliberately broken DUT. This circular check is the most dangerous scoreboard bug precisely because it looks like a working scoreboard: it runs, it compares, it reports matches, but it checks nothing. The result is false confidence — thousands of passing tests on a DUT that was never actually checked, so a broken design could ship. The fix is to compute the expected independently from the input, via a reference model that models the intended behavior, separate from the DUT in every way. Then a DUT bug makes the observed differ from the expected and is caught. The way to prove the check is real is to inject a known bug and confirm it's caught — a scoreboard that passes a known-broken DUT is not checking. The answer-key analogy captures it: you compute the correct answer from the question yourself, independently, never by copying the student's paper, because a key copied from the student always agrees with the student. So independence isn't a detail; it is the check.
The two ingredients are the observed result and the expected result. The observed is what the DUT actually did, and it comes from the monitor: the monitor observes the DUT's output, reconstructs it into a transaction, and broadcasts it through the analysis backbone to the scoreboard. The expected is what the output should be, and it comes from an independent reference model or predictor that computes it from the input — modeling the intended behavior, independently of the DUT. The scoreboard brings these two together and compares them: if they match, the DUT was correct for that case, a pass; if they differ, the DUT is wrong, a bug. The key relationship is that the observed and expected are two independent computations of the same operation — the DUT's and the reference's — both fed the same input. The observed might be wrong, because the DUT might have a bug; the expected is correct by construction, because the reference models what should happen. So the comparison decides whether the DUT matched the intended behavior. In code, this often appears as two analysis inputs to the scoreboard, distinguished so the scoreboard knows which stream is which — one receiving the expected from the reference and one receiving the actual from the monitor — and the scoreboard pairs and compares them. The critical point is the source of the expected: it must come from the independent reference, not from the DUT, or the check is circular. Without the expected, you'd only have observation — you'd see what the DUT did but have nothing to judge it against, so you'd catch no bugs. The expected is what turns observation into checking. So the observed comes from the monitor, the expected from an independent reference, and the scoreboard compares them to render the verdict.
By automatically checking every random transaction against its independently-computed expected result, so random stimulus actually verifies correctness rather than just exercising the DUT. Constrained-random verification generates large volumes of unpredictable stimulus, which is valuable because it hits cases a human wouldn't think to write directly, exploring the state space broadly. But random stimulus on its own only exercises the DUT — it makes things happen, but it doesn't tell you whether what happened was correct. To get value from random stimulus, every random case must be checked, and that's impossible to do by hand because there are millions of cases and they're unpredictable, so you don't know in advance what each one's correct output is. The scoreboard solves this. For each random case, a reference model independently computes what the output should be for that specific input, and the scoreboard compares the DUT's observed output against it. So each random case becomes a checked case — automatically, without a human inspecting. This is the engine that makes constrained-random work: the randomization explores the space, and the scoreboard provides the automated correctness decision for every point it explores. Without the scoreboard, you could generate millions of random transactions but learn nothing about correctness, because you'd have no way to know if any of them produced the right result. With it, the verification finds bugs in cases no human would have written or checked, which is the whole reason to use constrained-random in the first place. The scoreboard and constrained-random are complementary: random generates the cases, the scoreboard checks them. The automated, independent, per-transaction check is what turns raw random activity into meaningful verification, scaling the correctness decision from one-at-a-time human inspection to millions per run.
A monitor observes what the DUT did, while a scoreboard decides whether what the DUT did was correct — observation versus judgment. The monitor sits at the interface, samples the signals, reconstructs them into transactions representing what actually happened on the pins, and broadcasts those observed transactions to the rest of the testbench. Its job is faithful, independent observation — it reports the truth of what occurred, but it makes no judgment about whether that's right or wrong. The scoreboard takes the monitor's observations and judges them: it compares each observed result against an expected result, computed independently by a reference model, and declares a pass if they match or a bug if they differ. So the monitor answers "what did the DUT do?" and the scoreboard answers "was that correct?" They're complementary and both necessary. The monitor provides one of the scoreboard's two ingredients, the observed result; the other ingredient, the expected, comes from a reference model. Without the monitor, the scoreboard would have nothing to check, no observed result. Without the scoreboard, the monitor's observations would just be reported activity with no verdict — you'd see what happened but not know if it was right. A useful way to see it: the monitor is the witness who reports what they saw, and the scoreboard is the judge who compares that testimony against the law to render a verdict. The monitor must be independent and accurate so its observations are ground truth; the scoreboard must have an independent expected so its comparison is meaningful. Together, the monitor observes and the scoreboard checks, which is the division between seeing what happened and deciding whether it was correct — and you need both to actually find bugs.
Exercises
- State the gap. Explain why observing what the DUT did isn't the same as checking it, and what closes the gap.
- Name the ingredients. Identify the scoreboard's two inputs and where each comes from.
- Spot the circular check. Given a scoreboard whose expected is a clone of the DUT's output, explain why it catches nothing and how to fix it.
- Connect to random. Explain why constrained-random verification needs a scoreboard to be useful.
Summary
- A scoreboard decides whether the DUT is correct by comparing the observed result (what the DUT did, from the monitor) against the expected result (what it should have done, computed independently) — match → pass, differ → bug.
- Observing is not checking: a monitor faithfully reports what the DUT did, but someone must judge it against what it should be — and at scale (millions of transactions, thousands of random tests) that correctness decision must be automated.
- The scoreboard's two ingredients: the observed (from the monitor, via the analysis backbone) and the expected (computed by an independent reference model / predictor from the input); it brings them together and compares.
- The expected must be independent of the DUT — computed from the input by a reference that models the intended behavior, never derived from the DUT's output — or the check is circular (compares the DUT against itself), always passes, and catches nothing.
- The durable rule of thumb: a scoreboard automates the correctness decision by comparing the observed DUT result against an independently-computed expected — the expected must come from a reference model that computes it from the input, never from the DUT (which makes the check circular and a no-op); always prove the scoreboard catches an injected bug, because independence of the expected is the check, and it's what makes verification find bugs at scale.
Next — Predictors: the component that produces the expected — the predictor: how it receives the input stimulus, models the DUT's intended behavior, and computes the expected result the scoreboard compares against, the patterns for building one, and how it sits alongside the scoreboard in the checking architecture.