隋金雪,郁添林,3,沈姒清,3,張 霞
(1. 山東工商學(xué)院電子與信息工程學(xué)院,山東 煙臺(tái) 264003;2. 北京大學(xué)信息技術(shù)高等研究院,浙江 杭州 311215;3. 中科網(wǎng)絡(luò)技術(shù)研究所(中科院計(jì)算機(jī)所煙臺(tái)分所),山東 煙臺(tái) 264026)
CNN在現(xiàn)代人工智能系統(tǒng)中得到了廣泛應(yīng)用,同時(shí)也給底層硬件帶來了數(shù)據(jù)吞吐量和能效的挑戰(zhàn),通過優(yōu)化整個(gè)系統(tǒng),包括片內(nèi)外數(shù)據(jù)流處理以及可重配置各種CNN架構(gòu)等提高效率。目前主流的卷積神經(jīng)網(wǎng)絡(luò)硬件設(shè)計(jì)方式有FPGA、GPU和ASIC;FPGA雖然編程更靈活,開發(fā)周期短,但用高級(jí)語言生成的RTL代碼可讀性差,后期維護(hù)成本高,布線資源也存在一定的限制;GPU的峰值性能極好,但功耗過高,不適用于低功耗的場景[1]。ASIC為實(shí)現(xiàn)特定要求而定制的芯片,在功耗、可靠性、體積等方面具有優(yōu)勢,通用性強(qiáng)、適配各種算法模型的硬件加速器可用于更多的物聯(lián)網(wǎng)終端設(shè)備。因此,可擴(kuò)展的專用定制芯片需要充分的功能型驗(yàn)證。
傳統(tǒng)架構(gòu)的通用型處理器不能更好的支持機(jī)器學(xué)習(xí)的各種模型,不同算法帶來的高計(jì)算密度和大存儲(chǔ)帶寬,需要靈活的專用集成電路來解決這些問題。硬件加速器的框架中獨(dú)立的memory和core分離的結(jié)構(gòu),過總線進(jìn)行通信[2]。設(shè)計(jì)各種串并行、數(shù)據(jù)流以及通信計(jì)算方式的RTL代碼方案,需要一個(gè)由SystemVerilog語言搭建的基于UVM可重用的層次化驗(yàn)證平臺(tái)。
本文搭建一個(gè)可重用的自動(dòng)化驗(yàn)證平臺(tái),對(duì)卷積神經(jīng)網(wǎng)絡(luò)的前向傳播進(jìn)行驗(yàn)證,即卷積層、激活層、池化層和全連接層的功能型驗(yàn)證,以及對(duì)一些關(guān)鍵測試點(diǎn)的驗(yàn)證。
硬件加速器驗(yàn)證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í)需要例化對(duì)應(yīng)的數(shù)據(jù)輸入輸出以及卷積核的通道數(shù)量[3]。各自的agent中都包含了driver、monitor和sequencer,sequence雖不屬于驗(yàn)證平臺(tái)的基本組件,但驗(yàn)證所需的激勵(lì)由transaction組成,由sequence產(chǎn)生。
驗(yàn)證平臺(tái)與DUT需要interface指明連接信號(hào),在頂層用uvm_config_db配置變量,將virtualinterface傳遞到相應(yīng)的組件。testbench和DUT之間存在時(shí)序和同步建模的問題,為了避免對(duì)輸入的激勵(lì)驅(qū)動(dòng)與輸出的采樣產(chǎn)生競爭冒險(xiǎn)[4],用clockingblocks構(gòu)造理想的驗(yàn)證環(huán)境。modport作用如圖2所示,明確了站在不同的角度對(duì)應(yīng)信號(hào)的輸入輸出方向,通過虛擬接口的定義將以上內(nèi)容封裝起來。virtualinterface在測試平臺(tái)的不同位置操縱一組虛擬信號(hào),而不是直接操縱實(shí)際的信號(hào)[5,6]。
圖2 modport結(jié)構(gòu)示意圖
agent作為標(biāo)準(zhǔn)驗(yàn)證環(huán)境的組件,按照is_active的缺省值,配置為主動(dòng)模式,在build_pahse()、connect_phase等函數(shù)中對(duì)driver、monitor和sequencer進(jìn)行有條件的例化和連接,提供激勵(lì)與檢測的場景。
Referencemodel將每個(gè)單獨(dú)的功能層寫成virtualtask,將參數(shù)的傳遞和獲取分離,便于封裝和復(fù)用。主要實(shí)現(xiàn)kernel與channel數(shù)據(jù)寫入(單個(gè)像素點(diǎn)8/16bit隨機(jī))、滿足kernel列數(shù)開始卷積計(jì)算、基地址與偏移地址、非線性激活、最大最小以及均值池化、全連接和bank切換等功能。卷積核與輸出層數(shù)量保持一致,數(shù)據(jù)從driver中獲取,用for循環(huán)嵌套存入二維數(shù)組[7]。依據(jù)寄存器的值,判斷卷積核大小以及數(shù)據(jù)類型,做出相應(yīng)的乘加運(yùn)算,計(jì)算的數(shù)據(jù)結(jié)果截取位寬后做非線性映射以及選擇池化模式,對(duì)圖像壓縮提取特征。對(duì)連續(xù)多幅圖片計(jì)算時(shí),配置乒乓緩存的寄存器節(jié)約讀寫時(shí)序。經(jīng)過處理后的每筆數(shù)據(jù)按總線位寬傳輸至記分板。
Scoreboard用于比較referencemodel與DUT輸出是否一致,實(shí)際仿真過程中驗(yàn)證部分的輸出結(jié)果更快,先用一個(gè)隊(duì)列暫存數(shù)據(jù)并打印到對(duì)比文件,等待DUT同樣的操作。兩個(gè)隊(duì)列的數(shù)據(jù)比對(duì)后刪除,仿真結(jié)束后,隊(duì)列不為空會(huì)報(bào)錯(cuò),也可以從打印文件中直觀的看出實(shí)際結(jié)果的差異。
SystemRDL是Accellera發(fā)布的寄存器描述語言,由IC寄存器自動(dòng)化定義工具ordt可以實(shí)現(xiàn)由單一輸入源得到多種一致性的輸出[8],包括UVM寄存器模型、RTL代碼和文檔等,旨在提高復(fù)雜數(shù)字系統(tǒng)的IC設(shè)計(jì)和驗(yàn)證的效率,質(zhì)量及復(fù)用性。
寄存器模型流程如圖3所示,在env實(shí)例化,建立數(shù)據(jù)通道bank0、bank1以及卷積核與非乒乓配置寄存器三個(gè)uvm_reg_block,以前門的方式產(chǎn)生事務(wù)并借助于agent來訪問DUT中的存儲(chǔ)器,消耗仿真時(shí)間。本文主要的測試內(nèi)容圍繞配置寄存器展開,會(huì)同時(shí)啟動(dòng)多個(gè)sequence從而產(chǎn)生存儲(chǔ)著操作的地址和操作類型的變量,經(jīng)過adapter轉(zhuǎn)換后傳給sequencer,最后交由driver以apb接口時(shí)序完成前門訪問操作[9]。
圖3 寄存器模型示意圖
整個(gè)驗(yàn)證平臺(tái)執(zhí)行tmake管理makefile,用python、shell和perl腳本混合編程,獲取宏定義的參數(shù),將配置信息傳遞至RTL、testbench和buildflow,進(jìn)行文件預(yù)處理、編譯以及仿真。
UVM驗(yàn)證平臺(tái)啟動(dòng)流程是在top_tb導(dǎo)入uvm_pkg文件,創(chuàng)建例化對(duì)象,定義時(shí)鐘頻率,調(diào)用run_test();再從uvm_test依次執(zhí)行各組件中的phase機(jī)制,在run_phase獲取外部腳本處理后的測試用例名,object用factory機(jī)制創(chuàng)建實(shí)例,轉(zhuǎn)換成UVM_TESTNAME類型后raise_objection,再通過start啟動(dòng)sequence,等待objection被撤銷后停止仿真,結(jié)束run_phase(),達(dá)到并行仿真的效果。
每個(gè)測試用例運(yùn)行都由DUT發(fā)出請(qǐng)求信號(hào),再從master_driver中發(fā)出確認(rèn)信號(hào),并例化的每層read_channel_transaction產(chǎn)生不同的隨機(jī)數(shù),分別由讀數(shù)據(jù)通道接口傳遞給DUT和reference_model用TLM通信中的uvm_blocking_get_port獲取對(duì)應(yīng)通道的數(shù)據(jù)。觸發(fā)信號(hào)開始數(shù)據(jù)卷積、激活、池化等功能輸出至scoreboard比對(duì)[10]。
仿真在reference_model中,存滿卷積核大小的列數(shù)后就開始做乘加運(yùn)算,比DUT數(shù)據(jù)預(yù)存更快。為保持sequence與driver通信,只要seq_item_port有數(shù)據(jù)包就會(huì)通過get_next_item(req)獲取,并通過send(req)函數(shù)按照驗(yàn)證Spec時(shí)序驅(qū)動(dòng)至DUT,并執(zhí)行item_done作為當(dāng)前transaction發(fā)送結(jié)束的標(biāo)志。Sequence掛載于能發(fā)送tarnsaction的sequencer上。每個(gè)sequence繼承于uvm_sequence,默認(rèn)uvm_sequence_item類型,必須實(shí)現(xiàn)body函數(shù),當(dāng)sequence被調(diào)用后會(huì)自動(dòng)執(zhí)行body中的代碼[11]。
在uvm_test階段,自定義initialphase配置硬件加速器的默認(rèn)值,構(gòu)建初始化測試用例,可以用來對(duì)驗(yàn)證平臺(tái)做冒煙測試。sequence中配置寄存器值時(shí),保證隨機(jī)化、參數(shù)化運(yùn)行,降低錯(cuò)誤概率。
驗(yàn)證功能測試點(diǎn)根據(jù)硬件加速器實(shí)際應(yīng)用場景和卷積計(jì)算等特性來制定各種測試用例。表1所列為IP的基本功能測試點(diǎn),包括寄存器值可變范圍和覆蓋次數(shù)統(tǒng)計(jì)。
表1 IP功能測試點(diǎn)
按照數(shù)據(jù)位寬測試,用獨(dú)熱碼以數(shù)據(jù)流推動(dòng),直觀計(jì)數(shù),無需占用大量資源。異常測試,在卷積核與圖層計(jì)算過程中,再次使能卷積觸發(fā)信號(hào)不受影響。Dist操作符允許不同值的概率選取不同,同時(shí)也保證了邊界測試帶有相應(yīng)的權(quán)重。
通過隨機(jī)化可以通過利用CPU的時(shí)間來換取人工檢查的時(shí)間,提高效率,提供足夠的激勵(lì)。采用受約束的隨機(jī)測試法(CRT)產(chǎn)生測試集:使用隨機(jī)的數(shù)據(jù)流為DUT產(chǎn)生輸入的測試代碼。改變偽隨機(jī)數(shù)發(fā)生器(PRNG)的種子(seed)。同時(shí)在測試設(shè)計(jì)時(shí)考慮設(shè)計(jì)規(guī)范的邊界處,甚至測試設(shè)計(jì)規(guī)范之外的行為[12,13]。
覆蓋率是驗(yàn)證DUT的功能正確性與完整性的重要指標(biāo),分為代碼覆蓋率和功能覆蓋率。如圖4代碼覆蓋率是工具自動(dòng)搜集編寫好的RTL代碼,包括行、條件、跳轉(zhuǎn)、分支和狀態(tài)機(jī)。功能覆蓋率是對(duì)數(shù)據(jù)組合和行為序列的檢查。在本文中功能覆蓋率是通過編寫覆蓋組、覆蓋點(diǎn)和交叉覆蓋主要是獲得對(duì)寄存器配值的數(shù)據(jù)覆蓋率,同時(shí)也是硬件加速器各層功能的測試指標(biāo)。
圖4 覆蓋率總結(jié)圖
硬件加速器驗(yàn)證IP的功能覆蓋組設(shè)計(jì)考慮了架構(gòu)特性,包括旁路模式、乘加陣列、緩存切換、多圖層并行,根據(jù)總線位寬還考慮了數(shù)據(jù)讀寫次數(shù),圖像大小邊界測試以及計(jì)算觸發(fā)方式等異常測試。
如圖5所示是覆蓋率的收斂過程,由于功能覆蓋率是人為定義的,可能存在遺漏的功能場景,需要對(duì)測試用例不斷的進(jìn)行迭代[14,15]。
圖5 覆蓋率收斂流程
該驗(yàn)證IP對(duì)不同總線位寬、數(shù)據(jù)與卷積核單個(gè)像素位寬、卷積核大小、步長及輸入輸出層數(shù)等需求,配置宏定義參數(shù),連續(xù)多幅圖片卷積的寄存器值切換,波形包含時(shí)鐘沿觸發(fā)跳變的脈沖信號(hào),是邏輯正確運(yùn)行的最直觀體現(xiàn)。
由圖6看出數(shù)據(jù)從讀通道寫入,預(yù)存一定量的數(shù)據(jù)到buffer,保證列數(shù)不小于卷積核尺寸,卷積核數(shù)據(jù)讀入方式與其類似,由寄存器模型配值去觸發(fā)卷積計(jì)算。
圖6 數(shù)據(jù)預(yù)緩存波形圖
由圖7看出通過APB總線完成寄存器讀寫,時(shí)鐘頻率遠(yuǎn)低于模塊時(shí)鐘。先傳輸kernel寄存器值,等待kernel寄存器標(biāo)志位有效;再配值數(shù)據(jù)寄存器,等待數(shù)據(jù)通道寄存器標(biāo)志位有效,再將soft_trigger信號(hào)置1,等待卷積計(jì)算狀態(tài)位拉低后,一幅圖片處理完成。
圖7 APB總線波形圖
圖8表示數(shù)據(jù)的輸出,RTL發(fā)出請(qǐng)求信號(hào),驗(yàn)證部分隨即給出確認(rèn)信號(hào)以及一筆總線位寬的數(shù)據(jù)。驗(yàn)證結(jié)果表明HWPE的功能已完全實(shí)現(xiàn),測試激勵(lì)覆蓋了所有功能點(diǎn)。
圖8 數(shù)據(jù)輸出波形圖
UVM作為IC最有效的驗(yàn)證方法學(xué),前期搭建驗(yàn)證平臺(tái)耗費(fèi)一定的時(shí)間,但其重用性與可擴(kuò)展性強(qiáng),測試用例的驗(yàn)證效率高,極大的縮短了IC設(shè)計(jì)的研發(fā)周期。本文搭建了基于UVM的硬件加速器模塊的可重用驗(yàn)證平臺(tái),充分驗(yàn)證了卷積神經(jīng)網(wǎng)絡(luò)的功能正確性,完成了芯片設(shè)計(jì)電路邏輯關(guān)系的分析。該驗(yàn)證架構(gòu)按照網(wǎng)絡(luò)模型需求,做少量的代碼修改,即可投入其它的驗(yàn)證流程中。