Verilisp で RISC-V
久しぶりに Verilisp をつかってみた。 Lisp で HDL はかなりよさそう。
ただし、今の段階では Verilisp は未熟。
Verilisp を使う
どういう仕組か?
mangle に Python を使っている。module という名称は Python のプログラムによって v_module という名称に変更する。 そして、clisp を pipe 呼ぶ。その結果を Verilog-HDL として ファイルに書き出す。
Lisp 側
だいたいが macro になっている。v_module もマクロ。 マクロの中で write している。 自分で defmacro していけばいろんな便利なものをかけそう。 lib にいくつかサンプルがある。
コンパイラではない
コンパイラではない上に構文解析はしていない。 その為、verilisp では通すけど、Verilog-HDL 的には NG というものも 出力してしまう。結局 Verilog-HDL のデバッグをすることになる。
<= が怪しい
オリジナルは n= オペレータを使って Verilog-HDL の代入を作る。 <= は 比較演算子とコンフリクトするのが理由。 ついうっかり、v_<= を作ってしまった(いや~このミス何回もしてるんだよね)。 遅延を入れることができる改造をしたので当分はこのまま。 ステートメントであれば代入、じゃなければ比較演算子といったことを する必要がある。
属性を持てない
module にレイテンシーとか名称にその属性(wire or reg) を 持てるようになっていない。コンパイラじゃないからね。 そのため、型の単純な予測すらできない。
Lisp であること
ここが一番のアドバンテージ。 ステートメントを分解して組み立てたりできる。 差し込みもできる。接続もできる。 名称を見て動作を変更できる。 など、拡張し放題(のはず)。
ただ、大概の Lisp 開発に起こる超ローカルルールが増えて 自分しか使わないという状況にもなる。
マクロ難しい
結局 defmacro でやっていて、その評価過程出力される string を Python にパイプで返している。defmacro の結果は必要ない。ので nil を返している。なんかスマートじゃない。
さらに、じゃ、これでいいんじゃね?と自分で書いたマクロは ことごとくはねのけられる。マクロが超難しいのと Verilog-HDL の 組み立てが難しい。
本来なら、defmacro の結果が S 式の Verilog-HDL 形式になって それを最終的に Verilog-HDL に変換するようにすべきなのだ。
いずれにせよ Lisp
誰かが使うというモノでもないだろう。
でも評価されてちょっとうれしい(オリジナルは faulknerさん だけどね)
RISC-V を作り始めたよ。
あまり意味はない。どれだけ対応できるのかを検証する意味で 作っている。 結局、Verilog-HDL で作った方がはやそう。 私にとって、一番わかりやすいのは Python でつくった RISC-V。 実用性はともかく、仕組みは断然突出でわかりやすい。 そのうち公開予定。
bream
そういえば誰かが bream なるものを 作っているね。こちらは scheme だね。