我从 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
二进制文件正在对参数进行自己的处理,这是干扰。虽然是的,您可能可以通过阅读 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
聚会迟到了,但我找到了一个很好的解决方法来解决你的障碍。 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
。
希望对大家有帮助!
我意识到这是一个老问题,但由于它似乎仍然是热门搜索,而且我在其他地方找不到此信息,我认为在这里发布会很有用。
正如其他帖子提到的,当使用
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