如何管理大型VHDL测试平台

时间:2013-12-09 02:16:50

标签: testing vhdl

我在不同的VHDL项目中一次又一次看到的一个问题是,顶级测试平台总是很大并且很难保持井井有条。基本上有一个主要的测试过程,其中每个测试信号都被控制或验证,随着时间的推移变得巨大。我知道您可以为较低级别的组件制作测试平台,但这个问题主要适用于顶级输入/输出测试。

我希望有某种层次结构来保持组织有序。我已经尝试过实现VHDL程序,但编译器非常不满意,因为它认为我试图从代码的不同部分分配信号......

VHDL中是否有可用于实现c编程的内联函数或#define预处理器替换宏的行为?如果没有,你能提出什么建议?能让我的顶级测试平台看起来像这样会让我高兴:

testClockSignals();
testDigitialIO();
testDACSignals();
...

在单独的文件中实现这些功能将是锦上添花。哈哈......我只想在C中编写和模拟测试台。

3 个答案:

答案 0 :(得分:5)

VHDL要求是您在流程中编写过程(如@MortenZdk建议的那样),或者将所有IO传递给它。

我的偏好是只将我的程序放在包中,所以我使用pass all IO方法。为了简化传递的内容,我使用记录。如果将其减少到一个记录,它将是inout并且需要对记录元素进行解析功能。

有关此方法的更多提示,请转到:http://www.synthworks.com/papers/并查看标题为:  “通过使用前加速验证......”(靠近底部)和  “跳过SystemVerilog的VHDL Testbench技术”(在顶部)

另一个关键方面是为每个独立接口使用单独的进程。这种方式可以针对不同的接口同时生成刺激。这也在论文中有所说明。

答案 1 :(得分:2)

可以在可管理的程序中分离测试台代码,但也许可以 编译器抱怨,因为一个过程试图访问不是的信号 在适用范围 ?如果一个程序是控制一个不在范围内的信号,那么 信号可以作为程序的参数给出,如图所示 procReset示例如下。

显示了一个测试台结构,具有多个级别以便于维护 下面:

--==========================================================
-- Reusable procedures

-- Reset generation
procedure procReset(signal rst : out std_logic; ...) is
...

--==========================================================
-- Main test control procedure in test bench
process is

  ------------------------------------------------------------
  -- General control and status

  -- Reset device under test and related test bench modules
  procedure genReset is
  begin
    procReset(rst, 100 ns);  -- procReset declared elsewhere
    -- Other code as required for complete reset
  end procedure;

  ------------------------------------------------------------
  -- Test cases

  procedure testClockSignals is
  begin
    genReset;  -- Apply reset to avoid test case interdependency
    -- Test code here, and call genErr if mismatch detected
  end procedure;

  procedure testDigitialIO is
  begin
    genReset;  -- Apply reset to avoid test case interdependency
    -- Test code here, and call genErr if mismatch detected
  end procedure;

  procedure testDACSignals is
  begin
    genReset;  -- Apply reset to avoid test case interdependency
    -- Test code here, and call genErr if mismatch detected
  end procedure;

begin

  ------------------------------------------------------------
  -- Run test cases
  testClockSignals;
  testDigitialIO;
  testDACSignals;
  -- End of simulation
  std.env.stop(0);
  wait;

end process;

结构中有几个级别:

  1. 运行测试用例:每个测试用例的程序 调用。由此可以注释掉一个或 更多在开发和调试过程中的测试用例。

  2. 测试用例:测试测试用例代码本身,写成 独立和独立的程序。相互依赖 通过重置避免运行不同的测试用例(使用 genReset程序)被测设备和相关测试 工作台支持模块。

  3. 一般控制和状态:可重复使用的测试台特定 程序,例如重置被测设备和测试 工作台支持模块。

  4. 可重复使用的程序:不控制或使用测试台 直接发出信号,但只能通过过程参数。这些 程序可以位于包(其他文件)中以供重用 在其他试验台。

  5. 测试台文件可能仍然是相当多的行,因为所有的测试 如果是这样的话,案例代码仍然必须与上述方法在同一个文件中 测试台代码需要直接访问测试台信号才能控制或 检查信号值。如果信号值可以传递给测试用例 通过参数的过程,就像procReset调用一样,然后是 可以将测试用例代码移到另一个包中。

答案 2 :(得分:0)

如果每个块都有较低级别的测试平台,那么您可以在顶层使用它们。

这是他们自己的权利使钥匙较低水平测试元素的实体,您可以撰写他们进入这往往只是一个小垫片到引脚电平数据转换成您最初使用测试级数据更高水平测试项目

例如,在图像处理FPGA中,您可以使用一些图像源和数据检查代码来检查算法部分。这些可以按原样使用,或者通过一些包装将数据提供给顶层FPGA引脚,然后将引脚输出解码回原始检查代码所需的格式。

毫无疑问,在较低级别测试的寄存器设置代码可以包含在更多的代码中,并且适当地摆动FPGA引脚并解释引脚摆动的结果。

两组代码的组合允许您检查图像处理管道的端到端功能和该管道的寄存器配置。