AHBlite传输包含两个阶段:
HWRITE控制着数据传输的方向:
下面是读写两种无等待传输波形,可以看出,在这种最简单的情况下,每笔读写传输包含一个地址cycle和一个数据cycle。
任何一笔传输的地址阶段都发生在上一笔传输的数据阶段。这种地址和数据的重叠(overlapping)对于总线的流水线性质(pipelined nature)至关重要,并且可以实现高性能的操作,同时仍为slave提供足够的时间来提供对传输的响应。slave可以在任何传输中插入等待状态,以使操作完成获得更多的时间。
注意:对于写传输,master在整个扩展周期内保持数据稳定。对于读传输,slave无需提供有效数据,直到传输即将完成。
当以这种方式扩展传输时,它的副作用是延长了下一个传输的地址阶段的时间。
下图显示了到A/B/C三个不相关地址的传输,可以发现:
1.在到地址A和地址C的传输过程中,是没有等待状态的
2.在到地址B的传输过程中的数据阶段有1个等待状态,其影响是地址C的地址阶段被延迟了。
传输可以被分为四种类型,它们由信号HTRANS[1:0]来表征。
一张图展现四种不同的传输类型
T0~T1:一个4拍的读请求开始于一笔NONSEQ类型传输
T1~T2:master还没准备好第2笔传输,因此插入1拍的BUSY类型传输来延迟第2拍的开始,slave正常提供第1个传输的读数据
T2~T3:master准备好了第2拍,因此会发出SEQ传输的信号。由于上一笔传输是BUSY传输,所以此时master会忽略slave提供的读数据
T3~T4:master发起第3笔传输,slave正常提供第2拍的读数据
T4~T5:master发起最后一笔传输,可是slave还没准备好接收第3笔传输,因此使用HREADY插入单个等待状态
T5~T6:slave准备好,并为第3笔传输提供读数据
T6~T7:slave准备好,并为最后一笔传输提供读数据
如果master要求锁定访问,则它必须声明HMASTLOCK信号。该信号用于向任何slave指示当前传输序列是不可分割的,因此必须在处理任何其它传输事务之前对其进行处理。通常,Locked传输用于确保信号的完整性,以确保slave在两次传输之间不执行其它操作。
下图以微处理器SWP指令的读取和写入为例。
HSIZE[2:0]信号表示的是传输数据量的大小。
下表为传输大小与HSIZE信号之间的编码关系:
注意:HSIZE设置的传输大小必须小于或等于数据总线的宽度。例如对于32位数据总线,HSIZE只能使用b000,b001或b010。
将HSIZE与HBURST结合使用,以确定用于地址跳转的边界值。
HSIZE信号与地址总线具有完全相同的时序,但是HSIZE必须在整个突发传输中保持恒定。
协议中的突发类型,包含了single、4、8、16beats和undefined length(不定长)这几种,他们都支持incrementing和wrapping:
下表是由HBURST[2:0]控制的burst类型。
注意!master不允许发送跨越1KB地址边界的INCR突发,这是因为slave在设计的时候是以1KB为单位的,如果跨过了1KB就有可能访问到另一个slave。
master在进行单次传输时,可以使用以下方式:
Note
突发的大小(Burst Size)表示的是突发的节拍数(传输的个数),而不是传输的字节数。通过将节拍数和每拍中的数据量(HSIZE[2:0])相乘,可以计算出总突发传输的数据量总数。
突发的所有传输必须满足与等于传输大小的地址边界对齐。例如,你必须将一个数据量为word的trasnfer对齐到word地址边界(HADDR[1:0]='b00),将数据量为halfword的transfer对齐到halfword地址边界(HADDR[0]='b0)。IDLE传输的地址也必须对齐,否则在仿真期间monitor可能会报告虚假警告。
在突发开始之后,master如果需要更多的时间,则会在继续下一次传输之前使用BUSY类型的传输。
在INCR类型的不定长突发中,master可能会插入BUSY传输然后决定不再发出新的传输请求。在这种情况下,master可以通过发出NONSEQ或IDLE传输来有效地终止不定长突发。
协议不允许master使用BUSY来企图结束固定长度突发(INCR4/8/18,WRAP4/8/16),这些定长突发只能以SEQ类型传输结束。
以下两种情况可能会造成突发的终止:
1. slave的错误响应
如果slave响应了一个ERROR,那么master应该取消本次突发中的剩余传输。然而这并不是一个严格的规定,master把本次突发中的剩余传输继续发完也是可以接受的。即使master没有完成突发中的所有传输,在下一次访问到slave的时候也不需要重建这笔突发,例如master只完成了一个8拍突发中的3拍,那么它在下次访问到slave的时候也不必完成剩余的5拍传输。
2. Multi-layer interconnect 终止
虽然master不允许提前终止突发请求,但当突发没有完成时,slave必须被设计为能够正常工作。当多层互连组件被用于多master的系统时,它就可以终止突发以便另一个master可以访问slave。如果这种情况发生,slave必须终止来自之前master的突发,转而响应新的master。
4拍循环突发,WRAP4
边界地址计算:拍数(传输个数)x 传输大小 = 4 x 4(byte) = 16byte,因此以16-byte地址为边界,每逢16-byte(0x10)的地址就需要跳转。
8拍循环突发,WRAP8
边界地址计算:传输个数 x 传输大小 = 8 x 4(byte) = 32byte,因此要以32-byte地址为边界,每逢32-byte(0x20)的地址就要向前跳转。因此这里到达0x3C之后,如果不跳转下一个地址是0x40,显然0x40是一个32-byte地址,因此向前跳0x20个地址,到达0x40-0x20=0x20。
不定长突发,INCR
下图展示了两个burst:
slave如果需要更多的时间来提供或者采样数据,那么他们会用HREADY来插入等待状态。在传输等待期间,master仅限于对传输类型和地址进行更改。
当slave请求等待状态时,master不能更改传输类型,除非以下几种情况:IDLE传输、定长BURST中的BUSY传输、不定长BURST中的BUSY传输。
1. IDLE传输
在传输等待期间,master可以将传输的状态从IDLE变更到NONSEQ。当传输类型(HTRANS)变更到NONSEQ后,master必须保持传输类型不变,直到HREADY拉高。
下图展示了一个SINGLE突发的传输等待,并且伴随着传输类型从IDLE到NONSEQ的改变。
T0-T1 master初始化SINGLE突发到地址A
T1-T2 master在地址Y上插入一个IDLE传输,此时slave插入了一个等待状态(HREADY=LOW)
T2-T3 master在地址Z上插入了一个IDLE状态
T3-T4 master将传输类型更改为NONSEQ,并发送一笔初始地址为B的INCR4突发
T4-T5 当HREADY为低时,master必须保证传输类型不变
T5-T6 HREADY拉高,到地址A的SINGLE突发完成,并且开始下一笔INCR4突发
T6-T7 INCR4突发的第一拍完成,发送下一拍传输的地址
2. 定长BURST中的BUSY传输
在定长BURST的传输等待过程中,master可以在HREADY为低时将传输类型从BUSY更改为SEQ。同样,传输类型更改之后需要保持不变,直到HREADY拉高。
Note 因为BUSY传输只能在连续的突发节拍中插入,因此这不适用于SINGLE突发。
关键cycle解读:
T1-T2 master开始下一个对地址0x28的传输,但因为暂时没“空”发送命令,因此先插入了一笔BUSY传输,同时slave也发起了等待。
T3-T4 master此时有“空”了,因此将BUSY传输更改为SEQ传输,但slave还需要等待。
3. 不定长BURST中的BUSY传输
在不定长突发INCR的传输等待过程中,master也允许在HREADY为低时将BUSY传输更改为其它类型的传输。如果更改为SEQ,那么当前突发将继续,而如果更改为了IDLE或者NONSEQ,那么当前突发结束、进入下一笔突发。
在slave的等待状态下,master只能改变一次地址,除了以下两种情况:
1. IDLE传输期间
在传输等待期间,master允许改变IDLE传输的地址,当传输类型变为NONSEQ后,master就必须要保证地址不变直到HREADY拉高。
2. 在一次ERROR响应之后
在传输等待期间,若slave响应了一个ERROR,那么master就可以在HREADY为低的时候改变地址。
关键cycle:
T3-T4 slave响应ERROR
T4-T5 master将HTRANS切换为IDLE传输,并允许在HREADY为低的时候更改地址;slave完成ERROR响应