FPGA開発日記

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

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を通じて…

年末年始なので今年のまとめをしよう2018

このブログも始めてから4年が経った。 年末年始なので、今年一年はどうだったかな、ということでまとめてみよう。 今年の元旦には、こんな目標を立てていたのだった。 msyksphinz.hatenablog.com 引き続きRISC-Vをベースとしたエコシステムの勉強。自分でOSS…

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

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

"Creating an LLVM Backend for the Cpu0 Architecture"をやってみる(13. 制御文のサポート)

Cpu0のバックエンドをLLVMに追加するプロジェクト、8章では、if文などの制御文をサポートする。 今回も非常にファイル量が多くて、とりあえずLLVMをビルドするためだけにパッチを作って当てているが、LLVM 7.0は未サポートになっている部分が多く、ソースコ…

"Creating an LLVM Backend for the Cpu0 Architecture"をやってみる(12. Int型以外のサポート)

Cpu0のバックエンドをLLVMに追加するプロジェクト、7章では、これまでint型だけであった型のサポートを拡張する。 今回も非常にファイル量が多くて、とりあえずLLVMをビルドするためだけにパッチを作って当てているが、LLVM 7.0は未サポートになっている部分…

Chiselを使って波形を全く使わずにRISC-Vパイプラインプロセッサを設計した

タイトルの通りなのだが、Chiselというハードウェア記述言語を用いて、5ステージのRISC-Vパイプラインプロセッサの設計に挑戦していた。 プロセッサをはじめとするハードウェア設計は、大体の場合はVerilog-HDLやVHDLなどのハードウェア記述言語を使用するか…

"Creating an LLVM Backend for the Cpu0 Architecture"をやってみる(11. グローバル変数のサポート)

Cpu0のバックエンドをLLVMに追加するプロジェクト、6章では、グローバル変数のアクセスをサポートする。 今回も非常にファイル量が多くて、とりあえずLLVMをビルドするためだけにパッチを作って当てているが、LLVM 7.0は未サポートになっている部分が多く、…

"Creating an LLVM Backend for the Cpu0 Architecture"をやってみる(10. Objectファイルのサポート)

Cpu0のバックエンドをLLVMに追加するプロジェクト、第5章に入った。オブジェクトファイルのサポートを行う。 今回も非常にファイル量が多くて、とりあえずLLVMをビルドするためだけにパッチを作って当てているが、LLVM 7.0は未サポートになっている部分が多…

"Creating an LLVM Backend for the Cpu0 Architecture"をやってみる(9. 算術演算命令の追加)

Cpu0のバックエンドをLLVMに追加するプロジェクト、今回からは4章に入って、算術論理演算命令を追加する。まずは算術演算から。 算術演算において、特殊な演算ケースの場合は演算を最適化できる場合がある。この方式についても見ていく。 実装は以下。cpu0_c…

Chiselを使ってCPUを作ろう(17. 5ステージにCPUにフォワーディングパスを追加する)

Chiselを使って、非常にシンプルなCPUを作ってみるプロジェクト。5ステージまで拡張したので、次はフォワーディングパスを追加して正常に演算を実行できるようにする。 github.com ALUのフォワーディングパスは、 WBステージ → EXステージ MEMステージ → EX…

毎日技術ブログを書いていたら、権威のある国際学会(の併設ワークショップ)で講演することになった話

年末なので技術以外のことも日記に書きたいと思います。1年に1回くらいは、エモい記事を書いてもいいでしょう。 まあ今年のまとめみたいな記事です。 今年も飽きもせずほぼ毎日技術ブログを書いていました。今見たら今年の投稿数は340件に近いので、まあほと…

"Creating an LLVM Backend for the Cpu0 Architecture"をやってみる(8. BackEnd追加のまとめ2.)

Cpu0のバックエンドをLLVMに追加するチュートリアル、第3章(?)のBackendの追加の章をやり終えた。 やり終えたといっても、ひたすら写経して、ビルドして、テストパタンを動かして終わりである。 これではさすがにもったいないので、もう少しまとめておきた…

"Creating an LLVM Backend for the Cpu0 Architecture"をやってみる(8. BackEnd追加のまとめ1.)

Cpu0のバックエンドをLLVMに追加するチュートリアル、第3章(?)のBackendの追加の章をやり終えた。 やり終えたといっても、ひたすら写経して、ビルドして、テストパタンを動かして終わりである。 これではさすがにもったいないので、もう少しまとめておきた…