孟妍,李琳,文月
(石家莊科技工程職業(yè)學(xué)院,河北石家莊,050000)
SpaceWire是一種全雙工、點(diǎn)對點(diǎn)、串行、高速(2Mb/s~400Mb/s)的網(wǎng)絡(luò)協(xié)議標(biāo)準(zhǔn)。歐空局于2003年將它納入標(biāo)準(zhǔn)。該協(xié)議可以用來靈活組建網(wǎng)絡(luò)。由于總線在異常響應(yīng)、故障保護(hù)與恢復(fù)、確定時間以及錯誤檢測方面做了相應(yīng)增強(qiáng),因此相比于其它的總線具有可靠簡單的優(yōu)點(diǎn)。它使得設(shè)計(jì)集成星上系統(tǒng)變得簡單,可以進(jìn)行低誤碼率、高速傳輸載荷數(shù)據(jù)以及控制信息。隨著SpaceWire應(yīng)用領(lǐng)域的不斷擴(kuò)大和深入,各種基于SpaceWire基礎(chǔ)協(xié)議的設(shè)備不斷出現(xiàn),這些設(shè)備在國外航空領(lǐng)域已經(jīng)得到廣泛應(yīng)用。隨著我國航天航空事業(yè)的發(fā)展,基于SpaceWire總線方面的設(shè)備也在不斷研發(fā)和提升。在設(shè)備聯(lián)調(diào)過程中,調(diào)試總線協(xié)議這一塊一直是一件復(fù)雜困難的事情。迫切需要一套總線協(xié)議測試設(shè)備來協(xié)助調(diào)試定位問題。為了保證測試設(shè)備的正常工作,就需要一臺模擬源設(shè)備對測試設(shè)備輸送各種測試數(shù)據(jù),用來分析測試設(shè)備是否正常工作。本文旨在設(shè)計(jì)一套基于Python的模擬源設(shè)備來完成對測試設(shè)備的測試,從而保證總線互聯(lián)設(shè)備的正常工作。
本文設(shè)計(jì)的模擬源設(shè)備主要用到圖1中對該測試設(shè)備的測試上。
被測設(shè)備A和被測設(shè)備B為基于SpaceWire總線標(biāo)準(zhǔn)的通信設(shè)備,被測設(shè)備A和被測設(shè)備B在開發(fā)聯(lián)調(diào)階段,總線之間的通信會出現(xiàn)各種bug。為了在出現(xiàn)總線異常時,可以分析原因幫助聯(lián)調(diào),需要一套測試設(shè)備來實(shí)時抓取總線協(xié)議進(jìn)行分析和定位。本系統(tǒng)對測試設(shè)備的需求如下:
(1)測試設(shè)備可同時監(jiān)測2路SpaceWire鏈路,鏈路速率最高400Mbps。每路SpaceWire鏈路包含4對LVDS,每2對組合一條數(shù)據(jù)通道(一對是Data信號一對Strobe信號);
(2)符合SpaceWire信號標(biāo)準(zhǔn)基礎(chǔ)部分(物理層、信號層、字符層);
圖1 設(shè)備結(jié)構(gòu)圖
(3)SpW監(jiān)測卡采用PCIe×8接口,通過對每個獨(dú)立字符加一個時間戳來實(shí)時監(jiān)測鏈路通信情況,時戳精度2ns;
(4)可監(jiān)測鏈路上的各種數(shù)據(jù)和狀態(tài):DS解碼解析出傳輸時鐘、解析出字符(數(shù)據(jù)和控制字符等)、無連接錯誤、斷開錯誤、超時錯誤(超過850ns)、奇校驗(yàn)錯誤、信用(Credit)錯誤、Escape順序錯誤等;并將錯誤狀態(tài)附加在對應(yīng)的字符,方便上位機(jī)軟件讀取顯示。
(5)基本操作:啟動接收、停止接收、重啟設(shè)備、打開/關(guān)閉SpW通道;
(6)通過PCIe上傳所有信息到主機(jī);
(7)實(shí)時統(tǒng)計(jì)信息(字符個數(shù)、包個數(shù)、控制字符個數(shù)、Null個數(shù)、奇偶校驗(yàn)錯誤、信用錯誤、Escape順序錯誤、超時錯誤等錯誤個數(shù))通過PCIe上傳到上位機(jī);可當(dāng)前清零;
那么測試設(shè)備也需要調(diào)試,如何來保證測試設(shè)備的可靠性,在用測試設(shè)備分析發(fā)現(xiàn)問題的時候,可以保證是總線設(shè)備A和B之間總線通信發(fā)生了問題,而不是測試設(shè)備本身存在bug。這就需要一臺模擬源設(shè)備,可以人為設(shè)計(jì)基于SpaceWire協(xié)議的各種協(xié)議以及正常和錯誤狀態(tài),來充分驗(yàn)證測試設(shè)備的可靠性,從而保證測試設(shè)備的正常工作。
模擬源設(shè)備需要滿足測試設(shè)備的要求,因此,模擬源設(shè)備要求如下:
(1)符合SpaceWire信號標(biāo)準(zhǔn)基礎(chǔ)部分(物理層、信號層、字符層),速率最高400Mbps;
(2)SpaceWire握手建立連接、流量控制;
(3)能模擬硬件鏈路錯誤(超過850ns無字符錯誤即斷開錯誤、奇偶校驗(yàn)錯誤、信用(Credit)錯誤、Escape順序錯誤)等;
(4)基本操作:啟動發(fā)送、停止發(fā)送、重啟設(shè)備、設(shè)置每條鏈路的線上速率等;
(5)數(shù)據(jù)操作:可編輯SpaceWire專用字符格式(FCT、NULL等)、可編輯要發(fā)送數(shù)據(jù)的格式(隨機(jī)數(shù)、遞增、遞減、選擇文件等);
(6)可滿負(fù)荷發(fā)送數(shù)據(jù);
(7)每個端口的第一路和第二路的關(guān)系聯(lián)動:能按照FCT對應(yīng)8個字節(jié)發(fā)送(也可設(shè)置多或少的關(guān)系);
(8)支持RMAP包協(xié)議;
RMAP全稱為遠(yuǎn)程存儲器訪問協(xié)議。為了實(shí)現(xiàn)使用SpaceWire網(wǎng)絡(luò)遠(yuǎn)程配置終端設(shè)備(路由器、節(jié)點(diǎn)等)的寄存器、獲取數(shù)據(jù)信息和實(shí)現(xiàn)傳輸控制,同時還可以監(jiān)測設(shè)備的工作狀態(tài)。依照協(xié)議規(guī)范,RMAP定義了三種數(shù)據(jù)操作類型,分別為寫操作、讀操作和讀改寫操作。RMAP寫操作指發(fā)起寫操作的事物端可以將數(shù)據(jù)寫到目標(biāo)存儲區(qū),寫操作還可以細(xì)分為無寫前校驗(yàn)有應(yīng)答、寫前校驗(yàn)有應(yīng)答、寫前校驗(yàn)無應(yīng)答和無寫前校驗(yàn)無應(yīng)答四種類型。RMAP讀操作指網(wǎng)絡(luò)中其他可讀的節(jié)點(diǎn)可以被事物發(fā)起端讀到,或者可以以郵箱以及寄存器的存儲映射。RMAP讀改寫操作指事物發(fā)起端可以先將目標(biāo)存儲區(qū)的數(shù)據(jù)進(jìn)行讀出,然后進(jìn)行修改以后再寫回目標(biāo)存儲區(qū)。
硬件系統(tǒng)采用Xilinx Kintex7開發(fā)板和FMC LVDS子板組成。邏輯架構(gòu)包括組幀部分、緩存部分和接口部分三部分。
組幀部分:基于SpaceWire協(xié)議發(fā)送各種測試序列以及模擬各種錯誤,支持RMAP包的發(fā)送。具體如下:
(1)握手:接口輸出置零,然后發(fā)10組FCT+NULL字符。
(2)發(fā)送幀序列。發(fā)送數(shù)據(jù)格式為1FCT+8DATA+1FCT+8DATA……。僅發(fā)送1次。
(3)產(chǎn)生無字符錯誤:發(fā)送幀序列1次,然后不發(fā)送任何字符,時間持續(xù)860ns,靜默19.2μs,然后重新握手(4組FCT+NULL字符)。
(4)產(chǎn)生奇偶校驗(yàn)錯誤:發(fā)送幀序列,僅1次,然后發(fā)送第三幀與第一幀相同,在最后一個字符時改成錯誤的校驗(yàn),(沒有EOP結(jié)尾),再靜默19.2μs,然后重新握手(5組FCT+NULL字符)。
(5)產(chǎn)生信用(Credit)錯誤:發(fā)送幀序列,僅1次,然后發(fā)送第三幀與第一幀相同,在最后8個data少發(fā)一個FCT,(沒有EOP結(jié)尾),再靜默19.2μs,然后重新握手(6組FCT+NULL字符)。
(6)產(chǎn)生Escape錯誤-1:發(fā)送幀序列,然后發(fā)送timecode(時間為0、1、2……遞增數(shù)),當(dāng)時間碼為11時,產(chǎn)生該錯誤,(時間碼不繼續(xù)發(fā)送新值),再靜默19.2μs,然后重新握手(7組FCT+NULL字符)。
(7)產(chǎn)生Escape錯誤-2:發(fā)送幀序列,然后發(fā)送5個NULL,在發(fā)送第6個NULL時,產(chǎn)生該錯誤,不繼續(xù)再發(fā)送正確NULL,靜默19.2μs,然后重新握手(8組FCT+NULL字符)。
(8)產(chǎn)生EEP錯誤:發(fā)送幀序列,然后重新握手(9組FCT+NULL字符)。
(9)RMAP數(shù)據(jù)包。包括寫操作,讀操作和讀改寫三部分?jǐn)?shù)據(jù),可以任意組織數(shù)據(jù)序列。
(10)跳轉(zhuǎn)到1重新執(zhí)行。
緩存部分:作為連接組幀和接口兩部分的緩存。
接口部分:對數(shù)據(jù)添加校驗(yàn)以及實(shí)現(xiàn)Data-Strobe編碼。
傳統(tǒng)設(shè)計(jì)方案為全部采用邏輯來實(shí)現(xiàn),為了滿足測試設(shè)備的各種測試要求,組幀部分是最復(fù)雜的也是需要頻繁修改的,然而修改邏輯是一件費(fèi)時費(fèi)力而且復(fù)雜的工作,因此,根據(jù)系統(tǒng)特點(diǎn),本文引入Python來對組幀部分?jǐn)?shù)據(jù)進(jìn)行預(yù)處理。將要發(fā)送的數(shù)據(jù)、FCT以及EOP等進(jìn)行解析,將解析完的整體數(shù)據(jù)序列放到FPGA ROM中。FPGA只需要地址從0累加讀取ROM數(shù)據(jù)依次進(jìn)行發(fā)送即可,如果需求有改動,只需要用Python將處理好序列重新放到FPGA ROM中,這樣邏輯代碼就不需要修改了,每次只需要用Python修改發(fā)送序列即可,系統(tǒng)方案如圖2所示。
圖2 系統(tǒng)方案
Python方案相對于傳統(tǒng)方案優(yōu)點(diǎn)如下:
(1)降低開發(fā)難度。Verilog語言屬于硬件描述語言。編程實(shí)現(xiàn)的是硬件電路比普通的軟件編程要復(fù)雜的多。而Python是近些年火起來的一門語言。它具有簡單、易學(xué)、免費(fèi)開源等優(yōu)點(diǎn)。因此選用Python來解析數(shù)據(jù)可以大大降低難度。
(2)易于維護(hù)。Verilog語言語法比較單一,開發(fā)的系統(tǒng)易讀性很差,不利于維護(hù)。而Python語言簡潔、易懂,而且有大量的開源庫可以使用。所以比較容易維護(hù)。
(3)提高開發(fā)效率。Verilog語言開發(fā)系統(tǒng)相當(dāng)于電路設(shè)計(jì)比起軟件編程要復(fù)雜的多。使用Python開發(fā)可以將復(fù)雜的硬件電路設(shè)計(jì)轉(zhuǎn)到軟件編程,可以降低難度,提升效率。
我們將要發(fā)送的序列通過Python進(jìn)行預(yù)處理,將數(shù)據(jù)插入FCT,同時進(jìn)行bit拆分,添加校驗(yàn)位,輸出數(shù)據(jù)文件導(dǎo)入FPGA ROM中,進(jìn)行綜合編譯。為了驗(yàn)證模擬源設(shè)備,我們將模擬源代碼和標(biāo)準(zhǔn)接收代碼搭建了一個仿真平臺,仿真平臺通過modelsim進(jìn)行仿真,圖3為仿真結(jié)果,畫圈部分可以看出模擬源模擬的無字符錯誤、奇偶校驗(yàn)錯誤、escape錯誤和信用錯誤。
本文首先介紹了SpaceWire總線協(xié)議和應(yīng)用,引出了模擬源系統(tǒng)。然后介紹了模擬源系統(tǒng)的組成結(jié)構(gòu),分析了相對于傳統(tǒng)設(shè)計(jì)思路引入Python對發(fā)送序列進(jìn)行預(yù)處理所帶來的優(yōu)勢。最后進(jìn)行了仿真分析,充分驗(yàn)證了可行性。
圖3 仿真時序圖
該系統(tǒng)還有不足之處,就是Python處理完的數(shù)據(jù)全部存到了ROM里面,因此能發(fā)多少數(shù)據(jù)受限于FPGA中memory的容量。如果要發(fā)送長的序列可能會導(dǎo)致memory資源不夠用。因此還可以對系統(tǒng)結(jié)構(gòu)進(jìn)行改進(jìn),硬件部分增加PCIe接口,要發(fā)送的序列可以通過PCIe發(fā)送到FPGA,然后再通過SpaceWire接口發(fā)送出去。這樣無論發(fā)送多長的序列都可以滿足。