FPGA開発日記

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

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

RISC-V ハイパーバイザー拡張の勉強 (2ステージアドレス変換動作を実装から確認する)

仮想化モードが設定されている場合、RISC-Vのアドレス変換は2ステージを踏むことになっている。 VSレベルアドレス変換:仮想アドレス → ゲスト物理アドレス Gレベルアドレス変換:ゲスト物理アドレス → スーパーバイザー物理アドレス まずはVSレベルアドレス…

RISC-V ハイパーバイザー拡張の勉強 (5.6 例外その2)

Compressed命令ではない標準的なロード命令で、LB,LBU,LH, LHU, LW, LWU, LD, FLW, FLD, FLQの内一つに例外が発生した場合の変換された命令のフォーマットを図5.42に示す。 Compressedではない標準的なストア命令で、SB, SH, SW, SD, FSW, FSD, FSQのうち一…

RISC-V ハイパーバイザー拡張の勉強 (5.6 例外)

5.6 例外 5.6.1 例外要因コード ハイパーバイザー拡張では、例外要因のエンコーディングについて決められている。表5.5はハイパーバイザーが実装された場合でのM-ModeおよびHS-Modeでの例外要因コードを示している。VSレベル例外(割り込み要因コード2,6,10)…

RISC-V ハイパーバイザー拡張の勉強 (2ステージアドレス変換の例外とFENCE)

5.5.2 ゲストページフォルト ゲストページフォルト例芸はmedeleg CSRの制御によりM-ModeからHS-Modeに移譲される可能性があるが、他の動作モードに移譲することはできない。ゲストページフォルトでは、mtvalもしくはstvalに通常通りゲスト仮想アドレスが書き…

RISC-V ハイパーバイザー拡張の勉強 (ハイパーバイザ―の動作をSpikeの実装から確認する)

これまで学んできたRISC-Vのハイパーバイザーについて、Spikeの実装を確認しながら後追いで復習する。 Hypervisorをサポートするメンバ変数V 現在仮想モードで動いているかどうかを示す仮想モードVを示すのに、メンバ変数vが定義されている。 riscv-isa-sim/…

RISC-V ハイパーバイザー拡張の勉強 (5.5 2ステージアドレス変換)

5.5 2ステージアドレス変換 現在の仮想モードVが1であるときは常に2ステージアドレス変換と保護が有効である。すべての仮想メモリアクセスにおいて、オリジナルの仮想アドレスはvsatpレジスタにより制御されるVSレベルアドレス変換によって最初のステージで…

自作RISC-V CPUコアの検証用にDPI-Cを使用してSpikeを接続するための試行(Spikeの仕組み調査、続き)

DPI-Cを用いてSpikeとVerilator上のCPUを接続する構成の検討、実装を進めていった。 まず、RTL側だが、コミットが発生した時点でその情報をDPI-Cを経由してSpikeを制御するC++のコードに伝えなければならない。適当に以下のようにした。 always_ff @ (negedg…

RISC-V ハイパーバイザー拡張の勉強 (5.3.2 ハイパーバイザーメモリ管理フェンス命令)

5.3.2 ハイパーバイザーメモリ管理フェンス命令 ハイパーバイザーメモリ管理フェンス命令、HFENCE.VVMAとHFENCE.GVMAはSFENCE.VMA(4.2.1節)と同様の動作をするが、HFENCE.VVMAはvsatp CSRによって制御されるVSレベルのメモリ管理データ構造に対して適用され…

RISC-V ハイパーバイザー拡張の勉強 (ハイパーバイザー命令)

5.3 ハイパーバイザー命令 ハイパーバイザー拡張では、仮想マシンのロード・ストア命令と2つの特権付きfence命令が追加される。 5.3.1 ハイパーバイザー仮想マシンロードストア命令 ハイパーバイザー仮想マシンロードストア命令は、M-Mode, HS-Modeもしくはh…

自作RISC-V CPUコアの検証用にDPI-Cを使用してSpikeを接続するための試行(Spikeの仕組み調査)

CPUコアの検証には多くの場合にはテストパタンを流して検証する方法が用いられるが、CPUの動作をチェックするために命令セットシミュレータ(Instruction Set Simulator: ISS)を使用して、RTLの動作と命令セットシミュレータの動作が一致するかを確認する手法…

RISC-V ハイパーバイザー拡張の勉強 (vsip, vsie, vstvec, vsscratch, vsepc, vscause, vstval, vsatp)

5.2.11 仮想スーパーバイザー割り込みレジスタ (vsip, vsie) vsipとvsieはVSXLENビットの読み書き可能なレジスタで、sipとsieレジスタのVS-Mode版である。それぞれのビットフォーマットを図5.22および図5.23に示す。V=1の時、vsipとvsieはsipとsieの代替であ…

独自RISC-V CPUコアの実装 (ModelSim Intel Starterによるシミュレーション環境構築)

自作RISC-V CPUのシミュレーション環境を、VerilatorとVivado Simで立ち上げたが、やはりVerilatorが2値しか扱ってくれないのはデバッグがはかどらないし、そもそもGTKWaveが死ぬほど使いにくい。そしてVivado Simulatorでのシミュレーション環境を立ち上げ…

RISC-V ハイパーバイザー拡張の勉強 (hgatp, vsstatus)

5.2.9 ハイパーバイザーゲストアドレス変換および保護レジスタ (hgatp) htatapレジスタはHSXLENビットの読み書き可能なレジスタであり、HSXLEN=32の場合のビットフォーマットを図5.18に、HSXLEN=64の場合のビットフォーマットを図5.19に示す。このレジスタは…

ELFファイルを取り扱うためのlibelfライブラリ調査

現在自作CPUのELFファイルロードにはlibbfdを使用しているが、このライブラリにはいくつか問題があるように思えている。 まず、環境によって必要な関数の引数が異なること。bfd_section_size()関数の引数が環境で異なるので困っている。 uintptr_t sz = (uin…

RISC-V ハイパーバイザー拡張の勉強 (hcounteren, htimedelta, htimedeltah, htval, htinst)

5.2.5 ハイパーバイザーカウンタ許可レジスタ (hcounteren) カウンタ許可レジスタhcounterenはゲスト仮想マシン向けのハードウェアパフォーマンスモニタリングカウンタの利用可能状態を制御するための32ビットレジスタである。 図5.13:ハイパーバイザーカウ…

独自RISC-V CPUコアの実装 (DPI-CによるELFファイルロード環境の作成)

前回自作CPUのVivado Simulatorによるシミュレーション環境が立ち上がったので、次はRAMのインスタンスとELFファイルのロードのためのDPI-Cの環境を構築したい。 Vivado SimulatorもDPI-Cをサポートしているので、Verilatorの時と同様にDPI-Cを使用してELFフ…

RISC-V ハイパーバイザー拡張の勉強 (3. hedeleg / hideleg / hvip / hip / hieレジスタ)

5.2.2 ハイパーバイザーTrap移譲レジスタ (hedeleg / hideleg) hedelegとhidelegはHSXLENビットの読み書き可能なレジスタで、図5.3と図5.4にそれぞれレジスタのフォーマットを示す。デフォルトでは、すべての特権レベルのすべてのトラップはM-Modeで処理され…

独自RISC-V CPUコアの実装 (Vivado Simulatorによるシミュレーション環境構築)

自作RISC-V CPUを何となく趣味でやっているが、Verilatorによるシミュレーションがちょっときつくなってきた。Verilator自体が高性能高機能高速シミュレータであることは間違いないのだけれども、やはり2値しか扱っていないのがつらい。 Verilator以外のシミ…

RISC-V ハイパーバイザー拡張の勉強 (2. hstatusレジスタ)

RISC-Vのハイパーバイザーの勉強、次はCSRレジスタ。最も中心となるhstatusレジスタから。 5.2.1 Hypervisor Status Register (hstatus) hstatusレジスタはHSXLENビットの読み書き可能なレジスタである。HSXLEN=32の場合のフォーマットを図5.1に、HSXLEN=64…

RISC-V ハイパーバイザー拡張の勉強 (1. ハイパーバイザー特権モード)

ふと思い立ってRISC-Vのハイパーバイザー拡張について勉強することにした。仕様書にはV0.6.1が記載されているので、riscv-privileged-20201106を参考に原文を翻訳しながら勉強していくことにする。 第5章:ハイパーバイザー拡張, Version 0.6.1 注意!このド…

RISC-V勉強会の発表資料(英語版)がRISC-V Internationalで紹介されました

https://riscv.org/blog/2021/02/hardware-description-language-chisel-diplomacy-deeper-dive/ 昨年末に開催されたRISC-V勉強会@Onlineで発表した私の発表資料 「Chisel & Diplomacy Deep Dive」について、RISC-V International本家に転載をしていただきま…

独自RISC-V CPUコアの実装 (リネームの続き)

リネームの続きだが、例えば5つの命令が同時に発行されたとして以下のような依存関係があるとき、 addi x10, x0, 1 addi x11, x10, 2 addi x12, x11, 3 addi x13, x12, 4 addi x14, x13, 5 それぞれの命令は整数レジスタで依存関係を持っている。この場合リ…

独自RISC-V CPUコアの実装 (リネーム)

独自CPUコアをRISC-Vで実装している。リネームの部分について、とりあえず形だけFreelist, RenameMapだけを作った。Freelistは新しいリネームIDを取得するためのキューみたいなもの、リネームマップは現在のアーキテクチャレジスタ番号がどのリネームIDに割…

Chiselの記述されたSweRV-EL2コアQuasarを試す (Coremark測定)

https://riscv.org/wp-content/uploads/2019/12/12.11-14.20a3-Bandic-WD_SweRV_Cores_Roadmap_v4SCR.pdf より抜粋 Chiselで記述されたSweRV-EL2コアQuasarを見ているが、一応Hello World以外にCoremarkを流すこともできるようだ。 $ make TEST=cmark GCC_PR…

Chiselの記述されたSweRV-EL2コアQuasarを試す

https://riscv.org/wp-content/uploads/2019/12/12.11-14.20a3-Bandic-WD_SweRV_Cores_Roadmap_v4SCR.pdf より抜粋 本日メーリスでアナウンスがあった、Chiselで記述されたSweRV-EL2コア実装Quasarを少し試してみることにした。 SweRV-EL2はWestern Digital…

Verilatorを使って独自CPUコア環境にELFをロードする

一応、前回までで、コアとRAMが用意できたので、次にコア実行前にRAMにELFファイルのデータを流し込むための仕組みを作る。これについてはSiFiveのDTMの仕組みをそのまま使用しようと思う。DTMはDebug Transport Module(だったかな?)で、外部からデータを…

Verilatorを使って独自CPUコアのシミュレーション環境を構築

久しぶりに自作RISC-Vコアのメンテナンスを行おうと思っているが、個人が使用できるSystemVerilogのシミュレーション環境ってどれも中途半端で困っている。VCSやXceliumは使えないし、VerilatorはC++による独自のドライブが必要、おそらくSystemVerilogを個…

Espressoを使ってSystem Verilogの Decoder Wrapperを作ってみる (2)

Espressoを用いたデコードラッパを作っているが、もう少し便利にしたい。制御信号の生成については、TrueかFalseしか指定することができなかった。 "inst_ctrl":["RD_R3", "OP_SIGN_ADD", "IMM_U"] しかし、この制御信号の意味は実際にはRD制御信号がR3であ…