哈哈哈哈哈操欧洲电影,久草网在线,亚洲久久熟女熟妇视频,麻豆精品色,久久福利在线视频,日韩中文字幕的,淫乱毛视频一区,亚洲成人一二三,中文人妻日韩精品电影

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線(xiàn)課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

HLS最全知識(shí)庫(kù)

OpenFPGA ? 來(lái)源:OpenFPGA ? 2023-01-15 11:27 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

HLS最全知識(shí)庫(kù)

副標(biāo)題-FPGA高層次綜合HLS(二)-Vitis HLS知識(shí)庫(kù)

高層次綜合(High-level Synthesis)簡(jiǎn)稱(chēng)HLS,指的是將高層次語(yǔ)言描述的邏輯結(jié)構(gòu),自動(dòng)轉(zhuǎn)換成低抽象級(jí)語(yǔ)言描述的電路模型的過(guò)程。

對(duì)于AMD Xilinx而言,Vivado 2019.1之前(包括),HLS工具叫Vivado HLS,之后為了統(tǒng)一將HLS集成到Vitis里了,集成之后增加了一些功能,同時(shí)將這部分開(kāi)源出來(lái)了。Vitis HLS是Vitis AI重要組成部分,所以我們將重點(diǎn)介紹Vitis HLS。

官方指南:

https://docs.xilinx.com/r/_lSn47LKK31fyYQ_PRDoIQ/root

重要術(shù)語(yǔ)

LUT 或 SICE

LUT 或 SICE是構(gòu)成了 FPGA 的區(qū)域。它的數(shù)量有限,當(dāng)它用完時(shí),意味著您的設(shè)計(jì)太大了!

BRAM 或 Block RAM

FPGA中的內(nèi)存。在 Z-7010 FPGA上,有 120 個(gè),每個(gè)都是 2KiB(實(shí)際上是 18 kb)。

Latency延遲

  • 設(shè)計(jì)產(chǎn)生結(jié)果所需的時(shí)鐘周期數(shù)。
  • 循環(huán)的延遲是一次迭代所需的時(shí)鐘周期數(shù)。

Initiation Interval (or II, or Interval間隔)

  • 在接受新數(shù)據(jù)之前必須執(zhí)行的時(shí)鐘周期數(shù)。

這與延遲不同!如果函數(shù)是流水線(xiàn)的,許多數(shù)據(jù)項(xiàng)會(huì)同時(shí)流過(guò)它。延遲是一個(gè)數(shù)據(jù)項(xiàng)被推入后彈出的時(shí)間,而時(shí)間間隔決定了數(shù)據(jù)可以被推入的速率。

  • 循環(huán)的間隔是可以開(kāi)始循環(huán)迭代的最大速率,以時(shí)鐘周期為單位。
18af9486-947b-11ed-bfe3-dac502259ad0.png

上圖中,左邊是函數(shù)右邊是循環(huán),左邊的時(shí)間間隔(接收新數(shù)據(jù)之前)是3個(gè)時(shí)鐘周期,右邊循環(huán)的間隔則是一個(gè)時(shí)鐘周期;對(duì)于左邊的延遲是這個(gè)函數(shù)產(chǎn)生結(jié)果的時(shí)鐘周期數(shù),是func_C運(yùn)行完畢產(chǎn)生的周期數(shù),為5個(gè)時(shí)鐘周期,右邊循環(huán)的延遲是一次迭代所需的時(shí)鐘數(shù),是4個(gè)時(shí)鐘周期。

上面的概念非常重要,要不然下面的一些指令作用也看不懂~

重要的指令

這是在實(shí)際使用過(guò)程中重要的指令列表(不是全部)。

  • Functions-函數(shù)

  • loops-循環(huán)

  • Various-所有都適合

  • Arrays-數(shù)組

  • parameters-參數(shù)

指令 適用范圍 描述
PIPELINE 流水線(xiàn)指令 Functions, loops 簡(jiǎn)單解釋就是使輸入更頻繁地傳遞給函數(shù)或循環(huán)。流水線(xiàn)后的函數(shù)或循環(huán)可以每 N 個(gè)時(shí)鐘周期處理一次新輸入,其中 N 是啟動(dòng)間隔(Initiation Interval)。'II' 默認(rèn)為 1,是 HLS 應(yīng)針對(duì)的啟動(dòng)間隔(即嘗試將新數(shù)據(jù)項(xiàng)輸入管道的速度應(yīng)該多快)。
UNROLL loops 創(chuàng)建循環(huán)的因子副本,讓其并行執(zhí)行(如果滿(mǎn)足數(shù)據(jù)流依賴(lài)性)。但是會(huì)浪費(fèi)資源(以資源換取速度)。盡可能將程序展開(kāi)以提高速度。
ALLOCATION Various 限制某事物的實(shí)例數(shù)。例如,如果只想在另一個(gè)函數(shù)toplevel中獲得函數(shù)foo的三個(gè)副本,請(qǐng)使用位置toplevel、限制設(shè)置為3、實(shí)例設(shè)置為foo、類(lèi)型設(shè)置為“function”的分配。這也適用于特定的運(yùn)算。
ARRAY_MAP Arrays 將多個(gè)較小的陣列映射成一個(gè)較大的陣列,以犧牲訪(fǎng)問(wèn)時(shí)間為代價(jià)來(lái)節(jié)省訪(fǎng)問(wèn)邏輯或 BRAM。'instance' 可以設(shè)置為任何未使用的名稱(chēng)。ARRAY_MAP 對(duì)同一個(gè)實(shí)例使用多個(gè) 來(lái)告訴 HLS 創(chuàng)建一個(gè)名為“instance”的新數(shù)組,其中包含所有較小的數(shù)組。保留“偏移”未設(shè)置。請(qǐng)注意,有些人在將三個(gè)或更多初始化數(shù)組映射到單個(gè) RAM 時(shí)遇到了此指令引起的錯(cuò)誤。如果在仿真和實(shí)現(xiàn)的設(shè)計(jì)之間遇到行為差異,請(qǐng)嘗試刪除此指令。
ARRAY_PARTITION Arrays 將一個(gè)大數(shù)組拆分為多個(gè)較小的數(shù)組(與ARRAY_MAP相反)。這對(duì)于增加并行訪(fǎng)問(wèn)的可能性很有用。如果“type”是“block”,則源數(shù)組將分成block。如果它是“cyclic”,那么元素將被交錯(cuò)到目標(biāo)數(shù)組中。在這兩種情況下,“factor因子”都是要?jiǎng)?chuàng)建的較小數(shù)組的數(shù)量。如果 'type' 是 'complete' 則忽略 'factor' 并且陣列被完全分割成組件寄存器,因此不使用任何 Block RAM。
DATAFLOW Functions 見(jiàn)下文
INLINE Functions 該指令不是將函數(shù)視為單個(gè)硬件單元,而是在每次調(diào)用 HLS 時(shí)將函數(shù)內(nèi)聯(lián)。這是以硬件為代價(jià)增加了潛在的并行性。如果 'recursive' 為真,則內(nèi)聯(lián)函數(shù)調(diào)用的所有函數(shù)也被視為標(biāo)有 INLINE。
INTERFACE Function,parameters 告訴 HLS 如何在函數(shù)之間傳遞參數(shù)。這在頂層函數(shù)中至關(guān)重要,因?yàn)樗x了設(shè)計(jì)的引腳排列。在 EMBS 中,我們有一個(gè)應(yīng)該堅(jiān)持使用的模板(上圖)。
LATENCY Functions, loops HLS 通常會(huì)嘗試在綜合時(shí)實(shí)現(xiàn)最小延遲。如果使用此指令指定更大的最小延遲,HLS 將“pad out”函數(shù)或循環(huán)并減慢一切。這有助于資源共享(減少資源),并且對(duì)于創(chuàng)建延遲很有用。如果 HLS 無(wú)法達(dá)到要求的延遲,它將發(fā)出警告。
LOOP_FLATTEN loops 將嵌套循環(huán)展平為單個(gè)循環(huán)。應(yīng)用于 最里面的 循環(huán)。如果成功,將生成更快的硬件代碼。
LOOP_TRIPCOUNT loops 如果循環(huán)具有可變的循環(huán)邊界,HLS 將不知道它需要多少次迭代。這意味著它無(wú)法為設(shè)計(jì)延遲提供明確的值。這允許我們?yōu)樵O(shè)計(jì)指定循環(huán)的最小、平均和最大行程計(jì)數(shù)(迭代次數(shù))。這只會(huì)影響報(bào)告,不會(huì)影響硬件代碼生成。
RESOURCE Various 這用于指定應(yīng)使用特定硬件資源來(lái)實(shí)現(xiàn)源代碼元素。指定是否應(yīng)使用 BRAM 或 LUT 實(shí)現(xiàn)ARRAY。見(jiàn)下文詳解。

任意精度類(lèi)型

可以在 HLS 中使用普通的 C 類(lèi)型(int、 char等)變量。但是,設(shè)計(jì)中的常用的寄存器并不完全需要 4、8 或 16 位寬,那么可以使用任意精度類(lèi)型來(lái)準(zhǔn)確定義需要多寬的數(shù)據(jù)類(lèi)型,而不是接受這種低效率的通用定義。

下面展示了如何使用 C 和 C++ 風(fēng)格的任意精度類(lèi)型。我們建議使用 C++,除非有特定的理由不這樣做。

在 C 中:

包含 頭文件。然后,可以聲明具有如下類(lèi)型的變量:

uint5 x 無(wú)符號(hào)整數(shù),5 位寬
int19 x 有符號(hào)整數(shù),19 位寬

在 C++ 中:

包含 頭文件。然后,可以聲明具有如下類(lèi)型的變量:

ap_uint<5> x 無(wú)符號(hào)整數(shù),5 位寬
ap_int<19> x 有符號(hào)整數(shù),19 位寬

按照上面的設(shè)置應(yīng)該能夠正常打印任意精度類(lèi)型,但是如果在調(diào)試過(guò)程中得到奇怪的值,請(qǐng)先使用printf調(diào)用to_int():

ap_uint<23>myAP;
printf("%d
",myAP.to_int());

復(fù)位行為

在 HLS 中,所有靜態(tài)和全局變量都被初始化為零(如果給定了初始化值,則初始化為其他值)。這包括 RAM,其中每個(gè)元素都被清除為零。然而,這種初始化只發(fā)生在 FPGA 首次編程時(shí)。任何后續(xù)處理器復(fù)位都不會(huì)觸發(fā)初始化過(guò)程。

如果需要清除設(shè)備的內(nèi)部狀態(tài),那么應(yīng)該包含某種復(fù)位協(xié)議(根據(jù)復(fù)位狀態(tài)處理所需要的程序)。

AXI 從接口和 AXI 主接口

可以在 HLS 組件中使用兩個(gè)接口,即 AXI Slave 和 AXI Master。

  • AXI Slave:ARM 內(nèi)核使用此接口來(lái)啟動(dòng)和停止 HLS 組件。他們還可以使用此接口來(lái)讀取和寫(xiě)入相對(duì)少量的用戶(hù)定義值。

  • AXI Master:如果需要更大量的共享數(shù)據(jù),HLS 組件可以使用 AXI Master 接口啟動(dòng)事務(wù)以從主系統(tǒng)內(nèi)存讀取和寫(xiě)入數(shù)據(jù)。

可以通過(guò)toplevel在 HLS 組件中為函數(shù)指定參數(shù)并將指令附加到這些參數(shù)來(lái)定義所需的接口。下面顯示了一個(gè)只有從接口的組件:

帶有AXI Slave的 HLS 組件

uint32toplevel(uint32*arg1,uint32*arg2,uint32*arg3,uint32*arg4){
#pragmaHLSINTERFACEs_axiliteport=arg1bundle=AXILiteSregister
#pragmaHLSINTERFACEs_axiliteport=arg2bundle=AXILiteSregister
#pragmaHLSINTERFACEs_axiliteport=arg3bundle=AXILiteSregister
#pragmaHLSINTERFACEs_axiliteport=arg4bundle=AXILiteSregister
#pragmaHLSINTERFACEs_axiliteport=returnbundle=AXILiteSregister
}

而下面是一個(gè)同時(shí)具有從接口和主接口的組件:

具有從屬和主接口的 HLS 組件

uint32toplevel(uint32*ram,uint32*arg1,uint32*arg2,uint32*arg3,uint32*arg4){
#pragmaHLSINTERFACEm_axiport=ramoffset=slavebundle=MAXI
#pragmaHLSINTERFACEs_axiliteport=arg1bundle=AXILiteSregister
#pragmaHLSINTERFACEs_axiliteport=arg2bundle=AXILiteSregister
#pragmaHLSINTERFACEs_axiliteport=arg3bundle=AXILiteSregister
#pragmaHLSINTERFACEs_axiliteport=arg4bundle=AXILiteSregister
#pragmaHLSINTERFACEs_axiliteport=returnbundle=AXILiteSregister
}

請(qǐng)注意,可以為從接口添加和刪除參數(shù),并更改它們的數(shù)據(jù)類(lèi)型,只需記住也要更新關(guān)聯(lián)#pragmaS。HLS 將相應(yīng)地更新組件的驅(qū)動(dòng)程序。

PS:主數(shù)據(jù)類(lèi)型:由于 AXI 主接口會(huì)連接到 32 位寬的 RAM,因此在指定 AXI 主接口時(shí)應(yīng)始終使用 32 位數(shù)據(jù)類(lèi)型。

一旦決定了的接口,應(yīng)該能夠依靠 Vivado 自動(dòng)化連線(xiàn)來(lái)連接一切。

請(qǐng)注意,返回端口的 pragma 很重要!

#pragmaHLSINTERFACEs_axiliteport=returnbundle=AXILiteSregister

//端口=返回包=AXILiteS寄存器

即使不使用函數(shù)的返回值,此 pragma 也會(huì)告訴 HLS 將 start、stop、done 和 reset 信號(hào)捆綁到 AXI Slave 接口中的控制寄存器中。因此,這將生成相應(yīng)的驅(qū)動(dòng)程序函數(shù)來(lái)啟動(dòng)和停止生成的 IP 內(nèi)核。如果不包含此 pragma,則 HLS 將為這些信號(hào)生成簡(jiǎn)單的連線(xiàn),并且 IP 內(nèi)核將無(wú)法直接被 ARM 內(nèi)核控制。

多種類(lèi)型的 AXI Master

Vitis HLS在從同一主AXI端口復(fù)制值并將其解釋為不同類(lèi)型時(shí)非常挑剔。

例如,以下 memcpy 可能會(huì)導(dǎo)致“Stored value type does not match pointer operand type! (存儲(chǔ)值類(lèi)型與指針操作數(shù)類(lèi)型不匹配?。?,嘗試將 RAM 視為uint32 和float類(lèi)型時(shí),綜合過(guò)程中將會(huì)產(chǎn)生 LLVM 錯(cuò)誤:

voidtoplevel(uint32*ram){
#pragmaHLSINTERFACEm_axiport=ramoffset=slavebundle=MAXI
uint32u_values[10];
floatf_values[10];

memcpy(u_values,ram,40);
memcpy(f_values,ram+10,40);
}

為了正確強(qiáng)制從 RAM 中復(fù)制數(shù)據(jù)的類(lèi)型信息,可以使用union,如下所示:

typedefunion{
uint32u;
floatf;
}ram_t;

voidtoplevel(ram_t*ram){
#pragmaHLSINTERFACEm_axiport=ramoffset=slavebundle=MAXI
uint32u_values[10];
floatf_values[10];

for(inti=0;ifor(inti=0;i

此外,只要循環(huán)邊界從零開(kāi)始(并且是固定的),HLS應(yīng)該足夠聰明,將其視為類(lèi)似于memcpy的突發(fā)傳輸-在綜合過(guò)程中查找“推斷MAXI端口上長(zhǎng)度為X的總線(xiàn)突發(fā)讀取”來(lái)證實(shí)這一點(diǎn)。

強(qiáng)制和阻止使用 Block RAM

HLS 會(huì)自動(dòng)將大部分ARRAY轉(zhuǎn)換為 BRAM。這通常很有用,因?yàn)榧拇嫫鰽RRAY在 LUT(FPGA 空間)方面非常昂貴。但是,F(xiàn)PGA 的 BRAM 數(shù)量有限。BRAM 也只有 2 個(gè)訪(fǎng)問(wèn)端口。這意味著在任何時(shí)候最多有兩個(gè)并行進(jìn)程可以訪(fǎng)問(wèn) RAM。這可能會(huì)限制設(shè)計(jì)的并行性潛力。

如果HLS使用的是不希望使用的BRAM,則將類(lèi)型設(shè)置為COMPLETE且維度設(shè)置為1的指令array_PARTITION應(yīng)用于數(shù)組。這將迫使它從寄存器中生成數(shù)組。這會(huì)占用大量的FPGA空間(LUT),所以要節(jié)約!

要強(qiáng)制 HLS 使用 BRAM,請(qǐng)將指令BIND_STORAGE集應(yīng)用到 RAM_2P。(添加時(shí)按下幫助按鈕可查看所有各種選項(xiàng)的說(shuō)明)。

該 ARRAY_MAP 指令(見(jiàn)上文)可以通過(guò)自動(dòng)將多個(gè)較小的數(shù)組放入一個(gè)較大的數(shù)組來(lái)幫助節(jié)省 Block RAM。

當(dāng)更改 HLS 時(shí)

當(dāng)更改 HLS 代碼時(shí),請(qǐng)執(zhí)行以下步驟以確保bitfile已更新,方便進(jìn)行正確地測(cè)試。

  • 1、重新運(yùn)行綜合。
  • 2、重新導(dǎo)出 IP 核。
  • 3、在 Vivado 中,它應(yīng)該已經(jīng)注意到了變化,并且會(huì)出現(xiàn)一條消息說(shuō)“IP Catalog is out-of-date”。a、如果沒(méi)有,請(qǐng)單擊 IP Status,然后單擊重新運(yùn)行報(bào)告

b、單擊刷新 IP 目錄

c、在 IP Status面板中,應(yīng)選擇 toplevel IP。單擊 Upgrade 選項(xiàng)。

  • 4、在“Generate Output Products”對(duì)話(huà)框中,單擊“Generate”。

  • 5、單擊生成比特流。

  • 6、導(dǎo)出硬件到 Vitis。

  • 7、在 Vitis 中重新編程 FPGA 并運(yùn)行軟件。

現(xiàn)在應(yīng)該明白了為什么測(cè)試和仿真如此重要了!

循環(huán)優(yōu)化

在 HLS 中,可以將指令應(yīng)用于循環(huán)以指示它展開(kāi)或流水線(xiàn)。考慮以下循環(huán):

myloop:for(inti=0;i

默認(rèn)情況下,HLS 將按順序執(zhí)行循環(huán)的每次迭代。它的執(zhí)行將如下所示:

18be5804-947b-11ed-bfe3-dac502259ad0.png

如果循環(huán)的每次迭代需要 10 個(gè)時(shí)鐘周期,那么循環(huán)總共需要 30 個(gè)周期才能完成。

如果我們給這個(gè)循環(huán) PIPELINE 指令,那么 HLS 將嘗試在元素 0 完成之前開(kāi)始計(jì)算元素 1,從而創(chuàng)建一個(gè)PIPELINE。這意味著循環(huán)的整體執(zhí)行時(shí)間會(huì)更短,但代價(jià)是更復(fù)雜的控制邏輯和更多的寄存器來(lái)存儲(chǔ)中間數(shù)據(jù)。循環(huán)如下所示:

18d466f8-947b-11ed-bfe3-dac502259ad0.png

只有在沒(méi)有阻止此優(yōu)化的依賴(lài)項(xiàng)時(shí),它才能執(zhí)行此操作??紤]以下代碼:

intlastVal;

for(inti=0;i

在此示例中,循環(huán)被迫按順序執(zhí)行,因?yàn)樵谙乱淮窝h(huán)迭代開(kāi)始時(shí)需要在循環(huán)體末尾使用計(jì)算出的值。PIPELINE 仍然會(huì)試圖加快速度,但不會(huì)大幅加快。

最后,如果我們給循環(huán) UNROLL 指令,那么 HLS 將嘗試并行執(zhí)行循環(huán)的迭代。這需要更多的硬件,但速度非??臁T谖覀兊氖纠?,整個(gè)循環(huán)只需要 10 個(gè)周期。

18ec3f9e-947b-11ed-bfe3-dac502259ad0.png

這要求循環(huán)的元素之間沒(méi)有數(shù)據(jù)依賴(lài)關(guān)系。例如,如果 doSomething() 保留一個(gè)執(zhí)行次數(shù)的全局計(jì)數(shù)器,則此依賴(lài)項(xiàng)將阻止 UNROLL 指令工作。

請(qǐng)注意,UNROLL默認(rèn)情況下會(huì)嘗試展開(kāi)循環(huán)的所有迭代。這可能會(huì)導(dǎo)致非常大的設(shè)計(jì)!為了使事情更合理,可以設(shè)置UNROLL的FACTOR參數(shù)來(lái)告訴工具要?jiǎng)?chuàng)建多少副本。

應(yīng)用UNROLL后,最好在分析視圖中查看它是否實(shí)際應(yīng)用。成功展開(kāi)的設(shè)計(jì)在分析視圖中將非?!按怪薄?,表示同一列中的操作同時(shí)發(fā)生。如果視圖仍然非?!八健鼻矣泻芏嗔?,那么很可能是數(shù)據(jù)依賴(lài)項(xiàng)阻止了展開(kāi)。可以嘗試通過(guò)單擊操作來(lái)確定是什么阻止了展開(kāi)。該工具將繪制箭頭以顯示輸入的內(nèi)容和輸出的內(nèi)容。請(qǐng)記住,BlockRAM 一次只能進(jìn)行兩次訪(fǎng)問(wèn),因此,如果有一個(gè)大型ARRAY,而這些工具是從 BlockRAM 制作的,則展開(kāi)或流水線(xiàn)操作最多只能創(chuàng)建 2 個(gè)副本??梢愿嬖V工具不要使用帶有ARRAY_PARTITION指令的塊RAM。這可以快得多,但要使用更多的硬件資源。

數(shù)據(jù)流優(yōu)化

如果沒(méi)有使用限制資源的指令(例如 ALLOCATION 指令),HLS 會(huì)尋求最小化延遲并提高并發(fā)性。但是數(shù)據(jù)依賴(lài)性可以限制這一點(diǎn)。例如,訪(fǎng)問(wèn)數(shù)組的函數(shù)或循環(huán)必須在完成之前完成對(duì)數(shù)組的所有讀/寫(xiě)訪(fǎng)問(wèn),這就阻止了下一個(gè)消耗數(shù)據(jù)的函數(shù)或循環(huán)啟動(dòng)。

函數(shù)或循環(huán)中的操作可能會(huì) 在前一個(gè)函數(shù)或循環(huán)完成其所有操作之前開(kāi)始操作。

HLS指定數(shù)據(jù)流優(yōu)化時(shí):

  • 分析順序函數(shù)或循環(huán)之間的數(shù)據(jù)流。

這允許函數(shù)或循環(huán)并行運(yùn)行,從而減少延遲并提高 RTL 設(shè)計(jì)的吞吐量,但以增加硬件資源為代價(jià)。嘗試一下DATAFLOW ,看看它是否對(duì)設(shè)計(jì)有幫助。

找不到 'crt1.o' 錯(cuò)誤

當(dāng)試圖在實(shí)驗(yàn)室硬件以外的機(jī)器上運(yùn)行測(cè)試時(shí),可能會(huì)收到一個(gè)錯(cuò)誤,抱怨它找不到“crt1.o”。如果是這樣,就需要為項(xiàng)目設(shè)置自定義鏈接器標(biāo)志。

單擊頂部菜單中的“Project”,然后單擊Project Settings。在此框中,單擊左側(cè)的“Simulation”,然后將以下內(nèi)容粘貼到“Linker Flags”框中:

-B"/usr/lib/x86_64-linux-gnu/"

我的循環(huán)有???latency估計(jì)!

有時(shí),HLS 綜合報(bào)告將包含?而不是給出最小和最大延遲的值。這是因?yàn)樵O(shè)計(jì)中至少有一個(gè)循環(huán)是數(shù)據(jù)相關(guān)的,即它循環(huán)的次數(shù)取決于 HLS 無(wú)法知道的數(shù)據(jù)值。

例如,下面的代碼:

18fd1ecc-947b-11ed-bfe3-dac502259ad0.png

當(dāng)綜合在綜合報(bào)告中給出以下內(nèi)容:

1912bdcc-947b-11ed-bfe3-dac502259ad0.png

如果我們檢查代碼,它將來(lái)自ram的元素相加,但要相加的元素的確切數(shù)量來(lái)自用戶(hù),作為arg1參數(shù)輸入。因此,HLS無(wú)法提前知道該硬件執(zhí)行需要多長(zhǎng)時(shí)間,因?yàn)槊看芜\(yùn)行時(shí)它都是可變的。這就是上面我們說(shuō)的運(yùn)行時(shí)依賴(lài)于數(shù)據(jù)。生成的硬件將正常工作,我們只是無(wú)法預(yù)測(cè)運(yùn)行需要多長(zhǎng)時(shí)間。查看循環(huán)的細(xì)節(jié),HLS仍然可以告訴我們循環(huán)的延遲是2,換句話(huà)說(shuō),它不知道它將迭代多少次,但每次迭代將花費(fèi)2個(gè)時(shí)鐘周期。

一般來(lái)說(shuō),應(yīng)該盡量避免這種情況。如果 HLS 無(wú)法預(yù)測(cè)最壞的情況,那么它會(huì)過(guò)于“謹(jǐn)慎”,并且它可能會(huì)制造比我們需要的更大的硬件。此外,不能展開(kāi)具有可變循環(huán)邊界的循環(huán)。

一些算法從根本上是依賴(lài)于數(shù)據(jù)的,如果這種情況無(wú)法避免,那么可以通過(guò)將LOOP_TRIPCOUNT指令添加到循環(huán)中來(lái)告訴 HLS ,假設(shè)循環(huán)將進(jìn)行給定次數(shù)的迭代,但這僅用于報(bào)告目的。生成的硬件將完全相同,但HLS將在循環(huán)迭代該次數(shù)的假設(shè)下生成延遲數(shù)。這意味著延遲數(shù)字不“正確”,但這仍然有助于了解其他優(yōu)化是否具有總體積極效果。

定點(diǎn)類(lèi)型

當(dāng)需要使用小數(shù)運(yùn)算但又不想支付使用浮點(diǎn)的大量硬件成本時(shí),定點(diǎn)類(lèi)型很有用。Vitis HLS 用戶(hù)指南(https://www.xilinx.com/support/documentation/sw_manuals/xilinx2020_2/ug1399-vitis-hls.pdf)中詳細(xì)描述了定點(diǎn)類(lèi)型,下面是一個(gè)簡(jiǎn)短示例:

定點(diǎn)示例

#include
#include

ap_fixed<15,?5>a=3.45;
ap_fixed<15,?5>b=9.645;
ap_fixed<20,?6>c=a/b*2;
std::cout<ifmoreaccuracyisrequired.

C標(biāo)準(zhǔn)數(shù)學(xué)函數(shù)(在math.h中)僅針對(duì)浮點(diǎn)實(shí)現(xiàn),但Xilinx在hls_math.h中提供了某些函數(shù)的定點(diǎn)實(shí)現(xiàn)。在hls::命名空間下;例如:hls::sqrt()、hls::cos()和hls::sin()。

此外,以下賽靈思示例代碼顯示了另一種定點(diǎn)平方根實(shí)現(xiàn),在某些情況下可能更有效。

fxp_sqrt.h

#ifndef__FXP_SQRT_H__
#define__FXP_SQRT_H__
#include
#include
usingnamespacestd;

/*
*Providesafixedpointimplementationofsqrt()
*Mustbecalledwithunsignedfixedpointnumberssoconvertbeforecalling,follows:
*ap_ufixed<32,?20>in=input_number;
*ap_ufixed<32,?20>out;
*fxp_sqrt(out,in);
*/
template
voidfxp_sqrt(ap_ufixed&result,ap_ufixed&in_val)
{
enum{QW=(IW1+1)/2+(W2-IW2)+1};//derivemaxrootwidth
enum{SCALE=(W2-W1)-(IW2-(IW1+1)/2)};//scale(shift)toadjinitialremainervalue
enum{ROOT_PREC=QW-(IW1%2)};
assert((IW1+1)/2<=?IW2);?//?Check?that?output?format?can?accommodate?full?result
???ap_uintq=0;//partialsqrt
ap_uintq_star=0;//diminishedpartialsqrt
ap_ints;//scaledremainderinitializedtoextractedinputbits
if(SCALE>=0)
s=in_val.range(W1-1,0)<else
s=((in_val.range(W1-1,0)>>(0-(SCALE+1)))+1)>>1;
//Non-restoringsquare-rootalgorithm
for(inti=0;i<=?ROOT_PREC;?i++)?{
??????if(s>=0){
s=2*s-(((ap_int(q)<else{
s=2*s+(((ap_int(q_star)<"extraiteration"method
if(s>0)
q=q+1;
//Truncateexcessbitandassigntooutputformat
result.range(W2-1,0)=ap_uint(q>>1);
}
#endif

總結(jié)

這是《FPGA高層次綜合HLS》系列教程第二篇,后面會(huì)按照專(zhuān)題繼續(xù)更新,文章有什么問(wèn)題,歡迎大家批評(píng)指正~感謝大家支持。


審核編輯 :李倩

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • FPGA
    +關(guān)注

    關(guān)注

    1663

    文章

    22491

    瀏覽量

    638819
  • HLS
    HLS
    +關(guān)注

    關(guān)注

    1

    文章

    135

    瀏覽量

    25960

原文標(biāo)題:總結(jié)

文章出處:【微信號(hào):Open_FPGA,微信公眾號(hào):OpenFPGA】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    HPM知識(shí)庫(kù) | [EtherCAT] 從站運(yùn)行過(guò)程中報(bào)錯(cuò)(錯(cuò)誤碼:0x1A\\0x1B\\0x2C)的代碼分析

    HPM知識(shí)庫(kù)先楫半導(dǎo)體官方公眾號(hào)全新上線(xiàn)「HPM知識(shí)庫(kù)」專(zhuān)欄。我們將在這里不定期更新技術(shù)文檔、開(kāi)發(fā)指南與實(shí)戰(zhàn)教程,打造先楫MCU開(kāi)發(fā)的“一站式技術(shù)參考指南”!了解更多,歡迎訪(fǎng)問(wèn)https
    的頭像 發(fā)表于 03-13 08:34 ?226次閱讀
    HPM<b class='flag-5'>知識(shí)庫(kù)</b> | [EtherCAT] 從站運(yùn)行過(guò)程中報(bào)錯(cuò)(錯(cuò)誤碼:0x1A\\0x1B\\0x2C)的代碼分析

    開(kāi)發(fā)知識(shí)庫(kù)測(cè)試添加知識(shí)庫(kù)

    文檔類(lèi)型的知識(shí)要等待數(shù)據(jù)校驗(yàn)完成后才能上架 可以點(diǎn)擊知識(shí)名稱(chēng)查看知識(shí)詳情 等待后端處理完成可以點(diǎn)擊知識(shí)列表的上架 在智能體中知識(shí)庫(kù)的位置點(diǎn)
    發(fā)表于 03-06 15:07

    鴻蒙智能體開(kāi)發(fā)知識(shí)庫(kù)---創(chuàng)建知識(shí)庫(kù)

    在小藝智能體平臺(tái)頁(yè)面,通過(guò)【工作空間】-【知識(shí)庫(kù)】-【新建知識(shí)庫(kù)】,進(jìn)入新建知識(shí)庫(kù)流程。 若勾選【授權(quán)知識(shí)庫(kù)用于知識(shí)問(wèn)答,授權(quán)后該
    發(fā)表于 03-06 10:18

    HPM知識(shí)庫(kù) | 力位混合控制庫(kù)使用指南

    概述力位混合控制(HybridForce-PositionControl)是一種結(jié)合力控制和位置控制的阻抗控制方法,廣泛應(yīng)用于機(jī)器人關(guān)節(jié)控制、柔順裝配、人機(jī)交互等場(chǎng)景。本庫(kù)實(shí)現(xiàn)了
    的頭像 發(fā)表于 03-02 12:05 ?1925次閱讀
    HPM<b class='flag-5'>知識(shí)庫(kù)</b> | 力位混合控制<b class='flag-5'>庫(kù)</b>使用指南

    藝開(kāi)放平臺(tái)鴻蒙智能體版本管理

    當(dāng)前智能體的草稿態(tài)版本?;赝嗽瓌t: a. 因歷史版本關(guān)聯(lián)插件、工作流、卡片或知識(shí)庫(kù)可能會(huì)發(fā)生變化,資源相關(guān)配置可能發(fā)生變化; 若資源已更新版本,回退后將自動(dòng)關(guān)聯(lián)資源的最新版本。 若資源已下架或刪除
    發(fā)表于 02-27 19:18

    HLS設(shè)計(jì)中的BRAM使用優(yōu)勢(shì)

    高層次綜合(HLS)是一種將高級(jí)編程語(yǔ)言(如C、C++或SystemC)轉(zhuǎn)換為硬件描述語(yǔ)言(HDL)的設(shè)計(jì)方法。在FPGA設(shè)計(jì)中,設(shè)計(jì)者可以靈活地利用FPGA內(nèi)部的資源,如塊RAM(BRAM)。雖然
    的頭像 發(fā)表于 01-28 14:36 ?389次閱讀

    通過(guò)vivado HLS設(shè)計(jì)一個(gè)FIR低通濾波器

    Vivado HLS是一款強(qiáng)大的高層次綜合工具,可將C/C++代碼轉(zhuǎn)換為硬件描述語(yǔ)言(HDL),顯著提升FPGA開(kāi)發(fā)效率。
    的頭像 發(fā)表于 01-20 16:19 ?504次閱讀
    通過(guò)vivado <b class='flag-5'>HLS</b>設(shè)計(jì)一個(gè)FIR低通濾波器

    設(shè)備維修總踩坑?故障知識(shí)庫(kù) + AI 診斷,新手也能修復(fù)雜機(jī)

    設(shè)備維修的核心痛點(diǎn),本質(zhì)是知識(shí)難沉淀、故障難預(yù)判。知識(shí)庫(kù)解決經(jīng)驗(yàn)傳承問(wèn)題,AI診斷實(shí)現(xiàn)精準(zhǔn)高效,二者結(jié)合讓維修從“經(jīng)驗(yàn)依賴(lài)”轉(zhuǎn)向“標(biāo)準(zhǔn)化+智能輔助”。
    的頭像 發(fā)表于 01-08 14:04 ?511次閱讀
    設(shè)備維修總踩坑?故障<b class='flag-5'>知識(shí)庫(kù)</b> + AI 診斷,新手也能修復(fù)雜機(jī)

    零基礎(chǔ)在智能硬件上克隆原神可莉?qū)崿F(xiàn)桌面陪伴(提供人設(shè)提示詞、知識(shí)庫(kù)、固件下載)

    個(gè)步驟:1、創(chuàng)建智能體:配置可莉的基礎(chǔ)信息2、聲音復(fù)刻:克隆可莉的聲音3、配置知識(shí)庫(kù):配置可莉和嘟嘟可的背景、故事經(jīng)歷、語(yǔ)錄等知識(shí)庫(kù) 4、自定義喚醒詞:修改喚醒詞和喚醒回復(fù)語(yǔ) (篇尾提供修改了喚醒詞
    發(fā)表于 08-22 19:51

    如何在Unified IDE中創(chuàng)建視覺(jué)庫(kù)HLS組件

    組件開(kāi)始,該組件可以導(dǎo)出為 XO 文件用于 Vitis 系統(tǒng)工程;這與“自上而下的流程”相反,后者從 Vitis 工程開(kāi)始,然后將 HLS 組件導(dǎo)入該工程。我們將創(chuàng)建視覺(jué)庫(kù)示例“remap”,并在 Unified IDE 中執(zhí)行每一步,而不是運(yùn)行 Makefile 腳本
    的頭像 發(fā)表于 07-02 10:55 ?1652次閱讀
    如何在Unified IDE中創(chuàng)建視覺(jué)<b class='flag-5'>庫(kù)</b><b class='flag-5'>HLS</b>組件

    使用AMD Vitis Unified IDE創(chuàng)建HLS組件

    這篇文章在開(kāi)發(fā)者分享|AMD Vitis HLS 系列 1 - AMD Vivado IP 流程(Vitis 傳統(tǒng) IDE) 的基礎(chǔ)上撰寫(xiě),但使用的是 AMD Vitis Unified IDE,而不是之前傳統(tǒng)版本的 Vitis HLS。
    的頭像 發(fā)表于 06-20 10:06 ?2509次閱讀
    使用AMD Vitis Unified IDE創(chuàng)建<b class='flag-5'>HLS</b>組件

    如何使用AMD Vitis HLS創(chuàng)建HLS IP

    本文逐步演示了如何使用 AMD Vitis HLS 來(lái)創(chuàng)建一個(gè) HLS IP,通過(guò) AXI4 接口從存儲(chǔ)器讀取數(shù)據(jù)、執(zhí)行簡(jiǎn)單的數(shù)學(xué)運(yùn)算,然后將數(shù)據(jù)寫(xiě)回存儲(chǔ)器。接著會(huì)在 AMD Vivado Design Suite 設(shè)計(jì)中使用此 HLS
    的頭像 發(fā)表于 06-13 09:50 ?2209次閱讀
    如何使用AMD Vitis <b class='flag-5'>HLS</b>創(chuàng)建<b class='flag-5'>HLS</b> IP

    Thread標(biāo)準(zhǔn)認(rèn)證概述

    本篇知識(shí)庫(kù)文章概述了開(kāi)發(fā)人員如何將其Thread物聯(lián)網(wǎng)設(shè)備進(jìn)行Thread Group認(rèn)證所需的步驟,并重點(diǎn)介紹使用Silicon Labs(芯科科技)的EFR32無(wú)線(xiàn)射頻器件的相關(guān)流程。
    的頭像 發(fā)表于 06-04 10:10 ?1093次閱讀
    Thread標(biāo)準(zhǔn)認(rèn)證概述

    【「零基礎(chǔ)開(kāi)發(fā)AI Agent」閱讀體驗(yàn)】操作實(shí)戰(zhàn),開(kāi)發(fā)一個(gè)編程助手智能體

    一. 首先要理解智能體的相關(guān)概念 ,比如角色,限定,技能:包括插件等,知識(shí):包括知識(shí)庫(kù),文檔等等. 創(chuàng)建步驟: 二.創(chuàng)建智能體: 預(yù)覽和調(diào)試 智能體發(fā)布: 最后是使用智能體: 1.從coze
    發(fā)表于 05-27 11:16
    桃园市| 金寨县| 怀来县| 古交市| 五家渠市| 铜陵市| 徐汇区| 阳原县| 措美县| 宜章县| 台前县| 哈尔滨市| 扶余县| 礼泉县| 邹平县| 佳木斯市| 长子县| 腾冲县| 瑞昌市| 敦化市| 墨竹工卡县| 二连浩特市| 岗巴县| 开化县| 麻江县| 含山县| 仁寿县| 北安市| 九龙县| 天津市| 镇康县| 玉田县| 夏津县| 黄陵县| 原平市| 武穴市| 高陵县| 大同市| 长宁区| 平湖市| 余姚市|