劉 鑫,林凡淼,劉 凱
(中國電子科技集團公司第五十八研究所,江蘇 無錫 214072)
PCIExpress(PCIe)總線是目前數(shù)據(jù)處理設(shè)備之間傳輸高速數(shù)據(jù)信號的主流總線。相較于采用單端并行總線形式的PCI/PCI-X總線,PCIe采用了高速串行差分總線形式,滿足了處理器與設(shè)備之間高性能、高可靠性、易于布線的數(shù)據(jù)通訊需求[1-2]。
PCIe總線以PCIe Switch(PCIe交換機)為核心構(gòu)建總線拓撲結(jié)構(gòu),廣泛應(yīng)用于芯片級、模塊級互聯(lián),為解決長距離的系統(tǒng)級PCIe互連提供了新思路[3]。
PCIe總線為全雙工串行總線,為設(shè)備提供高速、高性能、點對點的通信鏈路,可以根據(jù)負載應(yīng)用需求調(diào)整PCIe通道數(shù)量,進而改變設(shè)備的帶寬。不同于PCI/PCI-X基于總線共享的交換模式,PCIe總線需要通過交換器實現(xiàn)多臺PCIe設(shè)備互聯(lián)[4]。典型的PCIe總線系統(tǒng)拓撲結(jié)構(gòu)如圖1所示。
圖1 PCIe總線系統(tǒng)典型拓撲結(jié)構(gòu)
PCIe總線系統(tǒng)主要由根復合體RC、交換器及端點設(shè)備組成。RC為CPU內(nèi)部總線向外部總線過渡的通信媒介,是PCIe總線操作的實際管理者;Endpoin(t EP)處于PCIe總線系統(tǒng)拓撲結(jié)構(gòu)的末端,接收來自上級拓撲的數(shù)據(jù)包或者向上級拓撲發(fā)送數(shù)據(jù)包[5]。
PCIe Switch對PCIe總線進行擴展,形成完整的PCIe總線拓撲結(jié)構(gòu),是支撐總線通訊的關(guān)鍵環(huán)節(jié)。PCIe總線規(guī)定,在一個Switch中與RC直接或者間接相連的端口為上游端口,其他所有端口被稱為下游端口。下游端口一般與EP相連,或者連接下一級Switch繼續(xù)擴展PCIe鏈路[6]。
國產(chǎn)PCIe Switch芯片設(shè)計對照的國外芯片型號為IDT公司生產(chǎn)的89PES12T3G2,是一款基于PCIe-2.0總線協(xié)議的高性能交換芯片,廣泛應(yīng)用于服務(wù)器、存儲器、網(wǎng)絡(luò)交換器等設(shè)備。國產(chǎn)PCIe Switch芯片的內(nèi)部功能簡圖如圖2所示。
圖2 國產(chǎn)PCIe Switch芯片內(nèi)部功能簡圖
國產(chǎn)PCIe Switch芯片的主要技術(shù)特性如下:
1)具有12路5 Gbps PCIe-2.0通道(具備8/10編/譯碼器的SerDes接口),3個交換機端口(其中包括1個x4上游端口和2個x4下游端口),各端口自適應(yīng)支持的鏈接寬度為x4,x2,x1,所有端口支持通道自動翻轉(zhuǎn);
2)具備低延遲快速轉(zhuǎn)發(fā)交換架構(gòu),支持最大有效載荷為2 048 bytes;
3)具有一個Master SMBus接口,支持通過EEPR OM自動加載配置信息;
4)具有一個Slave SMBus接口,CPU、微處理器、FPGA等能夠通過該接口訪問PCIe Switch內(nèi)部寄存器空間;
5)支持與PCI兼容的INTx及總線鎖定;
6)下游PCIE端口支持熱插拔;
7)具有9個通用輸入/輸出引腳,以及IO擴展功能。
由于臺式機主板或嵌入式主板上的PCIe插槽數(shù)量有限,因此,需要利用PCIe Switch的擴展功能對PCIe總線拓撲結(jié)構(gòu)進行擴充才能掛載更多的終端設(shè)備。采用國產(chǎn)化PCIe Switch芯片設(shè)計基于FPGA的可配置總線擴展系統(tǒng),能夠滿足總線擴展的需求[7-9]。
PCIe鏈路數(shù)據(jù)包的分發(fā)級聯(lián)是國產(chǎn)Switch芯片實現(xiàn)的基本功能,同時芯片的其他基本功能,如啟動方式、參考切換、復位模式切換等由特定的IO引腳進行設(shè)定,內(nèi)部配置寄存器空間可以通過掛接在Master SMBus總線上的EEPROM進行初始化,也可以通過Slave SMBus總線在線修改配置參數(shù)。PCIe Switch總線擴展板方案設(shè)計框圖如圖3所示。
圖3 PCIe Switch擴展板方案框圖
該方案以國產(chǎn)PCIe Switch芯片作為核心轉(zhuǎn)接芯片進行PCIe總線的擴展,同時采用FPGA芯片對芯片功能進行動態(tài)配置,從而實現(xiàn)以下功能:1)參考時鐘管理;2)復位功能管理;3)Slave SMBus接口控制及配置空間訪問;4)板級狀態(tài)監(jiān)控及管理等功能。除此以外,選用時鐘Buffer芯片分別為下游兩個插槽及Switch芯片提供高質(zhì)量的差分時鐘信號。
分析系統(tǒng)配置任務(wù)對FPGA的實際需求,選擇Xilinx公司A7系列的XC7A100T芯片作為PCIe Switch的動態(tài)配置芯片,負責上電后的動態(tài)管理功能。該芯片的邏輯單元總數(shù)為101 K,最大分布式RAM為1 188 kb,Block RAM為4 860 kB,電源網(wǎng)絡(luò)采用核壓1.2 V,IO電平3.3 V,高性能與低功耗的芯片特性滿足設(shè)計需求。
PCIe Switch及PCIe設(shè)備根據(jù)情況可以選擇100 MHz或125 MHz作為參考時鐘。參考時鐘架構(gòu)采用PCIe-2.0協(xié)議推薦的Common Refclk Architecture方式,該方式要求Switch及下游設(shè)備采用相同的時鐘源信號[10-11]。該設(shè)計采用上游金手指輸入的參考時鐘并用Clock Buffer輸出至Switch及下游插槽。與此同時,采用內(nèi)外源切換的冗余設(shè)計方式方便單板調(diào)試。
時鐘Buffer選用ICS9DB803,該芯片輸出時鐘抖動小于50 ps,偏斜小于50 ps,工作在PLL模式時,輸出頻率為50~100 MHz,最多輸出8路差分時鐘信號,并具備輸出使能控制。此外國產(chǎn)Switch芯片的參考時鐘頻率由REFCLKM引腳進行設(shè)置,默認置0時為100 MHz。
PCIe總線復位信號貫穿整個鏈路,信號由系統(tǒng)主板發(fā)出,由金手指向下傳遞至下游Switch或EP設(shè)備。將該復位信號分別接入國產(chǎn)Switch芯片的復位引腳以及FPGA的IO引腳,實現(xiàn)交換芯片內(nèi)部復位功能以及FPGA配置翻轉(zhuǎn)和復位監(jiān)控功能。
PCIe采用全雙工的串行差分信號進行通信,并引入了嵌入式時鐘,PCIe Gen2采用8b/10b編碼技術(shù),使接收端可以從數(shù)據(jù)Lane中恢復出時鐘[12]。國產(chǎn)Switch芯片內(nèi)部采用Serdes器件實現(xiàn)PCIe中的PCS層和PMA層,接口通信速率為5 GT/s。
根據(jù)PCIe-2.0規(guī)范,總線兩端設(shè)備的通道位置和極性可以交換順序,因此,在設(shè)計PCB時,可以根據(jù)實際布線情況對PCIe通道的位置或極性映射關(guān)系進行調(diào)整,在PCIe鏈路初始化時由鏈路訓練狀態(tài)機完成物理層映射鏈接搭建。
PCIe差分信號采用高速布線原則進行布線,對于TX,RX全鏈路(包含過孔)的TDR單端阻抗要求為50±5Ω,差分阻抗要求為100±10Ω。另外在等長布線的基礎(chǔ)上,還需要lane間的衰減相等。
FPGA配置功能包括復位狀態(tài)監(jiān)控及分配管理、參考時鐘配置管理、PCIe Switch配置管理等功能。上游復位信號由金手指的RESET#引腳接入FPGA,然后分別輸出至下游的兩個插槽,以及PCIe Switch芯片的復位引腳。FPGA根據(jù)上游復位信號狀態(tài)管理當前PCIe Switch配置信息。參考時鐘默認由上游金手指的REFCLK差分引腳輸入,并經(jīng)過ICS9DB803功分三路分別接入下游的兩個插槽及PCIe Switch參考輸入引腳。
PCIe Switch配置空間信息一般由操作系統(tǒng)在系統(tǒng)上電后進行配置,但是除了頭標區(qū)64 Byte以外的配置寄存器一般由EEPROM在初始化時讀入設(shè)定值且不再更改[13]。在常規(guī)應(yīng)用中,該方法可行,但是在需要動態(tài)修改PCIe Switch狀態(tài)信息的情況下時,缺乏靈活性。文中著重討論采用FPGA由Switch芯片的Slave SMBus總線接口進行在線配置PCIe配置空間的方法。
根據(jù)上述分析,F(xiàn)PGA首先需要實現(xiàn)SMBus主機總線接口的功能,用以與Switch芯片進行通信。在底層通信實現(xiàn)的基礎(chǔ)上,對PCIe Switch的配置空間進行訪問,實現(xiàn)動態(tài)管理功能。
SMBus(系統(tǒng)管理總線)是基于I2C總線架構(gòu)的兩線制接口,各設(shè)備之間以及設(shè)備與系統(tǒng)的其他部分之間可以通過SMBus總線互相通信而不占用系統(tǒng)資源。SMBus總線設(shè)備分為主設(shè)備和從設(shè)備兩種,主設(shè)備是用于發(fā)布命令、產(chǎn)生時鐘和終止發(fā)送的設(shè)備;從設(shè)備是用于接收或響應(yīng)命令的設(shè)備[14]。在該設(shè)計中,F(xiàn)PGA實現(xiàn)主設(shè)備功能,通過PCIe Switch芯片的Slave SMBus接口訪問并配置寄存器。
在SMBus總線上,任何一個作為從模式的設(shè)備都有唯一的地址,即從設(shè)備地址。PCIe Switch從地址由引腳SSMBADDR[5,3:1]進行設(shè)置,該設(shè)計中全部置0。
SMBus總線由一條數(shù)據(jù)線(SDA)和一條時鐘線(SCL)組成,通信基本狀態(tài)由起始位、8位數(shù)據(jù)位、ACK相應(yīng)位以及終止位組成。SMBus總線的單字節(jié)傳輸時序圖如圖4所示。
圖4 SMBus總線單字節(jié)傳輸時序圖
根據(jù)上述分析,8位數(shù)據(jù)+1位ACK組成了總線通信協(xié)議的最小傳輸單元,實際的通信數(shù)據(jù)由多個字節(jié)與對應(yīng)的ACK信號組成。當執(zhí)行寫操作時,數(shù)據(jù)位由主設(shè)備提供,ACK位由從設(shè)備返回0作為有效響應(yīng)值,返回1表示無效并終止當前操作;當執(zhí)行讀操作時,數(shù)據(jù)位由從設(shè)備提供,ACK位由主設(shè)備返回1作為有效響應(yīng)值,表示不會接收更多的字節(jié),此時響應(yīng)位即為NACK。
在數(shù)據(jù)傳輸過程中,只有在SCL信號為低電平時允許SDA變化,而在SCL為高電平時,SDA必須保持穩(wěn)定。SMBus總線規(guī)范要求的最大傳輸速度為100 kHz,最小傳輸速度為10 kHz,即SCL周期為10~100μs。此外,SMBus具有超時功能,因此當SCL太低而超過35 ms時,從器件將復位正在進行的通信。
SMBus總線操作分為兩種模式,一種是Byte字節(jié)模式,一種是Block塊模式,PCIe Switch的SMBus操作同樣兼容兩種操作方式。首先實現(xiàn)的方式是效率更高的Block塊訪問模式。PCIe Switch的Slave SMBus塊讀寫操作協(xié)議如圖5所示。
圖5 SMBus塊讀、寫操作協(xié)議
FPGA訪問Slave SMBus的通訊模塊分為Block Read和Block Write兩個子模塊,分別與上述兩個通訊協(xié)議相對應(yīng)。分析協(xié)議可知,Block讀操作以寫操作為先導,包含Master和Slave的交互操作。以Block讀模塊為例進行詳述設(shè)計,內(nèi)容如下:
讀取配置寄存器首先由Master發(fā)起寫操作,分別由總線地址碼、CCODE命令碼、操作字節(jié)長度碼、讀命令碼、配置寄存器地址碼組成,然后Slave執(zhí)行回傳操作,在Master操作碼的基礎(chǔ)上增加數(shù)據(jù)碼。圖6為Block讀操作的狀態(tài)轉(zhuǎn)移簡圖,詳細描述了讀操作的核心狀態(tài)機切換功能。此外ACK應(yīng)答異常響應(yīng)處理程序會根據(jù)SDA狀態(tài)判定當前的SMBus總線狀態(tài),選擇是否主動退回至IDLE狀態(tài)。
圖6 Block讀操作狀態(tài)轉(zhuǎn)移簡圖
采用Verilog HDL語言設(shè)計Block讀寫模塊代碼及Testbench仿真測試文件,并采用ModelSim SE軟件對上述代碼進行邏輯仿真[15-16],得到對應(yīng)的波形如圖7所示。
圖7 Block讀、寫仿真時序圖
在仿真設(shè)計文件中插入了ACK應(yīng)答無效的情況,模擬SMBus總線通信異常時的主機響應(yīng)情況。從邏輯仿真時序圖可以看到,主機Block操作進程能夠從應(yīng)答異常情況下恢復,并自發(fā)重啟當前操作,同時給出異常報警指示。
PCIe總線在軟件上向前兼容PCI總線,并完整地繼承了PCI總線中配置空間(Configuration Header)的概念。在PCIe總線中Header1代表橋設(shè)備,Switch每個端口(Port)都可以對應(yīng)于PCI總線中PCI-to-PCI橋的概念。也就是說,Switch中一般都有多個類似于PCI-to-PCI橋的設(shè)備[17]。
PCIe配置模塊實現(xiàn)了對Switch配置寄存器的訪問、管理以及設(shè)置功能。系統(tǒng)上電初始化階段結(jié)束后,根據(jù)應(yīng)用需要動態(tài)調(diào)整PCIe Switch的設(shè)定參數(shù)及功能目標。PCIe Switch的配置空間類型為Type1,配置頭標區(qū)為0x000到0x03F共64 Byte,包括總線號、BAR空間地址分配等初始化信息。其余寄存器空間中需要動態(tài)調(diào)整的部分寄存器如表1所示。
表1 動態(tài)配置寄存器表
根據(jù)應(yīng)用需求,Switch配置程序?qū)ο鄳?yīng)的配置寄存器進行配置,并根據(jù)讀數(shù)據(jù)給出配置完成情況。此外,程序會定時讀取所有寄存器值并進行暫存,以備供電異?;蛘邚臀恍盘枲顟B(tài)異常時重新恢復讀值,出現(xiàn)總線無應(yīng)答或者寫入失敗現(xiàn)象時,由外置LED狀態(tài)進行顯示。
FPGA程序功能仿真完成后,進行綜合布局布線,然后通過Vivado進行在線調(diào)試,Debug完成后再將生成的.mcs文件燒入Flash芯片。
PCIe Switch擴展板上游為金手指,可以直接插入系統(tǒng)主板,下游兩個插槽可以直接插入PCIe網(wǎng)卡等其他PCIe設(shè)備。測試系統(tǒng)采用x86主板平臺,下游設(shè)備選用E82571千兆網(wǎng)卡。在系統(tǒng)測試前,首先對擴展板硬件進行上電調(diào)試,確認Switch芯片供電正常后再插入主板進行測試。PCIe鏈路上的所有設(shè)備隨著系統(tǒng)上電啟動進行初始化,完成BAR空間分配、PCI總線地址分配、設(shè)備驅(qū)動加載等工作。
測試分為SMBus總線通訊測試和PCIe Switch動態(tài)功能測試兩個內(nèi)容。首先通過Vivado軟件的Debug功能對PCIe Switch芯片的配置寄存器讀寫訪問進行測試,測試表明SMBus總線讀寫操作正常。部分測試項目及測試結(jié)果如表2所示。
表2 SMBus總線測試結(jié)果
FPGA對PCIe Switch的動態(tài)設(shè)置采用異步交互方式切換設(shè)定。選取Switch Control&Status類寄存器進行測試,依次設(shè)置Fundamental Reset、Hot Reset、Disable Link Down Hot Reset等功能,觀察擴展板工作狀態(tài),并通過遠程訪問下游E82571網(wǎng)卡工作狀態(tài),監(jiān)控PCIe鏈路工作情況。測試結(jié)果表明FPGA能夠通過SMBus總線設(shè)定動態(tài)功能,系統(tǒng)運行穩(wěn)定、正常。
國產(chǎn)PCIe Switch芯片豐富了PCIe鏈路的拓撲結(jié)構(gòu),使PCIe總線更具擴展性和通用性。通過對Switch擴展卡的測試表明,基于FPGA的可編程特性能夠充分利用國產(chǎn)Switch芯片的各項功能,在不調(diào)整硬件PCB的情況下適用于更多的應(yīng)用場景,同時探索了在不占用PCIe總線資源的方式下,利用SMBus總線訪問PCIe配置空間并進行動態(tài)設(shè)置及狀態(tài)監(jiān)控,為后續(xù)國產(chǎn)PCIe Switch芯片的大規(guī)模應(yīng)用奠定了基礎(chǔ)。