- 片上系統設計思想與源代碼分析
- 陳曦 黃毅
- 3586字
- 2018-12-27 17:52:48
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次操作準備的數據被拋棄。
- Getting Started with React
- Visual Studio 2012 Cookbook
- TensorFlow Lite移動端深度學習
- Getting started with Google Guava
- JavaScript+jQuery網頁特效設計任務驅動教程(第2版)
- Raspberry Pi Networking Cookbook(Second Edition)
- Mastering Kali Linux for Web Penetration Testing
- Learning Firefox OS Application Development
- Building Minecraft Server Modifications
- C#程序設計
- Learning Vaadin 7(Second Edition)
- 0 bug:C/C++商用工程之道
- Android驅動開發權威指南
- jQuery技術內幕:深入解析jQuery架構設計與實現原理
- Three.js權威指南:在網頁上創建3D圖形和動畫的方法與實踐(原書第4版)