三、APB,ATB总线
APB和ATB总线,是coresight中常用的2个总线。
对于coresight组件的访问,使用debug APB总线进行访问。而对于trace数据的传输,使用ATB总线进行传输。
1. APB总线
以下是信号列表。
clamp value,是指当一个组件是power down或者是disabled,输出的固定值。
APB访问,数据最多是32bit,也就是coresight组件的寄存器的位宽最多是32bit的。
对于PADDRDBG[31],地址的最高位,表示当前的访问是internal access,还是external access。
◾internal access,是指处理器执行指令的访问,比如load/store去访问,或者是外部debugger通过memory map的访问。
◾external access,是指外部的访问,比如debugger,external access比internal access有更高的权限。
如下图,两个处理器,均有自己的coresight组件。每个组件的地址是不一样的。对于外部的debugger而言,使用地址0x8000_0000和地址0x0000_0000都是访问的同一个coresight组件的寄存器,要不就是处理器A的组件A,要不就是处理器B的组件A。
但是如果debugger使用地址0x0000_0000访问,是internal access,此时受限于software lock的影响。而使用地址0x8000_0000访问,是external access,不受限于software lock。
2. ATB总线
ATB总线用来coresight组件之间传递trace信息用。包括两部分:
◾master: 在ATB总线上产生trace信息的接口。
◾slave: 在ATB总线上接收trace信息的接口。
ATB总线以AT作为信号的前缀。
如以下:HTM和xTM是产生trace信息的master,通过ATB总线,发送给funnel,funnel将收到的两路ATB数据合并成一路ATB数据发送给replicator,replicator再将接收的一路ATB数据,重复以两路ATB数据分别发送给ETB和TPIU,TPIU通过trace port发送到外部。
trace信息,通过ATB总线进行传输。
◾ETB: embedded trace buffer。 片内存储trace数据的大容量设备。
◾xTM:trace macrocells。 从连接的处理器中,追踪数据,产生trace信息输出。
包括两个:
◾ETM: embedded trace macrocell,可以产生指令trace信息,也可以产生数据trace信息
◾PTM:program flow macrocell,产生指令trace信息
◾HTM: advanced high-performance bus trace macrocell。 连接到AHB互联总线上,产生总线的trace信息
◾TPIU: trace port interface unit。接收ATB trace数据,传输到trace port上,将trace信息输出到片外。
◾trace replicator: 将一个ATB数据发送给独立的两个ATB slave。
◾trace funnel: 将多个trace源信息,合并成一个trace数据输出。
2.1 全局信号
时钟和复位信号。复位信号低电平有效。数据在时钟的上升沿采样。
2.2 flow control
数据信号。
master和slave之间的通信,通过ATVALID和ATREADY作为握手信号。
master将ATVALID拉高,表示master传输的数据有效。slave将ATREADY信号拉高,表示slave准备好接收master的数据。如果master发送数据,发现slave的ATREADY没有拉高,那么就要将数据重新发送一遍。
时序图如下:
T1,master发送数据A,ATVALID拉高。但是master检测到ATREADY没有拉高。
T2,master检测到上一次数据传输,ATREADY没有拉高,因此需要将数据A重新发送。此时ATREADY为1,表示此时数据发送成功。因此下一次可以发送新的数据。
T3,master发送数据B,ATREADY为1,表示此时数据发送成功。下一拍可以发送新的数据。
T4,master将ATVALID拉低,表示没有数据发送。
如果slave在master发送数据的时刻,不能及时接收master发送的数据(ATREADY不能在master发送数据时刻拉高),那么在slave端,建议实现internal buffer,接收master发送的数据。然后再处理。这样的话,当buffer没有满的话,ATREADY信号就可以一直为高,master就不用一直重新发数据。
对于ATBYTES[m:0] 和 ATDATA[n:0]。
m = log2(n+1) – 4
对于ATID:
trace的数据要伴随着ATID进行发送的。因为产生trace的组件有很多,因此需要一个ID来识别这些组件,ID就保存在ATID中发送。
ATID是一个7位的值。0x00和0x70-0x7f是coresight中规定的保留值,在soc实现中,coresight trace组件不应该使用这些ID。
在一个soc中,对于每个trace组件,ID必须是唯一的。对于ID,有两种选择:
◾fixed ID:在soc设计的时候,就将ID值给固定了。
◾programmed ID: trace组件的ID可以通过外部的debugger进行更改,但是debugger要保证,组件的ID必须是唯一的。
ATID和ATDATA,在同一时刻被slave所接收。
2.3 flusing
一般,trace数据都是从trace source发送到trace sink。但是在某些情况下,trace sink需要主动要求trace source发送数据,此时就会用到flusing。sink发送flush信号给source,source将内部所有的trace数据全部发送出去,发送完毕后,回应sink flush complete信号。
flush使用以下两个信号来作为握手信号。
如下图:trace source追踪处理器的数据,通过trace generation,发送到下一级的buffer中,然后buffer将数据发送给FIFO中进行暂存。FIFO中一旦有数据,FIFO就负责将数据通过output发送给trace funnel。
因此对于一个trace组件,中间是会存在多级的buffer对数据进行缓存的。
假设此时系统要power down,而source的FIFO中还有trace信息,那这些trace信息,就要在power down之前,发送出去。此时funnel就可以向source发送flush信息,也就是将AFVALID信号拉高,trace source接收到该信号,就将自己FIFO中的所有剩余trace信息,全部发送给funnel,发送完毕后,将AFREADY信号拉高,表示数据发送完毕。此时,就可以将系统给power down。
时序图:
T1时刻,AFVALID为高,表示要求master进行flush操作。
T2开始,就进行master的FIFO的trace数据排空操作。
从T2-T6,master将自己内部的FIFO数据发送出去。在T6时刻,master将AFREADY信号拉高,表示master将数据发送外部,也就是flush完成。
系列其他篇
原文首发于骏的世界博客
作者:卢骏.
更多Arm技术相关的文章请关注Arm技术博客极术专栏,每日更新。