基于SystemC 的系統(tǒng)驗證研究和應(yīng)用
摘要 : 視頻編解碼芯片中運動估計與補償單元(MECU)的算法復(fù)雜,使用傳統(tǒng)硬件描述語言建立模型和模型驗證的過程繁瑣耗時,為了縮短芯片驗證時間,本文針對MECU 模塊提出了基于SySTemC 語言的具體系統(tǒng)級驗證流程。在整個芯片驗證工作中,為了實現(xiàn)MECU 模塊和低抽象級的其它外部模塊協(xié)同驗證,本文提出的驗證流程利用了SystemC 能在不同抽象級建模的優(yōu)勢,對MECU 模塊的數(shù)據(jù)傳輸控制端口進行細化。仿真結(jié)果表明:與使用傳統(tǒng)件描述語言驗證方法相比,基于SystemC 的驗證流程簡單有效,大大縮短了建模與驗證時間。
1 引言
當前集成電路制造技術(shù)迅速發(fā)展,SoC(system-on-chip)設(shè)計已經(jīng)成為集成電路設(shè)計的發(fā)展方向。隨著SoC 設(shè)計的復(fù)雜度提高,在開發(fā)SoC 的過程中,驗證工作越發(fā)重要和繁重,所占的開銷占據(jù)總開銷的40%~70%。SoC 設(shè)計的驗證過程不但影響到芯片的成功設(shè)計,而且影響到芯片的上市時間,因此驗證的正確性及其耗時的縮短成為了SoC 設(shè)計的關(guān)鍵。
傳統(tǒng)設(shè)計中,系統(tǒng)級設(shè)計使用高級語言C/C++等描述功能模塊的算法,驗證的時候使用硬件描述語言(VHDL 或Verilog HDL)。系統(tǒng)驗證之前必須通過手工將原始的C/C++代碼轉(zhuǎn)換為VHDL/Verilog HDL 代碼,這個轉(zhuǎn)換過程耗時大并且容易產(chǎn)生錯誤。在系統(tǒng)驗證過程中,使用傳統(tǒng)硬件描述語言對復(fù)雜模塊的驗證需要耗費大量時間。
為了提高系統(tǒng)級驗證效率,本文針對視頻芯片中的運動估計與補償單元模塊(MECU)提出了基于SystemC 的驗證方法和流程。該方法大大縮短了系統(tǒng)驗證的搭建時間和系統(tǒng)驗證過程的時間。本文利用SystemC 支持設(shè)計者在不同抽象級建模的特點,給MECU 添加了低抽象級接口,使該單元能夠和視頻芯片內(nèi)部其它模型通訊以便完成整個芯片的系統(tǒng)級驗證。本文最后的仿真結(jié)果證明了該設(shè)計流程的有效性。
2 SystemC 語言
SystemC 是由C++衍生而來,本質(zhì)是在C++的基礎(chǔ)上添加了硬件擴展庫和仿真核,這使SystemC 可以在不同抽象級對復(fù)雜電子系統(tǒng)建模。它既可以描述純功能的模型和系統(tǒng)體系結(jié)構(gòu),又可以描述軟硬件的具體實現(xiàn),進行軟硬件的協(xié)同驗證。
SystemC 包括以下建模元素:
*模塊(module) 相當于C++的類定義,是一個可以多層次的實體。一個模塊可以嵌套其他模塊和一些進程,是SystemC 里面最基本的單元。
*進程(process) 用來描述模塊的功能,包含于模塊中。進程是由事件(event)來觸發(fā)的,這種觸發(fā)的方式使進程可以并行執(zhí)行,實現(xiàn)了硬件系統(tǒng)的并行特性,SystemC 包括三種不同的進程。
*接口(interface) 定義了一組方法實現(xiàn)目標,但是不實現(xiàn)這些方法。
*通道(channel) 實現(xiàn)了接口定義的方法,分為基本通道和層次化通道。
*端口(port) 總是與一定的接口類型相關(guān)聯(lián),端口只能連接到實現(xiàn)了該類接口的通道上,通過端口模塊和進程來訪問通道內(nèi)定義的接口方法。
*信號(signal) 用來實現(xiàn)各個進程之間的通訊。SystemC 提供了多種信號格式來滿足從寄存器傳輸級(Register Transmit Level, RTL)到功能級等不同抽象級的模擬。
*事件(event) 用來觸發(fā)各個進程的開始以及暫停,通常多個事件組成一個敏感列表(sensitive list)共同決定進程的狀態(tài)。
*時鐘信號(clock) 時鐘在同步電路設(shè)計中是一個非常重要的角色,本質(zhì)上它是一種特殊的信號,為仿真過程提供了時間基準。
上述建模元素使得SystemC 能夠順利的搭建硬件平臺。
3 基于SystemC 的建模方法
系統(tǒng)級驗證過程中,對于復(fù)雜算法模型只需要建立參考模型(Reference Models),搭建驗證平臺,觀察模型的一些重要功能(算法、進程等等),不需要了解RTL 層面的細節(jié)。利用事務(wù)級建模方法(TLM, Transaction Level Modeling)技術(shù)很容易建立參考模型。一個完整的芯片是由多個功能模塊組成,采用SystemC 對復(fù)雜算法單元建立模型能使功能驗證時間縮短,而一些簡單模型的驗證需要在RTL 層面。為了實現(xiàn)不同抽象級模塊通訊,本文對使用SystemC 建立的復(fù)雜單元模型進行接口精細化處理。本文對實際芯片單元提出的SystemC 建模驗證流程如圖1 所示:
圖1 SystemC 驗證流程
驗證流程描述:
(1)搭建SystemC 系統(tǒng)級模型:
使用基于C++的SystemC 能很容易搭建系統(tǒng)級模型。利用SystemC 對所要實現(xiàn)的系統(tǒng)功能進行描述,主要描述系統(tǒng)的算法、結(jié)構(gòu)等,不考慮每個時鐘周期寄存器數(shù)值改變。只有針對復(fù)雜算法單元使用SystemC 建模,才能夠發(fā)揮SystemC 節(jié)省建模和驗證時間的優(yōu)勢。
(2)系統(tǒng)級功能仿真:
利用支持SystemC 的工具對建立的模型進行仿真驗證系統(tǒng)功能,觀察結(jié)果并且不斷進行反饋修改直到仿真正確。
(3)精細化接口:
精細化接口是多模塊驗證過程的關(guān)鍵。因為在對單個復(fù)雜單元系統(tǒng)級驗證的時候,抽象級很高,只需要考慮其功能性。多個模塊驗證時外部單元模型可能在RTL 級別構(gòu)建,這時需要利用SystemC 能在不同抽象級建模的優(yōu)勢,在一個較大的模塊中實現(xiàn)不同的抽象層建模,即在和外部模型接口處將抽象級降低到RTL 級。精細化接口的過程需要根據(jù)外部模塊接口調(diào)節(jié)輸入輸出數(shù)據(jù)位寬、設(shè)置敏感事件列表,并且嚴格按照外部時鐘控制數(shù)據(jù)的傳輸,保證順利和外部模塊通訊。
(4)協(xié)同驗證:
驗證多個模塊共同工作的正確性,這時候發(fā)現(xiàn)錯誤就能夠及時進行設(shè)計的修改,提高芯片設(shè)計效率。驗證結(jié)果正確的模塊就可以進行后端流程,建立的驗證平臺也可以作為外部驅(qū)動的測試平臺進行軟件的驗證。
4 應(yīng)用實例
4.1 MECU 原理
廣泛應(yīng)用在手機中的視頻編解碼芯片編解碼流程包括了DCT 變換、量化、VLC 編碼、反DCT 變換,反量化、運動估計、運動補償、插值計算、邊緣填充等步驟,其中運動估計與補償部分是實現(xiàn)壓縮圖像時間冗余度的重要環(huán)節(jié),由于其算法的復(fù)雜性該部分占據(jù)了大部分的編解碼時間, 對MECU 模塊的驗證是整個芯片驗證中工作量最大的環(huán)節(jié)。
本文中MECU采用MVFast(Motion Vector Field Adaptive Fast Motion Estimation) 算法實現(xiàn)ME/MC:ME 部分在圖像編碼過程中實現(xiàn)運動預(yù)測,計算出運動矢量,同時完成宏塊編碼類型(MBmode)判斷和運動矢量編碼類型判斷;MC 部分在圖像編碼過程中,根據(jù)輸入各塊的運動矢量完成YUV 的插值處理輸出運動參考塊數(shù)據(jù)和當前處理塊數(shù)據(jù);在圖像解碼處理中完成插值處理輸出參考塊數(shù)據(jù)。
4.2 模塊搭建
采用Verilog 語言直接建立MECU 模型用于芯片設(shè)計時,由于MECU 算法復(fù)雜,建模過程耗時巨大。Verilog 建模期間系統(tǒng)驗證工程師需要等待模型建立完成,這樣增長了芯片設(shè)計周期,另一方面對使用Verilog 建立的MECU 模型驗證耗費時間長。由于基于SystemC的建模時間相對Verilog 建模時間縮短3~4 倍,驗證過程具有快速性優(yōu)勢,本文嘗試采用SystemC 進行前期建模和驗證工作。
依據(jù)本文第二部分介紹的驗證方法,首先建立MECU 硬件仿真模型進行功能驗證,然后在這個硬件模型正確的基礎(chǔ)上進行外圍模塊設(shè)計的驗證,以實現(xiàn)整個芯片的系統(tǒng)級驗證。
第一步利用SystemC 對ME 和MC 分別進行系統(tǒng)級建模。在建立ME 和MC 這兩個模塊時,只需要實現(xiàn)ME 和MC 各自算法功能和兩個模塊之間的通訊,因此不需要按照精確的時序建模。在C 語言實現(xiàn)MVFAST 算法模型基礎(chǔ)上,用SC_MODULE 將ME 和MC 各自編寫成可仿真的模塊MEU 和MCU,內(nèi)部的功能利用Process 來實現(xiàn)。模型建立之后,搭建平臺進行功能驗證,觀察數(shù)據(jù)經(jīng)過ME 和MC 之后的變化是否完全符合算法要求。
MEU 和MCU 模型功能驗證結(jié)束之后需要協(xié)同芯片中其它模塊進行驗證,由于MECU的外圍模塊是在RTL 級建模,并且嚴格按照時鐘進行數(shù)據(jù)處理,因此必須對MECU 接口進行精細化。本實驗添加了SYS_IF ,ZSP-IF, DMA-IF 和BPU-IF 模塊以實現(xiàn)與外圍模塊通訊,這些接口模塊包括和外圍模塊相匹配的輸入輸出端口,并且由時鐘嚴格控制數(shù)據(jù)的傳輸。
最終建立的SystemC 模型和外部環(huán)境定義如圖2 所示。
圖2 MECU 的SystemC 模型
4.3 接口模塊描述
(1)SYS_IF 提供MECU 的外部時鐘以及復(fù)位信號接口,這兩個控制信號對MECU 內(nèi)部所有模塊有效。
(2)MEU 和MCU 的觸發(fā)由外部ZSP 產(chǎn)生的開始信號來控制,在MECU 內(nèi)部包含的控制寄存器也由ZSP 來控制。ZSP_IF 模塊的添加實現(xiàn)了ZSP 對MECU 進行讀寫控制。
(3)MECU 模型編解碼過程需要處理的數(shù)據(jù)是通過ZSP 控制DMA 提供,因此添加DMA_IF模塊實現(xiàn)和DMA 通訊,搬運數(shù)據(jù)以供MECU 處理。
(4)最終MC 完成產(chǎn)生的數(shù)據(jù),通過BPU_IF 模塊傳輸出到BPU 中(用于軟硬件結(jié)果對比)。
從上述結(jié)構(gòu)可以看出,MECU 包括了六個模塊:ME,MC,SYS_IF,ZSP_IF, DMA_IF 以及BPU_IF。ME 和MC 作為核心功能模塊實現(xiàn)了MECU 單元的算法,SYS_IF,ZSP_IF, DMA_IF以及BPU_IF 四個接口模塊由時鐘嚴格控制數(shù)據(jù)的傳輸,實現(xiàn)和外圍模塊通訊功能。
5 仿真結(jié)果分析
利用上述SystemC 模型進行仿真驗證,采用一組352*288 像素的圖像作為仿真對象,使用Mentor 公司的Modelsim 作為仿真工具。首先建立測試平臺,對外部ZSP,DMA 進行模擬以提供控制信號和處理數(shù)據(jù),然后利用Modelsim 進行仿真驗證和時序分析。Modelsim得到的部分波形圖如圖三所示:
圖三 MECU 驗證部分波形圖
仿真得到的數(shù)據(jù)結(jié)果完全符合算法的期望值,證明了搭建模型的正確性。時序分析結(jié)果表明:使用SystemC 對圖像的一個宏塊(16*16 像素)進行編碼平均需要680 個clock cycle,其中ME 和MC 部分占用11 個clock cycle;用傳統(tǒng)硬件描述語言Verilog 建模進行驗證一個模塊的編碼平均需要3000 個clock cycle,其中ME 和MC 占據(jù)2200 個clock cycle。將基于SystemC 和Verilog 兩種建模方法的ME 和MC 驗證時間相比較發(fā)現(xiàn):采用SystemC 進行純功能性驗證時間比使用Verilog 驗證時間縮短了約200 倍,因此驗證時間上的優(yōu)勢是顯著的。
6 總結(jié)
本文對 SystemC 驗證方法進行了深入的研究,針對視頻編解碼芯片MECU 單元的驗證提出了使用SystemC 驗證的建模流程,通過端口細化方法使芯片能在不同抽象級建模驗證,這種方法在當前國內(nèi)驗證方面使用不多。仿真結(jié)果證明了該流程的有效性,和使用傳統(tǒng)硬件描述語言驗證相比時間顯著縮短。