寫在前面
本文是本系列專題的第六篇,參考高亞軍老師的視頻教程以及課程的ppt,主要介紹了vivado HLS數據類型的處理,結構體和枚舉類型的處理。
結構體
結構體當struct被用作頂級函數的參數時,
標量成員被實現爲標準標量端口
默認情況下,數組被實現爲內存端口。
工程中建議-在頭文件中定義結構體。
結構上的元素可以通過數據打包優化打包到單個向量中
- Byte_pad
-
- field_level
-
- struct_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下指示每一步操作,提高我們程序的可讀性。