summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorruki <[email protected]>2024-05-05 21:20:01 +0800
committerruki <[email protected]>2024-05-05 21:21:16 +0800
commitba1f9f4eaa90aa786a714f8f8da6f0e95a6a6327 (patch)
tree7f77b353f03a8a6ffca7fc389af9d645a8562bc6
parent382b22c3d6ec529bf085aaa7498c39dd83758e69 (diff)
Support Verilator target build to static library #5060
-rw-r--r--tests/projects/embed/verilator/static/src/main.v6
-rw-r--r--tests/projects/embed/verilator/static/src/sim_main.cpp12
-rw-r--r--tests/projects/embed/verilator/static/xmake.lua9
-rw-r--r--xmake/rules/verilator/verilator.lua10
-rw-r--r--xmake/rules/verilator/xmake.lua28
5 files changed, 60 insertions, 5 deletions
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 000000000..b7f80008d
--- /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 000000000..44cb1da1f
--- /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 000000000..e01bf4738
--- /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 321191666..6b7267861 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 4272ed91f..76d213096 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)
+