Vivado HLS推動協(xié)議處理系統(tǒng)蓬勃發(fā)展(上)
4 #pragma INTERFACE axis port=inData
本文引用地址:http://cafeforensic.com/article/273294.htm5 #pragma INTERFACE axis port=outData
6
7 static stream> modOne2modTwo;
8 static stream> modTwo2modThree;
9
10 moduleOne(inData, modOne2modTwo);
11 moduleTwo(modOne2modTwo, modTwo2modThree);
12 moduleThree(modTwo2modThree, outData);
13 }
例1中的代碼用于創(chuàng)建頂層模塊函數(shù),供調(diào)用所有其它子函數(shù)使用。頂層模塊函數(shù)使用兩個參數(shù),均屬于“流”(stream)類(Vivado HLS庫中提供的模塊類之一)。流是一種HLS建模架構(gòu),代表準(zhǔn)備以流方式交換的數(shù)據(jù)通過的接口。流可以實現(xiàn)為FIFO隊列或內(nèi)存,也可以是一種能夠配合任何C++架構(gòu)使用的模板類。在本例中,我們定義了一種稱為axiWord的數(shù)據(jù)結(jié)構(gòu)(Struct),如例2所示。
例2:定義流接口使用的C++ 結(jié)構(gòu)
struct axiWord {
ap_uint<64> data;
ap_uint<8> strb;
ap_uint<1> last;
};
該struct用于定義AXI4-Stream接口的部分字段。Vivado HLS能自動支持此類接口,使用編譯指令(pragma)語句即可完成設(shè)定。編譯指令是對高層次綜合工具的指令,用于指導(dǎo)工具實現(xiàn)要求的結(jié)果。例1中第4行和第5行的編譯指令用于告知Vivado HLS這兩個指令(具體是頂層模塊的輸入和輸出端口)將使用AXI4-Stream接口。AXI4-Stream I/F包含兩個必備信號,分別是有效信號和就緒信號,但它們沒有包含在聲明的數(shù)據(jù)結(jié)構(gòu)中。這是由于Vivado HLS AX4 I/F會在內(nèi)部處理這些信號,也就是說它們對用戶邏輯而言是透明的。如前文所述,在使用AXI4-Stream I/F時,從用戶處抽象流控制完全由Vivado HLS完成。
當(dāng)然未必一定使用AXI4-Stream接口。Vivado HLS提供有豐富的總線接口。這里選擇AXI4-Stream作為常見標(biāo)準(zhǔn)接口的示例,供用戶進(jìn)行包處理。
實現(xiàn)我們的設(shè)計的下一項工作是確保我們的三個模塊彼此互聯(lián)。這項工作也通過流完成,不過這次它們是位于頂層模塊的內(nèi)部。第7行和第8行用于聲明實現(xiàn)這一目標(biāo)的兩個流。這兩個流使用了另一種Vivado HLS結(jié)構(gòu)ap_uint。這是一種無符號一維位陣列,隨后將按此對其操作。同時這也是又一種模板類,因此必須設(shè)定這個陣列的寬度。在本例中使用64位,與頂層模塊輸入輸出I/F的數(shù)據(jù)成員寬帶匹配。還有一點需要詳細(xì)說明的是這些流全部聲明為靜態(tài)變量。靜態(tài)變量是指其值不隨函數(shù)調(diào)用變化的一種變量。由于在作為順序C/C++程序執(zhí)行時頂層模塊(以及全部的子模塊)每個時鐘周期會被調(diào)用一次,所以任何需要保持其值不隨時鐘周期變化的變量都需要聲明為靜態(tài)變量。
3 創(chuàng)建流水線設(shè)計
將要討論的最后也是最重要的一個是編譯指令。第2行中的數(shù)據(jù)流編譯指令指示Vivado HLS盡量以并行方式安排執(zhí)行該函數(shù)的所有子函數(shù)。“internal”參數(shù)用于設(shè)置該模塊的初始化間隔(II)。初始化間隔(II)告知Vivado HLS該模塊必須具備的處理新輸入數(shù)據(jù)字的頻次,故決定了設(shè)計的吞吐量。不過這并不妨礙模塊內(nèi)部的流水線化和擁有>1的時延。當(dāng)II=2時,該模塊將用兩個周期完成數(shù)據(jù)字的處理,然后再讀入新的數(shù)據(jù)字。以這種方式Vivado HLS可以簡化模塊最終的RTL。也就是說,在一個典型的協(xié)議處理應(yīng)用中,設(shè)計必須具備每個時鐘周期處理一個數(shù)據(jù)字的能力,故從現(xiàn)在起我們令I(lǐng)I=1。
初始化間隔(II)告知Vivado HLS該模塊必須具備的處理新輸入數(shù)據(jù)字的頻次,故決定了設(shè)計的吞吐量。
最后要解決的問題是函數(shù)調(diào)用本身。在Vivado HLS中,這個過程對應(yīng)的是模塊的實例化。傳遞給每個模塊的參數(shù)實質(zhì)上定義了模塊的通信端口。在本例中,通過將輸入連接到第一個模塊,然后用 modOne2modTwo流把第一個模塊連接到第二個模塊,依次類推,將三個模塊鏈接起來。(未完待續(xù))
c語言相關(guān)文章:c語言教程
c++相關(guān)文章:c++教程
評論