Quick Links
AHB spec related queries
#1
Posted 01 December 2011 - 01:20 PM
#2
Posted 01 December 2011 - 03:05 PM
Bursts cannot cross these boundaries because the minimum address range assigned to an AHB slave is 1KB. If you had 2 slaves back to back in the address space, and a burst DID cross a 1KB boundary from the first slave to the second, you could have problems in both slaves.
As an example of this...
Slave1 might see an INCR8 word-width burst indicated, starting at 0x3EC, so 5 transfers to slave 1 (0x3EC, 0x3F0, 0x3F4, 0x3F8 and 0x3FC), and then the burst crosses to Slave2. But slave 1 has been told to expect 8 transfers (so a protocol violation as masters cannot terminate bursts they have indicated, and potentially redundant Slave1 prefetches if it had tried to interpret what the master actually wanted and had prefetched from 0x0, 0x004 and 0x008 to complete 8 accesses).
Slave2 also then sees HBURST=INCR8, but the burst it is selected for starts with a SEQ access (protocol violation), and there are only 3 transfers from the master (0x400, 0x404 and 0x408), so the same burst termination protocol violation as before.
Even if you were not using a defined length burst, and instead just used burst type INCR, the first transfer Slave2 sees is a SEQ, and the slave state machine might not be designed to accept this if it attempts to differentiate between NONSEQ and SEQ accesses. So the INCR burst would need to end when it reached the 1KB boundary, and start with a NONSEQ at the 1KB boundary (potentially a different slave).
Forcing bursts to terminate at 1KB boundaries shouldn't be a significant problem, even if the slave is physically larger than 1KB in size (so not crossing between 2 smaller slaves). Most uses for defined length bursts use burst aligned start addresses (typically cache line accesses), so these wouldn't be crossing 1KB boundaries anyway, and for occasions where the start address isn't burst aligned, most won't cross a 1KB boundary. Undefined length bursts just terminate when they reach the boundary and start on the other side of it, so simple to code in the bus master.
What this solution does is make the master design work regardless of the physical construction of the slaves. Otherwise the master needs to know if address 0x400 in the above example is a boundary between 2 slaves that cannot be crossed, making the master application specific, and then not reusable.
JD
This post has been edited by JD: 01 December 2011 - 03:08 PM
#4
Posted 02 December 2011 - 07:35 AM
1. Number of bytes per beat = 8
2. Transfer size = 32 bit
3. starting addr = fff0
4. Number of beats = 2
These are some of the attributes of the burst I pass to the master.
So ideally, what should the master drive in this case? As the transfer size is 32 bit but the total number of bytes is (bytes per beat * number of beats) 16. Should the master di the write at addresses fff0,fff4,fff8,fffc respectively with 4 bytes each or it should expect that the transfer size (data width of current transfer) should be 64 bit?
#5
Posted 02 December 2011 - 08:26 AM
If the master is using HSIZE=32 bit transfers, and there are 16 bytes to transfer, it would perform writes to 0xfff0, 0xfff4, 0xfff8 and 0xfffc.
However if the data bus width is 64 bits, the master could just drive 64-bit wide transfers, to addresses 0xfff0 and 0xfff8.
The master can use any HSIZE value it wants, the only limitation being that HSIZE cannot indicate wider than the HWDATA and HRDATA bus widths.
Neither of these involves crossing a 1KB boundary, so not really related to your earlier questions, so am I missing the problem you are concerned about ?
JD
#6
Posted 02 December 2011 - 10:32 AM
m_enHdataWidth = HDATA_WIDTH_32
m_nNumBeats = 2
m_bvAddress = fffffffffffffff8 (starting address)
m_enXferSize = XFER_SIZE_32BIT (transfer size)
m_enBurstType = INCR
Other scenario has :
m_enHdataWidth = HDATA_WIDTH_32
m_nNumBeats = 2
m_bvAddress = fffff8
m_enXferSize = XFER_SIZE_32BIT
m_enBurstType = INCR
In both the cases, the number of bytes per beat is 8 and there are two beats. So in which of the above case the 1KB boundary is crossed? Also in both the cases, the transfer size is 32 bit but beats have 8 bytes each.














