Using Vivado HLS with vivado_hls_create_project
Introduction
vivado_hls_create_project is a tool for using Vivado HLS on command line. Specifically, it generates Makefile and tcl scripts for using Vivado HLS only with make command. Let’s use it to create a simple IP!
Generating Makefile and tcl scripts
Let’s create an adder module for Zybo Z7-20.
Command list
shows FPGAs to which vivado_hls_create_project deals with.
$ vivado_hls_create_project list
Board Part
--------------------------------------------------
Alpha-Data xc7vx690tffg1157-2
KU_Alphadata xcku060-ffva1156-2-e
Xilinx_ZedBoard xc7z020clg484-1
Xilinx_AC701 xc7a200tfbg676-2
Xilinx_KC705 xc7k325tffg900-2
Xilinx_KCU105 xcku040-ffva1156-2-e
Xilinx_KCU116 xcku5p-ffvb676-2-e
Xilinx_KCU1500 xcku115-flvb2104-2-e
Xilinx_VC707 xc7vx485tffg1761-2
Xilinx_VC709 xc7vx690tffg1761-2
Xilinx_VCU108 xcvu095-ffva2104-2-e
Xilinx_VCU110 xcvu190-flgc2104-2-e
Xilinx_VCU118 xcvu9p-flga2104-2L-e
Xilinx_VCU1525 xcvu9p-fsgd2104-2L-e
Xilinx_ZC702 xc7z020clg484-1
Xilinx_ZC706 xc7z045ffg900-2
Xilinx_ZCU102 xczu9eg-ffvb1156-2-i
Xilinx_ZCU106 xczu7ev-ffvc1156-2-i-es2
Xilinx_A-U200 xcu200-fsgd2104-2-e
Xilinx_A-U250 xcu250-figd2104-2L-e
Basys3 xc7a35t1cpg236-1
Genesys2 xc7k325t2ffg900c-1
Zybo xc7z010clg400-1
Zybo_Z7_10 xc7z010clg400-1
Zybo_Z7_20 xc7z020clg400-1
If you can’t find FPGAs you want to use, add a board name and etc. to /path/to/Vivado/201x.x/common/config/VivadoHls_boards.xml
.
Command create
creates Makefile and tcl scripts.
Option -b
specifies board name, and last string adder
specifies project name.
$ vivado_hls_create_project create -b Zybo_Z7_20 adder
[I 190623 20:21:41 generator:45] generate adder
[I 190623 20:21:41 generator:45] generate adder/include
[I 190623 20:21:41 generator:45] generate adder/src
[I 190623 20:21:41 generator:45] generate adder/test/include
[I 190623 20:21:41 generator:45] generate adder/test/src
[I 190623 20:21:41 generator:45] generate adder/script
[I 190623 20:21:41 generator:49] generate Makefile
[I 190623 20:21:41 generator:64] generate tcl scripts
[I 190623 20:21:41 deviceinfo:35] Part of Zybo_Z7_20 found -> xc7z020clg400-1
[I 190623 20:21:41 generator:111] generate directives.tcl
[I 190623 20:21:41 generator:116] generate .gitignore
$ tree adder
adder
├── Makefile
├── directives.tcl
├── include
├── script
│ ├── cosim.tcl
│ ├── csim.tcl
│ ├── csynth.tcl
│ ├── export.tcl
│ └── init.tcl
├── src
└── test
├── include
└── src
6 directories, 7 files
include/ is a directory for header and src/ is for C++ files. test/ is for test codes.
C simulation
Write source code of adder module.
- include/adder.hpp
#ifndef _ADDER_HPP_
#define _ADDER_HPP_
void adder(int a, int b, int *sum);
#endif // _ADDER_HPP_
- src/adder.cpp
#include "adder.hpp"
void adder(int a, int b, int *sum) {
*sum = a + b;
}
Also write test bench .
- test/src/test_adder.cpp
#include "adder.hpp"
#include <cassert>
int main(int argc, const char **argv) {
int a, b, sum;
a = 10;
b = 24;
adder(a, b, &sum);
assert(sum == (a + b));
return 0;
}
C simulation is executed by using make csim
.
Building IP
If test is passed, build adder.
IP is exported by using make export
.
Check the IP on Vivado!
Version management using git
There is a .gitignore in the project. It ignores a product. So you can manage source codes, Makefile and tcl scripts with git.
$ git init
Initialized empty Git repository in /xxx/xxx/adder/.git/
$ git status
On branch master
No commits yet
Untracked files:
(use "git add <file>..." to include in what will be committed)
.gitignore
Makefile
directives.tcl
include/
script/
src/
test/
nothing added to commit but untracked files present (use "git add" to track)
Conclusion
If you find out bugs or problems, send me a message to my twitter.