FPGA開発日記

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

MIPS ISS実装中...

MIPSISSを実装し直している。今回は、RISC-VのISSと共有できる形で実装を考え直し、C++で書き直している。 MIPSISSの実装で問題になるのが、遅延スロットの問題である。私のISSの実装は、基本的に、

  1. 命令をシミュレートする。その際、レジスタの読み込みやメモリアクセスなどの情報をトレースログに書き込んでいく。
  2. トレースログからログを出力する。

遅延スロットは、命令を実行している最中に他の命令が実行されることに他ならない。例えば、beq命令の定義は以下だ。

I:    target_offset <-- sign_extend(offset || 0^2)
      condition <-- (GPR[rs] == GPR[rt])
I+1:  if condition then
         PC <-- PC + target_offset
      endif

このI+1のときに、遅延スロットの命令が実行されているという訳だ。従って、遅延スロットでPCを読み込んだり、PCを操作する命令の実行は禁止という訳だ。 従って、ISSの実装としては以下のようになり、

I:   BEQ命令の比較の実行
I+1: I+1命令の実行
     BEQ命令のPCの更新

となり、命令の実行とトレースの情報がIとI+1で混ざることになってしまう。これを回避するために、トレースログを2つに分け、遅延スロットのログを別に管理することで、ログが混ざらないようにしている。