Vivado HLS 開發步驟(高階綜合)(FPGA)
對於Vivado Hls來說,輸入包括Tesbench,C/C++原始碼和Directives,相應的輸出為IP Catalog,DSP和SysGen,特別的,一個工程只能有一個頂層函式用於綜和,這個頂層函式下面的子函式也是可以被綜合的,會生成相應的VHDL和Verilog程式碼,所以,C綜合後的RTL程式碼結構通常是跟原始C描述的結構是一致的,除非是子函式功能很簡單,所需要的邏輯量很小。 通常在main函式以下的函式都可以被綜合,也就是說,並不是所有的C/C++都可以被綜合,動態記憶體分配和涉及到作業系統層面的操作不可以被綜合。
本文結構框架:
- Creat New Project新建文件
- C simulation
- C systhesis
- RTL級模擬
- IP封裝
- 總結
1.Creat New Project新建文件:
新建一個Project name,點next(這裡選取簡單的4選1資料選擇器為例,主要是說明流程)
在Add Files裡新增mux41.c檔案,點next
新增mux41_test測試檔案,點next
點Part,這裡選擇Board下面的Zedboard Zynq開發板,然後點OK和finish
註釋:
mux41.c程式碼:
#include "mux41.h"
int1 mux41(int1 sig_a, int1 sig_b,int1 sig_c,int1 sig_d, int select)
{
if(select==0)
return sig_a;
else if(select==1)
return sig_b;
else if(select==2)
return sig_c;
else if(select==3)
return sig_d;
}
mux41.h程式碼:(標頭檔案)
#include <ap_cint.h>
mux41_tb程式碼:
#include <stdio.h>
#include "mux41.h"
int main(void )
{
int res1 = 0;
int res2 = 0;
int res3 = 0;
int res4 = 0;
res1=mux41(1,0,0,0,0);
res2=mux41(0,1,0,0,1);
res3=mux41(0,0,1,0,2);
res4=mux41(0,0,0,1,3);
if(res1 && res2 && res3 && res4)
printf("test passed, well done!\n");
return 0;
}
2.C simulation:
在選單裡Project>Run C simulation,C simulation可以得到csim檔案
從圖中看到,可以看到test passed,well done!,證明結果是正確的:
3.C systhesis:
在選單裡Solution>Run C Systhesis>Active solution,綜合會得到syn檔案
注意綜合得到的verilog程式碼的可讀性很差,不需要讀懂,所以大多數優化都在C這個層面去做的,下面是綜合後的verilog程式碼:
// ==============================================================
// RTL generated by Vivado(TM) HLS - High-Level Synthesis from C, C++ and SystemC
// Version: 2016.3
// Copyright (C) 1986-2016 Xilinx, Inc. All Rights Reserved.
//
// ===========================================================
`timescale 1 ns / 1 ps
(* CORE_GENERATION_INFO="mux41,hls_ip_2016_3,{HLS_INPUT_TYPE=c,HLS_INPUT_FLOAT=0,HLS_INPUT_FIXED=1,HLS_INPUT_PART=xc7z020clg484-
1,HLS_INPUT_CLOCK=10.000000,HLS_INPUT_ARCH=others,HLS_SYN_CLOCK=5.258000,HLS_SYN_LAT=0,HLS_SYN_TPT=none,HLS_SYN_MEM=0,HLS_SYN_DSP=0,HLS_SYN_FF=0,HLS_SYN_LUT=41}" *)
module mux41 (
ap_start,
ap_done,
ap_idle,
ap_ready,
sig_a,
sig_b,
sig_c,
sig_d,
select_r,
ap_return
);
parameter ap_const_lv32_0 = 32'b00000000000000000000000000000000;
parameter ap_const_lv32_1 = 32'b1;
parameter ap_const_lv32_2 = 32'b10;
input ap_start;
output ap_done;
output ap_idle;
output ap_ready;
input [0:0] sig_a;
input [0:0] sig_b;
input [0:0] sig_c;
input [0:0] sig_d;
input [31:0] select_r;
output [0:0] ap_return;
wire [0:0] tmp_fu_60_p2;
wire [0:0] tmp_1_fu_66_p2;
wire [0:0] sel_tmp1_fu_86_p2;
wire [0:0] sel_tmp2_fu_92_p2;
wire [0:0] sel_tmp_fu_78_p3;
wire [0:0] tmp_2_fu_72_p2;
wire [0:0] tmp7_fu_106_p2;
wire [0:0] sel_tmp5_fu_112_p2;
wire [0:0] p_0_fu_98_p3;
assign ap_done = ap_start;
assign ap_idle = 1'b1;
assign ap_ready = ap_start;
assign ap_return = ((sel_tmp5_fu_112_p2[0:0] === 1'b1) ? p_0_fu_98_p3 : sig_d);
assign p_0_fu_98_p3 = ((sel_tmp2_fu_92_p2[0:0] === 1'b1) ? sig_b : sel_tmp_fu_78_p3);
assign sel_tmp1_fu_86_p2 = (tmp_fu_60_p2 ^ 1'b1);
assign sel_tmp2_fu_92_p2 = (tmp_1_fu_66_p2 & sel_tmp1_fu_86_p2);
assign sel_tmp5_fu_112_p2 = (tmp7_fu_106_p2 | tmp_fu_60_p2);
assign sel_tmp_fu_78_p3 = ((tmp_fu_60_p2[0:0] === 1'b1) ? sig_a : sig_c);
assign tmp7_fu_106_p2 = (tmp_1_fu_66_p2 | tmp_2_fu_72_p2);
assign tmp_1_fu_66_p2 = ((select_r == ap_const_lv32_1) ? 1'b1 : 1'b0);
assign tmp_2_fu_72_p2 = ((select_r == ap_const_lv32_2) ? 1'b1 : 1'b0);
assign tmp_fu_60_p2 = ((select_r == ap_const_lv32_0) ? 1'b1 : 1'b0);
endmodule //mux41
4.RTL級模擬:
在選單裡Solution>RunC/RTL cosimulation,需要對Co-similation Dialog設定如下:
得到如下結果,我們會發現Verilog的Status是pass,證明C/RTL cosimulation成功:
然後我們點開波形檢視視窗,此時會自動開啟Vivado軟體,從圖中看到,mux41的功能正確:
5.IP封裝:
在選單裡Solution>Export TL,設定如下:
IP封裝後,會得到impl檔案,其中就有我們所需要的三個子檔案ip,verilog,vhdl
總結:
事實上,在整個流程中,使用者先建立一個設計 C、C++ 或 SystemC 原始碼,以及一個C的測試平臺。隨後需要用 GCC/G++或 Visual C++ 模擬器驗證設計的系統行為。一旦行為設計執行良好,對應的測試臺的問題全部解決,就可以通過 Vivado HLS Synthesis 執行設計,生成 RTL 設計,程式碼可以是 Verilog,也可以是 VHDL。有了 RTL 後,隨即可以執行設計的 Verilog 或 VHDL 模擬,或使用工具的C封裝器技術建立 SystemC 版本。然後可以進行System C架構級模擬,進一步根據之前建立的 C 測試平臺,驗證設計的架構行為和功能。設計固化後,就可以通過 Vivado 設計套件的物理實現流程來執行設計,將設計程式設計到器件上,在硬體中執行和/或使用 IP 封裝器將設計轉為可重用的 IP。隨後使用 IP 整合器將 IP 整合到設計中,或在系統生成器 (System Generator) 中執行 IP。