FPGA開発日記

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

独自RISC-V CPUコアの実装 (VerilatorのFST出力の切り替えオプション実装)

自作RISC-Vコアを作り始めてしばらく経っているが、リグレッションテストのときは波形の取得を行わないように変更したい。 デフォルトでは波形を出力する様になっているのだがこれをオプションで変更しよう。

まずはVerilatorのC++実装に-dオプションを追加して、波形の取得のためのdump_fst_enable変数を有効にする。

  while (1) {
    static struct option long_options[] = {
      {"elf",  no_argument, 0, 'e' },
      {"dump", no_argument, 0, 'd' },
      {"help", no_argument, 0, 'h' }
    };

    int option_index = 0;
    int c = getopt_long(argc, argv, "-e:h:d", long_options, &option_index);

    if (c == -1) break;
 retry:
    switch (c) {
      // Process long and short EMULATOR options
      case 'h': usage(argv[0]);             return 1;
      case 'd':
        dump_fst_enable = true;
        break;
      case 'e': {
        g_memory   = std::unique_ptr<Memory> (new Memory ());

        filename = (char*)malloc(strlen(optarg) + 1);
        strcpy(filename, optarg);
        load_binary("", optarg, true);

        break;
      }
    }
  }

-dオプションを有効にしているときは、FSTの出力を有効にする。

  // Trace DUMP ON
  VerilatedFstC* tfp = NULL;
  if (dump_fst_enable) {
    Verilated::traceEverOn(true);
    tfp = new VerilatedFstC;

    dut->trace(tfp, 100);  // Trace 100 levels of hierarchy
    tfp->open("simx.fst");

さらに、dump_fst_enableが有効の時はfstのダンプを出力する様にしている。

  while (time_counter < 100) {
    dut->eval();
    if (dump_fst_enable) tfp->dump(time_counter);
    time_counter++;
  }

これでVerilatorの-dオプションでFSTの出力を制御できるようになった。