summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author小鸡快跑 <[email protected]>2024-09-29 21:05:17 +0800
committer小鸡快跑 <[email protected]>2024-09-29 21:05:17 +0800
commit6f209ca9932d93ceed67b810168a5fc98285fe19 (patch)
tree2f86871076fbd9d550015d68f60a8b5544d7e712
parent0f7e1ea9a5f790364d44d3f759347620113ad7db (diff)
feat(rules/iverilog): Improve the iverilog build rules
1. Add System Verilog support 2. Support add_defines by add_options 3. Use vcd format instead of lxt2 to support WaveTrace plugin
-rw-r--r--xmake/rules/iverilog/xmake.lua18
1 files changed, 13 insertions, 5 deletions
diff --git a/xmake/rules/iverilog/xmake.lua b/xmake/rules/iverilog/xmake.lua
index 4295d1625..b538f782b 100644
--- a/xmake/rules/iverilog/xmake.lua
+++ b/xmake/rules/iverilog/xmake.lua
@@ -20,7 +20,8 @@
-- @see https://github.com/xmake-io/xmake/issues/3257
rule("iverilog.binary")
- set_extensions(".v", ".vhd")
+ -- support SystemVerilog
+ set_extensions(".v", ".sv", ".vhd")
on_load(function (target)
target:set("kind", "binary")
if not target:get("extension") then
@@ -32,6 +33,7 @@ rule("iverilog.binary")
end)
on_linkcmd(function (target, batchcmds, opt)
+ import("core.project.project")
local toolchain = assert(target:toolchain("iverilog"), 'we need set_toolchains("iverilog") in target("%s")', target:name())
local iverilog = assert(toolchain:config("iverilog"), "iverilog not found!")
@@ -80,12 +82,17 @@ rule("iverilog.binary")
end
-- get defines
- local defines = target:get("defines")
- if defines then
- for _, define in ipairs(defines) do
+ local add_defines = function(defines)
+ for _, define in ipairs(defines or {}) do
table.insert(argv, "-D" .. define)
end
end
+ add_defines(target:get("defines"))
+ -- support add_defines in options
+ for _, option_name in ipairs(target:get("options") or {}) do
+ local option = project.option(option_name)
+ add_defines(option:enabled() and option:get("defines"))
+ end
-- get includedirs
local includedirs = target:get("includedirs")
@@ -115,5 +122,6 @@ rule("iverilog.binary")
local toolchain = assert(target:toolchain("iverilog"), 'we need set_toolchains("iverilog") in target("%s")', target:name())
local vvp = assert(toolchain:config("vvp"), "vvp not found!")
- os.execv(vvp, {"-n", target:targetfile(), "-lxt2"})
+ -- some oscilloscopes do not support lxt2
+ os.execv(vvp, {"-n", target:targetfile()})
end)