SynverllとはSynthesis for Verilog HDL usig LLVMの略で、「シンバール」と呼びます。 SynverllはC言語で記述されたソースコードをLLVMを使用して、Verilog HDLを出力する高位合成処理アプリです。 石原ひでみが趣味で作成しています。
Synverllはオープンソースで自由に改変を行ってもらってかまいません。 もし、本家(一応、ここが本家ね)よりも良い物ができたら僕に使わせて下さい。
まだ、説明文が少ないのでこれから追加していきます。
自分が使える言語で楽して回路を作りたいために開発している高位合成処理です。 気に入らないVerilog HDLが出力されれば、使えるところは使って、そこだけ置き換えてしまえばええやん!がコンセプトです。
そして、「関数=モジュール」を基本としています。
ソースコード全部を最適化かけてしまうと、インライン展開とかされるかもしれません。 そうなると、中身がなんだかわからなくなる=Verilog HDLを修正できなくなる。 それは嫌っ! だから、関数=モジュールにしています。
Synverllは単純にC言語ソースコードをVerilog HDLに変換するだけだと思って下さい。 最適化はそれなりに行っていますが、これぞ、ハードウェアの醍醐味!って、いうようなパイプライン化とか行っていないので速くなりません。 順次処理をVerilog HDLで書くより、C言語で書けば楽だよねぐらいだと思ってくださいませ。
Synverllは大きなソフトウェアを処理するよりも、小粒のソフトウェアを処理するのが良いのかもしれません。
基本、MITライセンスとします。 何事にも責任は取りませんのでご自由に裁いて下さい。
- 対応言語はC言語のみです。
- C++はダメです。
- LLVMのフロントエンドでもなく、バックエンドでもありません。
- 他のLLVMにインクルードした高位合成処理みたく格好良くありません。
- 入力できるC言語ソースコードは1ファイルだけです。
- ソースコードのコメントは日本語(UTF-8)です。
- 複雑な構造体は処理できないかもしれません
- マクロは展開できない可能性が大きいです。
- 浮動小数点はサポートしていません(現時点では・・・)。
- 除算を使うと莫大な回路を生成します。
- 構造体は4Byteアライメントになるようにしてください。
- メモリを外出ししているので初期化が出来ません。
- 初期化や定数を設定するなどする場合は外から行う必要があります。
- 出力したVerilog HDLの動作、性能などは一切、保証しません。
- 正常にVerilog HDLが生成されなくても文句は言わないで下さい。
- ソースコードが汚いのは許して下さい。
- メモリーリークしたらごめんなさい。
- LLVMのStandard C Libraryは使用頻度の高いものから対応になります。
SynverllはLLVM(clang)を使用するので、実行する前にLLVMをインストールして下さい。
Ubuntuの場合、次のようにLLVMをインストールして下さい。
% sudo apt-get install llvm clang
% git clone git://github.com/aquaxis/synverll.git % cd synverll % make
% ./synverll C言語ファイル名 トップモジュール名
問題なくC言語を解けると、次のようなファイルを生成します。
トップモジュール名.v: モジュールの最上位階層(Verilog HDL) 関数名.v: 各関数のモジュール(Verilog HDL) memory_map.txt: メモリーマップ
トップモジュールに接続する上位階層を作成しなければなりません。 (ごめんなさい、作成するのをサボってます)
Synverllは32bitCPUで実行されるプログラムを想定して処理を行います。 Synverllは次のように処理をしています。
- 元のC言語ソースコードを関数単位に分離
- LLVMでLLVM-IRを出力
- LLVM-IRを愚直にVerilog HDL化
ソースコードの中で使用されるメモリは一元管理になります。
- AXIバスまで直結作業
- 浮動小数点処理
- 半精度、単精度、倍精度の3つは対応したい
- 対応していないLLVM命令への対応
- Linuxドライバと絡めた統合処理
- まだまだ、無駄なステップがあるのでもっと詰める処理
- もしかしたら、ストリーム対応
- リセットはActive Lowなのにnegateの名前にしてない
- キリの良いタイミングで変えちゃいます
2015/10/24 Release
- いぇ〜い!!!、初版です。