From 16c28214ac4f8649ad20d8a78d62adc4a040f786 Mon Sep 17 00:00:00 2001 From: ruki Date: Sun, 5 May 2024 21:15:34 +0800 Subject: [PATCH] add static library support for verialtor #5060 --- .../embed/verilator/static/src/main.v | 6 ++++ .../embed/verilator/static/src/sim_main.cpp | 12 ++++++++ .../projects/embed/verilator/static/xmake.lua | 9 ++++++ xmake/rules/verilator/verilator.lua | 10 +++---- xmake/rules/verilator/xmake.lua | 28 +++++++++++++++++++ 5 files changed, 60 insertions(+), 5 deletions(-) create mode 100644 tests/projects/embed/verilator/static/src/main.v create mode 100644 tests/projects/embed/verilator/static/src/sim_main.cpp create mode 100644 tests/projects/embed/verilator/static/xmake.lua diff --git a/tests/projects/embed/verilator/static/src/main.v b/tests/projects/embed/verilator/static/src/main.v new file mode 100644 index 00000000000..b7f80008d79 --- /dev/null +++ b/tests/projects/embed/verilator/static/src/main.v @@ -0,0 +1,6 @@ +module hello; + initial begin + $display("hello world!"); + $finish ; + end +endmodule diff --git a/tests/projects/embed/verilator/static/src/sim_main.cpp b/tests/projects/embed/verilator/static/src/sim_main.cpp new file mode 100644 index 00000000000..44cb1da1f5a --- /dev/null +++ b/tests/projects/embed/verilator/static/src/sim_main.cpp @@ -0,0 +1,12 @@ +#include "hello.h" +#include "verilated.h" + +int main(int argc, char** argv) { + VerilatedContext* contextp = new VerilatedContext; + contextp->commandArgs(argc, argv); + hello* top = new hello{contextp}; + while (!contextp->gotFinish()) { top->eval(); } + delete top; + delete contextp; + return 0; +} diff --git a/tests/projects/embed/verilator/static/xmake.lua b/tests/projects/embed/verilator/static/xmake.lua new file mode 100644 index 00000000000..e01bf473870 --- /dev/null +++ b/tests/projects/embed/verilator/static/xmake.lua @@ -0,0 +1,9 @@ +add_requires("verilator") +target("hello") + add_rules("verilator.static") + set_toolchains("@verilator") + add_files("src/*.v") + +target("test") + add_deps("hello") + add_files("src/*.cpp") diff --git a/xmake/rules/verilator/verilator.lua b/xmake/rules/verilator/verilator.lua index 32119166654..6b7267861f7 100644 --- a/xmake/rules/verilator/verilator.lua +++ b/xmake/rules/verilator/verilator.lua @@ -174,9 +174,9 @@ endmodule]]) if not os.isfile(autogendir) then os.mkdir(autogendir) end - target:add("includedirs", autogendir) - target:add("includedirs", path.join(verilator_root, "include")) - target:add("includedirs", path.join(verilator_root, "include", "vltstd")) + target:add("includedirs", autogendir, {public = true}) + target:add("includedirs", path.join(verilator_root, "include"), {public = true}) + target:add("includedirs", path.join(verilator_root, "include", "vltstd"), {public = true}) -- set languages local languages = target:get("languages") @@ -188,12 +188,12 @@ endmodule]]) end end if not cxxlang then - target:add("languages", "c++20") + target:add("languages", "c++20", {public = true}) end -- add definitions for switches for k, v in table.orderpairs(switches) do - target:add("defines", "VM_" .. k .. "=" .. v) + target:add("defines", "VM_" .. k .. "=" .. v, {public = true}) end -- add syslinks diff --git a/xmake/rules/verilator/xmake.lua b/xmake/rules/verilator/xmake.lua index 4272ed91f9e..76d21309684 100644 --- a/xmake/rules/verilator/xmake.lua +++ b/xmake/rules/verilator/xmake.lua @@ -20,6 +20,7 @@ -- @see https://github.com/xmake-io/xmake/issues/3257 rule("verilator.binary") + add_deps("c++") set_extensions(".v", ".sv") on_load(function (target) target:set("kind", "binary") @@ -45,3 +46,30 @@ rule("verilator.binary") import("verilator").buildcmd_cppfiles(target, batchcmds, sourcebatch, opt) end) +rule("verilator.static") + add_deps("c++") + set_extensions(".v", ".sv") + on_load(function (target) + target:set("kind", "static") + end) + + on_config(function (target) + import("verilator").config(target) + end) + + before_build_files(function (target, sourcebatch) + -- Just to avoid before_buildcmd_files being executed at build time + end) + + on_build_files(function (target, batchjobs, sourcebatch, opt) + import("verilator").build_cppfiles(target, batchjobs, sourcebatch, opt) + end, {batch = true, distcc = true}) + + before_buildcmd_files(function(target, batchcmds, sourcebatch, opt) + import("verilator").buildcmd_vfiles(target, batchcmds, sourcebatch, opt) + end) + + on_buildcmd_files(function (target, batchcmds, sourcebatch, opt) + import("verilator").buildcmd_cppfiles(target, batchcmds, sourcebatch, opt) + end) +