是否可以在测试台中定义循环函数

Is it possible to define looping functions in a test bench

我正在为考试做一份过去的论文,其中一个问题显示了这个波形: 现在我当然知道您可以像这样逐行编写代码:

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 可以更像软件,因为它不需要可综合。

'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的特性,没有敏感列表的进程会在到达末尾时重新启动。

波形将是:

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::=
目标 <= [ delay_mechanism ] 波形 ;

delay_mechanism::=
运输
| [拒绝time_expression]惯性

目标::=
姓名
|聚合

波形::=
waveform_element { , waveform_element }
| 未受影响

10.5.2.2 执行一个简单的赋值语句

waveform_element::=
value_expression [after time_expression ]
| 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;

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

此测试平台生成目标波形: