如何将参数从cmd传递到ModelSim的tcl脚本

问题描述 投票:0回答:3

我从 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”。
tcl modelsim
3个回答
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

0
投票

聚会迟到了,但我找到了一个很好的解决方法来解决你的障碍。 Modelsim 的 TCL 实例中的

do
命令确实接受参数。请参阅命令参考

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

希望对大家有帮助!


0
投票

我意识到这是一个老问题,但由于它似乎仍然是热门搜索,而且我在其他地方找不到此信息,我认为在这里发布会很有用。

正如其他帖子提到的,当使用

do
命令(not 使用
source
命令)调用 ModelSim .do 脚本时,使用典型的参数结构传递附加命令行参数......有点:

  • argc
    包含传递的参数数量
  • $1
    ,
    $2
    , ...按位置包含参数
  • shift
    将参数向左移动 1,使得
    $1
    被丢弃,
    $2
    变为
    $1
    ,等等
  • $do_argv
    not
    $argv
    )包含所有参数的列表,但not被shift修改。这没有很好的记录,但我在多个平台上尝试过,看起来是一致的。

示例:

test.do:
echo "\$argc = $argc"
echo "\$do_argv = $do_argv"
echo "\$1 = $1"
shift
echo "Shifted:"
echo "\$argc = $argc"
echo "\$do_argv = $do_argv"
echo "\$1 = $1"

输出:

> do test.do a b c d e
# $argc = 5
# $do_argv = a b c d e
# $1 = a
# Shifted:
# $argc = 4
# $do_argv = a b c d e
# $1 = b
© www.soinside.com 2019 - 2024. All rights reserved.