FPGA開発日記

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

RISC-Vのトレースフォーマット仕様書が公開されたので読んでみる(3. Hartのエンコーダインタフェース)

RISC-V トレースフォーマットの勉強。続き。

github.com

github.com

1章ずつ、翻訳ではなく日本語でサマライズしていく形式で進めていく。

3. Hartのエンコーダインタフェース

3.1 インタフェースの要求

以下の情報がインタフェースとして転送されればよい。

  • いくつの命令がリタイアしたか。
  • 例外もしくは割込みが発生したか。もしそうであれば例外要因は何か(ucause/scause/mcause CSR)、トラップの値は何か(utval/stval/mtval CSR)。
  • 現在のRISC-V HartのPrivilege Level
  • リタイアした命令のinstruction_type
    • 予測できないジャンプ命令のターゲット
    • TakenもしくはNonTaken分岐
    • 例外もしくは割込みからの復帰(*ret命令)
  • 命令アドレス
    • ソースコードから予測できないジャンプ命令のターゲット
    • ターゲットが予測できないジャンプの皇族の命令
    • Taken/NonTaken分岐
    • 例外もしくは割込みが発生する直前の命令
    • 例外もしくは割込みが発生した後の最初の命令
    • Privilegeが変更される直前の命令
    • Privilegeが変更された直後の命令

3.1.1 ジャンプの分類とターゲットの推論

ジャンプ命令は「推測できる」ジャンプと「推測できない」ジャンプに分類される。もし命令内にジャンプターゲットが定数として埋め込まれているならば、そのジャンプは「推測できる」ジャンプに分類される。それ以外は「推測できない」ジャンプとなる。

しかし、推論できないジャンプの中でも、いくつかの命令については推論できるものがある。これらについては「推論できる」ジャンプとする。この条件は:

  • luiもしくはc.lui命令でターゲットアドレスを生成するジャンプ命令
  • auipcでターゲットアドレスを生成するジャンプ命令

これらのジャンプ命令は「シーケンシャルに推論できる」ジャンプ命令として分類する。この命令分類についてのサポートはオプションである。

3.1.2 RISC-Vコアとエンコーダの関係

エンコーダの目的は、単一のHartで実行される命令をエンコードすることである。複数のコアが実装されている場合には以下のことを考慮する必要がある。

  • Hart毎にインタフェースをインスタンスする。各インスタンスは異なるエンコーダに接続され、すべてのHartが同時にトレースを取得できるようにする必要がある。一方で、外部出力はそれぞれのエンコーダについてMuxを行い単一のHartをトレースできるようにする。
  • コアに対して1つのインタフェースを実装し、コアの内部でMuxを実装してどのHartをインタフェースに接続するかを決める。

3.2 命令インタフェース

このセクションではRISC-VのHartとトレースエンコーダとのインタフェースについて説明する。信号は、以下ので説明するグループのどれか1つに所属する。

  • M: Mandatory(不可欠)。インタフェースはこの信号を必ず含まなければならない。
  • O: Optional(オプション)。インタフェースはこの信号を含んでも良い。
  • MR: Mandatory, may be replicated。Hartはサイクル当たり最大でN個のTakenな分岐命令をリタイアさせることができる場合、インタフェースはこの信号をN個含まなければならない。
  • OR: Optional, may be replicated。Hartはサイクル当たり最大でN個のTakenな分岐命令をリタイアさせることができる場合、インタフェースはこの信号をN個含んでも良い。
  • BR: Block, may be replicated。ブロック中で複数の命令を同時にリタイアさせることができるHartについては不可欠である。OR毎に複製される。これを除去する場合、インタフェースはその代わりにSRを追加しなければならない。
  • SR: Single, may be replicated。ブロック中で1命令のみをリタイアすることのできるHartについては不可欠である。OR毎に複製される。これを除去する場合、インタフェースはその代わりにBRを追加しなければならない。

命令インタフェース信号

  • itype[itype_width_p-1:0] : MR

    • 命令のタイプを示す。命令ブロックの終了タイプを示す。
      1. ブロックの最後の命令はitypeコードにデコードされない。
      2. 例外。ブロックの最後の命令で例外が発生し、トラップにジャンプしている。
      3. 割り込み。ブロックの最後の命令で割込みが挿入されている。
      4. 例外・命令から戻ってくる。
      5. NonTaken分岐
      6. Taken分岐
      7. itype_width_pが3であるときの推論できないジャンプ。そうでない場合は予約。
      8. 予約
      9. 推論できない関数呼び出し
      10. 推論できる関数呼び出し
      11. 推論できないテールコール
      12. 推論できるテールコール
      13. コルーチンスワップ
      14. 関数から戻る
      15. 他の推論できないジャンプ
      16. 他の推論できるジャンプ
  • cause[ecause_width_p-1:0] : M

    • 割り込み・例外要因。itype=1もしくは2以外では無視する。
  • tval[iaddress_width_p-1:0] : M

    • トラップに関連する値。itype=1もしくは2以外では無視する。
  • priv[privilege_width_p-1:0] : M

    • 当該サイクルで実行されるすべての命令のPrivilege Level
  • iaddr[iaddress_width_p-1:0] : MR

    • ブロック中の最初の命令アドレス。iretire=0ならば無視される。
  • context[context_width_p-1:0] : O

    • このサイクルでリタイアしたすべての命令のコンテキスト。
  • ctype[ctype_width_p-1:0] : O

    • コンテキストの動作をレポートする。
  • sijump : OR
    • もしこのブロックが推論不可能なジャンプで接続されて終了する場合、この信号を1に設定してシーケンシャルに推論可能であることを示す。
  • iretire[iretire_width_p-1:0] : BR
    • ブロック中でリタイアした命令のハーフワード数
  • ilastsize[ilastsize_width_p-1:0] : BR
    • 最後にリタイアした命令のサイズを2^\text{ilastsize}で示す。