连续不断是处理器取指的另一个目标。如果处理器在每一个时钟周期都能取一条指令,就可以源源不断的为处理器提供后续指令流,而不会出现空闲的时钟周期。
地址不对齐导致问题:
不管是从指令缓存,还是从ITCM中取指令,若处理器遇到了一条地址不对齐的指令,则会给连续不断取指造成困难,因为ITCM和指令缓存的存储单元往往使用SRAM,而SRAM的读端口往往具有固定宽度。以位宽为32位的SRAM为例,它在一个时钟周期只能读出一个(地址与32位对齐)32位的数据。假设一条32位长的指令处于地址不对齐的位置,则意味着需要分两个时钟周期读出两个32位的数据,然后各取其一部分并拼接成真正需要的32位指令,这样就需要花费至少两个时钟周期才能取出一条指令。
如何才能使处理器将地址不对齐的指令在一个时钟周期内取出?
1. 普通指令的地址不对齐
对于普通指令按顺序取指(地址连续增长)的情形,使用剩余缓冲区(leftover buffer)保存上次取指后没用完的位,供下次使用。假设从ITCM中取出一个32位的指令字,但是只用了它的低16位,这种情况出现可能是以下两种原因造成。
(1)只需要使用此处取出的32位中的低16位和上一次取出的高16位来组成一条32位指令;
(2)这条指令的长度本身就是16位,因此只需要取出低16位。
此次没有使用到的高16位则可以暂存于剩余缓冲区,待下一个时钟周期取出下一个32位指令字后,拼接出新的32位指令字。
2. 分支跳转指令的地址不对齐(取指令不连续)
对于分支跳转指令而言,如果跳转的目标地址与32位地址不对齐,且需要取出一个32位的指令字,上述剩余缓存就无济于事了(因为剩余缓冲区只有在顺序取指时,才能预存上次么有用完的指令字)。因此,常见的实现方式是使用多媒体(bank)化的SARM进行指令存储。以常见的奇偶交错方式为例,使用两块32位宽的SARM交错地进行存储,两个连续的32位指令字将会分别存储在两块不同SRAM中。这样对于地址不与32位地址对齐的指令,则在一个时钟周期可以访问两块SRAM,取出两个连续的32位指令字,然后各取其一部分并拼接成真正需要的32位指令字。