FPGA開発日記

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

riscv-vector-testsを試す

GitHubで発見したRISC-Vのベクトル命令テストケースを試してみることにした。 結構こいつはきちんと基本的なテストケースを作ってくれるっぽい。

github.com

git clone https://github.com/ksco/riscv-vector-tests.git

基本的には上記ディレクトリでmakeを叩くだけでいいのだが、riscv-vector向けのgccとSpikeが用意されている必要がある。 また、今使っているSpikeとの実装の互換性があっていなかったようなので、ちょっと改造することにした。 (実際には、自分の使っているSpikeのバージョンが古かったようで、最新のSpikeにアップグレードすればこの改造は不要っぽい)。

diff --git a/pspike/pspike.cc b/pspike/pspike.cc
index c9bffd2..b3aef2f 100644
--- a/pspike/pspike.cc
+++ b/pspike/pspike.cc
@@ -7,9 +7,9 @@
 
 // Copied from spike main.
 // TODO: This should really be provided in libriscv
-static std::vector<std::pair<reg_t, abstract_mem_t*>> make_mems(const std::vector<mem_cfg_t> &layout)
+static std::vector<std::pair<reg_t, mem_t*>> make_mems(const std::vector<mem_cfg_t> &layout)
 {
-  std::vector<std::pair<reg_t, abstract_mem_t*>> mems;
+  std::vector<std::pair<reg_t, mem_t*>> mems;
   mems.reserve(layout.size());
   for (const auto &cfg : layout) {
     mems.push_back(std::make_pair(cfg.get_base(), new mem_t(cfg.get_size())));
@@ -85,8 +85,8 @@ int main(int argc, char** argv) {
     .support_haltgroups = true,
     .support_impebreak = true
   };
-  std::vector<std::pair<reg_t, abstract_mem_t*>> mems = make_mems(cfg.mem_layout());
-  std::vector<const device_factory_t*> plugin_devices;
+  std::vector<std::pair<reg_t, mem_t*>> mems = make_mems(cfg.mem_layout());
+  std::vector<std::pair<reg_t, abstract_device_t*>> plugin_devices;
   sim_t sim(&cfg, false,
             mems,
             plugin_devices,

makeで生成すると、いろんなテストパタンが生成されていることを確認した。

  • out/v256x64machine/bin/stage2/vadd.vv-0 を objdumpした結果
    8000019a:   52fd                    li      t0,-1
    8000019c:   0c02f357                vsetvli t1,t0,e8,m1,ta,ma
    800001a0:   02050187                vle8.v  v3,(a0)
    800001a4:   4281                    li      t0,0
    800001a6:   0c52f357                vsetvli t1,t0,e8,mf8,ta,ma
    800001aa:   023100d7                vadd.vv v1,v3,v2
    800001ae:   00020517                auipc   a0,0x20
    800001b2:   e5250513                addi    a0,a0,-430 # 80020000 <begin_signature>
    800001b6:   52fd                    li      t0,-1
    800001b8:   0c02f357                vsetvli t1,t0,e8,m1,ta,ma
    800001bc:   020500a7                vse8.v  v1,(a0)

こいつは基本的なテストパタンとしてかなり使えそうな気がする。