以下の内容はhttps://vengineer.hatenablog.com/entry/2025/11/07/080000より取得しました。


Google Coral Open NPU のテストベンチ環境

はじめに

Coral Open NPU のテストベンチは、下記にあります。

github.com

今回は、ここを覗いてみたいと思います。

テストベンチの内容

  • cocotb
  • renode
  • systemc
  • uvm
  • vcs_sim
  • verilator_sim

それぞれ、色々な役割があるんだと思いますが、いっぱいありますね。

どれも Makefile ではなく、BUILD を使っているようです。

cocotb

Python ベースのテストベンチ環境である cocotb ですね。

  • riscv-dv
  • riscv-tests

のためのようですね。

renode

renode ですね。

SoftwareとのCo-Simulationみたいなものです。

Simulator としては、Verilatorを使っています。

uvm

uvm を使って、NPU IP の検証をしています

UVMなので、vcs でシミュレーションしているようです。

Xilinx の xsim でもできますかね。

vcs_sim

Synopsys社の VCS を使ったシミュレーション環境ですね。

  • top.h/top.cc : SystemC の sc_top モジュールですね
  • main.cc : SystemC の sc_main

ということは、トップ階層が SystemC 。なんでだろうか?

ソースコードを覗いてみたら、axi2tlm_bridge なるものがあるので、これを使いたいんだね。

int sc_main(int argc, char** argv) {
  sc_top top("top");
  sc_clock clock("clock", 100, SC_NS);

  Xbar xbar("xbar");
  tlm2axi_bridge<KP_axi2AddrBits, KP_lsuDataBits, KP_axi2IdBits, 8, 1, 0, 0, 0,
                 0, 0>
      tlm2axi_bridge("tlm2axi_bridge");
  axi2tlm_bridge<KP_axi2AddrBits, KP_lsuDataBits, KP_axi2IdBits, 8, 1, 0, 0, 0,
                 0, 0>
      axi2tlm_bridge("axi2tlm_bridge");

  typedef AXIProtocolChecker<KP_axi2AddrBits, KP_lsuDataBits, KP_axi2IdBits, 8,
                             1, 0, 0, 0, 0, 0>
      CoreMiniAxiProtocolChecker;
  CoreMiniAxiProtocolChecker tlm2axi_checker("tlm2axi_checker");
  CoreMiniAxiProtocolChecker axi2tlm_checker("axi2tlm_checker");
  typedef AXISignals<KP_axi2AddrBits,  // ADDR_WIDTH
                     KP_lsuDataBits,   // DATA_WIDTH
                     KP_axi2IdBits,    // ID_WIDTH
                     8,                // AxLEN_WIDTH
                     1,                // AxLOCK_WIDTH
                     0, 0, 0, 0, 0     // User
                     >
      CoreMiniAxiSignals;

systemc

SystemC ですね。

命令の部分の検証ですかね。

verilator_sim

vcs が SystemC なら、verilator_sim も SystemC じゃん。

  • sysc_module.h : SystemC ですね
struct Sysc_module : sc_module {
  sc_in_clk clock;
  sc_in<bool> reset;

  virtual void eval() = 0;

  SC_CTOR(Sysc_module) {
    SC_METHOD(eval);
    sensitive << reset << clock.pos();
  }
};

では、sc_main は、どこ?

coralnpu の下の

  • core_mini_axi_non_incr_tests.cc
  • valuint_tb.cc
  • l1icache_tb.cc
  • core_tb.cc
  • regfile_tb.cc
  • core_mini_axi_sim.cc
  • valu_tb.cc
  • vdecode_tb.cc
  • vldst_tb.cc
  • vst_tb.cc
  • vregfilesegment_tb.cc
  • l1dcache_tb.cc
  • vcmdq_tb.cc
  • vdecodeinstruction_tb.cc
  • vconvctrl_tb.cc
  • dbus2axi_tb.cc
  • vconvalu_tb.cc

matcha の下の

  • coralnpu_tb.cc

chai の下の

おわりに

SystemCをいっぱい使っていますね。

ということは、

vengineer.hatenablog.com

が役に立ちそうですね。




以上の内容はhttps://vengineer.hatenablog.com/entry/2025/11/07/080000より取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14