隋金雪,郁添林,3,沈姒清,3,張 霞
(1. 山東工商學院電子與信息工程學院,山東 煙臺 264003;2. 北京大學信息技術高等研究院,浙江 杭州 311215;3. 中科網(wǎng)絡技術研究所(中科院計算機所煙臺分所),山東 煙臺 264026)
CNN在現(xiàn)代人工智能系統(tǒng)中得到了廣泛應用,同時也給底層硬件帶來了數(shù)據(jù)吞吐量和能效的挑戰(zhàn),通過優(yōu)化整個系統(tǒng),包括片內(nèi)外數(shù)據(jù)流處理以及可重配置各種CNN架構(gòu)等提高效率。目前主流的卷積神經(jīng)網(wǎng)絡硬件設計方式有FPGA、GPU和ASIC;FPGA雖然編程更靈活,開發(fā)周期短,但用高級語言生成的RTL代碼可讀性差,后期維護成本高,布線資源也存在一定的限制;GPU的峰值性能極好,但功耗過高,不適用于低功耗的場景[1]。ASIC為實現(xiàn)特定要求而定制的芯片,在功耗、可靠性、體積等方面具有優(yōu)勢,通用性強、適配各種算法模型的硬件加速器可用于更多的物聯(lián)網(wǎng)終端設備。因此,可擴展的專用定制芯片需要充分的功能型驗證。
傳統(tǒng)架構(gòu)的通用型處理器不能更好的支持機器學習的各種模型,不同算法帶來的高計算密度和大存儲帶寬,需要靈活的專用集成電路來解決這些問題。硬件加速器的框架中獨立的memory和core分離的結(jié)構(gòu),過總線進行通信[2]。設計各種串并行、數(shù)據(jù)流以及通信計算方式的RTL代碼方案,需要一個由SystemVerilog語言搭建的基于UVM可重用的層次化驗證平臺。
本文搭建一個可重用的自動化驗證平臺,對卷積神經(jīng)網(wǎng)絡的前向傳播進行驗證,即卷積層、激活層、池化層和全連接層的功能型驗證,以及對一些關鍵測試點的驗證。
硬件加速器驗證IP的結(jié)構(gòu)如圖1所示。頂層是environment,包括memory_master_agent、memory_slave_agent、control_status_agent、kernel_agent、register_port_agent、reference_model、convolution_scoreboard等組件。其中多圖層時需要例化對應的數(shù)據(jù)輸入輸出以及卷積核的通道數(shù)量[3]。各自的agent中都包含了driver、monitor和sequencer,sequence雖不屬于驗證平臺的基本組件,但驗證所需的激勵由transaction組成,由sequence產(chǎn)生。
驗證平臺與DUT需要interface指明連接信號,在頂層用uvm_config_db配置變量,將virtualinterface傳遞到相應的組件。testbench和DUT之間存在時序和同步建模的問題,為了避免對輸入的激勵驅(qū)動與輸出的采樣產(chǎn)生競爭冒險[4],用clockingblocks構(gòu)造理想的驗證環(huán)境。modport作用如圖2所示,明確了站在不同的角度對應信號的輸入輸出方向,通過虛擬接口的定義將以上內(nèi)容封裝起來。virtualinterface在測試平臺的不同位置操縱一組虛擬信號,而不是直接操縱實際的信號[5,6]。

圖2 modport結(jié)構(gòu)示意圖
agent作為標準驗證環(huán)境的組件,按照is_active的缺省值,配置為主動模式,在build_pahse()、connect_phase等函數(shù)中對driver、monitor和sequencer進行有條件的例化和連接,提供激勵與檢測的場景。
Referencemodel將每個單獨的功能層寫成virtualtask,將參數(shù)的傳遞和獲取分離,便于封裝和復用。主要實現(xiàn)kernel與channel數(shù)據(jù)寫入(單個像素點8/16bit隨機)、滿足kernel列數(shù)開始卷積計算、基地址與偏移地址、非線性激活、最大最小以及均值池化、全連接和bank切換等功能。卷積核與輸出層數(shù)量保持一致,數(shù)據(jù)從driver中獲取,用for循環(huán)嵌套存入二維數(shù)組[7]。依據(jù)寄存器的值,判斷卷積核大小以及數(shù)據(jù)類型,做出相應的乘加運算,計算的數(shù)據(jù)結(jié)果截取位寬后做非線性映射以及選擇池化模式,對圖像壓縮提取特征。對連續(xù)多幅圖片計算時,配置乒乓緩存的寄存器節(jié)約讀寫時序。經(jīng)過處理后的每筆數(shù)據(jù)按總線位寬傳輸至記分板。
Scoreboard用于比較referencemodel與DUT輸出是否一致,實際仿真過程中驗證部分的輸出結(jié)果更快,先用一個隊列暫存數(shù)據(jù)并打印到對比文件,等待DUT同樣的操作。兩個隊列的數(shù)據(jù)比對后刪除,仿真結(jié)束后,隊列不為空會報錯,也可以從打印文件中直觀的看出實際結(jié)果的差異。
SystemRDL是Accellera發(fā)布的寄存器描述語言,由IC寄存器自動化定義工具ordt可以實現(xiàn)由單一輸入源得到多種一致性的輸出[8],包括UVM寄存器模型、RTL代碼和文檔等,旨在提高復雜數(shù)字系統(tǒng)的IC設計和驗證的效率,質(zhì)量及復用性。
寄存器模型流程如圖3所示,在env實例化,建立數(shù)據(jù)通道bank0、bank1以及卷積核與非乒乓配置寄存器三個uvm_reg_block,以前門的方式產(chǎn)生事務并借助于agent來訪問DUT中的存儲器,消耗仿真時間。本文主要的測試內(nèi)容圍繞配置寄存器展開,會同時啟動多個sequence從而產(chǎn)生存儲著操作的地址和操作類型的變量,經(jīng)過adapter轉(zhuǎn)換后傳給sequencer,最后交由driver以apb接口時序完成前門訪問操作[9]。

圖3 寄存器模型示意圖
整個驗證平臺執(zhí)行tmake管理makefile,用python、shell和perl腳本混合編程,獲取宏定義的參數(shù),將配置信息傳遞至RTL、testbench和buildflow,進行文件預處理、編譯以及仿真。
UVM驗證平臺啟動流程是在top_tb導入uvm_pkg文件,創(chuàng)建例化對象,定義時鐘頻率,調(diào)用run_test();再從uvm_test依次執(zhí)行各組件中的phase機制,在run_phase獲取外部腳本處理后的測試用例名,object用factory機制創(chuàng)建實例,轉(zhuǎn)換成UVM_TESTNAME類型后raise_objection,再通過start啟動sequence,等待objection被撤銷后停止仿真,結(jié)束run_phase(),達到并行仿真的效果。
每個測試用例運行都由DUT發(fā)出請求信號,再從master_driver中發(fā)出確認信號,并例化的每層read_channel_transaction產(chǎn)生不同的隨機數(shù),分別由讀數(shù)據(jù)通道接口傳遞給DUT和reference_model用TLM通信中的uvm_blocking_get_port獲取對應通道的數(shù)據(jù)。觸發(fā)信號開始數(shù)據(jù)卷積、激活、池化等功能輸出至scoreboard比對[10]。
仿真在reference_model中,存滿卷積核大小的列數(shù)后就開始做乘加運算,比DUT數(shù)據(jù)預存更快。為保持sequence與driver通信,只要seq_item_port有數(shù)據(jù)包就會通過get_next_item(req)獲取,并通過send(req)函數(shù)按照驗證Spec時序驅(qū)動至DUT,并執(zhí)行item_done作為當前transaction發(fā)送結(jié)束的標志。Sequence掛載于能發(fā)送tarnsaction的sequencer上。每個sequence繼承于uvm_sequence,默認uvm_sequence_item類型,必須實現(xiàn)body函數(shù),當sequence被調(diào)用后會自動執(zhí)行body中的代碼[11]。
在uvm_test階段,自定義initialphase配置硬件加速器的默認值,構(gòu)建初始化測試用例,可以用來對驗證平臺做冒煙測試。sequence中配置寄存器值時,保證隨機化、參數(shù)化運行,降低錯誤概率。
驗證功能測試點根據(jù)硬件加速器實際應用場景和卷積計算等特性來制定各種測試用例。表1所列為IP的基本功能測試點,包括寄存器值可變范圍和覆蓋次數(shù)統(tǒng)計。

表1 IP功能測試點
按照數(shù)據(jù)位寬測試,用獨熱碼以數(shù)據(jù)流推動,直觀計數(shù),無需占用大量資源。異常測試,在卷積核與圖層計算過程中,再次使能卷積觸發(fā)信號不受影響。Dist操作符允許不同值的概率選取不同,同時也保證了邊界測試帶有相應的權重。
通過隨機化可以通過利用CPU的時間來換取人工檢查的時間,提高效率,提供足夠的激勵。采用受約束的隨機測試法(CRT)產(chǎn)生測試集:使用隨機的數(shù)據(jù)流為DUT產(chǎn)生輸入的測試代碼。改變偽隨機數(shù)發(fā)生器(PRNG)的種子(seed)。同時在測試設計時考慮設計規(guī)范的邊界處,甚至測試設計規(guī)范之外的行為[12,13]。
覆蓋率是驗證DUT的功能正確性與完整性的重要指標,分為代碼覆蓋率和功能覆蓋率。如圖4代碼覆蓋率是工具自動搜集編寫好的RTL代碼,包括行、條件、跳轉(zhuǎn)、分支和狀態(tài)機。功能覆蓋率是對數(shù)據(jù)組合和行為序列的檢查。在本文中功能覆蓋率是通過編寫覆蓋組、覆蓋點和交叉覆蓋主要是獲得對寄存器配值的數(shù)據(jù)覆蓋率,同時也是硬件加速器各層功能的測試指標。

圖4 覆蓋率總結(jié)圖
硬件加速器驗證IP的功能覆蓋組設計考慮了架構(gòu)特性,包括旁路模式、乘加陣列、緩存切換、多圖層并行,根據(jù)總線位寬還考慮了數(shù)據(jù)讀寫次數(shù),圖像大小邊界測試以及計算觸發(fā)方式等異常測試。
如圖5所示是覆蓋率的收斂過程,由于功能覆蓋率是人為定義的,可能存在遺漏的功能場景,需要對測試用例不斷的進行迭代[14,15]。

圖5 覆蓋率收斂流程
該驗證IP對不同總線位寬、數(shù)據(jù)與卷積核單個像素位寬、卷積核大小、步長及輸入輸出層數(shù)等需求,配置宏定義參數(shù),連續(xù)多幅圖片卷積的寄存器值切換,波形包含時鐘沿觸發(fā)跳變的脈沖信號,是邏輯正確運行的最直觀體現(xiàn)。
由圖6看出數(shù)據(jù)從讀通道寫入,預存一定量的數(shù)據(jù)到buffer,保證列數(shù)不小于卷積核尺寸,卷積核數(shù)據(jù)讀入方式與其類似,由寄存器模型配值去觸發(fā)卷積計算。

圖6 數(shù)據(jù)預緩存波形圖
由圖7看出通過APB總線完成寄存器讀寫,時鐘頻率遠低于模塊時鐘。先傳輸kernel寄存器值,等待kernel寄存器標志位有效;再配值數(shù)據(jù)寄存器,等待數(shù)據(jù)通道寄存器標志位有效,再將soft_trigger信號置1,等待卷積計算狀態(tài)位拉低后,一幅圖片處理完成。

圖7 APB總線波形圖
圖8表示數(shù)據(jù)的輸出,RTL發(fā)出請求信號,驗證部分隨即給出確認信號以及一筆總線位寬的數(shù)據(jù)。驗證結(jié)果表明HWPE的功能已完全實現(xiàn),測試激勵覆蓋了所有功能點。

圖8 數(shù)據(jù)輸出波形圖
UVM作為IC最有效的驗證方法學,前期搭建驗證平臺耗費一定的時間,但其重用性與可擴展性強,測試用例的驗證效率高,極大的縮短了IC設計的研發(fā)周期。本文搭建了基于UVM的硬件加速器模塊的可重用驗證平臺,充分驗證了卷積神經(jīng)網(wǎng)絡的功能正確性,完成了芯片設計電路邏輯關系的分析。該驗證架構(gòu)按照網(wǎng)絡模型需求,做少量的代碼修改,即可投入其它的驗證流程中。