2019-09-01から1ヶ月間の記事一覧
関数のプロローグ・エピローグに必要な新規命令の実装 関数のプロローグ・エピローグの処理に入る前に、少し新規命令を実装していく。これは、関数のプロローグ・エピローグの実装に際して必要なものだ。 定数生成パタンの実装 まずは最も基本的な定数を生成…
命令セットアーキテクチャには、命令の定義ともに、関数呼び出しのルールを規定するCalling Conventionが定義されている。 MYRISCVXにもCalling Conventionが存在し、基本的にRISC-VのCalling Conventionに基づいている。このルールに基づき、引数を渡す際に…
非常にシンプルな関数をどのようにして命令に変換するかについて考える。 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のサポートだ。 www.chisel-lang.org これだけ見ても良く分からないので、ChiselリポジトリのPull Requestを見て何となく使い方を調べてみた。 githu…
MYRISCVXISelLoweringはLLVM IRからSelectionDAG(データフローグラフ)への変換プロセスになる。バックエンドのかなり初期の部分で適用されます。 まずどのような変換処理から実装していけばよいだろうか?ここでは関数が呼ばれてから終了するまでの処理(main…
というか昔からずっと昔から公開していたのだけれども、場所を全く公開していなかっただけで。 RISC-Vのベクトル拡張命令の仕様がかなり固まってきた。現在は0.7.1が公開されている。と思ったら以下のドキュメントをよく見てみると0.7.2に更新されているので…
NVDLAというのはNVIDIAが公開しているオープンソースのディープラーニング向けハードウェアだが、このハードウェアで流すニューラルネットワークをコンパイルすることのできるコンパイラ nvdla_compiler がついにオープンソース化された。 nvdla_compilerは…
MYRISCVXAsmPrinterはLLVM IR変換された命令の出力を司る。最終的な詳細の出力は後述するMYRISCVXInstPrinterクラスが実行するのだが、AsmPrinterはより高位なアセンブリ出力用のフレームワークとしての役割を果たす。 EmitInstruction() 具体的なアセンブリ…
LLVM 9.0.0がリリースされた。前回のリリースからおよそ半年である。最近はLLVMはリリースバージョンが半年に1回カウントアップするのでもう9.0まで到達している(もう少し小刻みでも良いのではないか...) LLVM 9.0のブランチはGitHubのLLVMリポジトリでも切…
これまでに示した通り、LLVMにターゲットアーキテクチャを登録するためには様々な機能を追加する必要がある。 llcが呼ばれてから初期化プロセスがどこでどのようにして呼ばれているのか、追いかけてみることにする。 llcはllc.cppに定義されてあるmain()から…
LLVMのバックエンドについて一通り勉強を進めてきたが、どうもまだしっくりこない部分がある。 もう少し各メソッドの構造についてサマライズし、いったいLLVMがどういう仕組みでバックエンドを出力しているのか、見ていきたい。 まずはここまでで、作成した…
思い出したように、というかすっかり忘れていたのですが、2019年のこれまでに発表した私のRISC-V関連の資料をすべてSpeakerDeckにアップロードしました。 2019年もまだまだ続きますが、年末になるまでずっとHDDの肥やしにしているのはもったいないので、思い…
Chiselの改造をするためにいくつか型を追加する試行をしたが、一つ題材として浮動小数点をサポートできる型を作ってみたい。 この練習をするために、まずはChiselで標準的にサポートされているFixedPoint型について少し触ってみることにした。 ChiselのFixed…
前回は少し手を抜いたような形で新しいデータ型を追加してみたが、少し真面目にデータ型の追加方法について検討してみる。 前回も書いたが、UInt, SInt, Boolが定義されており、さらに良く調べてリムとexperimentalでFixedPointが定義されている。 これはBit…
Chiselを勉強するためにはとりあえず自分専用の拡張Chiselを作ってみるのが良いと思う。 とりあえずは、まずは手っ取り早く新しいデータ型でも追加してみたい。Chiselには以下の基本データ型が存在する。 UInt SInt Bool そこで、これに追加して今度はTIntと…
Chiselのコンパイルフローの解析の続き。前の記事は以下。 例えば、Chiselでは以下のようにして入力信号を出力信号につなげる記述が可能になる。 val io = IO(new Bundle { val in = Input(Bool()) val out = Output(Bool()) }) io.out := io.in この:=とい…
ハードウェア記述言語ChiselはScalaをベースにした言語であり、Scalaの言語単位をベースにして設計してある。 それでは、ハードウェアの配線や変数を表すためにどのような型が用意してあるかというと、例えば、以下のような型が用意されている。 UInt : 任意…
Chiselのコンパイルフローの解析の続き。前の記事は以下。 どこでChiselからFIRへの変換が行われているのかというと、それはChiselStageのEmitterが変換処理を行っているらしい。 chisel3/src/main/scala/chisel3/internal/firrtl/Emitter.scala private def…
ChiselはScalaをベースとしたDSLからVerilog-HDLを生成することのできるハードウェア記述言語であるが、ちょっと複雑な記法をすると生成されたVerilogが全く読めなくなる。 例えば、ChiselはModuleの中に関数を定義することができる。Scalaなので以下のよう…
AWSで複数のEC2でディスクを共有し、プロジェクトファイルのコピーの無駄を省こうといろいろ試行したのだが、AWSのEBSはどうも複数のEC2にアタッチメントをすることができないらしい。これは初めて知った。 その代わりに、複数のEC2インスタンスで同じファイ…
Chisel3を使っていて、どうもメインディレクトリの外部にあるソースコードを参照したい、Mavenに登録してあるわけではないのだけれども、ローカルに作ってあるクラスを参照して作りたいなと思ったとき。 例えば、以下のようなモジュールを開発しており、これ…
ハードウェア記述言語ChiselはScalaのプラットフォームの上に構築されている。大きく分けて2つのリポジトリから構成されている。 chisel3 : https://github.com/freechipsproject/chisel3 firrtl : https://github.com/freechipsproject/firrtl chisel3のリ…
ハードウェア記述言語ChiselはScalaのプラットフォームの上に構築されている。大きく分けて2つのリポジトリから構成されている。 chisel3 : https://github.com/freechipsproject/chisel3 firrtl : https://github.com/freechipsproject/firrtl chisel3のリ…
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はScalaをベースとしたハードウェア記述言語なので、Verilog-HDLではあまり見かけることのない記述ができる。 最近使っているChiselの便利な技法のいくつかをまとめてみる。 Vecの中身を.reducを使ってリダクションする Vecにはreductionなどの記法が…
SystemVerilogで記述されたRISC-VプロセッサArianeについて解析を進めている。 まずはフロントエンドから。フロントエンドは命令をフェッチするところだが、以下のようなサブモジュールで構成される。 instr_realign : 命令アライナ。命令フェッチ時に命令の…
SystemVerilogで記述されたRISC-VプロセッサArianeについて解析を進めている。回路面積が大きいという話で、実際にどれくらいのサイズなのか見てみることにした。 github.com 上記を使用している。FPGAの合成には、リポジトリをダウンロードした上でmake fpg…
RISC-V Vector Extensionは仕様が徐々に固まってきており、実装はまだ分からないがツールセットやアセンブラが徐々に公開されている。 Vector Extensionは現在でも使用がアップデートされており、特にこれまでの0.6から0.7へのアップデートはかなりの修正が…
"Digital Design with Chisel"の表紙 前々からChiselのメーリングリストに流れていた、Chiselの入門者的な書籍、"Digital Design with Chisel"が最終正式版になってついに発売されたらしい。 Amazonでも入手が可能だがpdfは無料公開されており、GitHubからす…
https://www.eembc.org/coremark-pro/ CPUのベンチマークといえば様々なものがあるが、有名なところといえば SPEC (https://spec.org/) Standard Performance Evaluation Corperation。おそらくもっとも有名なベンチマーク。各種CPUのベンチマーク評価などで…