FC2カウンター FPGAの部屋 Vivado HLSの高位合成結果をHDLとして利用する3(register その1)

FPGAやCPLDの話題やFPGA用のツールの話題などです。 マニアックです。 日記も書きます。

FPGAの部屋

FPGAの部屋の有用と思われるコンテンツのまとめサイトを作りました。Xilinx ISEの初心者の方には、FPGAリテラシーおよびチュートリアルのページをお勧めいたします。

Vivado HLSの高位合成結果をHDLとして利用する3(register その1)

Vivado HLSの高位合成結果をHDLとして利用する2(ap_ctrl_none)”の続き。

前回は、組み合わせ回路をHDLソースコードとして使えるように、ap_ctrl_none を使用してブロックレベルの制御信号 ( ap_start, ap_idle, ap_ready, ap_done ) を削除した。
今回は、INTERFACE ディレクティブに register オプションを入れて、I/O の入力をFFで受けて、出力をFFで出力する。

register オプションについては、ツィッターで tu1978 さんと Vengineer さんに教えて頂きました。ありがとうございました。


使用するのは、Vivado HLS 2014.4 だ。
最初に、”#pragma HLS INTERFACE ap_hs port=cntin”ディレクティブを右クリックし、右クリックメニューから Modify Directive を選択する。
C2HDL_14_150520.png

Vivado HLS Directive Editor が表示される。
register (optional) をチェックする。
C2HDL_15_150520.png

”#pragma HLS INTERFACE ap_hs port=cntout”ディレクティブを右クリックし、右クリックメニューから Modify Directive を選択する。

Vivado HLS Directive Editor が表示される。
register (optional) をチェックする。
C2HDL_16_150520.png

2 つのディレクティブに register が追加された。

#pragma HLS INTERFACE ap_none register port=cntin
#pragma HLS INTERFACE ap_none register port=cntout

C2HDL_17_150520.png

C Synthesis ボタンをクリックして、高位合成を行った。
C2HDL_18_150520.png

Target の 10 ns に対して、Estimated は 1.72 ns で、前回の組み合わせ回路の時と変わらない。Latency は 2 クロックで、Interval は 3 クロックだった。

高位合成された handshake_test.v を見ると ap_clk, ap_rst が追加されている。
cntin_V は FF 入力、cntout_V は FF 出力だった。
C2HDL_19_150520.png

Analysis 画面、FF入力、演算、FF出力になっている。
C2HDL_20_150520.png

Run C/RTL Cosimulation ボタンをクリックして、C/RTL コシミュレーションを行う。

Co-Simulation Dialog が表示された。
Dump Trace を all に変更して、OKボタンをクリックした。
C2HDL_21_150520.png

C/RTL コシミュレーションはエラーだった。エラー内容を下に示す。

@E [SIM-345] Cosim only supports the following 'ap_ctrl_none' designs: (1) combinational designs; (2) pipelined design with task inteveral of 1; (3) designs with array streaming or hls_stream or AXI4 stream ports.
@E [SIM-4] *** C/RTL co-simulation finished: FAIL ***

while executing
"cosim_design -trace_level all"
(file "C:/Users/Masaaki/Documents/Vivado_HLS/study/handshake_test/solution1/cosim.tcl" line 8)

C2HDL_22_150520.png

ブロックレベルのインターフェースを ap_ctrl_hs に戻せば、C/RTL コシミュレーションができるようだ。

ブロックレベルのインターフェースを ap_ctrl_none から ap_ctrl_hs に変更した。
C2HDL_24_150520.png

C Synthesis ボタンをクリックして、高位合成を行ってから、Run C/RTL Cosimulation ボタンをクリックして、C/RTL コシミュレーションを行った。今度は問題なく終了した。
C2HDL_25_150520.png

Vivado 2015.1 を立ちあげて、例によってTCLコマンドとして、以下のコマンドを入力した。

cd C:/Users/Masaaki/Documents/Vivado_HLS/study/handshake_test/solution1/sim/verilog
current_fileset
open_wave_database handshake_test.wdb
open_wave_config handshake_test.wcfg

、C/RTL コシミュレーション波形が表示された。
C2HDL_26_150520.png

ap_start がアサートされてから 3 クロック目に ap_done がアサートされて、cntout_V 出力に正しい出力が出力されたのが分かる。順次、3クロックごとに ap_done がアサートされて、cntout_V 出力に出力されていく。

最後に C++ のテストベンチの handshake_test_tb.cpp を貼っておく。

//
// handshake_test_tb.cpp
// 2015/05/18
// by marsee
//

#include <stdio.h>
#include <string.h>
#include <ap_int.h>

void handshake_test(ap_int<8> cntin, ap_int<8> *cntout);

int main(){
    using namespace std;

    ap_int<8> result;
    ap_int<8> *cntout;

    cntout = &result;
    for(int i=0; i<10; i++){
        handshake_test((ap_int<8>)i, cntout);
        cout << "i = " << i << "  " << "result = " << result << endl;
    }

    return 0;
}

  1. 2015年05月21日 04:56 |
  2. Vivado HLS
  3. | トラックバック:0
  4. | コメント:0

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック URL
http://marsee101.blog19.fc2.com/tb.php/3158-e4b6cd22
この記事にトラックバックする(FC2ブログユーザー)