FPGA開発日記

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

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

Binary Translation型エミュレータを作る(MUL/DIV命令の実装)

Binary Translation方式の命令セットエミュレータのRust実装をしている。いくつかのベンチマークを動かすために、乗除算命令を実装しなければならない。これまでサボっていたので実装方法を検討していく。 RISC-Vには以下の乗除算命令が定義されている。MUL…

Parameter / Conifgで作るコンフィグレーション可能なChiselデザイン2

複数のConfigを組み合わせる 前回のパラメータは、いくつかのコンフィグレーションを組み合わせて新しいコンフィグレーションを作り上げることができる。例えば以下の2つのConfigを組み合わせて新しいConfigを作り上げることができる。 class Bus32BitConfig…

Binary Translation型エミュレータを作る(TCGのキャッシュ化による高速化)

Binary Translation方式の命令セットエミュレータのRust実装をしている。前回、ロードストア命令をTLBに対応させて高速化した。これに続いて、命令用のTCGをキャッシュ化により高速化させる。これまでは命令を変換する際にキャッシュを持たず常にTCG変換を行…

Parameter / Conifgで作るコンフィグレーション可能なChiselデザイン

Chiselのアドバンスドな使い方はDiplomacy / Parameters / Configあたりを使いこなすことだと言われる。ParametersとConfigについては何となく理解しているつもりだが具体的なサンプルを使って確かめていなかったのでいくつか調査している。 最もシンプルな…

Binary Translation型エミュレータを作る(MMUをストア命令に対応させる)

Binary Translation方式の命令セットエミュレータのRust実装をしている。前回、ロード命令の実装をTLBに置き換えた。これによりTLBキャッシュにヒットした場合はロード命令の動作が高速化され、高速命令実行が可能になる。今度はこれをストア命令に対応させ…

Binary Translation型エミュレータを作る(MMUアクセスをTCG化)

Binary Translation方式の命令セットエミュレータのRust実装をしている。前回、MMUへのアクセスをすべてヘルパー関数で実現することができたが、もちろんこれで終わることは出来ない。ヘルパー関数はRustのプログラムでメモリアクセスが発生すると常にそれが…

Binary Translation型エミュレータを作る(メモリアクセス命令のMMU実装)

Binary Translation方式の命令セットエミュレータのRust実装をしている。仮想アドレス変換機能を使ってRISC-Vのロードストア命令の実装を行っている。実装後にテストパタンを流しながらバグを取っているが、いくつか問題になった部分がある。 通常命令実行中…

最小構成で学ぶChisel & Diplomacy

Diplomacyを使ってみるために、最小構成を考えてみよう。上記の2つのPusher(リクエスト挿入するためのモジュール)を介してMemoryに接続する。 下記のソースコードはいくつか説明しておいた方が良い。 まず、pusher1, ifu, xbar, memoryはLazyModuleとして…

Chisel & Diplomacyの考え方

ChiselはScalaをベースとしたハードウェア記述言語で、ソフトウェア開発言語をベースにしている分だけ柔軟に記述できたり、Verilogなのでは不可能な面白い記述ができたりする。 Chisel自体でも十分ハードウェア設計をすることは可能なのだが、よりChiselを柔…

ChiselとDiplomacyを使ってオリジナルデザインを作成してみる (3. 外部モジュールとの接続方法検討)

前回の続き。Diplomacyを使って実際にいくつかデザインを作ってみようと思った。Diplomacyを使えばデバッグユニットをその場で生成して、さらに外部と接続して制御したい。そんなデザインを作ってみよう。 CoreComplexモジュールの作成 まずはコアの部分を作…

ChiselとDiplomacyを使ってオリジナルデザインを作成してみる (2. Rocket-Chipの確認)

Diplomacyの勉強をしていて、さてRocket-Chipの場合はどのようにして外部インタフェースと接続しているのか、具体的にはどのようにELFファイルなどのテストパタンをロードしているのか気になってきたので調査してみた。 Verilatorの場合 Verilatorはシミュレ…

ChiselとDiplomacyを使ってオリジナルデザインを作成してみる (1. 開発環境の構築)

久しぶりにChiselで何か作ってみたくなった。Chiselを使うならDiplomacyを使わないと意味ないだろ!ということで久しぶりにDiplomacyの資料を取り出して読み直している。少し新しいデザインを作りながら、Diplomacyの作り方を復習している。 Diplomacyを使っ…

ブログを毎日書き続けるためのテクニック

このブログ「FPGA開発日記」は約2100日で2000記事に到達した。特に2019年と2020年は殆どサボることなく記事を書き続けることができている。ブログの品質は置いておいて、毎日日記を書くことは何となく楽しいものだ。2015年にブログを開設したときに「よしこ…

歳を取ったエンジニアとして腕力のある若手にどうやって立ち向かおうか考えた

この記事はFPGA開発日記の祝2,000記事到達の記念に書いているものです。 普段の記事と比べて非常にエモい内容となっております。 FPGA開発日記を始めたのが2015年の1月4日。それからおよそ5年と10か月で2,000記事に到達した。 計算してみると2,115日での2,00…

Binary Translation型エミュレータを作る(softfloat-wrapper最新版への対応)

少し前に浮動小数点命令対応時に、Rustのクレートであるsoftfloat-wrapperがRISC-V向けコンパイルに対応していなかったのだが、作者の方が対応してくれたようで、RISC-Vコンパイルに対応してくれたようだ。さっそくアップデートしてみる。Cargo.tomlを以下の…

Binary Translation型エミュレータを作る(TCGの途中で例外を取得する方法の検討)

TCGは分岐命令に到達するまで一連のブロックとして変換されるため、1ブロックで複数の命令が実行されます。もしこのブロック実行中に例外が発生した場合どのようにすればよいでしょうか?例えば以下のような命令列をTCGに変換することを考えます。 add x10, …

Binary Translation型エミュレータを作る(ロードストア命令のMMU実装)

Binary Translation方式の命令セットエミュレータのRust実装をしている。前回まででデバッグ機能は作り切ったので、いよいよより複雑な機能の実装に着手する。まず手を付けなければならないのは仮想アドレスのサポート。前回までにとりあえずRustによる仮想…

Binary Translation型エミュレータを作る(MMU機能の実装検討)

Binary Translation方式の命令セットエミュレータのRust実装をしている。前回まででデバッグ機能は作り切ったので、いよいよより複雑な機能の実装に着手する。まず手を付けなければならないのは仮想アドレスのサポート。これが無いとテストパタンの大半をPAS…

MicrochipのPolarFire SoC Icicle Kitを購入した

ちょくちょく話題に上がっていた、MicrochipのPolarFire Icicle Kitを購入し、先日発送されついに我が家に到着した。 どうも中身はSiFiveのマルチコアSoCのようで、それにFPGAを接続してSoCを構成しているようだ。 しかし詳細については正直全く調べていない…

「SystemVerilog入門」を入手しました

SystemVerilog入門: 設計・仕様・検証のためのハードウェア記述言語作者:篠塚 一也発売日: 2020/10/09メディア: 単行本 共立出版様から「System Verilog入門:設計・仕様・検証のためのハードウェア記述言語」を献本頂きました。共立出版様、ありがとうござ…

「動かして学ぶ 量子コンピュータプログラミング」を買いました

量子コンピュータについては、こういう本が欲しかったんですよ。大学の講義資料とかを読み漁っても、量子コンピュータって複雑な数式が大量に出てきたりして分かりにくい。そこをどうにか突破できたとしても、じゃあどうやって具体的にプログラミングするの…

「並列コンピュータ 非定量的アプローチ」を買いました

天野英晴先生の新著ということで購入してみました。「非定量的」という何とも面白いサブタイトルを付けたもんだ。 「非定量的アプローチ」という名前の通り、本書にはヘネパタと違って具体的な数値がグラフが全く出てこない。すべてを雰囲気で理解するための…

Binary Translation型エミュレータを作る(RISC-V Disassemblerクレートの作成)

Binary Translation方式の命令セットエミュレータのRust実装、ある程度進んできたが、どんどん複雑なテストパタンを確認していかなければならない。デバッグ機能についてだが、ホスト命令のディスアセンブル機能ができたので、次はゲスト命令をディスアセン…

Binary Translation型エミュレータを作る(x86命令ディスアセンブルのサポート)

Binary Translation方式の命令セットエミュレータのRust実装、ある程度進んできたが、どんどん複雑なテストパタンを確認していかなければならない。デバッグ機能についてだが、ホスト命令(つまりx86命令)のディスアセンブル機能を実装したい。つまり、変換後…

Binary Translation型エミュレータを作る(ステップ実行のサポート)

Binary Translation方式の命令セットエミュレータのRust実装、ある程度進んできたが、どんどん複雑なテストパタンを確認していかなければならない。その際に問題となるのはデバッグ機能だ。デバッグ機能については、いくつかやらなければならないことがある…

Binary Translation型エミュレータを作る(fsgnj命令の実装)

Binary Translation方式のエミュレータをRustで作る実装、浮動小数点命令を実装している。次はfsgnj命令の実装だ。fsgnj命令は単精度・倍精度を合わせて合計6つ存在している。 FSGNJ.D fd, fs1, fs2 // f[rd] = {f[rs2][63], f[rs1][62:0]} FSGNJN.D fd, fs1…

QEMUはどのようにMMUをエミュレートしているのか

QEMUがどのようにしてMMUによるアドレス変換を実現しているのかを観察する。 まず以下のオプションでテストパタンを実行しログの様子を観察する。 ./build-riscv/riscv64-softmmu/qemu-system-riscv64 \ -nographic -d in_asm,mmu \ -kernel /home/msyksphin…

半導体業界における「IP」とは何なのかを説明したい

「RISC-V」という言葉が徐々にエンジニア界隈に普及し始め、技術界隈のニュースサイトだけでなく、一般的なニュースを扱うような新聞社の記事でも見かけるようになってきました。例えば以下のような記事です。 www.nikkei.com 半導体エンジニアではない人が…

KVM on SpikeでRISC-Vのハイパーバイザーを試す

前回のQEMUを使ったRISC-V Linuxの起動およびKVMでのLinux起動、実はSpikeでも実現できることが分かった。 同じプロジェクト内の以下のWikiを参考にした。というか、違いはQEMUをビルドする代わりにSpikeをビルドするだけだった。 github.com git clone http…

KVM on QEMUでRISC-Vのハイパーバイザーを試す

RISC-Vのハイパーバイザー拡張は現在Version0.61まで進んでいるが、実際にアプリケーションを試す手法としてLinux上でKVMを動かしてさらにLinuxを立ち上げるというものがある。チュートリアルが公開されているので試してみたい。 以下の資料に基づいて試して…