在C程序的設計中,任何一個C程序的頂層都是main()函數(shù)。而在vivado HLS的設計中,只要函數(shù)的層次在main()函數(shù)以下,都可以被綜合。但是每個vivado HLS工程只能指定一個top層函數(shù)作為輸出RTL模塊的頂層,其它和這個函數(shù)層次平行,不需要被綜合的函數(shù)都可以作為testbench來使用。這樣就帶來一個問題,如何編寫vivado HLS工程的testbench更高效,或者說能更好的讓HLS工具自動重用C testbench驗證產(chǎn)生的RTL代碼就變得非常重要。
通常,在Vivado HLS中,好的C testbench設計原則是testbench設計和需要實現(xiàn)的算法函數(shù)分別保存在不同的文件中,并且充分利用頭文件。Testbench常常包含了一些HLS綜合不支持的操作,比如通過文件的讀寫取得仿真數(shù)據(jù)并保存結果,或者打印一些測試結果進行分析。在頭文件中,完成對testbench中所有的數(shù)據(jù)類型和函數(shù)的定義,以及包含共享的設計文件和函數(shù)庫。
Vivado HLS中,只能指定一個top層函數(shù)用于綜合,top層函數(shù)可以包含多個子函數(shù)。當需要綜合多個并行層次的函數(shù)時,可以編寫一個wrapper函數(shù)作為top層函數(shù),將需要綜合的多個并行函數(shù)封裝起來。
C testbench的目不僅是要驗證需要綜合的top函數(shù)功能正確(C編譯器驗證環(huán)境),同時重用C testbench作為綜合產(chǎn)生RTL代碼的仿真激勵,HLS工具自動調(diào)用C testbench來驗證RTL功能的一致性(C編譯器和RTL仿真器的協(xié)同仿真環(huán)境)。這樣,編寫一個好的風格testbench可以很好的提高設計的驗證效率,如果在HLS綜合前和綜合過程中,需要修改綜合函數(shù)的代碼,可以用testbench驗證,確保需要綜合的C算法功能正確。
Vivado HLS中推薦高效的testbench具有如下三個特征:
1. Testbench代碼和需要綜合的C算法代碼保存在不同的文件中(例子1-1)。輸入多個不同的數(shù)據(jù),對需要綜合的Top層函數(shù)執(zhí)行多次的處理和驗證。還可以進行top函數(shù)多樣性的測試。Testbench和C設計分開不同的文件使得HLS工程非常清晰,它們分別作為test bench文件和source文件加入HLS的project中。(Testbench和要綜合實現(xiàn)的設計文件分別保存不是HLS強制的,也可以保存在同一個文件中,如果保存為同一個文件,在HLS工程,需要指定這個文件既是testbench文件也是source文件)。
2. Testbench具有自測試功能,testbench調(diào)用需綜合的top函數(shù),仿真輸出結果與已知正確的數(shù)值進行對比。已知正確的數(shù)值可以通過文件讀入(例子2-1),也可以由testbench的其它部分的仿真代碼產(chǎn)生(例子2-2)。
3. Main()函數(shù)作為testbench函數(shù)(例子3-1),如果仿真top函數(shù)正確,main()函數(shù)返回0值;如果仿真不通過,返回任意非0的值即可(例子3-2)。(之所以要求仿真正確返回0值,是因為HLS工具自動進行RTL驗證時,如果testbench返回0值,HLS認為仿真正確,而返回其它值時,HLS報告仿真失?。?/p>
綜上所述,掌握三個基本的VivadoHLS工程testbench編寫原則,可以輕松書寫VHLS高效的testbench仿真激勵。首先,testbench和要綜合的頂層函數(shù)分別保存在不同的文件中,使得vivadoHLS工程簡潔清楚;其次,testbench具有自測試功能,通過調(diào)用Golden函數(shù)或者已保存好的golden數(shù)據(jù),與仿真的結果進行比較,使得HLS自動重用C testbench來驗證RTL仿真變得簡單;最好,數(shù)據(jù)比較一致返回“0”值,錯誤不一致時返回任意非“0”值即可。
?
評論
查看更多