FPGA開発日記

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

RISC-VのPLICのためのテストケースを作って、Spikeとの一致検証環境を構築する

msyksphinz.hatenablog.com

msyksphinz.hatenablog.com

msyksphinz.hatenablog.com

前回までで、Spikeを解析した結果PLICのメモリマップを確保する必要があること、そして、PLICの簡単なデバイスを作成してSpikeに登録してやる必要があることが分かった。

というわけで簡単に実装した。

// See LICENSE for license details.
#ifndef _RISCV_SIMPLEPLIC_H
#define _RISCV_SIMPLEPLIC_H

#include <riscv/mmio_plugin.h>

#include "abstract_device.h"
#include "mmu.h"

class simpleplic_t : public abstract_device_t {
 public:
  simpleplic_t(std::string name);
  bool load(reg_t addr, size_t len, uint8_t* bytes);
  bool store(reg_t addr, size_t len, const uint8_t* bytes);
 private:
};

/* ... 途中省略 ... */
#endif // _RISCV_SIMPLEPLIC_H

そして作成したデバイスライブラリをSpikeに登録する。

#ifndef SIM_MAIN
  argv[arg_max++] = "--extlib=../../../spike_dpi/libsimple_plic.so";
#else // SIM_MAIN
  argv[arg_max++] = "--extlib=./libsimple_plic.so";
#endif // SIM_MAIN
  argv[arg_max++] = "--device=simpleplic,201326592,plic";   // 201326592 = 0x0c00_0000

これにより、PLIC領域にアクセスするとちゃんと認識されるようになる。

argv[19] = (null)
serialdevice: uart loaded
simpleplic: plic loaded
simple PLIC_t::store called : addr = 0
simple PLIC_t::load called : addr = 8
simple PLIC_t::load called : addr = 0
simple PLIC_t::load called : addr = 0
simple PLIC_t::store called : addr = 4
simple PLIC_t::load called : addr = 4
simple PLIC_t::store called : addr = 8
simple PLIC_t::load called : addr = 10
simple PLIC_t::load called : addr = 8
simple PLIC_t::load called : addr = 8
simple PLIC_t::store called : addr = c
simple PLIC_t::load called : addr = c
simple PLIC_t::store called : addr = 10
simple PLIC_t::load called : addr = 18
simple PLIC_t::load called : addr = 10
simple PLIC_t::load called : addr = 10
simple PLIC_t::store called : addr = 14
simple PLIC_t::load called : addr = 14
simple PLIC_t::store called : addr = 18
simple PLIC_t::load called : addr = 20
simple PLIC_t::load called : addr = 18
simple PLIC_t::load called : addr = 18
simple PLIC_t::store called : addr = 1c
simple PLIC_t::load called : addr = 1c
simple PLIC_t::store called : addr = 1000
simple PLIC_t::load called : addr = 1008
simple PLIC_t::load called : addr = 1000
      1000 :        422 : IPC(recent) = 0.42, IPC(total) = 0.42
simple PLIC_t::load called : addr = 1000
      2000 :        439 : IPC(recent) = 0.02, IPC(total) = 0.22
      3000 :        439 : IPC(recent) = 0.00, IPC(total) = 0.15

問題はそのあとだな。デッドロックしているので要解析だ。