HLS開發學習-06- 數據類型的處理-- HLS 中的複合數據類型

寫在前面

本文是本系列專題的第六篇,參考高亞軍老師的視頻教程以及課程的ppt,主要介紹了vivado HLS數據類型的處理,結構體和枚舉類型的處理。

結構體

結構體當struct被用作頂級函數的參數時,

標量成員被實現爲標準標量端口
默認情況下,數組被實現爲內存端口。

工程中建議-在頭文件中定義結構體。

結構上的元素可以通過數據打包優化打包到單個向量中

  • Byte_pad
    • field_level
    • struct_level
      在這裏插入圖片描述

結構體示例

簡單說明下這個例子,有過C基礎的人都大致瞭解這個的操作,這裏說一下結構體的大小:A佔用1字節,B是位寬爲4的長度爲4的數組,佔用4個字節所以一個結構體一共佔用了5個字節。具體功能很簡單這裏就不細說了。
在這裏插入圖片描述

Data pack mode

數據打包的方式,這裏我們在directive中可以進行配置,打包的模式。
在這裏插入圖片描述

field_level

field_level下的打包方式是:首先對每位數據都進行在標準字節長度下進行打包,這裏的A位寬爲4,但是一個字節位寬爲8,所以A需要拓展爲8位,如果A位寬爲13,那麼則需要打包在兩個字節下,也即是打包的數據位寬爲16。
在這裏插入圖片描述

struct_level

struct_level下的打包方式是:先打包結構,然後在標準字節長度下進行打包。和field_level相比,前者爲所有數據都爲8的倍數,後者則沒有限制數據位寬,可以任意位寬,但是在整體打包後,需要對打包後的數據長度進行限制,化爲整字節的長度。
在這裏插入圖片描述

打包方式對比

教程提及,兩種的打包方式效果相似,暫時不作爲區分
數據包可以減少延遲和初始間隔,即提高吞吐量
下面是剛剛的那個example的資源報表,經過了數據打包的操作,for循環展開,並行化處理,所以減少了延遲,提高了吞吐量。
在這裏插入圖片描述
這裏老師提到了對於仿真的設置,可以創建虛擬總線(這裏我暫時沒接觸到,暫時不深究)
在這裏插入圖片描述

枚舉類型

枚舉類型(也稱爲枚舉)是一種數據類型,其中每個可能的值都定義爲符號常量(稱爲枚舉器)

  • 枚舉是通過enum關鍵字聲明的
  • 每個枚舉數將根據其在枚舉列表中的位置自動分配一個整數值
  • 默認情況下,第一個枚舉器被分配整數值0,每個後續枚舉器都有一個比前一個枚舉器大1的值

在這裏插入圖片描述

枚舉示例

根據剛剛介紹的枚舉的處理,結合這裏的例子,我們可以看出,在我們的函數調用的時候可以在case的索引值,相比原先的數字,我們可以更加直觀的看出來每一個case的條件下執行的是具體哪種操作,我們可以利用枚舉給每一步的操作命名。
在這裏插入圖片描述
Vivado HLS將自動推斷模式的數據寬度,儘管默認情況下它是int該值與頭文件中枚舉類型定義的值一致,從仿真看出,工具和描述一致。
在這裏插入圖片描述

小結

Vivado HLS可以同時支持struct和enum結構和枚舉
都可以在頂層函數接口上
如果結構在頂層函數接口,它可以通過數據包指令打包
如果頂級函數接口上的枚舉,它實際上是一個整數,Vivado HLS將自動推斷出數據寬度。

簡單來說,HLS下進行結構體的調用時候,我們可以進行data pack 從而提高程序的效率,而引用枚舉,目前我認爲的實用操作就是在case下指示每一步操作,提高我們程序的可讀性。在這裏插入圖片描述

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