Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

CSR — tpb_xt_local_reg

Scope. The per-engine *_LOCAL_REG control aperture every TPB engine points at. This is the register file firmware drives to release run-stall and start/stop the embedded NX (Tensilica) control core and the eight Q7 sequencer cores, to set up the SoC↔Q7 address-translation windows, program the 4D tensor-replace descriptor, and drive the HW-decode breakpoint/debug machinery. This page opens the Part-13 CSR sub-lane and is the bitfield-level companion to the address-side view in tpb-pool.

Provenance. Every offset / reset / bit-range below is read directly from the shipped register-description schema csrs/tpb/tpb_xt_local_reg.json (binary-derived CSR JSON, 55 641 bytes, Cayman / NC-v3 arch-regs tree). Confidence tags: HIGH/MED/LOW × OBSERVED/INFERRED/CARRIED.


1. Regfile metadata

Read from .RegFile of tpb_xt_local_reg.json. [HIGH · OBSERVED]

PropertyValueMeaning
UnitNametpb_xt_local_regregfile name
TypeREGFILEa flat register file (no sub-regfiles)
RegfileFlavorPOSEDGEposedge-clocked flops
InterfaceTypeAPBAPB-mapped control bus
AddrWidth1616-bit byte address → 64 KiB span
DataWidth32every register is 32 bits, word-addressed
SizeInBytes0x1000064 KiB aperture (matches LOCAL_REG slot, see tpb-pool)
Memories / Parameters / Includes[]all empty

The 64 KiB SizeInBytes is the same 0x10000 that tpb-pool reserves for TPB_0_POOL_LOCAL_REG at SoC-absolute 0x2803060000 (slot +0x3060000 off the 0x2800000000 cluster pseudo-base). For the POOL engine the q7-bundle doorbell therefore lands at 0x2803060000 + 0x3000 + 0x0 = 0x2803063000, which is exactly the boot doorbell cited by #900. [HIGH · OBSERVED]

Addressing model

The schema nests RegFile → RegistersBundleArrays[] → Registers[] → BitFields[]. A register's AddressOffset is relative to its bundle's AddressOffset; for an indexed bundle (ArraySize > 1) the per-instance base advances by the bundle's BundleSizeInBytes stride:

abs_byte_off(reg, i) = bundle.AddressOffset
                     + i * bundle.BundleSizeInBytes      // i in 0 .. ArraySize-1
                     + reg.AddressOffset

BitFields[].Position is either a single bit "N" or an inclusive range "hi:lo". Reset values live in BitFields[].ResetValue (hex string), not in any Reset key. [HIGH · OBSERVED]

GOTCHA (extraction). The reset key is literally ResetValue. A naive .Reset lookup returns null for every field and will make you think the whole file is reset-less — it is not. All non-zero resets quoted on this page (0x1, 0xFF, 0x1FFF, 0x10, 0xb2924, the CAM byte selectors) come from ResetValue.


2. Bundle map

The file declares 7 bundle-arrays, 55 registers, 84 bitfields (jq-counted, re-verified). Every AccessType (register and bitfield) is RW; every SpecialAccess is None — there are no RO/WO fields in this block, even the field literally named reserved. [HIGH · OBSERVED]

bundlebaseArraySizestride (BundleSizeInBytes)regsfieldsarray span
nx0x000010x100088single instance
general0x1000600x0020110x10000x1760
window0x2000400x001C7120x20000x245C
q70x300010x10001919single instance
hw_decode0x400010x10001431single instance
tensor_replace0x5000320x0020480x50000x53FF
notific0x600010x010025single instance

Each array span is verified to fit inside its 0x1000-aligned reserved window (window ends at 0x2000 + 40*0x1C = 0x245C; tensor_replace ends at 0x5000 + 32*0x20 = 0x5400). [HIGH · OBSERVED]

QUIRK. Bundle strides do not pack tightly to the register footprint. general reserves 0x20 per instance for a single 4-byte register; window reserves 0x1C for 7 registers (a perfect fit); tensor_replace reserves 0x20 for only 0x10 of registers, leaving 0x10 dead per slot. Always compute instance bases from BundleSizeInBytes, never from the register count.


3. Bundle nx — embedded NX control core (base 0x0000, 1 instance)

The single Tensilica NX core that runs the engine's control firmware. This is the boot path: at reset the core is held in run-stall and FW releases it. [HIGH · OBSERVED]

offregisterfieldbitsresetpurpose
0x0000release_run_stallrun_stall[0]0x1write 0 → release RunStallOnReset to NX. Reset 1 ⇒ held stalled.
0x0004start_ctrlctrl[0]0x01: start_addr valid, exit Halt, begin executing
0x0008run_statestate[31:0]0x0opaque run-state status word
0x000Cdma_rx_basebase[31:0]0x0DMA RX base address
0x0010dma_tx_basebase[31:0]0x0DMA TX base address
0x0014instr_halt_ctrlhalt_req[0]0x0request entry to ISA HALT state
0x0018intr_ctrlen[3:0]0x0interrupt enable, 4 sources
0x001Cintr_infometadata[31:0]0x0interrupt metadata

4. Bundle q7 — eight sequencer cores (base 0x3000, 1 instance)

The eight Q7 sequencer cores live behind a single bundle instance whose release_run_stall carries one bit per core ([7:0], reset 0xFF ⇒ all 8 stalled). This is the CSR-level confirmation of NUM_POOL_CORES = 8. The base 0x3000 is the anchor every sibling page cites. [HIGH · OBSERVED]

offregisterfieldbitsresetpurpose
0x3000release_run_stallrun_stall[7:0]0xFFwrite 0 per-bit → release RunStallOnReset to Q7[bit]. Reset 0xFF ⇒ all 8 held stalled.
0x3004start_ctrlctrl[0]0x01: start_addr valid, exit Halt, start executing
0x3008run_state_0run_state[31:0]0x0Q7 #0 run-state
0x300Crun_state_1run_state[31:0]0x0Q7 #1 run-state
0x3010run_state_2run_state[31:0]0x0Q7 #2 run-state
0x3014run_state_3run_state[31:0]0x0Q7 #3 run-state
0x3018run_state_4run_state[31:0]0x0Q7 #4 run-state
0x301Crun_state_5run_state[31:0]0x0Q7 #5 run-state
0x3020run_state_6run_state[31:0]0x0Q7 #6 run-state
0x3024run_state_7run_state[31:0]0x0Q7 #7 run-state
0x3028intr_ctrlen[31:0]0x0interrupt enable, 4 bits per Q7 (8 × 4 = 32)
0x302Cintr_info_0metadata[31:0]0x0Q7 #0 interrupt metadata
0x3030intr_info_1metadata[31:0]0x0Q7 #1 interrupt metadata
0x3034intr_info_2metadata[31:0]0x0Q7 #2 interrupt metadata
0x3038intr_info_3metadata[31:0]0x0Q7 #3 interrupt metadata
0x303Cintr_info_4metadata[31:0]0x0Q7 #4 interrupt metadata
0x3040intr_info_5metadata[31:0]0x0Q7 #5 interrupt metadata
0x3044intr_info_6metadata[31:0]0x0Q7 #6 interrupt metadata
0x3048intr_info_7metadata[31:0]0x0Q7 #7 interrupt metadata

4.1 Run-stall / start-stop sequence

The host boot path for a Q7 core is: set the entry PC, clear the stall bit, assert start. The reset state is "all 8 cores held in RunStallOnReset, neither started"; FW clears one stall bit at a time so individual cores can be brought up independently. Cross-link boot-reset. [HIGH · INFERRED — register semantics OBSERVED, ordering INFERRED from field descriptions]

/* tpb_xt_local_reg q7 bundle, base = LOCAL_REG + 0x3000.
 * Release one Q7 sequencer core out of RunStallOnReset and start it.
 * `base` is the SoC-absolute LOCAL_REG of the engine (e.g. POOL = 0x2803060000),
 * so the q7 bundle is at base + 0x3000.
 * release_run_stall.run_stall is [7:0], reset 0xFF (all 8 stalled). */
static void q7_release_and_start(volatile uint32_t *base, unsigned core /*0..7*/)
{
    volatile uint32_t *q7 = base + (0x3000u / 4);   /* word-indexed */

    /* 1. (caller has already loaded the Q7 entry PC via its IRAM/start_addr.) */

    /* 2. Clear THIS core's stall bit: read-modify-write 0xFF -> bit cleared.
     *    Each bit gates one core's RunStallOnReset; writing 0 releases it. */
    uint32_t stall = q7[0x0u / 4];          /* release_run_stall @ +0x0 */
    stall &= ~(1u << core);                  /* drop bit `core` */
    q7[0x0u / 4] = stall;

    /* 3. Assert start_ctrl.ctrl = 1: declares start_addr valid, exits Halt,
     *    begins execution. start_ctrl is a single [0] bit @ +0x4. */
    q7[0x4u / 4] = 1u;                        /* start_ctrl.ctrl */

    /* 4. (optional) poll run_state_<core> @ +0x8 + core*4 for liveness. */
    /*    volatile uint32_t st = q7[(0x8u + core*4u) / 4]; */
}

GOTCHA. release_run_stall is a bitmask — a blind *reg = 0 releases all eight cores at once. To bring up one core, read-modify-write so the other seven stay stalled. The NX bundle's release_run_stall (§3) is a single [0] bit, so for NX write 0 is unambiguous.

NOTE. run_state_<n> is [31:0] and the schema describes it only as a status word — its encoding is not enumerated here (no enum in the JSON). Treat it as opaque; poll for change, not for a specific value. [MED · OBSERVED]


5. Bundle window — SoC↔Q7 address-translation windows (base 0x2000, 40 instances, stride 0x1C)

40 address-remap windows. Each window is {control, mask, match, replace} and selects a requester class (any / NX-only / Q7-only / a single selected Q7) and a 40-bit match/mask page key that, on hit, substitutes a relocated address. This is the LOCAL_REG side of the windows documented end-to-end in soc-q7-translation-windows. [HIGH · OBSERVED]

Per-window register layout (relative offsets; instance i base = 0x2000 + i*0x1C):

relregisterfieldbitsresetpurpose
0x00controlwindow_valid[0]0x0enable window. Clear before reconfig; set only after full state is valid.
0x00controlnx_dedicated[1]0x0only NX-initiated requests match
0x00controlq7_dedicated[2]0x0only Q7-initiated requests match
0x00controlsingle_q7_enable[3]0x0only the Q7 selected by [6:4] matches
0x00controlsingle_q7_select[6:4]0x0which Q7 (0‥7); ignored if [3]==0
0x00controlreserved[31:7]0x0reserved (AccessType still RW)
0x04mask_lovalue[31:20]0x0mask_value[31:20]
0x08mask_hivalue[7:0]0x0mask_value[39:32]
0x0Cmatch_lovalue[31:20]0x0match_value[31:20]
0x10match_hivalue[7:0]0x0match_value[39:32]
0x14replace_lovalue[31:20]0x0replace_value[31:20]
0x18replace_hivalue[25:0]0x0replace_value[63:32]

QUIRK (split fields, page-aligned). mask/match are 40-bit keys presented as bits [39:20] only: *_lo holds [31:20] and *_hi holds [39:32]. The low 20 bits are implicitly 0 — windows match on 1 MiB-aligned (2^20) pages, so there is no [19:0] field. replace is the 64-bit substitute split as replace_lo[31:20] + replace_hi = [63:32]. The bit ranges are taken verbatim from Position; do not assume contiguous 32-bit lo/hi halves. [HIGH · OBSERVED]

5.1 Program one translation window

/* tpb_xt_local_reg window bundle, base = LOCAL_REG + 0x2000, stride 0x1C.
 * Program window `w` to remap a Q7-issued page (mask/match) to `replace`.
 * mask/match cover bits [39:20]; replace covers [63:20] in the same split.
 * Low 20 bits are page-implicit-zero (1 MiB granularity). */
static void window_program(volatile uint32_t *base, unsigned w /*0..39*/,
                           uint64_t match40, uint64_t mask40, uint64_t replace64,
                           int q7_only, int single_q7 /* -1 = any, else 0..7 */)
{
    volatile uint32_t *win = base + ((0x2000u + w * 0x1Cu) / 4);

    /* 1. Disable the window first (window_valid must be 0 during reconfig). */
    win[0x00u / 4] = 0u;                                 /* control = 0 */

    /* 2. mask  : lo = bits[31:20], hi = bits[39:32]. */
    win[0x04u / 4] = (uint32_t)( mask40 & 0xFFF00000ull);            /* mask_lo  [31:20] */
    win[0x08u / 4] = (uint32_t)((mask40 >> 32) & 0xFFull);           /* mask_hi  [39:32] */

    /* 3. match : same split. */
    win[0x0Cu / 4] = (uint32_t)( match40 & 0xFFF00000ull);           /* match_lo [31:20] */
    win[0x10u / 4] = (uint32_t)((match40 >> 32) & 0xFFull);          /* match_hi [39:32] */

    /* 4. replace: lo = bits[31:20], hi = bits[63:32] (26-bit field). */
    win[0x14u / 4] = (uint32_t)( replace64 & 0xFFF00000ull);         /* replace_lo [31:20] */
    win[0x18u / 4] = (uint32_t)((replace64 >> 32) & 0x03FFFFFFull);  /* replace_hi [63:32] */

    /* 5. Finally build control and set window_valid LAST. */
    uint32_t ctrl = 1u;                                  /* window_valid = 1 */
    if (q7_only)        ctrl |= (1u << 2);               /* q7_dedicated */
    if (single_q7 >= 0) ctrl |= (1u << 3)                /* single_q7_enable */
                              | ((uint32_t)(single_q7 & 0x7) << 4); /* single_q7_select */
    win[0x00u / 4] = ctrl;
}

GOTCHA (valid-bit ordering). The window_valid description is explicit: clear it before touching any other window state, set it only after mask / match / replace are fully written. Writing control first (or never clearing it) lets the remap fire on a half-programmed key. [HIGH · OBSERVED]


6. Bundle tensor_replace — 4D strided-replace descriptor (base 0x5000, 32 instances, stride 0x20)

32 instances of a 4D tensor descriptor. Each descriptor packs two 16-bit subfields per 32-bit register across four registers: per-axis step size (X/Y/Z/W) and per-axis element count (X/Y/Z/W). [HIGH · OBSERVED]

Per-instance layout (relative offsets; instance i base = 0x5000 + i*0x20):

relregisterfieldbitsresetpurpose
0x0tensor_4d_dim_0step_size_x[15:0]0x0X step size
0x0tensor_4d_dim_0step_size_y[31:16]0x0Y step size
0x4tensor_4d_dim_1step_size_z[15:0]0x0Z step size
0x4tensor_4d_dim_1step_size_w[31:16]0x0W step size
0x8tensor_4d_dim_2num_elem_x[15:0]0x0X element count
0x8tensor_4d_dim_2num_elem_y[31:16]0x0Y element count
0xCtensor_4d_dim_3num_elem_z[15:0]0x0Z element count
0xCtensor_4d_dim_3num_elem_w[31:16]0x0W element count

NOTE. The eight logical subfields (step_size_*, num_elem_*) are packed into four registers, not eight; the 0x100x1F tail of each 0x20 slot is unused. Steps and counts are uint16. [HIGH · OBSERVED]

6.1 Program one tensor-replace descriptor

/* tpb_xt_local_reg tensor_replace bundle, base = LOCAL_REG + 0x5000, stride 0x20.
 * Pack a 4D (X,Y,Z,W) strided descriptor `d` (0..31): per-axis 16-bit step + count. */
static inline uint32_t pack16(uint16_t lo, uint16_t hi)
{
    return (uint32_t)lo | ((uint32_t)hi << 16);
}

static void tensor_replace_program(volatile uint32_t *base, unsigned d /*0..31*/,
                                   const uint16_t step[4] /*x,y,z,w*/,
                                   const uint16_t num[4]  /*x,y,z,w*/)
{
    volatile uint32_t *t = base + ((0x5000u + d * 0x20u) / 4);
    t[0x0u / 4] = pack16(step[0], step[1]);  /* dim_0: step_x | step_y */
    t[0x4u / 4] = pack16(step[2], step[3]);  /* dim_1: step_z | step_w */
    t[0x8u / 4] = pack16(num[0],  num[1]);   /* dim_2: num_x  | num_y  */
    t[0xCu / 4] = pack16(num[2],  num[3]);   /* dim_3: num_z  | num_w  */
}

7. Bundle hw_decode — HW instruction-decode + breakpoint/KDB debug (base 0x4000, 1 instance)

Configures the HW instruction-decode path (vs the instruction FIFO) and the full KDB breakpoint surface: instruction breakpoints, two opcode-instance counters (IC0/IC1), two address breakpoints, single-step, and immediate pause. Cross-link the CAM programming side in hw-decode-cam-programming and the debugger driver in uarch-debugger. [HIGH · OBSERVED]

offregisterfieldbitsresetpurpose
0x4000controldisable_hw_decode[0]0x0select Instr-FIFO vs HW-decode path. Cannot change while traffic flows / not in halt. SP uses in production; chicken bit elsewhere.
0x4000controlinstr_ordering_mode[1]0x0strong/relaxed ordering (NX sets per SetOrderingMode / ctrl_om). Strong ⇒ pause at sync_stage, release one-by-one on engine_drain_done.
0x4000controliram_block_size_mask[18:2]0x1FFFmask cache-block index off IRAM addr → PC lower bits (rtl builds full PC from PC_upper + IRAM_offset)
0x4000controliram_ctrl_flush_en[20]0x0enable IRAM-ctrl flush (SP/TOP instance only)
0x4004breakpoint_ctrlbreakpoint_instr_enable[0]0x1enable instruction breakpoint
0x4004breakpoint_ctrlbreakpoint_profile_table_enable[1]0x1enable bp sourced from profile table
0x4004breakpoint_ctrlucode_force_pause_enable[2]0x1enable force_pause output of NX
0x4004breakpoint_ctrlbreakpoint_step_valid[3]0x0num_instr valid (step mode); uCode toggles 0→1 then resume_issue
0x4004breakpoint_ctrlbreakpoint_addr0_valid[4]0x0enable bp address-0 check
0x4004breakpoint_ctrlbreakpoint_addr1_valid[5]0x0enable bp address-1 check
0x4004breakpoint_ctrlic0_valid[6]0x0clear-on-invalid / start-on-valid HW IC0 counter
0x4004breakpoint_ctrlic1_valid[7]0x0clear-on-invalid / start-on-valid HW IC1 counter
0x4004breakpoint_ctrlimmediate_pause[8]0x0immediate pause after current instr (host debug)
0x4008breakpoint_stepnum_instr[31:0]0x0KDB "step N instr" count; rtl decrements to 0 then pauses at sync_stage
0x400Cbreakpoint_matchic0_mask[7:0]0x0mask for IC0 opcode counter
0x400Cbreakpoint_matchic0_opcode[15:8]0x0opcode for IC0 (instr.opcode & ic0_mask)
0x400Cbreakpoint_matchic1_mask[23:16]0x0mask for IC1 opcode counter
0x400Cbreakpoint_matchic1_opcode[31:24]0x0opcode for IC1 (instr.opcode & ic1_mask)
0x4010breakpoint_ic0value[31:0]0x0instr-count threshold to match IC0
0x4014breakpoint_ic1value[31:0]0x0instr-count threshold to match IC1
0x4018breakpoint_addr0_lovalue[31:0]0x0bp addr0 low — HW-decode pauses after this address
0x401Cbreakpoint_addr0_hivalue[31:0]0x0bp addr0 high
0x4020breakpoint_addr1_lovalue[31:0]0x0bp addr1 low
0x4024breakpoint_addr1_hivalue[31:0]0x0bp addr1 high
0x4028profile_cam_search_vectorprofile_cam_search_byte_0[5:0]0x0CAM-search byte0 select (0‥63)
0x4028profile_cam_search_vectorprofile_cam_search_byte_1[13:8]0x1CAM-search byte1 select
0x4028profile_cam_search_vectorprofile_cam_search_byte_2[21:16]0x2CAM-search byte2 select
0x4028profile_cam_search_vectorprofile_cam_search_byte_3[29:24]0x3CAM-search byte3 select
0x402Chw_decode_flush_cntrvalue[7:0]0x10cycles to wait before issuing flush-done after the HW instr queue empties
0x4030spare0value[31:0]0x0spare register
0x4034spare1value[31:0]0x0spare register

NOTE (reset asymmetry). Three breakpoint_ctrl enables reset to 1 (breakpoint_instr_enable, breakpoint_profile_table_enable, ucode_force_pause_enable) — the breakpoint engine is armed at reset; the triggers (*_valid, immediate_pause) reset to 0. The CAM-search byte selectors default to the identity sequence {0,1,2,3}, and hw_decode_flush_cntr resets to 0x10 cycles. [HIGH · OBSERVED]

QUIRK. iram_block_size_mask is 17 bits ([18:2]) — not a clean power-of-two field — and resets to 0x1FFF (13 set bits). It masks the cache block index out of the IRAM address so rtl can reconstruct the PC. Do not assume it spans the whole register. [HIGH · OBSERVED]

7.1 Arm an address breakpoint

/* hw_decode bundle, base = LOCAL_REG + 0x4000.
 * Arm breakpoint slot 0 to pause HW-decode after a 64-bit instruction address. */
static void hw_decode_break_at(volatile uint32_t *base, uint64_t addr)
{
    volatile uint32_t *hd = base + (0x4000u / 4);

    hd[0x18u / 4] = (uint32_t)(addr & 0xFFFFFFFFu);          /* breakpoint_addr0_lo */
    hd[0x1Cu / 4] = (uint32_t)(addr >> 32);                  /* breakpoint_addr0_hi */

    uint32_t ctl = hd[0x4u / 4];                             /* breakpoint_ctrl */
    ctl |= (1u << 0)        /* breakpoint_instr_enable (already 1 at reset) */
         | (1u << 4);       /* breakpoint_addr0_valid: enable addr-0 check  */
    hd[0x4u / 4] = ctl;
    /* On hit, HW-decode pauses at the sync_stage; resume via the debugger. */
}

8. Bundle notific — SW-queue mapping + timestamp (base 0x6000, 1 instance)

Maps each Q7 sequencer's generated notifications to a SW queue number and sets the timestamp increment. [HIGH · OBSERVED]

offregisterfieldbitsresetpurpose
0x6000sw_queue_num0Q7_0[3:0]0x0SW queue num for Q7_0 notifications
0x6000sw_queue_num0Q7_1[7:4]0x0SW queue num for Q7_1 notifications
0x6000sw_queue_num0Q7_2[11:8]0x0SW queue num for Q7_2 notifications
0x6000sw_queue_num0Q7_3[15:12]0x0SW queue num for Q7_3 notifications
0x6004cfg_timestamp_incval[23:0]0xb2924timestamp increment, clock-frequency derived

GOTCHA. sw_queue_num0 maps only Q7_0‥Q7_3 (four 4-bit nibbles). There is no sw_queue_num1 register in this block — the upper four cores Q7_4‥Q7_7 are not mapped here (handled elsewhere, or a schema omission). Do not assume an 8-core nibble array. [MED · OBSERVED]


9. Bundle general — scratch local registers (base 0x1000, 60 instances, stride 0x20)

relregisterfieldbitsresetpurpose
0x0lrvalue[31:0]0x0general local register (glr) for NX/Q7

60 instances at 0x1000 + i*0x20 (lr[0]@0x1000lr[59]@0x1760); one register per 0x20 slot, the remaining 0x1C is unused. [HIGH · OBSERVED]


10. Interrupt control summary

Two separate interrupt apertures, one per core domain. [HIGH · OBSERVED]

domainenable regwidthmetadata regssemantics
NXnx.intr_ctrl.en[3:0]nx.intr_info [31:0]4 sources for the single NX core
Q7q7.intr_ctrl.en[31:0]q7.intr_info_0..7 [31:0]4 bits per Q7 (8 × 4 = 32); per-core metadata word

The Q7 intr_ctrl packs all 8 cores' enables into one 32-bit register (core c → bits [4c+3 : 4c]); each core then has its own intr_info_<c> metadata word. [HIGH · OBSERVED for the 4-bit-per-core layout; the exact 4 source meanings are not enumerated in the JSON — MED · INFERRED]

/* Enable all 4 interrupt sources for Q7 core `c` (0..7). */
static void q7_enable_intr(volatile uint32_t *base, unsigned c)
{
    volatile uint32_t *q7 = base + (0x3000u / 4);
    uint32_t en = q7[0x28u / 4];             /* q7.intr_ctrl @ +0x28 */
    en |= (0xFu << (4u * c));                 /* 4 bits for core c */
    q7[0x28u / 4] = en;
}

11. Per-generation applicability

Compared against the sibling arch-regs trees shipped in the customop library. [HIGH · OBSERVED for cayman/mariana/mariana_plus/maverick; v2/V1 INFERRED]

archNC genregs / fieldsbundles vs CaymanSizeInBytesq7.release_run_stall
caymanNC-v355 / 84base set (this page)0x10000[7:0] reset 0xFF
marianaNC-v459 / 88+4 atomic bundles0x10000[7:0] reset 0xFF
mariana_plusNC-v459 / 88+4 atomic bundles0x10000[7:0] reset 0xFF
maverickNC-v559 / 88+4 atomic bundles0x10000[7:0] reset 0xFF
sundaNC-v2no tpb_xt_local_reg.json shippedINFERRED present
tongaV1no tpb_xt_local_reg.json shippedINFERRED present

The four added bundles on v4/v5 are atomic-op apertures appended after notific, each ArraySize=64 with a single value[31:0] register:

bundlebaseArraySizestridepurpose
atomic_rdwr0x8000640x10atomic read-write slots
atomic_inc0x8400640x10atomic increment slots
atomic_dec0x8800640x10atomic decrement slots
atomic_addiff00x8C00640x10atomic add-if-zero slots

NOTE (per-gen). All five core control surfaces this page documents — the NX/Q7 run-stall release, the 40 translation windows, the 4D tensor-replace descriptor, the HW-decode/breakpoint block, and the notification mapping — are byte-identical across cayman/mariana/mariana_plus/maverick at the same offsets (nx@0x0000, window@0x2000, q7@0x3000, hw_decode@0x4000, tensor_replace@0x5000, notific@0x6000). The v4/v5 delta is additive only (the 0x8000-region atomic apertures inside the previously-RESERVED upper half of the same 0x10000 aperture). A Cayman reimplementation that ignores the atomic region is forward-compatible for the control path. [HIGH · OBSERVED for v3/v4/v5; v2/V1 INFERRED — not shipped]

CORRECTION (vs SX-CSR-01). SX-CSR-01 enumerated only the Cayman variant and reports "7 bundles / 55 regs / 84 fields" as the layout. That is exact for Cayman, but the v4/v5 arch-regs trees ship 11 bundles / 59 regs / 88 fields — the four atomic_* apertures at 0x80000x8FFF are absent from the report because it did not cross-check the maverick/mariana trees. All other SX-CSR-01 offsets, resets, and field positions reproduce exactly.


12. Cross-references


Appendix A — full register map (offset / name / width / access)

All 55 Cayman registers, absolute byte offsets (instance 0 for indexed bundles). Every register is 32-bit RW. [HIGH · OBSERVED]

abs offbundle[i]registerwidthaccess
0x0000nxrelease_run_stall32RW
0x0004nxstart_ctrl32RW
0x0008nxrun_state32RW
0x000Cnxdma_rx_base32RW
0x0010nxdma_tx_base32RW
0x0014nxinstr_halt_ctrl32RW
0x0018nxintr_ctrl32RW
0x001Cnxintr_info32RW
0x1000+i*0x20general[0..59]lr32RW
0x2000+i*0x1C+0x00window[0..39]control32RW
0x2000+i*0x1C+0x04window[0..39]mask_lo32RW
0x2000+i*0x1C+0x08window[0..39]mask_hi32RW
0x2000+i*0x1C+0x0Cwindow[0..39]match_lo32RW
0x2000+i*0x1C+0x10window[0..39]match_hi32RW
0x2000+i*0x1C+0x14window[0..39]replace_lo32RW
0x2000+i*0x1C+0x18window[0..39]replace_hi32RW
0x3000q7release_run_stall32RW
0x3004q7start_ctrl32RW
0x30080x3024q7run_state_0..732RW
0x3028q7intr_ctrl32RW
0x302C0x3048q7intr_info_0..732RW
0x4000hw_decodecontrol32RW
0x4004hw_decodebreakpoint_ctrl32RW
0x4008hw_decodebreakpoint_step32RW
0x400Chw_decodebreakpoint_match32RW
0x4010hw_decodebreakpoint_ic032RW
0x4014hw_decodebreakpoint_ic132RW
0x40180x4024hw_decodebreakpoint_addr0/1_lo/hi32RW
0x4028hw_decodeprofile_cam_search_vector32RW
0x402Chw_decodehw_decode_flush_cntr32RW
0x4030hw_decodespare032RW
0x4034hw_decodespare132RW
0x5000+i*0x20+0x0tensor_replace[0..31]tensor_4d_dim_032RW
0x5000+i*0x20+0x4tensor_replace[0..31]tensor_4d_dim_132RW
0x5000+i*0x20+0x8tensor_replace[0..31]tensor_4d_dim_232RW
0x5000+i*0x20+0xCtensor_replace[0..31]tensor_4d_dim_332RW
0x6000notificsw_queue_num032RW
0x6004notificcfg_timestamp_inc32RW

Schema cross-check. 8 (nx) + 1 (general) + 7 (window) + 19 (q7) + 14 (hw_decode) + 4 (tensor_replace) + 2 (notific) = 55 registers, 84 bitfields — matches the jq count of the JSON exactly. [HIGH · OBSERVED]