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 だね。