ug902-ch1ch4:Managing Interfaces
文章目錄
- Managing Interfaces(ug902 ch1_High-Level Synthesis)
- 1. Interface synthesis
- Interface Synthesis Overview
- 塊級(jí)接口協(xié)議
- 端口級(jí)別接口協(xié)議
- Interface Synthesis I/O Protocols
- Block-Level Interface Protocols
- Port-Level Interface Protocols: AXI4 Interfaces
- Port-Level Interface Protocols: No I/O Protocol
- Port-Level Interface Protocols: Wire Handshakes
- Port-Level Interface Protocols: Memory Interfaces
- Interface Synthesis and Structs
- Interface Synthesis and Multi-Access Pointers
- Specifying Interfaces
- Interface Synthesis for SystemC
- 2. Using AXI4 Interfaces
- 2.1 AXI4-stream 接口
- 2.2 AXI4-Lite 接口
- 2.3 AXI4 master 接口
- 2.4 Managing Interfaces with SSI Technology Devices
- Command reference(ug902 ch4)
- set_directive_interface
- Interface Synthesis Reference(ug902 ch4)
- Block-Level I/O Protocols
- ap_ctrl_none
- ap_ctrl_hs
- ap_ctrl_chain
- Port-Level I/O Protocols
- ap_none
- ap_stable
- ap_hs (ap_ack, ap_vld, and ap_ovld)
- ap_ack
- ap_vld
- ap_ovld
- ap_memory, bram
- ap_fifo
- ap_bus
- axis
- s_axilite
- m_axi
- Interface Synthesis Requirements
- 經(jīng)驗(yàn)總結(jié):
Managing Interfaces(ug902 ch1_High-Level Synthesis)
1. Interface synthesis
綜合頂級(jí)函數(shù)時(shí),該函數(shù)的參數(shù)arguments(或參數(shù)parameters)將綜合到RTL端口中。 此過(guò)程稱為接口綜合。
Interface Synthesis Overview
#include "sum_io.h" dout_t sum_io(din_t in1, din_t in2, dio_t *sum) { dout_t temp; *sum = in1 + in2 + *sum; temp = in1 + in2; return temp; }上面的示例包括:
- 兩個(gè)按值傳遞的輸入in1和in2。
- 一個(gè)指針sum,雙向讀取和寫(xiě)入。
- 一個(gè)函數(shù)返回,temp的值
使用默認(rèn)的接口綜合設(shè)置,將設(shè)計(jì)綜合為一個(gè)RTL塊,其端口如下圖所示
Vivado HLS在RTL設(shè)計(jì)上創(chuàng)建了三種類型的端口 - Clock and Reset ports: ap_clk and ap_rst.
- Block-Level interface protocol. These are shown expanded in the preceding figure: ap_start, ap_done, ap_ready, and ap_idle.
- Port Level interface protocols. These are created for each argument in the top-level function and the function return (if the function returns a value). In this example, these ports are: in1, in2, sum_i, sum_o, sum_o_ap_vld, and ap_return
塊級(jí)接口協(xié)議
默認(rèn)情況下,將向設(shè)計(jì)中添加塊級(jí)接口協(xié)議。這些信號(hào)控制塊,獨(dú)立于任何端口級(jí)I/O協(xié)議。這些端口控制塊何時(shí)可以開(kāi)始處理數(shù)據(jù)(ap_start),何時(shí)可以接受新輸入(ap_ready),以及設(shè)計(jì)是否空閑(ap_idle)或完成了操作(ap_done)。
端口級(jí)別接口協(xié)議
最終一組信號(hào)是數(shù)據(jù)端口。創(chuàng)建的I/O協(xié)議取決于C參數(shù)的類型和默認(rèn)值。在使用塊級(jí)協(xié)議啟動(dòng)塊的操作之后,使用端口級(jí)IO協(xié)議將數(shù)據(jù)按順序輸入和輸出塊。
默認(rèn)情況下,按值傳遞參數(shù)和指針的輸入被實(shí)現(xiàn)為簡(jiǎn)單的連接端口,沒(méi)有相關(guān)的握手信號(hào)。在上面的例子中,輸入端口是在沒(méi)有I/O協(xié)議的情況下實(shí)現(xiàn)的,只有一個(gè)數(shù)據(jù)端口。如果端口沒(méi)有I/O協(xié)議,(默認(rèn)或設(shè)計(jì))輸入數(shù)據(jù)必須保持穩(wěn)定,直到讀取它。
默認(rèn)情況下,輸出指針是帶有一個(gè)輸出有效信號(hào)vld來(lái)實(shí)現(xiàn)的,以指示輸出數(shù)據(jù)何時(shí)有效。如果沒(méi)有與輸出端口相關(guān)聯(lián)的I/O協(xié)議,則很難知道何時(shí)讀取數(shù)據(jù)。
同時(shí)讀取和寫(xiě)入的函數(shù)自變量被拆分為單獨(dú)的輸入和輸出端口。
如果函數(shù)有返回值,則使用輸出端口ap_return來(lái)提供返回值。當(dāng)設(shè)計(jì)完成一個(gè)事務(wù)時(shí)(這相當(dāng)于C函數(shù)的一次執(zhí)行)塊級(jí)協(xié)議指示該函數(shù)已使用ap_done信號(hào)完成。這還表明端口ap_return上的數(shù)據(jù)是有效的,可以讀取。
注意:頂級(jí)函數(shù)的返回值不能是指針。 Note: The return value to the top-level function cannot be a pointer
Interface Synthesis I/O Protocols
通過(guò)接口綜合創(chuàng)建的接口類型取決于C參數(shù)的類型,默認(rèn)接口模式和INTERFACE優(yōu)化指令。
Interface Synthesis Reference包含接口協(xié)議的完整細(xì)節(jié),包括波形圖。以下提供了每種接口模式的概述。
Block-Level Interface Protocols
塊級(jí)接口協(xié)議是ap_ctrl_none、ap_ctrl_hs和ap_ctrl_chain。這些是指定的,并且只能在函數(shù)或函數(shù)返回上指定。當(dāng)指令在GUI中指定時(shí),它將把這些協(xié)議應(yīng)用于函數(shù)返回。即使函數(shù)不使用返回值,也可以在函數(shù)返回時(shí)指定塊級(jí)協(xié)議。
前面示例中描述的ap_ctrl_hs模式是默認(rèn)協(xié)議。ap_ctrl_chain協(xié)議類似于ap_ctrl_hs,但是有一個(gè)額外的輸入端口ap_continue,它提供來(lái)自使用這個(gè)塊中的數(shù)據(jù)的塊的反壓。如果函數(shù)完成時(shí)ap_continue端口為邏輯0,則塊將停止操作,下一個(gè)事務(wù)將不繼續(xù)進(jìn)行。只有當(dāng)ap_continue被斷言為邏輯1時(shí),下一個(gè)事務(wù)才會(huì)繼續(xù)。
ap_ctrl_none模式實(shí)現(xiàn)了沒(méi)有任何塊級(jí)I/O協(xié)議的設(shè)計(jì)。
如果函數(shù)返回也指定為AXI4-Lite接口(s_axilite),則塊級(jí)接口中的所有端口都分組到AXI4-Lite接口中。當(dāng)使用另一個(gè)設(shè)備(如CPU)來(lái)配置和控制這個(gè)塊何時(shí)啟動(dòng)和停止操作時(shí),這是一種常見(jiàn)的實(shí)踐。
Port-Level Interface Protocols: AXI4 Interfaces
Vivado HLS支持的AXI4接口包括AXI4- stream (axis)、AXI4- lite (s_axilite)和AXI4 master (m_axi)接口,可以這樣指定:
AXI4- stream接口:僅指定輸入?yún)?shù)或輸出參數(shù),而不指定輸入/輸出參數(shù)。
AXI4-Lite接口:指定除流之外的任何類型的參數(shù)。您可以將多個(gè)參數(shù)分組到同一個(gè)AXI4-Lite接口中。
AXI4 master接口:僅指定數(shù)組和指針(以及c++中的引用)。您可以將多個(gè)參數(shù)分組到同一個(gè)AXI4接口中。
Port-Level Interface Protocols: No I/O Protocol
ap_none和ap_stable模式不向端口添加I/O協(xié)議
Port-Level Interface Protocols: Wire Handshakes
ap_hs、ap_vld、ap_ovld
模式ap_hs包括一個(gè)帶有數(shù)據(jù)端口的雙向握手信號(hào)。
模式ap_vld只有一個(gè)有效端口,ap_ack只有一個(gè)確認(rèn)端口。
模式ap_ovld與in-out參數(shù)一起使用。當(dāng)in-out被分割為單獨(dú)的輸入和輸出端口時(shí),模式ap_none應(yīng)用于輸入端口,ap_vld應(yīng)用于輸出端口。這是讀&寫(xiě)指針參數(shù)的默認(rèn)值。
ap_hs模式可以應(yīng)用于按順序讀寫(xiě)的數(shù)組。如果Vivado HLS可以確定讀或?qū)懺L問(wèn)不是順序的,它將停止合成與一個(gè)錯(cuò)誤。如果無(wú)法確定訪問(wèn)順序,Vivado HLS將發(fā)出警告。
Port-Level Interface Protocols: Memory Interfaces
默認(rèn)情況下,數(shù)組參數(shù)作為ap_memory接口實(shí)現(xiàn)。這是一個(gè)標(biāo)準(zhǔn)的塊RAM接口,具有數(shù)據(jù)、地址、芯片啟用和寫(xiě)啟用端口。
ap_memory可以實(shí)現(xiàn)為雙端口或單端口 。如果Vivado HLS能夠確定使用雙端口接口將縮短初始間隔II,則會(huì)自動(dòng)實(shí)現(xiàn)雙端口接口。RESOURCE指令用于指定存儲(chǔ)資源,如果該指令數(shù)組唄指定a single-port block RAM,則將實(shí)現(xiàn)單端口接口。相反,如果使用RESOURCE指令指定了一個(gè)雙端口接口,如果Vivado HLS確定這個(gè)接口沒(méi)有任何好處,那么它將自動(dòng)實(shí)現(xiàn)一個(gè)單端口接口。
bram接口模式的功能與ap_memory接口相同。唯一的不同是在Vivado IP Integrator中如何實(shí)現(xiàn)端口:
- ap_memory接口顯示為多個(gè)單獨(dú)的端口。
- bram接口顯示為單個(gè)分組端口,可以使用a single point-to-point 連接到Xilinx塊RAM。
如果以順序方式訪問(wèn)數(shù)組,則可以使用ap_fifo接口。與ap_hs接口一樣,如果Vivado HLS確定數(shù)據(jù)訪問(wèn)不是順序的,它將停止訪問(wèn);如果Vivado HLS無(wú)法確定訪問(wèn)是否是順序的,則報(bào)告警告;如果Vivado HLS確定訪問(wèn)是順序的,則不發(fā)出消息。ap_fifo接口只能用于讀或?qū)?#xff0c;不能同時(shí)用于讀和寫(xiě)。
ap_bus接口可以與總線橋進(jìn)行通信。該接口不遵循任何特定的總線標(biāo)準(zhǔn),但足夠通用,可以與總線橋接一起使用,而總線橋接又與系統(tǒng)總線進(jìn)行仲裁。總線橋必須能夠緩存所有的突發(fā)寫(xiě)。
Interface Synthesis and Structs
默認(rèn)情況下,接口上的結(jié)構(gòu)分解為它們的成員元素,并且為每個(gè)成員元素分別實(shí)現(xiàn)端口。在沒(méi)有INTERFACE指令時(shí),將實(shí)現(xiàn)該結(jié)構(gòu)的每個(gè)成員元素。結(jié)構(gòu)體的數(shù)組被實(shí)現(xiàn)為多個(gè)數(shù)組,每個(gè)結(jié)構(gòu)成員都有一個(gè)單獨(dú)的數(shù)組。 DATA_PACK優(yōu)化指令用于將結(jié)構(gòu)的所有元素打包到單個(gè)寬向量中。這允許同時(shí)讀取和寫(xiě)入結(jié)構(gòu)的所有成員。將結(jié)構(gòu)的成員元素按照它們?cè)贑代碼中出現(xiàn)的順序放入向量中:結(jié)構(gòu)的第一個(gè)元素與向量的LSB對(duì)齊,結(jié)構(gòu)的最后一個(gè)元素與向量的MSB對(duì)齊。結(jié)構(gòu)中的所有數(shù)組都被劃分為單獨(dú)的數(shù)組元素,并按從低到高的順序放置在向量中。
Note:DATA_PACK優(yōu)化不支持包含其他結(jié)構(gòu)的打包結(jié)構(gòu)。
Interface Synthesis and Multi-Access Pointers
使用多次訪問(wèn)的指針可能會(huì)在綜合之后引入意外的行為。在下面的示例中,指針d_i被讀取四次,指針d_o被寫(xiě)入兩次:指針執(zhí)行多次訪問(wèn)。
Specifying Interfaces
Interface synthesis由接口指令或使用配置設(shè)置來(lái)控制。要指定端口上的接口模式,請(qǐng)?jiān)贕UI選項(xiàng)卡中選擇端口,然后右鍵單擊鼠標(biāo)打開(kāi)Vivado HLS指令編輯器,如下圖所示
Vivado HLS指令編輯器,設(shè)置以下選項(xiàng):
? mode
Select the interface mode from the drop-down menu.
? register
選擇此選項(xiàng),則在操作的第一個(gè)周期中執(zhí)行所有按值傳遞pass-by-value的讀取。對(duì)于輸出端口,register選項(xiàng)確保輸出registered。您可以將register選項(xiàng)應(yīng)用于設(shè)計(jì)中的任何函數(shù)。對(duì)于memory、FIFO和AXI4接口,register選項(xiàng)不起作用。
? depth
This option specifies how many samples are provided to the design by the test bench and how many output values the test bench must store. Use whichever number is greater.
Note: 在單個(gè)事務(wù)中多次讀取或?qū)懭胫羔樀那闆r,C / RTL co-simulation需要使用depth選項(xiàng) 。對(duì)于數(shù)組或使用hls::stream構(gòu)造時(shí),深度選項(xiàng)不是必需的。只有在接口上使用指針時(shí)才需要它。
如果深度選項(xiàng)設(shè)置得太小,C/RTLco-simulation可能會(huì)死鎖deadlock,如下所示:
? port
This option is required. By default, Vivado HLS does not register ports.
Note: To specify a block-level I/O protocol, select the top-level function in the Vivado HLS GUI, and specify the port as the function return.
? offset
This option is used for AXI4 interfaces.
要設(shè)置接口配置,請(qǐng)選擇Solution → Solution Settings → General →config_interface。 您可以使用配置設(shè)置來(lái):
- 將全局時(shí)鐘使能添加到RTL設(shè)計(jì)。
- 刪除懸掛dangling端口,such as those created by elements of a struct that are not used in the design.
- 為任何全局變量創(chuàng)建RTL端口。
任何C函數(shù)都可以使用全局變量:在任何函數(shù)范圍之外定義的那些變量。 默認(rèn)情況下,全局變量不會(huì)導(dǎo)致創(chuàng)建RTL端口:Vivado HLS假定全局變量位于最終設(shè)計(jì)中。 config_interface配置設(shè)置Exposure_global指示Vivado HLS為全局變量創(chuàng)建端口。
Interface Synthesis for SystemC
2. Using AXI4 Interfaces
2.1 AXI4-stream 接口
2.2 AXI4-Lite 接口
通過(guò)AXI4-Lite接口,設(shè)計(jì)可以被CPU或微控制器控制。
- 將多個(gè)端口分組到同一個(gè)AXI4-Lite接口中。
- 輸出C驅(qū)動(dòng)程序文件,與運(yùn)行在處理器上的代碼配合使用
以下示例演示了 Vivado HLS 將多個(gè)實(shí)參(包括函數(shù)返回) 作為 AXI4-Lite 接口來(lái)實(shí)現(xiàn)的方式。由于針對(duì) bundle 選項(xiàng)
每條指令都使用相同名稱, 因此每個(gè)端口都分組到同一個(gè) AXI4-Lite 接口中。
注釋: 如果不使用 bundle 選項(xiàng), Vivado HLS 會(huì)將使用 AXI4-Lite 接口指定的所有實(shí)參都分組到同一個(gè)默認(rèn)捆綁中,并自動(dòng)對(duì)端口進(jìn)行命名。
可向分組到同一個(gè) AXI4-Lite 接口的端口分配 I/O 協(xié)議。在上述示例中, Vivado HLS 將端口 b 作為 ap_vld 接口來(lái)實(shí)現(xiàn), 并將端口 b 分組到 AXI4-Lite 接口中。因此, AXI4-Lite 接口包含 3 個(gè)寄存器, 分別用于端口 b 的數(shù)據(jù)、確認(rèn)已讀取端口 b 的輸出, 以及端口 b 的輸入有效信號(hào)。
建議:為了在設(shè)計(jì)的操作過(guò)程中便于使用,Xilinx建議您不要在分組到AXI4-Lite接口中的端口中包含額外的I/O協(xié)議。但是,Xilinx建議在AXI4-Lite接口中包含與return端口相關(guān)聯(lián)的塊級(jí)I/O協(xié)議
You cannot assign arrays to an AXI4-Lite interface using the bram interface. You can only assign arrays to an AXI4-Lite interface using the default ap_memory interface. You also cannot assign any argument specified with ap_stable I/O protocol to an AXI4-Lite interface.
默認(rèn)情況下, Vivado HLS 會(huì)為分組到同一個(gè) AXI4-Lite 接口的每個(gè)端口分配地址。 Vivado HLS 可在 C 驅(qū)動(dòng)文件中提供已分配的地址。如需了解更多信息, 請(qǐng)參閱 C 驅(qū)動(dòng)文件。要顯式定義地址, 可使用 offset 選項(xiàng), 如以上示例中的實(shí)參 c 用例所示。
2.3 AXI4 master 接口
2.4 Managing Interfaces with SSI Technology Devices
Command reference(ug902 ch4)
set_directive_interface
ug902-High-Level Synthesis Reference Guide
Syntax
set_directive_interface [OPTIONS ] <-location> <-port>
? <-location> is the location (in the format function[/label]) where the function interface or registered output is to be specified.
? <-port> is the parameter (function argument or global variable) for which the interface has to be synthesized. This is not required when modes ap_ctrl_none or ap_ctrl_hs are used.
Options
-bundle :將函數(shù)參數(shù)分組到AXI端口。默認(rèn)情況下,Vivado HLS將作為AXI4-Lite接口指定的所有函數(shù)參數(shù)分組到單個(gè)AXI4-Lite端口。類似地,Vivado HLS將作為AXI4接口指定的所有函數(shù)參數(shù)分組到一個(gè)AXI4端口。
bundle選項(xiàng)顯式地將所有具有相同的函數(shù)參數(shù)分組到相同的接口端口,并將RTL端口命名為。
ap_none:沒(méi)有協(xié)議。接口是一個(gè)數(shù)據(jù)端口。
ap_stable:沒(méi)有協(xié)議。接口是一個(gè)數(shù)據(jù)端口。Vivado HLS假設(shè)數(shù)據(jù)端口在重置后總是穩(wěn)定的,這允許內(nèi)部?jī)?yōu)化掉不必要的寄存器。
ap_vld:使用valid指示數(shù)據(jù)何時(shí)可以有效讀寫(xiě)。
ap_ack:使用關(guān)聯(lián)的acknowledge端口實(shí)現(xiàn)數(shù)據(jù)端口,以確認(rèn)數(shù)據(jù)已被讀取或?qū)懭搿?br /> ap_hs:實(shí)現(xiàn)具有關(guān)聯(lián)的valid and acknowledge端口的數(shù)據(jù)端口,以提供雙向握手來(lái)指示何時(shí)數(shù)據(jù)對(duì)讀寫(xiě)有效,并確認(rèn)數(shù)據(jù)已被讀寫(xiě)。
ap_ovld:使用關(guān)聯(lián)的valid端口實(shí)現(xiàn)輸出數(shù)據(jù)端口,以指示數(shù)據(jù)何時(shí)可以有效讀寫(xiě)。
注意:Vivado HLS implements the input argument or the input half of any read/write arguments with mode ap_none.
ap_fifo:使用標(biāo)準(zhǔn)的FIFO接口實(shí)現(xiàn)端口,使用數(shù)據(jù)輸入和輸出端口,并使用相關(guān)的active-Low FIFO空端口和滿端口。
注意:只能對(duì)讀參數(shù)或寫(xiě)參數(shù)使用此接口。ap_fifo模式不支持雙向讀/寫(xiě)參數(shù)。
ap_bus:將指針和引用傳遞端口作為總線接口實(shí)現(xiàn)。
ap_memory:將數(shù)組參數(shù)作為標(biāo)準(zhǔn)的RAM接口實(shí)現(xiàn)。如果在Vivado IP integrator中使用RTL設(shè)計(jì),則內(nèi)存接口顯示為離散端口。將數(shù)組參數(shù)作為標(biāo)準(zhǔn)RAM接口實(shí)現(xiàn)。如果在Vivado IP integrator中使用RTL設(shè)計(jì),則內(nèi)存接口顯示為單個(gè)端口。
axis:將所有端口作為AXI4-Stream接口實(shí)現(xiàn)。
s_axilite:將所有端口實(shí)現(xiàn)為AXI4-Lite接口。Vivado HLS在導(dǎo)出RTL過(guò)程中生成一組相關(guān)的C驅(qū)動(dòng)程序文件。
m_axi:將所有端口都實(shí)現(xiàn)為AXI4接口。您可以使用config_interface命令來(lái)指定32位(默認(rèn))或64位地址端口,并控制任何地址偏移量。
ap_ctrl_none:沒(méi)有塊級(jí)I/O協(xié)議。注意:使用ap_ctrl_none模式可能會(huì)阻止使用C/RTL聯(lián)合仿真特性驗(yàn)證設(shè)計(jì)。
ap_ctrl_hs:實(shí)現(xiàn)一組塊級(jí)控制端口來(lái)啟動(dòng)設(shè)計(jì)操作,并指示設(shè)計(jì)何時(shí)空閑、何時(shí)完成,以及何時(shí)為新的輸入數(shù)據(jù)做好準(zhǔn)備。
Note: The ap_ctrl_hs是block-level I/O 默認(rèn)協(xié)議.
ap_ctrl_chain:實(shí)現(xiàn)一組塊級(jí)控制端口,用于啟動(dòng)設(shè)計(jì)操作、繼續(xù)操作,并指示設(shè)計(jì)何時(shí)空閑、何時(shí)完成,以及何時(shí)準(zhǔn)備好新的輸入數(shù)據(jù)。
Interface Synthesis Reference(ug902 ch4)
接口綜合只對(duì)頂層函數(shù)及其參數(shù)有用。
Block-Level I/O Protocols
默認(rèn)情況下,block-level interface protocol 會(huì)被自動(dòng)添加到設(shè)計(jì)中,這些接口控
制著整個(gè)塊(即頂層函數(shù)),獨(dú)立于任何 port-level I/O protocol。
block-level interface protocol 只作用于頂層函數(shù)或者頂層函數(shù)的返回值(不作用于頂層函數(shù)的參數(shù)),該協(xié)議只有三種,
ap_ctrl_none
ap_ctrl_hs
ap_ctrl_chain
Vivado HLS使用接口類型ap_ctrl_none、ap_ctrl_hs和ap_ctrl_chain來(lái)指定RTL是否使用塊級(jí)握手信號(hào)實(shí)現(xiàn)。塊級(jí)握手信號(hào)指定以下內(nèi)容:
- 當(dāng)設(shè)計(jì)可以開(kāi)始執(zhí)行操作時(shí)
- 當(dāng)操作結(jié)束時(shí)
- 當(dāng)設(shè)計(jì)處于空閑狀態(tài)并準(zhǔn)備好進(jìn)行新的輸入時(shí)
? 可以在函數(shù)或函數(shù)返回上指定這些塊級(jí)I/O協(xié)議。如果C代碼沒(méi)有返回值,您仍然可以在函數(shù)返回時(shí)指定塊級(jí)別的I/O協(xié)議。如果C代碼使用函數(shù)返回,Vivado HLS將為返回值創(chuàng)建輸出端口ap_return。
? ap_ctrl_hs塊級(jí)I/O協(xié)議是默認(rèn)的。下圖顯示了Vivado HLS在一個(gè)函數(shù)上實(shí)現(xiàn)ap_ctrl_hs時(shí)的結(jié)果RTL端口和行為。在本例中,函數(shù)使用return語(yǔ)句返回一個(gè)值,Vivado HLS在RTL設(shè)計(jì)中創(chuàng)建ap_return輸出端口。如果函數(shù)return statement未包含在C代碼中,則不創(chuàng)建此端口。
ap_ctrl_chain接口模式類似于ap_ctrl_hs,但提供了ap_continue來(lái)施加反壓(back pressure)。Xilinx建議在將Vivado HLS塊鏈接在一起時(shí)使用ap_ctrl_chain塊級(jí)I/O協(xié)議。
ap_ctrl_none
ap_ctrl_none塊級(jí)I/O協(xié)議,則不會(huì)創(chuàng)建塊級(jí)I/O協(xié)議中顯示的握手信號(hào)端口(ap_start、ap_idle、ap_ready和ap_done)。
如果在設(shè)計(jì)上沒(méi)有指定塊級(jí)I/O協(xié)議,那么在使用C/RTL cosimulation驗(yàn)證RTL設(shè)計(jì)時(shí),必須遵守接口綜合要求(Interface Synthesis Requirements)中描述的條件。
ap_ctrl_hs
ap_start (in) 為高表示代碼塊可以開(kāi)始處理數(shù)據(jù),這時(shí)
ap_idle (out)就為低,表明模塊處于非空閑狀態(tài)。
ap_ready (out) 如果為高,表明這個(gè)模塊可以接收新的數(shù)據(jù),
ap_done( out)為高則表明已經(jīng)處理完結(jié)果了。
下圖顯示了ap_ctrl_hs I/O協(xié)議為非流水線non-pipelined 設(shè)計(jì)創(chuàng)建的塊級(jí)握手信號(hào)的行為。
復(fù)位后,
? If ap_start remains High the design will start the next transaction.
? If ap_start is taken Low, the design will complete the current transaction and halt
operation
ap_ctrl_chain
ap_ctrl_chain塊級(jí)I/O協(xié)議類似于ap_ctrl_hs,但提供了ap_continue額外輸入端口。ap_continue信號(hào)為High表示使用輸出數(shù)據(jù)的下游塊downstream block已經(jīng)準(zhǔn)備好接受新的數(shù)據(jù)輸入。如果下游塊不能使用新的數(shù)據(jù)輸入,則ap_continue為低,將阻止上游塊 upstream blocks 生成其他數(shù)據(jù)。
下游塊的ap_ready端口可以直接驅(qū)動(dòng)ap_continue端口。以下是關(guān)于ap_continue端口的附加信息:
- 如果ap_continue=1,而ap_done=1,則設(shè)計(jì)將繼續(xù)運(yùn)行。其他塊級(jí)I/O信號(hào)的行為與ap_ctrl_hs塊級(jí)I/O協(xié)議中描述的相同。
- 如果ap_done=1,ap_continue=0,則設(shè)計(jì)停止運(yùn)行,ap_done信號(hào)保持高,如果ap_return端口存在,則ap_return端口上的數(shù)據(jù)保持有效。
下圖中,第一個(gè)事務(wù)完成,第二個(gè)事務(wù)立即啟動(dòng),因?yàn)閍p_done高時(shí)ap_continue高。但是,設(shè)計(jì)在第二個(gè)事務(wù)結(jié)束時(shí)停止,直到ap_continue為高值。
Port-Level I/O Protocols
ap_none
ap_none端口級(jí)I/O協(xié)議是最簡(jiǎn)單的接口類型,沒(méi)有與之關(guān)聯(lián)的其他信號(hào)。輸入和輸出數(shù)據(jù)信號(hào)都沒(méi)有關(guān)聯(lián)的控制端口來(lái)指示何時(shí)讀取或?qū)懭霐?shù)據(jù)。RTL設(shè)計(jì)中惟一的端口是源代碼中指定的端口。
ap_none接口不需要額外的硬件開(kāi)銷。然而,ap_none接口需要以下:
1,Producer blocks執(zhí)行以下操作之一:
- 在正確的時(shí)間向輸入端口提供數(shù)據(jù)
- 保留事務(wù)期間的數(shù)據(jù),直到設(shè)計(jì)完成
2,Consumer blocks 在正確的時(shí)間讀取輸出端口。
注意:ap_none接口不能用于數(shù)組參數(shù)。
ap_stable
與ap_none一樣,ap_stable協(xié)議不向設(shè)計(jì)中添加任何接口控制端口。
ap_stable類型通常用于可以更改但在正常操作期間保持穩(wěn)定的數(shù)據(jù),比如提供配置數(shù)據(jù)的端口。ap_stable類型通知Vivado HLS以下內(nèi)容:
- 應(yīng)用到端口的數(shù)據(jù)在正常操作期間保持穩(wěn)定,但不是可以優(yōu)化的常量。
- 這個(gè)端口的扇出不需要注冊(cè)。
- 注意:ap_stable類型只能應(yīng)用于輸入端口。當(dāng)應(yīng)用到inout端口時(shí),只有該端口的輸入被認(rèn)為是穩(wěn)定的。
ap_hs (ap_ack, ap_vld, and ap_ovld)
ap_hs端口級(jí)I/O協(xié)議在開(kāi)發(fā)過(guò)程中提供了最大的靈活性,允許自底向上和自頂向下的設(shè)計(jì)流。雙向握手可以安全地進(jìn)行所有塊內(nèi)通信,不需要人工干預(yù)或假設(shè)就可以進(jìn)行正確的操作。ap_hs端口級(jí)I/O協(xié)議提供以下信號(hào):
? 數(shù)據(jù)端口
? 確認(rèn)信號(hào),指示何時(shí)使用數(shù)據(jù)
? 讀取數(shù)據(jù)時(shí)的有效信號(hào)
下圖顯示了ap_hs接口對(duì)輸入和輸出端口的行為。在本例中,輸入端口命名為In,輸出端口命名為out。
注意:控制信號(hào)名稱基于原始端口名稱。例如,數(shù)據(jù)輸入的有效端口名為in_vld。
ap_ack
ap_ack端口級(jí)I/O協(xié)議是ap_hs接口類型的子集。
CAUTION!不能使用C/RTL cosimulation來(lái)驗(yàn)證在輸出端口上使用ap_ack的設(shè)計(jì)。
信號(hào):數(shù)據(jù)端口、確認(rèn)信號(hào)(指示何時(shí)使用數(shù)據(jù))
ap_vld
ap_vld是ap_hs接口類型的一個(gè)子集。
信號(hào):數(shù)據(jù)端口、數(shù)據(jù)vld
○ For input arguments, the design reads the data port as soon as the valid is active. Even if
the design is not ready to read new data, the design samples the data port and holds the
data internally until needed.
○ For output arguments, Vivado HLS implements an output valid port to indicate when the
data on the output port is valid.
ap_ovld
ap_ovld是ap_hs接口類型的一個(gè)子集。
信號(hào):數(shù)據(jù)端口、數(shù)據(jù)vld
valid
〇對(duì)于輸入?yún)?shù)和inout參數(shù)的輸入部分,設(shè)計(jì)默認(rèn)為類型ap_none。
〇輸出參數(shù)和輸出inout參數(shù)的一半,設(shè)計(jì)實(shí)現(xiàn)類型ap_vld
ap_memory, bram
ap_memory和bram端口級(jí)I/O協(xié)議用于實(shí)現(xiàn)數(shù)組參數(shù)。當(dāng)實(shí)現(xiàn)需要隨機(jī)訪問(wèn)內(nèi)存地址位置時(shí),這種端口級(jí)I/O協(xié)議可以與存儲(chǔ)元素(例如ram和rom)通信。
注意:如果順序訪問(wèn)存儲(chǔ)元素,那么可以使用ap_fifo接口。ap_fifo接口減少了硬件開(kāi)銷,因?yàn)椴恍枰刂飞伞?br /> ap_memory和bram接口端口級(jí)I/O協(xié)議是相同的。唯一的區(qū)別是Vivado IP integrator顯示模塊的方式:
- ap_memory接口以離散端口的形式出現(xiàn)。
- bram接口顯示為單個(gè)分組端口。在IP integrator中,可以使用單個(gè)連接創(chuàng)建到所有端口的連接?。
當(dāng)使用ap_memory接口時(shí),使用RESOURCE指令指定數(shù)組目標(biāo)。如果沒(méi)有為數(shù)組指定目標(biāo),Vivado HLS將決定是使用單端口RAM接口還是使用雙端口RAM接口。
提示:在運(yùn)行合成之前,確保使用RESOURCE指令將數(shù)組參數(shù)定向到正確的內(nèi)存類型。不同的memory會(huì)產(chǎn)生不同的schedule and RTL.
??下圖顯示了一個(gè)名為d的數(shù)組,它被指定為一個(gè)單端口塊RAM。端口名基于C函數(shù)參數(shù)。例如,如果C參數(shù)是d, chip_enable是d_ce,輸入數(shù)據(jù)是基于BRAM的輸出/q端口的d_q0。
Note::對(duì)于默認(rèn)塊RAM,設(shè)計(jì)期望輸入數(shù)據(jù)d_q0在下一個(gè)時(shí)鐘周期中可用。可以使用RESOURCE指令來(lái)指示RAM具有更長(zhǎng)的讀取延遲。
ap_fifo
當(dāng)一個(gè)輸出端口被寫(xiě)出時(shí),它的輸出有效信號(hào)接口是最硬件有效的方法,當(dāng)需要訪問(wèn)一個(gè)存儲(chǔ)元素,并且訪問(wèn)總是以順序的方式執(zhí)行,不需要隨機(jī)訪問(wèn)。ap_fifo端口級(jí)I/O協(xié)議支持以下內(nèi)容:
?允許端口連接到FIFO
?支持完整的、雙向的empty-full的通信
?適用于數(shù)組、指針和引用傳遞參數(shù)類型
注意:可以使用ap_fifo接口的函數(shù)通常使用指針,并且可能多次訪問(wèn)同一變量。
要了解在使用這種編碼風(fēng)格時(shí)volatile限定符的重要性,請(qǐng)參閱Multi-Access Pointer Interfaces: Streaming Data.
在下面的例子中,in1是一個(gè)指針,先訪問(wèn)當(dāng)前地址,然后訪問(wèn)當(dāng)前地址上面的兩個(gè)地址,最后訪問(wèn)下面的一個(gè)地址。
void foo(int* in1, ...) { int data1, data2, data3; ... data1= *in1; data2= *(in1+2); data3= *(in1-1); ... }如果in1被指定為ap_fifo接口,Vivado HLS將檢查訪問(wèn),確定訪問(wèn)順序不一致,并發(fā)出一個(gè)錯(cuò)誤,然后停止。要從非連續(xù)地址位置讀取數(shù)據(jù),請(qǐng)使用ap_memory或bram接口。
不能在讀取和寫(xiě)入的參數(shù)上指定ap_fifo接口。只能在輸入或輸出參數(shù)上指定ap_fifo接口。將輸入?yún)?shù)in和輸出參數(shù)out指定為ap_fifo接口的設(shè)計(jì)如下圖所示。
ap_bus
axis
axis模式指定一個(gè)axi4流I/O協(xié)議。有關(guān)AXI4流接口的完整描述(包括定時(shí)和端口),請(qǐng)參閱Vivado設(shè)計(jì)套件:AXI Reference Guide
(UG1037)。有關(guān)使用此I/O協(xié)議的全部功能的信息,請(qǐng)參閱Using AXI4 Interfaces。
s_axilite
s_axilite模式指定一個(gè)AXI4-Lite從I/O協(xié)議。有關(guān)AXI4-Lite從接口的完整描述(包括時(shí)間和端口),請(qǐng)參閱Vivado設(shè)計(jì)套件:AXI參考指南(UG1037)。有關(guān)使用此I/O協(xié)議的全部功能的信息,請(qǐng)參閱Using AXI4 Interfaces。
m_axi
m_axi模式指定了一個(gè)AXI4主I/O協(xié)議。有關(guān)AXI4主接口(包括timing和端口)的完整描述,請(qǐng)參閱Vivado設(shè)計(jì)套件:AXI參考指南(UG1037)。有關(guān)使用此I/O協(xié)議的全部功能的信息,請(qǐng)參閱Using AXI4 Interfaces。
Interface Synthesis Requirements
ch1-Verifying the RTL-Automatically Verifying the RTL
要使用C/RTL協(xié)同仿真特性來(lái)驗(yàn)證RTL設(shè)計(jì),至少滿足以下條件之一:
- 必須使用ap_ctrl_hs或ap_ctrl_chain塊級(jí)接口來(lái)合成頂級(jí)函數(shù)。
- 設(shè)計(jì)必須是純粹的組合。
- 頂級(jí)函數(shù)的啟動(dòng)間隔II必須為1。
- 接口必須是流式傳輸并使用ap_hs或axis接口模式實(shí)現(xiàn)的數(shù)組。
注意:hls::stream變量自動(dòng)實(shí)現(xiàn)為ap_fifo接口。
如果這些條件中至少有一個(gè)不滿足,C/RTL聯(lián)合模擬將使用以下消息停止
@E [SIM-345] Cosim only supports the following 'ap_ctrl_none' designs: (1)combinational designs; (2) pipelined design with task interval of 1; (3)designs with array streaming or hls_stream ports. @E [SIM-4] *** C/RTL co-simulation finished: FAIL ***IMPORTANT! 如果設(shè)計(jì)指定使用塊級(jí)別的IO協(xié)議ap_ctrl_none,并且設(shè)計(jì)包含任何使用非阻塞行為的hls::stream變量,則不能保證C/RTL協(xié)同仿真能夠完成。
如果將任何頂級(jí)函數(shù)參數(shù)指定為axil - lite接口,則函數(shù)返回也必須指定為axil - lite接口。
經(jīng)驗(yàn)總結(jié):
反壓的接口可以使用ap_ctrl_chain
CAUTION!不能使用C/RTL cosimulation來(lái)驗(yàn)證在輸出端口上使用ap_ack的設(shè)計(jì)。
ap_memory接口以離散端口的形式出現(xiàn)
ap_fifo適用于數(shù)組、指針和引用傳遞參數(shù)類型
ap_hs模式可以應(yīng)用于按順序讀寫(xiě)的數(shù)組。如果Vivado HLS可以確定讀或?qū)懺L問(wèn)不是順序的,它將停止合成與一個(gè)錯(cuò)誤。如果無(wú)法確定訪問(wèn)順序,Vivado HLS將發(fā)出警告。
注意:頂級(jí)函數(shù)的返回值不能是指針。 Note: The return value to the top-level function cannot be a pointer
總結(jié)
以上是生活随笔為你收集整理的ug902-ch1ch4:Managing Interfaces的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: R语言 VAR 模型的方差分解
- 下一篇: Single View Metrolog