ATB协议

介绍

ATB 协议属于 AMBA 协议的一部分

  • ATB v1.0 是 AMBA 3 的一部分
  • ATB v2.0 是 AMBA 4 的一部分
  • ATB-C 是 AMBA 5 的一部分

ATB 协议定义了 Trace 信息如何在跟踪系统中的组件之间传输。ATB 是跟踪组件用来通过 CoreSight 系统传递格式独立的跟踪数据的通用总线。
具有跟踪功能的跟踪组件或平台需要 ATB 接口。ATB 接口由以下任一方式指定:

  • 发送器 在 ATB 总线上生成跟踪数据的接口。
  • 接收器 从 ATB 总线接收跟踪数据的接口。

ATB 接口支持各种功能,包括:

  • 使用 valid 和 ready 响应来停止数据。
  • 控制信号,指示一个周期内有效的字节数。
  • 通过发送与每个数据包相关的 ID 来识别原始组件。
  • 支持任何跟踪协议信息、数据信息或数据格式要求。
  • Flushing。

接口

ATB 是跟踪组件使用的通用总线,用于以数据不可知的格式在系统中传递跟踪数据。ATB 协议定义了总线行为,接口信号根据其功能命名。
ATB 与关联组件的一般关系如图所示:
图片

简称 全称 描述
HTM Advanced High-performance bus Trace Macrocell 这将输出描述其正在监控的 AHB 互连相关的跟踪信息。
ETM The Embedded Trace Macrocell ETM 可以生成指令跟踪,也可以生成数据跟踪。
PTM The Program-flow Trace Macrocell PTM生成指令跟踪。
ETB Embedded Trace Buffer 这是片上跟踪数据存储设备。
TPIU Trace Port Interface Unit 这是一个将 ATB 连接到跟踪端口以提供跟踪数据的外部存储的设备。
Trace funnel 这将多个跟踪源合并到单个总线上。
Trace replicator 这会将单个 ATB 接收器接口复制到两个独立的 ATB 发射器。

Trace 系统包括:

  • 至少一个跟踪数据源,例如 ETM 或 HTM
  • 至少有一个跟踪数据接收器或接收者,例如 ETB 或 TPIU
    在跟踪源和接收器之间,可以存在 Trace Link 来帮助管理通过 ATB 接口传输数据,例如 Trace Funnel 和 Trace replicator。
    跟踪源生成 ATB 数据流量,这些数据流量可由 ATB 路径上的 Trace Link 管理。Trace Link 可将信息重新传输到 Trace Sinks。Trace Sinks 充当跟踪源生成的跟踪数据的接收器。
    通常,Trace Sink 可以请求刷新跟踪结构,以确保已收到特定时间之前的所有跟踪数据。这些刷新请求会从 Trace Sinks 向跟踪源传播回 ATB 系统。在收到刷新请求后,跟踪源会标记刷新请求之前发生的所有数据,并在输出所有这些数据后指示完成。ATB 系统中的任何 Trace Link 都必须:
  • 将刷新请求传递至其连接的跟踪源。
  • 确保只有在所有连接的跟踪源都确认完成后才确认刷新完成。

信号描述

图片

数据流控制

ATB 数据流控制机制是一种双向流控制,发送器和接收器可以使用它来控制数据和控制信息的移动速率。
Master 生成 ATVALID 信号以指示数据或控制信息何时可用。
Slave 生成 ATREADY 信号以指示它接受数据或控制信息。
仅当 ATVALID 和 ATREADY 信号都为高电平时才会传输数据。

图片

ATVALID 和 ATREADY 在发送器和接收器之间提供握手,以指示跟踪数据项的可用性:

  • 发送器通过断言 ATVALID 来指示它有可用于输出的跟踪。
  • 如果接收器可以接受跟踪数据,它会通过拉高 ATREADY 来响应。如果接收器无法接受跟踪数据,或者没有拉高 ATREADY 信号,则必须在下一个周期再次输出相同的跟踪。

数据流控制波形

图片

  • 仅当 ATRESETn 在 ATCLK 的上升沿变为高电平后,跟踪源才可以开始驱动 ATVALID 为高电平。
  • 尽管 ATRESETn 可以异步置为低电平,但置低必须与 ATCLK 的上升沿同步。
  • 如果在某个周期内 ATREADY 为低电平且 ATVALID 为高电平,则 ATVALID、ATDATA、ATID 和 ATBYTES 必须在下一个周期保持相同的值。
  • 如果 ATVALID 为低电平,则必须忽略 ATREADY。
时钟周期 状态
T1 跟踪停止,ATREADY 未拉高
T2 数据A被采用
T3 数据B被采用
T4 跟踪被忽略,无 valid

如果接收器的实现不能保证在 ATVALID 被拉高的同一周期内用 ATREADY 做出响应,则建议接收器实现足够的内部缓冲。此内部缓冲必须足以存储一个或多个跟踪周期。然后,当缓冲区中有可用空间时,接收器可以拉高 ATREADY,即使未拉高 ATVALID。

ATDATA 和 ATBYTES 之间的关系

以下公式定义了 ATBYTES 和 ATDATA 的宽度之间的关系,由 ATBYTES[m: 0] 和 ATDATA[n: 0] 中的 m 和 n 的值定义:
$$m = log_2(n+1) - 4$$
使用此公式,下表显示了 ATBYTES[m: 0] 和 ATDATA[n: 0] 之间的关系。

ATDATA[n: 0] ATBYTES[m: 0]
n = 7 不需要 ATBYTES
n = 15 m = 0
n = 31 m = 1
n = 63 m = 2
n = 127 m = 3
例如,如果 ATDATA 为 32 位宽(n=31),则 ATBYTES 为 2 位宽(m=1)。如果 ATREADY 和 ATVALID 均为高电平,则必须捕获 ATDATA 的底部字节,并且数据必须与最低有效位对齐。

📢 注意:

  • 无法捕获零字节。
  • ATDATA 的宽度必须是 2 的幂,且等于或大于 8 位。

接收方无法响应

如果接收器接口无法响应,它必须将 ATREADY 驱动为高电平并将 AFVALID 驱动为低电平。

📢 注意:

  • 这确保了复制器不会因为其两个输出之一被禁用而阻塞。

接收器无法响应的示例包括:

  • 接收器断电。
  • 接收器不存在。
  • 系统编程错误。

发射方无法响应

如果发送器接口无法响应,则必须将 AFREADY 驱动为高电平并将 ATVALID 驱动为低电平。
发送器无法响应的示例包括:

  • 发送器断电。
  • 发送器不存在。
  • 系统编程错误。

其他 ATB 功能

ATIDs

跟踪数据项使用单独的 ID 生成。
这些单独的 ID 可以提供:

  • 区分来自不同来源的跟踪。
  • 识别跟踪的高带宽和低带宽组件,以便跟踪源下游的组件可以执行选择性过滤。
  • 通过在对齐同步点(例如跟踪数据包的开头)更改 ID 来对齐同步信息。
    大多数源使用单个静态 ID。

ATB 跟踪数据项可以使用

  • 0x01-0x6F 范围内的任何 ATID 值
  • 从 ATB-B (v 1.1) 及更高版本,ATID 值 0x7D,但只能生成跟踪触发器。

📢 注意:

  • ATID 值 0x00、0x70-0x7C、0x7E 和 0x7F 保留供 CoreSight 架构使用,不得用作 ATB IDs。

有两个选项可以确保不同的跟踪流使用唯一的 ID 值:

  • 固定IDs: 所有 ATB 接口源的 ID 都是在设计系统时选择的,并且不会从系统中导出任何 ATB 接口。
  • 程序IDs: 每个 ATB 接口源的 ID 均可由调试器进行编程,从而允许在更大的系统中重复使用组件。可重复使用的 CoreSight 组件必须实现已编程的 ID。
    实现必须确保在捕获 ATID 上的字节的同时捕获 ATDATA 值。
Trace 字节顺序

ATB 实现必须保留跟踪字节的顺序,即使在具有不同 ATID 的跟踪之间也是如此。尽管 CoreSight Trace Funnel 可以按任意顺序对来自不同源的跟踪进行排序,但当漏斗到单个总线上时,顺序不能更改。

📢 注意:

  • 这与 AXI 接口中按 ID 信号要求的排序不同,AXI 接口中仅在具有相同 ID 的事务之间保留排序。

Buffer Flushing

跟踪数据项缓冲的特性意味着,随着周期的进展,通常需要从缓冲区中删除剩余数据以准备新数据。从缓冲区中删除数据的过程称为刷新。
在典型的跟踪源中,在要跟踪的事件发生和该事件的跟踪生成之间存在固定的时间量和流水线阶段数。处理器执行的指令就是一个例子。

图片

生成跟踪数据项时,会将其写入 FIFO。数据从 FIFO 输出,每次输出一个完整的数据字。ATDATA 总线的宽度定义了数据字的大小。
理论上,跟踪生成和输出之间的时间间隔是无限的,因为 FIFO 可能永远不会收到足够的跟踪数据来填充整个输出数据字。生成和输出之间可能延长延迟的一个例子是,跟踪源会保留输出,直到它有整个跟踪数据字可供输出。
在仅当整个数据字可用时才输出数据的系统中,有多种情况可能需要刷新缓冲区。例如:

  • 系统或系统的一部分即将断电或时钟即将停止。在断电或停止时钟之前,必须输出跟踪源中缓冲区或 FIFO 内剩余的任何跟踪。因此,AFVALID 信号发出刷新信号。通常,在发出刷新信号后,不会再生成跟踪,因为处理器和内存活动已停止。如果在刷新后生成跟踪,则可以忽略它。刷新后生成的跟踪数据的一个例子是来自处理器空闲循环的数据。

  • 跟踪捕获设备即将停止捕获,通常是由于触发点。跟踪捕获设备可能是片外跟踪端口分析器 (TPA) 或片上嵌入式跟踪缓冲器 (ETB)。在这种情况下,可能包括:

    • 向片上逻辑发出信号,表示捕获即将停止。此时会发出刷新指令。
    • 片上逻辑会收到有关触发器的信号,但不会收到有关要捕获多少额外跟踪的任何信息。可以在触发点发出刷新。这可确保捕获触发器之前生成的所有跟踪,但对触发器之后生成的跟踪没有影响。
    • 刷新是定期发出的。必须选择为刷新定义的周期,以便刷新始终发生在触发发生和跟踪捕获停止之间。当刷新发生时(由 AFVALID HIGH 指示),协议期望 trace funnel 为尚未拉高 AFREADY 的跟踪源提供最高优先级。

📢 注意:

  • 刷新序列启动后,接收器接口无法取消该序列。这意味着,跟踪接收器无法取消该序列。
  • 实现时必须确保在 ATCLK 的上升沿对 ATB 信号进行采样。AFVALID 信号保持有效,直到 AFREADY 被取消有效。

图片

当 AFVALID 置位时生成的所有跟踪都已输出时,AFREADY 置位。AFREADY 置位并不表示 FIFO 为空。
在 AFVALID 置位后生成的跟踪存储在 FIFO 中。然后在 AFREADY 置位后输出此跟踪。
当 AFVALID 置位时,发送器必须立即开始输出缓冲跟踪。当发送器置位 AFREADY 时,如果不需要额外刷新,接收器必须在下一个周期取消置位 AFVALID。
当 AFVALID 置位时,发送器必须在输出在 AFVALID 首次置位的周期中缓冲的数据后一个周期置位 AFREADY。也就是说,它必须在输出 AFVALID 置位要求其刷新的最后一个数据后一个周期置位 AFREADY。

时钟周期 状态
T1-T2 已请求刷新。值 A、B 和 C 保存在 FIFO 中。
T2 开始 Flushing
T3-T5 仍有可能出现 Stalls
T6 Flush 完成。输出继续。
T6 AFVALID 拉低
不在本地存储跟踪的跟踪源的行为

如果发射器接口是一个不存储任何本地跟踪的跟踪源,下表显示了它如何控制 AFREADY。

ATVALID ATREADY AFREADY next cycle
0 - 1
1 0 0
1 1 1

下图显示了没有在本地存储任何跟踪的发送器的AFREADY控制:

图片

时钟周期 状态
T1 发送端生成数值A
T2 Flush请求,值 A 现在是旧数据
T3 Flush 未完成,因为旧值 A 仍存在于发送端中
T4 值 A 被接收端接收
T5-T6 发送端中生成新值 B,Flush 请求被确认

Trace Trigger

Trace Trigger 信号是从跟踪源到跟踪接收器的实现定义消息。通常,它可能用于指示已发生重大情况并且跟踪捕获应准备停止。在 ATB Issue B 中,发送器可以按如下方式发出 Trace Trigger 信号:

  • ATID 值必须为 0x7D。

  • ATBYTES 表示此周期输出的跟踪触发器数。建议尽可能一次只生成一个 Trace Trigger。在这种情况下:

    • 只有一个字节的数据。
    • ATBYTES 为零。
  • ATDATA 指示每个信号 Trace Trigger 的来源,如下所示:

    • 每个数据字节指示一个单独的 Trace Trigger
    • 为零的数据字节指示来自未知来源的触发器。建议跟踪源不要使用此值。
    • 非零的数据字节指示生成 Trace Trigger 的跟踪源的 ID。
      例如:
  • 使用 ATID 0x10 作为 ATB 信号的跟踪源可以通过生成一个跟踪数据字节来指示其 ATB 接口上的触发器:

    • ATID 信号 0x7D,指示跟踪触发器。
    • ATBYTES 信号 0x0,指示单个数据字节。
    • ATDATA 信号 0x10,指示跟踪源 ID。
  • 使用 ATID 0x10 和 0x12 的跟踪流可以通过生成两个字节的跟踪数据来指示两个跟踪源上的同时跟踪触发:

    • ATID 信号 0x7D,指示跟踪触发。
    • ATBYTES 信号 0x1,指示两个数据字节。
    • ATDATA 信号 0x1210,指示跟踪源 ID 为 0x10 和 0x12。

同步请求

ATB4 实现可以选择性的包括 SYNCREQ 同步请求信号。接收器(Slave)通过将 SYNCREQ 置为高电平持续一个 ATCLK 周期来向发送器发出同步请求信号。或者,发送器(Master)可以实现 SYNCREQ 输入。当此输入置为高电平持续一个 ATCLK 周期时,发送器可以识别来自接收器的同步请求。SYNCREQ 信号与 ATB 接口上的任何其他信号都没有任何关系。但是,从 ATB-B (v 1.1) 开始,规范要求:

  • SYNCREQ 与其他 ATB 信号一起通过系统路由。
  • 任何 Trace Link(例如 Trace Funnel)将输入同步请求从 ATB 发送器接口传递到上游跟踪源。
    启用的跟踪源必须尝试为收到的每个同步请求在跟踪流中提供一次同步信息。跟踪源可以:
  • 延迟输出同步信息以避免溢出任何内部缓冲区。
  • 忽略在跟踪源输出与上一个同步请求相对应的同步信息之前收到的同步请求。
    ATB 发送器必须知道可能随时收到 SYNCREQ 上的脉冲,并且必须确保它在需要时响应 SYNCREQ。

接口信号规则

ATB 协议信号必须符合以下规则:

  • 必须在 ATCLK 的上升沿采样 ATB 信号。
  • 如果在某个周期内 ATREADY 为 低 电平且 ATVALID 为 高 电平,则 ATVALID、ATDATA、ATI D 和 ATBYTES 必须在下一个周期保持相同的值。如果 ATVALID 为 低 电平,则必须 忽略 ATREADY。
  • 如果 ATREADY 和ATVALID 为高电平,则必须捕获 ATDATA 的底部字节。数据必须与最低有效字节对齐。
    📢 注意:
    无法采样零字节。
  • ATDATA 的宽度(以位为单位)必须是 2 的幂,且大于或等于 8。
  • ATBYTES[m: 0] 和 ATDATA[n: 0] 的宽度之间的关系由以下公式定义:$$m = log_2(n+1) - 4$$
  • 必须同时获取 ATID 和 ATDATA 的值。
  • 必须保留跟踪字节的顺序,即使在具有不同 ATID 的跟踪之间也是如此。CoreSight Trace Funnel 可以按任意顺序对来自不同源的跟踪进行排序。当 Funnel 到单个总线上时,顺序不能更改。
    📢 注意:
    这与 AXI 接口所需的顺序不同,其中仅在具有相同 ID 的事务之间保留顺序。
  • 当 AFVALID 被置位时,它必须保持置位状态,直到 AFREADY 被置位。当 AFVALID 被置位时,AFREADY 将被忽略。
  • 当 AFVALID 被置位时,发送器必须立即输出任何缓存的踪迹。
  • 当 AFREADY 被置位时,除非需要额外刷新,否则 AFVALID 必须在下一个周期被置位。
  • 当 AFVALID 被置位时,发送器必须在输出其生成和存储的最后一个踪迹(直到并包括在 AFVALID 被置位的周期中生成的任何踪迹)后一个周期置位 AFREADY。
  • ATRESETn 可以异步置位。但是,ATRESETn 必须在 ATCLK 的上升沿同步释放。
    📢 注意:
    ATRESETn 是低电平有效信号,这意味着它必须被置为低电平。
  • 仅当 ATRESETn 在 ATCLK 的上升沿变为高电平后,跟踪源才可以开始驱动 ATVALID 为高电平。
  • 每当接收器接口无法响应时,必须将 ATREADY 驱动为高电平,并将 AFVALID 驱动为低电平。这种情况必须发生的情况包括断电、接收器不存在以及系统编程不正确。这可确保复制器不会因为其两个输出之一被禁用而阻塞。
  • 每当 发送器 接口无法响应时,AFREADY 必须驱动为高电平,ATVALID 必须驱动为低电平。这种情况必须发生的示例包括断电、发送器不存在以及系统编程不正确的结果。
  • ATID、ATBYTES 和 ATDATA 可以具有任何值。此允许行为可用于绑定未使用的 CoreSight Trace Funnel 输入信号。
  • ATID 值 0x00、0x70-0x7C、0x7E 和 0x7F 保留供 CoreSight 架构使用,不得用作 ATB ID。

Wake-Up 信号

Wake-Up 信号用于指示与 ATB 接口相关的活动。这可用于提供glitch-free信号,该信号可路由到时钟控制器或类似组件,以启用所连接组件的电源和时钟。Wakeup_Signal 属性用于指示组件是否支持唤醒信号:

  • True 唤醒信号存在。
  • False 唤醒信号不存在。
    如果未声明 Wakeup_Signal,则视为 False。唤醒信号只能添加到 ATB5 接口。
信号 位宽 源 描述
ATWAKEUP 1 Master 唤醒信号。表示存在与 ATB 接口相关的活动。

ATWAKEUP 的规则如下:

  • ATWAKEUP 与 ATCLK 同步,但更适合跨时钟域连接到控制器。
  • ATWAKEUP 必须是 glitch-free 并直接从寄存器生成。
  • 允许在 ATVALID 拉高之前或之后的任何时间点拉高 ATWAKEUP。
  • 允许接收器等待 ATWAKEUP 拉高,然后再拉高 ATREADY。这意味着如果 ATWAKEUP 存在但从未拉高,ATB 接口可能会死锁。
  • 如果 ATWAKEUP 和 ATVALID 在同一周期内为高电平,则 ATWAKEUP 必须保持高电平,直到拉高 ATREADY。
    建议:
  • 在 ATVALID 拉高之前至少一个周期拉高 A TWAKEUP,以防止延迟接受新事务。
  • 当不需要进一步传输时,ATWAKEUP 拉低。允许但不建议在未发生事务的情况下拉高 ATWAKEUP 然后拉低。