5
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

SystemC高位合成のはじめ方

Last updated at Posted at 2017-08-05

#はじめに
Vivado HLSの環境でSystemCをはじめる手順を記載します。

#環境

  • Vivado HLS 2016.2(他のバージョンでも可)
  • Model Sim 10.5b(他のバージョンでも可)

Vivado HLSは当然ながらSystemCで高位合成する環境です。
Model Simは.vcd波形を出力するのに使用します。

#高位合成手順

スクリーンショット 2017-07-13 23.36.52_40.png
Vivado HLSを起動してCreate New Projectlを選択します。

スクリーンショット 2017-07-14 00.02.17_60.png
プロジェクト名とディレクトリを入力します。
次とその次は任意なのでNEXTで飛ばします。

スクリーンショット 2017-07-14 00.07.46.png
周期とFPGAの型番を設定します。
※FPGAの型番は自分のターゲットデバイスから決めてください(特にない人は適当にZYBOのxz7z010clg400-1を選択してください)。

スクリーンショット 2017-07-14 00.19.20.png
ExplorerのSourceにモジュールの.cppを追加記述し、Test Benchにはsc_mainの.cppを追加し記述します。
モジュールの**.hは.cppと同階層**にファイルを置くことで勝手に読み込まれるのでExplorerのSourceに追加しなくてもいいです。
追記Vivado HLSのサンプルプロジェクトを見るとお作法的にはTest Benchに.hを追加するみたいです。

以下にサンプルでビデオ信号っぽい物を出力するコード記載します。

vid_sync.h
#ifndef VID_SYNC_H
#define VID_SYNC_H

#include <systemc.h>

SC_MODULE(vid_sync)
{
	//Ports
	sc_in  <bool>  clock;
	sc_in  <bool>  reset;
	sc_out <bool>  vsync;
	sc_out <bool>  hsync;
	sc_out <bool>  valid;
	sc_out <sc_uint<10> > data;

	//Variables

	//Process Declaration
	void Prc1();

	//Constructor
	SC_CTOR(vid_sync)
	{
		//Process Registration
		SC_CTHREAD(Prc1,clock.pos());
		reset_signal_is(reset,true);

	}
};

#endif

vid_sync.cpp
#include "vid_sync.h"

#define hf_blank 2
#define hb_blank 3

void vid_sync::Prc1()
{
   //Initialization
	vsync.write(0);
	hsync.write(0);
	valid.write(0);
	data.write(0);
	wait();

	while(true)
	{
		wait();
		vsync.write(1);
		for(int v=0; v<480; v++)
		{
			hsync.write(1);
			wait();
			vsync.write(0);
			hsync.write(0);
			wait(hf_blank);
			for(int h=0; h<640; h++)
			{
				data.write(h);
				valid.write(1);
				wait();
			}
			data.write(0);
			valid.write(0);
			wait(hb_blank);
		}
	} //end of while(true)
}

sc_main.cpp

#include <systemc.h>
#include "vid_sync.h"


int sc_main (int argc , char *argv[])
{


	sc_clock clock("clock",10,SC_NS); // Create a 10ns period clock signal
	sc_signal <bool> reset;
	sc_signal <bool> vsync;
	sc_signal <bool> hsync;
	sc_signal <bool> valid;
	sc_signal <sc_uint<10> > data;
	vid_sync U_vid_sync("U_vid_sync");


	// Generate a clock and reset to drive the sim
	U_vid_sync.clock(clock);
	U_vid_sync.reset(reset);
	U_vid_sync.vsync(vsync);
	U_vid_sync.hsync(hsync);
	U_vid_sync.valid(valid);
	U_vid_sync.data(data);

    sc_trace_file *trace_f;
    trace_f = sc_create_vcd_trace_file("wave");

    sc_trace( trace_f, clock, "clock");
    sc_trace( trace_f, reset, "reset");
    sc_trace( trace_f, vsync, "vsync");
    sc_trace( trace_f, hsync, "hsync");
    sc_trace( trace_f, valid, "valid");
    sc_trace( trace_f, data, "data");

	// start simulation
	sc_start(20, SC_NS);
	reset = 1;
	sc_start(20, SC_NS);
	reset = 0;
	sc_start(20*640*480*2, SC_NS);

	return 0;
};

コードが完成したらRun C Simulationを実行してください。
Explorer->ProjectName->solution1->csim->buildの中に**.vcd**ファイルが出力されていると思います。
スクリーンショット 2017-08-05 12.19.52.png

#SIM手順

Model Simで波形を見る場合**.vcd.wlf**に変換するコマンドがあるので変換してから波形を見ます。
参考URL : https://www.altera.co.jp/support/support-resources/knowledge-base/solutions/rd07062010_692.html

スクリーンショット 2017-08-05 15.46.44_.png

ModelSimのコマンドラインから.vcdのファイルがあるディレクトリに移動します。
移動したら以下のコマンドを実行します。

vcd2wlf wave.vcd wave.wlf

すると同ディレクトリにwave.wlfが作成されると思います。

あとはModelSimのOpenFilewave.wlfを読み込めば波形が確認出来ます。

スクリーンショット 2017-08-05 13.09.05.png

#合成データ生成手順

Simで動作確認が出来たら、Projects Settings->SynthesisでTop Function(上のサンプルの場合vid_sync)を設定します。
aa.png

あとはC Synthesisを実行するとExplorer->ProjectName->solution1->syn以下にRTLが出力されています。

スクリーンショット 2017-08-06 03.18.24.png

#おわりに
Qiitaを見る限りSystemCは流行ってなさそうですが(投稿時のタグ数2)これからたくさん情報が載ればいいなぁと思っています。SystemCの超入門としてSystemCプログラミング基礎講座という本が分かりやすかったです(2006年のものなので古い)。SystemCの公式ドキュメントはaccelleraからDL出来ると思います。

スクリーンショット 2017-08-07 20.22.36.png
あとVivado HLSのスタートページにあるOpen Example Projectのコードを参考にするのも勉強になると思います。

5
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?