新千葉 ガーベージ・コレクション

FPGA マガジンやインターフェースで書けなかったこと等をちょぼちょぼ書いてます。@ryos36

VHDL の考察

総武線に乗りながら考えた。アセンブラからCへの移行はいかにしてなされたかということを。アセンブラには非常にわずらわしいことなのだけど覚えなければならない幾つかの基本事項がある。例えばアドレス。ある番地にデータを格納する、そこからデータを取り出すといった作業をするときにメモリ空間を考えないといけない。次にその変数のビット幅(バイト数)。そして数に限りのあるレジスタC言語ではそれらをそのまま受け継いで抽象化することで使いやすくした。アドレスはポインタに、ビット幅は型(int や short ね)に、レジスタは変数に。ポインタを導入することで仮想的に無限にメモリが使える。メモリの具体的な位置は気にしなくて良いがそれがアドレスであることは気にする必要がある。どこにとられるかも気にする必要がある。スタックを使うのか?グローバルアドレスを使うのか?malloc で動的にとるのか?アドレスを気にしなければならないが考えることは局所的ですむ。int や short を使うことでメモリ上の配置やサイズを抽象化することが出来る。int が4バイト(じゃないのもあるけど)なのは気にする必要がほとんどないが、時々気にする必要がある。変数を使うことでレジスタという枠組みによって制限されることがない。変数は無限に使える。
それぞれの概念は抽象化されているが、それらの抽象的な概念を知らないとCを使ってアプリケーションを組むことは出来ないだろう。優秀なCのプログラマはどうコンパイラが展開するかを考えながらプログラムする。これらの本質的な部分を捨て去ることは出来ない。抽象化して考えやすくすることは出来るだろう。
C++ が秀逸なのは C の拡張になっているところだ。これが独自の構文を持った別の言語であればそれはただのお宅の言語だろう。実用性にこだわり C と親和性を持つように設計されたことがこの言語の中で最も素晴らしい点だと思う。
VHDL はどうだろう?VHDL は順序回路と組み合わせ回路を抽象化している。AND や OR をひねくり回さずに回路がかけるという点は非常に素晴らしい。より抽象化出来ないだろうか?回路という世界にはその他にアセンブラと同じような本質的な”何か”がないだろうか?それを抽象化すればよりよい言語が出来るのではないだろうか?
一つはリセットだ。そしてもう一つはクロックだ。この二つは VHDL という言語の中でも特殊な存在だと思う。これをより抽象化することが出来ればよりよい言語が出来るのか?リセットの抽象化は簡単そうだ。クロックはどうだろう?
process は一つの組み合わせ回路を作る手段だ(と思う、、、)。process の中でつくった組み合わせ回路の情報は外に引き回して参照することが出来る。参照することは出来るが、さらに外から組み合わせを複雑にするようなことは出来ない。だから、複数のprocess に分散する同じ signal への代入は出来ない。
複数の process は通信をしてより大きな機能を持つ回路として成り立つのだが、問題はその通信プロトコルはソースを見てもさっぱりわからないということだ。わかるようにするためには適切な変数の名前付けをする必要があるが、それでも、どうしても可読性は上がらない。
SystemC は今後ひらけるのだろうか?そして期待の NSL は? lisp の親戚の edif はどうだろう(と思っている人はいないか、、、)?より生産性の高いツールを手に入れたところが抜け出すに違いない。