【FPGA】 HLS教程之C/RTL Cosimulation

RTL自動驗證

  • 背景:c語言通過高層次綜合(HLS)綜合爲相應的硬件RTL語言。再此之前進行了c的仿真,相應的硬件優化,然後下面需要進行c與RTL的協同仿真、RTL仿真及RTL輸出
  • 執行C仿真,並且將頂層功能或被測設備(DUT)的輸入保存爲“輸入向量”
  • 使用由Vivado HLS創建的RTL在RTL模擬中使用“輸入向量”。 RTL的輸出另存爲“輸出向量”
  • 將RTL仿真中的“輸出矢量”應用於綜合功能後的C測試臺,以驗證結果是否正確。 C測試臺執行結果驗證
    在這裏插入圖片描述

在C/RTL協同綜合條件

要成功使用C / RTL協同仿真功能,需要滿足以下條件:

  • 測試臺必須進行自我檢查,如果測試通過,則返回O值;如果測試失敗,則返回非零值
  • 必須選擇正確的接口綜合選項
  • 任何第三方模擬器必須能在路徑中被找到
  • 任何不能被優化指令優化的數組和結構體設計接口都必須在Unsupported Optimizations for Cosimulation中指出

Test Bench的要求

要驗證RTL設計產生的結果與原始C代碼相同,請使用自檢測試臺執行驗證。下面的代碼示例顯示了自檢測試平臺的重要功能:

int main ()
{
	int ret=0;
	//Execute (DUT) Function
	//Write the output results to a file 
	//Check the results 
	ret = system("diff --brief -w output.dat output.golden.dat");
	if(ret !=0)
	{
		printf("Test failed !!! \n");
		ret = 1;	
	}
	else printf("Test pass ! \n");
	return ret;
}

  • 該自檢測試臺將結果與輸出中的已知的正確結果進行比較(golden…dat)
  • 有很多方法可以執行此檢查。這只是一個例子
  • 在Vivado HLS設計流程中,函數main)的返回值指示以下內容:
  1. 零:結果正確
  2. 非零值:結果不正確

Note:

  • 測試臺可以返回任何非零值
  • 複雜的測試臺可以根據差異或故障的類型返回不同的值
  • 如果在C模擬或C / RTL聯合模擬之後測試臺返回非零值,則Vivado HLS報告錯誤,並且模擬失敗

Recommended:

  • 由於系統環境(例如Linux,Windows或Tcl)會解釋main函數的返回值
  • 因此建議將返回值限制在8位範圍內,以實現可移植性和安全性

Caution:

  • 確保測試臺檢查結果,如果測試臺未檢查結果但返回零,則Vivado HLS指示仿真測試通過,即使實際未檢查結果也是如此
  • 即使輸出數據正確且有效,如果測試臺沒有將零值返回給函數main(),Vivado HLS也會報告模擬失敗

接口綜合的要求

若要使用C / RTL協同仿真功能來驗證RTL設計,至少必須滿足以下條件之一:

  1. 頂級功能必須使用ap_ctrl_hs或ap_ctrl_chain區塊層次接口
  2. 設計必須是純粹的組合
  3. 頂級函數的啓動間隔必須爲1
  4. 接口必須是所有正在流式傳輸並以ap-hs或axis接口模式實現的陣列
    note:hls::stream變量自動實現爲ap_fifo接口

如果至少有一個條件不滿足,則C/RTL聯合仿真會停止並且提示如下信息:

@E[SIM-345] Cosim only supports the following ‘ap_ctrl_none’ designs: (1)
combinational designs; (2) pipelined design with task interval of 1; (3)
designs with array streaming or hls_stream ports.
@E [SIM-4] C/RTL co-simulation finished: FAIL

Important !

  • 如果將設計指定爲使用塊級IO協議ap_ctrl_none,並且該設計包含任何採用非阻塞行爲的流變量hls::stream,則不能保證C / RTL協同仿真完成
  • 如果將任何頂級函數參數指定爲AXI-Lite接口,則函數返回也必須指定爲AXI-Lite接口

RTL仿真器支持

  • 確保滿足上述要求之後,您可以使用C / RTL協同仿真通過Verilog或VHDL驗證RTL設計。默認的仿真語言是Verilog
  • 但是,您也可以指定VHDL。當默認模擬器是Vivado Simulator(XSim)時,您可以使用以下任何模擬器來運行C / RTL協同仿真:
  1. Vivado Simulator(XSim)
  2. ModelSim simulator
  3. VCS simulator
  4. NC-Sim simulator
  5. Riviera simulator
  6. Xcelium

Important !

  • 要使用第三方仿真器(例如ModelSim,VCS,Riviera)驗證RTL設計,您必須在系統搜索路徑中包括仿真器的可執行文件,並且相應的許可證必須可用。有關配置這些模擬器的詳細信息,請參見第三方供應商文檔
  • 驗證SystemC設計時,必須選擇ModelSim仿真器,並確保它包括具有適當許可的Ccompiler功能

協同仿真不支持的優化

RTL驗證不支持對接口上的結構中的一個或多個數組執行多個轉換的情況
爲了執行自動驗證,功能接口上的數組或功能接口上的結構內部數組可以使用以下任何一種優化,但不能使用兩個或更多個:

  1. 在相同大小的數組上的垂直映射
  2. 重塑
  3. 劃分
  4. 數據包結構

在頂級功能接口上使用以下優化時,無法通過C / RTL協同仿真進行驗證:

  1. 水平映射
  2. 不同大小的數組的垂直映射
  3. 包含其他結構作爲成員的結構的數據包
  4. 不支持在啓用了寄存器片的AXIS上進行有條件的訪問
  5. 將數組映射到流

仿真IP核

  • 當使用浮點內核實現設計時,必須使RTL仿真器可以使用浮點內核的位精確模型。如果使用Xilinx Vivado Simulator使用Verilog和VHDL執行RTL仿真,則將自動完成此操作
  • 對於受支持的HDL 3rd-party模擬器,必須預先編譯Xilinx浮點庫並將其添加到模擬器庫中。以下示例步驟演示瞭如何在Verilog中編譯浮點庫以與VCS模擬器一起使用
  1. 打開Vivado(不是Vivado HLS),然後在Tcl控制檯窗口中發出以下命令
compilesimlib -simulator vcs-mx -family all -language verilog
  1. This command creates floating-point library in the current directory
  2. 請參閱Vivado控制檯窗口中的目錄名稱,例如./rev3-1然後可以從Vivado HLS中引用該庫:
cosim-design -trace-level all -tool vcs-compiled-library-dir/
<path-to-compile-library>/rev31

使用C/RTL協同仿真

在這裏插入圖片描述
以下是選項:

  • Setup Only:這將創建運行模擬但不執行模擬器所需的所有文件(包裝程序,適配器和腳本)。可以從相應的RTL模擬文件夾<solution_name> / sim / 中的命令外殼程序中運行模擬
  • Dump Trace:這會爲每個功能生成跟蹤文件,並將其保存到 / sim / 文件夾。下拉菜單允許您選擇將哪些信號保存到跟蹤文件。您可以選擇跟蹤設計中的所有信號,僅跟蹤頂層端口或不跟蹤任何信號。有關使用跟蹤文件的詳細信息,請參閱所選RTL模擬器的文檔
  • Optimizing Compile:這可以確保對C測試平臺進行高級優化。使用此選項會增加編譯時間,但模擬執行速度更快
  • Reduce Disk Space:執行RTL模擬之前,上面顯示的流程將保存所有事務的結果。在某些情況下,這可能會導致數據文件很大。 reduce_diskspace選項可用於一次執行一個事務,並減少文件所需的磁盤空間量。如果函數在C測試平臺中執行了N次,則reduce_diskspace選項將確保執行N個單獨的RTL仿真,這將導致模擬運行變慢
  • Compiled Library Location:這指定了第三方RTL模擬器的編譯庫的位置
  • Input Arguments:這允許指定測試平臺所需的任何參數

如果使用第三方RTL仿真器進行仿真,並且設計使用IP,則在執行RTL仿真之前,必須對IP使用RTL仿真模型。要創建或獲取RTL仿真模型,請聯繫您的IP提供商

執行RTL仿真

Vivado HLS在項目子目錄中執行RTL仿真:< SOLUTION > / sim / < RTL > 下

  • SOLUTION是解決方案的名稱
  • RTL是爲仿真選擇的RTL類型

聯合仿真期間C測試平臺編寫的任何文件以及模擬器生成的任何跟蹤文件都將寫入此目錄。例如,如果C測試臺保存了輸出結果以進行比較,請在此目錄中查看輸出文件,並將其與預期結果進行比較

Directives驗證

C / RTL協同仿真自動體現DEPENDENCE和DATAFLOW指令的各個方面

  • 如果將DATAFLOW指令用於管道任務,它將在任務之間插入通道以促進任務之間的數據流
  • 通常使用FIFO實現通道,並使用STREAM指令或config-dataflow命令指定FIFO深度
  • 如果FIFO的深度太小,則RTL模擬可能會停頓
  • 例如,如果指定的FIFO的深度爲2,但生產方任務在使用者任務讀取任何數據值之前寫入了三個值,則FIFO會阻塞生產方
  • 在某些情況下,這可能會導致整個設計停滯

C / RTL協同仿真發出一條消息,如下所示,表明DATAFLOW區域中的通道導致RTL仿真停止
在這裏插入圖片描述

  • 在這種情況下,請檢查任務之間通道的實現,並確保任何FIFO足夠大以容納正在生成的數據
  • 類似的方式,RTL測試平臺還配置爲自動確認使用DEPENDENCE指令指定的錯誤依賴關係
  • 這表明依賴性不是假的,必須刪除該依賴性才能實現功能上有效的設計

分析RTL仿真

  • C / RTL協同仿真完成後,仿真報告將打開並顯示測得的延遲和II
  • 這些結果可能與HLS合成後報告的值不同,後者是基於通過設計的絕對最短和最長路徑得出的
  • C / RTL協同仿真後提供的結果顯示了給定仿真數據集的延遲和II的實際值(如果使用不同的輸入刺激,則可能會改變)
  • 在非流水線設計中,C / RTL協同仿真可測量ap-start和ap-done信號之間的延遲
  • II比延遲多1,因爲設計在所有操作完成後的1個週期內讀取新的輸入僅在當前事務完成後纔開始下一個事務
  • 在流水線設計中,設計可能會在第一個事務完成之前讀取新的輸入,並且在事務完成之前可能會有多個ap_start和ap_ready信號
  • 在這種情況下,C / RTL協同仿真將等待時間測量爲數據輸入值和數據輸出值之間的週期數
  • II是ap_ready之間的週期數,設計將其用於請求新的輸入

Note:對於流水線設計,僅當針對多個事務模擬設計時,C / RTL協同仿真的II值纔有效
Optionally:您可以使用Open Wave Viewer工具欄按鈕從C / RTL協同仿真中查看波形。要查看RTL波形,必須在執行C / RTL協同仿真之前選擇以下選項

  • Verilog / VHDL Simulator Selection:選擇Vivado模擬器。對於Xilinx 7系列及更高版本的設備,您也可以選擇自動
  • Dump Trace:Select all or port
  • C / RTL協同仿真完成後,“ Open Wave Viewer”工具欄按鈕將在Vivado IDE中打開RTL波形

Note:使用這種方法打開Vivado IDE時,只能使用波形分析功能,例如縮放,平移和波形基數

波形查看器

波形查看器可將設計中的所有過程可視化。該可視化分爲兩部分

  • HLS流程摘要
    包含所有流程的活動報告的層次結構表示。例如,生成的RTL中包含的數據流和順序過程
  • 數據流分析
    提供有關數據流區域內任務的詳細活動信息

調試C/RTL協同仿真

  • C / RTL協同仿真完成後,Vivado HLS通常會指示已通過仿真,並且RTL設計的功能與初始C代碼匹配
  • 當C / RTL協同仿真失敗時,Vivado HLS發出以下消息
[SIM-4]***C/RTL co-simulation finished:FAIL ***

設置環境

在這裏插入圖片描述

指令優化

在這裏插入圖片描述

C tb 和 C 源碼

在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章