3.6 WISHBONE寄存反馈总线周期
3.6.1 周期的同步与异步结束方式比较
为了实现在给定时钟频率下的最大可能吞吐量,WISHBONE采用了周期异步结束方式。这样做的结果是从主设备的STB_O到从设备的ACK_O/ERR_O/RTY_O再到主设备的ACK_I/ERR_I/RTY_I输入形成了一个异步回路,如图3-13所示。在大型SoC设计中,该回路往往成为整个设计的关键路径,它限制了系统时钟频率的进一步提高。在深亚微米时代,由于线延迟往往比门延迟更大,这一异步回路更加成为系统性能的瓶颈。
图3-13 异步周期结束路径
这一问题最简单的解决方法是插入寄存器将回路断开,但这样做的缺点是在每一个操作中都插入了一个等待周期,从而显著降低了吞吐量。如图3-14所示,在上升沿1主设备发起了一次操作,在上升沿2从设备发起响应将ACK_O置高,在上升沿3主设备检测到ACK_I为高完成第一次操作并发起第二次操作,但是在上升沿3从设备并不知道主设备会发起第二次操作,因此只能将ACK_O信号置低。在上升沿4从设备才能对第二次操作发起响应将ACK_O置高,在上升沿4主设备检测到ACK_I为高完成第二次操作。
图3-14 传统同步周期结束方式
在图3-15中,每一次传输都需要两个时钟周期,一半的带宽被浪费。如果从设备在上升沿3知道主设备将发起新的操作,它将能够在上升沿3就对主设备的操作发起响应,从而节省时钟周期提高了系统的吞吐量,利用该思想改进后的同步时序如图3-15所示。
图3-15 改进的同步周期结束方式
在上升沿1,主设备发起操作,在上升沿2,从设备将ACK_O置高,在上升沿3,从设备知道主设备将发起新的操作,于是将ACK_O继续置高。因此,三个时钟周期就完成了两次操作,而不是原来大的4个时钟周期,于是吞吐量提高了25%。一般的,改进后,N次操作需要N+1个时钟周期,而不是2N个时钟周期,吞吐量改善为(N-1)/N×100%。
改进后的同步周期结束方式具备异步周期结束方式的吞吐量优势,同时具备传统同步结束方式的延迟优势。改进后的同步周期结束方式称作WISHBONE寄存反馈周期结束方式。
3.6.2 WISHBONE寄存反馈周期结束方式
在WISHBONE寄存反馈周期结束方式中,主设备需要事先通知从设备操作下一个周期是否将发起新的操作,这是通过周期类型识别地址标签CTI_O()/CTI_I()和突发类型扩展地址标签BTE_O()/BTE_I()完成的。主设备和从设备必须同时支持CTI_O()/CTI_I(),WISHBONE接口才能以寄存反馈周期结束方式工作,主设备和从设备如果支持地址增加突发模式,它们必须同时支持BTE_O()/BTE_I()。如果主设备或从设备之一不支持这种周期结束方式,它们只能以传统周期结束方式工作。
周期类型识别地址标签CTI_O()/CTI_I()提供描述当前操作突发模式的信息,从设备可以根据该信息确定在下一周期如何进行响应。CTI_O()/CTI_I()的具体定义如表3-1所示。
表3-1 周期类型标识符
不支持CTI_O()的主设备必须将该信号置为3'b000或3'b111,这两个是等价的。主设备和从设备可以支持这些突发模式中的一部分,对于不支持的突发模式,主设备必须将CTI_O()置为3'b000,从设备必须将CTI_I()理解为3'b000。
为了减少在同步模式下的等待周期,从设备必须对主设备的操作尽快地做出响应。从设备可利用CTI_I()信号确定在下一周期对主设备的响应,但是由于此时还不知道STB_I信号的状态,因此从设备在确定在下一周期对主设备的响应时只能忽略STB_I信号,因此即使在STB_I信号为低的情况下,从设备仍然可能将ACK_O/ERR_O/RTY_O置高。因此,主设备应保证CTI_O()信息的有效性。
突发类型扩展地址标签BTE_O()/BTE_I()是对CTI_O()/CTI_I()=3'b010情况下的突发类型信息的扩展,描述的是地址值是如何变化的。其含义如表3-2所示。
表3-2 递增和递减突发类型扩展
3.6.3 突发结束
突发结束(CTI_O=3'b111)表示当前操作是当前突发的最后一次操作,主设备在当前操作结束后紧接着的时钟周期不再发起操作。
如图3-16所示为CTI_O=3'b111的用法。图3-17中共有三次操作。第一次操作和第二次操作是一个突发操作的一部分。第一次操作发生在上升沿0,这是一次寄存反馈读操作;第二次操作是该突发操作的最后一个操作,主设备将CTI_O置为3'b111表示整个突发操作结束;第三次操作为单次写操作。
图3-16 突发结束
图3-17 地址不变突发示例
图3-16中的操作过程如下:
在时钟上升沿0到达之前,一个突发寄存反馈读操作正在进行。从设备将数据放到数据总线DAT_I()。
在时钟上升沿0,主设备将DAT_I()采样,并更新地址总线ADR_O(),同时将CTI_O()置为3'b111表示本次突发读操作即将结束。从设备根据时钟上升沿0采样到的CTI_O()的值(不等于3'b111)知道操作还在进行,因此仍然将ACK_I置高,并在数据总线DAT_I()放上新的数据。
在时钟上升沿1,主设备将DAT_I()采样完成整个突发读操作,同时主设备将新地址信号放到地址总线ADR_O()上,将新数据信号放到数据总线DAT_O()上,将WE_O置为高表示写操作,CTI_O()置为3'b111表示本次写操作只进行一次。由于从设备根据CTI_O()为3'b111知道整个突发读操作结束,而不了解主设备将发起写操作,因此将ACK_I置低。
在时钟上升沿2,从设备检测到主设备的写操作,并将数据DAT_O()采样,同时将ACK_I置高。
在时钟上升沿3,主设备将CYC_O和STB_O置低表示操作结束,从设备将ACK_I置低。
3.6.4 地址不变突发
地址不变突发是一个总线周期,在这个总线周期中完成多次操作,但是地址不变。地址不变突发的典型应用是以DMA方式读/写FIFO。主设备在时钟的某一个上升沿将CTI()置为3'b001后,下一个周期的操作必须与本周期,包括SEL_O()信号也不能改变,即在地址不变突发中的每一次操作除传输的数据可能发生变化外其他都是相同的。
如图3-17所示为一个地址不变突发写总线周期示例。图3-18中主设备和从设备一共进行了4次操作。
图3-18 数据总线为32位、粒度为8的叠4地址增加突发操作示例
在时钟上升沿0,主设备将地址信号ADR_O()放到总线上,将数据信号DAT_O()、TGD_O()放到总线上,将WE_O置为高表示写操作,将CTI_O()置为3'b001表示地址不变突发总线周期,将适当的SEL_O()信号置高通知从设备将数据总线上哪些信号是有效的,将CYC_O和TGC_O置高表示操作正在进行,将STB_O置高表示第一次写操作开始。
在时钟上升沿1,从设备检测到主设备的写操作,将DAT_I()采样,并置高ACK_O。
在时钟上升沿2,主设备检测到ACK_I为高,知道第一次传输顺利完成,由于数据没有准备好,于是将STB_O置低表示插入等待周期。
在等待周期,从设备知道地址不变突发写操作仍然在进行,因此一直将ACK_O置高。但是此时主设备和从设备知道没有真正的传输发生。
在时钟上升沿3,主设备已经将新的数据准备好,于是将STB_O置高表示第二次写操作开始,并更新DAT_O()。
在时钟上升沿4,从设备检测到主设备的写操作,将DAT_I()采样。同时从设备发现没有足够的空间存储数据或由于其他原因不能及时接收新的数据,于是将ACK_O置低插入等待周期。主设备检测到ACK_I为高,于是发起第三次操作,更新DAT_O()。
在时钟上升沿5,从设备发现可以继续接收数据,于是将DAT_I()采样并将ACK_O置高。
在时钟上升沿6,主设备检测到ACK_I为高,于是发起第4次操作,更新DAT_O(),同时将CTI_O置为3'b111表示本次操作为最后一次操作。
在时钟上升沿7,从设备将DAT_I()采样,并根据CTI_O为3'b111知道本次地址不变突发写操作完成,于是将ACK_O置低。
3.6.5 地址增加突发
地址不变突发是一个总线周期,在这个总线周期中完成多次操作,但是地址递增的。地址的单位增加值取决于数据总线的宽度和粒度。对于粒度为8比特的数据总线,当数据总线宽度为8,地址每次增加1;当数据总线宽度为16,地址每次增加2;当数据总线宽度为32,地址每次增加4。地址增加的方式又分为线性增加和折叠增加。在线性增加中,新的地址总是比旧的地址大一个单位增加值。在折叠增加中,新的地址的获得方式为在旧的地址加一个单位增加值,其后再将地址与折叠尺寸异或。常见的折叠尺寸为4和8,因此WISHBONE标准中明确定义了支持叠4和叠8操作,示例如表3-3所示。折叠操作常见于处理器缓存的读写。典型的SDRAM都支持折叠操作。
表3-3 地址增加方式
主设备将CTI()置为3'b010表示地址增加突发操作,若主设备在时钟的某一个上升沿将CTI()置为3'b010,必须同时将BTE_O()置为合适的值,以通知从设备地址的增加方式,且下一个周期的传输必须与本周期相同,SEL_O()信号也不能改变。
如图3-18所示为一个数据总线为32位、粒度为8的叠4地址增加突发读操作示例。主设备和从设备之间一共进行了4次传输。
在时钟上升沿0,主设备将地址信号ADR_O()放到总线上,将WE_O置为低表示读操作,将CTI()置为3'b010表示地址增加突发操作,将BTE_O()置为2'b01表示叠4操作,将适当的SEL_O()信号置高通知从设备将数据放在数据总线的适当位置,将CYC_O置高表示操作正在进行,将STB_O置高表示第一次传输开始。从设备根据ADI_O()准备所需数据。
在时钟上升沿1,从设备检测到主设备的读操作,将数据放到DAT_O(),同时置高ACK_O。从设备此时根据CTI()和BTE_O()知道下次主设备操作的地址,并前根据该地址准备第二次操作数据。
在时钟上升沿2,主设备检测到ACK_I为高,将DAT_I()采样完成第一次操作,并发起第二次操作。从设备获得第二次操作的数据并将其放到DAT_O()并开始准备第三次操作的数据。
在时钟上升沿3,主设备检测到ACK_I为高,将DAT_I()采样完成第二次操作,并发起第三次操作。从设备获得第三次操作的数据并将其放到DAT_O()并开始准备第4次操作的数据。
在时钟上升沿4,主设备检测到ACK_I为高,将DAT_I()采样完成第三次操作,并发起第4次操作,并将CTI()置为3'b111表示本次地址增加突发操作即将结束。从设备获得第4次操作的数据并将其放到DAT_O()并开始准备第5次操作的数据。
在时钟上升沿5,主设备检测到ACK_I为高,将DAT_I()采样完成第4次操作。从设备检测到CTI()为3'b111,刚刚获取的为第5次操作准备的数据被抛弃。