ちょっとしたジョーク的な駄文ですが、ふと思いついたのでメモしておきます。
こちらで少し、RTLプログラミングを普通の逐次処理型のプログラミングモデルと比較したりしていましたが、ふと「 FPGA って実はとてもたくさんの命令をパッキングした、たった1命令を繰り返し実行している VLEW(Very Long Instruction Word)プロセッサと言えるのでは?」 と思いいたってブログにしている次第です。
今時の FPGA は、内部に FF も LUT も 何万個も持っており、DSPやDRAMだって数百とか数千持っていたりしますが、すべてクロックに合わせて毎サイクルプログラムされた通りに計算を行います。
なので、
- レジスタはFF数が足りる限り任意長のものを好きな数だけ定義できる(r0~r31までの汎用レジスタなんてケチなことは言わない)
- 演算リソースが足りる限り何千という命令を一度に実行できるVLIW
- 命令オペコードの演算内容は always 文のなかで自由に定義(プログラム)できる
- 複数の命令はディスティネーションレジスタが衝突しなければ何命令あってもOK
- 命令のオペランドはいくつレジスタを参照してもOK
- ただし命令メモリは1番地しかなく、同じ命令を繰り返すことしかできない
- すべての命令はレイテンシ1で完了し、一切ストールはしない
- あえて言うならクロックイネーブルで一時停止したり、リセットで初期化したりもできる
というような捉え方もでき、極端な話、単一クロックの同期回路であれば、 bitstream を1つの命令として繰り返し実行する VLIW プロセッサと言えなくもない気がします。
こういう見方をすると Verilog の always 文の単位で VLIW のなかの 1命令要素を記述しているというような捉え方もできそうです。
こういうモデルでとらえたとき、これは「命令セットのプログラミング」に他ならないわけです。
逐次処理モデルのC++のような言語仕様を使ってHLSを書くのも便利ですが、RTL言語を命令セット定義言語として使うのも文字通り Register Transfer Level のプログラムで面白いかなと、思った次第です。