(add-load-path "../../src/" :relative) (use npsv) ; initialize (npsv-initialize! "npsv_top") ; instancation (define inp (make-inmem-from-file "./setting/inmem.scm")) (define sinrom (make-rom-from-file "./setting/sin.scm")) (define outp (make-outmem-from-file "./setting/outmem.scm")) ; wire connection (connect inp sinrom) (connect sinrom outp) ; output (make-all-rtl "./output/rtl") (make-initialize-file inp) (make-top-testbench "./output/tb") (make-dataflow)
こんな感じでschemeを書くとVerilogを出してくれる。
データフロー図では、データ入力用のメモリと、ROM引きのsin関数、データ出力用のメモリが接続されている。データ入力用のメモリとROMのアドレスが直結できないので変換のモジュールが自動的に入る。
入力メモリに-4~+4までの値を入れて、sinを求めた結果
それっぽい。
モジュール間のプロトコルは単純で、データの有効なときはvoがH、処理が終わったらfoがHになる。これを順番に渡していくと、最後のメモリに値が書き終わったときに、最後のfoがHで終了通知になる。
後は、加算とか行列計算とかのモジュールを必要な分だけ作っていけば、複雑な計算で必要な精度の試行錯誤が楽にできそう。