FPGA開発日記

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

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で一からテ…

オープンソースRISC-VコアHummingBirdについて調査(1. ダウンロードとビルド)

RISC-Vの実装であるHummingBirdを調査していくことにした。 HummingBirdの概要 HummingBirdは中国の大学で開発されたRISC-Vコアで、正式にはE203という名前が付けられている。GitHubのページを参照すると、このHummingBirdを開発した目的はRISC-Vの人気を向…

オリジナルLLVMバックエンド実装をまとめる(30. llvm-litによるテストの追加)

前回の続き。MYRISCVXのテストを追加する。 simple_main.cppをclangでコンパイルすると、以下のようなLLVM中間コードが生成される。 ./bin/clang --target=riscv64-unknown-elf -c ../myriscvx-tests/tests/simple_main.cpp -emit-llvm -o - | ./bin/llvm-di…

オリジナルLLVMバックエンド実装をまとめる(29. llvm-litによるテストの調査)

LLVMのオリジナルのバックエンドを実装してきたが、いろんなソースコードをコンパイルして、いろんなテストプログラムを動かしてきた。 これだけ多くのテストパタンを実行するのなら、テスト環境とリグレッションテストを用意しておくのが良い。LLVMは、テス…

複数のGitHubアカウントに対して複数のSSHキーを設定するための方法

人によってはGitHubのアカウントを2つ以上持っていたり、社内で複数のGitHubアカウントを使い分ける必要があったりする場合がある。 例えば仕事用と趣味用でGitHubアカウントを2つ用意していたり、その場合は1つのPCから複数のGitHubに対して制御を行う必要…

オリジナルLLVMバックエンド実装をまとめる(28. llvm-objdumpを実装する2)

前回の続き。命令ダンプのオペランド表記を一部改造する このままでLLVMをコンパイルして実行しても良いのだが、例えば以下のような命令はダンプの結果がおかしくなる。 addi x2, x2, -4 --> addi x2, x2, 4092 マイナス値の表記がうまく行えない。オペラン…

オリジナルLLVMバックエンド実装をまとめる(27. llvm-objdumpを実装する1)

ELFファイルの生成とディスアセンブラの作成 LLVMには、ツールセットとして生成したオブジェクトファイルを逆アセンブルするためのllvm-ojbdumpというコマンドが用意されている。 基本的に生成したオブジェクトファイルはこのコマンドを用いてダンプすること…

CQ出版 インタフェース 12月号「注目オープンソースRISC-Vマイコン」に寄稿しました

CQ出版さんが出版している雑誌インタフェースの12月号で、「注目オープンソースRISC-Vマイコン」という特集記事に寄稿しました。 RISC-Vマイコンの話がメインなんですが、よく見ると私はマイコンの話はほとんど書いていないですね。 なんか仕様だのクラウド…

オリジナルLLVMバックエンド実装をまとめる(26. LLVM IRをサポートするためのIntrinsicsのサポート2. )

前回の続き。 データのバイトスワップを行う。C言語では、__builtin_bswap16, __builtin_bswap32, __builtin_bswap64により取得することができる。 これらはそのまま命令に落とし込めないので、IRの生成を抑制する。 func_bswap.cpp int test_bswap16() { vo…

ハードウェアの構築からチップ設計までを一気通貫するフレームワークChipyardを試す(1. 環境構築とシミュレーション)

ChipyardというのはRISC-Vをベースとしたチップ設計のためのフレームワークで、ツールセット・ライブラリ・デザインなどを一つにまとめたフレームワークのようだ。このフレームワークを使用することで、ハードウェアの設計からシミュレーション・論理合成・…

「実践Rust入門」に入門している

少し前から、「実践Rust入門」を読み始めている。Rust自体は前に触ったことがあるのだが、ジェネリクスとかトレイトとか、基本的な知識が不足しているので、評判が良さそうな本を購入して読み進めていくことにした。 実践Rust入門[言語仕様から開発手法まで]…

中国語版RISC-Vの入門書を買ってみた

RISC-Vの入門書といえば、RISC-V Readerなど基本的に英語のものが日本語に翻訳されるという形式が多いが、中国語版の良さそうなものがあったので無理やり買ってみた。 2冊セットで、結構分厚い。漢字ばっかりで、眩暈がしてくるぞ。。。 とりあえず、スマホ…

オリジナルLLVMバックエンド実装をまとめる(25. LLVM IRをサポートするためのIntrinsicsのサポート)

LLVM IRには、いくつかの特殊な構文が存在し、これらをサポートすることでより多くのコードを生成できるようになる。 これらについては、clang側からIntrinsic関数を呼び出すことでLLVM IRを生成し、llcに渡してテストすることができる。 frame_addres, retu…

オリジナルLLVMバックエンド実装をまとめる(24. 末尾再帰関数呼び出しの実装2.)

前回の続き。末尾再帰の生成について。 LowerCallに戻る。IsTailCallがTrueとなり、末尾関数呼び出し最適化が有効として読み進める。 ... if (!IsTailCall) Chain = DAG.getCALLSEQ_START(Chain, NextStackOffset, 0, DL); ... 末尾関数呼び出し最適化が有効…

オリジナルLLVMバックエンド実装をまとめる(23. 末尾再帰関数呼び出しの実装1.)

関数呼び出しには様々な最適化の形があるが、その中の一つである末尾関数呼び出しでの最適化を実行してみる。 末尾関数呼び出しとは、ある関数f1()が関数f2()の最後の処理として呼び出されるケースを言う。 int f1(a, b) { a + b; } int f2(c, d, e, f) { /*…

オリジナルLLVMバックエンド実装をまとめる(22. 可変長引数をサポートするための処理)

C言語の可変長引数では、例えば以下のような記述が可能となる。 vararg.cpp #include <stdarg.h> int sum_i(int amount, ...) { int i = 0; int val = 0; int sum = 0; va_list vl; va_start(vl, amount); for (i = 0; i < amount; i++) { val = va_arg(vl, int); sum </stdarg.h>…

オリジナルLLVMバックエンド実装をまとめる(21. ByVal属性のついた引数を扱うための処理2)

前回の続き。 ByVal属性の引数における呼び出し側の処理 それでは、次に呼び出し側はどのようになっているのだろうか。 呼び出し側でも、ByVal属性のついた引数を一つ一つコピーして関数呼び出され側に渡す必要がある。 関数呼び出し側は、MYRISCVXTargetLow…

オリジナルLLVMバックエンド実装をまとめる(20. ByVal属性のついた引数を扱うための処理)

今までの関数処理の中で、引数は基本的にポインタか値渡し、そして値も何らかの型の値を1つずつ渡していくという形式だった。 しかし、C言語では構造体などの複数の要素をまとめた型を渡すことができる。また、C言語では構造体の値をそのまま値渡しで引数と…

オリジナルLLVMバックエンド実装をまとめる(19. LLVM IRからInstruction Selectionまでの流れ2)

前回の続き。 Legalizeでは、ターゲット固有のノードへの変換を行う。LLVM IRでは様々な演算ノードを定義しているが、ターゲットアーキテクチャによってはサポートしていない演算もある。 このような演算に関しては、ターゲットが生成できるノードに変換する…

オリジナルLLVMバックエンド実装をまとめる(18. LLVM IRからInstruction Selectionまでの流れ)

Instruction Selectionでは、LLVM IRを受け取り、それをSelection DAGに変換する。このフェーズは、さらに以下の細かなフェーズに分けることができる。 LLVM IRをSelection DAGへ変換 Selection DAGのCombine Selection DAGのLegalize Selection DAGをMachin…

オリジナルLLVMバックエンド実装をまとめる(17. 関数からも戻るときのCalling Convention)

次に、戻り値に関するCalling Conventionの実装から始める。 以下の記述では、関数の戻り値が渡される場合に、CCAssignToRegで示されるレジスタのどれかに引数が格納されるルールが追加されている。 そしてCalling ConventionであるRetCC_MYRISCVXを定義する…

オリジナルLLVMバックエンド実装をまとめる(16. 関数コールをサポートする)

今までのバックエンドの実装では、関数の取り扱いについていろいろとさぼっている部分があった。今回は、関数の定義と関数コールをきちんとサポートしようと思う。このためには、 スタックフレームの定義 引数の処理 などを実装していく。 現状では、引数の…