如何管理大型VHDL测试平台

jer*_*erp 9 testing vhdl

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

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

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

testClockSignals();
testDigitialIO();
testDACSignals();
...
Run Code Online (Sandbox Code Playgroud)

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

Jim*_*wis 5

您要么在过程中编写过程(如@MortenZdk建议),要么将所有IO传递给它,这是VHDL要求.

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

有关这种方法的更多想法,请转到:http: //www.synthworks.com/papers/并查看标题为"通过使用前加速验证..."(靠近底部)和"跳跃式的VHDL Testbench技术"的论文SystemVerilog"(在顶部)

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


Mor*_*mer 4

在可管理的过程中分离测试台代码是可能的,但编译器可能会抱怨,因为过程试图访问不在范围内的信号?如果过程要控制不在范围内的信号,则可以将该信号作为过程的参数给出,如下例所示 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;
Run Code Online (Sandbox Code Playgroud)

该结构有几个层次:

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

  2. 测试用例:测试测试用例代码本身,它被编写为单独且独立的过程。genReset通过重置(使用程序)被测设备和相关测试台支持模块,可以避免不同测试用例运行之间的相互依赖 。

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

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

测试台文件可能仍然有相当多的行,因为如果该测试台代码需要直接访问测试台信号以便控制或检查,则所有测试用例代码仍然必须与上述方法位于同一个文件中信号值。如果信号值可以通过参数传递给测试用例过程,就像调用所做的那样procReset,那么可以将测试用例代码移动到另一个包。