SPI4.2總線(xiàn)應用和調試經(jīng)驗談
引言
SPI4.2總線(xiàn)(System Packet Interface,系統間數據包接口)是一種速度高達10 Gb/s的芯片間互連總線(xiàn),主要應用于A(yíng)TM信元傳輸、POS(Packet Over SONET/SDH,基于SONET/SDH的包傳輸)和10 Gb/s以太網(wǎng)等高端場(chǎng)合。特別在通信領(lǐng)域,很多高端處理器和網(wǎng)絡(luò )處理器,如Intel公司的IXP2800、Cavium公司的多內核處理器CN58xx系列、NetLogic公司的XLR732、BrOAdcom的BCM1480,幾乎都集成了SPI4.2接口,以提高芯片的吞吐能力,適應通信產(chǎn)業(yè)朝著(zhù)LTE(長(cháng)期演進(jìn))發(fā)展的需求。還有眾多的物理層芯片,例如Cortina公司的CS1331,可以將SPI4.2總線(xiàn)轉換成8個(gè)千兆以太網(wǎng)接口。SPI4.2總線(xiàn)之所以被眾多的高端芯片所采用,與其高速、靈活、可靠的特性是密不可分的。
1 SPI4.2總線(xiàn)基本原理
SPI4.2總線(xiàn)是一種芯片間的互連總線(xiàn),連接芯片的鏈路層和物理層模塊。其工作時(shí)鐘是源同步雙邊沿觸發(fā)時(shí)鐘,至少為311 MHz。圖1是使用SPI4.2總線(xiàn)連接兩個(gè)芯片的示意圖??梢?jiàn),SPI4.2總線(xiàn)的信號在發(fā)送和接收方向完全對稱(chēng)而又互相獨立,數據鏈路和狀態(tài)鏈路分開(kāi),并且其時(shí)鐘也是完全分開(kāi)的。因此,該總線(xiàn)不僅適合于雙向通道,而且適合于只收不發(fā)或者只發(fā)不收的單向通道。
圖1 SPI4.2連接示意圖
SPI4.2總線(xiàn)具有以下特點(diǎn):
?、?點(diǎn)對點(diǎn)互連,收發(fā)數據鏈路寬度為16位。
?、?發(fā)送和接收模塊的信號各分為兩組,即數據信號和狀態(tài)信號,分別對應數據鏈路和狀態(tài)鏈路,每個(gè)鏈路具有自己的時(shí)鐘。數據鏈路發(fā)送和接收數據,狀態(tài)鏈路傳輸相應鏈路的狀態(tài)信息。
?、?數據鏈路包含DCLK、DAT[15:0]和CTL三種LVDS(低壓差分傳輸)信號。前面加“T”表示信號屬于發(fā)送模塊,加“R”表示信號屬于接收模塊。以發(fā)送模塊為例,TDCLK是雙邊沿觸發(fā)時(shí)鐘,TCTL是控制信號,TDAT[15:0]承載了數據和控制信息。當TCTL為高電平時(shí),TDAT[15:0]傳送的是數據包;當TCTL為低電平時(shí),TDAT[15:0]傳送的是控制包。數據采用DIP4校驗交織碼。
?、?狀態(tài)鏈路包括SCLK時(shí)鐘信號和STAT[1:0]狀態(tài)信號,信號類(lèi)型是LVTTL或LVDS。SPI4.2 發(fā)送時(shí)序如圖2所示。如果選擇LVTTL,則SCLK時(shí)鐘頻率是數據鏈路時(shí)鐘速率的1/4。如果選擇LVDS,則SCLK時(shí)鐘頻率和數據鏈路時(shí)鐘頻率相同。下文中均以L(fǎng)VDS為例進(jìn)行闡述。狀態(tài)鏈路主要用于流控。
?、?接收和發(fā)送模塊都含有一個(gè)FIFO隊列,用于緩存數據,隊列長(cháng)度由芯片設計而定。隊列的狀態(tài)信息通過(guò)狀態(tài)鏈路周期性地發(fā)送,接收模塊和發(fā)送模塊的狀態(tài)信息是獨立的。狀態(tài)信息附加了DIP2交織校驗碼,以提高傳輸可靠性。
圖2 SPI4.2 發(fā)送時(shí)序
除了數據包中最后一段不滿(mǎn)16字節的數據(EOP)之外,SPI4.2總線(xiàn)的數據實(shí)行突發(fā)傳輸,以16字節為單位(稱(chēng)為一個(gè)數據塊),每次傳輸多個(gè)數據塊。因為數據寬度是16位,所以一次突發(fā)傳輸至少需要4個(gè)時(shí)鐘周期。數據的高地址位字節先發(fā)送(MSB),低地址位字節后發(fā)送,數據塊傳輸過(guò)程中不會(huì )被中斷。每次突發(fā)傳輸的間隔期間傳送控制包或者訓練序列。圖2中,TDAT表示數據塊,TCTRL表示控制塊??刂瓢L(cháng)度為16位,包含了前次傳輸和下次傳輸的狀態(tài)信息:包開(kāi)始標志、包結束標志、邏輯端口地址和DIP4交織校驗碼等。數據鏈路遵循有限狀態(tài)機進(jìn)行工作,狀態(tài)包括5種:控制包傳輸、數據包傳輸、空閑包傳輸、訓練序列傳輸以及訓練序列控制[1]。
因為狀態(tài)鏈路的寬度是2位,所以每次突發(fā)傳輸至少傳輸16位數據(4個(gè)時(shí)鐘周期)。反映FIFO隊列的狀態(tài)信息有3種:飽(Satisfied)、餓(Hungry)、極餓(Starving),分別對應二進(jìn)制數字10、01和00。11表示鏈路處于失步狀態(tài),正在同步過(guò)程中。當狀態(tài)是“飽”時(shí),說(shuō)明隊列幾乎滿(mǎn)了,只接收當前正在傳送的數據包,其他數據包只有等狀態(tài)更新后才能接收。當狀態(tài)是“餓”時(shí),可以接收最大MaxBurst2個(gè)數據塊。當狀態(tài)是“極餓”時(shí),說(shuō)明隊列幾乎空了,可以接收最大MaxBurst1個(gè)數據塊。MaxBurst1和MaxBurst2是SPI4.2總線(xiàn)初始化時(shí)設定的參數,MaxBurst1不得小于MaxBurst2。
2 SPI4.2總線(xiàn)的初始化和同步
SPI4.2總線(xiàn)初始化時(shí)必須設定一些基本參數,如表1所列。
SPI4.2總線(xiàn)協(xié)議定義了一個(gè)叫“日歷”的數據結構CALENDAR[i](i=1,…,CALENDAR_LEN)。CALENDAR_LEN(日歷長(cháng)度)參數規定了邏輯端口(或稱(chēng)為虛擬通道)的數目,該數值不能小于實(shí)際的邏輯端口數目。例如,如果SPI4.2總線(xiàn)用于10 Gb/s以太網(wǎng)口,那么日歷長(cháng)度是1(即CALENDAR_LEN = 1);如果SPI4.2總線(xiàn)用于10個(gè)1 Gb/s以太網(wǎng)口,那么日歷長(cháng)度是10(CALENDAR_LEN = 10),CALENDAR[i] = 1,2,…,10,代表了10個(gè)以太網(wǎng)端口。CALENDAR[i]中承載的數據被周而復始地依次傳輸,重復次數是CALENDAR_M次。圖3為日歷長(cháng)度和重復次數都是4的數據傳輸示意圖。SPI4.2總線(xiàn)被初始化時(shí),必須確保接口兩端的CALENDAR_LEN和CALENDAR_M分別相等。從這個(gè)角度看,SPI4.2是一種時(shí)分復用的總線(xiàn):總帶寬是固定的,“日歷”數據結構決定了帶寬和邏輯端口的分配。
當SPI4.2正常工作時(shí),數據和狀態(tài)鏈路會(huì )不定期地發(fā)送訓練序列。在數據鏈路,訓練序列至少應該在DATA_MAX_T個(gè)時(shí)鐘周期內發(fā)送一次。在狀態(tài)鏈路,訓練序列至少應該在FIFO_MAX_T個(gè)時(shí)鐘周期內發(fā)送一次。設置DATA_MAX_T或FIFO_MAX_T為0將取消各自鏈路的訓練序列,一般情況下不推薦這種設置。
圖4以XLR732為參照描述了SPI4.2總線(xiàn)的收發(fā)同步過(guò)程。啟動(dòng)之后,在發(fā)送方向,發(fā)送模塊(TX)通過(guò)數據鏈路發(fā)送連續的訓練序列,對端的接收模塊成功收到訓練序列后,會(huì )設置本端的接收同步標志;然后通過(guò)狀態(tài)鏈路發(fā)送訓練序列給對端,一旦發(fā)送模塊成功接收到訓練序列后,就設置本端的發(fā)送同步標志。
在接收方,接收模塊(RX)在數據鏈路成功接收到對端發(fā)送的訓練序列后,會(huì )設置本端的接收同步標志;然后通過(guò)狀態(tài)鏈路發(fā)送訓練序列,一旦發(fā)送模塊成功接收到訓練序列后,就設置本端的發(fā)送同步標志。在同步過(guò)程中,訓練序列由指定的連續的DIP4碼字組成。發(fā)送模塊必須連續發(fā)送訓練序列,直到本端的狀態(tài)鏈路收到有效信息。同時(shí),接收模塊忽視所有接收到的數據,直到觀(guān)察到訓練序列,獲得數據同步。一旦數據鏈路同步之后, FIFO隊列狀態(tài)信息就開(kāi)始傳送。
如果發(fā)送方接收到有效的狀態(tài)信息,它就可以開(kāi)始進(jìn)行數據突發(fā)傳輸。如果在工作過(guò)程中,由于某些原因(例如一端器件掉電或重啟)導致總線(xiàn)失步,那么為了再次獲得同步,雙方需要按照上述過(guò)程發(fā)送連續的訓練序列,直到建立同步為止。
表1 SPI4.2初始化基本參數
圖3 日歷長(cháng)度和重復次數都為4的數據傳輸示意圖
圖4 收發(fā)同步過(guò)程示意圖
3 SPI4.2總線(xiàn)接口的調試
SPI4.2總線(xiàn)接口的調試包括兩個(gè)重要步驟:鏈路的同步和數據的正常收發(fā)。
在調試鏈路同步時(shí),首先必須查看總線(xiàn)兩端的初始化參數配置。因為SPI4.2 總線(xiàn)協(xié)議是一個(gè)對等端數據傳輸協(xié)議,所以大部分參數需要雙方的匹配和協(xié)商,特別是接收方和發(fā)送方的CALENDAR_LEN和CALENDAR_M參數。
如何查看同步呢?芯片通常會(huì )提供一個(gè)狀態(tài)寄存器來(lái)反映總線(xiàn)的同步?!敖邮胀綐酥尽敝荒苷f(shuō)明在數據鏈路上成功接收到對端的訓練序列,但不能保證接收的狀態(tài)鏈路是正常的,如果需要確認可查看對端的“發(fā)送同步標志”。在收發(fā)雙向通道應用中,只有兩端的“接收同步標志”和“發(fā)送同步標志”都置位了,總線(xiàn)才算同步。此時(shí),可以確認總線(xiàn)兩端的物理連接是正確的,握手成功。
如果不能同步,就必須檢查兩端的“接收同步標志”和“發(fā)送同步標志”,判斷是哪一端出了問(wèn)題。檢查是否有DIP4和DIP2錯誤,如果有此類(lèi)錯誤,說(shuō)明鏈路上信號質(zhì)量可能不佳,可以用示波器測量信號波形。如果信號質(zhì)量確實(shí)不好,可以通過(guò)提高信號驅動(dòng)能力或者調整硬件匹配阻抗來(lái)優(yōu)化。
如果兩端的接收和發(fā)送都沒(méi)有同步,就必須測量芯片的電壓、工作頻率、重啟等信號。如果兩端的“接收同步標志”和“發(fā)送同步標志”都已經(jīng)置位,說(shuō)明雙方的接收和發(fā)送都同步,可以正常收發(fā)數據了。在大流量數據傳輸過(guò)程中,最相關(guān)的是FIFO隊列的參數配置,配置不當會(huì )導致錯包或丟包。以NetLogic公司的XLR732網(wǎng)絡(luò )處理器為例[2],SPI4.2總線(xiàn)的發(fā)送模塊的所有邏輯端口共享一個(gè)FIFO隊列,寬度為16字節,長(cháng)度為128;接收模塊的所有邏輯端口共享一個(gè)FIFO隊列,寬度為16字節,長(cháng)度為512。每個(gè)邏輯端口所占用的隊列地址和大小都可以通過(guò)寄存器配置。
假如某個(gè)端口接收端隊列的長(cháng)度是48,MaxBurst1是12,MaxBurst2是8。那么當該模塊接收數據時(shí),如果由于某些原因(例如軟件來(lái)不及處理),接收隊列只剩下12個(gè)空位,也就是接收隊列已經(jīng)有48-12=36個(gè)空位被占用時(shí),它將通過(guò)狀態(tài)鏈路向對端發(fā)送“餓”的狀態(tài)信號(反壓信號)。對端收到該信號后實(shí)施流控策略,根據本端發(fā)送端的MaxBurst1設置值發(fā)送數據,該值表示接收到“餓”狀態(tài)信號后最多還可以發(fā)送的數據塊數目。所以接收端的MaxBurst1 的值一定要大于對端發(fā)送端的MaxBurst1,并且要留出一定的余量,因為數據在鏈路上的傳輸也是需要時(shí)間的。同理,接收端的MaxBurst2要大于對端發(fā)送端的MaxBurst2。值得注意的是,流控是基于邏輯端口的,而不是整條鏈路。
為保證不發(fā)生接收端FIFO隊列溢出等問(wèn)題,盡量將接收端的MaxBurst1和MaxBurst2設置大一些, 只要小于FIFO入口總數就可以,而發(fā)送端MaxBurst1和MaxBurst2的 設置不要超過(guò)本端接收能力。
如果出現EOP(結束包)和SOP(起始包)錯誤或缺失,或者其他錯包(例如包長(cháng)變短、幀校驗錯誤等),但沒(méi)有DIP4 錯誤,該怎么辦?這類(lèi)問(wèn)題一般出現在FIFO隊列設置上,尤其是接收端的FIFO隊列可能溢出,從而丟失了某些數據塊,可以通過(guò)以下3種方法來(lái)檢測和解決:
?、?通過(guò)查看接收端FIFO溢出標志來(lái)判斷FIFO隊列是否溢出;
?、?通過(guò)調整接收端的MaxBurst1和MaxBurst2來(lái)防止FIFO隊列溢出;
?、?如果方法②的調整足夠大,還有此問(wèn)題,可以查看對端是否收到反壓信號,以及對端的狀態(tài)等。
為了方便,通常將發(fā)送端的MaxBurst1和MaxBurst2設置為相同數值,將接收端的MaxBurst1和MaxBurst2也設置成相同數值。
結語(yǔ)
隨著(zhù)處理器的速度越來(lái)越快,處理器集成的內核越來(lái)越多,處理器與外圍器件之間,處理器之間,以及外圍器件之間的連接速度逐漸成為制約平臺性能的瓶頸。許多芯片同時(shí)集成了多個(gè)總線(xiàn)接口,例如XLR732同時(shí)擁有SPI4.2、HT、以太網(wǎng)3種總線(xiàn)接口。SPI4.2總線(xiàn)在與其他總線(xiàn)的競爭中體現出了強大的生命力,希望本文所介紹的經(jīng)驗對正在應用或計劃應用SPI4.2總線(xiàn)的同行有所幫助。
評論