特殊环境变量
Verilua 支持通过环境变量来控制其行为和配置。所有环境变量都是可选的,如果不设置,Verilua 会使用合理的默认值。环境变量可以在 shell 中永久设置(通过 export,仅当前 shell 有效),也可以在每次命令前临时指定,两者灵活搭配。
环境变量的优先级通常高于配置文件中的同名设置,但具体规则请参考各变量的说明。
变量概览
| 变量名 | 简要说明 |
|---|---|
SIM | 指定使用的仿真器类型 |
SEED | 设置仿真随机种子 |
PRJ_DIR | 指定项目根目录 |
PRJ_TOP | 额外 Lua 搜索路径根 |
VL_DUT_TOP | 指定设计的顶层模块名称 |
VL_LUA_SCRIPT | 指定 Lua 主脚本文件 |
VL_POST_INIT_SCRIPT | init.lua 之后、主脚本之前执行的 post-init(文件路径或 Lua 源码) |
VL_DEBUG | 启用 Verilua debug 输出 |
VL_QUIET | 静默模式,禁用日志输出 |
VL_LOG_LEVEL | 日志级别下限 |
VL_PERF_TIME | 启用性能时间统计 |
VL_ACC_LUA_TIME | 启用 libverilua 侧 Lua 执行时间统计(lua_time_taken / lua_overhead) |
VL_WAVEFORM_FILE | WAL/wave_vpi 波形文件路径 |
VL_HIERARCHY_CACHE_FILE | 层级缓存文件路径 |
VL_PRINT_HIER_STYLE | 层级打印样式 |
VL_NOSIM_BUILD | nosim 构建路径标记 |
VL_CFG_FILE | 用户配置文件路径 |
VL_TARGET_NAME | 当前 xmake target 名称(rule 自动注入) |
VL_BUILD_DIR | 当前 target 构建目录绝对路径(rule 自动注入) |
VL_BUNDLE_KEY_HEX | 编译 libverilua 时注入的打包密钥(64 hex 为裸密钥,否则 SHA-256;仅构建) |
VERILUA_HOME | Verilua 安装根路径 |
核心环境变量
SIM (可选,需谨慎使用)
指定使用的仿真器类型。此变量应与编译时使用的仿真器保持一致,否则可能导致运行时错误。
- 默认值:自动检测(通过 vpiml)
- 可选值:
verilator– Verilator 仿真器vcs– Synopsys VCS 仿真器xcelium– Cadence Xcelium 仿真器iverilog– Icarus Verilog 仿真器wave_vpi– Verilua 波形分析后端(WAL 模式)
- 优先级:
cfg.simulator配置文件 >SIM环境变量 > 自动检测 - 相关配置影响:
- 设置
cfg.simulator值 - 当值为
wave_vpi时,自动设置cfg.is_wal = true - 当值为其他仿真器且设置了
cfg.is_hse = true时,为 HSE 模式 cfg.is_hse和cfg.is_wal不能同时为 true
- 设置
- 示例:
# 临时指定(仅本次命令生效)SIM=vcs xmake run -P . <target_name>SIM=verilator xmake build -P . <target_name> && SIM=verilator xmake run -P . <target_name># 永久设置(当前 shell 及子进程有效)export SIM=iverilogxmake build -P . <target_name>xmake run -P . <target_name>
VL_LUA_SCRIPT (可选)
指定 Lua 主脚本文件。通常由 xmake 配置 verilua.lua_main 设置,也可通过此环境变量覆盖。
- 默认值:由
verilua.lua_main决定 - 示例:
VL_LUA_SCRIPT=/path/to/main.lua xmake run -P . <target_name>
VL_CFG_FILE (可选)
用户配置文件路径(相对或绝对)。未设置时不加载用户配置。配置文件所在目录由 dirname(VL_CFG_FILE) 推导并加入 package.path。
- 默认值:未设置(xmake 运行时会注入生成的
verilua_cfg.lua) - 示例:
VL_CFG_FILE=/path/to/mysim_config.lua xmake run -P . <target_name>export VL_CFG_FILE=./mysim_config.lua
VL_TARGET_NAME (可选,xmake rule 自动注入)
当前 xmake target 的名称(target:name())。由 verilua xmake rule 写入 runenvs,因此:
xmake run时 Lua 可通过os.getenv("VL_TARGET_NAME")读取- 构建目录下的
setvars.sh/run.sh也会export同名变量
适合多 target 共用一份 main 时区分用例、命名日志/输出文件等。
- 默认值:未走 xmake rule 时不设置;经 rule 构建/运行时为当前 target 名
- 示例:
-- main.lualocal target_name = os.getenv("VL_TARGET_NAME")print("running target:", target_name)
VL_BUILD_DIR (可选,xmake rule 自动注入)
当前 target 的构建目录绝对路径(与 rule 计算的 build_dir 相同,通常为 ./build/<sim>/<top> 的绝对形式)。同样写入 runenvs,xmake run 与 setvars.sh / run.sh 都可见。
on_run 会 cd 到该目录,但脚本若需要稳定绝对路径(写日志/波形/产物),应读本变量而不是依赖 cwd。
- 默认值:未走 xmake rule 时不设置;经 rule 构建/运行时为当前 target 的 build dir
- 示例:
-- main.lualocal build_dir = os.getenv("VL_BUILD_DIR")local log = build_dir .. "/case.log"
VL_POST_INIT_SCRIPT (可选)
在 init.lua 加载完成、且 VL_DUT_TOP 自动补齐之后,主脚本 VL_LUA_SCRIPT 之前执行的可选 hook。
适合不改 main 的启动期注入;固定项目配置仍优先用 verilua.user_cfg / cfg。
-
默认值:未设置则跳过
-
值形态:
- 若值为已存在的文件路径 →
dofile加载该文件 - 否则 → 作为 Lua 源码字符串 执行(chunk 名
VL_POST_INIT_SCRIPT)
- 若值为已存在的文件路径 →
-
空字符串:panic(不静默跳过)
-
歧义:若源码字符串恰好等于当前工作目录下某个真实文件路径,会按文件执行;文件路径建议使用绝对路径
-
典型用途:
- 多用例共享的 bootstrap(改
package.path、公共require、统一开关) - 临时调试补丁(多打日志、改 seed/flag),不污染 main
- CI / 矩阵差异化:同一 main,不同 job 注入不同 post-init
- 本地/客户侧覆写:上游固定 main,本地用 hook 塞路径或插件
- xmake 侧固定注入:
add_runenvs("VL_POST_INIT_SCRIPT", "...")(多行源码可用[[]];写入setvars.sh时 runenv 值会 shell quote)
- 多用例共享的 bootstrap(改
-
示例:
# 文件模式VL_POST_INIT_SCRIPT=/path/to/post_init.lua xmake run -P . <target_name># 源码字符串模式VL_POST_INIT_SCRIPT='print("post-init")' xmake run -P . <target_name>xmake.luaadd_runenvs("VL_POST_INIT_SCRIPT", path.join(os.scriptdir(), "scripts", "common_bootstrap.lua"))
VL_DUT_TOP (可选)
指定设计的顶层模块名称。若未设置,Verilua 会自动通过 VPI 接口获取第一个模块的名称作为顶层模块。
- 默认值:自动获取
- 对应 cfg 字段:
cfg.top - 自动获取方式:通过 vpiml 遍历当前设计中的模块,取第一个模块的名称。
- 示例:
# 临时指定VL_DUT_TOP=tb_top xmake run -P . <target_name># 永久设置(当前 shell 有效)export VL_DUT_TOP=tb_top
PRJ_DIR (可选)
指定项目根目录。Verilua 在加载依赖时会参考此路径。
- 默认值:
.(当前目录) - 对应 cfg 字段:
cfg.prj_dir(运行时解析为绝对路径:相对路径按启动时的工作目录拼接,保证字段值无歧义、可直接用于路径拼接) - 示例:
# 临时指定PRJ_DIR=/path/to/project xmake run -P . <target_name># 永久设置(当前 shell 有效)export PRJ_DIR=/path/to/project
SEED (可选)
设置仿真随机种子,用于保证随机数序列的可重复性。
- 默认值:
1234 - 对应 cfg 字段:
cfg.seed - 优先级说明:环境变量
SEED的优先级高于配置文件中的cfg.seed,即如果同时设置,环境变量会覆盖配置文件的值。 - 示例:
# 临时指定SEED=42 xmake run -P . <target_name># 永久设置(当前 shell 有效)export SEED=42
调试与日志变量
VL_DEBUG (可选)
启用 Verilua 调试输出。设置后,代码中的 verilua_debug() 调用将输出调试信息。
- 默认值:未启用
- 使用效果:启用后会输出
verilua_debug()调试信息 - 性能影响:未设置时零开销(
verilua_debug为空函数) - 示例:
# 临时启用VL_DEBUG=1 xmake run -P . <target_name># 永久启用(当前 shell 有效)export VL_DEBUG=1
VL_QUIET (可选)
静默模式,禁用 Verilua 框架内部的日志输出。此模式不影响用户代码中的 print() 调用。
- 默认值:未启用(正常输出日志)
- 影响范围:
- Logger 模块的所有方法:
info()、debug()、warning()、error()、success() - 仿真结束时 Rust 层输出的统计信息表格(VERILUA STATISTIC),包含:
total_time_taken– 总耗时lua_time_taken– Lua 执行耗时lua_overhead– Lua 开销百分比
- Logger 模块的所有方法:
- 注意:仅影响 Verilua 框架内部的 Logger 模块输出,用户代码中的
print()函数不受影响(因为 Logger 模块使用的是局部的print变量,而用户代码使用的是全局print函数)。 - 示例:
# 临时启用静默模式VL_QUIET=1 xmake run -P . <target_name># 永久启用(当前 shell 有效)export VL_QUIET=1
VL_PERF_TIME (可选)
启用性能时间统计。仿真结束时,Verilua 会输出任务级的耗时统计,帮助定位性能瓶颈。
- 默认值:未启用
- 示例:
# 临时启用VL_PERF_TIME=1 xmake run -P . <target_name># 永久启用(当前 shell 有效)export VL_PERF_TIME=1
VL_ACC_LUA_TIME (可选)
启用 libverilua(Rust 侧)的 Lua 时间统计。开启后,仿真结束统计表中的 lua_time_taken 与 lua_overhead 列显示进入 Lua 回调的累计耗时及占比;未设置时这两列显示 -- 并打印灰色提示。取代旧的编译期 cargo feature acc_time,无需重新编译即可切换。
- 默认值:未启用
- 取值:
1或true启用 - 示例:
VL_ACC_LUA_TIME=1 xmake run -P . <target_name>
VL_BUNDLE_KEY_HEX (可选,构建期)
编译 libverilua 时写入 AES-256-GCM 密钥。运行时不读此变量。未设置则库能链,但不能打/解 .vlbc。不要提交仓库。
- 默认值:未设置
- 格式:64 个 hex → 裸密钥;其它非空字符串 → 整串 SHA-256(不截断)。多/少一个字符都是另一把钥匙
- 范围:仅编译 libverilua。打包须在已加载该库的 Verilua 进程里做
- 示例:
VL_BUNDLE_KEY_HEX='口令' xmake run build_libverilua - 相关文档:加密打包验证组件(BundleToVlbc)