/synverll

Primary LanguageCMIT LicenseMIT

Synverll

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のビルド

SynverllはLLVM(clang)を使用するので、実行する前にLLVMをインストールして下さい。

Ubuntuの場合、次のようにLLVMをインストールして下さい。

% sudo apt-get install llvm clang

% git clone git://github.com/aquaxis/synverll.git % cd synverll % make

Synverllの実行

% ./synverll C言語ファイル名 トップモジュール名

問題なくC言語を解けると、次のようなファイルを生成します。

トップモジュール名.v: モジュールの最上位階層(Verilog HDL) 関数名.v: 各関数のモジュール(Verilog HDL) memory_map.txt: メモリーマップ

トップモジュールに接続する上位階層を作成しなければなりません。 (ごめんなさい、作成するのをサボってます)

どんな風に処理してるの?

Synverllは32bitCPUで実行されるプログラムを想定して処理を行います。 Synverllは次のように処理をしています。

  1. 元のC言語ソースコードを関数単位に分離
  2. LLVMでLLVM-IRを出力
  3. LLVM-IRを愚直にVerilog HDL化

ソースコードの中で使用されるメモリは一元管理になります。

将来対応したいこと

  • AXIバスまで直結作業
  • 浮動小数点処理
  • 半精度、単精度、倍精度の3つは対応したい
  • 対応していないLLVM命令への対応
  • Linuxドライバと絡めた統合処理
  • まだまだ、無駄なステップがあるのでもっと詰める処理
  • もしかしたら、ストリーム対応
  • リセットはActive Lowなのにnegateの名前にしてない
  • キリの良いタイミングで変えちゃいます

バージョン情報

0.01

2015/10/24 Release

  • いぇ〜い!!!、初版です。