【问题标题】:How to pass arguments from cmd to tcl script of ModelSim如何将参数从 cmd 传递到 ModelSim 的 tcl 脚本
【发布时间】:2025-10-27 04:05:01
【问题描述】:

我在一个 python 程序的 cmd 中运行 Modelsim。 我使用以下代码调用运行 modelsim 的 tcl 脚本:

os.system("vsim -c -do top_tb_simulate_reg.tcl " )

tcl 脚本包含以下内容:

vsim -voptargs="+acc" +UVM_TESTNAME=test_name +UVM_MAX_QUIT_COUNT=1 +UVM_VERBOSITY=UVM_LOW \
    -t 1ps -L unisims_verm -L generic_baseblocks_v2_1_0 -L axi_infrastructure_v1_1_0 \
    -L dds_compiler_v6_0_12 -lib xil_defaultlib xil_defaultlib.girobo2_tb_top \
    xil_defaultlib.glbl

我希望 +UVM_TESTNAME 的值是我在执行时从 cmd 传递的参数:

os.system("vsim -c -do top_tb_simulate_reg.tcl " )

我该怎么做?

我尝试了以下但没有成功:

Python 脚本:

os.system("vsim -c -do top_tb_simulate_reg.tcl axi_rd_only_test" )

模拟文件(tcl脚本)

vsim -voptargs="+acc" +UVM_TESTNAME=$argv +UVM_MAX_QUIT_COUNT=1 +UVM_VERBOSITY=UVM_LOW \
    -t 1ps -L unisims_verm -L generic_baseblocks_v2_1_0 -L axi_infrastructure_v1_1_0 \
    -L dds_compiler_v6_0_12 -lib xil_defaultlib xil_defaultlib.girobo2_tb_top \
    xil_defaultlib.glbl

我收到以下错误:

# ** 错误:(vsim-3170) 找不到“C:/raft/raftortwo/girobo2/ver/sim/work.axi_rd_only_test”。

【问题讨论】:

  • 你应该说出错误信息是什么。或者我们可以玩“戴上眼罩猜猜问题”……
  • 您可以将所有内容(vsim 命令、tcl 脚本及其参数转储到临时 shell 脚本 - 动态创建)并执行 os.system('foo.sh')。

标签: tcl modelsim


【解决方案1】:

问题在于vsim 二进制文件正在对参数进行自己的处理,这会造成干扰。虽然是的,但您可能可以通过阅读 vsim 文档找到解决此问题的方法,解决此问题的最简单方法是通过 环境变量 传递值。它们是由一个进程从其父进程继承的,并且可以很好地传递大多数东西。 (安全令牌例外,它应该始终在具有正确设置权限的文件中传递,而不是环境变量命令行参数。)

在你的 python 代码中:

# Store the value in the *inheritable* environment
os.environ["MY_TEST_CASE"] = "axi_rd_only_test"

# Do the call; the environment gets passed over behind the scenes
os.system("vsim -c -do top_tb_simulate_reg.tcl " )

在您的 tcl 代码中:

# Read out of the inherited environment
set name $env(MY_TEST_CASE)

# Use it! (Could do this as one line, but that's hard to read)
vsim -voptargs="+acc" +UVM_TESTNAME=$name +UVM_MAX_QUIT_COUNT=1 +UVM_VERBOSITY=UVM_LOW \
    -t 1ps -L unisims_verm -L generic_baseblocks_v2_1_0 -L axi_infrastructure_v1_1_0 \
    -L dds_compiler_v6_0_12 -lib xil_defaultlib xil_defaultlib.girobo2_tb_top \
    xil_defaultlib.glbl

【讨论】:

  • 确实很有帮助,但假设您也必须通过环境变量传递 plusargs 类型的参数。 QuestaSim 是否会识别出这样的内容:“+A="123" +B="456""?在我的情况下,我也不知道如何解决它。
【解决方案2】:

聚会迟到了,但我找到了一个很好的解决方法来解决你的障碍。 Modelsim 的 TCL 实例中的do 命令确实接受参数。见command reference

vsim -c -do filename.tcl不能带参数,但可以使用vsim -c -do "do filename.tcl params"

在您的情况下,这将转换为 os.system('vsim -c -do "do top_tb_simulate_reg.tcl axi_rd_only_test"')。您的 .tcl 脚本将找到通过变量 $1 传递的参数。

希望对大家有所帮助!

【讨论】:

  • 这可能是平台差异,但这似乎在 Windows 下不起作用。这可能是因为带空格的文件名是合法的,所以引用被解释为完整的文件名。