はじめに
いつものように、Google君に質問していたら、見つけした。FPGAの部屋の記事の中で下記のもの。
Random Stallという機能を使うと、UVMを使うっポイです。
Vitisをやってみた
上記の記事の中の下記のサンプルコードを使いました。。。2つの8ビットのUINTを掛け算して、16ビットのUINTを生成するというものです。
// multi_apuint.cpp #include <ap_int.h> void multi_apuint(ap_uint<8> multi_in0, ap_uint<8> multi_in1, ap_uint<16> *multi_out){ #pragma HLS PIPELINE #pragma HLS INTERFACE ap_hs register port=multi_out #pragma HLS INTERFACE ap_hs register port=multi_in1 #pragma HLS INTERFACE ap_hs register port=multi_in0 *multi_out = multi_in0 * multi_in1; }
テストベンチを下記の記事のものを使いました。
簡単なテストベンチですね。
#include <string.h> #include <ap_int.h> void multi_apuint(ap_uint<8> multi_in0, ap_uint<8> multi_in1, ap_uint<16> *multi_out); int main(){ using namespace std; ap_uint<8> multi_in0; ap_uint<8> multi_in1; ap_uint<16> multi_out; for (multi_in0=0, multi_in1=1; multi_in0<10; multi_in0++, multi_in1++){ multi_apuint(multi_in0, multi_in1, &multi_out); cout << "multi_out = " << multi_out << endl; if (multi_out != (multi_in0 * multi_in1)) return(1); } return(0); }
vitis の実行
vitis の実行等は、上記の記事をみてもらって、ここでは生成されたファイルをみてみます。
プロジェクト名は、multi_apunit にしました。プロジェクトを生成したら、
- multi_apuint
というディレクトリの下に、
- hls.app
- solution1 (ディレクトリ)
が生成されました。hls.app は、下記のような内容でした。
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="com.autoesl.autopilot.project" top=""> <files> <file name="multi_apuint.cpp" sc="0" tb="false" cflags="" csimflags=""/> <file name="../../testbench_multi_apuint.cpp" sc="0" tb="1" cflags="" csimflags=""/> </files> <solutions> <solution name="solution1" status="active"/> </solutions> <includePaths/> <libraryPaths/> <Simulation> <SimFlow name="csim"/> </Simulation> </project>
solution1 ディレクトリの下には、
- directives.tcl
- script.tcl
- solution1.aps
- solution1.directive
というファイルが生成されました。この中で、script.tcl をみてみます。
############################################################ ## This file is generated automatically by Vitis HLS. ## Please DO NOT edit it. ## Copyright 1986-2022 Xilinx, Inc. All Rights Reserved. ############################################################ open_project multi_apuint add_files multi_apuint.cpp add_files -tb testbench_multi_apuint.cpp open_solution "solution1" -flow_target vivado set_part {xc7z010iclg225-1L} create_clock -period 10 -name default #source "./multi_apuint/solution1/directives.tcl" csim_design csynth_design cosim_design export_design -format ip_catalog
おわりに
次回以降で、script.tcl 内の下記のコマンド
- csim_design
- csynth_design
- cosim_design
の結果をみてみます。それぞれのコマンドは、VitisのWindowでは、左下の Flow Navigator のところの
- C SIMULATION => Run C Simulation
- C SYNTHESIS => Run C Synthesis
- C/RTL COSIMULATION => Run Cosimulation
というコマンドに相当します。