Six peripheral IPs, one workspace
A working-copy portal for the peripheral IPs checked out under project/ — each cloned
from jenshi/*, fast-forwarded to main, then split into a sibling -wt git worktree on
branch-stan. Pick an IP from the rail; each workspace tabs through I/O, block diagram, registers, work log and signoff status.
Signoff status
manual per-IP signoff trackerAt a glance
sorted by register count · click a name to open it| IP | Interfaces | Regs | RTL files | RTL LOC | Verification | Version |
|---|---|---|---|---|---|---|
| PCIE_MMBI | AXI4 slave + AXI4 master + APB4 | 56 | 28 | 4,490 | 65 / 65 PASS | v0.4 |
| MCTP_VDM | APB4 + AXI4 master + inbound VDM | 44 | 22 | 3,847 | 66 / 66 PASS | v0.5 |
| Host2BMC | AXI4 slave (3 BAR windows) + APB4 | 13 | 18 | 3,160 | 57 / 57 directed | v1.0.2 |
| PBMC | AXI4 (128b) + APB4 CSR | 13 | 20 | 3,062 | 44 pass · cov 96.5 | v0.4 |
| SRAM_ECC | AXI4 slave (data) + APB4 CSR | 11 | 18 | 3,382 | 69 / 69 PASS | v0.8 |
| RTC | APB4, dual clock domain | 6 | 16 | 2,103 | 61 / 61 PASS | v0.8 |
The six IPs
one workspace per worktreeHost2BMCPCIe Host-to-BMC Controller
57 / 57 directedMailbox, doorbell & shared-memory bridge.
- Spec
- §86
- Commit
- faa11cf
- Prefix
- h2bm_
SRAM_ECCAXI4 SRAM pool · (72,64) Hsiao SECDED
69 / 69 UVMRAS-protected on-chip SRAM pool.
- Spec
- internal · RTL-reconciled
- Commit
- af07a86
- Prefix
- srecc_
RTCReal Time Clock
61 / 61 UVMWall-clock timekeeping, alarm & wakeup.
- Spec
- §57
- Commit
- 3582a30
- Prefix
- rtc_
PBMCPCIe-BAR-to-AXI remap bridge
44 PASS · cov 96.5PID-indexed address remap · reference design.
- Commit
- 92b3e33
- Arch
- Rev.7 as-built
- Prefix
- pbmc_
MCTP_VDMMCTP-over-PCIe-VDM DMA controller
66 / 66 PASSOut-of-band management transport engine.
- Spec
- DSP0236 · DSP0238
- Commit
- a4faa4c
- Prefix
- mvdm_
PCIE_MMBIMCTP Memory-Mapped Buffer Interface
65 / 65 PASSDSP0284 shared-buffer mailbox · largest block.
- Spec
- DSP0284 · DSP0282
- Commit
- e45c260
- Prefix
- pmmbi_
Signoff Status
Per-IP signoff tracker, split into front-end and back-end groups. Click any light to cycle its state — gray not started → green pass & done → red has issue. Selections are saved in this browser and persist across reloads and portal updates.
Everyone who opens this link sees the published status shown above. Save keeps your edits in this browser only — to publish new status to all viewers, Export the JSON and have it baked back into the page & re-published. Nothing is ever written to the repo.
h2bm_topHost2BMCPCIe Host-to-BMC Controller
57 / 57 directedWhat it does
Host2BMC sits behind the SoC's second PCIe BAR set and lets an external host CPU (BIOS/UEFI/OS) exchange data and notifications with the on-chip BMC. It offers three access styles: BAR1 mailbox queues with doorbell interrupts for short messages, BAR0 a directly-remapped window into BMC DRAM for bulk transfer, and an MMBI segment overlay implementing the DMTF shared-buffer scheme. All PCIe PHY, link training, config cycles and BAR enumeration are handled upstream — this IP only sees clean AXI4 memory transactions relative to a BAR base. It is explicitly documented as not a security boundary: no ECC, parity or authentication; a downstream firewall/IOMMU is required.
Key design decisions
- 4-phase LEVEL req/ack CDC lockedChosen over a toggle handshake so asymmetric single-domain reset is safe by construction — the toggle version had a phantom-CSR-read bug.
- Doorbell clear = W0C lockedPreserves datasheet / legacy BMC-BIOS software compatibility.
- Queue depth = 1 (mailbox) lockedMatches the single 32-bit
*_DATAregister per datasheet; aDepthparam is reserved for future expansion. - Doorbell auto-set is edge-triggeredA level trigger would latch permanently at reset (empty = 1).
- MMBI_CFG added as design supplementNot in the datasheet — makes segment size software-programmable and verifiable.
Errors & interrupts
All host-side violations — unaligned access, disabled device, BAR0 size = none, MMBI out-of-range, burst to register targets, partial-strobe BAR1 writes, sub-word BAR1 reads — return AXI SLVERR; unmapped APB offsets return pslverr. Downstream non-OKAY responses are clamped to SLVERR. Two interrupt sources, both registered/glitch-free through h2bm_intr_agg with a two-level enable (UNMASK then INT_EN): irq_out (H2B doorbell → BMC) and intr_to_host (B2H doorbell → Host INTA/MSI). No ECC/parity/timeout — declared not a security boundary.
Low power
Activity-based clock gating via h2bm_prim_clock_gating: clk_dp for the msgq datapath, gated by the OR of 8 push/pop strobes — zero-latency wake, no wake FSM; and the MMBI cache RAM gated internally by chip-select. CSR, apb2apb, interrupt logic, host-xbar front-end and root clocks are never gated. test_en_i forces bypass for DFT scan.
External interfaces
| Interface | Protocol | AW / DW | Dir | Purpose |
|---|---|---|---|---|
| BMC control | APB4 | 12 / 32 | slave | CSR access · clk_apb |
| Host access | AXI4 | 40 / 128 | slave | Host BAR0 / BAR1 / MMBI target · clk_h2bm |
| BMC memory | AXI4 | 40 / 128 | master | BAR0 + MMBI buffer → BMC DRAM |
| irq_out_o | level | 1 | out | F1_INT doorbell → BMC (clk_apb) |
| intr_to_host_o | level | 1 | out | INTA/INTB/MSI → Host (clk_h2bm) |
| cfg_* exports | — | — | out | PCIe config-space: dev/vid, subsys, class/rev, bar0, busmaster/intx/msi/enable |
Clocks, resets & CDC
Two clock domains
clk_apb— BMC APB4 control bus; CSR access front-end only.clk_h2bm— main IP clock: CSR, msgq, MMBI, BAR0 datapath, interrupt logic, host AXI front-end.
CDC & reset
- Only real crossing is
h2bm_apb2apb: single-bit req/ack/irq via 2FF; multi-bit payload never crosses directly (hit-pulse-qualified latch). - Two independent async active-low resets
rst_apb_ni/rst_h2bm_ni, each async-assert / sync-deassert. Asymmetric single-domain reset is safe by construction (4-phase level handshake, idle = req==0 & ack==0).
Block diagram & dataflow
Figure 1 — host access is decoded once, then fanned on a single bus to the mailbox, BAR0 and MMBI paths; the two doorbell interrupts and the APB CSR path run alongside.
| Module | Group | Role |
|---|---|---|
| h2bm_top | top/ | Top-level integration, clock-gating & reset-sync instances |
| h2bm_host_xbar | mem/ | Host AXI4 slave + BMC-memory AXI4 master; region decode & burst FSM |
| h2bm_bar0_remap | mem/ | Combinational BAR0 address remap |
| h2bm_mmbi | mmbi/ | MMBI 8-segment decode + cache overlay (host-only) |
| h2bm_msgq / _lane | msgq/ | 4× depth-1 mailbox queues (h2bq1/2, b2hq1/2) |
| h2bm_csr | csr/ | Control/status regs, PCIe config header, STATUS assembly |
| h2bm_intr_agg ×2 | leaf/ | Per-direction doorbell latch + interrupt aggregation |
| h2bm_apb2apb | bridge/ | 4-phase level req/ack CDC bridge + IRQ 2FF sync |
| h2bm_prim_* | prim/ | clock_gating, rst_sync, flop_2sync, pulse_sync, ram_1p (reusable) |
Register map highlights
13 documented CSRs across three regions: messaging queue/status 0x000–0x044, MMBI config 0x080/0x084, PCIe config header 0xA10–0xA70. A host-side BAR1 mirror lives at MSG_BAR+0x30000.
| Offset | Register | Key bits | Purpose |
|---|---|---|---|
| 0x000/010 | H2BQ1/2_DATA | — | Host→BMC mailbox (RO, read = pop) |
| 0x020/030 | B2HQ1/2_DATA | — | BMC→Host mailbox (WO, write = push) |
| 0x040 | B2H_STATUS | [31] DOORBELL(W0C), [30] INTB_EN, [27:20] full/empty+unmask | BMC→Host doorbell / status |
| 0x044 | H2B_STATUS | same layout | Host→BMC doorbell / status |
| 0x080 | MMBI_CFG | [1:0] SEG_SIZE, [8] ENABLE | MMBI segment size + enable |
| 0x084 | MMBI_BASE | [22:0] REMAP | MMBI buffer → BMC address remap |
| 0xA1C | BAR0_CFG | [30:8] REMAP, [4:0] SIZE | BAR0 remap + window size |
| 0xA70 | DEV_CTRL | [1] ENABLE, [9] BUSMASTER, [17] INTX, [25] MSI | Device enable + capabilities |
branch-stan engineering activity
Chronological record of the work done on this IP's branch-stan worktree — documentation, constraint authoring, and the Formality clean-up pass.
- Cloned from
jenshi/Host2BMC, fast-forwarded tomain, then branchedbranch-stanwith a sibling-wtgit worktree somainstays untouched. - One-page design document generated from an RTL + testbench survey of the worktree (interfaces, block diagram, register map, CDC, verification status).
- Functional SDC set authored —
h2bm_top_func_sdc.{clk,const,io}.tclplus ah2bm_top.func.tclwrapper. AXI clocks set to 600 MHz; top-controlled uncertainty / fanout / transition constraints removed;-datapath_onlyguarded so DC-NXT stays quiet. - Formality read errors (
FMR_VLOG-091→FM-089) fixed by makingwmerge()pure and assembling CSR readback inalways_comb; the phantom 32-bit write-merge temporaries were hoisted out of the clocked block so RTL-vs-netlistverifypasses. Merged tomain— PR #4.
Verification & signoff
As-built signoff runs on a directed self-checking testbench (00_rtl_sim): 57/57 tests TRUE PASS, 0 assertion failures. URG coverage — Line 100% · Cond 93.65% · Toggle 88.52% · FSM 100% · Branch 99.17% · Group 96.78%. Lint (vcst) clean with named/justified waivers only; CDC and RDC report 0 fatal/error/warning; Linux co-sim all TRUE PASS.
A UVM 1.2 environment is planned, not yet run — 02_uvm_tb defines 46 test classes (APB / AXI-host / AXI-slave+mem-model / IRQ-monitor agents, reg model with predictor + adapter, scoreboard + functional coverage), targeting ≥95% functional coverage.
srecc_topSRAM_ECCAXI4 SRAM pool · (72,64) Hsiao SECDED
69 / 69 UVMWhat it does
SRAM_ECC gives the SoC a common, RAS-protected SRAM pool. Masters access it over AXI4 (128-bit data, 40-bit address, 8 outstanding) while firmware configures it and observes error state over an APB4 CSR. Protection is a (72,64) Hsiao SECDED codeword per 64-bit granule: a 128-bit beat carries two independent codewords. The pool auto-initializes after reset so it works with zero software configuration, and it boots permissive — ECC and low-power default OFF — so an unprogrammed IP still passes traffic correctly and never stalls at power-on.
Key design decisions
- Single-port 1RW SRAM macro locked · D2Simpler and smaller than 2P/DP; RMW costs 2 port cycles, hidden by 4-bank interleave.
- Poison-on-uncorrectable-RMW locked · D4 · R11An RMW-read UE writes a deliberately-bad codeword +
BRESP=SLVERR+ log + interrupt, fail-loud until a full-strobe rewrite clears it — untrustworthy partial data is never silently kept. - AXI outstanding = 8 D1Measured sufficient; raising to 16 changes nothing — throughput is bound by 1-cycle turnaround + bank occupancy, not queue depth.
- Fine-grained bank interleave
bank = addr[OffW+:BankW]spreads consecutive beats across banks to hide RMW cost; no per-bank address-lock table (ordering from in-order issue + bank ready handshake). - Permissive boot
SRECC_CTRLresets to 0x00 so AXI↔SRAM works with zero config and can't stall at power-on; auto-init still runs, interrupts stay enabled.
Errors & interrupts
Hsiao decode syndrome distinguishes CE (odd-weight, valid column → auto-corrected) from UE (even nonzero, or ≥3-bit → conservatively flagged). Read UE → RRESP=SLVERR; RMW UE → poison + BRESP=SLVERR; out-of-range → DECERR. A first-error latch (ERR_ADDR/ERR_INFO, W1C re-arm) plus free-running CE/UE counters record events. Four 1-cycle interrupt sources — ce, ue, ue_rmw, init_done — mask through INTR_EN, latch W1C, OR-aggregate, then 2FF to clk_apb. Recovery is a full-strobe rewrite (re-establishes valid ECC, clears poison).
Low power
A single core clock gate (u_core_cg) drives clk_core for all banks + wr/rd ctrl + init FSM together; CSR / apb2apb / intr-agg stay on ungated clk_axi. The core stays awake while any AXI valid or reinit is active, else counts down hold_q=4 before sleeping. A wake-safe accept term (active_clk_q & clk_core_en) prevents dropped or double-accepted beats around sleep transitions — a real bug found and fixed in UVM deep-review. Default OFF at reset.
External interfaces
| Interface | Protocol | Width | Dir | Purpose |
|---|---|---|---|---|
| AXI4 slave | AXI4 | ID 8 · A 40 · D 128 · STRB 16 | slave | Data read/write; INCR/WRAP/FIXED; 8 outstanding |
| APB4 slave | APB4 | A 12 · D 32 | slave | CSR config / status / error-log |
| irq_out_o | level | 1 | out | Registered interrupt · clk_apb |
| test_en_i | — | 1 | in | DFT scan / ICG bypass |
Clocks, resets & CDC
Two clock domains
clk_axi— AXI4 slave, all banks / ECC datapath, CSR registers, interrupt aggregator, init FSM.clk_apb— APB endpoint side ofsrecc_apb2apbplus the final registeredirq_out_o.
CDC & reset
- Only 3 crossings, all 2FF: apb2apb req (+APB bus) apb→axi; ack (+read data/pslverr) axi→apb; aggregated IRQ level axi→apb. The AXI bus is entirely single-domain — no AXI CDC.
- Resets
rst_axi_ni/rst_apb_ni: async assert / sync deassert, independently releasable.
Block diagram & dataflow
Figure 1 — read/write control feeds the Hsiao ECC codec and the interleaved 1RW bank array; the APB side reaches the CSR and interrupt path across the clock boundary.
| Module | Role |
|---|---|
| srecc_top | Integration, clk/reset, low-power gating, response mux |
| srecc_axi_wr_ctrl | AW/W intake, bank dispatch, B reassembly / BRESP |
| srecc_axi_rd_ctrl | AR intake, in-order bank dispatch, R generation / RRESP |
| srecc_bank ×N | Per-bank 1RW sub-arrays + per-granule ECC + RMW write FSM |
| srecc_ecc_enc / _dec | Combinational (72,64) Hsiao encode / decode |
| srecc_init_fsm | Post-reset auto-clear of whole pool + valid ECC |
| srecc_csr | CSR registers, W1C interrupt status, error log |
| srecc_intr_agg | OR-reduces (STS & EN) into a registered IRQ level |
| srecc_apb2apb | APB↔CSR 2-phase req/ack CDC bridge + irq sync |
| srecc_prim_* | clock_gating, rst_sync, flop_2sync, ram_1p (+ unused 2p/dp) |
Register map
11 CSRs, 0x000–0x028, APB4 32-bit — physically in clk_axi via srecc_apb2apb (~7–9 clk_apb cycles per access).
| Offset | Name | Access | Key fields | Purpose |
|---|---|---|---|---|
| 0x000 | SRECC_CTRL | RW | ecc_en[0], uncorr_poison[1], corr_is_axi_err[2], lp_en[3], init_dis[4] | Permissive-boot control (protections default OFF) |
| 0x004 | SRECC_STATUS | RO | init_done[0], idle[1] | Core status |
| 0x008 | SRECC_INTR_EN | RW | ce/ue/ue_rmw/init_done[3:0] | Interrupt mask (reset 0xF) |
| 0x00C | SRECC_INTR_STS | W1C | same 4 bits | Sticky status, set-wins-over-clear |
| 0x010 | SRECC_CE_CNT | RW/WC | ce_cnt | Correctable-error count (write-to-clear) |
| 0x014 | SRECC_UE_CNT | RW/WC | ue_cnt | Uncorrectable count (read + RMW UE) |
| 0x018 | SRECC_ERR_ADDR | RO | err_addr[31:0] | First captured error address |
| 0x01C | SRECC_ERR_INFO | mixed | valid[0], type[1], bank[9:2], granule[12:10], syndrome[20:13] | First-error latch, re-arm on W1C |
| 0x020 | SRECC_ERR_INJ | RW | force_poison[0], force_single[1] | Test error injection |
| 0x024 | SRECC_INIT_CTRL | W1P | init_req[0] | Re-init trigger (reads 0) |
| 0x028 | SRECC_ID_VER | RO | 0x5345_0001 | ID / version |
branch-stan engineering activity
Chronological record of the work done on this IP's branch-stan worktree — documentation, constraint authoring, and the Formality clean-up pass.
- Cloned from
jenshi/SRAM_ECC, fast-forwarded tomain, then branchedbranch-stanwith a sibling-wtgit worktree somainstays untouched. - One-page design document generated from an RTL + testbench survey of the worktree (interfaces, block diagram, register map, CDC, verification status).
- Functional SDC set authored —
srecc_top_func_sdc.{clk,const,io}.tclplus asrecc_top.func.tclwrapper. AXI clocks set to 600 MHz; top-controlled uncertainty / fanout / transition constraints removed;-datapath_onlyguarded so DC-NXT stays quiet. - Formality scan of
srecc_pkg.sv:ecc_decodereviewed and cleared as a false positive — it reads fields of its own local return struct, not module state. No change required.
Verification & signoff
UVM 1.2 environment (02_uvm_tb): APB (RAL front-door), AXI, passive IRQ, and clk/rst agents; a scoreboard driven by an srecc_mem_model + srecc_ecc_model + CSR predictor; functional coverage; virtual sequencer. 69/69 TRUE PASS — 8 register, 19 functional, 33 error/recovery, 9 random/stress. URG coverage: Line 98.03% · Cond 84.85% · Toggle 88.67% · FSM 100% · Branch 97.76% · Group 93.86% (cg_axi/cg_apb later 100%). Static Lint 0/0 (19 by-design waivers in srecc_prim_*), CDC 0 unwaived (9 crossings), RDC 0 unwaived. Legacy directed TBs still pass (tb_ecc 4737 checks, tb_srecc_top 41). Deep-review caught and fixed a beat-wide poison leak, a sleep-entry ready hole, and a 3-bit-error mis-classification.
rtc_topRTCReal Time Clock
61 / 61 UVMWhat it does
RTC maintains century / year / month / day / hour / minute / second as seven counters advanced by a 1 Hz enable pulse, so timekeeping survives deep low-power where the bus clock is stopped. It compares the running time against a programmed alarm to raise a maskable interrupt, and against a wakeup target to drive an always-on wakeup output to the SoC power manager. A runtime-programmable prescaler lets one netlist run at any reference frequency (32.768 kHz, 1 MHz, …) without re-synthesis.
Key design decisions
- 1 Hz as an enable pulse, not a divided clockNo counter runs on a divided/gated clock —
psc_sec_tickavoids extra clock domains and glitches. - Runtime-programmable prescaler (RTC18)Divide ratio comes from a register, not a synthesis parameter — one netlist works at any clk_rtc frequency.
- Alarm/wakeup on un-gated clk_rtcTheir match-history flops must keep tracking during disable, else an en 0→1 could spuriously pulse.
- Day self-correctionAn out-of-range loaded day self-corrects to 1 on the next rollover (
day ≥ days_in_month). - Non-saturating century wrap 31→0Gives a 0000–3199 range; Gregorian leap year via century / %4 / %100 / %400.
- No battery domainPower retention is the SoC's responsibility, not the RTC's.
Errors & interrupts
Interrupt sources in RTC14, all maskable via RTC10, with irq_out_o the OR of enabled bits: Second/Combination alarm[0], Minute[1], Hour[2], Day[3], Per-second[4] (all W1C), Wakeup[5] (ROH, special-clear: WakeupEn=0 held ≥3 µs). Error behavior: an undefined offset returns pslverr with state unchanged; a Lock=0 write to counters is silently ignored; an illegal prescaler (0/1) is floored to MIN_PRESCALER=2; W1C set wins over clear on the same cycle.
Low power
The core clock clk_rtc_core (prescaler + calendar only) is ICG-gated with enable = RtcEn | RtcLock; off when fully disabled, so counters freeze. CSR / intr / wakeup / alarm stay on the un-gated always-on clk_rtc so wakeup works with clk_apb stopped. The gating-enable itself lives in the always-on domain, guaranteeing re-enable takes effect on the next clk_rtc edge.
External interfaces
| Signal | Protocol | Width | Dir | Purpose |
|---|---|---|---|---|
| apb_* (req) | APB4 slave | A 12 · D 32 · STRB 4 | in | Register access |
| apb_* (resp) | APB4 slave | 32 / 1 / 1 | out | prdata / pready / pslverr |
| irq_out_o | level, flopped | 1 | out | Aggregated interrupt · clk_apb |
| rtc_wakeup_o | level, flopped | 1 | out | Wakeup → power manager · clk_rtc (always-on) |
| test_en_i | DFT | 1 | in | Scan / ICG bypass |
Clocks, resets & CDC
Two clock domains
clk_apb— APB4 bus interface only (fast, may stop in sleep).clk_rtc— CSR + all functional logic (always-on, 32.768 kHz / 1 MHz). Internally split: gatedclk_rtc_core(prescaler, calendar) vs un-gatedclk_rtc(csr, intr, wakeup, alarm).
CDC & reset
rtc_apb2apbtwo-phase req/ack toggle. VC Static: 3× CDC_SYNC_CTRL (req/ack/irq via 2FF) + 6× CDC_SYNC_DATA (qualifier-latched, never bit-synced). Signoff 0 error.- Two independent async-assert / sync-deassert resets — each domain recovers independently; the toggle handshake self-heals.
Block diagram & dataflow
Figure 1 — the prescaler and calendar sit in the gate-able core; alarm and wakeup compare against running time, one feeding the interrupt, the other the always-on wakeup pin.
| Module | Role |
|---|---|
| rtc_top | Integration: 2 reset syncs, core ICG, I/O flops |
| rtc_apb2apb | clk_apb↔clk_rtc CDC bridge (two-phase req/ack toggle) |
| rtc_csr | Register file (clk_rtc), full 12-bit decode, pslverr |
| rtc_prescaler | Divides clk_rtc → 1 Hz psc_sec_tick enable pulse |
| rtc_calendar | 7 separate counters + carry chain + leap year |
| rtc_alarm | Alarm compare + per-second interrupt |
| rtc_wakeup | Always-on wakeup compare |
| rtc_intr | Enable mask + W1C status + IRQ aggregator |
| rtc_prim_* | clock_gating (ICG), rst_sync, flop_2sync, pulse_sync (+ unused ram) |
Register map
6 registers, 0x00–0x18. Full 12-bit decode (paddr[11:8] must be 0), else pslverr.
| Offset | Name | Key fields | Purpose |
|---|---|---|---|
| 0x00 | RTC00 | Day[28:24] Hour[20:16] Min[13:8] Sec[5:0] | RWH counter — current time |
| 0x04 | RTC04 | Cent[20:16] Year[14:8] Mon[3:0] | RWH counter — current date |
| 0x08 | RTC08 | Day / Hour / Min / Sec alarm | RW alarm target |
| 0x10 | RTC10 | WakeupEn[8] SecIntEn[7] DayAlarm..SecAlarm[6:3] Mode[2] Lock[1] En[0] | RW main control |
| 0x14 | RTC14 | Wakeup[5](ROH) SecInt[4] Day[3] Hour[2] Min[1] Sec[0] (W1C) | Status / interrupt |
| 0x18 | RTC18 | PrescalerDiv[31:0] | RW prescaler (reset = 1,000,000) |
branch-stan engineering activity
Chronological record of the work done on this IP's branch-stan worktree — documentation, constraint authoring, and the Formality clean-up pass.
- Cloned from
jenshi/RTC, fast-forwarded tomain, then branchedbranch-stanwith a sibling-wtgit worktree somainstays untouched. - One-page design document generated from an RTL + testbench survey of the worktree (interfaces, block diagram, register map, CDC, verification status).
- Functional SDC set authored —
rtc_top_func_sdc.{clk,const,io}.tclplus artc_top.func.tclwrapper. AXI clocks set to 600 MHz; top-controlled uncertainty / fanout / transition constraints removed;-datapath_onlyguarded so DC-NXT stays quiet. - Formality scan clean — no function or task reads a non-local module variable. No changes required.
Verification & signoff
Directed TB (01_tb_top): 6/6 PASS (csr, prescaler, calendar, alarm, wakeup, top). UVM 1.2 (02_uvm_tb): APB (active) + IRQ/wakeup (passive) + clk_rst agents; a 6-register uvm_reg model with golden predictor + scoreboard; functional covergroups for reg fields, leap year, carry boundaries, alarm modes, interrupts and errors. 61/61 TRUE PASS (earlier docs cite 43/43 before the stress/robustness suite was expanded). Coverage target line/cond/toggle/FSM ≥95%, functional 100% of required bins. Lint 0/0 (2 by-design waivers in prim/*), CDC 0 error, RDC 0 error. An unmodified Linux driver (rtc-jmicron.c) co-sims TRUE PASS via DPI-C.
pbmc_topPBMCPCIe-BAR-to-AXI remap bridge
44 PASS · cov 96.5What it does
PBMC forwards legal PCIe-side transactions to the BMC AXI fabric and rejects illegal ones locally. The PCIe controller strips each host access down to a BAR-relative offset and tags it with a PID on AxID. PBMC uses that PID to index a base-address table (programmed by firmware) and computes out_addr = base[pid] + offset. Because one AXI slave serves every BAR, the interface count is fixed regardless of how many BARs the device exposes. It is explicitly the reference design that validated the PID method later used by its sister IP, PCIE_MMBI.
Key design decisions
- PID-indexed base table, PID = AxID[3:0] lockedCollapses N BARs onto one slave / one master; interface count is fixed regardless of BAR count.
- Fail-closed defaultReset → every PID
EN=0,SIZE=0→ all accesses DECERR; nothing is reachable until firmware programs and enables it. - Full burst-extent bound check Rev.6Checks the highest byte the whole burst touches, not just the start — remapped output drops PID and AXI4's 4 KB rule can't protect sub-4 KB BARs; cross-PID isolation is enforced only here.
- Built-in error responderRejected transactions never reach BMC; the master FSM locally absorbs the full W burst / generates exactly
arlen+1R beats, so the host handshake always completes (no hang). - Single-outstanding, write-priority FSMSimplest, most verifiable control; deep pipelining deferred (reserved
MAXOSTDunused).
Errors & interrupts
A disabled PID returns DECERR; a burst-extent OOB or direction violation returns SLVERR — both raise remap_err. A BMC-returned SLVERR/DECERR is forwarded transparently and raises axi_err. A reserved FIFO-overflow bit is hardwired 0 (unreachable by design). Sources are 1-cycle pulses; clk_axi-origin pulses cross via pulse_sync, latch sticky in W1C IRQ_STAT (HW-set wins), mask through IRQ_EN, then aggregate to the irq_out DFF. Error-capture registers record the last {pid, resp, dir, 40-bit addr}.
Low power
The pure-combinational pbmc_lp_ctrl computes idle = ~busy & ~aw_pending & ~ar_pending; when LP_EN=1 and idle it gates only the AXI-master clock (clk_axi_g) via a single ICG cell. CDC and CSR stay always-on for responsiveness. Wake is glitch-free with no added latency; test_mode_i bypasses the ICG for DFT. Fully functionally transparent.
External interfaces
| Interface | Protocol | Width | Dir | Purpose |
|---|---|---|---|---|
| pcie_axi_* | AXI4 | AW 40 · DW 128 · ID 4 · U 1 | slave | PCIe-side inbound, one set for all BARs |
| bmc_axi_* | AXI4 | AW 40 · DW 128 | master | Remapped access to BMC fabric, single-outstanding |
| apb_* | APB4 | AW 12 · DW 32 | slave | CSR programming |
| irq_out_o | level | 1 | out | Aggregated interrupt, DFF-registered |
| test_mode_i | DFT | 1 | in | ICG bypass |
Clocks, resets & CDC
Three async clock domains
clk_apb(~100 MHz) — APB demux + source of both apb2apb bridges.clk_pbmc(~143 MHz) — AXI4 slave, PID decode, intr_agg, CSR(pbmc), CDC push.clk_axi(~125 MHz) — remap, gateable AXI4 master, CSR(axi), CDC pop.
CDC & reset
- 5-channel async FIFO between clk_pbmc↔clk_axi; two two-phase toggle handshakes from clk_apb; pulse_sync / flop_2sync for events.
- Clock-ratio-independent by design. Single
rst_nifanned out via 3× rst_sync (async-assert / sync-deassert) per domain.
Block diagram & dataflow
Figure 1 — one AXI slave collapses all BARs by PID and crosses the async-FIFO CDC into the remapping master; legal transactions forward to BMC, illegal ones are absorbed by the internal error-responder. APB programs both CSR halves.
| Module | Role |
|---|---|
| pbmc_top | Integration, parameter overrides, reset-sync instances |
| pbmc_axi_slave | clk_pbmc AXI4 slave; decodes PID = AxID[3:0]; pass-through into CDC |
| pbmc_axi_cdc | 5-channel async-FIFO bridge (AW/W/AR/B/R), gray-pointer, clk_pbmc↔clk_axi |
| pbmc_axi_master | Single-outstanding, write-priority 9-state FSM; forwards legal txns; built-in error responder |
| pbmc_addr_remap | Combinational out = base[pid] + offset with enable / bounds / direction check |
| pbmc_csr_axi | clk_axi CSR: PID remap table, AxCACHE/PROT, error capture, LP enable |
| pbmc_csr_pbmc | clk_pbmc CSR: ID / CTL / PID_CFG / STAT |
| pbmc_intr_agg | clk_pbmc interrupt sticky / mask / aggregate → irq_out DFF |
| pbmc_apb_demux + apb2apb ×2 | clk_apb dispatch (<0x400→#0, ≥0x400→#1) + two toggle-handshake CDC bridges |
| pbmc_lp_ctrl | Pure-combinational idle detect → master clock-gate enable |
Register map highlights
Regions: 0x000–0x00F ID/CTL/STAT (clk_pbmc); 0x010–0x01F IRQ (clk_pbmc); 0x400–0x41F master attrs / error / LP (clk_axi); 0x500–0x5FF the 16-entry PID remap table, stride 0x10 (clk_axi).
| Offset | Name | Key bits | Purpose |
|---|---|---|---|
| 0x000 | ID | 0x50424D43 | IP identity check |
| 0x00C | STAT | [0] idle | Engine idle (gates LP) |
| 0x018 | IRQ_STAT | [2:0] W1C | Sticky interrupt, HW-set priority |
| 0x400 | AXI_CTL | [3:0] AxCACHE [6:4] AxPROT | Outbound AXI attributes |
| 0x404 | AXI_ERR_STAT | [0] remap_err [1] axi_err (W1C) | Error latch |
| 0x408 | AXI_ERR_INFO | [3:0] pid [5:4] resp [6] wr | Latest error detail |
| 0x414 | LP_CTL | [0] lp_en | Clock-gate enable |
| 0x500+n·10 | PIDn_CTRL | [0] EN [1] RD_EN [2] WR_EN | Per-PID enable / direction |
| +0x4/+0x8 | PIDn_RMAP_LO/HI | base[39:0] | BMC target base (16 B-aligned) |
| +0xC | PIDn_SIZE | region size (≤4 GiB) | Region bound |
branch-stan engineering activity
Chronological record of the work done on this IP's branch-stan worktree — documentation, constraint authoring, and the Formality clean-up pass.
- Cloned from
jenshi/PBMC, fast-forwarded tomain, then branchedbranch-stanwith a sibling-wtgit worktree somainstays untouched. - One-page design document generated from an RTL + testbench survey of the worktree (interfaces, block diagram, register map, CDC, verification status).
- Functional SDC set authored —
pbmc_top_func_sdc.{clk,const,io}.tclplus apbmc_top.func.tclwrapper. AXI clocks set to 600 MHz; top-controlled uncertainty / fanout / transition constraints removed;-datapath_onlyguarded so DC-NXT stays quiet. - Formality scan clean — CSR helpers already pass their state by argument. No changes required.
Verification & signoff
UVM 1.2 environment (mirrors the PCIE_MMBI architecture): APB master agent, two AXI agents (PCIe-side master, BMC-side reactive slave + memory model), IRQ monitor, RAL reg model, ref-model-driven scoreboard, functional coverage. The as-built plan (Rev.7) reports 44 tests, all TRUE PASS, with lint / CDC / RDC clean (by-design waivers only). The issued Coverage Sign-off captures the prior 36-test regression: PASS 36 / FAIL 0, SCORE 96.51 · Line 99.67 · Cond 87.74 · Toggle 96.39 · FSM 100.00 · Branch 95.26 · functional group 100.00, every non-100% metric itemized-waived (unmapped address bits, reserved FIFO-overflow bit, QoS/Lock tie-offs, DFT scan-enable, illegal protocol combos). coverage numbers not yet regenerated for the 44-test set
mvdm_topMCTP_VDMMCTP-over-PCIe-VDM DMA controller
66 / 66 PASSWhat it does
MCTP_VDM is the hardware transport engine for an out-of-band management channel. On receive it filters inbound VDM traffic down to MCTP packets and DMAs them into a DRAM Rx ring; on transmit it reads packets a firmware queued into a Tx ring and pushes them out through the PCIe controller. It maintains the ring pointers and raises completion interrupts, but treats each packet as opaque bytes — it never parses message type, reassembles, or manages endpoint IDs. That keeps the datapath simple and leaves protocol semantics to software.
Key design decisions
- No backpressure on inbound VDM lockedMatches the PCIe core's limitation; reliability shifts entirely to sizing (32-deep async FIFO) + software drain speed + threshold/overflow protection.
- Wrap bit fixed at bit 16Not
log2(SIZE)— enables a runtime-variable RING_SIZE without changing the pointer format. - Descriptor-register Tx path4× MMIO writes to DESC0-3 + readback compare, halt on mismatch — no auto-retry; software diagnoses via TX_MMIO_RB.
- Two Rx commit modesPer-packet vs per-EOM — trades interrupt granularity against message-reassembly latency.
- Physical vs committed occupancy splitOverflow / threshold use physical (uncommitted) occupancy so mode-1 long messages can't overrun before EOM commits.
- Atomic 40-bit address commitShadow LO/HI + CFG_COMMIT avoids torn values across two APB writes.
Errors & interrupts
Seven W1C interrupt sources: RX_DONE, RX_OVERFLOW (ring full or async-FIFO overrun), TX_DONE, TX_ERR, RX_ALMOST_FULL, TX_ALMOST_FULL, RX_TIMEOUT. Four saturating drop counters classify losses — not-MCTP, EID-mismatch, buffer-full, and error/timeout/AXI. Overflow handling guarantees unread data is never overwritten, and a half-packet timeout auto-recovers with SOM resync in commit mode 1.
Low power
An ICG (mvdm_prim_clock_gating) gates the clk_axi Rx/Tx DMA datapath when idle. The clk_vdm_if front-end is never gated — it must watch MSG_VALID continuously, since inbound VDM cannot be back-pressured.
External interfaces
| Interface | Protocol | Width | Dir | Purpose |
|---|---|---|---|---|
| APB4 | AMBA APB4 | AW 12 · DW 32 | slave | CSR access |
| AXI4 master | AMBA AXI4 | AW 40 · DW 128 | master | Rx DRAM write, Tx DRAM read, Tx MMIO to DESC0-3 / VDM port |
| VDM inbound push | custom, push-only | 128 (+ctrl) | in | Raw VDM stream from PCIe Core — no handshake, no backpressure |
| irq_out | level | 1 | out | Aggregated interrupt, DFF-registered |
Clocks, resets & CDC
Three async clock domains
clk_apb(rst_apb_ni) — APB slave, address decode, apb2apb bridges.clk_axi(rst_axi_ni) — AXI master / arbiter, Rx/Tx DMA, pointers, IRQ aggregation.clk_vdm_if(rst_vdm_ni) — inbound VDM receive / filter / timeout and its CSRs.
CDC discipline
- Multi-bit crossings never use 2FF: Rx packet data via
fifo_async(gray-code, 32×16 B = 512 B deep); single-bit viaflop_2sync; 1-cycle pulses viapulse_sync; multi-bit buses viamcp_sync(hit-pulse + latch + snapshot); APB via toggle handshake. - Resets active-low, async assert / sync deassert.
Block diagram & dataflow
Figure 1 — Rx (solid accent) filters and DMAs inbound VDM into DRAM; Tx (dashed) reads DRAM and streams descriptors to the VDM port. Both share one AXI master, whose completions feed the interrupt aggregator.
| Module | Domain | Role |
|---|---|---|
| mvdm_top | — | Top-level integration |
| mvdm_vdm_rx_if | clk_vdm_if | Inbound VDM receive, 2-stage filter, framing, timeout, writes async FIFO |
| mvdm_rx_dma | clk_axi | Drains FIFO, SOM/EOM decode, commit-mode, pointer / occupancy / overflow |
| mvdm_tx_dma | clk_axi | Reads Tx ring, writes+readback 4 DESC regs, streams payload to VDM port |
| mvdm_axi_master | clk_axi | Single AXI4 master + arbiter (Rx write / Tx read / Tx MMIO) |
| mvdm_rx_drop_cnt | clk_axi | 4 classified drop counters with lossless CDC |
| mvdm_csr_axi | clk_axi | Main CSRs: ring / IRQ / PCIe / debug, shadow→live commit |
| mvdm_csr_vdm | clk_vdm_if | EID_FILTER, RX_TIMEOUT_CTRL, RXIF_DBG |
| mvdm_intr_agg | clk_axi | Interrupt OR-aggregation, registered irq_out |
| mvdm_apb_mux + apb2apb ×2 | clk_apb | APB decode + two req/ack CDC bridges |
Register map highlights
44 registers, 0x000–0x0B4, APB4 32-bit within a 4 KB space.
| Offset | Name | Key fields | Purpose |
|---|---|---|---|
| 0x000 | ID_VERSION | "MV" + 0100 | IP / version probe |
| 0x004 | CTRL | RX/TX_EN, RING_INIT, SOFT_RESET, DROP_CNT_CLR | Engine control |
| 0x00C | IRQ_STATUS | 7 W1C sources | Interrupt status |
| 0x01C | RX_CFG | RX_COMMIT_MODE | Per-packet vs per-EOM commit |
| 0x020/024 | RX_RING_BASE_LO/HI | shadow, 40-bit | Rx ring DRAM base |
| 0x02C/030 | RX_WRPTR / RDPTR | 17-bit, wrap @ bit16 | Rx pointers |
| 0x034 | RX_THRESHOLD | — | Almost-full watermark |
| 0x068/06C | OFFSET_VDM_DESC01/23 | 16-bit ×4 | Tx descriptor offsets (DESC0-3) |
| 0x07C | CFG_COMMIT | atomic commit | 40-bit shadow → live commit |
| 0x080–08C | RX_DROP ×4 | saturating | 4 drop classifications |
branch-stan engineering activity
Chronological record of the work done on this IP's branch-stan worktree — documentation, constraint authoring, and the Formality clean-up pass.
- Cloned from
jenshi/MCTP_VDM, fast-forwarded tomain, then branchedbranch-stanwith a sibling-wtgit worktree somainstays untouched. - One-page design document generated from an RTL + testbench survey of the worktree (interfaces, block diagram, register map, CDC, verification status).
- Functional SDC set authored —
mvdm_top_func_sdc.{clk,const,io}.tclplus amvdm_top.func.tclwrapper. AXI clocks set to 600 MHz; top-controlled uncertainty / fanout / transition constraints removed;-datapath_onlyguarded so DC-NXT stays quiet. - Formality fix —
wr_mask()made pure,mk_beat()takes bus / byte-enable as arguments, and the NBA tasks inmvdm_rx_dmainlined into the clocked block. VCS regression re-run: PASS. Merged tomain— PR #1. - DC-NXT
VER-720(a part-select taken on a function-call return) fixed inmvdm_csr_axi: the IRQ_ENABLE write-merge is hoisted to analways_combnet and then sliced. Logically identical and Formality-safe; inbranch-stan, not yet merged.
Verification & signoff
UVM 1.2 environment (VCS X-2025.06-SP2). Agents: APB master, AXI slave (+ DRAM/MMIO memory model), VDM master, IRQ monitor, and three clk/rst. A RAL front/back-door register model drives a reference-model scoreboard. 66 test cases — 11 register, 34 functional, 12 error/recovery, 9 IRQ/CDC/stress — all PASS. Coverage targets: functional ≥95% (error/CDC bins 100%), RAL 100%, code coverage ≥95%. Signoff: all 66 PASS + coverage met + lint/CDC/RDC (VC Static) zero un-waived violations. No open waivers documented in the reviewed set.
pmmbi_topPCIE_MMBIMCTP Memory-Mapped Buffer Interface
65 / 65 PASSWhat it does
PCIE_MMBI is the largest block in the set. It gives the PCIe host and the local BMC firmware a standardized shared-RAM mailbox for MCTP management messages: the host writes packets into a ring through its BAR window, hardware DMA-stages them to BMC DRAM, and interrupts fire in both directions. It layers the DMTF standards precisely — DSP0282 supplies the buffer mechanics (ring buffers, descriptor, interface state machine) and DSP0284 the MCTP binding rules (Null-EID, disallowed control commands, MT timers) — and adds a hardware SPROT access-control block on the host path.
Key design decisions
- DSP0282 base + DSP0284 on topBuffer mechanics (ring, descriptor, state machine) from DSP0282; MCTP binding rules (Null-EID, disallowed commands, MT timers) from DSP0284 — both fully adopted, not just the binding.
- §37 authoritative HW/FW matrix supersedingTX packet composition, ring wrap / WP-not-past-RP, and MCTP reassembly / SEQ tracking are firmware-owned; HW does only RX validation, pointer/CDC mechanics, DMA staging and watchdogs.
- SPROT scoped to the host AXI path onlyNot the DMA local port — DMA is trusted BMC traffic with no host PID, so redundant protection on a trusted path is avoided.
- Two hard integration invariantsH1 (AWID/AWUSER must be a trustworthy SoC-assigned PID) and M1 (ADRMAP for buffer PIDs must be identity, k=0) — SPROT collapses entirely if violated.
- Multi-bit CDC via packed handshakeValues are never bit-synced; always moved via
data_hsreq/ack to avoid bit-tearing.
Errors & interrupts
INTR_STAT[11:0] aggregates RXPKT, TXDONE, B2H/H2B_CONSUMED, RESET_REQ/DONE, PROT, DMA_DONE/ERR, CTLRESP, MT and MCTP_ERR, OR'd with INTR_EN into irq_out. The 16 write-monitor doorbell channels (address + value + per-PID mask) raise intr_db[n], gated by SPROT so denied writes never ring. Errors: AXI unmapped → DECERR; SPROT deny → SLVERR + intr_prot; non-atomic control write → SLVERR; DMA/DRAM error → INTR_STAT[8]; MCTP header errors → MMBI_MCTP_ST + [11]; MT timeout → [10]. All recoverable except an AXI-master "dead slave," which needs a full reset.
Low power
pmmbi_lowpower gates only the DMA / AXI-master clock (clk_dma_gated) and RAM write clocks via a latch-based ICG; the core clock is never gated (it must stay responsive to async host / doorbell / timer events). LP_CTL.AUTO_CG_EN enables auto-gating when idle = !dma_active; FORCE_ON overrides; IS_IDLE (RO) reports status. Wake-by-construction: the gate enable is combinational off always-on signals.
External interfaces
| Interface | Protocol | Width | Dir | Purpose |
|---|---|---|---|---|
| s_axi_* | AXI4 slave | AW 40 · DW 128 · ID 4 | slave | Host BAR access to buffer / descriptor |
| m_axi_* | AXI4 master | DW 32 · AxLEN 0 | master | DMA to BMC system DRAM |
| apb_* | APB4 slave | AW 12 · DW 32 | slave | BMC CSR access |
| irq_out_o | level, registered | 1 | out | BMC-directed interrupt |
| hirq_req_o / type_o | registered | NumChannel / 2 | out | Host-directed interrupt to PCIe hard-IP |
Clocks, resets & CDC
Three clock domains
clk_axi— host AXI4 datapath + host-path CSR (remap / doorbell / SPROT).clk_apb— APB4 control ingress, demuxed to the other two.clk_pmmbi— core: DMA, timers, MCTP validation, low-power, core CSR.
CDC & reset
apb2apb×2 (toggle handshake) for CSR;data_hs(value handshake) for pointers/descriptor;flop_2syncfor level flags;pulse_syncfor doorbell/event pulses; the shared buffer is dual-clockram_dp(A=clk_axi, B=clk_pmmbi).- Per-domain async-assert / sync-deassert reset; clk_apb and its paired core domain must reset together (documented integration contract).
Block diagram & dataflow
Figure 1 — the host writes packets down through SPROT into the dual-clock buffer RAM; the core DMA stages them to and from BMC DRAM (WMDA/RMDA), tapped by the MCTP validators, while doorbell and core INTR drive the two interrupt outputs.
| Module | Role |
|---|---|
| pmmbi_axi_slave | AXI4 slave (s_axi_*), host buffer access, AWID/AWUSER→PID |
| pmmbi_axi_master | AXI4 master (m_axi_*), single-beat / single-outstanding DMA port |
| pmmbi_addr_remap | 16-entry per-PID address remap (ADRMAP) |
| pmmbi_protect | SPROT: 16-region, 8-SID-group R/W ACL on the host AXI path |
| pmmbi_doorbell | 16 write-monitor doorbells (WIRQ) → intr_db[n] |
| pmmbi_buffer_ctrl | VPSCB ring control: WP/RP, multi-protocol header parse |
| pmmbi_mmbi_desc / _state | MMBI_Desc capability descriptor + DSP0282 Table-5 state machine |
| pmmbi_mctp_pkt / _ctl_resp | RX MCTP header validation + disallowed-control-command detect |
| pmmbi_dma | RMDA / WMDA engine, buffer↔BMC DRAM staging |
| pmmbi_timer | MT1 / MT3 / MT3a / MT4 timeout watchdogs |
| pmmbi_csr_axi / _pmmbi · apb_demux / apb2apb ×2 · lowpower | Split CSRs by domain + APB demux/CDC + idle clock-gating |
Register map highlights
Regions: 0x000–0x0FC E2M-compatible core; 0x100–0x1FC host-path (ADRMAP, doorbell); 0x200–0x2FC SPROT ACL; 0x400–0x458 MMBI transport (MCTP cfg, buffer ptrs, MT timers, interrupts, LP). Direct tally: 56 named registers/arrays across 152 addressable 32-bit words.
| Offset | Name | Key fields | Purpose |
|---|---|---|---|
| 0x004 | E2M_LOCK | LOCK (RWO1) | Locks static config |
| 0x080/0B0 | RMDA/WMDA_EN | EN (hw-clr) | DMA trigger |
| 0x280-2BC | SPROT_CTL00-15 | WENA, RENA | Per-region R/W ACL |
| 0x2C0-2FC | SPROT_ADR00-15 | SADR, SIZE | Protected-region bounds |
| 0x400 | MMBI_CFG | EID_ENFORCE, HDRVER_CHK, LEN_CHK | MCTP RX validation policy |
| 0x410/414 | MMBI_B2H/H2B_ADDR | base (0x880 / 0x080) | Fixed ring buffer bases |
| 0x418 | MMBI_BUF_SIZE | B2H_L, H2B_L | Ring lengths (2 KB default each) |
| 0x424 | MMBI_IF_FLAGS | H/B_UP, RST, RDY | Interface state (DSP0282 Table 5) |
| 0x430-43C | MT1-4_LIMIT | limit | Timeout watchdog thresholds |
| 0x450/454 | INTR_EN / STAT | 12 sources | Main interrupt aggregation |
branch-stan engineering activity
Chronological record of the work done on this IP's branch-stan worktree — documentation, constraint authoring, and the Formality clean-up pass.
- Cloned from
jenshi/PCIE_MMBI, fast-forwarded tomain, then branchedbranch-stanwith a sibling-wtgit worktree somainstays untouched. - One-page design document generated from an RTL + testbench survey of the worktree (interfaces, block diagram, register map, CDC, verification status).
- Functional SDC set authored —
pmmbi_top_func_sdc.{clk,const,io}.tclplus apmmbi_top.func.tclwrapper. AXI clocks set to 600 MHz; top-controlled uncertainty / fanout / transition constraints removed;-datapath_onlyguarded so DC-NXT stays quiet. - Formality fix —
wstrb()/wdata_strb()made pure inpmmbi_csr_axiandpmmbi_csr_pmmbi, with all call sites passing strobe / write-data explicitly. Merged tomain— PR #1. - Build filelist fix —
pmmbi_axi_master.sv(present on disk and instantiated inpmmbi_top) was missing fromflist.py; added so all 28 RTL sources compile.
Verification & signoff
UVM 1.2 TB: APB agent (BMC), AXI agent (host), memory agent (AXI4 DRAM responder), RAL (reg_block + adapter + passive predictor), and bound SVA (pmmbi_sva, pmmbi_axi_master_sva, pmmbi_data_hs_sva). Note: pmmbi_ref_model is a documented stub, not wired into the scoreboard — correctness comes from inline directed self-checks + SVA rather than a full predictor. 65 delivered tests, all TRUE PASS (Design Spec §21.3 cites 61 — a minor cross-doc inconsistency).
coverage model partially implemented Implemented covergroups: cg_axi, cg_reg_access, cg_dma, cg_interrupt, cg_state, cg_packet. Explicitly not implemented: cg_buffer_state, cg_error, cg_ctlresp, cg_role and 5 named crosses — so the "100% functional bins" target is aspirational, not the current state. Code coverage (URG) 84.71% overall (Line 99.85%, Branch 94.75%). CDC/RDC 0-unwaived with 26 by-design waivers each; lint 0/0 with 5 by-design waivers.