是否可以在测试台中定义循环函数
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;
注意波形元素延迟是相对于当前仿真时间的。
此测试平台生成目标波形:
我正在为考试做一份过去的论文,其中一个问题显示了这个波形:
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;
注意波形元素延迟是相对于当前仿真时间的。
此测试平台生成目标波形: