王 澧,王 蕾,張 玲(中國電子科技集團公司第58研究所,江蘇 無錫 214035)
一種PCIe總線MAC模塊的設計與驗證
王 澧,王 蕾,張 玲
(中國電子科技集團公司第58研究所,江蘇 無錫 214035)
摘 要:根據(jù)PCI Express 2.0協(xié)議,介紹了PCI Express總線的基本概念,并著重對物理層的基本功能以及內(nèi)部構成進行了詳細說明。在此基礎上,采用自頂向下的設計方法,完成了物理層中關鍵的MAC子層部分的電路設計。另外還搭建了一套驗證平臺,可自動生成數(shù)據(jù)包并進行比對,完成了模塊的功能驗證。最后使用FPGA進行驗證,PCIe接口可以正常工作,設計達到了預期的目標。目前用戶時鐘已穩(wěn)定工作在250 MHz,可以滿足大部分系統(tǒng)數(shù)據(jù)處理的需求。
關鍵詞:PCIe總線;MAC;FPGA
總線技術是系統(tǒng)設計中的關鍵技術,其性能的優(yōu)劣直接影響到系統(tǒng)性能。隨著處理器和外部接口的不斷提速,迫切需要速度更快、帶寬更大的總線。但是,隨著頻率的提高,傳統(tǒng)的并行總線由于結構的局限,信號間的相互干擾日趨嚴重,速度已達到瓶頸,無法滿足高速數(shù)據(jù)傳輸?shù)囊?,面臨淘汰的境地。而高速串行總線憑借速度快、抗干擾能力強、發(fā)展?jié)摿Υ蟮膬?yōu)勢,短短數(shù)年間幾乎全盤取代了傳統(tǒng)的并行技術,成為高速互連領域的絕對主導。高速串行總線摒棄了傳統(tǒng)的單端信號傳輸方式,使用了差分信號(differential signal)傳輸技術。與以往的并行信號相比,差分信號可以使用更高的時鐘頻率、更少的信號線,達到之前需要大量并行數(shù)據(jù)線才能實現(xiàn)的總線帶寬,并能克服天線效應對傳輸線路的干擾以及線路之間的串擾。目前典型的高速串行總線有USB、SATA、Rapid I/O、Ethernet和PCI Express等。
PCI Express(Peripheral Component Interconnect Express)全稱為外圍組件互聯(lián)擴展,簡稱PCIe,是由PCI SIG(PCI Special Interest Group)提出的第三代IO互連技術(3GIO),在保留PCI總線特性的基礎上,更注重數(shù)據(jù)通信的高實時性和高可靠性,已經(jīng)取代PCI在芯片到芯片級的應用或電路板傳輸系統(tǒng)中使用。
PCIe作為新興的高性能總線,技術優(yōu)勢明顯:可以向上兼容PCI規(guī)范;通過數(shù)據(jù)包(packets)在兩個設備間進行點對點的數(shù)據(jù)傳輸;每個通路使用2對低壓差分信號進行傳輸,可同時進行發(fā)送和接收數(shù)據(jù);支持熱插拔和熱交換;在2.0規(guī)范中單通路帶寬達到5 GB/s;通過流量控制和信用管理模塊有效利用總線資源;通過循環(huán)冗余校驗(ECRC)保證數(shù)據(jù)的可靠性。
圖1 PCIe總線層次結構
PCIe總線規(guī)范借鑒了OSI(Open System Interconnection)網(wǎng)絡模型,采用分層傳輸,各層次具有獨立功能又能緊密聯(lián)系。如圖1所示,數(shù)據(jù)傳輸從上至下需要經(jīng)過事務層(Transaction Layer)、數(shù)據(jù)鏈路層(Data Link Layer)和物理層(Physical Layer)。如圖2所示,物理層可細分為MAC(Media Access Control Layer)、PCS(Physical Coding Sub-Layer)和PMA(Physical Media Attachment Layer)子層。其中MAC子層主要對數(shù)據(jù)進行邏輯處理。PCS和PMA子層包含高速模擬收發(fā)模塊,需要使用全定制方式設計,因此一般用單獨的芯片或模塊實現(xiàn)。它們之間的接口信號遵循物理層接口規(guī)范PIPE(Physical Interface for PCI Express)。
圖2 物理層劃分
物理層作為PCIe總線的最底層,是整個體系中真正的核心。MAC層是數(shù)據(jù)鏈路層與物理層的接口,將上層的指令轉化為相關控制信號,通過PIPE接口傳送到PCS層,是控制物理層的關鍵模塊,本文將對其進行重點描述。
本文設計的PCIe端點(Endpoint)模塊支持PCIe 2.0協(xié)議,采用全正向設計,使用Verilog HDL語言,使用SMIC 40 nm制造工藝,將以硬核的方式存在。其中的PHY層采用Xilinx公司的Virtex-6 GTX。整體架構如圖3所示。
圖3 PCIe整體架構框圖
3.1概述
MAC子層位于PCS層和數(shù)據(jù)鏈路層之間,復位后LTSSM(Link Training and Status State Machine)狀態(tài)機對鏈路進行初始化和管理,接著通過PIPE接口收發(fā)數(shù)據(jù)、加擾/解擾、通道翻轉、對數(shù)據(jù)鏈路層收發(fā)數(shù)據(jù)包等。整個模塊由發(fā)送邏輯和接收邏輯組成,具體功能如圖4所示。
如圖4所示,MAC層發(fā)送數(shù)據(jù)的過程如下:
(1)從數(shù)據(jù)鏈路層獲得數(shù)據(jù)包TLP或DLLP,放入發(fā)送緩存Tx Buffer中。
(2)將這些數(shù)據(jù)包加入物理層的前綴和后綴,和物理層的PLP一起通過多路選擇器Mux,進入字節(jié)分配Byte Stripping部件。
(3)整個PCIe鏈路可能由多個Lane組成,Byte Stripping部件可以把數(shù)據(jù)分配到不同Lane中。
(4)數(shù)據(jù)進入到各自Lane的加擾Scrambler部件,加擾后進行8/10b編碼,最后經(jīng)過并轉串發(fā)送到PCIe鏈路中。
MAC層的接收過程是發(fā)送的逆過程。圖4中虛線以下部分由PHY部分來完成。
圖4 物理層邏輯細節(jié)
3.2總體設計
按照上述功能劃分,MAC層的整體框圖如圖5所示。
主要包括以下模塊。
圖5 MAC模塊框圖
RX_PIPE模塊:接收PIPE接口過來的數(shù)據(jù),并對接收的數(shù)據(jù)進行分類,將收到的鏈路訓練字符序列發(fā)送給Training Sequence Decoder模塊,TLP和DLLP數(shù)據(jù)則發(fā)送給Descramble模塊;
Scramble/Descramble模塊:對數(shù)據(jù)進行加擾/解擾處理;
Training Sequence Decoder模塊:對收到的鏈路訓練序列進行識別,并把識別的鏈路訓練信息發(fā)送給LTSSM模塊;
Byte Stripping/Byte Un-Stripping:根據(jù)鏈路訓練的結果,對Lane數(shù)據(jù)的順序進行調(diào)整;
Packet/Un-Packet:把數(shù)據(jù)加入物理層的前綴和后綴后打包,或將數(shù)據(jù)拆包;
LTSSM:主要實現(xiàn)鏈路訓練、重訓練、低功耗狀態(tài)控制等功能;
TX_PIPE模塊:主要完成LTSSM和Scramble數(shù)據(jù)的選擇,再發(fā)送至PIPE接口。
3.3LTSSM設計
PCIe初始化的流程比較復雜,整個鏈路訓練完全由硬件自動完成,與軟件無關,訓練成功結束后才能進行數(shù)據(jù)交換。訓練主要包括初始化端口配置信息、鏈路狀態(tài),了解對端的拓撲結構、確定數(shù)據(jù)傳輸速率、相位補償?shù)取?/p>
負責鏈路訓練的是狀態(tài)機LTSSM,共由“Detect”、“Polling”、“Configuration”、“L0”、“L0s”、“L1”、“L2”、“Recovery”、“Loopback”、“Hot Reset”、“Disable”11個狀態(tài)組成。其中每個狀態(tài)下還有數(shù)個子狀態(tài),遷移模型較復雜。“Detect”、“Polling”、“Confi guration”屬于鏈路訓練狀態(tài),完成遠端設備檢測、比特及符號鎖定、確認通道極性和數(shù)據(jù)速率、配置鏈路寬度和鏈路號以及通道反轉和極性反轉等功能?!癓0”、“L0s”、“L1”、“L2”是關于電源管理的鏈路狀態(tài),提供了幾種低功耗模式?!癛ecovery”是鏈路的重訓練狀態(tài),更改鏈路配置或故障時進入該狀態(tài)?!癓oopback”是一種調(diào)試模式,并不用于正常運行?!癉isable”狀態(tài)下將禁止PCIe鏈路。圖6顯示了狀態(tài)機所有關系以及狀態(tài)間的轉移。
圖6 LTSSM狀態(tài)機
狀態(tài)機的部分代碼如下:
always @(posedge core_clk or negedge core_rst_n) begin
if(~core_rst_n)
lts_state <= DETECT_QUIET; else
lts_state <= lts_next_state;
end
always @ (*)
begin
if(phy_lane_loop_back)
lts_next_state = DETECT_QUIET; else begin
case (lts_state) DETECT_QUIET: begin
if((cur_link_spd == 1'b1) | phy_lane_loop_back)
else if((and_rx_lane_elceidle == 1'b0) & (wait_timer > 512)) lts_next_state = DETECT_ACTIVE; else if(wait_timer >= 21'h16_E360 ) lts_next_state = DETECT_ACTIVE; else lts_next_state = DETECT_QUIET;
...
3.4加擾模塊
字節(jié)拆分后,數(shù)據(jù)包要進行加擾,接著再發(fā)送到通道中。加擾主要是通過減少數(shù)據(jù)的重復出現(xiàn)達到降低EMI噪聲的目的。也就是將數(shù)據(jù)和一個隨機序列進行異或操作成偽隨機數(shù),再發(fā)送出去。PCIe協(xié)議規(guī)定的生成隨機序列的LFSR的表達式為:
G(X)=X16+X5+X4+X3+1
加擾的規(guī)則如下:
(1)收到COM字符時,初始化LFSR;
(2)除了SKP字符以外,每收到一個字符,LFSR的值移位8次;
(3)除了TS1、TS2、EIEOS、Compliance Pattern以外的數(shù)據(jù)字符都需要進行加擾;
隨著時間的演變,使用廣泛的英語語言形式出現(xiàn)了各種區(qū)域性變體。英語方言也出現(xiàn)了具有區(qū)域性的語詞(語音和詞匯上的特點)和語法。一種方言的某一特征所占據(jù)的區(qū)域可能不同于同一方言的另一特征所占據(jù)的范圍,但各種特征的區(qū)域大體上具有某種一致性,從而使我們有可能談論一種方言的區(qū)域界限[3]。這是一條寬度不等的地域帶,在這里可能有兩種方言的混合形式。
(4)所有的控制字都不進行加擾;(5)LRSR的初始值為0xFFFF;
(6)Scramble在Detect狀態(tài)時使能,并且只允許在Confi guration狀態(tài)的結束階段被禁止;(7)Loopback狀態(tài)時,Scramble無效;LFSR的電路圖如圖7所示。
先對輸入數(shù)據(jù)的低8位進行加擾,再對高8位進行操作,其中低8位加擾的部分代碼如下所示:if (dsc_data_vld == 1’b1) begin
if((datak[0] == 1’b1) & (data[7:0] == `COM)) lfsr_tmpa = 16’hffff;
else if((datak[0] == 1’b1) & (data[7:0] == `SKP)) lfsr_tmpa = lfsr; else begin
lfsr_tmpa[0] = lfsr[8];
lfsr_tmpa[1] = lfsr[9];
lfsr_tmpa[2] = lfsr[10];
lfsr_tmpa[3] = lfsr[11] ^ lfsr[8];
lfsr_tmpa[ 4] = lfsr[12] ^ lfsr[ 9] ^ lfsr[8];lfsr_tmpa[ 5] = lfsr[13] ^ lfsr[10] ^ lfsr[9] ^ lfsr[8]; lfsr_tmpa[6] = lfsr[14] ^ lfsr[11] ^ lfsr[10] ^ lfsr[9]; lfsr_tmpa[ 7] = lfsr[15] ^ lfsr[12] ^ lfsr[11] ^ lfsr[10]; lfsr_tmpa[ 8] = lfsr[ 0] ^ lfsr[13] ^ lfsr[12] ^ lfsr[11]; lfsr_tmpa[ 9] = lfsr[ 1] ^ lfsr[14] ^ lfsr[13] ^ lfsr[12]; lfsr_tmpa[10] = lfsr[ 2] ^ lfsr[15] ^ lfsr[14] ^ lfsr[13]; lfsr_tmpa[11] = lfsr[ 3] ^ lfsr[15] ^ lfsr[14];
圖7 LFSR實現(xiàn)圖
lfsr_tmpa[12] = lfsr[ 4] ^ lfsr[15]; lfsr_tmpa[13] = lfsr[ 5];
lfsr_tmpa[14] = lfsr[ 6];
lfsr_tmpa[15] = lfsr[ 7];
end
end
else
lfsr_tmpa = lfsr; ...
在完成代碼編寫后,使用Synopsys公司的仿真驗證工具VCS進行功能測試,主要是驗證模塊是否能遵循協(xié)議,正確地發(fā)送用戶邏輯產(chǎn)生的數(shù)據(jù)包以及正確接收鏈路上的數(shù)據(jù)包。圖8是驗證環(huán)境的組成,分為主機和從機兩個部分,互相進行數(shù)據(jù)收發(fā)。其中從機是要測試的模塊,PHY使用Virtex-6 GTX模型,主機模型使用Virtex-6的PCIe模型。
在兩端的用戶程序部分,分別封裝了一系列task產(chǎn)生各種報文,供TC調(diào)用。
圖8 驗證環(huán)境框圖
4.1鏈路初始化
首先要對系統(tǒng)復位后鏈路初始化進行驗證,LTSSM進入L0狀態(tài)后才能進入正常工作。PCIe設備的物理層復位后,LTSSM狀態(tài)機沿著“Detect”→“Polling”→“Confi guration”→“L0”的順序進入正常工作狀態(tài)“L0”。
如圖9所示,RX端接收到TS1序列,其中Link Number為0,Lane Number為0~7,后經(jīng)過TS2確認,再向對端發(fā)送至少16個IDLE數(shù)據(jù),RX接收到后,置LinkUp狀態(tài)位為1,PCIe數(shù)據(jù)鏈路層將從DL_Inactive遷移到DL_Init狀態(tài),進入L0正常工作狀態(tài)。
4.2數(shù)據(jù)傳輸
進入正常工作狀態(tài)后,開始進行數(shù)據(jù)收發(fā)測試。如圖10所示,通過軟件構造出激勵源,在用戶接口端產(chǎn)生各種TLP報文。其中TLP 報文頭可以定制,報文長度可以定制,可以組合成各種報文類型,達到較高的測試覆蓋率。
圖9 LTSSM初始化
圖10 TLP報文生成界面
本文介紹了一種PCIe端點模塊的設計,重點敘述了MAC子層的設計實現(xiàn),通過功能仿真以及FPGA驗證,模塊可以正常工作,輸入時鐘250 MHz,達到了預期的設計目標。下一步將使用SMIC 40 nm工藝進行流片驗證。
參考文獻:
[1] 王齊. PCI Express體系結構導讀[M]. 北京:機械工業(yè)出版社,2010.
[2] 張銳,曹彥榮. 基于FPGA的PCIE總線接口設計[J]. 硅谷,2014(7).
Design and Verifi cation of MAC Layer Based on PCIe Bus
WANG Li, WANG Lei, ZHANG Ling
(China Electronic Technology Group Corporation No.58 Research Institute, Wuxi 214035, China)
Abstract:The paper is according to the PCI Express protocol, introduces the basic concepts of PCI Express bus and focuses on the basic function and structure of physical layer.On this basis, using TOP-DOWN design method,fi nish the circuit design of the MAC sub-layer,key part of physical layer.Additionally, we have build a verify platform, can automatically generate data packets and compare, fi nish the function verifi cation.The circuit has passed FPGA verifi cation after synthesis, PCIe interface can work normally. The design achieves the expected goal.Now theuser clock can work well at 250 MHz,can meet the most system’s data process requirements.
Keywords:PCIe bus; MAC; FPGA
中圖分類號:TN402
文獻標識碼:A
文章編號:1681-1070(2015)10-0020-06
收稿日期:2015-6-25
作者簡介:
王 澧(1982—),男,江蘇無錫人,本科,工程師,現(xiàn)在中國電子科技集團第58研究所從事電路設計工作。