ci: quarantine the pinned UVM WASM abort - #10
Merged
Merged
Conversation
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
sv-tutorial: make lessons pass, fix wrong content, make the QA honest
2026-09-30 continuation
The repository baseline is
24175be(origin/main). The required install,unit-test, and production-build commands pass. Browser installation cannot
install OS dependencies without sudo, but an existing Chromium ran the focused
tests. The new findings and receipts are recorded at the top of
artifacts/tutorial/broken-census.mdandartifacts/tutorial/content-census.md.Branch
fleet/tutorial-fixesstarts atorigin/main(24175be). Each fix adds a vitest or e2e test thatfails before the commit and passes after it. The complete findings are in
broken-census.md(things that break)and
content-census.md(things that are wrong against IEEE 1800-2023 / 1800.2-2020).What was broken
exit code: 1" right after clicking Run, before anyoutput appeared. Its lesson list was hand-copied and had drifted: 62 of 73 lessons, with stale titles. Once
fixed, 23 of 73 solutions failed in the browser.
ci: the UVM smoke hits amox-verilogAborted()while compiling uvm-core. Theuvm_re_*lines are remarks, not the cause.uvm-nightly: red since 2026-03.e2e-waveform: cancelled at its 20-minute limit, because the specs expectmox-verilog/mox-simfor lessonsthat now run through
mox-run.mox-wasm, Mox 805b42d2) breaks 16 lessons that current native Mox runs correctly:and real cocotb 2.0.1 pass all four). The abort happened during an Asyncify rewind, so the worker never answered
and Run stayed on "Cancel" forever. The shim also lacked
ReadOnlyand cocotb 2.0'sunit=keyword, which twolessons use.
skipped all changes at the dump time when picking the signal to focus, so on modules-and-ports it picked none.
and an old toolbar protocol, and checked BMC logs before BMC had printed anything.
*_tb.mlirchecks never executed. seq and lowering failed outright, and intro and comb "passed" without printinganything.
What was wrong (content)
Fixed here:
with {}constraints areadded to the class constraints, not substituted for them (§18.7), so the "override" was infeasible.
low_bank_cis now
soft(§18.5.13), and the description explains why.logic [3:0] v = q.pop_front();in a loop body is a static variable, so its initializer runs once (§6.21).It is now
automatic.logic'(i)truncated the addresses to 1 bit (§6.24.1). It is now4'(i).rst |-> state == 0constrained a design output. It failed in simulation at thefirst edge (state X), and it did not rule out a non-reset initial state in BMC. It is now
initial assume property (@(posedge clk) rst);(§16.14.6), with the description reworded. Xcelium passes it.Mox still fails Run, because it evaluates the initial assume at every edge (TUT-SVA-7).
uvm_topandfinish_on_completionare not in IEEE 1800.2-2020 (F.7). Replaced withuvm_root::get().set_finish_on_completion(0).mem_itemfields were used inuvm_field_*macros before their declaration (§6.5).covergroup.Still open (author decisions; see content-census.md): about 100 rows. The main ones:
|=>window, throughoutmosi[*8],intersectburst, recursivetautology, reject_on vs sync_reject_on,
.triggeredrestriction.$bits(16)is described as 4 (it is 32).clk.What changed
One commit per issue, each with the test that fails before it and passes after:
24e2a82src/lessons/lesson-sources.test.js45c87e7uvm_root::get().set_finish_on_completion(0), notuvm_topsrc/lessons/lesson-sources.test.js67d45efsrc/runtime/mox-adapter.test.jscc306c9test.fail+ reason)e2e/qa-all-lessons.spec.js,e2e/lesson-run.js44fd83esoftlow_bank_c440d8d6automaticpop variable,4'(i), size check, description3c5b151@tbtestbench together with the designsrc/runtime/mox-adapter.test.js,e2e/mlir-run.spec.js, QA entries removedc9cb02asrc/lessons/lesson-sources.test.js(assumptions name only inputs)e119e6d$ mox-rune2e/lessons.spec.js,e2e/waveform.spec.js6564184e2e/cocotb-run.spec.js8783379ReadOnly(cbReadOnlySynch, §38.36.2) andunit=src/runtime/cocotb-shim.test.js,src/runtime/cocotb-worker-source.test.jsa8dcd88src/lib/vcd.test.js; toolbar and transition_next e2e46c7eede2e/waveform.spec.js,e2e/lessons.spec.jsa10a082Landed capability chapters
Added six one-lesson chapters for user-facing SystemVerilog capabilities
landed in Mox between September 22 and October 1, 2026. The UDP chapter
tracks landing tip
36b040f6190c, and the virtual-provider chapter tracks3bc88e77921e; the pinned browser WASM remains unchanged.sv/macro-formal-continuationartifacts/tutorial/capability-receipts/*macro-formal-continuation*sv/struct-field-refsartifacts/tutorial/capability-receipts/*struct-field-refs*sv/indexed-part-selectartifacts/tutorial/capability-receipts/*indexed-part-select*sv/nested-child-inputartifacts/tutorial/capability-receipts/*nested-child-input*sv/sequential-udp-initartifacts/tutorial/capability-receipts/*sequential-udp-init*sv/virtual-provider-closureartifacts/tutorial/virtual-provider-closure/*The capability receipt summaries are in
artifacts/tutorial/capability-receipts/{summary,final-summary}.tsv.Their corrected-tip hashes, native/reference argv, and the final build/e2e
receipt are recorded in
artifacts/tutorial/capability-receipts/PROVENANCE.md.Receipt coverage on origin/main
The 80 registered lesson slugs are now accounted for by either the original
generic receipts, a capability-specific bundle, or the missing-matrix bundle
at
artifacts/tutorial/receipts/20261001-missing/. That matrix records the18 previously uncovered slugs: native Mox passes for both RTL lessons and all
four MLIR testbench runs; the advanced UVM rows retain their current native
compile failures; and the cocotb native prerequisite failure is recorded as
BLOCKED, not a pass. The coverage invariant is enforced bysrc/lessons/receipt-matrix.test.js.The full browser route receipt is
artifacts/tutorial/e2e/tutorial-full-e2e-20261001.log:npm run test:e2ecompleted on October 1, 2026 with 177 passed and 54 failed (exit 1). The log
is intentionally kept even though the suite is red, so pinned-WASM failures
and current route behavior remain visible rather than being described as
landed functionality.
Compile-mode status chapter
sv/compile-mode-statusis a runnable native compile smoke test plus a statuspage for the AOT census. Its browser run is interpreter-backed; native Mox
--mode=compilepasses the solution, while the latest S4 receipt for the fivefrozen UVM rows is honestly
0/5at published tipa0c4488a587. Rows 0 and 2are
HELD; rows 1, 3, and 4 areNEW-REFUSALafter provider closure movedtheir refusal stage. The chapter and durable receipts are in
src/lessons/sv/compile-mode-status/andartifacts/tutorial/compile-mode-status/. The differential receipts bindtheir source hashes to the committed fixtures and preserve the refdiff cache
keys;
src/lessons/landed-capabilities.test.jsguards that identity.Clocking sampler retention chapter
sv/clocking-sampler-retentionis a runnable lesson for explicit#0clocking-input sampling and same-slot retention under IEEE 1800-2023 §14.3 and
§14.13. The starter fails with the default
1stepskew; the solution passes innative interpreter and compile modes and both variants have Xcelium
refdiffreceipts. The focused browser run is 1/1 through the pinned interpreter-backed
WASM runtime. Receipts and current-main MQ93 provenance are under
artifacts/tutorial/clocking-sampler-retention/.Protected envelope boundary chapter
sv/protected-envelope-boundarydocuments only Mox's landed same-buffer,comment-form callback with no keyring. The solution passes native interpreter
and compile modes; the starter fails on the missing
end_protectedmarker.Xcelium's
refdiffis deliberately recorded asreference_only_failbecauseit attempts decryption of the unkeyed envelope, and the pinned browser WASM is
an expected known failure until a WASM rebuild. The cross-include limitation
from the protected-envelope audit is stated in the lesson rather than hidden.
Receipts are under
artifacts/tutorial/protected-envelope-boundary/.WASM rebuild (done locally, NOT published; release
mox-wasmis unchanged)Built with emsdk 4.0.21 from Mox main
9c5418532b9(and landingea0fcd2): mox-verilog, mox-sim, mox-bmc andmox-lec. Mox has no wasm target for mox-run (GAPS TUT-WASM-MOXRUN), so two more commits went in:
d760369: the adapter falls back to mox-verilog + mox-sim whenmox-run.wasmis absent (vitest).24175be: the build script passes C++20 to the NATIVE host sub-build (GAPS TUT-WASM-NATIVE-CXX20).The all-lessons QA on the rebuilt WASM gave 63 passed and 11 failed (log:
ci/qa-wasm-main-9c54.log). Everyfailure is a Mox gap, so do not publish this WASM yet:
__mox_sim_*runtime hooks. This breaks thecovergroup, coverpoint-bins, classes and queues lessons.
cross(a wasm32 ABI size check).Randomization.
ltl.not, which breaks Immediate Assertions, Recursive Properties andassume property Verify. Native Mox fails the same way.
req_gnt_checkfailure. The matching QA change is in
qa-concurrent-sim-with-new-wasm.patch, which is uncommitted on purpose:it would fail against the old WASM. Apply it together with the publish.
Once these are fixed, publish, update
scripts/toolchain.lock.shand the README pins, and delete thetest.failentries that then report "unexpectedly passed".
Update 18:55 UTC: WASM with native 0033 (TUT-WASM-ALLOCA-RETIRE fix). Mox 9c54 +
0033rebuilt locally. The QAgives 67 passed and 7 failed (log
ci/qa-wasm-9c54-0033.log). Events, Classes and Objects, Randomization and Concurrent Assertionsin Simulation (with the held QA patch) now pass. The 7 left are UNLINKED-RUNTIME (15, 16, 19), CROSS-ABI (17) and
BMC-LTL-NOT (25, 47, 48). Still do not publish; 0033 is in review.
CI's UVM smoke (
cirun 36034279627, old release WASM). Theuvm_re_*lines are compile-time remarks, nota runtime
UVM/DPI/REGEXerror.mox-verilog.wasmitself aborts while compiling uvm-core (log:ci/ci-36034279627-failed.log). Recheck it against the rebuilt WASM before planning any DPI bridge change.Follow-up CI disposition (October 1, 2026). The released
mox-verilog.wasmis still the exact stale artifact(
eb6badaf759c72dd4a7dff97d025e58dea75ea0863c2461464219bee69ec65a2) that produces theuvm_config_db_implementation.svh:375warning followed byAborted(). Current-tip Mox WASM built from theeb9d0b6cf5dlineage avoids that abort but does not finish the same browser-worker UVM compile within 600 seconds,so it is not safe to repin. The ordinary
cireporting smoke now uses an explicit hash- and log-signature-checkedquarantine;
uvm-nightlyremains strict and reports the parity failure. A qualified WASM rebuild or Mox parity fix isstill required before removing the quarantine.
Left open (documentation and a legacy harness; no behaviour change, so no test)
scripts/test-all-lessons.mjspredates mox-run and accepts anyPASSline. Retire it in favour ofe2e/qa-all-lessons.spec.js, or port it to mox-run and require a final PASS with exit 0.src/tutorial-data.js/App.svelte. Lessons are insrc/lessons/and the appis SvelteKit.
Needs a Mox fix (GAPS.md)
disable iffover a Boolean property / compound immediate assert crash BMC (ltl.not).--uvm-path.initialassert/assume property is evaluated at every clock edge instead of once (§16.14.6); blocksformal-assume Run.
#0inside$dumpvars(§21.7.2.1). The viewer now tolerates it.How to test
Install the runtime assets first:
scripts/setup-surfer.shandscripts/setup-pyodide.sh(the waveform and cocotbtests are meaningless without them), plus the pinned WASM in
static/mox. Then runnpx vitest runandnpx playwright test e2e/qa-all-lessons.spec.js e2e/mlir-run.spec.js e2e/cocotb-run.spec.js e2e/lessons.spec.js e2e/waveform.spec.js.Stop any running
vite previewon port 4173 first, because Playwright reuses an existing server.Last verified at
a10a082: vitest 52/52; the five e2e specs give 90 passed and exit 0. Each known failure is atest.failwith its reason, so it will show up as "unexpectedly passed" once fixed.
🤖 Generated with Claude Code