Skip to content

feat(rocev2): RoCEv2 RDMA-SEND datapath, drivers, and PRBS validation harness#15

Open
ruck314 wants to merge 5 commits into
mainfrom
rocev2-dev-1
Open

feat(rocev2): RoCEv2 RDMA-SEND datapath, drivers, and PRBS validation harness#15
ruck314 wants to merge 5 commits into
mainfrom
rocev2-dev-1

Conversation

@ruck314

@ruck314 ruck314 commented Jun 25, 2026

Copy link
Copy Markdown
Contributor

Summary

Adds end-to-end RoCEv2 RDMA-SEND support to the Simple-10GbE-RUDP-KCU105 example:
a hardware RDMA datapath built on the surf RoCEv2AxiStreamRdma engine, three new
RoCEv2 build targets, a PyRogue device driver with host↔FPGA bring-up
sequencing, and the rocev2PrbsTest.py line-rate PRBS validation harness.

The branch history is organized into five reviewable commits, one per feature:

  1. chore(rocev2): bump surf — surf 634c8d9 → dcc0155: AXI-Stream RDMA
    datapath + engine refactor + RoCEv2 rename, DCQCN congestion control with
    runtime bypass, regenerated blue-rdma transport engine, runtime ECN/DSCP IPv4
    header register, AxiStreamMon frameUpdate.
  2. feat(rocev2): wire RoCEv2 RDMA engine into shared RTL — instantiate
    RoCEv2AxiStreamRdma in the shared datapath; thread a single 64-bit RDMA
    AXI-Stream pair through CorePkg/Core/App/Rudp; wrap the SsiPrbsTx
    payload with AxiStreamPacketizer2 (CRC_MODE_G="NONE",
    MAX_PACKET_BYTES_G=4096) ahead of the RDMA SEND; default to point-to-point
    posture (DSCP_G=0, ECN_G="00" Not-ECT) so the host NIC keeps DCQCN
    disengaged unless configured at runtime.
  3. feat(rocev2): add RoCEv2 build targets + plumbing — three RoCEv2 KCU105
    targets (1GbE / 10GbE / RJ45) with HDL, ruckus.tcl, Makefile, and
    promgen.tcl; a top-level firmware/Makefile batch build over all six
    targets; hoist the Vivado VersionCheck 2023.1 out of each Simple* target
    into shared ruckus.tcl; switch releases.yaml to FW_only (mcs/ltx); bump
    firmware version to v3.0.0.0.
  4. feat(rocev2): add RoCEv2 PyRogue device driver — new
    rocev2_10gbe_rudp_kcu105_example package (Root/App + host↔FPGA
    bring-up/tear-down sequencer, with a packetizer.CoreV2 depacketizer stage
    ahead of PrbsRx); teach the shared Core driver about rocev2/dcqcn
    knobs and instantiate RoCEv2AxiStreamRdma at 0x0015_0000.
  5. feat(rocev2): add rocev2PrbsTest.py line-rate PRBS harness — end-to-end
    PRBS validation that derives PacketLength from maxPayload minus the 16 B
    packetizer overhead; --p2p / throttle / checkPayload knobs; pass/fail
    gated on rxErrors and FW-egress bandwidth telemetry. Plus
    updateBootProm.py post-reload settle 5 s → 10 s and setup_env_slac.sh
    conda env → rogue_v6.15.0.

Test plan

  • FW synthesizes and meets timing (Vivado 2025.2, xcku040)
  • Docs CI (cd docs && make html) succeeds locally
  • End-to-end on KCU105 @ 192.168.2.10: programmed the bitstream and ran
    rocev2PrbsTest.py (throttled, checkPayload=True) → PASS (rxErrors=0),
    confirming the FW packetizer → RDMA SEND → SW CoreV2 depacketizer →
    PrbsRx chain reassembles and validates intact.

ruck314 added 5 commits June 25, 2026 07:18
Pulls in the surf-side RoCEv2 work that the rest of this branch builds on:
- AXI-Stream RDMA datapath, engine refactor, and RoCEv2 rename
- DCQCN congestion control with runtime bypass
- regenerated blue-rdma transport engine for line-rate RDMA-SEND
- runtime ECN/DSCP IPv4 header register and AxiStreamMon frameUpdate

surf 634c8d9 -> dcc0155.
Instantiate the surf RoCEv2AxiStreamRdma engine in the shared firmware
datapath and thread a single 64-bit RDMA AXI-Stream pair through the
hierarchy:

- CorePkg.vhd: define RDMA_AXIS_CONFIG_C (64-bit) as the shared RDMA
  stream config.
- App.vhd: drive SsiPrbsTx on RDMA_AXIS_CONFIG_C and wrap the payload
  with AxiStreamPacketizer2 (CRC_MODE_G="NONE", MAX_PACKET_BYTES_G=4096)
  ahead of the RDMA SEND.
- Core.vhd: pass the single RDMA master/slave pair through Core.
- Rudp.vhd: replace the bare engine with the RoCEv2AxiStreamRdma wrapper;
  default it to point-to-point posture (DSCP_G=0, ECN_G="00" Not-ECT) so
  the host NIC keeps DCQCN disengaged unless configured at runtime.
Add the three RoCEv2 KCU105 build targets (1GbE, 10GbE, RJ45), each with
its top-level HDL, ruckus.tcl, Makefile, and promgen.tcl, and the
supporting build/release plumbing:

- firmware/Makefile: top-level batch build/clean over all six targets.
- shared/ruckus.tcl + Simple* targets: hoist the Vivado VersionCheck
  2023.1 out of each target into the shared ruckus.tcl (single source).
- releases.yaml: drop the Rogue packaging block and switch the release to
  FW_only (mcs/ltx) now that firmware ships independently of the driver.
- shared_version.mk: bump firmware version to v3.0.0.0.
Add the rocev2_10gbe_rudp_kcu105_example PyRogue package (Root/App and
RoCEv2 bring-up sequencer) and teach the shared Core driver about RoCEv2:

- simple_10gbe_rudp_kcu105_example/_Core.py: add rocev2/dcqcn ctor knobs,
  add a UDP client (numClt=1) and instantiate surf RoCEv2AxiStreamRdma at
  0x0015_0000 when rocev2 is enabled.
- rocev2_10gbe_rudp_kcu105_example/_Root.py: host<->FPGA RoCEv2 bring-up
  and tear-down sequencing, plus a packetizer CoreV2 stage that strips the
  AxiStreamPacketizer2 framing ahead of PrbsRx.
- rocev2_10gbe_rudp_kcu105_example/_App.py + __init__.py: App device tree
  and package exports.
Add the rocev2PrbsTest.py end-to-end PRBS validation harness for the
RoCEv2 RDMA-SEND datapath: derives PacketLength from maxPayload minus the
16 B packetizer overhead, exposes --p2p / throttle / checkPayload knobs,
and gates pass/fail on rxErrors and FW-egress bandwidth telemetry.

Supporting environment updates:
- updateBootProm.py: extend the post-FpgaReload settle from 5 s to 10 s.
- setup_env_slac.sh: bump the conda env to rogue_v6.15.0.
@ruck314 ruck314 changed the title feat(rocev2): packetize RDMA PRBS path + software depacketizer feat(rocev2): RoCEv2 RDMA-SEND datapath, drivers, and PRBS validation harness Jun 25, 2026
@ruck314 ruck314 marked this pull request as ready for review June 25, 2026 14:36
@ruck314 ruck314 requested a review from FilMarini June 25, 2026 14:36
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant