Verilisp で RISC-V
Lispverilisp
2021-12-31 15:57 JST

久しぶりに 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 だね。