FPGA開発日記

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

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

オリジナルLLVM Backendを追加しよう (23. 命令の定義からAsmPrinterへの変換プロセスまとめ)

LLVMにはすでにRISC-Vのバックエンドサポートが追加されている。しかし、勉強のために独自のRISC-V実装をLLVMに追加している。 jonathan2251.github.io LLVMには独自のIRを定義できる仕組みがあり、それを使って命令を変換したりして最終的に命令を生成する…

MIPS Openがリソース公開

リソースの一部を公開するとアナウンスしたMIPSだが、この度一部の資料が公開されたようだ。 www.mipsopen.com ダウンロードできる資料も増えたようだ。 https://www.mipsopen.com/ ダウンロードできる資料としては、 MIPS Open Architecture (仕様書) Basel…

オリジナルLLVM Backendを追加しよう (22. テスト環境の調査)

LLVMにはすでにRISC-Vのバックエンドサポートが追加されている。しかし、勉強のために独自のRISC-V実装をLLVMに追加している。 jonathan2251.github.io 関数コールもかなり動くようになってきて、これまでに多くのテストパタンを確認してきたのだが、リグレ…

RustでRISC-V命令セットシミュレータを作ろう (6. MMUの実装とテストパタンの実行)

Rustで作るRISC-Vシミュレータ。基本的な形が出来上がった。トレースファイルも出せるようになったので、MMUを実装してテストパタンを実行して確認しよう。 MMUを動かすテストパタンは、rv{32,64}u{imfda}-v-xxxという形で表現されている。-v-というテストパ…

RustでRISC-V命令セットシミュレータを作ろう (5. シミュレータのトレースデータ出力機構の実装)

Rustで作るRISC-Vシミュレータ。基本的な形が出来上がった。MMUの変換処理は、まだデバッグ中だ。しかしデバッグするためには、トレースデータを出力できるようにする必要がある。 トレースデータを出力するためには、RISC-Vシミュレータが実行した情報をト…

Chiselでビットコインマイナーを設計してみる(3. Scala版とVerilog版の検証と速度比較)

ChiselでSHA256の回路を設計するプロジェクト、Scalaでの検証用コードと、Chiselで書いたハードウェアを検証する。 Chiselで書いたハードウェアは、SHA256のアルゴリズムで64回分ループを回す部分を展開し、パイプライン化した。 これにより、1サイクル毎にS…

オリジナルLLVM Backendを追加しよう (21. Function Callの実装)

LLVMにはすでにRISC-Vのバックエンドサポートが追加されている。しかし、勉強のために独自のRISC-V実装をLLVMに追加している。 jonathan2251.github.io 第9章は、関数コールの実装だ。関数コールの実装は量が多すぎてまだ理解が及んでいないが、とりあえずJu…

Chiselでビットコインマイナーを設計してみる(2. ScalaでSHA256の検証プログラムを書く)

SHA256の回路をChiselで開発しようプロジェクト、とりあえず基本的な回路は記述したので、次に検証用のテストコードを書いていく。 検証用のテストコードはScalaで書く。その方がChiselと親和性が良いし、検証が行いやすいと思う。 という訳で、とりあえずSc…

Chiselでビットコインマイナーを設計してみる(1. SHA256コアの開発)

Vivado-HLSで観察していたビットコインマイニング回路の開発、面白そうなのでChiselに移植してみることにした。 勘違いしがちだがChiselは高位合成システムではなく、基本的にRTLの記述レベルを維持しつつ、Scala言語の良いところを取り入れてよりソフトウェ…

LLVM 8.0がリリースされたのでビルド試行とオリジナル実装の8.0への移行

releases.llvm.org LLVM 8.0がリリースされたので、さっそくダウンロードしてビルドしてみた。 これまで通り、GitHub経由でダウンロードしていたので、タグをrelease_80にアップデートするだけである。 $ cmake -G Ninja -DCMAKE_CXX_COMPILER=${HOME}/other…

Vivado-HLSを用いたビットコインマイニング回路 (1. サンプルプログラムの試行)

ビットコインといえば一昨年くらいから急に盛り上がりだして、猫も杓子もビットコインという状態になりかけたけれども急にまた暴落して皆辞めてしまったという悲しい技術ではあるが、私も流行に乗ってビットコインについて勉強した手前、なにか自分で手を動…

オリジナルLLVM Backendを追加しよう (20. Conditional Moveの実装)

LLVMにはすでにRISC-Vのバックエンドサポートが追加されている。しかし、勉強のために独自のRISC-V実装をLLVMに追加している。 jonathan2251.github.io 第8章の後半は、Conditional Moveの実装を行っていく。 Cpu0のConditional Moveはどのように指定実装し…

オリジナルLLVM Backendを追加しよう (20. 制御構文の実装と最適化Passの追加)

LLVMにはすでにRISC-Vのバックエンドサポートが追加されている。しかし、勉強のために独自のRISC-V実装をLLVMに追加している。 jonathan2251.github.io 8.2 章 Long Branchのサポート 第8章の前半はLongBranchのサポート。これは読んでみたがあまりよく分か…

小学校のプログラミング教育に関する学習指導要領を読んでプログラミング授業を想像体験してみた

どうやら2020年度から小学校にプログラミング教育が必修となるらしく、どこもかしこもプログラミング教育でアツい。 小学生向けのプログラミング教室も盛況らしく、英語に加えて、新しい教育の投資先としても注目されているようだ。 しかし、小学生に対して…

RustでRISC-V命令セットシミュレータを作ろう (4. MMUとスーパバイザモードの実装検討)

Rustで作るRISC-Vシミュレータ。基本的な形が出来上がったので、今度はOSを動かすためのMMUとスーパバイザモードの実装に移っていく。 基本的なところは、C++で作った実装をコピーしていき、Rustに移植するだけでよいと思っている。 メモリアクセスを実行す…

Vivado-HLSを使って高位合成でCPUを作ってみる(9. HLSでAXIのバイトイネーブルはどう制御する?)

Vivado-HLSを使って簡単なRISC-V CPUを作ってみている。 現在の悩みどころはメモリアクセスの制御だ。CPUはワードアクセス以外に、ハーフワード、バイトアクセスなども発生する。 Vivado-HLSのモジュールのインタフェースはAXIだけれども、C言語でこれをどの…

オリジナルLLVM Backendを追加しよう (19. 分岐命令の実装)

LLVMにはすでにRISC-Vのバックエンドサポートが追加されている。しかし、勉強のために独自のRISC-V実装をLLVMに追加している。 jonathan2251.github.io 第8章は制御構文の追加。手始めにまずは分岐命令を実装していく。 分岐命令を生成させるためには、分岐…

オリジナルLLVM Backendを追加しよう (18. 様々なデータタイプの実装)

LLVMにはすでにRISC-Vのバックエンドサポートが追加されている。しかし、勉強のために独自のRISC-V実装をLLVMに追加している。 jonathan2251.github.io 第7章の残りに取り組む。 浮動小数点の実装はとりあえず省略。RISC-Vではclzもclo命令も存在しないので…

CPUの新たな脆弱性 SPOILERの論文を読む

arxiv.org GIGAZINEでも紹介された新たなCPUの脆弱性の論文"SPOILER"が発表された。GIGAZINEがこのような記事を公開するのは珍しいなと思いつつ、面白そうなので読んでみることにした。 ちなみに、筆者は例によってセキュリティの専門家ではないし、CPUアー…

RustでRISC-V命令セットシミュレータを作ろう (3. 乗除算命令の実装とWrapping処理)

Rustで作るRISC-Vシミュレータ。基本的な形が出来上がったので、次に命令を追加してテストパタンをパスさせていく。 次に追加するのは乗除算命令だ。RV32には以下のテストパタンが用意されているので、それぞれ実装していく。 rv32um-x-mulhsu rv32um-x-mulh…

オリジナルLLVM Backendを追加しよう (17. 32-bitコアでの64bit整数演算の命令出力実装)

LLVMにはすでにRISC-Vのバックエンドサポートが追加されている。しかし、勉強のために独自のRISC-V実装をLLVMに追加している。 jonathan2251.github.io 32bit環境でのlong longの乗算についての実装を行っている。ISDで言うと所の、SMUL_LOHIとUMUL_LOHIの実…

オリジナルLLVM Backendを追加しよう (16. 32-bitコアでの64bit整数演算の命令出力調査)

LLVMにはすでにRISC-Vのバックエンドサポートが追加されている。しかし、勉強のために独自のRISC-V実装をLLVMに追加している。 jonathan2251.github.io 第7章では、long long(64-bit)の対応も含まれている。解説の中では、MIPSのようなHIレジスタとLOレジス…

BOOM(Berkeley Out-Of Order) コアがfpga-zynqに対応したのでFPGAで動かしてみる(2. FPGAでの動作確認)

BOOMメーリングリストで正式リリースのあった、BOOMコアのFPGA対応、ビルドが完了したのでFPGA(ZedBoard)で動かしてみる。 github.com Windows Subsystem on Linux上で作業しているのだが、SDカードへの書き込みなどの作業は問題なく行うことができる。 Dド…

BOOM(Berkeley Out-Of Order) コアがfpga-zynqに対応したのでFPGAで動かしてみる(1. プロジェクトのビルド)

BOOMメーリングリストで正式リリースのあった、BOOMコアのfpga-zynqリポジトリ対応、面白そうだ。 BOOMというのはRISC-Vのオープンソースアウトオブオーダプロセッサで、GitHubから入手でき、だれでも手を加えることができるプロセッサだ(ただしChiselで記述…

オリジナルLLVM Backendを追加しよう (15. int型以外の変数への対応)

LLVMにはすでにRISC-Vのバックエンドサポートが追加されている。しかし、勉強のために独自のRISC-V実装をLLVMに追加している。 jonathan2251.github.io 第7章は、int型以外の各種変数型に対応させる。 github.com diff --git a/lib/Target/MYRISCVX/MYRISCVX…

RustでRISC-V命令セットシミュレータを作ろう (2. rv32ui-pのすべてのテストパタンをPassさせる)

Rustで作るRISC-Vシミュレータ。基本的な形が出来上がったので、次に命令を追加してテストパタンをパスさせていく。 必要なのは命令を追加するだけなので、どんどん追加していく。 今回は特にハマるところはなく命令を追加していくことができたのだが、やは…

コマンドラインからSlackに通知を送るツールslackcatを使って長いジョブを忘れないようにする

半導体設計者あるあるだが、一回に流れるジョブが長すぎて、別の作業をしているとそのジョブが完了していても忘れることがある。 つまり長いジョブを流す場合、ジョブが完了したときに通知が来ればよいのだが、いちいちメールを飛ばすようにしているとメール…

Vivado-HLSを使って高位合成でCPUを作ってみる(8. RISC-VのテストベンチをすべてPassさせる)

Vivado-HLSを使って簡単なRISC-V CPUを作ってみている。 すべてのテストパタンを通したいのだが、バスをどのように作ればよいのか迷っている。 これまでは32bitでバスを作っていた。これは通常のLW/SW命令だとよいのだが、HalfWord, Byteのロードストアでは…