如何在没有竞争条件的情况下并行运行多个modelsim实例?

时间:2017-10-06 08:43:59

标签: vhdl verilog modelsim

我希望并行运行多个参数的相同模拟。 我该怎么做呢?当多个实例尝试编译到同一文件夹并更改相同的modelsim.ini文件时,如何防止竞争条件?

我正在使用QuestaSim。

我想做这样的事情:

while ($x <= $num_processes)
  vsim -do run.do &
end

由于几个不同的原因,启动vsim因某些情况而失败。 (Lib无法找到,没有这样的模块)

2 个答案:

答案 0 :(得分:2)

VUnit是VHDL和SystemVerilog的免费开源测试框架,可以处理这个问题。

下面是VHDL中的最小VUnit测试平台,添加了value泛型和调用info(VUnit日志框架的一部分)来打印该泛型。

library vunit_lib;
context vunit_lib.vunit_context;

entity tb_example is
  generic (value      : integer;
           runner_cfg : string);
end entity;

architecture tb of tb_example is
begin
  test_runner : process
  begin
    test_runner_setup(runner, runner_cfg);

    info("Generic = " & to_string(value));

    test_runner_cleanup(runner);
  end process;
end architecture;

通过在VUnit运行脚本中定义配置,可以使用不同的通用值运行此测试平台。下面是一个最小运行脚本,添加了三行来创建这些配置(请参阅注释)。

from os.path import join, dirname
from vunit import VUnit

root = dirname(__file__)

ui = VUnit.from_argv()
lib = ui.add_library("lib")
lib.add_source_files(join(root, "*.vhd"))

# Add 5 configurations with the names 0, 1, 2, 3, 4 and the generic set to the corresponding value
tb_example = lib.entity("tb_example")
for i in range(5):
    tb_example.add_config(name=str(i), generics=dict(value=i))

ui.main()

如果使用-p5选项执行此脚本,VUnit将在五个不同的线程中运行模拟。执行顺序不确定,如输出中所示。

VUnit output

免责声明:我是其中一位作者。

答案 1 :(得分:-2)

您可以通过环境变量将参数设置为vsim调用。 阅读它们:

global env; 
puts $env(RESULTFOLDER)

您可以使用泛型将参数传播到verilog / vhdl文件:

-Gparam=123

要在并行运行多个modelsim实例时防止竞争条件,您需要处理两件事:

  1. 为每个实例分配一个库文件夹的单独实例。

    vlib work
    file rename work $RESULTFOLDER/work
    vmap work $RESULTFOLDER/work
    
  2. 确保在启动流程之前复制modelsim.ini文件,并为每个实例设置seperatley。

    cp modelsim.ini $folder/modelsim.ini
    vsim -modelsimini $folder/modelsim.ini  -do run.do