To your question, if you want to be 100% compatible (and maybe get your slave to pass in various verification suites such as e/Specman, SystemC etc.) then yes, you have to do exactly as you suggested. If you are doing a proprietry system and
- you know exactly how all the slaves will behave (e.g. because you designed them yourself)
- you or nobody else is ever likely to try and reuse your code inanother design then who cares, do whatever you want ( but your not 100% AMBA)
If your are doing INCR bursts it's not such a problem. Whenever the address is modulo 1K just change HTRANS from SEQ to NSEQ. You don't have to physically insert a wait state, just insert the NSEQ on the fly. If you are doing fixed length bursts (INCR4, INCR8, INCR16) it's a bit more difficult (but probably more efficient). Here you need to know at burst start whether you will cross a 1K boundary. If so, just change the current burst type to INCR and insert an NSEQ as above on the 1K boundary.
As to why ARM did it, no idea really. But,
- it gives you smaller (and faster) logic in the HSEL address decoder
- most memory maps are segmented anyway
- slaves only need to monitor for (HTRANS == NSEQ) && (HSEL == '1') && (HREADY == '1') to know whether they are selected. After that they can generate the remaining addresses themselves internally. So it's nothing really worth complaining about too much.
Hope this helps, C.