What's Changed
New Features 🎉
- Add derived clock support for simulator by @dalance in #2679
- Add --out-dir option to veryl build for redirecting output location by @mvanhorn in #2730
- Incremental build with disk cache by @dalance in #2815
- feat(simulator): add $tb::file handle type for native testbench file output by @dalance in #2860
- Cocotb runner inherits the Verilator build and simulate args by @jbeaurivage in #2761
- feat(synthesizer): infer SRAM blocks for large arrays instead of FF+mux by @dalance in #2895
- Expose resolved dependency metadata for external tools by @pxlsy2000 in #2934
Other Changes
- Fix some minor bugs by @dalance in #2684
- Improve simulator performance by @dalance in #2686
- sim: fix wide signed compare for operands of different widths by @dalance in #2687
- sim: bound AOT-C cc compiles with a global worker pool by @dalance in #2688
- sim: execute always_ff statements that follow the if_reset block by @dalance in #2689
- analyzer: propagate clock domain through operators (fix CDC laundering) by @dalance in #2690
- analyzer: avoid panic in ValueBigUint::to_value_u64 on oversized payload by @dalance in #2691
- analyzer: return x for out-of-range bit-select instead of panicking by @dalance in #2692
- analyzer: clamp constant shift amount >= width to avoid panic by @dalance in #2693
- analyzer: refuse to enumerate a zero-step for-loop by @dalance in #2694
- Fix msb after unpacked array by @dalance in #2695
- analyzer: guard against cyclic alias chains (stack overflow) by @dalance in #2696
- emitter: emit elsif/else attribute guards inside statement blocks by @dalance in #2697
- ci: run macOS regression tests natively on arm64 by @dalance in #2698
- emitter: emit explicit enum values when a member is conditional by @dalance in #2699
- emitter: keep the signed qualifier on a type-inferred declaration by @dalance in #2700
- emitter: keep unpacked array dimensions on a type-inferred declaration by @dalance in #2701
- emitter: fix panic on a width-less decimal zero with underscores by @dalance in #2702
- sim: honor case first-match in the Cranelift br_table lowering by @dalance in #2703
- sim(cc): mask unary BitNot/Sub result to width for inlined consumers by @dalance in #2704
- analyzer: preserve signedness of an as-cast to a signed type in const-eval by @dalance in #2705
- analyzer: guard Op::eval shift against amount >= usize width by @dalance in #2706
- analyzer: mask constant ** result to width and stop truncating the exponent by @dalance in #2707
- analyzer: make a unary prefix bind tighter than an as-cast by @dalance in #2708
- analyzer: store enum member values as BigUint to support one_hot wider than 64 bits by @dalance in #2709
- parser: parse the newline-terminated buffer so a trailing line comment lexes by @dalance in #2710
- analyzer: reject extra arguments to single-argument attributes by @dalance in #2711
- analyzer: diagnose enum variants that share the same value by @dalance in #2712
- analyzer: diagnose a named function argument connected more than once by @dalance in #2713
- simulator: pass AOT-C test cache dir explicitly to fix CI flake by @dalance in #2714
- analyzer: reject a for-loop with a zero additive step by @dalance in #2715
- analyzer: reject an empty exclusive range whose lower bound is not below the upper by @dalance in #2716
- ci: make rust-cache restore non-fatal and disable matrix fail-fast by @dalance in #2717
- fix: skip wildcard-import ambiguity for
#[ifdef]-exclusive decls by @dalance in #2718 - Fix analayzer panic by @taichi-ishitani in #2722
- fix: avoid panic on
$svmodule instance in native simulator by @dalance in #2723 - fix(veryl-test): produce honest diagnostics and log lines for failing native tests by @dalance in #2726
- fix(simulator): provide accurate combinational_loop diagnostics by @dalance in #2728
- fix(analyzer): support indexed modport array in inst port connection by @dalance in #2729
- ci: share a single rust-cache key across codspeed benchmark packages by @dalance in #2731
- fix(simulator): emit valid cranelift IR across narrow/wide value boundaries by @dalance in #2732
- ci: bound the Actions cache by pruning stale generations instead of sharing keys by @dalance in #2733
- fix(simulator): support partial-index array references in IR conv by @dalance in #2734
- analyzer: sign-extend comptime widening as-cast of a signed operand by @dalance in #2737
- analyzer,emitter: strip underscores in all_bit literal width prefix by @dalance in #2738
- formatter: make case/switch arm-isolation estimate layout-independent by @dalance in #2739
- analyzer: detect cross-depth wildcard-import ambiguity by @dalance in #2740
- analyzer: anchor mangled enum-member token to the real member for readable diagnostics by @dalance in #2741
- parser: drop the unsupported unicode-escape alternative from string literals by @dalance in #2742
- fix(simulator): detect derived clocks declared inside child instances by @dalance in #2743
- analyzer: reject non-constant part-select width by @dalance in #2744
- ci: drop rust-cache from wasm and highlightgen jobs by @dalance in #2745
- fix(metadata): write Veryl.lock atomically to avoid concurrent-read races by @dalance in #2746
- fix(analyzer): mark const reads with dynamic index as non-const by @dalance in #2747
- fix(simulator): preserve part-select window width in dynamic bit-select by @dalance in #2748
- fix(simulator): size unsized fill literals on assignment RHS for JIT backends by @dalance in #2749
- test(simulator): cover wide dynamic part-select write across backends by @dalance in #2750
- Fix simulator bugs by @dalance in #2754
- sim: add a one-pass comb-scheduling fast path for reorder-hazard-free blocks by @dalance in #2755
- chore(deps): Bump wellen from 0.24.2 to 0.25.2 by @dalance in #2757
- test: add heliodor submodule for regression and CodSpeed boot benchmark by @dalance in #2758
- fix comb loop false positive caused by unrelated assigns by @MurakamiShun in #2760
- ci: add sccache + R2 cache (worker, setup-sccache action) on std and heliodor by @dalance in #2763
- ci: extend sccache to gen_sv/clippy/cocotb and add slim cargo registry cache by @dalance in #2764
- ci: cache build matrix via sccache (regression fully off rust-cache) by @dalance in #2765
- ci: build release-verylup veryl once and share via artifact to std/heliodor/cocotb by @dalance in #2766
- ci: keep Windows on rust-cache; sccache with 4x job oversubscribe elsewhere by @dalance in #2768
- ci: disable sccache per-run stat annotations now rollout is done by @dalance in #2770
- ci: enable codspeed walltime heliodor boot benchmark by @dalance in #2771
- sim: cover wide-value comb/event codegen on --backend cranelift by @dalance in #2773
- fix(simulator): order write-after-read in flattened comb scheduling so a re-write can't clobber an earlier read by @dalance in #2778
- Fix array range support by @dalance in #2782
- analyzer: confine clock/reset-ness to declarations and reject implicit conversion at ports by @dalance in #2783
- Fix part select position calcuration for user defined type by @taichi-ishitani in #2780
- fix(analyzer): escalate non-constant part-select width to an error to stop emitting illegal SystemVerilog by @dalance in #2784
- Fix reset value of FFs in
delaymodule by @taichi-ishitani in #2781 - fix(analyzer): reject struct/union/enum type inference instead of emitting a 1-bit logic declaration by @dalance in #2785
- fix(analyzer): bound expression nesting depth to report exceed_limit instead of overflowing the stack by @dalance in #2787
- sim: disable SLP vectorization for AOT-C event sources by @dalance in #2788
- ci: run the heliodor single-hart Linux boot test in regression by @dalance in #2786
- perf(analyzer): cache namespace generic maps and resolve failures, store symbols as Rc to cut analyze_post_pass1 time by @dalance in #2789
- ci: work around spurious HTTP/2 crate download errors and restore wasm/highlightgen rust-cache by @dalance in #2790
- sim: fix inst port connection lowering and rhs_select codegen for wide sources by @dalance in #2791
- ci: revert cargo HTTP/2 workaround env vars that invalidated the sccache key by @dalance in #2794
- fix(simulator): re-key nested internal clock/reset events to globally-unique ids to avoid ancestor port id collisions by @dalance in #2793
- fix(simulator): grow write-log pools on overflow instead of dropping entries or corrupting the heap by @dalance in #2792
- fix(simulator): fire master-gated derived clocks pre-commit with the master event (ICG latch semantics) by @dalance in #2796
- fix(analyzer): treat reduction and logical-not operands as self-determined per IEEE 1800 by @dalance in #2797
- Fix false positive of
invalid_range_assignin generic component by @taichi-ishitani in #2800 - fix(analyzer,simulator): make as-cast a width-context boundary and truncate narrowing casts at runtime by @dalance in #2799
- fix(analyzer,simulator): derive comparison signedness from the operands instead of the parent context by @dalance in #2801
- fix(analyzer,simulator): sign-extend both-signed mixed-width operands of equality operators by @dalance in #2802
- fix(simulator): align Cranelift consumers with the scalar representation of narrow nodes over wide operands and type-guard sign expansion by @dalance in #2803
- fix(analyzer,simulator): sign-extend the narrower branch of a both-signed ternary to the result width by @dalance in #2804
- perf(simulator): bit-range and block-aware comb scheduling with exact one-pass hints by @dalance in #2805
- fix(analyzer): reject degenerate for-range steps instead of panicking or unrolling against an infinite SV loop by @dalance in #2806
- fix(simulator): sign-reinterpret same-width as-cast so a wider context extends by the cast signedness by @dalance in #2807
- fix(analyzer,simulator): evaluate power with a negative signed exponent by @dalance in #2809
- Fix reset cast polarity for port and modport sources by @dalance in #2810
- perf(simulator): AOT-C coverage for dynamic-indexed bit-select reads and FF writes by @dalance in #2813
- perf(simulator): AOT-C comb codegen quality — branchless logic, smaller chunks, chunk-local intermediates by @dalance in #2814
- feat(veryl): stream test output on a single worker or with --no-capture by @dalance in #2817
- fix(analyzer): size width-less based literals with the emitter's leading-zero rule by @dalance in #2816
- fix(analyzer): keep oversized/x-z based literals consistent with their declared width by @dalance in #2819
- fix(analyzer): validate constant out-of-range LHS index and bit selects instead of wrapping modulo the shape by @dalance in #2821
- feat(veryl): unify the analysis pipeline across build/check/test/publish/doc/dump/synth and enable incremental check by @dalance in #2822
- fix(veryl): exclude --test filtered-out testbench files from filelist by @dalance in #2824
- fix(analyzer): propagate and check clock domains through function call arguments and output destinations by @dalance in #2823
- fix(analyzer): check and merge clock domains of bit/array select index expressions by @dalance in #2825
- fix(analyzer): evaluate array-literal elements so compound expressions don't launder their clock domain by @dalance in #2826
- fix(simulator): marshal wide binary operands to the operation size with sign extension instead of over-reading storage by @dalance in #2827
- fix(simulator): compute and mask 65-128-bit aot_c scalar unary ops and width-growing results correctly by @dalance in #2828
- fix(simulator): mark the full result width X on 4-state arithmetic with an X operand by @dalance in #2829
- fix(simulator): clamp narrow shift counts of 64 or more to SV semantics in the JIT and cc backends by @dalance in #2830
- fix(analyzer): clamp BigUint left-shift amounts to the result width before shifting by @dalance in #2831
- fix(analyzer): rebase struct-member part-selects as low+:width so dynamic bases keep their width in the simulator by @dalance in #2832
- fix(simulator): build dynamic bit selects for concat LHS destinations instead of overwriting the whole variable by @dalance in #2833
- fix(analyzer): stop squaring enum member reference width via the leftover outer shape by @dalance in #2834
- fix(emitter): handle the signed marker of width-less based literals instead of panicking by @dalance in #2835
- fix(parser): reject string escapes (\b \r /) with no SystemVerilog equivalent by @dalance in #2836
- fix(analyzer): bound statement-block nesting depth like expressions instead of overflowing the stack by @dalance in #2837
- fix(analyzer): decline to unroll inclusive for-ranges whose bound+1 overflows instead of panicking or dropping the body by @dalance in #2841
- fix(simulator): decline unsupported array range reads gracefully instead of panicking by @dalance in #2843
- fix(simulator): keep the backend-validate divergence report alive near the buffer start by @dalance in #2844
- feat(analyzer): memoize component conv across emit and instantiation paths in veryl test by @dalance in #2842
- fix(analyzer): check part-select width constancy on struct-member selects too by @dalance in #2845
- fix(analyzer): validate x/z enum variant widths and reject forward references between variants by @dalance in #2846
- fix(analyzer): keep multiple-driver detection order-independent with a definite-assignment mask by @dalance in #2847
- fix(analyzer): report anonymous identifier usage in type position by @dalance in #2848
- fix(analyzer): reject zero-width sized literals instead of emitting illegal SystemVerilog by @dalance in #2849
- fix(analyzer): reject non-identifier arguments of align/fmt/expand and the test top attribute by @dalance in #2853
- chore: fix clippy warnings in tests and lint all targets in CI by @dalance in #2855
- fix(analyzer): strip digit-group underscores before parsing float literals by @dalance in #2856
- chore(parser): use parol add_derives for serde instead of build.rs post-processing by @dalance in #2857
- fix(formatter): make case-arm isolation and alignment idempotent across passes by @dalance in #2858
- fix(formatter,parser): use character columns when reconstructing fmt-skip items and saturate the gap deltas by @dalance in #2859
- fix(formatter): isolate wide port types from alignment to avoid huge padding by @dalance in #2861
- fix(formatter): force multi-line layout for inst with named port connections by @dalance in #2863
- feat(metadata): include searched path in Veryl.toml not found error by @dalance in #2864
- Fix parent component resolution for symbol defined in function by @taichi-ishitani in #2865
- feat(incremental): cache diagnostics so warning files stay restorable by @dalance in #2866
- fix stack overflow and wrong wildcard emission when importing item named as its package by @dalance in #2878
- chore(deps): Bump cranelift to 0.133.0 and migrate MemFlags to MemFlagsData by @dalance in #2879
- fix(analyzer):
as Wwith a value generic parameter sizes the cast to 1 bit by @dalance in #2880 - fix(simulator): emit an if-condition's inlined function body before the if by @dalance in #2881
- fix(simulator): publish the AOT-C .so cache atomically to avoid concurrent-compile corruption by @dalance in #2883
- fix(simulator): give each inlined function call site its own comb scratch by @dalance in #2882
- fix(simulator): cranelift wide-ternary derefs a scalar branch as a pointer by @dalance in #2884
- simulator: AOT-C coverage for 65-128-bit wide-value comb ops by @dalance in #2886
- simulator: --backend-validate [STRIDE] — dual-run the AOT-C path only every Nth comb/event settle by @dalance in #2887
- fix(simulator): commit wide (>64-bit) dynamic-index FF array writes by @dalance in #2888
- fix(analyzer): treat an unevaluable cast width as not-yet-known instead of an invalid operand by @dalance in #2889
- fix(analyzer): keep an unknown proto/generic-typedef cast target on the type-cast path instead of the value path by @dalance in #2890
- perf(synthesizer): bound worklist consumer-list scans for high-fanout nets by @dalance in #2896
- fix(synthesizer): guard eval_constant_bits shift for constants wider than 64 bits by @dalance in #2897
- fix: cyclic type dependency false positive by @mvanhorn in #2870
- fix(analyzer): report mutually recursive functions as cyclic type dependency instead of overflowing by @dalance in #2899
- fix(emitter): parenthesize the base index of a step select by @dalance in #2898
- fix(emitter): parenthesize reverse for-range bounds before appending - 1 by @dalance in #2900
- fix(analyzer,emitter): keep inferred-let array dimensions parametric instead of baking the parameter default by @dalance in #2901
- fix(emitter): emit ifdef block-group guards once per group and keep nested group guards by @dalance in #2902
- fix(simulator): correct arithmetic right shift for operands wider than the native container by @dalance in #2904
- fix(analyzer): lower switch default as the final else regardless of its position by @dalance in #2905
- fix(analyzer): report an error for a bare for-loop range by @mvanhorn in #2851
- fix(analyzer): clamp wide (>64-bit) shift amounts instead of evaluating them as x by @dalance in #2907
- fix(analyzer): keep clock domain through $signed/$unsigned so CDC crossings are detected by @dalance in #2908
- fix(analyzer): sign-extend narrow signed values before int-to-float cast by @dalance in #2909
- fix(simulator): clamp wide (>64-bit) shift counts in cranelift and aot_c backends by @dalance in #2910
- fix(analyzer): reject non-constant bounds on [msb:lsb] range part-selects by @dalance in #2911
- fix(analyzer): resolve comptime types for switch conditions by @dalance in #2913
- fix(simulator): fix dynamic field writes to packed struct-array FF registers by @dalance in #2914
- perf: use mimalloc as the global allocator by @dalance in #2915
- fix(analyzer): carry field offset on const struct member reads by @dalance in #2918
- fix(simulator): cranelift/cc codegen correctness under port-alias-off and chunk relocation by @dalance in #2919
- feat(simulator): cross-test DUT reuse via selective port de-aliasing by @dalance in #2920
- Fix aliasing symbol path including package with generic consts by @taichi-ishitani in #2922
- fix(parser): report syntax errors at the divergence token instead of a valid prefix by @dalance in #2923
- feat(veryl): stream native test results as they finish and announce model build by @dalance in #2924
- fix(veryl): silence Cranelift JIT debug logs that flood --verbose output by @dalance in #2925
- feat(synthesizer): localize critical-path steps to hierarchical net origins by @dalance in #2926
- Treat parent symbols with generic consts as generic components by @taichi-ishitani in #2928
- Propagate expr_context for aggregate expressions used as operands by @taichi-ishitani in #2936
- fix(veryl): compare the assembled bundle in build --check mode by @dalance in #2937
- fix(simulator): classify mixed comb/FF arrays per element instead of forcing FF by @dalance in #2939
- fix(analyzer): materialize inherited unpacked array params by @dalance in #2943
- fix(analyzer): extend struct constructor field values to member width by @dalance in #2945
New Contributors
- @mvanhorn made their first contribution in #2730
- @pxlsy2000 made their first contribution in #2934
Full Changelog: v0.20.1...v0.20.2