Telemetry Receiver
1. Overview
The receiver assembles an 8-bit ATB stream into probe-ID and counter messages. Software reads completed messages through a 32-bit AXI4-Lite register interface and explicitly pops each message. The core defaults to eight queued messages and four counters per message; these are elaboration parameters, not software settings. Threshold and missing-last-packet interrupts report service needs.
Reception does not stop when the message queue fills: a new message replaces
the oldest one, including while software is reading it through several
registers. The
Telemetry Receiver section
of the Programmer’s Guide gives the buffer, flush and interrupt procedures. The receiver does not use atid_i to maintain separate
source contexts; producers sharing a receiver must serialize complete messages.
1.1. Message Format
Eight little-endian ATB beats form a 64-bit packet. One or more packets
form a message that ends when last_packet is set.
Table 1 defines the fields carried in each telemetry packet.
| Field | Width | Location |
|---|---|---|
|
1 bit |
Bit 63 of each packet |
|
5 bits |
Bits |
block |
9 bits |
Seven per packet: 1-bit valid + 8-bit data |
counter |
32 bits |
Four consecutive blocks, most-significant byte first |
A counter is valid only when all four of its blocks are valid. The number of counters per message is parameterized (default 4); the field layout is fixed.
2. Architecture
The receiver has two stores: a byte assembly buffer for the incoming message and a queue of decoded messages for software. Neither is a second independently configurable telemetry channel.
2.1. Assembly and Decode
An accepted beat (atvalid_i && atready_o) writes one assembly byte. Eight
beats form a packet, least-significant byte first. Bit 63 marks the last packet;
the first packet carries the probe ID at bits [60:56]. Counter decoding starts
at block 1 of the first packet, continues across packet boundaries, and assembles
each counter most-significant byte first. All four block-valid bits must be set
for a counter to be valid; otherwise its decoded value is zero.
The assembly capacity is derived from MAX_NUM_COUNTERS_PER_MESSAGE. Reaching
that capacity without a last-packet marker raises MISSING_LAST and resets the
write pointer. A last-packet marker also resets the pointer and queues the
decoded message. The core accepts beats except during a receiver-flush pulse;
message-queue fullness does not apply backpressure.
| Every configured counter position is decoded, including positions beyond the last packet received. A short message following a longer one can therefore inherit trailing values and validity bits. Producers must overwrite the complete configured message footprint and mark unused counter blocks invalid. Receiver flush resets the pointer but leaves assembly bytes intact; only reset clears that storage. |
2.2. Message Queue and Readout
The queue exposes its oldest message in TELEMETRY_PROBE_ID,
TELEMETRY_COUNTER_VLDS and TELEMETRY_COUNTER[0..31]. Reads do not consume data;
CTRL.BUFFER_POP advances the queue only when it is nonempty. Empty-queue reads
return zero. Counter registers beyond the configured counter count also return
zero and have cleared validity bits.
On arrival while full, hardware drops the oldest message and advances the read
pointer. There is no snapshot across the separate software reads: overflow can
change the visible message mid-read. Arrange sufficient buffering/service rate,
or quiesce the producer, when a coherent software snapshot is required. STATUS
reports empty/full, not a numeric occupancy count or an overflow interrupt.
2.3. Interrupts
irq_o is the OR of the two status sources masked by their corresponding
INTR_ENABLE bits. Masking an interrupt does not acknowledge its source.
| Source | Condition and clearing |
|---|---|
|
Sticky status when assembly capacity is reached without the
last-packet marker. It latches even while disabled. Write one to the status bit
to clear it; |
|
Read-only live status while occupancy is strictly greater
than the effective threshold, or |
2.4. Reset and Flush
Reset clears assembly bytes, queue pointers and control/interrupt registers.
Queue payload storage is not reset, but empty-queue reads return zero. Supply
rst_ni with asynchronous assertion and deassertion synchronized to clk_i.
CTRL.TELEMETRY_RX_FLUSH is a pulse that discards queued messages and resets
the assembly pointer. It does not erase either payload store or purge the
wrapper’s upstream ATB crossing FIFO. Quiesce traffic when an empty receiver
must remain empty after the pulse.
CTRL.TELEMETRY_TX_FLUSH requests a flush from the upstream transmitter through
afvalid_o. Hardware clears the request after afvalid_o && afready_i.
Completion depends on the producer’s acknowledgement; this is separate from a
local receiver flush.
3. Interface
The Telemetry Receiver component provides AXI4-Lite register access and Advanced Trace Bus (ATB) telemetry data reception interfaces.
3.1. Configuration Parameters
The parameters and ports of telemetry_receiver are listed in telemetry_receiver.
The core has two elaboration parameters. BUFFER_DEPTH (default 8) sets the
number of decoded messages the queue holds; it must be a power of two and at
least 2. MAX_NUM_COUNTERS_PER_MESSAGE (default 4) sets the number of counters
decoded from each message.
The ATB beat width (8 bits), packet width (64 bits), counter width (32 bits) and ATB ID width (7 bits) are package constants. The core register port has an 8-bit address and 32-bit data path.
3.3. Global Interface
The global interface provides fundamental clock and reset signals required for basic operation.
3.4. Clock and Reset
clk_i is the core clock and rst_ni its asynchronous, active-low reset;
telemetry_receiver_wrap adds clk_telemetry_i / rst_telemetry_ni for
the ATB side. Clock frequency, jitter, reset duration and physical timing
constraints must come from the integration timing specification.
3.5. ATB Telemetry Interface
The ATB (Advanced Trace Bus) interface receives telemetry data using standard ATB protocol.
3.6. ATB Protocol Specifications
-
Data Width: 8 bits per beat
-
ID Width: 7 bits; the receiver ignores
atid_i -
Flow Control: Valid/ready handshaking for reliable data transfer
-
Flush Support: Bidirectional flush signaling for stream management
-
Back-pressure: Component can assert
atready_olow to apply back-pressure -
Latency: Zero-cycle latency when ready, immediate acceptance when
atready_ois high
3.7. Interrupt Interface
The interrupt interface provides a single interrupt output for event notification.
3.8. Interrupt Specifications
-
Polarity: Active high (asserted when high)
-
Duration: Level-sensitive, remains asserted until cleared
-
Sources: Buffer threshold and error condition interrupts
-
Clearing:
MISSING_LASTis write-one-to-clear. The read-onlyBUFFER_THRESHOLDsource remains asserted while occupancy exceeds the configured threshold or its test bit is set; it cannot be cleared by writing status. -
Latency: Interrupt assertion within 2 clock cycles of triggering condition
3.9. Subsystem Wrapper
telemetry_receiver_wrap defaults to three receivers. It configures their queue
depth with TELEMETRY_RECEIVER_BUFFER_DEPTH (default 8) and counter counts with
TELEMETRY_RECEIVER_MAX_NUM_COUNTERS_PER_MESSAGE (default 4 per receiver).
Actual subsystem values and aperture assignments come from the integration.
The wrapper receives ATB traffic on clk_telemetry_i / rst_telemetry_ni and
crosses it into clk_i / rst_ni through an eight-entry asynchronous FIFO per
receiver. Its external ready signal reflects crossing-FIFO capacity. This does
not turn the core’s decoded-message queue into a lossless backpressured queue.
The wrapper also contains flush-handshake synchronizers and returns a decode
error for register addresses outside its configured receiver apertures.
4. Memory Map and Register Reference
4.1. Memory Map
Each core occupies 256 bytes with 32-bit registers at four-byte offsets.
Control, status, interrupt and message-header registers occupy 0x00–0x18;
32 counter registers occupy 0x80–0xFC. The wrapper map places each receiver
in its integration-defined aperture. Reset values and field access types are
specified below; reset and flush storage behavior is described in Architecture.
4.2. Detailed Register Map
Telemetry Receiver Address Map
Configuration, status, and data-buffer registers for a single telemetry receiver channel.
Register Arrays:
- TELEMETRY_COUNTER[32]: 32 registers, base 0x80, stride 0x4
Register List:
| Address | Name | Access | Description |
|---|---|---|---|
| 0x0 | CTRL | RW | Control Register |
| 0x4 | STATUS | R | Status Register |
| 0x8 | INTR_STATUS | RW | Interrupt Status Register |
| 0xC | INTR_ENABLE | RW | Interrupt Enable Register |
| 0x10 | INTR_TEST | RW | Interrupt Test Register |
| 0x14 | TELEMETRY_PROBE_ID | R | Telemetry Probe ID Register |
| 0x18 | TELEMETRY_COUNTER_VLDS | R | Telemetry Counter Valid Bits Register |
| 0x80 - 0xFC | TELEMETRY_COUNTER[32] | R | Telemetry Counter Register |
Register Details:
CTRL
| Bits | Field | Access | Reset | Description |
|---|---|---|---|---|
| 31:24 | Reserved | - | - | Reserved |
| 23:12 | BUFFER_THRESHOLD | RW | 0x0 | Telemetry Message Buffer Threshold. The Telemetry Buffer Threshold Interrupt is asserted when the number of entries in the buffer is greater than this value. Only the low log2(queue depth)+1 bits are compared, so values alias modulo twice the queue depth, and only values below the queue depth can assert the interrupt. |
| 11:9 | Reserved | - | - | Reserved |
| 8 | TELEMETRY_TX_FLUSH | RW | 0x0 | Telemetry Transmitter Flush. Writing `1` flushes all FIFOs in the telemetry transmitter. The flushing is done via the ATB AF interface. This bit clears itself after the flush completes. |
| 7:5 | Reserved | - | - | Reserved |
| 4 | TELEMETRY_RX_FLUSH | W 1P | 0x0 | Telemetry Receiver Flush. Writing `1` discards queued messages and resets the assembly write pointer. Stored payload bytes are not cleared. In particular, a later short message can retain trailing counter values and validity from an earlier message. This operation does not erase storage. |
| 3:1 | Reserved | - | - | Reserved |
| 0 | BUFFER_POP | W 1P | 0x0 | Telemetry Message Buffer Pop. Effective only if `STATUS.BUFFER_EMPTY = 0`. Writing `1` pops the buffer and thus updates the data in the `TELEMETRY_PROBE_ID`, `TELEMETRY_COUNTER_VLDS`, and `TELEMETRY_COUNTER[32]` registers. |
STATUS
| Bits | Field | Access | Reset | Description |
|---|---|---|---|---|
| 31:5 | Reserved | - | - | Reserved |
| 4 | BUFFER_FULL | R | 0x0 | Telemetry Message Buffer Full. |
| 3:1 | Reserved | - | - | Reserved |
| 0 | BUFFER_EMPTY | R | 0x1 | Telemetry Message Buffer Empty. |
INTR_STATUS
| Bits | Field | Access | Reset | Description |
|---|---|---|---|---|
| 31:5 | Reserved | - | - | Reserved |
| 4 | BUFFER_THRESHOLD | R | 0x0 | Telemetry Message Buffer Threshold Interrupt. Asserted when the number of telemetry messages in the Telemetry Message Buffer is greater than `CTRL.BUFFER_THRESHOLD`. |
| 3:1 | Reserved | - | - | Reserved |
| 0 | MISSING_LAST | RW1C | 0x0 | Last Packet Missing Interrupt. Asserted when the Telemetry Receiver has not received a Last Packet flag when the maximum number of packets a message can consist of has been received. |
INTR_ENABLE
| Bits | Field | Access | Reset | Description |
|---|---|---|---|---|
| 31:5 | Reserved | - | - | Reserved |
| 4 | BUFFER_THRESHOLD | RW | 0x0 | Telemetry Message Buffer Threshold Interrupt Enable. |
| 3:1 | Reserved | - | - | Reserved |
| 0 | MISSING_LAST | RW | 0x0 | Last Packet Missing Interrupt Enable. |
INTR_TEST
| Bits | Field | Access | Reset | Description |
|---|---|---|---|---|
| 31:5 | Reserved | - | - | Reserved |
| 4 | BUFFER_THRESHOLD | RW | 0x0 | Telemetry Message Buffer Threshold Interrupt Test. Writing `1` forces the interrupt and writing `0` releases it. |
| 3:1 | Reserved | - | - | Reserved |
| 0 | MISSING_LAST | W 1P | 0x0 | Last Packet Missing Interrupt Test. Writing `1` forces the interrupt. |
TELEMETRY_PROBE_ID
| Bits | Field | Access | Reset | Description |
|---|---|---|---|---|
| 31:5 | Reserved | - | - | Reserved |
| 4:0 | PROBE_ID | R | 0x0 | Probe ID. Contains the Probe ID field of the telemetry message at the bottom of the Telemetry Message Buffer. |
TELEMETRY_COUNTER_VLDS
| Bits | Field | Access | Reset | Description |
|---|---|---|---|---|
| 31:0 | COUNTER_VLDS | R | 0x0 | Counter Valid Bits. Indicates which of the counter values in the telemetry message at the bottom of the Telemetry Message Buffer are valid. Bit `i` is for the `i`-th counter. |
TELEMETRY_COUNTER[32]
| Bits | Field | Access | Reset | Description |
|---|---|---|---|---|
| 31:0 | COUNTER | R | 0x0 | Counter Value. Contains one of the 32 counter values in the telemetry message at the bottom of the Telemetry Message Buffer. |
Telemetry Receiver Wrapper Address Map
Wrapper address map instantiating the telemetry receiver channels.
Register Arrays:
- telemetry_receiver[3].CTRL: 3 registers, base 0x0, stride 0x100
- telemetry_receiver[3].STATUS: 3 registers, base 0x4, stride 0x100
- telemetry_receiver[3].INTR_STATUS: 3 registers, base 0x8, stride 0x100
- telemetry_receiver[3].INTR_ENABLE: 3 registers, base 0xC, stride 0x100
- telemetry_receiver[3].INTR_TEST: 3 registers, base 0x10, stride 0x100
- telemetry_receiver[3].TELEMETRY_PROBE_ID: 3 registers, base 0x14, stride 0x100
- telemetry_receiver[3].TELEMETRY_COUNTER_VLDS: 3 registers, base 0x18, stride 0x100
- telemetry_receiver[3].TELEMETRY_COUNTER[32]: 96 registers, base 0x80 (telemetry_receiver x3 stride 0x100, TELEMETRY_COUNTER x32 stride 0x4)
Register List:
| Address | Name | Access | Description |
|---|---|---|---|
| 0x0 - 0x200 | telemetry_receiver[3].CTRL | RW | Control Register |
| 0x4 - 0x204 | telemetry_receiver[3].STATUS | R | Status Register |
| 0x8 - 0x208 | telemetry_receiver[3].INTR_STATUS | RW | Interrupt Status Register |
| 0xC - 0x20C | telemetry_receiver[3].INTR_ENABLE | RW | Interrupt Enable Register |
| 0x10 - 0x210 | telemetry_receiver[3].INTR_TEST | RW | Interrupt Test Register |
| 0x14 - 0x214 | telemetry_receiver[3].TELEMETRY_PROBE_ID | R | Telemetry Probe ID Register |
| 0x18 - 0x218 | telemetry_receiver[3].TELEMETRY_COUNTER_VLDS | R | Telemetry Counter Valid Bits Register |
| 0x80 - 0x2FC | telemetry_receiver[3].TELEMETRY_COUNTER[32] | R | Telemetry Counter Register |
Register Details:
telemetry_receiver[3].CTRL
| Bits | Field | Access | Reset | Description |
|---|---|---|---|---|
| 31:24 | Reserved | - | - | Reserved |
| 23:12 | BUFFER_THRESHOLD | RW | 0x0 | Telemetry Message Buffer Threshold. The Telemetry Buffer Threshold Interrupt is asserted when the number of entries in the buffer is greater than this value. Only the low log2(queue depth)+1 bits are compared, so values alias modulo twice the queue depth, and only values below the queue depth can assert the interrupt. |
| 11:9 | Reserved | - | - | Reserved |
| 8 | TELEMETRY_TX_FLUSH | RW | 0x0 | Telemetry Transmitter Flush. Writing `1` flushes all FIFOs in the telemetry transmitter. The flushing is done via the ATB AF interface. This bit clears itself after the flush completes. |
| 7:5 | Reserved | - | - | Reserved |
| 4 | TELEMETRY_RX_FLUSH | W 1P | 0x0 | Telemetry Receiver Flush. Writing `1` discards queued messages and resets the assembly write pointer. Stored payload bytes are not cleared. In particular, a later short message can retain trailing counter values and validity from an earlier message. This operation does not erase storage. |
| 3:1 | Reserved | - | - | Reserved |
| 0 | BUFFER_POP | W 1P | 0x0 | Telemetry Message Buffer Pop. Effective only if `STATUS.BUFFER_EMPTY = 0`. Writing `1` pops the buffer and thus updates the data in the `TELEMETRY_PROBE_ID`, `TELEMETRY_COUNTER_VLDS`, and `TELEMETRY_COUNTER[32]` registers. |
telemetry_receiver[3].STATUS
| Bits | Field | Access | Reset | Description |
|---|---|---|---|---|
| 31:5 | Reserved | - | - | Reserved |
| 4 | BUFFER_FULL | R | 0x0 | Telemetry Message Buffer Full. |
| 3:1 | Reserved | - | - | Reserved |
| 0 | BUFFER_EMPTY | R | 0x1 | Telemetry Message Buffer Empty. |
telemetry_receiver[3].INTR_STATUS
| Bits | Field | Access | Reset | Description |
|---|---|---|---|---|
| 31:5 | Reserved | - | - | Reserved |
| 4 | BUFFER_THRESHOLD | R | 0x0 | Telemetry Message Buffer Threshold Interrupt. Asserted when the number of telemetry messages in the Telemetry Message Buffer is greater than `CTRL.BUFFER_THRESHOLD`. |
| 3:1 | Reserved | - | - | Reserved |
| 0 | MISSING_LAST | RW1C | 0x0 | Last Packet Missing Interrupt. Asserted when the Telemetry Receiver has not received a Last Packet flag when the maximum number of packets a message can consist of has been received. |
telemetry_receiver[3].INTR_ENABLE
| Bits | Field | Access | Reset | Description |
|---|---|---|---|---|
| 31:5 | Reserved | - | - | Reserved |
| 4 | BUFFER_THRESHOLD | RW | 0x0 | Telemetry Message Buffer Threshold Interrupt Enable. |
| 3:1 | Reserved | - | - | Reserved |
| 0 | MISSING_LAST | RW | 0x0 | Last Packet Missing Interrupt Enable. |
telemetry_receiver[3].INTR_TEST
| Bits | Field | Access | Reset | Description |
|---|---|---|---|---|
| 31:5 | Reserved | - | - | Reserved |
| 4 | BUFFER_THRESHOLD | RW | 0x0 | Telemetry Message Buffer Threshold Interrupt Test. Writing `1` forces the interrupt and writing `0` releases it. |
| 3:1 | Reserved | - | - | Reserved |
| 0 | MISSING_LAST | W 1P | 0x0 | Last Packet Missing Interrupt Test. Writing `1` forces the interrupt. |
telemetry_receiver[3].TELEMETRY_PROBE_ID
| Bits | Field | Access | Reset | Description |
|---|---|---|---|---|
| 31:5 | Reserved | - | - | Reserved |
| 4:0 | PROBE_ID | R | 0x0 | Probe ID. Contains the Probe ID field of the telemetry message at the bottom of the Telemetry Message Buffer. |
telemetry_receiver[3].TELEMETRY_COUNTER_VLDS
| Bits | Field | Access | Reset | Description |
|---|---|---|---|---|
| 31:0 | COUNTER_VLDS | R | 0x0 | Counter Valid Bits. Indicates which of the counter values in the telemetry message at the bottom of the Telemetry Message Buffer are valid. Bit `i` is for the `i`-th counter. |
telemetry_receiver[3].TELEMETRY_COUNTER[32]
| Bits | Field | Access | Reset | Description |
|---|---|---|---|---|
| 31:0 | COUNTER | R | 0x0 | Counter Value. Contains one of the 32 counter values in the telemetry message at the bottom of the Telemetry Message Buffer. |