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; }
とにかく、何かしらのイベントを待つ必要があるということだ。