高位合成がやってきた、ヤァ!ヤァ!ヤァ!

cherry syn は、高位合成、動作合成って言われてるツールのシンプルな一人で作ったバージョンだけど、まぁ C 言語みたいな言語で順序回路を生成するツール、かな。誰でも簡単にデジタル回路を作れることを目指したもの。高位合成も今は色々あるみたいだけど。

cherry syn で作る上で知っておかなければいけない大事なことは、実は高位合成に向かないアプリケーションがあること。たとえば、既に汎用ロジックで作ってある(つまりハードの構造が既に決まってる)ようなロジックを FPGA に乗せる場合、RTL(今までのやり方をこう呼ぶよ)で VHDL で書いた方が実績もあるし細かい事も出来る。高位合成は、そういう目的で研究されてきたものじゃないんだ。

じゃぁ何に適してるかと言うと、"アルゴリズム"を複数クロックにまたがる時間で動作するハードウェアにしたい場合。RTL(今までのやり方)で書く場合、ソフトウェアのように書くことはできないでしょ。1クロックごとに考えて、ステートマシンを自分で書かなきゃならない。ステートマシンを自動で生成してくれて、レジスタや演算器のシェアリングまで自動でやってくれるのが高位合成なんだ。

とりあえず書いてみよう。


process logicboy(clkin uint#1 clk, rstin uint#1 rst, in uint#8 din1, in uint#8 din2, out uint#8 dout)
{
	dout = din1 + din2;
}

これを cherry syn で、Cherry C って赤で書いてあるテキストエリアに打ち込んで Synthesis っていう赤いボタンをクリックすると、VHDL が出てくる。(これから Xilinx の ISE っていうツールで論理合成、マッピングをして、FPGA のコンフィグレーションファイルを生成する。)Firefox ブラウザか、Chrome ブラウザで動作させてね。Chrome の場合、ポップアップを許可する設定をする必要がある。

チュートリアルを打ち込むのも面倒なので、cherry syn ページの右、Tutorials て書いてあるところに、tutorial1_1.chc というボタンがあるので、それをクリックすれば自動で入力してくれるよ。

さぁ、Synthesis ボタンを押すとグラフィックのウィンドウがいくつか出てくる。このうち、Process logicboy's RTL というタイトルがついてるのが、最終的に生成された回路の絵。

一応、コントローラ Ctrl が書かれてるけど、一状態なので、ないのと同じ。加算器が一つあるだけの単なる組み合わせ回路だね。これじゃ高位合成の意味がないけど、ちょっと見てみて。

さっきの記述に戻ろう。logicboy がプロセス名で、これは何でもいいんだけど、LOGIC BOY で使う場合、この名前にしといた方が楽なのでそうした。process のパラメータの最初の二つはクロック、リセットで、必ず書かなければならない。


process logicboy(clkin uint#1 clk, rstin uint#1 rst, ...

それでは、次のように書き直して Synthesis をクリックしてみよう。(tutorial1_2.chc としてご用意いたしております^^)


process logicboy(clkin uint#1 clk, rstin uint#1 rst, in uint#8 din1, in uint#8 din2, out uint#8 dout)
{
	while (1) {
		dout = din1 + din2;
		dout = din1 - din2;
	}
}

Process logicboy's RTL を見てみると、今度は AddSub っていう加減算器がある。しかもコントローラの出力が3つになってて、or ゲートみたいなやつも出来てる。

これはね、1クロックごと、加算、減算を交互にやる記述。まぁそんな回路の用途はないかもしれんけど^^

それでは、同時に出てきた Process logicboy's CDFG っていうウインドウを見てみよう。0, 1, 2 という数字が縦に並んでて、緑の横線で絵が縦に3つに区切られてる。一番上がステップ 0、次がステップ 1、一番下がステップ 2 となってて、基本的には、クロックに同期して状態が遷移していく。とは言えループがあるので 0, 1, 2 で終わりじゃなくて、0,1,2,1,2,1,2... と永遠に遷移していく。ピンク色の Label, Jump To というのを見れば、どのように遷移していくかがわかる。0, 1, 2 まで来たら、Jump To _L0_ で Label:_L0_ に飛ぶ。

ステップ 1 では、赤の入力 In(din2)、In(din1) からデータを入力して、オレンジの加算 Add:0 で加算をして、赤の Out(dout) でデータを出力する。

同様にステップ2では減算をする。

この加算、減算が一つの加減算器にマッピングされ、さっきの RTL 回路となるって訳。

CDFG は、高位合成の専門用語でコントロールデータフローグラフと言って、入力された記述をデータフロー解析してグラフに表したもの。まぁ、見ればわかるよね^^

RTL は、論理合成の専門用語でレジスタトランスファレベルと言って、演算器とか、レジスタとか、コントローラとか、ハードウェアの"構造"を表したものなんだ。

さて、Synthesis が終わると、VHDL というテキストエリアに VHDL 記述が、UCF というテキストエリアに FPGA のピン割り当ての情報(今は空っぽ)が出来る。これらを Xilinx のツールに入力すれば FPGA のコンフィグレーションデータができるんだ。それはまた後でやるよ。

ここで、ちょっと生成された VHDL を見てみよう。もちろん、VHDL を理解する必要はない。そうできるようにするのが僕の目標だから。ただし、出来た回路にどんな入出力ピンができるのかぐらいは、見ておかなきゃいけない。

entity LOGICBOY is
	port (
		CLK: in	std_logic;
		RST: in	std_logic;
		DIN1: in	std_logic_vector(7 downto 0);
		DIN2: in	std_logic_vector(7 downto 0);
		DOUT: out	std_logic_vector(7 downto 0);
end LOGICBOY;

これが、その入出力ピンが記述されたところ、CLK, RST はクロック入力とリセット入力。cherry syn で生成された順序回路は、デフォルトではクロックの立下りに同期して動く。リセット入力は非同期の負論理、つまり L になるとリセットがかかり、H に戻ると回路が動き出す。

DIN1, DIN2 は入力、DOUT は出力。

よーし、それでは元に戻って、色々書き直して遊んでみよう(tutorial1_3.chc)。

process logicboy(clkin uint#1 clk, rstin uint#1 rst, in uint#8 din1, in uint#8 din2, out uint#8 dout)
{
	while (1) {
		uint#8 d;

		d = din1 + din2;
		dout = d;
		dout = din1 - din2;
	}
}

これも同じ結果になるけど、変数 d を使って din1 + din2 を一旦 d に代入した。

今のバージョンの cherry syn では、C 言語のように

uint#8 d = din1 + din2;

とも書けるようになってる。ただし、変数の宣言は必ず { } で囲まれたブロックの先頭になければいけない。

dout = d;
uint#8 d2 = 2;

とかは出来ない。

さぁ、if 文を使ってみよう!(tutorial1_4.chc)

process logicboy(clkin uint#1 clk, rstin uint#1 rst, in uint#8 din1, in uint#8 din2, out uint#8 dout)
{
	while (1) {
		uint#8 d;

		d = din1 + din2;
		dout = d;

		if (d > 3)
			dout = din1 - din2;
		else
			dout = din1 + din2;
	}
}

まず d に din1 + din2 を代入し dout に出力。そんでもしそれが 3 より大きければ dout に din1-din2 を、そうでなければ din1+din2 を出力する。

ちなみに入力 din1, din2 は、変数じゃなくて入力だから、右辺式に書いたらその都度入力が行われるからね。一度入力して何度も同じ値を使いたいときは、一旦変数に代入しよう。

CDFG を見てみよう。今度はステップ 2 に Else, Then ていう薄いピンクの囲いがある。もちろん、条件によってその中のモノが実行されるという意味。

生成された RTL 回路には、あれ不思議、加減算器が一つしかない。もちろん、実行するサイクルが違えば演算器はシェアできるし、条件が排他的であってもシェアできる。つまり一つで良い。同じように、レジスタのシェアリングも行われる。

面白くなってきたでしょ^^さぁ、今日はここまで。これだけも、活用出来る人はいるんじゃないかな^^

それでは皆さま、さようならー。