Vhdl 如何显示自验证测试台中发生的错误量?

Vhdl 如何显示自验证测试台中发生的错误量?,vhdl,xilinx,xilinx-ise,Vhdl,Xilinx,Xilinx Ise,下面是一个简单(未锁定)4位加法器的测试台代码。我的模拟当前将显示所有发生的错误,并在最后显示“测试完成”。如果没有错误,模拟将简单地返回“测试完成”。 我的问题是: 是否有方法以某种方式包含“如果”语句,以便在模拟中未检测到错误时显示“测试已完成,无错误”,以及在模拟中检测到错误时显示“测试已完成,[x]发现错误”(其中x是模拟完成时返回的可变错误量) IEEE库; 使用IEEE.STD_LOGIC_1164.all; 使用IEEE.NUMERIC_STD.ALL; 使用IEEE.STD_LO

下面是一个简单(未锁定)4位加法器的测试台代码。我的模拟当前将显示所有发生的错误,并在最后显示“测试完成”。如果没有错误,模拟将简单地返回“测试完成”。
我的问题是: 是否有方法以某种方式包含“如果”语句,以便在模拟中未检测到错误时显示“测试已完成,无错误”,以及在模拟中检测到错误时显示“测试已完成,[x]发现错误”(其中x是模拟完成时返回的可变错误量)

IEEE库;
使用IEEE.STD_LOGIC_1164.all;
使用IEEE.NUMERIC_STD.ALL;
使用IEEE.STD_LOGIC_UNSIGNED.ALL;
实体加法器4位TB为
端部加法器4位;
加法器4位TB的结构行为是
--被测单元(UUT)的组件声明
分量加法器4位
港口(
a:标准逻辑向量(3到0);
b:标准逻辑向量(3到0);
执行:执行标准逻辑;
求和:输出标准逻辑向量(3到0)
);
端部元件;
--投入
信号a:std_逻辑_向量(3到0):=(其他=>'0');
信号b:std_逻辑_向量(3到0):=(其他=>'0');
--输出
信号进位:标准逻辑;
信号和:标准逻辑向量(3到0);
开始
--实例化被测单元(UUT)
uut:加法器4位端口映射(
a=>a,
b=>b,
进位=>进位,
sum=>sum
);
--刺激过程
stim_proc:进程--无时钟
开始
--初始化输入值
甲乙,,
进位=>进位,
sum=>sum
);
--刺激过程
stim_proc:进程--无时钟
开始
--初始化输入值

a这将非常直接地增加你所拥有的。与其使用断言直接测试求和结果,不如使用
if
语句设置
boolean
如果求和不正确,则基于此断言/计数错误。比如:

variable Error : boolean;
variable ErrorCount : integer := 0;


您可以使用一个简单的
report
语句代替
assert
,并将其包装在
if..then..end if
块中。例如:

if (error_count = 0) then
  report "Test completed." severity NOTE;
else
  report "Test completed with " & INTEGER'image(error_count) & " errors." severity ERROR;
end if;
这里有一个更高级的方法:

您可以为模拟构建一个隐藏一些内部代码的助手包,以便模拟使用更清晰的界面。下面的示例声明了一个共享变量
pass
,以跟踪是否发生错误

此外,它声明了三个过程以提供断言“语句”和“打印模拟结果”方法:

  • tbFail将消息写入模拟器日志,并将跟踪变量设置为false
  • tbAssert测试一个条件,如果失败,则调用tbFail生成一条日志消息
  • tbPrintResult将总体结果写入标准输出。
    (这也可以在模拟器日志中看到,但如果模拟以批处理模式运行,则可以通过其他命令行工具对其进行解析。)
以下是一个例子:

此代码可在以下情况中使用:

architecture test of arith_prng_tb is
  constant CLOCK_PERIOD_100MHZ  : TIME                := 10 ns;
  constant COMPARE_LIST_8_BITS  : T_SLVV_8(0 TO 15)  := (
    x"12", x"24", x"48", x"90", x"21", x"42", x"85", x"0A",
    x"14", x"28", x"51", x"A2", x"45", x"8B", x"17", x"2E"
  );

  signal SimStop      : std_logic   := '0';
  signal Clock        : STD_LOGIC   := '1';
  signal Test_got     : STD_LOGIC   := '0';
  signal PRNG_Value   : T_SLV_8;
begin
  Clock <= Clock xnor SimStop after CLOCK_PERIOD_100MHZ / 2.0;

  process
  begin
    for i in 0 to 255 loop
      Test_got        <= '1';
      wait until rising_edge(Clock);
      tbAssert(
        (PRNG_Value = COMPARE_LIST_8_BITS(I)),
        "I=" & INTEGER'image(I) &  " Value=" & raw_format_slv_hex(PRNG_Value) & " Expected=" & raw_format_slv_hex(COMPARE_LIST_8_BITS(I))
      );
    end loop;

    Test_got        <= '0';

    -- Report overall simulation result
    tbPrintResult;
    SimStop  <= '1';
    wait;
  end process;

  -- ...
end architecture;
arith_prng_tb的架构测试是 恒定时钟周期100MHZ:时间=10ns; 常量比较列表8位:T_SLVV_8(0到15):=( x“12”、x“24”、x“48”、x“90”、x“21”、x“42”、x“85”、x“0A”, x“14”,x“28”,x“51”,x“A2”,x“45”,x“8B”,x“17”,x“2E” ); 信号SimStop:std_逻辑:='0'; 信号时钟:标准逻辑:='1'; 信号测试:标准逻辑:='0'; 信号PRNG_值:T_SLV_8; 开始
Clock我建议您看看开源测试框架VUnit()。有了它,你就可以做到

check_equal(sum, a + b);
在发生错误的情况下,它会给你一个这样的错误消息

ERROR: Equality check failed! Got 1111 (15). Expected 1110 (14).
INFO: Test Summary
Checks: 6
Passed: 1
Failed: 5
要输出错误统计信息,可以使用get\u checker\u stat函数。比如说

info("Test Summary" & LF & to_string(get_checker_stat));
这给了你类似的东西

ERROR: Equality check failed! Got 1111 (15). Expected 1110 (14).
INFO: Test Summary
Checks: 6
Passed: 1
Failed: 5

我假设
assert(sum=b+b)
实际上应该是
assert(sum=a+b)
如果您在这里更正了代码,其他人如何从您的问题中获益;变量ErrorCount:整数:=0;这些变量声明是否在流程语句“stim_proc”中?如果是这样的话,您能否仅为了测试目的而在测试台中引入新变量?是的,变量将在
stim\u proc
过程的声明区域中声明,即在
开始之前声明。你可以只测试变量,实体,任何东西。谢谢!工作代码显示在我的主要帖子中now@VKkaps本网站的目的是让问题保持原样,然后将答案标记为“正确”。如果您决定这样做,您可以查看问题的以前版本,这样您就可以恢复到以前的版本。而且,看起来你最终使用了信号;我不清楚,但是如果您确实想尝试使用变量,我的意思是在
开始之前
紧跟在
stim\u proc:process
之后声明这些变量。这是该进程的声明区域。
ERROR: Equality check failed! Got 1111 (15). Expected 1110 (14).
info("Test Summary" & LF & to_string(get_checker_stat));
INFO: Test Summary
Checks: 6
Passed: 1
Failed: 5