FPGA開発日記

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

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

オリジナルLLVM Backendを追加しよう (17. フレーム処理)

LLVMにはすでにRISC-Vのバックエンドサポートが追加されている。しかし、勉強のために独自のRISC-V実装をLLVMに追加している。 関数呼び出しの際のフレームを生成する。これはCpu0 BackendのChapter3_5に相当するところだ。 これがうまくいくと、main()関数…

RISC-Vのアウトオブオーダコアで体験するSpectre/Meltdown (1. Variant-1を動かしてみる)

BOOM v2.2がリリースされたことに伴い、BOOMを使ったSpectre/Meltdownの攻撃手法を再現するリポジトリの存在を知った。 boom-attacks というリポジトリだ。これはアウトオブオーダプロセッサのBOOMを使い、Spectreの攻撃手法を再現しようというものである。 …

マルチコアにおけるキャッシュコヒーレンシ方式の簡単なまとめ (1. キャッシュスヌープ方式)

久しぶりににヘネパタ(「コンピュータアーキテクチャ 定量的アプローチ 第5版」)を読み直していると面白い。少しマルチコアプログラミングについて確認したいことがあったので、マルチコアにおけるキャッシュコヒーレンシを保つための手法についてもう一度勉…

RVC命令に対応したRISC-VアウトオブオーダコアBOOM v2.2リリース (1. ビルド & シミュレーション試行)

https://boom-core.org RISC-VのアウトオブオーダプロセッサであるBOOMのVersion 2.2がリリースされた。 リリース通知から、アップデート内容を確認してみると、 全てのコンフィグレーションでRISC-V Compressed("RVC")命令をサポート これでBOOM専用にRV64G…

Western DigitalのRISC-VコアSweRV-EH1 (1. SweRVの環境構築とVivado論理合成)

Western DigitalからオリジナルのRISC-VコアSweRVがリリースされた。 2019/06/20追記。Swerv-EH1 CoreはCHIPS Allianceプロジェクトのサブプロジェクトとして正式にGitHubのリポジトリが移された。Swerv-EH 1.1が公開されている。 github.com https://github…

オリジナルLLVM Backendを追加しよう (16. SelDAGtoDAGの実装)

LLVMにはすでにRISC-Vのバックエンドサポートが追加されている。しかし、勉強のために独自のRISC-V実装をLLVMに追加している。 SelectionDAGを追加している。きつねさんLLVM本曰く、SelDAGtoDAGというのは、 LLVM IR から SelectionDAG を経由して MI Layer…

オリジナルLLVM Backendを追加しよう (15. RISC-Vオリジナルターゲットの作り直し)

LLVMにはすでにRISC-Vのバックエンドサポートが追加されている。しかし、勉強のために独自のRISC-V実装をLLVMに追加している。 Chapter-3のサイズの大きなスタックフレームの処理に関して、どうにも解決できずに悩んでいる。 とりあえず最初から全体的に見直…

オリジナルLLVM Backendを追加しよう (14. RISC-V命令フィールド登録の見直し)

LLVMにはすでにRISC-Vのバックエンドサポートが追加されている。しかし、勉強のために独自のRISC-V実装をLLVMに追加している。 Chapter-3のサイズの大きなスタックフレームの処理に関して、どうにも解決できずに悩んでいる。 とりあえず最初から全体的に見直…

Chiselで非同期クロック設計をしよう

Chisel3.0からは異種クロックのサポート、つまり複数のクロックを使ったデザインがサポートされるようになった。 Chisel3でクロックを2つ用意するためには、CrossingIOを使用する。 class AsyncQueue[T

RISC-V 64-bit LLVM Backendを試す (13. Return文生成の解析)

LLVMにはすでにRISC-Vのバックエンドサポートが追加されている。しかし、勉強のために独自のRISC-V実装をLLVMに追加している。 前回までで、簡単なReturn命令は生成されるようになったが、まだ-O2オプションを付加しないとエラーが発生する。 EmitPrologueと…

RISC-V 64-bit LLVM Backendを試す (12. EmitPrologueとEmitEpilogueを実装したい)

LLVMにはすでにRISC-Vのバックエンドサポートが追加されている。しかし、勉強のために独自のRISC-V実装をLLVMに追加している。 前回までで、簡単なReturn命令は生成されるようになったが、まだ-O2オプションを付加しないとエラーが発生する。 次はCpu0 Backe…

VerilogからChiselへ移行するためのTips(文法編)

趣味でVerilogで書いたデザインをChiselに移植していたのだが、VerilogとChiselの文法的な違い、移植するにあたり注意すべき点が少しずつ分かってきた。 まだ文法的な部分しか見ていないが、Verilogで書いたデザインをChiselに移植するために気を付けなけれ…

RISC-V 64-bit LLVM Backendを試す (11. 簡単なReturn命令を生成する)

LLVMにはすでにRISC-Vのバックエンドサポートが追加されている。しかし、勉強のために独自のRISC-V実装をLLVMに追加している。 簡単なReturn IRが変換できるように実装を進めていこう。 実装するのに見ている関数群は以下のようなものだが、まず関数の意味が…

Chiselを使ったハードウェアデザインでトレイトを活用するためには(2. MultiIOModuleを使ったI/Oの追加)

Chiselでのトレイトの活用 Chiselでトレイトを使って機能を拡張する話、関数の追加やポート幅の拡張などの方法は分かったが、ポートを増やすためにはどのようにすれば良いのだろうか。 いろいろ調べていると、MultiIOModuleという機能が使えそうであった。 g…

RISC-V 64-bit LLVM Backendを試す (10. サブターゲットのエラーを解析する)

LLVMにはすでにRISC-Vのバックエンドサポートが追加されている。しかし、勉強のために独自のRISC-V実装をLLVMに追加している。 少しずつ進んでいるが、まだターゲットのプログラムを正しくバイナリに変換することができない。 SubtargetFeature.cppを確認し…

Chiselを使ったハードウェアデザインでトレイトを活用するためには

Chiselでのトレイトの活用 Chiselはハードウェア記述言語だが、ベースの言語はScalaなので様々な高級言語の機能を活用することができる。 ScalaやRustではトレイトという機能を使うことができる。 トレイトというのはあまり私も詳しくないのだが、 ja.wikipe…

Chiselで生成したVerilogをVivadoで論理合成試行する

ChiselでRISC-Vプロセッサを設計するプロジェクト、しばらく手を付けていなかったのだが、実際にFPGAで動かすことを想定してVivadoで論理合成を実施した。 github.com Vivadoの論理合成スクリプトは、まだCPUのIP単体だけなので単純に合成をするだけで配置配…

RISC-V 64-bit LLVM Backendを試す (9. IDAGtoDAGの実装)

LLVMにはすでにRISC-Vのバックエンドサポートが追加されている。しかし、勉強のために独自のRISC-V実装をLLVMに追加している。 前回までで独自アーキテクチャのオプション(MYRISCVX)をllcに表示できるようになった。 実行してみると、アサーションで落ちる問…

RISC-V 64-bit LLVM Backendを試す (7. AsmPrinterの実装)

LLVMにはすでにRISC-Vのバックエンドサポートが追加されている。しかし、勉強のために独自のRISC-V実装をLLVMに追加している。 前回までで独自アーキテクチャのオプション(MYRISCVX)をllcに表示できるようになった。 しかしまだいろいろ追加していないので、…

RISC-V 64-bit LLVM Backendを試す (6. Subtargetの確認とllcの動作確認)

LLVMにはすでにRISC-Vのバックエンドサポートが追加されている。しかし、勉強のために独自のRISC-V実装をLLVMに追加している。 まだ現時点ではビルドにすら成功していないが、徐々に修正しながら必要なものを追加してビルドしている。 前回までのビルドした…

Chiselで設計したHWのコンパイルオプションで生成されるモジュールを切り替える方法

Chiselという言語はVerilogとは似て非なる。 ハードウェアを記述する言語ではあるが、Verilogと同じように考えているとどのようにハードウェアを作ればよいのかわからなくなったり、Chiselの本来のうま味を引き出せなくなる。 前回は、Chiselの記述中にVeril…

RISC-V 64-bit LLVM Backendを試す (5. 基本的なファイルの追加とビルド)

LLVMにはすでにRISC-Vのバックエンドサポートが追加されている。しかし、勉強のために独自のRISC-V実装をLLVMに追加している。 まだ現時点ではビルドにすら成功していないが、徐々に修正しながら必要なものを追加してビルドしている。 ビルドを通すためには…

RISC-V 64-bit LLVM Backendを試す (4. SubtargetとProcessor Model)

LLVMにはすでにRISC-Vのバックエンドサポートが追加されている。しかし、勉強のために独自のRISC-V実装をLLVMに追加している。 まだ現時点ではビルドにすら成功していないが、徐々に修正しながら必要なものを追加してビルドしている。 まず、ターゲットアー…

Chiselの中にVerilogを埋め込む方法

ChiselはScalaをベースにしたハードウェア記述言語で、より高位な記法を使ってハードウェアを設計しようという考え方を持っている。 しかし、どうしてもVerilogを使いたい場合、あるいはある部品は既存のVerilogで記述されたものを使いたいと思うときがある…

RISC-V 64-bit LLVM Backendを試す (3. TargetMachineとTargetInfoを追加する)

LLVMについて理解するために、RISC-Vをネタにしていろいろ勉強してみたい。 Release 7.0では一応RISC-Vの32-bitと64-bit版がサポートされているようなので、ビルドに追加して様子を見てみる。 次はRISCV_msyksphinzのターゲットアーキテクチャについて定義し…

RISC-V 64-bit LLVM Backendを試す (2. 独自RISC-V実装を追加する。アーキテクチャの追加とレジスタ)

LLVMについて理解するために、RISC-Vをネタにしていろいろ勉強してみたい。 Release 7.0では一応RISC-Vの32-bitと64-bit版がサポートされているようなので、ビルドに追加して様子を見てみる。 ここで追加するのは、新しい"RISCV_msyksphinz"というアーキテク…

RISC-V 64-bit LLVM Backendを試す

LLVMについて理解するために、RISC-Vをネタにしていろいろ勉強してみたい。 Release 7.0では一応RISC-Vの32-bitと64-bit版がサポートされているようなので、ビルドに追加して様子を見てみる。 $ cmake -G Ninja -DCMAKE_BUILD_TYPE="Debug" -DLLVM_TARGETS_T…

"Creating an LLVM Backend for the Cpu0 Architecture"をやってみる(15. 関数コール2)

Cpu0のバックエンドをLLVMに追加するプロジェクト、9章の後半では、関数コールの様々な方法についてみてみる。 今回も非常にファイル量が多くて、とりあえずLLVMをビルドするためだけにパッチを作って当てているが、LLVM 7.0は未サポートになっている部分が…

あけましておめでとうございます 2019

あけましておめでとうございます。本年も、「FPGA開発日記」をよろしくおねがい致します。 昨年は、 RISC-Vに関連して4件の発表を行った。特に福岡のMICRO51で発表できたのは貴重な機会だった。 ディープラーニングについて理解を深めた。keras2cppを通じて…