2021-02-01から1ヶ月間の記事一覧
仮想化モードが設定されている場合、RISC-Vのアドレス変換は2ステージを踏むことになっている。 VSレベルアドレス変換:仮想アドレス → ゲスト物理アドレス Gレベルアドレス変換:ゲスト物理アドレス → スーパーバイザー物理アドレス まずはVSレベルアドレス…
Compressed命令ではない標準的なロード命令で、LB,LBU,LH, LHU, LW, LWU, LD, FLW, FLD, FLQの内一つに例外が発生した場合の変換された命令のフォーマットを図5.42に示す。 Compressedではない標準的なストア命令で、SB, SH, SW, SD, FSW, FSD, FSQのうち一…
5.6 例外 5.6.1 例外要因コード ハイパーバイザー拡張では、例外要因のエンコーディングについて決められている。表5.5はハイパーバイザーが実装された場合でのM-ModeおよびHS-Modeでの例外要因コードを示している。VSレベル例外(割り込み要因コード2,6,10)…
5.5.2 ゲストページフォルト ゲストページフォルト例芸はmedeleg CSRの制御によりM-ModeからHS-Modeに移譲される可能性があるが、他の動作モードに移譲することはできない。ゲストページフォルトでは、mtvalもしくはstvalに通常通りゲスト仮想アドレスが書き…
これまで学んできたRISC-Vのハイパーバイザーについて、Spikeの実装を確認しながら後追いで復習する。 Hypervisorをサポートするメンバ変数V 現在仮想モードで動いているかどうかを示す仮想モードVを示すのに、メンバ変数vが定義されている。 riscv-isa-sim/…
5.5 2ステージアドレス変換 現在の仮想モードVが1であるときは常に2ステージアドレス変換と保護が有効である。すべての仮想メモリアクセスにおいて、オリジナルの仮想アドレスはvsatpレジスタにより制御されるVSレベルアドレス変換によって最初のステージで…
DPI-Cを用いてSpikeとVerilator上のCPUを接続する構成の検討、実装を進めていった。 まず、RTL側だが、コミットが発生した時点でその情報をDPI-Cを経由してSpikeを制御するC++のコードに伝えなければならない。適当に以下のようにした。 always_ff @ (negedg…
5.3.2 ハイパーバイザーメモリ管理フェンス命令 ハイパーバイザーメモリ管理フェンス命令、HFENCE.VVMAとHFENCE.GVMAはSFENCE.VMA(4.2.1節)と同様の動作をするが、HFENCE.VVMAはvsatp CSRによって制御されるVSレベルのメモリ管理データ構造に対して適用され…
5.3 ハイパーバイザー命令 ハイパーバイザー拡張では、仮想マシンのロード・ストア命令と2つの特権付きfence命令が追加される。 5.3.1 ハイパーバイザー仮想マシンロードストア命令 ハイパーバイザー仮想マシンロードストア命令は、M-Mode, HS-Modeもしくはh…
CPUコアの検証には多くの場合にはテストパタンを流して検証する方法が用いられるが、CPUの動作をチェックするために命令セットシミュレータ(Instruction Set Simulator: ISS)を使用して、RTLの動作と命令セットシミュレータの動作が一致するかを確認する手法…
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のシミュレーション環境を、VerilatorとVivado Simで立ち上げたが、やはりVerilatorが2値しか扱ってくれないのはデバッグがはかどらないし、そもそもGTKWaveが死ぬほど使いにくい。そしてVivado Simulatorでのシミュレーション環境を立ち上げ…
5.2.9 ハイパーバイザーゲストアドレス変換および保護レジスタ (hgatp) htatapレジスタはHSXLENビットの読み書き可能なレジスタであり、HSXLEN=32の場合のビットフォーマットを図5.18に、HSXLEN=64の場合のビットフォーマットを図5.19に示す。このレジスタは…
現在自作CPUのELFファイルロードにはlibbfdを使用しているが、このライブラリにはいくつか問題があるように思えている。 まず、環境によって必要な関数の引数が異なること。bfd_section_size()関数の引数が環境で異なるので困っている。 uintptr_t sz = (uin…
5.2.5 ハイパーバイザーカウンタ許可レジスタ (hcounteren) カウンタ許可レジスタhcounterenはゲスト仮想マシン向けのハードウェアパフォーマンスモニタリングカウンタの利用可能状態を制御するための32ビットレジスタである。 図5.13:ハイパーバイザーカウ…
前回自作CPUのVivado Simulatorによるシミュレーション環境が立ち上がったので、次はRAMのインスタンスとELFファイルのロードのためのDPI-Cの環境を構築したい。 Vivado SimulatorもDPI-Cをサポートしているので、Verilatorの時と同様にDPI-Cを使用してELFフ…
5.2.2 ハイパーバイザーTrap移譲レジスタ (hedeleg / hideleg) hedelegとhidelegはHSXLENビットの読み書き可能なレジスタで、図5.3と図5.4にそれぞれレジスタのフォーマットを示す。デフォルトでは、すべての特権レベルのすべてのトラップはM-Modeで処理され…
自作RISC-V CPUを何となく趣味でやっているが、Verilatorによるシミュレーションがちょっときつくなってきた。Verilator自体が高性能高機能高速シミュレータであることは間違いないのだけれども、やはり2値しか扱っていないのがつらい。 Verilator以外のシミ…
RISC-Vのハイパーバイザーの勉強、次はCSRレジスタ。最も中心となるhstatusレジスタから。 5.2.1 Hypervisor Status Register (hstatus) hstatusレジスタはHSXLENビットの読み書き可能なレジスタである。HSXLEN=32の場合のフォーマットを図5.1に、HSXLEN=64…
ふと思い立ってRISC-Vのハイパーバイザー拡張について勉強することにした。仕様書にはV0.6.1が記載されているので、riscv-privileged-20201106を参考に原文を翻訳しながら勉強していくことにする。 第5章:ハイパーバイザー拡張, Version 0.6.1 注意!このド…
https://riscv.org/blog/2021/02/hardware-description-language-chisel-diplomacy-deeper-dive/ 昨年末に開催されたRISC-V勉強会@Onlineで発表した私の発表資料 「Chisel & Diplomacy Deep Dive」について、RISC-V International本家に転載をしていただきま…
リネームの続きだが、例えば5つの命令が同時に発行されたとして以下のような依存関係があるとき、 addi x10, x0, 1 addi x11, x10, 2 addi x12, x11, 3 addi x13, x12, 4 addi x14, x13, 5 それぞれの命令は整数レジスタで依存関係を持っている。この場合リ…
独自CPUコアをRISC-Vで実装している。リネームの部分について、とりあえず形だけFreelist, RenameMapだけを作った。Freelistは新しいリネームIDを取得するためのキューみたいなもの、リネームマップは現在のアーキテクチャレジスタ番号がどのリネームIDに割…
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…
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…
一応、前回までで、コアとRAMが用意できたので、次にコア実行前にRAMにELFファイルのデータを流し込むための仕組みを作る。これについてはSiFiveのDTMの仕組みをそのまま使用しようと思う。DTMはDebug Transport Module(だったかな?)で、外部からデータを…
久しぶりに自作RISC-Vコアのメンテナンスを行おうと思っているが、個人が使用できるSystemVerilogのシミュレーション環境ってどれも中途半端で困っている。VCSやXceliumは使えないし、VerilatorはC++による独自のドライブが必要、おそらくSystemVerilogを個…
Espressoを用いたデコードラッパを作っているが、もう少し便利にしたい。制御信号の生成については、TrueかFalseしか指定することができなかった。 "inst_ctrl":["RD_R3", "OP_SIGN_ADD", "IMM_U"] しかし、この制御信号の意味は実際にはRD制御信号がR3であ…