【问题标题】:Is it possible to define looping functions in a test bench是否可以在测试台中定义循环函数
【发布时间】:2020-05-24 16:55:21
【问题描述】:

我正在写一篇过去的论文以准备考试,其中一个问题显示了以下波形: 现在我当然知道你可以像这样逐行写出代码:

sig1 <= '1'; sig2 <= '1'; y <= '1'; wait for 20 ns;
y <= '0'; wait for 5 ns;
-- etc.

或通过使用数组。我想知道是否可以通过设置可以同时调用和运行的循环函数来简化流程。

-- Some pseudocode
function sig1 is
    sig1 <= '1'; wait for 25 ns;
    sig1 <= '0'; wait for 50 ns;
end sig1;

-- Definition for the other waves goes here

function waveform is
    while n=1 loop
        sig1, sig2, y run;
    end loop;
end waveform;

我已经对 VHDL 的文档和 Stack Overflow 上的文档有所了解,但我必须提前道歉,我不知道你会这样称呼什么,所以我的搜索没有产生任何结果结果接近我的想法。当然,这只是一种好奇,我已经预料到由于硬件和语言的性质,这可能是不可能的。

提前感谢您的帮助!

【问题讨论】:

    标签: vhdl test-bench


    【解决方案1】:

    用于测试平台的 VHDL 可以更像软件,因为它不需要是可综合的。

    'y' 部分可以写成如下所示的循环,其他部分可以用类似的方式编写。

    library ieee;
    use ieee.std_logic_1164.all;
    
    entity tb is
    end entity;
    
    
    architecture sim of tb is
      signal y : std_logic;
    begin
      process is
        constant period : time := 80 ns;
        constant steps  : natural := 8;
      begin
        for i in 0 to steps - 1 loop
          case i is
            when 0 | 1 | 3 => y <= '1';
            when others => y <= '0';
          end case;
          wait for period / steps;
        end loop;
      end process;
    end architecture;
    

    上面利用了VHDL特性,没有敏感列表的进程会在到达结束时重新启动。

    波形将是:

    【讨论】:

    • 哦,对了。我懂了。这实际上是一种非常好的方法,我很惊讶我以前没有遇到过这个(尽管我还没有做一个循环测试台)。所以我可以以类似的方式添加sig1sig2,它会立即运行吗?老实说,我认为您可能已经完全改变了我对测试平台的看法,谢谢您
    • 是的,您可以为sig1sig2 创建单独的进程并以类似的方式生成它们。很高兴听到它还启发了您在测试平台中使用 VHDL 的知识;您实际上可以用 VHDL 编写非常有效的测试平台。
    【解决方案2】:

    VHDL 信号分配允许具有多个元素的波形:

    IEEE 标准 1076-2008

    10.5.2 简单信号分配

    10.5.2.1 常规

    simple_signal_assignment ::=
    simple_waveform_assignment
    | simple_force_assignment
    | simple_release_assignment

    simple_waveform_assignment ::=
    目标 ;

    延迟机制 ::=
    交通
    | [拒绝时间表达式]惯性

    目标 ::=
    名称
    |聚合

    波形 ::=
    波形元素 { , 波形元素 }
    | 不受影响

    10.5.2.2 执行简单的赋值语句

    波形元素 ::=
    value_表达式 [after time_表达式]
    | null [ after time_expression ]

    一个波形元素的评估产生一个单一的交易。事务的时间分量由当前时间加上波形元素中时间表达式的值来确定。对于波形元素的第一种形式,交易的价值成分由波形元素中的价值表达决定。对于波形元素的第二种形式,值分量不是由语言定义的,而是定义为目标的类型。由波形元素的第二种形式求值产生的事务称为空事务


    这模拟了用于测试语言和 IC 测试仪的模式生成器中的波形描述。多个波形元素通常用于在测试台中进行仿真,并且不受综合支持。

    投影输出波形是必须按时间升序出现的波形元素队列。

    处理语句本身也是循环的:

    11.3 流程声明

    流程语句的执行包括重复执行其语句序列。流程语句的语句序列中的最后一条语句执行完后,将立即继续执行语句序列中的第一条语句。


    这两个功能允许在测试台中编写紧凑的独立模式生成器:

    library ieee;
    use ieee.std_logic_1164.all;
    
    entity sig1sig2y_tb is
    end entity;
    
    architecture foo of sig1sig2y_tb is
        signal sig1, sig2, y:   std_ulogic;
    begin
    sig1_process:
        process
        begin
            sig1 <= '1', '0' after 25 ns;
            wait for 75 ns;
        end process;
    sig2_process:
        process
        begin
            sig2 <= '1', '0' after 25 ns, '1' after 75 ns, '0' after 100 ns, 
                    '1' after 125 ns, '0' after 175 ns;
            wait for 200 ns;
        end process;
    y_process:
        process
        begin
            y <= '1', '0' after 20 ns, '1' after 30 ns, '0' after 40 ns;
            wait for 80 ns;
        end process;
    end architecture;
    

    注意波形元素延迟是相对于当前仿真时间的。

    此测试台产生目标波形:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-01-09
      • 1970-01-01
      • 2018-12-28
      • 1970-01-01
      • 1970-01-01
      • 2018-01-31
      • 2016-09-15
      • 1970-01-01
      相关资源
      最近更新 更多