FPGA開発日記

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

RISC-VのISSを修正してテストパタンが通るように調整

RISC-VのISSのメンテナンスを継続している。前回から殆ど調整していなかったが、RISC-VのテストパタンをパスできるようにISSを調整していこう。

github.com

github.com

ISSの実装を進めていった結果、Failになっているパタンは以下となった。

The following tests FAILED:
          1 - rv32mi-p-csr (Failed)
          3 - rv32mi-p-ma_addr (Failed)
          4 - rv32mi-p-ma_fetch (Failed)
          6 - rv32mi-p-sbreak (Failed)
          7 - rv32mi-p-scall (Failed)
          8 - rv32mi-p-timer (Failed)
          9 - rv32si-p-csr (Failed)
         11 - rv32si-p-ma_addr (Failed)
         12 - rv32si-p-ma_fetch (Failed)
         13 - rv32si-p-sbreak (Failed)
         15 - rv32si-p-shamt (Failed)
         47 - rv32ui-pm-lrsc (Failed)
        125 - rv64mi-p-csr (Failed)
        126 - rv64mi-p-dirty (Failed)
        128 - rv64mi-p-ma_addr (Failed)
        129 - rv64mi-p-ma_fetch (Failed)
        130 - rv64mi-p-mcsr (Failed)
        132 - rv64mi-p-sbreak (Failed)
        133 - rv64mi-p-scall (Failed)
        134 - rv64mi-p-timer (Failed)
        136 - rv64si-p-csr (Failed)
        138 - rv64si-p-ma_addr (Failed)
        139 - rv64si-p-ma_fetch (Failed)
        140 - rv64si-p-sbreak (Failed)
        230 - rv64ui-pm-lrsc (Failed)
        233 - rv64ui-p-mulhsu (Failed)
        315 - rv64ui-pt-mulhsu (Failed)
        401 - rv64ui-v-mulhsu (Failed)

システムレジスタアクセス系のパタンが残ってきた。mulhsuは、可変長演算系のライブラリを利用しているが、それでもちゃんと実装できていないところがあり残ってしまっている。

1. ミスアラインの対応

RISC-Vでは、ミスアラインが発生すると例外が以下のように発生する。ExceptionCodeは、命令フェッチだと0、ロードだと4、ストアだと6に設定されている。

f:id:msyksphinz:20160213210113p:plain

    if (except != MemNoExcept) {
        m_env->GenerateException (Except_StoreAddrMisalign);
        return;
    }

2. breakの対応

RISC-Vではebreak命令を発生させることによりデバッガに動作を以降させることができる。ebreak命令は、例外を発生させるだけで良い。

 void InstEnv::RISCV_INST_EBREAK (Word_t inst_hex)
 {
+    m_env->GenerateException (Except_Breakpoint);
+    return;
 }

これらの実装により、RISC-Vのテストパタンの結果はだいぶPassが増えてきた。

github.com

The following tests FAILED:
          1 - rv32mi-p-csr (Failed)
          7 - rv32mi-p-scall (Failed)
          8 - rv32mi-p-timer (Failed)
          9 - rv32si-p-csr (Failed)
         15 - rv32si-p-shamt (Failed)
         47 - rv32ui-pm-lrsc (Failed)
        125 - rv64mi-p-csr (Failed)
        126 - rv64mi-p-dirty (Failed)
        130 - rv64mi-p-mcsr (Failed)
        133 - rv64mi-p-scall (Failed)
        134 - rv64mi-p-timer (Failed)
        136 - rv64si-p-csr (Failed)
        230 - rv64ui-pm-lrsc (Failed)
        233 - rv64ui-p-mulhsu (Failed)
        315 - rv64ui-pt-mulhsu (Failed)
        401 - rv64ui-v-mulhsu (Failed)

もう少しだ!