AHB协议(1/2)
以下内容为AMBA5 AHB Protocol Specification协议内容
Charpter 1 Introduction
1.1 关于AHB协议
AMBA AHB是一个支持高性能设计的总线接口。他在组件间,如主端(Master),互联结构(interconnects)和从端(slaves)定义了总线接口。AHB实现了高性能接口的特性,高的时钟频率包括:
- 猝发传输(Burst transfers)
- 单个时钟沿操作
- 非三态实现
- 宽的总线配置,如64,128, 256, 512, 1024比特。
AHB的从端常为内部存储设备,外部存储接口和高位宽的外围备。尽管低带宽的外围设备可以当做AHB的从端,因为系统性能的原因,通常低带宽的外围设备由APB协议实现。高性能的AHB和APB之间可以使用APB桥进行连接,APB桥可以作为AHB的从端。
图1.1为单个主端和3个从端的AHB设计系统。总线逻辑互联了一个地址解码器和一个从-主的多路选择器。 AHB支持一个或多个S互联结构,通过提供仲裁控制信号从M端到不同的S端。解码器监测主端的地址以便于合适的从端被选择,多路选择器将对应的从端输出数据返回给主端。
AHB也支持多个主端的设计,该多主端设计必须使用提供仲裁的互联结构,同时将不同主端的数据发送给对应的从端。
1.1 Master
Master(以下简称M端,也就是主端)提供地址和控制信息用于初始化读写操作。
1.2 Slave
Slave端(以下简称S端,也就是从端)作为传输的从端对传输做出回应。S端使用来自Decoder的HSEL信号控制对bus总线的传输。
S端返回M端如下信号:
- 总线传输完成或者总线传输的拓展。
- 总线传输的成功或者失败。
1.3 Interconnect
互联组件提供了M与S端的连接。单一M端的系统中只需要使用解码器和多路选择器。多个M的系统需要使用互联结构便于提供仲裁和从不同的M端传输信号到达合适S端。此传输需要地址,控制,写数据信号。
Decoder(以下简称解码器):为每次传输的地址编码,为所有的S端提供一个选择信号(SEL),该信号包含在传输数据中。同时为多路选择器提供了一个控制信号。一个中央集中的编码器需要实现至少两个M端。
Multiplexor(以下简称多路选择器):一个S端-M端的多路选择器需要分多路传输S端到M端的读数据和反馈信号。解码器为多路选择器提供了控制信号。Decoder一个中心集中的多路选择器需要实现至少支持两个S端。
1.4 Operation
M端通过驱动地址和控制信号开始一次传输。这些信号提供了地址,方向,传输的位宽,如果传输的类型是猝发那么会指示出传输的类型。传输的类型可以是:
- 单次传输(Single)。
- 递增猝发(Incrementing burst),即在地址边界处不进行包装(地址不进行回绕,后文介绍)。
- 包装猝发(Warpping burst),及到达地址边界处重新包装下一次传输的地址(地址回绕,后文介绍)。
写操作数据由M端到S端,读数据数据由S端到M端。每次传输都包含两个phase:
- 地址阶段(Address phase),地址和控制周期。
- 数据阶段(Data phase),数据周期是一个或多个周期。
S端不能请求Address phase进行延长,所以所有的S端必须具备在Address phase周期采样地址的能力。但是S端可以请求M端延长Data phase,通过控制HREADY。HREADY信号为低时,S端可以在传输中插入等待状态,使得S端具有额外的时间提供和采样数据。
最后S端使用HRESP表明传输的成功/失败。
Charpter 2 Signal Description
2.1 Global signals
- HCLK:系统时钟,上升沿有效
- HRESETn:系统复位,低位有效,复位系统和总线。
2.2 Master signals
- HADDR:目标组件为S端和解码器,位宽ADDR_WIDTH,传输的地址。
- HBURST:目标组件为S端,位宽HBURST_WIDTH,表明一次burst中包含多少次传输以及地址增量方法。
- HMASTLOCK:目标组件为S端,位宽1,表明目前传输是locked sequnece的一部分,与地址和控制信号具有相同的时序。
- HPORT:目标组件为S端,位宽HPORAT_WIDTH,保护控制信号,提供传输类型信息。
- HSIZE:目标组件为S端,位宽3,表明传输的大小。
- HNONSEC:目标组件为S端和解码器,位宽1,表明此传输是否为安全(Secure)传输。
- HEXCL:目标组件为外部可达监测器,位宽1,表明此传输是否是一部分Exclusive Access sequence
- HMASTER:目标组件为外部可达监测器和S端,位宽HMASTER_WIDTH。M端的标识符,由M端产生,如果M端具有多个外部可达的线程。由互联结构修改以保证M端标识符的唯一性。
- HTRANS:目标组件为S端,位宽2,表明传输的类型,包括IDLE,BUSY,NONSEQUENTIAL,SEQUENTIAL。
- HWDATA:目标组件为S端,位宽DATA_WIDTH,在写操作中由M端向S端传输的数据。
- HWSTRB:目标组件为S端,位宽DATA_WIDTH/8,写的strobe信号。当写数据不包含有效数据时解除写数据的active状态。其中1bit指示HWDATA的8bit。HWSTRB[n]对应着HWDATA[ (8n+7) : 8n) ]。HWSTRB是一个data-phase信号,与HWDATA具有相同的时序。
- HWRITE:目标组件为S端,位宽1,表明传输的方向。为高时表明传输是写,为低时传输是读。与address信号具有相同的时序,但是,一次burst传输过程中此信号必须保持不变。
2.3 Slave signals
- HRDATA:目标组件为多路选择器,位宽DATA_WIDTH,当读操作时,读数据总线将选中的S端读数据传输给多路选择器,多路选择器再将读写数据传给M端。
- HREADYOUT: 目标组件为多路选择器,位宽为1,当为高,此信号表明总线上一次传输已经完成。此信号可以被驱动为低来延长传输。
- HRESP:目标组件为多路选择器,位宽为1,传输反馈给M端传输状态额外的信息。此信号为低时,HRESP信号表明传输状态是OKAY,当为高时HRESP信号表明传输状态是ERROR。
- HEXOKAY:目标组件为多路选择器,位宽为1,
2.4 Decoder signals
- HSELx:目标组件为S端,每个S端都具有自己的HSELx信号,此信号表明当前传输的目的端为当前S端。当S端被选中时,S端需要检测HREADY的状态来保证在对当前传输做出回应之前,前一次传输已经完成。当S端被选中进行一次非IDLE传输,HSELx信号在同一周期内必须成立,包括地址和控制信号。
注:x表示对于系统中的从端每一个HSELx必须具备唯一的标识符。如HSEL_S1,HSEL_S2,HSEL_Memory。
2.5 Multiplexor signals
- HRDATA:目标组件为M端,位宽DATA_WIDTH,读数据,由解码器进行选取。
- HREADY:目标组件为M端和S端,位宽1,当为高时,HREADY信号表示M端和所有的S端前一次传输已经完成。
- HRESP:目标组件为M端,位宽1,传输的反馈,有解码器进行选取。
- HEXOKAY:目标组件为M端,位宽1,外部的okay,由解码器进行选取。
Charpter 3 Transfers
3.1 Basic transfers
前文已介绍一个基本的传输包括两个phases:
- 地址:持续一个系统时钟HCLK周期,除非被上一个传输延长
- 数据:可能需要数个系统时钟HCLK周期,使用HREADY信号来控制完成一次传输所需要的时钟周期。
HWRITE:控制数据的方向。
- 当为高时,表明进行一次写传输,数据有M端发送,S端接收。
- 当为低时,表明进行一次读传输,S端产生读数据,M端借号读数据。
上图是没有等待状态的简单传输的时序图,所以此传输包含一个地址周期和一个数据周期。3.1为读传输,3.2为写传输。在这个没有等待状态的传输中:
- M端在时钟HCLK上升沿驱动地址和控制信号到总线。
- S端在接下来的一个时钟周期进行地址和控制信号采样。
- 在S端对地址和控制信号采样结束后,S段可以驱动HEADYOUT信号作为回应。该信号由M端在传输的第三个时钟上升沿进行采样。
这个例子说明了地址和数据阶段在不同的时钟周期是如何传输的。任意一次传输的地址阶段发生在上一次传输的数据阶段(重合,即当前传输的地址阶段和前一次传输的数据阶段重合)。address与data的重合是进行总线流水线处理的基础,此特性允许总线高性能操作,同时也为S端发送反馈信息提供了充足的时间。
S端可以插入等待阶段到任意一个传输中从而延长完成传输的时间。每个S端具有一个HREADYOUT信号,该信号为S端在data phase阶段驱动。互联结构需要将每个S端的HREADYOUT信号联合起来产生一个HREADY信号,HREADY信号用来控制上述延长传输完成时间的过程。
如上图是具有等待阶段的时序图。3.3是带有两个等待周期的读传输,3.4是带有一个等待周期的写传输。
注:对于写操作,在HREADY为低的等待阶段内,M端需要将写数据DATA保持不变,直到写操作完成。对于读操作,S端只需要在HREADY为高的周期内提供有效数据即可。
当传输由具有等待阶段通过延长address阶段进行延长时,那么对接下来的传输具有副作用。
3.5是包含地址不相关的3此传输,A,B和带有一个等待周期的C传输。
在上述时序图中:
- 传输A和传输C是0等待传输。
- 传输B具有一个等待周期的address phase。
- 延长传输B的数据phase对下一次传输C的address phase会相应的拉长。
3.2 Transfer types
可以把传输分为4类,由HTRANS[1:0]控制:
- 0b00:IDLE类型,表明没有数据传输要求。M端当不需要传输数据时使用IDLE传输。推荐M端在进行一次locked传输时结尾时进行一次IDLE传输。
- 0b11:BUSY类型,BUSY传输允许M端插入空的周期在一次burst传输过程中。此类型的传输表明M端可以持续进行burst传输,但是下一次传输不会立马发生传输。当M端使用BUSY类型传输时,burst传输过程中地址和控制信号必须映射为下一次传输。仅未定义长度的burst能够具有一次BUSY传输作为burst的最后一个周期。S端必须一致提供一个0等待周期的OKAY反馈信号给BUSY传输,传输必须被S端忽略。
- 0b10:NONSEQ类型,表明一次单个的传输或者burst的第一个传输。地址和控制信号与前一次传输不相关。单个传输在总线上被当做长度为1的猝发传输所以传输的类型为非序列性的(NONSEQUENTIAL)。
- 0b11:SEQ类型,剩余的burst传输为序列性的或连续性的(SEQUENTIAL),地址与前一次传输相关。控制信息与前一次传输完全相同,地址等于前一次传输的地址+传输的大小(单位为Byte)。 传输的大小由HSIZE[2:0]信号指示。
3.6表示了NONSEQ,BUSY和SEQ传输类型的时序图。
- T0~T1:由非连续/序列性的传输启动的4拍读。
- T1~T2:M端不能进行传输在第二个周期,所以插入了一个BUSY传输来延时第二次传输。此周期S端返回第一个周期M端发送读地址的读数据。
- T2~T3:M端准备好进行第二次传输,发送一个SEQ传输,。M端此周期将会忽略读数据总线上由任何S端返回的读数据(因前一个周期为BUSY传输)。
- T3~T4:M端进行了第三次传输。发送了一个SEQ传输,此时读数据返回M端发起的第二次SEQ读读数据。
- T4~T5:M端进行最后一次传输。此时在第一个周期内HREADY信号为低,S不能将前一次SEQ读的数据返回,所以将延迟上一次SEQ传输的DATA Phase,也就是当前传输的ADDRESS phase。
- T5~T6:S端返回第T3T4周期发送的SEQ读数据。
- T6~T7:无传输命令,返回T4T6发送的读数据。
3.3 Locked transfers
如果M端需要lock功能,那么M端同样需要HMASTLOCK信号。此信号表明任意一个S端的目前传输序列都是不可分割的,必须被完成在做其他传输之前。通常Locked传输被用来保证传输对象的完整性,S端在SWP指令读和写期间不会进行其他的操作来保证Locked传输的完整性。
在一个Locked序列中:
当HMASTLOCK成立,HSEL成立(如果存在),HREADY为高时,总线被锁定。
当HMASTLOCK被释放,HREADY为高时,总线被解锁。
注:在一次Lock传输结束后,推荐M端插入一个IDLE传输。
大部分S端不需要实现HMASTLOCK,因为他们只具备依次执行他们接收到的传输。S端可以被多个M端可达。例如,一个多端口内存控制器(Multi-Port Memory Controller, MPMC)必须实现HMASTERLOCK信号。
在M端断言HMASTERLOCK成立在一次IDLE传输的开始,中间位置,或者一次Locked传输的结尾是允许的。在一次Locked传输的开始或者结尾处使用Locked IDLE传输是允许的,但是不推荐这么使用,因为这种行为可能会对仲裁系统有不利的影响。
要求Locked传输具备相同的S端地址。
3.4 Transfer size
HSIZE[2:0]表明传输数据的大小。
注:由HSIZE确定的传输的大小必须等于或者小于数据总线的位宽。
HSIZE信号与地址总线具有相同的时序。在猝发传输过程中,HSIZE必须保持不变。
HSIZE与HBURST共同决定猝发传输的地址边界。
3.5 Write strobes
写数据的strobes是一个可选的特性。该特性允许M端指示有效的写数据字节流部分写入(即指示写入数据字节流的哪些字节写入,哪些字节不写入)。Write_Strobes特性指示一个接口是否支持写的strobe特性。
- 真:支持写Strobes,接口中包含HWSTRB信号。
- 假:不支持写Strobes,接口中不包含HWSTRB信号。
AHB协议中写strobes规则如下:
- 对于传输数据比总线数据位宽窄的传输,HSIZE和HADDR决定了哪些字节位数据有效。
- 对于有效的字节数据,对应的写strobe信号可以为高或者为低。当写strobe信号为低时,对应的字节数据不进行写。当写strobe信号为高时,对应的字节数据进行写入。此操作称之为稀疏写入(sparse write)。
- 对于无效的字节数据,对应的写strobe信号可以为高或者为低。接口利用HSIZE和HADDR来决定哪些字节数据是无效的。无效的字节数据不论写strobe信号为高还是低都不写入。
- 一次传输的写strobe都不成立(为低)是允许的,此次传输过程中任意字节数据都不进行写入。
- 写strobe和写数据的映射关系不依赖其他,也不是按字典顺序。(写strobe和写数据确定后,对应关系就确定了,不受外界干扰)
- 对于读操作,建议写strobe无效。(strobe只针对写,读strobe无效)
- 猝发写传输过程中写strobe可以改变。
写strobe的互操作性(Interoperability)
即:M端和S端同时支持,同不支持Write_Strobes特性。当M端不支持,S端支持时,将S端HWSTRB都拉高(全部写都有效)。当M端支持,S端不支持时,此时M端不应该产生稀疏写操作(不支持稀疏写)。
3.6 Burst operation
AHB协议支持猝发-4,猝发-8,猝发-16,猝发-自定义长度,单个传输。AHB支持递增猝发和包装猝发:
- 递增猝发具有序列排列的地址,每次猝发传输的地址是在前一次猝发传输的地址基础上递增(即cur_addr=pre_addr+data_length)。
- 包装猝发当穿过地址边界时进行包装。地址边界是由猝发的拍数与一次传输的大小的乘积决定的。猝发传输的数目由HBURST控制,传输的大小由HSIZE控制。
HBURST[2:0]控制猝发的类型,编码如下:
M端禁止启动一个超过1KB地址边界的递增猝发传输。
M端可以进行单个传输用以下任意一种方式:
- SINGLE模式
- 猝发长度为1的自定义猝发。
注:猝发的大小表明一次猝发的节拍数,而不是传输的字节数。计算一次猝发传输数据的总大小由节拍数乘以每一拍传输数据的大小(由HSIZE指定)。
猝发的所有传输必须地址对其到与传输大小相等的地址边界。例如,字传输必须对齐到字地址边界(HADDR[1:0]=0b00),半字传输对其到半字的地址边界(HADDR[0]=0)。推荐IDLE传输地址也进行对齐,以免在仿真的过程中出现很多的warning。在该说明书中,这点更像是规则而不是推荐的。
3.6.1 在一次BUSY传输后终止猝发传输
在一个burst开始后,如果在下一次传输还没有准备好,M端可以使用一次BUSY传输来获取更多的准备时间。
在一个未定义长度的burst传输中,如INCR,M端可能插入BUSY传输,然后决定不需要更多的传输。在这种情况下,M端可以发送NONSEQ或者IDLE传输来结束为定义长度的猝发传输。
该协议不允许M端通过发送BUSY传输来结束一次固定长度的猝发传输,猝发类型如下:
- 递增猝发类型,如INCR-4,INCR-8,INCR-16
- 包装猝发类型,如WARP-4,WARP-8,WARP-16
这些固定长度猝发类型必须由SEQ传输来结束。
M端在一次SINGLE猝发之后不允许立即发送一个BUSY传输,SINGLE猝发必须紧跟着一个IDLE或者NONSEQ传输。
3.6.2 提前终止猝发
猝发传输可以被以下场景终止:
- S端反馈错误
- 多层互联结构终止
S端反馈错误
如果S端反馈一个ERROR,那么M端将终止猝发传输的剩余传输。但是,这并不是一个严格的要求,M端继续剩余的传输在一次猝发中也是可以接受的。
如果M端取消了一次猝发中剩余的传输,那么他必须在ERROR反馈回来的两个周期内改变HTRANS来表明IDLE状态。
如果M端没有完成猝发传输,那么在下一次向S端通信过程中,M端不要求重新建立未完成的猝发传输。比如,如果M端值完成了一个8拍猝发的3拍,那么M端在下次与S端通信过程中,不要求完成剩余的5拍猝发传输。
多层互联结构终止
尽管M端不允许提前终止一个猝发传输,S端必须被设计工作正常如果猝发没有完成。
当一个多层互联组件被用在一个多M端系统中,那么它(M端)可以终止猝发以便于其他M端可以与S端通信。如果这种情形发生,那么S端必须与原始的M端终止这个burst传输,然后与新的Mdaunt反馈恰当的信息。
3.6.3 猝发的例子
4拍包装猝发,WARP4
图为该4拍猝发传输,地址在16-字节边界被重新包装,如地址0x3C的下一次传输数据地址是0x30。
注:其中第一拍为NONSEQ传输,data phase包含一个周期的wait阶段,接下来为3拍的SEQ传输。数据的地址在0x3c进行了包装(卷绕)。
4拍递增猝发,INCR4
上图为4拍的递增猝发传输,第一个周期为NONSEQ传输,其data phase具有一个周期的wait状态。接下来3拍为SEQ传输。因为其为递增猝发,其地址为递增的,在0x3C下一次传输为0x40(对比包装猝发,并没有在16字节边界对地址进行重新打包)。
8拍包装传输,WARP8
因为此猝发是一个8拍的猝发传输,地址包装边界为32字节边界,所以传输地址为0x3C的下一次传输地址为0x20。
8拍递增猝发,INCR8
该猝发使用半字传输,所以地址增长为2。因为猝发类型是递增的,所以地址在增长到16字节地址边界时继续递增。
未定义长度的猝发,INCR
第一个猝发为猝发写有两个把半字传输组成,起始地址为0x20。地址增量为2(单位为Byte)。
第二个猝发为猝发读,由3个字传输,起始地址为0x5C。这些传输地址的增量为4。
3.7 Waited transfers
如果需要更多的时间提供数据或者采样数据,S端使用HREADYOUT来插入等待状态。在一个等待状态的传输过程中,M端对改变传输状态和地址是严格的。
3.7.1 在等待状态下改变传输类型
在S端请求等待状态时,Mdaunt只有在如下描述情况下可以改变传输类型:
- IDLE传输
- 固定长度的BUSY类型传输
- 未指定固定长度的BUSY类型传输
IDLE传输
在等待传输中,M端允许将传输类型由IDLE改变为NONSEQ类型。在将HTRANS类型改变为NONSEQ类型过程中,M端必须保持HREANS为常数直到HREADY拉高。
在图3.13中:
T0~T1:M端初始化起始地址为A的单个猝发。
T1~T2:M端插入一个起始地址为Y的IDLE传输,此时S端HREADYOUT为低,插入一个等待阶段。
T2~T3:M端插入一个其实地址为Z的IDLE传输。
T3~T4:M端改变传输类型为NONSEQ传输,初始化一个其实地址为B的INCR4传输。
T4~T6:当HREADY为低时,M端必须保持HTRANS为不变。
T5T6:HREADY拉高,完成T0T1阶段发送的单个猝发传输,同时M端为INCR4传输的address phase。
T6~T7:INCR4的第一拍data phase传输完毕,同时M端开始下一拍的SEQ类型的INCR4传输的address phase。
固定长度的BUSY传输类型
在固定长度猝发传输的等待阶段,M端允许将传输的类型由BUSY类型调整为SEQ类型。由HREANS编码的传输类型改变到SEQ类型的过程中,M端必须保持HTRANS不变,直到HREADY拉高。
注:因为BUSY类型传输只能插入到一次猝发连续拍数之间,所以此情形并不适用于单次猝发。所以这种情况应用于以下的猝发类型:
- INCR4,INCR8,INCR16.
- WRAP4,WRAP8,WRAP16
图3.14是具有等待阶段的定长猝发传输,齐总传输类型由BUSY改变为SEQ。
T0~T1:M端初始化下一拍传输为起始地址为0x24的INCR4猝发传输。
T1~T3:M端插入一个起始地址为0x28的BUSY传输,此时S端HREADYOUT为低,插入一个等待状态
T3~T4:M端改变传输类型为SEQ并初始化下一拍为其实地址为0x28的INCR4传输
T4~T6:HREADY为低,此时M端必须保持HTRANS不变
T5T6:HREADY拉高,T0T1传输的data phase完成,数据读回。
T6T7:INCR4传输的第3拍(T3T4的data phase)数据读取完毕(0x28数据读回)同时M端开始最后一拍,起始地址为0x2C。
未定义长度的BUSY类型猝发传输
在未定义长度递增的猝发传输的等待阶段,M端允许将传输类型由BUSY改变为任意一种传输类型,此时HREADY为低。如果改变后的传输类型为SEQ,那么该猝发继续进行。如果传输类型为IDLE或者NONSEQ那么该猝发被终止。
图3.15为一个未定义猝发长度的具有等待阶段的猝发,传输类型由BUSY类型改变为NONSEQ类型。
T0~T1:M端初始化下一次为首地址为0x64的INCR猝发传输。
T1~T3:M端插入一个起始地址为0x68的BUSY类型传输,S端HREADYOUT为低,插入一个等待状态。
T3~T4:M端改变传输类型为NONSEQ并初始化一个起始地址为0x10的新猝发传输。
T4~T6:当HREADY为低时,M端必须保持HTRANS不变。
T5~T6:HREADY拉高,未定义长度猝发(T0~T1的address phase)完成并且M端开始NONSEQ的INCR4的猝发传输的第一个phase。
T6~T7:INCR4的第一拍完成,M端继续下一拍传输。
3.7.2 在等待状态下改变地址
当S端请求等待状态时,除了以下情形M端只能改变地址一次。
- 在IDLE传输。
- 在等待传输中,M端在IDLE类型传输中允许改变地址。当HREANS传输类型改变为NONSEQ时,M端必须保持地址不变直到HREADY为高。
在一次IDLE传输中
图3.16为具有等待阶段的单次猝发,当为IDLE传输时改变地址。
T0~T1:M端初始化起始地址为A的单次猝发。
T1~T2:M端插入一个起始地址为Y的IDLE传输。此时S端HREADYOUT为低,插入一个等待状态。
T2~T3:M端插入一个起始地址为X的IDLE传输。
T3T4:M端改变传输类型为NONSEQ,初始化一个起始地址为INCR4传输。此时直到HREADY为高,地址不能改变(T4T5)。
T5T6:单次猝发完成(T0T1的data phase)同时M端开始起始地址为B的INCR4传输的address phase。
T6~T7:INCR4的第一拍完成(地址B)同时M端开始INCR4的第二拍传输,地址为B+4。
在回应错误之后
当S端回应一个错误之后的等待传输中,在HREADY为低时,M端允许改变地址。
图3.17为S端返回错误信号的等待阶段,地址发生改变情形
T0~T1:M端初始化猝发传输的下一拍地址为0x24。
T1~T3:M端初始化猝发传输的下一拍地址为0x28,S端返回OKAY信号。
T3~T4:S端返回ERROR。
T4~T5:M端改变传输类型为IDLE,此时当HREADY为低时(HREADY为低的下一拍???),允许改变HADDR地址。S端完成ERROR的反馈。
T5~T6:S端在地址为0xC0处返回OKAY。
协议中3.8保护控制,3.9内存类型暂时不理解,后续补更。
参考文献:ARM® AMBA® 5 AHB Protocol Specification