1. 程式人生 > >Vivado HLS 開發步驟(高階綜合)(FPGA)

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。