FPGA開発日記

FPGAというより、コンピュータアーキテクチャかもね! カテゴリ別記事インデックス https://msyksphinz.github.io/github_pages

DSLでビルドツールを自作する (9日目 テストについて考える)

この記事は「Qiita Advent Calendar 2019 DSLで自作ビルドツールを作ろう」の9日目の記事です。 9日目 テストについて考える これまで、テストはなんとなくサンプルプログラムを作って動かしていました。しかしだんだんテストの量も増えてきて、1つ1つコマン…

SC19で発表されたCerebrasを使用したシステムCS-1の発表資料を読む

非常に出遅れてしまったのだが、SC19でCerebrasのWafer Scale Computingに関する資料が出てきた。 https://secureservercdn.net/198.12.145.239/a7b.fcb.myftpupload.com/wp-content/uploads/2019/11/Cerebras_for_SC19.pdf https://secureservercdn.net/198…

DSLでビルドツールを自作する (8日目 cleanコマンドを作る)

この記事は「Qiita Advent Calendar 2019 DSLで自作ビルドツールを作ろう」の8日目の記事です。 8日目 cleanコマンドを作る テストの実行方法をちょっと修正 これまで、rumy-exec.rbをロードする方法が分からずに直接./srcディレクトリに移ったうえで../test…

DSLでビルドツールを自作する (7日目 タイムスタンプでルール実行をスキップする)

この記事は「Qiita Advent Calendar 2019 DSLで自作ビルドツールを作ろう」の7日目の記事です。 7日目 タイムスタンプでルール実行をスキップする いよいよビルドツールの本命ともいえる機能です。タイムスタンプを使用して、更新のないファイルに対sるビル…

DSLでビルドツールを自作する (6日目 細かな調整2)

この記事は「Qiita Advent Calendar 2019 DSLで自作ビルドツールを作ろう」の6日目の記事です。 6日目 細かな調整2 前回だけではやりたい調整が終わりませんでした。まだまだ直したい部分があります。 同一ターゲット内で複数のexecutesコマンドを受け付ける…

DSLでビルドツールを自作する (5日目 細かな調整)

この記事は「Qiita Advent Calendar 2019 DSLで自作ビルドツールを作ろう」の5日目の記事です。 5日目 細かな調整 Rumy-Makeの実装を進める前に、少し細かな調整をします。あまり本来のビルドツールとは関係ない、使いやすさの部分で少し改良を加えていくこ…

DSLでビルドツールを自作する (4日目 ターゲットの依存関係を作ろう)

この記事は「Qiita Advent Calendar 2019 DSLで自作ビルドツールを作ろう」の4日目の記事です。 4日目 ターゲットの依存関係を作ろう Makefileでは、ルールに対する依存関係を記述することができます。あるルールを実行するためには、まずは依存する別のルー…

DSLでビルドツールを自作する (3日目 ターゲットを実行する)

この記事は「Qiita Advent Calendar 2019 DSLで自作ビルドツールを作ろう」の3日目の記事です。 3日目 ターゲットを実行する 前回、ターゲットを作ったので、次はターゲットを実行するためのルールを追加します。ターゲットを実行するために、exec_target関…

DSLでビルドツールを自作する (2日目 ターゲットを作ろう)

この記事は「Qiita Advent Calendar 2019 DSLで自作ビルドツールを作ろう」の2日目の記事です。 2日目 ターゲットを作ろう Makefileで何が必要かということを考えてみると、まずはビルド対象のターゲットが必要です。Makefileだと、以下のようなやつです。 t…

DSLでビルドツールを自作する (1. ビルドツールを作る動機・最初のプログラム)

この記事は「Qiita Advent Calendar 2019 DSLで自作ビルドツールを作ろう」の1日目の記事です。 1日目 ビルドツールを作る動機・最初のプログラム ビルドツールとは、誰もが聞いたことがあると思います。プログラムのビルド作業を自動化し、その作業を簡略化…

FIRRTLに入門する (15. LowerType時に配列を分解せずにBundleを分解する手法の調査)

FIRRTLで配列を扱えるように改造を行っている。単純に、配列をキープしながらFIRRTLの処理を進めていくことは可能なのだが、例えば以下のような状態が発生ると問題だ。下記の状況では、Bundleによる構造体が配列で複数定義されているような状態になる。 circ…

Chiselでクロックゲーティングを扱うための方法いろいろ

Chiselを書いていると、Chiselには基本的にクロックとリセットという概念が存在しない。 クロック信号とリセット信号は隠されており、普段は見える事は無いのだが、一応扱うことは可能だ。 例えば、特定のモジュールに対してクロックゲーティングを挿入する…

FIRRTLに入門する (14. Bundleの改造と配列の解析)

FIRRTLの解析に際し、BundleTypeとVecTypeの解析を行っている。LowerType()の中で、どのように変換されているのか解析をする。 以下の3つのコードを用意した。 circuit VecModules : module VecModules : input in: UInt<32>[4] input sel: UInt<2> output o…

Chipyardのデザインに含まれるInclusiveCache(L2キャッシュ)を試す

Chipyardに含まれるデザインには、InclusiveCacheと呼ばれるL2キャッシュに相当するもの?が含まれていた。 これまでにRocket-ChipにはL2に相当するものは含まれていなかったので面白そうだ。 まずはデザインを生成してみよう。 https://chipyard.readthedoc…

FIRRTLに入門する (13. Bundleの改造と配列の制約)

Chisel/FIRRTLのBundleを使用すると、SystemVerilogのstructやインタフェースのように信号を扱うことができる。 circuit BundleTest : module BundleTest : input in: { a : UInt<32>, b : UInt<32> } output out : { a : UInt<32>, ans: UInt<32> } これをV…

FIRRTLに入門する (12. 配列参照のコードを残したままVerilogを出したい2)

Chiselで配列を出力するために試行錯誤してみる。 まず、試行する中で余計な処理をするコードを片っ端から省いていく。ここは最適化に影響しそうなところだが、とりあえず無視。 diff --git a/src/main/scala/firrtl/Emitter.scala b/src/main/scala/firrtl/…

FIRRTLに入門する (11. 配列参照のコードを残したままVerilogを出したい)

ChiselからVerilogを生成すると、配列参照の記述は最終的に除去され、とんでもないVerilogが生成されることはよくある。 これをVerilogでそのまま配列で出力する方法を探しているのだが、試行錯誤でなかなかうまく進まない。 まず、passes.RemoveAccessesパ…

BoringUtilsを使えばデバッグポートを開けずにChiselで内部信号を観察できる

Chisel3にはIOTestersというテスト用の環境が備わっており、Chiselのモジュールをテストするための機能が備わっている。 しかしこのIOTestersの弱点の一つは、ターゲットとなるモジュールのインタフェースにしかアクセスできず、内部信号にアクセスできない…

ScalaのインタプリタAmmoniteでChisel3を動作させる試行

https://ammonite.io/ Chise(というかScala)を動かすために、わざわざbuild.sbtを作るのが面倒くさい。簡単にChiselを扱うことができないか、いろいろ調査していたら、Ammoniteというインタプリタあるのを発見した。 ammonite.io Ammoniteのインストールは以…

Esperanto TechnologiesのリリースしたRISC-VシミュレータDromajoを試す

Esperanto Technologiesと言えば、RISC-Vを採用したメニーコアチップを開発しているシリコンバレーのベンチャー企業であるが、チップに先立ちRISC-Vの命令セットシミュレータをChipsAllianceの成果物として公開したようだ。 RISC-Vのシミュレータと言えば一…

FIRRTLに入門する (10. 配列参照のコードはどこで除去される?)

ChiselからVerilogを生成すると、配列参照の記述は最終的に除去され、とんでもないVerilogが生成されることはよくある。例えば以下のようなFIRを書いたとすると、 circuit VecModules : module VecModules : input in: UInt<1>[16] input sel: UInt<4> outpu…

FIRRTLに入門する (9. Negative EdgeのAsynchronous Resetを追加してみる)

FIRでAsync Resetの作り方が分かったので、練習問題としてNegative EdgeのAsynchronous Resetを作ってみようかと思う。 Async Resetは専用の型が定義されていたので、同様にNegative EdgeのAsync Resetの型を定義してみる。 firrtl/src/main/scala/firrtl/ir…

FIRRTLに入門する (8. FIRRTLのレジスタアップデートの動作を確認する)

単純なデータパスであれば簡単にFIRの記述を書くことができる。次に、レジスタアップデートについて挙動を確認しよう。レジスタアップデートには、クロックとリセットの記述が必要である。 クロックは独自の型が定義されているが、リセットは独自の型が定義…

IEEE 754-2019 浮動小数点の仕様書を購入

IEEE 754の仕様書は実は2019年に改定されて、新しい仕様書が作成されている。 これは完全に公開されているわけではなくて、仕様書を入手するためにはお金を払わなければならない。 先輩の話を聞いていて、いくら払えばいいんだろう?個人では購入できないく…

FIRRTLに入門する (7. FIRRTLにSystemVerilogCompilerを追加してみる)

現在FIRRTLでは出力オプションに-X sverilogを追加することができ、これは一応SystemVerilog出力用のコンパイラであるのだが、実際に適用してみると、 ------------------------------------------------------------------------------ Warning: SystemVeri…

FIRRTLに入門する (6. FIRRTLのコンパイルオプションについて違いを確認)

FIRRTLのコンパイルオプション・というか生成ファイルオプションには以下が存在する。 none : NoneCompiler() を呼び出す。特に何もしない。 hi : HighFirrtlCompiler()を呼び出す。 low : LowFirrtlCompiler()を呼び出す。 middle : MiddleFirrtlCompiler()…

FIRRTLに入門する (5. ANTLR4 用のFIRRTL.g4を使ってC++の簡易パーサを作ってみる)

FIRRTLのパーサがANTLRで作られていることが分かったので、これを使えば遊べるような気がしてきた。C++向けにFIRRTLの文法ファイルを変換して、C++で簡易パーサを作って遊んでみる。 まず、ANTLR4のランタイムをダウンロードした。C++用のANTLRランタイムを…

FIRRTLに入門する (4. FIRRTLの.firファイルの読み取り方法)

FIRRTLは入力ファイルとして.firファイルを指定することができる。ということは、FIRファイルのファイルを読み込んで、Parseして、構文解析木を生成する場所があるはずである。それを調査した。 どうやらFIRRTLのコマンドラインを立ち上げたときは、FirrtlCl…

オープンソースRISC-VコアHummingBirdについて調査(7. FPGAでのビルドを試行する)

RISC-Vの実装であるHummingBirdを調査していくことにした。 HummingBirdがRTLシミュレーションで何となく動作するようになってきたので、FPGAでどれくらいの回路面積になるのか見てみたいと思う。HummingBirdの合成環境はXilinxのFPGAボードをサポートしてお…

オープンソースRISC-VコアHummingBirdについて調査(6. すべてのテストケースで確認)

RISC-Vの実装であるHummingBirdを調査していくことにした。 前回何となくコードがPassできるようになったので、用意されているすべてのパタンを流してみることにした。 for bin in `ls -1 /home/msyksphinz/work/riscv/e200_opensource/vsim/run/../../riscv…