我在不同的VHDL项目中一次又一次看到的一个问题是,顶级测试平台总是很大并且很难保持井井有条.基本上有一个主要的测试过程,其中每个测试信号都被控制或验证,随着时间的推移变得巨大.我知道您可以为较低级别的组件制作测试平台,但这个问题主要适用于顶级输入/输出测试.
我希望有某种层次结构来保持组织有序.我已经尝试过实现VHDL程序,但编译器非常不满意,因为它认为我试图从不同代码段分配信号......
VHDL中是否有可用于实现c编程的内联函数或#define预处理器替换宏的行为?如果没有,你能提出什么建议?能让我的顶级测试平台看起来像这样会让我高兴:
testClockSignals();
testDigitialIO();
testDACSignals();
...
Run Code Online (Sandbox Code Playgroud)
在单独的文件中实现这些功能将是锦上添花.哈哈......我只想在C中编写和模拟测试台.
您要么在过程中编写过程(如@MortenZdk建议),要么将所有IO传递给它,这是VHDL要求.
我的偏好是只将我的程序放在包中,所以我使用pass all IO方法.为了简化传递的内容,我使用记录.如果将其减少到一个记录,它将是inout并且需要对记录元素进行解析功能.
有关这种方法的更多想法,请转到:http: //www.synthworks.com/papers/并查看标题为"通过使用前加速验证..."(靠近底部)和"跳跃式的VHDL Testbench技术"的论文SystemVerilog"(在顶部)
另一个关键方面是为每个独立接口使用单独的进程.这种方式可以针对不同的接口同时生成刺激.这也在论文中说明.
在可管理的过程中分离测试台代码是可能的,但编译器可能会抱怨,因为过程试图访问不在范围内的信号?如果过程要控制不在范围内的信号,则可以将该信号作为过程的参数给出,如下例所示
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)
该结构有几个层次:
运行测试用例:调用每个测试用例的过程。因此可以在开发和调试期间注释掉一个或多个测试用例。
测试用例:测试测试用例代码本身,它被编写为单独且独立的过程。genReset通过重置(使用程序)被测设备和相关测试台支持模块,可以避免不同测试用例运行之间的相互依赖
。
一般控制和状态:可重复使用的测试台特定程序,例如被测设备和测试台支持模块的重置。
可重用过程:不直接控制或使用测试台信号,而只能通过过程参数。这些过程可能位于包(其他文件)中,以便在其他测试台中重复使用。
测试台文件可能仍然有相当多的行,因为如果该测试台代码需要直接访问测试台信号以便控制或检查,则所有测试用例代码仍然必须与上述方法位于同一个文件中信号值。如果信号值可以通过参数传递给测试用例过程,就像调用所做的那样procReset,那么可以将测试用例代码移动到另一个包。
| 归档时间: |
|
| 查看次数: |
3044 次 |
| 最近记录: |