FPGA開発日記

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

2019-09-01から1ヶ月間の記事一覧

オリジナルLLVMバックエンド実装をまとめる(7. 定数の生成について)

関数のプロローグ・エピローグに必要な新規命令の実装 関数のプロローグ・エピローグの処理に入る前に、少し新規命令を実装していく。これは、関数のプロローグ・エピローグの実装に際して必要なものだ。 定数生成パタンの実装 まずは最も基本的な定数を生成…

オリジナルLLVMバックエンド実装をまとめる(6. MYRISCVXのCalling Conventionについて)

命令セットアーキテクチャには、命令の定義ともに、関数呼び出しのルールを規定するCalling Conventionが定義されている。 MYRISCVXにもCalling Conventionが存在し、基本的にRISC-VのCalling Conventionに基づいている。このルールに基づき、引数を渡す際に…

オリジナルLLVMバックエンド実装をまとめる(5. LLVM IRのret文からreturn命令を生成するまでの流れ)

非常にシンプルな関数をどのようにして命令に変換するかについて考える。 int main() { return 0; } ./bin/clang -c -O2 ../myriscvx-tests/tests/simple_main.cpp -emit-llvm ./bin/llvm-dis simple_main.bc -o - define dso_local i32 @main() local_unnam…

Chisel-3.2 RC2でAsynchronous Resetを生成してみる

Chisel-3.2 RC2がリリースされている。いくつかの新機能が加わっているが、気になるのはAsynchronous Resetのサポートだ。 www.chisel-lang.org これだけ見ても良く分からないので、ChiselリポジトリのPull Requestを見て何となく使い方を調べてみた。 githu…

オリジナルLLVMバックエンド実装をまとめる(4. `ISelLowering`の初期実装とCalling Conventionの追加)

MYRISCVXISelLoweringはLLVM IRからSelectionDAG(データフローグラフ)への変換プロセスになる。バックエンドのかなり初期の部分で適用されます。 まずどのような変換処理から実装していけばよいだろうか?ここでは関数が呼ばれてから終了するまでの処理(main…

RISC-Vのベクトル拡張命令の仕様書を(ほぼ)日本語化したので公開する

というか昔からずっと昔から公開していたのだけれども、場所を全く公開していなかっただけで。 RISC-Vのベクトル拡張命令の仕様がかなり固まってきた。現在は0.7.1が公開されている。と思ったら以下のドキュメントをよく見てみると0.7.2に更新されているので…

NVDLA compilerがオープンソース化されたので試してみる(1. ビルド→失敗)

NVDLAというのはNVIDIAが公開しているオープンソースのディープラーニング向けハードウェアだが、このハードウェアで流すニューラルネットワークをコンパイルすることのできるコンパイラ nvdla_compiler がついにオープンソース化された。 nvdla_compilerは…

オリジナルLLVMバックエンド実装をまとめる(3. AsmPrinterとInstPrinterの役割)

MYRISCVXAsmPrinterはLLVM IR変換された命令の出力を司る。最終的な詳細の出力は後述するMYRISCVXInstPrinterクラスが実行するのだが、AsmPrinterはより高位なアセンブリ出力用のフレームワークとしての役割を果たす。 EmitInstruction() 具体的なアセンブリ…

LLVM 9.0.0がリリースされたのでRISC-Vの対応状況を確認する

LLVM 9.0.0がリリースされた。前回のリリースからおよそ半年である。最近はLLVMはリリースバージョンが半年に1回カウントアップするのでもう9.0まで到達している(もう少し小刻みでも良いのではないか...) LLVM 9.0のブランチはGitHubのLLVMリポジトリでも切…

オリジナルLLVMバックエンド実装をまとめる(2. llcがターゲットマシンを初期化するまでの流れ)

これまでに示した通り、LLVMにターゲットアーキテクチャを登録するためには様々な機能を追加する必要がある。 llcが呼ばれてから初期化プロセスがどこでどのようにして呼ばれているのか、追いかけてみることにする。 llcはllc.cppに定義されてあるmain()から…

オリジナルLLVMバックエンド実装をまとめる(1. クラス構造の関係図)

LLVMのバックエンドについて一通り勉強を進めてきたが、どうもまだしっくりこない部分がある。 もう少し各メソッドの構造についてサマライズし、いったいLLVMがどういう仕組みでバックエンドを出力しているのか、見ていきたい。 まずはここまでで、作成した…

2019年のこれまでに発表したRISC-V関連の発表資料をすべてアップロードしました

思い出したように、というかすっかり忘れていたのですが、2019年のこれまでに発表した私のRISC-V関連の資料をすべてSpeakerDeckにアップロードしました。 2019年もまだまだ続きますが、年末になるまでずっとHDDの肥やしにしているのはもったいないので、思い…

ハードウェア記述言語Chiselコンパイラの内部解析(7. FixedPoint型を使ったコードを書いてみる)

Chiselの改造をするためにいくつか型を追加する試行をしたが、一つ題材として浮動小数点をサポートできる型を作ってみたい。 この練習をするために、まずはChiselで標準的にサポートされているFixedPoint型について少し触ってみることにした。 ChiselのFixed…

ハードウェア記述言語Chiselコンパイラの内部解析(6. もう少し真面目にChiselの型を追加するコードを書く)

前回は少し手を抜いたような形で新しいデータ型を追加してみたが、少し真面目にデータ型の追加方法について検討してみる。 前回も書いたが、UInt, SInt, Boolが定義されており、さらに良く調べてリムとexperimentalでFixedPointが定義されている。 これはBit…

ハードウェア記述言語Chiselコンパイラの内部解析(5. Chiselに新しい型と演算子を追加してみる)

Chiselを勉強するためにはとりあえず自分専用の拡張Chiselを作ってみるのが良いと思う。 とりあえずは、まずは手っ取り早く新しいデータ型でも追加してみたい。Chiselには以下の基本データ型が存在する。 UInt SInt Bool そこで、これに追加して今度はTIntと…

ハードウェア記述言語Chiselコンパイラの内部解析(4. Chiselで代入演算子がハードウェアに落ちるまで)

Chiselのコンパイルフローの解析の続き。前の記事は以下。 例えば、Chiselでは以下のようにして入力信号を出力信号につなげる記述が可能になる。 val io = IO(new Bundle { val in = Input(Bool()) val out = Output(Bool()) }) io.out := io.in この:=とい…

Chiselでtypedef(のようなもの)を実現する方法

ハードウェア記述言語ChiselはScalaをベースにした言語であり、Scalaの言語単位をベースにして設計してある。 それでは、ハードウェアの配線や変数を表すためにどのような型が用意してあるかというと、例えば、以下のような型が用意されている。 UInt : 任意…

ハードウェア記述言語Chiselコンパイラの内部解析(3. Chiselコンパイルのフローを追いかける)

Chiselのコンパイルフローの解析の続き。前の記事は以下。 どこでChiselからFIRへの変換が行われているのかというと、それはChiselStageのEmitterが変換処理を行っているらしい。 chisel3/src/main/scala/chisel3/internal/firrtl/Emitter.scala private def…

Chisel3で生成されたVerilogのデバッグを捗らせるためのいくつかの技法

ChiselはScalaをベースとしたDSLからVerilog-HDLを生成することのできるハードウェア記述言語であるが、ちょっと複雑な記法をすると生成されたVerilogが全く読めなくなる。 例えば、ChiselはModuleの中に関数を定義することができる。Scalaなので以下のよう…

AWSの共有ファイルシステムEFSを試す

AWSで複数のEC2でディスクを共有し、プロジェクトファイルのコピーの無駄を省こうといろいろ試行したのだが、AWSのEBSはどうも複数のEC2にアタッチメントをすることができないらしい。これは初めて知った。 その代わりに、複数のEC2インスタンスで同じファイ…

Chisel3で外部モジュールをロードする場合に必要なbuild.sbtの変更点

Chisel3を使っていて、どうもメインディレクトリの外部にあるソースコードを参照したい、Mavenに登録してあるわけではないのだけれども、ローカルに作ってあるクラスを参照して作りたいなと思ったとき。 例えば、以下のようなモジュールを開発しており、これ…

ハードウェア記述言語Chiselコンパイラの内部解析(2. Chiselコンパイルのフローを追いかける)

ハードウェア記述言語ChiselはScalaのプラットフォームの上に構築されている。大きく分けて2つのリポジトリから構成されている。 chisel3 : https://github.com/freechipsproject/chisel3 firrtl : https://github.com/freechipsproject/firrtl chisel3のリ…

ハードウェア記述言語Chiselコンパイラの内部解析(1. カスタマイズ用のローカル環境を作る)

ハードウェア記述言語ChiselはScalaのプラットフォームの上に構築されている。大きく分けて2つのリポジトリから構成されている。 chisel3 : https://github.com/freechipsproject/chisel3 firrtl : https://github.com/freechipsproject/firrtl chisel3のリ…

Chiselで再帰を使ってPopCountモジュールを実装する

Arianeの実装を見ていると、PopCountの実装がSystem Verilogの再帰を使って実装してあった。 github.com Popcountの実装 module popcount #( parameter int unsigned INPUT_WIDTH = 256, localparam POPCOUNT_WIDTH = $clog2(INPUT_WIDTH)+1 ) ( input logic…

ChiselでMapやReduceを使ったいくつかのハードウェア記述Tips

ChiselはScalaをベースとしたハードウェア記述言語なので、Verilog-HDLではあまり見かけることのない記述ができる。 最近使っているChiselの便利な技法のいくつかをまとめてみる。 Vecの中身を.reducを使ってリダクションする Vecにはreductionなどの記法が…

SystemVerilogで記述されたRISC-VプロセッサArianeのフロントエンドの構成

SystemVerilogで記述されたRISC-VプロセッサArianeについて解析を進めている。 まずはフロントエンドから。フロントエンドは命令をフェッチするところだが、以下のようなサブモジュールで構成される。 instr_realign : 命令アライナ。命令フェッチ時に命令の…

SystemVerilogで記述されたRISC-VプロセッサArianeの回路面積解析

SystemVerilogで記述されたRISC-VプロセッサArianeについて解析を進めている。回路面積が大きいという話で、実際にどれくらいのサイズなのか見てみることにした。 github.com 上記を使用している。FPGAの合成には、リポジトリをダウンロードした上でmake fpg…

RISC-V Vector Extension 0.7.2の仕様書の日本語化を始めた (第3章まで)

RISC-V Vector Extensionは仕様が徐々に固まってきており、実装はまだ分からないがツールセットやアセンブラが徐々に公開されている。 Vector Extensionは現在でも使用がアップデートされており、特にこれまでの0.6から0.7へのアップデートはかなりの修正が…

"Digital Design with Chisel"が正式発行

"Digital Design with Chisel"の表紙 前々からChiselのメーリングリストに流れていた、Chiselの入門者的な書籍、"Digital Design with Chisel"が最終正式版になってついに発売されたらしい。 Amazonでも入手が可能だがpdfは無料公開されており、GitHubからす…

GitHubでCoremark-PROがオープンソース化されたので試してみる

https://www.eembc.org/coremark-pro/ CPUのベンチマークといえば様々なものがあるが、有名なところといえば SPEC (https://spec.org/) Standard Performance Evaluation Corperation。おそらくもっとも有名なベンチマーク。各種CPUのベンチマーク評価などで…