FPGA開発日記

カテゴリ別記事インデックス https://msyksphinz.github.io/github_pages , English Version https://fpgadevdiary.hatenadiary.com/

2019-11-01から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…

FIRRTLに入門する (3. FIRRTLのざっくりとしたフローを追いかける)

まずはfirrtlに取り込まれる引数を確認した。以下のようにprintlnを挿入した。 firrtl/options/Stage.scala final def execute(args: Array[String], annotations: AnnotationSeq): AnnotationSeq = { println("execute : args") for (i <- 0 until args.siz…

オープンソースRISC-VコアHummingBirdについて調査(5. パイプライントレーサを追加して内部情報を取得)

RISC-Vの実装であるHummingBirdを調査していくことにした。 HummingBirdが何となく動くようになってきたのだが、ログファイルが生成されないので何が起きているのかよく分からない。 そこで、内部のパイプライン動作を把握するためにパイプライントレーサを…

FIRRTLに入門する (2. FIRRTL解析のためのIntelliJ IDEAの立ち上げと最初の解析)

FIRRTLの動作を解析するためには、Scalaの総合開発環境としてIntelliJ IDEAをインストールしておくのが良い。 これまでインストールしていなかったので、これを機にインストールしておこう。 www.jetbrains.com 無料版のCommunity EditionのLinux版をダウン…

オープンソースRISC-VコアHummingBirdについて調査(4. Verilatorビルドでの波形デバッグ)

RISC-Vの実装であるHummingBirdを調査していくことにした。 Verilatorでのデバッグを行っているのだが、どうも上手く動いてくれていない。波形を見てもなんだか動いていないように見えるので、Verilatorでクロックゲーティングをすると何かおかしくなるのだ…

RustでRISC-Vの命令セットシミュレータを作ったので(いちおう)公開する

といっても大昔に作ってみたもので、BitBucketの肥やしにしておくのももったいないし、最終的にどうにかして発展させたいので公開する。 今のところデコーダはあるが逆アセンブラはついていないのでspike-dasm頼みである。 github.com 大した実装ではなく、…

オープンソースRISC-VコアHummingBirdについて調査(3. Verilator用にビルドを追加できないか?)

RISC-Vの実装であるHummingBirdを調査していくことにした。 Verilator用のビルドを追加したい試行。VerilatorはRISC-VのRocket-Chipなどで間接的に使用したことはあるし、gtkwaveで生成した波形をデバッグしたことはあるけど、自分でテストベンチを書いた事…

FIRRTLに入門する (1. ビルドとVerilog生成テスト実行)

FIRRTLというのはハードウェア記述言語Chiselのバックエンドに相当する部分で、Chisel→FIRRTL→Verilogという段階を取り、FIRRTL→VerilogというのはLLVMで言うバックエンドに相当する部分であると説明にも書いてある。 FIRRTL自体はScalaで記述されており、動…

「実践Rust入門」に入門している (2. 電卓作成まで終了)

少し前から、「実践Rust入門」を読み始めている。Rustを使って四則演算の電卓を作るところまで行った。 実践Rust入門[言語仕様から開発手法まで]作者: κeen,河野達也,小松礼人出版社/メーカー: 技術評論社発売日: 2019/05/08メディア: 単行本(ソフトカバー…

オープンソースRISC-VコアHummingBirdについて調査(2. Verilator用にビルドを追加できないか?)

RISC-Vの実装であるHummingBirdを調査していくことにした。 HummingBirdの概要 前回iverilogを使用しようとしてはねられてしまうという悲しい状態で終了したのだが、少し調査すればVerilatorでも流すことができそうな気がする。というかVerilatorで一からテ…