一張圖看懂HLS設計優化流程

  • 2019 年 10 月 30 日
  • 筆記

思考空間

如果b_vect採用如下聲明方式:

logic [0 : 31] b_vect;

那麼b_vect[0 +: 8]和b_vect[15 -:8]分別選取b_vect的哪些位?

b_vect[0 +: 8]選取b[0:7];b_vect[15 -:8]選取b[8:15]。

Vivado HLS實現了從C/C++到RTL程式碼(VHDL/Verilog)的轉化,同時,HLS還提供了很多pragmas,以提高轉化的效率。轉化效率的衡量標準有三個,分別是:period,II(Initial Interval),Latency(三者的具體含義可查看這篇文章:一張圖看懂Vivado HLS設計性能指標)。其中period決定了系統的Fmax;II決定了系統的數據吞吐率;Latency決定了數據處理周期。此外,資源利用率(Resource Utilization)在某些場景下也是不可忽視的一項指標。Pragmas的一個重要作用就是提升轉換效率,使得最終生成的RTL程式碼能夠滿足期望的性能。

就pragmas而言,從作用對象來看,有針對循環的;有針對數組的;有針對函數的;有針對形參的(設置介面類型);從功能來看,有針對提升吞吐率和改善Latency的,例如DATAFLOW和Pipeline;有針對資源優化的,例如array_partition。那麼,如此之多的pragmas,在實際工程中該如何使用,或者哪些該優先使用。對此,Xilinx給出了一套方法學。具體流程如下圖所示。

圖片來源:page 13, ug1270(v2018.1)

從這個圖片中,不難看出,對設計執行C模擬之後,開始執行C綜合。在C綜合階段,有5個子步驟。第一步,初始優化,這個階段只定義介面類型,同時設定循環邊界(如果存在循環邊界未知或者是個變數的情形)。該階段C綜合的結果可做為參考。第二步,設置pipeline和dataflow。Pipeline和dataflow均可作用於for循環和函數。這一步的主要目的是提升吞吐率、改善Latency。第三步,優化數組,改善Memory性能。例如,設置RAM類型,從單埠改為雙埠,可提高數據吞吐率;去除偽數據依賴,可縮短Latency。在這一步完成之後,設計基本達到最優結果。第四步和第五步屬於「錦上添花」。

實際操作時,建議創建不同的Solution,用於對比不同的pragmas對性能改善的力度,同時把pragmas以Tcl形式保存在獨立的文件中(暫時不要保存在C程式碼中)。待到最終選取合適的pragmas組合,達到最終性能指標之後,可以在把pragmas保存在C程式碼中(這個並不是必需的)。