本文介紹Xilinx GT的一些概念,對GT沒有概念但是有時間的童鞋推薦先看一下此文(Xilinx 7系列FPGA 高速收發器GTX/GTH的一些基本概念),補充一些基礎概念。
隨著高速數據傳輸的普及,Serdes已經成為FPGA上重要的I/O接口。而線速率也不斷的提高。更高的線速率也就帶來了更大的通道衰減影響。通常,Serdes接收端需要打開內部的均衡來對高速串行信號進行處理,保證內部的有效信號能夠等到放大而噪聲可以被抑制,并最終恢復出正確的數據。
通常,高速信號到達接收端的Pin位置,稱為遠端;進入Pin后,被接收端的均衡處理之后的信號,稱為近端。在一些均衡能力比較優秀的Serdes上(例如Xilinx的GTX/GTH),遠端處的眼圖(可以通過高速示波器進行測量)無法睜開,但是近端處的眼圖可以完全睜開。這就是均衡器無法忽視的重要作用。
這也帶來一個問題,就是如何測量眼圖。針對遠端眼圖,可以通過高速示波器來進行測量。但是這個測量在很多情況下并不容易,比如沒有足夠高速的示波器,或者由于FPGA多為BGA封裝導致Serdes的RX Pin沒有合適的測試點來進行測試。而近端眼圖,由于近端的定義就是在Serdes的PMA內部,所以沒有使用高速示波器直接測量眼圖的可能。那么如何評價近端眼圖,就成了一個問題。
Xilinx 7系列(及以后)的GTX/GTH中提供了2D眼圖測量的功能,通常稱呼為2D eye scan,可以用來測量近端眼圖。Xilinx提供的GT測試工具ibert中,就是利用這個功能進行眼圖的測量。
圖片來自UG908
關于GT的基本結構和eye scan的具體原理,由于文檔已經做了充分的描述,這里就不重復贅述了。下文將會用簡單通俗的語言來描述2D eye scan的基本原理,出發點是易于理解。所以在準確性和嚴謹程度上肯定有所欠缺,這里先說一聲抱歉。
從字面分析,2D eye scan的意思就是二維眼圖掃描。二維的意思自然是橫縱兩個坐標。所以眼圖掃描的基本原理就是將二維眼圖的最大范圍坐標化,將眼圖整體變為一個二維矩陣區域。
眼圖掃描的過程就是依次遍歷眼圖的二位矩陣區域,并和眼圖掃描的正中間區域做對比,記錄錯誤值,然后依據錯誤值,用不同的顏色來繪制當前二位矩陣中某個點,最終組成一個眼圖。
用更通俗的話來解釋,就是眼圖被劃分為一個分辨率是N*M的圖片。測量眼圖的時候會依次遍歷N*M個點,并和中心點的數據做對比。多次對比后記錄值不一樣的次數,即誤碼率。當遍歷完N*M個點之后,依據每個點記錄的誤碼率來用不同的顏色繪制一副圖,即為眼圖。
圖片來自UG476
從上圖的左邊可以看到,每一個點相對中心點都有一個水平偏移量和垂直偏移量,這就等價于每個點的坐標值(至于0,0點在左下角還是在中心點都只是簡單的坐標變換而已)。
從圖中的右邊可以看到,最終眼圖的顏色是依據誤碼率繪制的,結合前文來自UG908的截圖,可以清楚的看到當誤碼率越低,顏色越偏向藍色(深藍色);當誤碼率越高,顏色越偏向紅色。理論上,越接近中心的點,誤碼率越低,所以越偏藍色,而越接近外圍的點,誤碼率越高,所以越偏紅色。所以實際獲取的眼圖樣子,是中心藍色,四周紅色的眼圖。
所以從原理上說,2D眼圖的測量步驟其實是遍歷整個N*M的點陣,計算每一個點與中心點數據值的誤碼率。當得到點陣誤碼率的數據之后,后面僅僅是繪圖以便美觀顯示的事情。
具體的測量細節可以參考UG476的第四章。這里直接給出結論,內置的2D eye scan是逐個點進行測量的,所以每次測量只需一組坐標值。從微觀看來,逐點測量由于是串行的,所以是比較慢的。但是從宏觀來看,整體測量速度是比較快速的。
另外一個優點就是,眼圖的測量不需要特殊的配置和數據,也不會對數據鏈路帶來任何負面影響。由于是和中心點數據的對比,所以無論GT跑的是什么數據流,都可以進行測量,也沒有影響。這就擴展了這一功能的使用范圍。例如ibert的誤碼率只能統計PRBS,無法用于實際數據的統計/測試。而這一功能可以實時測試,不影響GT正常業務的運行。將這一功能集成到最終版本中,可以作為實時監控高速鏈路質量的一個參考標準。
如果GT無法正確回復出數據,則中心點的數據不會穩定。這樣統計出來的結果也不會穩定的顯示為一個眼睛的圖案,而是一個奇怪的圖案。如果GT能正確恢復出數據,那么中心點一定是穩定的數據,所以無論眼圖是否睜開,張開多大,大體的形狀還是一個眼睛的圖案。進而,眼圖張開的大小就代表信號質量的好壞。所以2D eye scan的結果對鏈路信號質量的判斷,是非常有幫助的。
由于是逐點測試,所以這個過程相對來說更適合基于CPU/MCU的軟件來實現。Xilinx提供了兩個XAPP來實現該功能,其核心的控制都是交給MCU軟核MicroBlaze來實現的。
https://www.xilinx.com/support/documentation/application_notes/xapp743-e...
https://www.xilinx.com/support/documentation/application_notes/xapp1198-...
下面介紹一下具體的操作步驟。
首先,eye scan的具體操作是需要使用DRP的端口,這一端口也是容易和CPU接口適配的。
使用DRP端口的優點是,主要步驟不占用FPGA可編程邏輯資源。代價是這個結構更適合MCU接口的實現,如果使用普通邏輯資源實現,會需要設計接口。
1.部分默認端口可以直接連接到地,例如:
EYESCANMODE
EYESCANTRIGGER
EYESCANRESET端口如果不需要使用,也是可以連接到地。
2.下面幾個信號設置為1
ES_SCAN_EN
PMA_RSV2[5]
ES_ERRDET_EN
ES_QUAL_MASK=(80’b1)
3.根據位寬(RX_INT_DATAWIDTH)設置ES_SDATA_MASK
40-bit 位寬: ES_SDATA_MASK = (40'b1, 40'b0)
32-bit位寬: ES_SDATA_MASK = (40'b1, 32'b0, 8'b1)
20-bit位寬: ES_SDATA_MASK = (40'b1, 20'b0, 20'b1)
16-bit位寬: ES_SDATA_MASK = (40'b1, 16'b0, 24'b1)
4.根據誤碼率設置ES_PRESCALE,關于這個參數的值,可以暫時跳過,等看完下文,理解原理之后再選擇合適的值寫入。
上述設置只需要設置一次即可。其中要注意,ES_QUAL_MASK和ES_SDATA_MASK都是80bit數據,需要分多次才能寫入。7系列的GTX/GTH,DRP數據位寬為16bit,所以需要5次才能完成80bit的寫入。
開始遍歷每一個點(即每一對橫縱坐標)。橫軸由ES_HORZ_OFFSET控制,縱軸由ES_VERT_OFFSET控制。
1.對每個點,將縱坐標寫入ES_VERT_OFFSET
這里需要注意,ES_VERT_OFFSET和ES_PRESCALE的地址是一樣的,高5bit是給ES_PRESCALE使用,低9位給ES_VERT_OFFSET使用。對于ES_VERT_OFFSET,0-7bit作為地址使用。第8位作為一個控制位,先填入0。DFE條件下后續還需要用到。
2.將橫坐標寫入ES_HORZ_OFFSET
3.將ES_CONTROL的低兩位設置為2'b01
這里需要先讀取出來,然后將低位設置位01,高位不變,再寫入ES_CONTROL寄存器中。
4.循環查詢es_control_status寄存器的值,如果發現最低位是1,表明采樣/記錯計數器溢出了,該點統計完畢(關于兩個計數器的含義,下文在做討論)。此時可以將ES_CONTROL的最低兩位設置為2'd00,以便于下一個點的測量。
5.讀取ES_ERROR_COUNT和ES_SAMPLE_COUNT寄存器的值,分別為記錯寄存器和采樣寄存器。
6.計算一下誤碼率
誤碼率的計算公式為,誤碼數目 / 采樣數目。
誤碼數目即為ES_ERROR_COUNT的值,如果該值為0,則誤碼率直接為0。
采樣數目的計算則相對負責。具體公式為:
SAMPLE/_COUNT=ES/_SAMPLE/_COUNT/times2^{(ES/_PRESCALE+1)}/times RX/_INT/_DATAWIDTH
可以看到,具體的采樣數和ES_SAMPLE_COUNT的值是有一個非線性的計算關系。
通過上述公式可以計算出采樣數的值,然后參與運算即可獲取誤碼率這一數據。
7.當使用DFE的時候,需要將ES_VERT_OFFSET的第八位設置為1(前文描述設置為0),然后重新測試一邊,計算出另一個誤碼率,和設置為0的誤碼率取一次平均才為最終的誤碼率。
這樣就完成一個點的測試了。
所以測試的大體流程就是先設置好一些固定的參數,然后設置橫縱坐標,開始測試。等測試結束后獲取采樣數和錯誤數兩個值,計算誤碼率即可。DFE模式下需要將縱坐標的一位取反后重新測算一下,然后兩個誤碼率取平均。
這里就能看出來測試的具體細節。內部測試提供了兩個計數器,一個用于統計采樣次數,另一個用于統計錯誤次數。測試過程其實就是進行多次的數據對比。對比一次,采樣次數加1,如果數據不對,則錯誤次數也加1。等到兩個計數器有一個溢出的時候就可以結束統計了。這樣會有兩種情況。
1.錯誤計數器溢出,采樣計數器沒有溢出,此時錯誤值比較大,可以保證精度。
2.采樣計數器溢出,錯誤計數器沒有溢出,此時采樣值比較大,誤碼率往往比較低。
由于兩個技術器溢出值相差非常大,所以不可能同時溢出。如果都沒有溢出,那么測試就不會停止。
用這種方法,可以獲取一個比較好的測試精度結果,也便于測試流程的控制。
另外,理解了這一流程,并觀察采樣值的計算公式,就能反推出ES_PRESCALE比較合適的值。
通過逐點的測量,就可以獲取完整的眼圖數據,然后進行繪圖即可。
2D eye scan的原理就分析完了。
下面分析一下實際操作中的一些問題。
1.ES_PRESCALE:如果確定這個值
這個參數實際控制的是采樣數的計算結果。通常情況下,通過公式反推,選區一個固定值就好。但是實際情況下,如果使用動態的控制,可以提高精度。關于這部分的討論就非常深入了。有興趣的童鞋可以再熟悉2D eye scan之后進行研究。
2.采樣點的數量:一定要逐點嗎
從手冊中可以查詢到ES_HORZ_OFFSET和ES_VERT_OFFSET的范圍。實際操作中,其實并不需要逐點測試。從圖片的角度觸發,逐點(或者點間隔較小)的好處就是圖片的分辨率較高。同時弊端就是花費的時間較長。通常使用中并不需要非常高的眼圖分辨率,尤其是并不需要將眼圖美觀的繪制出來的條件下,適當加大間隔可以快速獲取眼圖的基本信息。依據基本信息再考慮是否提高精度,改變參數等操作,更為合適。ibert中也提供了調整采樣點間隔的選項。
3.關于ibert眼圖顯示的美觀性和眼圖的顯示
根據上述分析,眼圖最終結果其實是一個顆粒感比較強的圖片。ibert中較為平滑/美觀的眼圖其實是美化過的結果。右鍵點擊眼圖彈出的菜單中可以選擇沒有沒畫過的點陣圖。
ibert繪制的平滑眼圖
ibert的原始點陣眼圖,每個點為細長的橫條形狀
以上兩張圖為同一次測量后調整ibert顯示參數獲取的不同效果,可以看到ibert默認顯示是經過了美化的。而原始圖就是一個顆粒感很強的點陣圖。
下圖為自行設計/實現2D eye scan后自行繪制的眼圖。
自行實現2D eye scan測量后繪制的眼圖
原始數據已經有了的情況下,眼圖的繪制其實只是一個繪圖的軟件設計。考慮到大部分FPGA開發者可能并不擅長于圖形界面的開發,所以推薦了解一下tk繪圖。不過更好的方案是讓專業的人做專業的事情。通過基本的數據,即使沒有繪圖,也能做很多事情了。
4.DRP如何控制
官方推薦的方案是利用MCU來進行控制,比如MicroBlaze的軟核。
另外可以通過JTAG,由PC發起控制。原廠方案為AXI JTAG。
本人是通過TCL和JTAG來控制VIO接口,進而控制DRP端口的。關于這個方案,除了控制DRP端口,還可以控制BRAM。具體可以參考專欄文章:Vivado功能完善:如何用Tcl/VIO更新BRAM中的數據
5.寄存器的地址
上文的描述中最大的問題就是沒有介紹寄存器和相關的地址。關于各個寄存器的名稱再文章已經給出了。具體的地址可以參考UG476的附錄D(通常都是最后一個附錄)。
ES_QUAL_MASK 0x031~0x035
ES_SDATA_MASK 0x036~0x03A
PMA_RSV2 0x082
ES_ERRDET_EN 0x03D
ES_EYE_SCAN_EN 0x03D
ES_CONTROL 0x03D
ES_PRESCALE 0x03B
ES_VERT_OFFSET 0x03B
ES_HORZ_OFFSET 0x03C
es_control_status 0x151
ES_ERROR_COUNT 0x14F
ES_SAMPLE_COUNT 0X150
這里給出7系列GT的部分寄存器地址。
整套方案可以移植到UltraScale/UltraScale+的GT上,需要注意的是,寄存器地址需要重新核對一下。可以確定很多寄存器的地址/定義都不一樣。
編輯:hfy
-
收發器
+關注
關注
10文章
3397瀏覽量
105864 -
示波器
+關注
關注
113文章
6190瀏覽量
184521 -
寄存器
+關注
關注
31文章
5317瀏覽量
120008 -
Xilinx
+關注
關注
71文章
2163瀏覽量
121010
發布評論請先 登錄
相關推薦
評論