Skip to main content

仿真后端默认参数

Verilua 的 xmake rule 会在编译和运行阶段为每个仿真后端自动注入一组默认参数。本页列出这些参数及其作用,帮助用户理解仿真行为的来源,并说明其中哪些可以覆盖或关闭。

默认参数与用户参数的关系

通过 set_values("<sim>.flags", ...) / add_values("<sim>.flags", ...) 传入的参数,默认是追加在下表默认参数之后,并不会自动去掉已有默认值。

只有少数默认参数支持覆盖或开关切换:

  • 可覆盖值:timescale(各后端)、Verilator 的 --x-assign、VCS 的 -cc/-cpp/-ld。传入同名参数会就地替换默认值。
  • 可开关切换:Verilator 的 -O3↔-O0、--no-timing↔--timing;寄存器初始化通过 vcs_no_initreg / xcelium_no_initreg 关闭;--public-flat-rw 通过 verilua.verilator_no_public_flat_rw 显式关闭(与是否存在 .vlt / verilua.verilator_config 无关)。

除此之外的默认参数(如 -debug_access+all、-access +rw、--Wno-* 等)是无条件注入的,无法通过 <sim>.flags 去掉。完整的参数传递机制见 xmake 的配置参数。

确定性与寄存器初始化​

在 RTL 仿真中,未显式赋初值的寄存器(reg / logic)的初始状态因仿真器而异。为了提高仿真的确定性和可复现性,Verilua 默认为各后端注入寄存器/X 值初始化参数:

后端编译阶段运行阶段效果
Verilator--x-assign unique—每个 X 信号赋予唯一确定值,保证多次运行结果一致
VCS+vcs+initreg+random+vcs+initreg+0编译时启用 initreg 支持;运行时将所有寄存器初始化为 0
Xcelium-xminitialize 0-xminitialize 0编译和运行阶段均将寄存器初始化为 0
Icarus——Icarus 默认将寄存器初始化为 X,Verilua 未额外注入初始化参数
VCS 编译与运行的区别

VCS 的 +vcs+initreg+random 在编译阶段启用寄存器初始化功能(instrumentation),而运行阶段的 +vcs+initreg+0 决定实际初始化值为 0。两者缺一不可。

关闭寄存器初始化​

如果需要回到仿真器原生的未初始化行为(例如测试 X 传播或使用自定义初始化方案),可以通过以下开关关闭:

xmake.lua
target("test", function()
add_rules("verilua")
add_toolchains("@vcs")

-- 关闭 VCS 寄存器初始化(不再注入 +vcs+initreg+random / +vcs+initreg+0)
set_values("verilua.vcs_no_initreg", "1")

-- 关闭 Xcelium 寄存器初始化(不再注入 -xminitialize 0)
-- set_values("verilua.xcelium_no_initreg", "1")

-- ...
end)
开关默认值设为 "1" 后的效果
verilua.vcs_no_initreg未设置(启用初始化)不注入 +vcs+initreg+random(编译)和 +vcs+initreg+0(运行),寄存器保持 VCS 原生 X 状态
verilua.xcelium_no_initreg未设置(启用初始化)不注入 -xminitialize 0,寄存器保持 Xcelium 原生 X 状态
Verilator 的 --x-assign

Verilator 的 --x-assign 可通过 set_values("verilator.flags", "--x-assign 0") 直接覆盖为其他值(0、1、fast),无需专用开关。

随机种子注入​

SEED 会在运行阶段被注入为仿真器的随机种子参数,因此 RTL 里的 $urandom / $urandom_range 也随 SEED 变化,并在不同机器上一致(同一仿真器版本下)。

后端运行阶段注入参数
Verilator+verilator+seed+<seed>
VCS+ntb_random_seed=<seed>
Xcelium-svseed <seed>
Icarus—(无种子参数,注入时仅打印提示)

规则:

  • SEED 未设置时注入 1234,与 cfg.seed 的默认值一致。
  • SEED=0 注入为 1:Verilator 把 +verilator+seed+0 当作“随机取种”,会导致不可复现,三个后端统一映射。
  • 你自己在 <sim>.run_flags 里传了种子参数时,以你的参数为准,SEED 不再注入。识别的拼写:Verilator 的 +verilator+seed+,VCS 的 +ntb_random_seed,Xcelium 的 -svseed / -seed。
  • 写在编译阶段参数 <sim>.flags 里不算,因为它到不了运行阶段:VCS 会忽略 +ntb_random_seed,Verilator 直接报 Invalid option。
  • 生成的 run.sh / debug_run.sh 同样带这个参数,值取自 setvars.sh 的 VL_SEED(${SEED:-1234},0 换成 1),所以手动复跑与 xmake run 一致,且仍受运行时 SEED 控制。

Verilator 默认参数​

编译阶段​

参数说明
--x-assign uniqueX 信号赋唯一确定值,保证可复现性
-O3启用 Verilator 代码生成优化(可通过 verilator.flags 中的 -O0 覆盖)
--public-flat-rw允许通过 VPI 读写所有信号(默认注入;set_values("verilua.verilator_no_public_flat_rw", "1") 可关闭,再靠 .vlt / verilua.verilator_config 精细 public)
--timescale-override 1ns/1ps统一时间精度
--no-timing禁用 timing 模式(可通过 --timing 覆盖切换为 timing 模式)
--Wno-PINMISSING 等抑制常见非关键警告(PINMISSING、MODDUP、WIDTHEXPAND、WIDTHTRUNC、UNOPTTHREADS、IMPORTSTAR)
-CFLAGS "-std=c++20"C++ 编译标准
-LDFLAGS "-flto"链接时优化

运行阶段​

Verilator 编译产物为原生二进制,运行阶段无额外注入参数。


Icarus Verilog 默认参数​

编译阶段​

参数说明
-g2012启用 SystemVerilog 2012 语法支持
+timescale+1ns/1ps统一时间精度

运行阶段​

Icarus 通过 vvp 运行,Verilua 仅注入 VPI 模块加载参数,无额外仿真行为参数。


VCS 默认参数​

编译阶段​

参数说明
+vcs+initreg+random启用寄存器初始化 instrumentation(运行时由 +vcs+initreg+0 决定实际值)
-sverilog启用 SystemVerilog
-debug_access+all启用完整调试访问,供 Verilua 通过 VPI 读写信号
-timescale=1ns/1ps统一时间精度

运行阶段​

参数说明
+vcs+initreg+0将所有寄存器初始化为 0
+notimingcheck禁用时序检查(加速仿真)

Xcelium 默认参数​

编译阶段​

参数说明
-xminitialize 0将寄存器初始化为 0
-sv启用 SystemVerilog
-timescale 1ns/1ps统一时间精度
-nospecify抑制 specify block 中的时序信息
-access +rw启用信号读写访问,供 Verilua 通过 VPI 读写信号

运行阶段​

参数说明
-xminitialize 0将寄存器初始化为 0(运行阶段同样需要)

相关文档​

  • xmake 的配置参数:了解 <sim>.flags 和 <sim>.run_flags 的参数传递机制(默认追加,少数可覆盖)。
  • 特殊环境变量:SEED 环境变量用于控制随机种子,与寄存器初始化配合使用可实现完全可复现的仿真。
  • 控制内部时钟生成:verilua.no_internal_clock 开关。