release: iDMA 0.7.0 - #129
Merged
Merged
Conversation
The @v2 tag resolves to a 2+ year-old release. Pin to v2.5.0 which bumps gitlab-ci Python to 3.12, switches to uv for deps, fixes riscv-gcc-install asset detection, and improves gitlab-ci logging.
Guard FSM state transitions on rsp_ready_i so rsp_valid_o is not deasserted before the handshake completes. Add missing eh_valid_i check in WAIT_LAST_W to prevent sampling garbage eh_i data.
* ci: Add branch policy enforcement and PR template Add devel as the staging branch for all external contributions: - retarget-to-devel.yml auto-retargets external PRs from master to devel via author_association check (OWNER/MEMBER/COLLABORATOR may still target master directly for promotion PRs). - promote-to-master.yml opens or extends a rolling devel->master PR when a maintainer applies the verified-internal label to a merged devel PR. - pull_request_template.md surfaces the policy in every new PR. - CONTRIBUTING.md documents the policy with rationale. Maintainers need to create the verified-internal label once (any color, description optional) before promote-to-master.yml fires. * ci: Tighten branch-policy workflows - retarget-to-devel: also fire on `edited` so a PR re-targeted to master post-open is still caught. - promote-to-master: swallow the 422 from `pulls.create` when two concurrent gitlab-ci runs race to open the promotion PR. - CONTRIBUTING: use ASCII `->` for greppability. * ci: Fix workflow_run trigger and tighten edge cases - promote-to-master: trigger on the parent `ci` workflow_run, not `gitlab-ci` (which is workflow_call-only and never produces its own workflow_run event). `ci` aggregates lint+build+gitlab-ci, so its success is a strictly stronger gate. - promote-to-master: narrow the 422 swallow to only the 'pull request already exists' validation error; rethrow other 422s (missing base, invalid head, no commits between, ...). - promote-to-master: add concurrency group to serialise rapid runs. - retarget-to-devel: add concurrency group keyed on PR number with cancel-in-progress, so rapid edited events don't spawn duplicate jobs. - retarget-to-devel: build the CONTRIBUTING.md link from `context.serverUrl` instead of a relative path, so it renders correctly in PR comments regardless of GitHub's markdown context. * ci: Dedupe retarget comment and survive comment failure - retarget-to-devel: embed a `<!-- retarget-to-devel -->` HTML marker in the comment body and check for it via paginated listComments before posting. Rapid `edited` events that cancel and re-fire the job no longer post duplicate comments. - retarget-to-devel: wrap createComment in try/catch with core.warning so a transient comment failure (after the retarget already succeeded) does not fail the workflow. * ci: Tighten promote-to-master permissions and fix org typo - promote-to-master: downgrade `contents: write` to `contents: read`. The script only calls `repos.compareCommits` (read) and PR APIs already covered by `pull-requests: write`. - CONTRIBUTING: fix pre-existing `pulp_platform` (underscore) to `pulp-platform` (hyphen) — the actual GitHub org slug. * ci: Tighten gitlint regex to forbid extra colons in subject Matches the single-colon rule enforced by util/lint-commits.py in CI. Now gitlint (run locally via pre-commit) catches the same failure mode that broke this PR's commit-msg lint.
) Track every arbiter handshake in the choice FIFO so the response demux stays in sync when internal and external events interleave, and add a mixed-traffic testbench (vsim + vcs, blocking) that catches the bug. Original fix: #96. Co-authored-by: Flavien Solt <flavien.solt97@gmail.com>
Use 'bender pickle' (slang frontend, bender >= 0.32.0) for all pickling: drops the sources.json indirection and the cf_math_pkg concat hack, and retires the morty HTML/DOT doc graphs and their CI installs. Pickle output stays at target/morty for downstream compatibility. Commits target/rtl/include/.gitkeep so bender 0.32.0 (which errors on a missing export_include_dir) resolves on a fresh tree.
Replace actions/setup-python + pip with astral-sh/setup-uv@v7 + 'uv pip install -r requirements.txt' across the analyze, build, deploy, docs and lint workflows, matching the nonfree GitLab CI which already uses uv. lint-python/lint-yaml keep setup-python (no requirements install).
Add a Starlight-based documentation site under doc/site with rendered architecture, backend, legalizer and system-integration diagrams.
Generate per-top trimmed vsim compile scripts so each testbench compiles only the sources it needs, speeding up targeted simulation.
Set interruptible at the default level of .gitlab-ci.yml so the project's auto_cancel_pending_pipelines cancels the in-flight devel pipeline (init + the idma trigger, which cascades to the nonfree child) when a newer commit lands. The nonfree CI side was marked interruptible in lockstep.
Rename the pickle output dir target/morty -> target/pickle now that morty is gone. The nonfree EDA scripts and CI were updated to read target/pickle in lockstep.
Regenerate the module hierarchy graphs from the bender-pickle syntax tree via util/ast2dot.py, replacing the retired morty DOT graphs. Restores the graph figures in the Sphinx docs and wires Graphviz back into the build/docs CI.
Replace requirements.txt with a pyproject.toml manifest + committed uv.lock, and run CI generation via 'uv run --locked' / 'uv sync --locked' on Python 3.11. Keeps setuptools<79 for regtool's pkg_resources. No RTL changes.
Replace the hjson/regtool register description with parameterized SystemRDL sources rendered by PeakRDL (regblock apb4-flat + raw-header svpkg). Migrates the build to peakrdl, drops the regtool reg-gen path. Co-authored-by: Michael Rogenmoser <michael@rogenmoser.us> Co-authored-by: Tim Fischer <fischeti@iis.ee.ethz.ch>
regtool's pkg_resources import forced setuptools<79; the SystemRDL/PeakRDL migration removed regtool, so the pin and the unused IDMA_REGTOOL/IDMA_REG_DIR make variables are dead weight.
* ci: Cache the bender git database keyed on the lockfile A composite action sets BENDER_DB_DIR to relocate the bare-repo database to a cacheable path; warm checkouts then need no network. The project- local .bender is never cached: its checkouts hold absolute-path alternates into the database and are rebuilt from it in under 0.1s. * ci: Add author header and drop verbose comment in bender-db-cache
Add optional multi-head (multi-channel) support to the iDMA backend. The read/write managers can be instantiated N-fold via a numeric prefix in the backend variant ID; a per-transfer src_head/dst_head selects the channel. Additive and opt-in: existing single-head variants regenerate byte-identical. Co-authored-by: Lud1ma <luedde.mahr@web.de> Co-authored-by: Thomas Benz <tbenz@iis.ee.ethz.ch>
The IIS shared runners intermittently wedge a build slot with a stale git lock under ${CI_PROJECT_DIR}.tmp (git-template/config or .gitlab-runner.ext.conf.lock), failing the public init job at git checkout before any job script runs. Clear those stale locks in a pre_get_sources_script, scoped to *.lock and git-template so the CA bundle in .tmp is preserved.
An open same-repo PR fires both push and pull_request, so the gitlab-ci job mirrors the same commit twice and (with auto_cancel_pending_pipelines) cancels the PR's child pipeline. Scope push to devel/master; feature branches validate via their PR (pull_request synchronize still reruns on every pushed commit). Also stops the deploy job creating __deploy__ refs on feature pushes.
#123) Fix the multi-head read/write datapath: gate the AR/AW meta channels on the address-channel head (ar_req_i/aw_req_i) rather than the datapath head, route the write datapath response by the FIFO-tracked dst_head, and emit the per-head tagged path when a protocol has more than one head. Add directed backend testbenches for the 2r_axi_w_axi (two read heads) and 2rw_axi (cross-head write) configurations, wired into nonfree CI.
Add a default arm to the writes_in_flight case in the backend testbench template that $fatal()s on an unhandled destination protocol, instead of silently falling through when a generated variant adds a new protocol.
…nitch (#88) Add a native rw_axi_rw_init_rw_obi backend variant for snitch_cluster and switch the inst64 frontend to drive it directly (OBI/INIT write path with address-map steering), replacing the plain rw_axi instantiation. Add the variant's directed job stimulus and the snitch_cluster gitignore entries.
Disable fall-through on i_speculation_fifo to break the combinational loop flush -> speculation_correct -> push -> flush. The fall-through path only exposed the same-cycle empty-FIFO output, which the speculation check never uses (a guess is confirmed only when its descriptor read returns), so registering the head is the correct behavior with no throughput impact. Verified by a new blocking Spyglass combinational-loop gate (spyglass-lint-desc64). Closes #71.
Expose the page-splitter's non-reduced burst cap as a BurstLen parameter (default 8 = the AXI 256-beat max, preserving existing behavior) threaded through the backend/synth/legalizer wrappers, so a system like pulp_cluster can configure smaller default bursts without touching the core.
PR #109's rebased NumStreams commit resurrected idma_reg.hjson.tpl (removed by the SystemRDL conversion in #73) and re-added a second gen_hw2reg_unused generate block in idma_reg.sv.tpl. The duplicate label breaks elaboration of the reg block on every variant (DC VER-288, VCS IPD, Questa vlog-2388), failing the devel pipeline. Keep only #109's BurstLen change.
PeakRDL sizes idma_reg*_reg_top's s_apb_paddr to the regmap's minimal address width (8 for reg32_3d, 9 for reg64_*), but the wrapper connected the full 32-bit internal APB paddr, tripping vsim-3015 port-width mismatches in every gen_core_regs instance. Slice paddr to the generated IDMA_*_REG_TOP_MIN_ADDR_WIDTH (via a RegAddrWidth localparam).
Provision a local uv .venv (uv sync --locked) and prepend it to PATH when the generator deps are not already importable, so 'make idma_hw_all' works with no pre-activated venv. An activated venv or 'uv run make' (CI) is detected and left untouched. Lets a consumer call 'make -C $(bender path idma) idma_hw_all' directly. Requires uv on PATH.
Raise Bender.yml version floors to the latest releases (axi 0.39.9, common_cells 1.39.0, common_verification 0.2.5, register_interface 0.4.7, obi 0.1.7) and drop the stale Bender.local axi pin. No Bender.lock or generated-RTL drift.
The Verible gate only covered src/, and the PR-annotating job reports through reviewdog with -diff, so it only ever saw lines a PR touched. Neither looked at test/, where the violations had accumulated unseen. idma_lint_sv now covers src/ and test/, exempting two vendored third-party files that are already excluded from the author lint for the same reason. Clearing what that exposed is the bulk of the diff: lowRISC naming on the register-map localparams, generate labels, plusarg form, and the multi-line comments the house style does not want. IDMA_DV and IDMA_ND_DV keep their names under a scoped waiver; they are the exported verification API and a rename would silently break downstream.
Follow-up to #186. Two toolchain pieces were fetched or rebuilt in every job. bender-install downloads a release tarball per job and a run spawns about twenty of them, which is how devel went red on an elaboration leg that had nothing wrong with it. The binary is cached and the install script skips the download when it finds one on PATH. The simulation legs compile a full verilator model per leg, nine in the mxneg job alone, with no object cache. ccache is installed and its directory cached; verilator uses it as OBJCACHE once present. The job prints the hit rate so a cache that stops matching is visible rather than silent. Bender moves to 0.32.1, the current release. Its flist-plus, verilator and vsim output is byte-identical to 0.32.0 on this tree. Verilator still comes from apt: it is pinned by the runner image at 5.020, and 5.046 fixes mxquant at the wide widths but breaks mxroundtrip at 256, so that swap belongs with #196.
The ccache added in #198 stored nothing: the first devel run after it merged compiled five verilator models and reported a cache size of 0.0 GB, with every compile line reading g++-14 and no ccache prefix. #198 assumed verilator finds ccache by itself. That holds for the SEPP build used locally, whose verilated.mk defaults OBJCACHE to ccache, but ubuntu ships it empty, so nothing prefixed the compiler. The simulation legs pass OBJCACHE=ccache to the sub-make now. Verified the override reaches verilated.mk rather than assuming a second time: building with OBJCACHE=/usr/bin/false prefixes every compile line and fails.
github.job is the job id, identical for every matrix leg, so all six simulation legs and all eight elaboration legs keyed their cache the same way and raced to save it. One won; the rest reported "Unable to reserve cache with key ccache-simulate-<sha>", stored nothing, and would have restored another suite's objects on the next run. The key comes from the matrix value now, passed into the composite action as an input since a composite action cannot read matrix itself. #199 had already fixed the compiler prefix: the logs read ccache g++-14, and mxquant reported 16 of 156 hits on a cold cache from its five widths sharing objects. Cross-run hits need this as well.
…187) The Snitch cluster defines these counters explicitly: dma_r_stall = 12 "Incremented whenever r_ready = 1 but r_valid = 0" dma_w_stall = 13 "Incremented whenever w_valid = 1 but w_ready = 0" dma_buf_w_stall = 14 "Incremented whenever w_ready = 1 but w_valid = 0" dma_buf_r_stall = 15 "Incremented whenever r_valid = 1 but r_ready = 0" The two lines removed here are, verbatim, the definitions of 14 and 15 sitting in the fields for 12 and 13, where they overrode the correct assignments made earlier in the same always_comb. Both pairs arrived in one commit that flattened if-guarded set-only writes into unconditional ones, so the later pair silently won. Removing them restores 12 and 13. The asymmetry that remains is intended: iDMA drives w_valid but r_ready, so waiting on the fabric is valid without ready on AW, AR and W, and ready without valid on R. tb_idma_inst64_axi_copy asserted the old behaviour, so its two goldens move with the RTL. Verified both ways: it passes with this change and fails with "events.EvRStall disagrees with the AXI pins" if either side is reverted. This is a silent change to reported performance counters; existing profiles change meaning with no version marker.
Adds the 0.7.0 section and bumps VERSION 0.6.5 to 0.7.0, in the shape 0.6.0 and 0.3.0 used: Added, Changed and Fixed with pull request links, CI churn on one line rather than twenty, and the incompatible changes as a trailing paragraph rather than inline markers. Every one of the 55 pull requests merged since 0.6.5 is referenced. Five changes are not backwards compatible: the per-id tracer headers, the direction-qualified trace keys, common_cells v2, the pickle directory rename, and the inst64 stall counters, which change meaning with no version marker. The trace key rename had not been recorded anywhere despite breaking every external trace parser; nonfree already hit the tracer half of the same split.
… datapath (#204) On devel the coupler releases an AW while its store is empty, presenting a stale payload, and miscounts AW credits under backpressure so they wrap. AW then desynchronises from W until the transfer hangs, and two transpose testbenches corrupt data silently. Gate every AW release on a non-empty queue, and carry decouple_aw down the write datapath so first is re-qualified per transfer, which bounds the credit counter and lets aw_to_stall go. Add a throttled-memory run of the rw_axi jobs, the first in-tree coverage of AW backpressure. Fixes #190.
The roundtrip derived its element format from the bus width, so FP16 was only ever exercised at or below a 512b bus and FP32 only at 1024b. Make the format a parameter that also gates mxfp16 in the DUT, and run both legs across the widths each one elaborates for: FP16 up to StrbWidth 64, FP32 everywhere. This also covers the mxfp16 area opt-out below a 1024b bus for the first time. mxquant and mxrand already drive both formats in one run, so they keep the plain width sweep.
The deploy job was guarded on the event being a push, but the workflow runs on master and devel alike, so every devel push republished the site. The published documentation therefore tracked devel rather than the last release, and a devel push after a release would overwrite the released docs. Keep building on both branches so a broken doc build still fails early; only publish from master. The github-pages environment allow-list was narrowed to master in the same change.
The entry was written before the channel coupler fix, the MX roundtrip format sweep and the documentation publishing change merged, so it omitted the most significant fix in the release and carried a date two days before the work landed.
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.
Breaking changes
Seven, and a downstream integrator needs all of them:
reg_busflow (#73).apb4-flatby default;register_interfaceis dropped as a dependency (#148). Breaking forreg_busintegrators.idma_pkgtypes and selects channels per transfer viasrc_head/dst_head(#85, #123).`include "idma/tracer.svh"becomes`include "idma/tracer_<id>.svh"for the variant being traced; the shared header keeps only the id-independent helpers.axi_rsp_readynow readsaxi_read_rsp_ready. Without this, a protocol present on both sides (INIT) emitted the same key twice and the read channel was silently dropped from the trace.common_cellsv2 is required (#99, #180). Ecosystem-wide bump.target/pickle(#110, #114), replacing morty.Added
BurstLenon the legalizer page splitter (#109).Changed
inst64integration (#88); OBI writes prioritised (#138).w_dp_req_ready(#163);compute.svhrendered by PeakRDL (#179).pyproject.tomland uv (#121, #111, #128).Fixed
decouple_rwand withoutdecouple_aw(#80).inst64events (#187).r_stallandw_stallcarried the buffer-pressure definitions, which overrode the correct assignments. Silent change to reported counters.rt_midendchoice FIFO (#108).Release checklist
register_interfacedropped (supersedes frontend: Expose the reg frontend as a native APB slave #131, closed)## 0.7.0CHANGELOG entry andVERSION0.6.5 → 0.7.0. Open, targetsdevel.Known limitations carried into 0.7.0
tb_idma_mxroundtripabove DataWidth 256 dies in a heap abort inside verilator's generated model constructor (#196). The public sim caps that suite at 256; it also blocks a verilator 5.046 bump.mxnegcases 4 and 12 need DataWidth 1024, which SIGSEGVs on the apt verilator 5.020 the runners ship, soComputeMxFp16Widthhas no firing negative test on the pinned toolchain.util/slang_elab.pyduplicatespulp-platform/pulp-actions/slang, which cannot fail a job today; fix proposed upstream in pulp-actions#41, tracked by #197.Not in 0.7.0
Flip out of draft once #201 is on
devel.