在testbench中运行不同时钟模式的最佳方法

时间:2017-11-16 15:45:25

标签: vhdl

我有兴趣以不同的时钟频率运行我当前的测试用例,而无需重新创建只有时钟周期改变的新测试用例。使用tcl脚本会更好吗?

例如:

    testcase1 has 
    process
    begin
    wait for CLK_PERIOD / 2.0;
    CLK <= not CLK;
    wait forCLK_PERIOD / 2.0;
    NCLK <= not CLK;
    end process;

但我想能够用

运行testcase1
    process
    begin
    wait for CLK_PERIOD1 / 2.0;
    CLK <= not CLK;
    wait forCLK_PERIOD1 / 2.0;
    NCLK <= not CLK;
    end process;

1 个答案:

答案 0 :(得分:0)

您可以将时钟周期作为通用传递给testbench实体。模拟器无法处理任何类型的顶级泛型,因此您可以使用字符串泛型并将其转换为时间。下面是VUnit测试平台的一个例子(我是作者之一,所以如果可以的话我会避免使用TCL)

library vunit_lib;
context vunit_lib.vunit_context;

entity tb_test is
  generic (
    clk_period_as_string : string;
    runner_cfg : runner_cfg_t);
end tb_test;

architecture tb of tb_test is
  constant clk_period : time := time'value(clk_period_as_string);
begin
  test_runner : process
  begin
    test_runner_setup(runner, runner_cfg);

    info("Clock period set to: " & to_string(clk_period));

    test_runner_cleanup(runner);
  end process test_runner;
end;

VUnit脚本可以通过创建测试平台的几个配置来控制此通用

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

prj = VUnit.from_argv()

tb_lib = prj.add_library('tb_lib')
tb_lib.add_source_files(join(dirname(__file__), 'test', '*.vhd'))
tb = tb_lib.entity("tb_test")

generics = dict(clk_period_as_string="5 ns")
tb.add_config(name='clock period = 5 ns', generics=generics)

generics = dict(clk_period_as_string="10 ns")
tb.add_config(name='clock period = 10 ns', generics=generics)

prj.main()

结果将是

enter image description here