劉文元
(中國電科網絡通信研究院,河北 石家莊 050011)
隨著物聯網時代的到來,嵌入式系統的以太網設備需求量與日俱增,而負責以太網數據編碼和傳輸的物理層收發器的需求量也隨之增長。在加快集成電路產業自主可控步伐的趨勢下,PHY 芯片的研發工作正如火如荼地進行。
芯片的測試工作,是芯片在流片完成之后,交付給客戶之前的重要一環,旨在驗證芯片的硬件功能,為終端用戶提供驅動程序的代碼原型。在產業實踐中,對于PHY 的UVM驗證工作雖有文獻可參考,但對于PHY 芯片的板級測試問題,尚無統一的標準,需要開發者自己按照PHY 的數據手冊編寫驅動。若沒有PHY 芯片廠商提供直接的技術支持,調試過程就會面臨苦難。
考慮到用戶可能會面臨的PHY 調試問題,基于一款自主研發的GPHY(Gigabit Physical Layer Transceiver)的功能驗證工作,本文首先介紹了GPHY 測試系統的架構,也即GPHY 的典型使用場景;然后著重論述了測試程序的設計,提出了將數據分階段loopback 的測試方法;最后展示了測試過程中的系統日志和基于LwIP 的網絡實驗結果。希望能為同行的以太網PHY 功能測試和應用開發提供參考經驗。
以太網是遵守IEEE 802.3 標準的局域網,TCP/IP 參考模型中的物理層(PHY)一般由專用的數模混合集成電路來實現,即PHY 芯片,而與之直接交互的就是數據鏈路層中的介質訪問控制子層(MAC),因此PHY 芯片的功能驗證離不開MAC 的支持。
為了驗證GPHY 的功能,本文選取了一種基于Cortex-M4 內核的32 位微控制器(MCU),它的APB 總線上掛載的以太網外設模塊支持千兆速率MAC(GMAC)的功能。以太網外設模塊中還集成了站管理接口(SMI),專門用于和外部PHY 之間的通信,以訪問PHY 芯片的寄存器。MCU 與GPHY 通過標準的千兆介質獨立接口(GMII)來連接,GMII 提供了時鐘和數據的傳輸途徑。
為便于在線調試和單步跟蹤,選擇了使用非常廣泛的Keil-5 作為測試程序的開發環境,該環境自帶了交叉編譯工具,方便用戶移植本測試程序到特定的應用場景。程序的在線調試與跟蹤依賴調試器CMSIS-DAP Debugger,它通過Jtag 接口與MCU 相連接,通過USB 接口與PC 相連接。此外,MCU 的UART 通過RS232 與PC 的串口相連接,在PC端開啟串口調試助手,可以查看包括了程序運行狀態、PHY寄存器狀態和測試信息的系統日志。PC 機上的網線通過水晶頭插在RJ-45 上,RJ-45 與PHY 芯片之間有一個負責電壓變換的器件H5007,二者之間的引線MDI+/-上傳輸的是差分信號。GPHY 測試系統的架構圖,如圖1所示。

圖1 GPHY 測試系統架構圖
為了方便逐級厘清PHY 測試中的問題,本文根據以太網數據信號的流經途徑,設計了兩種類型的環回測試,內部環回和外部環回分別如圖2和圖3所示。

圖2 GPHY 內部環回結構圖

圖3 GPHY 外部環回結構圖
PHY 內部環回用以檢查PHY 內部數據流是否正常。期望的正常情況是 RXD[7:0]上的信號與TXD[7:0]上的信號相同,只是存在一段短暫時間上的滯后。在測試程序內部,邏輯應這樣設計:數據發送后,比較接收數據緩沖區與發送數據緩沖區之間的數據差異,即可判斷該項測試是否通過。若數據相同,則符合預期,測試通過;否則,測試未通過,這時系統會通過串口打印出數據差異的所在位置和錯誤提示信息。在PC 機上,開發人員根據這些日志,便可迅速定位問題。
在進行外部環回測試前,需要在RJ-45 上插入一個特制的水晶頭。該水晶頭的差分信號線要按照圖3所示,把對應的差分信號線進行互連,水晶頭插入RJ-45 后,就實現外部環回測試所需的信號連接。外部環回與內部環回的測試程序是一致的,差異點僅在于:外部環回模式要把GPHY 的0地址寄存器中的bit14 清零,以解除內部環回模式。
環回測試的流程如圖4所示,其主要完成了如下6 項內容。

圖4 環回測試流程圖
(1)設定系統時鐘,給APB 總線上的ETH 模塊提供125 MHz 的PLLCLK。
(2)UART 初始化,將UART 速率配置為“115 200 bps,8 bit,無校驗位”格式。通過重定義標準庫中的fputc實現對printf 函數的重定向,從而在日志中使用printf 格式化運行過程中變量,如寄存器的值、錯誤類型等,重定向的實現代碼如下所示:


在調試階段,我們期望盡可能詳細地觀察程序運行過程中的狀態,而調試完成后,只想看關鍵的運行結果,忽略調試階段加入的日志。為了實現這一目的,通過如下所示的宏函數來輸出系統日志,便可動態地調整的日志等級。例如,當調試完畢后,進行循環的壓力測試時,可以把宏函數LOG()中的“level>=DBG”修改為,“level>=INFO”,那么調試階段所加入的DBG 等級的日志便不會輸出。

(3)為了測試不同速率(10M-Base/100M-Base/1000MBase)、雙工/ 半雙工(Full/Half Duplex)、環回/ 非環回(Loopback/Non-Loopback)、是否自協商 (Auto-Negotiation)等模式的組合情況,我們設計了統一的多參數函數,來對PHY 寄存器的設定內容進行封裝,函數聲明如下所示:
int PHY_TEST(int rate, bool duplex, bool loopback, bool Auto-Neg);
PHY 寄存器的讀寫依賴SMI 接口,我們封裝了讀寫操作的API,其聲明如下:
unsigned short SMI_Read(unsigned short Address);
void SMI_Write(unsigned short Address, unsigned short Data);
因為IEEE802.3 規定的PHY 寄存器的地址和數據寬度都是16 比特,故采用unsigned short(無符號半字)類型作為形參和返回值的類型。SMI_Read()用于查詢PHY 的狀態標志位,如Link 狀態、速度模式、自動交叉線等。SMI_Write()用于把PHY_TEST()傳入的形參寫入到PHY 的寄存器對應的比特位。
(4)在設定以太網發送數據包時,我們把源地址和目標地址固定下來,數據段長度設定為最大1 500,類型為ARP 數據包,除了地址和包長度之外,其他數據使用rand()生成的偽隨機數來填充,這樣隨機化的數據讓測試更接近真實使用PHY 時的情況。
(5)為實現對ETH_DMA 接收和發送描述符的設定,編寫了如下的API:
void ETH_DMA_Desc(void *TxBuf, int TxSize, void*RxBuf, int RxSize);
ETH 發送數據時,ETH_DMA 從地址TxBuf 處搬移數據到GMII_TXD[7:0];ETH 接收數據時,ETH_DMA 從GMII_RXD[7:0]搬移數據到RxBuf。
(6)查詢ETH_MAC 的接收標志位,若沒有置位則循環查詢,當循環的累積的次數超過了設定的上限,說明沒有接收到數據,使用如下語句輸出錯誤日志:
LOG(ERR,“ Receive polling timeout”);
若查詢到ETH_MAC 的接收標志置為1 時,表示接收到了有效數據,并且接收已完成,這時通過對比接收到的數據包內容與發送時的數據包內容,如相同,則表明PHY 功能正常;如不同,則用如下語句輸出錯誤日志:
LOG(ERR, “Index:%u, Expect: %u,Real:%u ”, i,TxBuf[i], RxBuf[i]);
為了檢驗GPHY 穩定性,在main 函數內,循環調用PHY_TEST(),內部環回和外部環回測試若都能通過,即可證明GPHY 功能正常。GPHY 的功能有保障后,再移植TCP/IP 協議棧LwIP,不需要操作系統,即可實現ping 命令測試、TCP-Server 等功能。
內部環回和外部環回的測試結果如圖5、圖6所示,圖中展示的是壓力測試過程中的系統日志,cnt 表示測試的計數,每循環調用一次PHY_TEST();[result]后的內容表示測試的結果,fail 或pass。

圖5 內部環回測試結果

圖6 外部環回測試結果
環回測試完成后,確保了PHY 可工作正常,通過LwIP協議棧,可以實現MCU 作為TCP Server,在window 的命令行中,用ping 來測試PC 機與MCU 之間的網絡通路,實驗結果如圖7所示。

圖7 ping 測試結果
同時借助網絡調試助手,在PC 機上通過TCP Client 協議,連接上作為TCP Server 的MCU,我們在MCU 的應用程序里設計Server 將收到的數據,再發送回給client,實驗結果如圖8所示。

圖8 TCP-Server 測試結果
本文介紹了千兆以太網物理層收發器測試系統的架構,提出了根據數據流分階段對GPHY 進行環回測試的方法,闡述了環回測試程序的設計和實現,其中設計的可分級調整的日志系統與統一的測試函數接口,方便了多輪循環壓力測試。最后,展示的兩種環回測試的日志和基于LwIP 的ping與TCP-Server 測試結果,表明本文提出的測試方法科學有效,有利于快速定位問題,代碼易于復用,同時可以為其他PHY 測試工作提供參考。