?
鏡像是云服務器實例運行環境的模板,包括操作系統和預裝軟件等配置。百度云為每個FPGA實例默認提供了專屬公共鏡像,用戶可以按需選擇適合的鏡像類型。
?
概述
基于百度云自研的FPGA加速卡,提供了一套FPGA標準開發環境。您可以使用百度云提供的鏡像工具包,在FPGA上開發與調試自己的業務功能,或者將已有的功能模塊移植到FPGA加速卡上。
百度自研FPGA加速卡使用Xilinx 20nm KU115 FPGA。FPGA板卡帶有4通道DDR4,每個通道72bit,帶ECC,容量2GB,速率2400Mhz。FPGA通過PCIE 3.0x8和CPU相連。板卡的結構框圖如下所示:
?
基于上面的FPGA板卡,百度還提供的FPGA標準開發環境,其系統結構如下圖:
?
FPGA標準開發環境具有極大的靈活性:
您可以自行研發FPGA中動態部分的邏輯,包括KU115芯片的絕大部分資源,以及4個DDR4通道,讓FPGA電路完成定制化的功能,
百度云提供驅動和應用參考設計,您只需修改軟件側的驅動和應用程序,調用FPGA完成特定的功能。
直接使用百度提供的工具包更換FPGA中動態部分的邏輯。
FPGA標準開發環境提供虛擬jtag工具,您可以使用vivado工具對FPGA進行調試。
FPGA 標準開發環境操作包括兩部分:
FPGA軟件驅動開發
以運行支持PE進行簡單浮點向量加功能的示例程序為例:
1. 編譯驅動,提供編譯示例程序。
2. 運行示例程序。
FPGA邏輯開發
使用工具包開發和調試用戶邏輯:
1. 使用Baidu_HW_design_toolkit編譯實現您的動態邏輯。
2. 使用bin_pr_tools更換您的動態邏輯。
3. 使用Vivado對您的動態邏輯進行調試。
FPGA軟件驅動開發
編譯驅動
修改driver/Makefile中的KERNELDIR變量,使之指向當前內核的編譯目錄,一般為/lib/modules/$(uname -r)/build目錄或/usr/src/kernels/$(uname -r)。
?
執行make,如果編譯成功,當前目錄下會生成xdma_xvc.ko驅動文件,如下圖所示:
?
執行insmod xdma_xvc.ko,裝載上一步生成的驅動文件,在/dev目錄下會出現如下設備文件/dev/xil_xvc/cfg_ioc0。
?
編譯示例程序
進入sample目錄,執行make。如果編譯成功,當前目錄下生成sample、sample_user_irq等可執行文件,參見下圖:
?
運行示例程序
執行./sample,輸出如下結果,PE正確地執行了浮點向量加功能。sample使用輪詢寄存器方式檢查命令結果是否完成。
執行./sample_user_irq,輸出如下結果,PE正確地執行了浮點向量加功能。sample_user_irq使用中斷方式檢查命令結果是否完成。
關鍵代碼示例
FPGA邏輯開發
使用Baidu_HW_design_toolkit編譯實現您的動態邏輯
“Baidu_HW_design_toolkit”工具包,幫助將您開發的動態邏輯實現在FPGA中。
“Baidu_HW_design_toolkit”提供FPGA硬件邏輯所需的環境,只需將自己邏輯所需的相關的文件(如rtl代碼,ip核,xdc約束等)放入指定的路徑,然后執行腳本,即可生成用于燒寫FPGA云服務器的邏輯鏡像文件。
“Baidu_HW_design_toolkit”包含了三個子文件夾,build,common_files和usr_files.
usr_files存放用戶的工程設計文件。
common_files存放FPGA云服務鏡像工程的一些通用設計。如靜態邏輯的dcp,ddr約束等。通常情況下,不建議您修改common_files目錄中的內容。
build存放制作FPGA云服務器邏輯鏡像所要執行的腳本,如果您具備豐富的FPGA開發經驗,可以根據自己的需要修改腳本。例如,用更加適合的布局布線策略管理您的工程實現。
“Baidu_HW_design_toolkit”提供了兩種流程制作FPGA云服務邏輯鏡像,需要準備不同的設計文件:
Non_IPI流程
這種方式比較類似傳統的FPGA工程實現方式,您需要準備好動態部分邏輯(也就是rp_bd_wrapper.rp_bd_i)的設計文件放入usr_files指定的目錄,然后執行build目錄下的run_nonIPI.tcl腳本。
IPI流程
這種方式采用vivado IP Integrator制作云服務邏輯鏡像的動態部分邏輯(也就是rp_bd_wrapper.rp_bd_i)。你需要準備好IPI的設計文件放入usr_files和build下指定的目錄,然后執行build目錄下的run_IPI.tcl腳本。
使用bin_pr_tools更換您的動態邏輯
“bin_pr_tools”工具包,是更換FPGA動態部分邏輯的必要工具。在使用該工具包前,您需要確保FPGA的驅動程序已經加載。然后運行bin_pr_tools目錄下的”load_pr_bin.sh”腳本即可更換您的動態部分邏輯。
$sudo sh load_pr_bin.sh base ./ver2/ver2_pr_region_partial.bin
OK set decouple! ...
OK loading clear bin! ...
OK loading pr region bin! ...
OK unset decouple! ...
OK soft reset rp_bd ...
successfully load custom bitstream!
partial clear bin: ./base/base_pr_region_partial_clear.bin
partial bin: ./ver2/ver2_pr_region_partial.bin
found clear bin base_pr_region_partial_clear.bin in the current partial bin file’s directory
copy bin base_pr_region_partial_clear.bin into ‘last_clear_bin’ directory
注意:由于更換動態部分邏輯時,需要寫入當前動態邏輯對應的clear bin,您務必保存好clear bin文件,以便下次更新動態邏輯時使用。同時bin_pr_tools工具包也會保存新動態邏輯對應的clear bin文件。
使用Vivado對您的動態邏輯進行調試
百度云提供工具包類似日常使用vivado操作,對您的動態邏輯進行調試。
在使用該工具包前,您需要確保FPGA的驅動程序已經加載。
1. 打開xvc_server工具包,運行xvc_pcie服務。
2. 使用vivado工具,僅需幾步就可以通過虛擬jtag識別FPGA設備。
3. 選擇動態邏輯對應的probe文件,類似使用Vivado工具,對工程中的ila和vio進行功能調試和信號查看。
?
FPGA示例工程說明
概述
為方便您掌握FPGA云服務器的使用流程,快速創建自己定制的加速卡邏輯,百度云提供一個demo工程作為示例。
該demo工程支持了基于FPGA云服務器開發的幾個基礎功能,主要包括:
工程分成靜態和動態兩部分邏輯,支持基于pcie總線的partial reconfiguration開發及配置流程。
靜態邏輯支持pcie-3.0-8x xdma,并提供了配套的driver。用戶不能修改也無需關注靜態部分的邏輯。
動態邏輯為用戶自定制部分,用戶需基于當前提供的接口實現所需功能邏輯。demo工程中的動態邏輯是一個element-wise向量加法模塊,基于HLS開發。接口包括:
1. 一個axi slave(256bit)和一個axi lite slave(32bit)接口,可分別用于傳輸邏輯所需的數據和控制命令。
2. 4個axi master(512bit),用于連接DDR MIG控制器(可選)。
3. 中斷、時鐘。
支持基于pcie總線的ila debug,可在云服務器上的vivado中抓取信號波形進行調試。
您可根據此demo工程的結構及提供的配套腳本了解fpga云服務器的開發流程,并以該工程為基礎,修改其中的動態邏輯,實現所需的其他功能。
工程結構
demo工程主要包含了兩個部分,分別是static_bd_wrapper和rp_bd_wrapper。
其中static_bd_wrapper屬于工程的靜態部分,提供了pcie xdma,基于pcie的debug模塊,flash控制器等。靜態部分的邏輯不暴露給用戶,用戶不能修改也不用關心靜態部分的邏輯。
rp_bd_wrapper則是動態邏輯,這部分邏輯中有rp_bd和其他一些組件。其中只有rp_bd是用戶可以修改的內容。其他組件主要用于支持用戶利用虛擬jtag進行調試或其他功能,這些組件不需要用戶關心,用戶不能修改。
rp_bd通過兩組AXI總線與static_bd_wrapper傳輸數據,可以此為基礎實現您所需的功能。
demo工程的rp_bd結構框圖如下:
?
模塊 說明
Block Ram ? rp_bd內部有一個64KB的block ram用來存儲計算所用的數據和計算結果,這個block ram可同時被host和卡上的用戶邏輯訪問,這是通過rp_bd中的一個AXI Interconnect實現的。 ?
AXI Interconnect ? AXI Interconnect用于協調兩個AXI master訪問rp_bd中的Block Ram;static_bd內的xdma輸出的AXI4連接到AXI Interconnect的一個slave端口,demo工程提供的drive支持host通過dma訪問這個block ram;PE內的Vector Add模塊輸出的AXI4連接到AXI Interconnect的另一個端口,使得用戶邏輯也可以訪問這個block ram。 ?
CU ? 命令處理單元,static_bd輸出的AXI-lite接口連接到PE中的CU模塊,CU模塊解析從AXI lite收到的命令,并產生符合ap_ctrl總線的請求信號與Vector Add模塊相連。ap_ctrl是通過HLS綜合出的邏輯模塊采用的一種標準狀態控制總線。有關其詳細介紹可以參考Xilinx ug902文檔。 ?
Vector Add ? 計算處理單元,Vector Add模塊完成向量加法運算,他是使用HLS高級綜合工具開發的,它的控制輸入為一組HLS模塊使用的ap_ctrl信號;他使用AXI總線協議將Block Ram中的數據讀出,進行加法運算后,將數據寫回Block Ram中。
PE工作流程
1. 軟件發起dma_to_dev將輸入向量A,B拷貝至dev;A,B的長度必須8個float數據對齊。(單精度浮點數)
2. 軟件通過配置寄存器發起PE計算指令,然后等待PE計算完成。
3. PE計算完成后,通過中斷通知CPU上的軟件驅動程序。
4. 軟件發起dma_from_dev將輸出向量C拷貝至host。(單精度浮點數)
評論
查看更多