RHDL の紹介
RHDL(Ruby HDL)は Ruby の内部 DSL として実装された HDL です(Ruby という名前の HDL がありますがそれとは無関係)。今のところモデリングとシミュレーションの実行のみで、Verilog HDL の出力といった機能はありません。
RubyForge にページがあります( http://rhdl.rubyforge.org/ )が、最新版は GitHub にあります( https://github.com/philtomson/RHDL )。なお、次で示すサンプルは私が fork した版でないとうまく動きません(バグっぽい挙動を踏むので修正をプルリクエスト中のため)。https://github.com/metanest/RHDL/tree/ksmakoto_fork にありますので、git clone の後 git checkout ksmakoto_fork としてください(このブランチは Phil Tomson さんの master に追随するために適宜 rebase する予定ですので、さらにいじる予定の方はその点ご了承願います)。
インストールはソースディレクトリのトップで sudo ruby19 install.rb のようにします。
サンプルを示します。
以下、サンプルについて解説します。
- include RHDL
インクルードして使うのが基本的な使い方になります。
- BV2Arr Arr2BV
多ビット型(BitVector)の信号と、それを各ビットの信号にばらしたものの配列とを相互に変換するモジュールです。ユーティリティとしてあらかじめありそうなのですが見つけられなかったので自作しました。
- Adder
任意のビット数を対象にできる加算器です。
ここまで見てきて、「inputs や outputs はそういう名前のメソッドがあるのだろうからいいとして、そのあとの信号名は undefined local variable or method になりそうに見えるんだけど、という疑問があるかもしれませんが、RHDL ではそこらへんは method_missing でうまくやっています。他にも Signal オブジェクトでラップしたまま演算しても、中身の Bit の演算になることなど、method_missing が多用されています。
FullAdder と HalfAdder は、1 ビットの、それぞれ全加算器と半加算器です。
- シミュレーション
最後にシミュレーションを実行するためのコードを付けています。