FPGA開発日記

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

LiteXによるSoC環境構築を試行する (8. 環境構築をClangベースに置き換える)

https://raw.githubusercontent.com/enjoy-digital/litex/master/doc/litex.png

LiteXの続き。SoC環境のコンパイルにどうしても時間がかかるので、gccベースのコンパイル環境ではなく、Clangベースのコンパイル環境に置き換えたい。

いろいろ調査して、結果的にたどり着いたのはこれ。makeが2段階に分かれているので気が付くのに手間取った。最初のmakeではなく、次のmakeコンパイルオプションを変更する必要がある。

diff --git a/litex/build/sim/core/Makefile b/litex/build/sim/core/Makefile
index e662f27f..1d221fcf 100644
--- a/litex/build/sim/core/Makefile
+++ b/litex/build/sim/core/Makefile
@@ -11,6 +11,8 @@ else
        LDFLAGS += -lpthread -Wl,--no-as-needed -ljson-c -lz -lm -lstdc++ -Wl,--no-as-needed -ldl -levent
 endif

+TRACE_FST = 1
+
 CFLAGS += -Wall -$(OPT_LEVEL) $(if $(COVERAGE), -DVM_COVERAGE) $(if $(TRACE_FST), -DTRACE_FST)

 CC_SRCS ?= "--cc sim.v"
@@ -36,6 +38,7 @@ $(OBJS_SIM): %.o: $(SRC_DIR)/%.c | mkdir
 .PHONY: sim
 sim: $(OBJS_SIM) | mkdir
        verilator -Wno-fatal -O3 $(CC_SRCS) --top-module sim --exe \
+               --compiler clang \
                -DPRINTF_COND=0 \
                $(SRCS_SIM_CPP) $(OBJS_SIM) \
                --top-module sim \
@@ -44,18 +47,20 @@ sim: $(OBJS_SIM) | mkdir
                -LDFLAGS "$(LDFLAGS)" \
                --trace \
                $(if $(TRACE_FST), --trace-fst,) \
-               $(if $(COVERAGE), --coverage,) \
                --unroll-count 256 \
                --output-split 5000 \
-               --output-split-cfuncs 500 \
-               --output-split-ctrace 500 \
+               $(if $(COVERAGE), --coverage,) \
                $(INC_DIR) \
                -Wno-BLKANDNBLK \
                -Wno-WIDTH \
                -Wno-COMBDLY \
                -Wno-CASEINCOMPLETE \
                --relative-includes
-       make -j$(JOBS) -C $(OBJ_DIR) -f Vsim.mk Vsim
+       make -j16 -C $(OBJ_DIR) -f Vsim.mk OBJCACHE=ccache CXX=clang++ LINK=clang++ Vsim

これでコンパイル速度がかなり早くなった気がする。

次に、シミュレーションがどうしても動かない問題だが、まずはsim.cを調査する必要があった。 sim.cはイベントでーすでの実装となっている。libeventについて調査する必要があった。

  • ./litex/litex/build/sim/core/sim.c
int main(int argc, char *argv[])
{
  void *vsim=NULL;
  struct timeval tv;

  int ret;

#ifdef _WIN32
  WSADATA wsa_data;
  WSAStartup(0x0201, &wsa_data);
#endif


  base = event_base_new();
  if(!base)
  {
    eprintf("Can't allocate base\n");
    ret=RC_ERROR;
    goto out;
  }

  litex_sim_init_cmdargs(argc, argv);
  if(RC_OK != (ret = litex_sim_initialize_all(&vsim, base)))
  {
    goto out;
  }

  if(RC_OK != (ret = litex_sim_sort_session()))
  {
    goto out;
  }

  tv.tv_sec = 0;
  tv.tv_usec = 0;
  ev = event_new(base, -1, EV_PERSIST, cb, vsim);
  event_add(ev, &tv);
  event_base_dispatch(base);
#if VM_COVERAGE
  litex_sim_coverage_dump();
#endif
out:
  return ret;
}

とにかく、何かしらのイベントを待つ必要があるということだ。

libevent.org