5 仿真建议方法
5.1 概述
什么样的仿真是令人满意的,这取决于个人品味和工作方法。尽管如此,仿真总是基于一些假设。这些假设包括期望特定的 功能单元按预期工作。因此,通过仿真来检查这些功能单元是没有意义的。也可能存在某些有益于仿真的功能单元,但这样做过于复杂或耗 时。
本节提出了关于仿真过程的一些假设和限制。还讨论了一种涉及 Xillybus IP 核的系统仿真方法。这些指南本质上比本文档其 他部分更具开放性。
Xillybus IP 核及其驱动程序是一个复杂的系统,已在各种场景下进行了广泛测试。因此,通过仿真不太可能发现 IP 核本身的错 误: 如果在 TB 级的数据传输和大量使用模式中未发现错误,那么仿真也不太可能揭示此类错误。
此外,IP 核的行为在很大程度上取决于主机的响应: 驱动程序和应用程序软件的响应方式和延迟各不相同,且 几乎不可预测。除此之外,总线(PCIe、AXI 或 USB)的延迟同样是随机且不可预测的。因此,全面的仿真几乎是不可能的。
鉴于此,建议对应用逻辑进行仿真,范围直至 FIFO 与 Xillybus IP 核的连接处。相应地,将 IP 核模拟为一个黑盒,它会根据 数据方向消耗或填充该 FIFO。
5.2 仿真异步流
当流配置为异步流(asynchronous stream)时,IP 核会向 FIFO 传输数据或从 FIFO 接收数据,使得 FIFO 永远不会达到溢 出(overflow)或下溢(underflow)状态。
只要主机上的应用程序软件足够频繁地执行 I/O 操作,并且 Xillybus 的带宽能力足以完成其任务,这一特性就成立。这两个 条件是正确设计项目的结果。通过仿真验证设计的两个方面是有益的:
-
FIFO 是否达到溢出或下溢(取决于方向)。
-
应用逻辑是否对这种故障情况做出了正确响应,例如按照第 4.5 节中建议的方式。
为了仿真正常运行,可以假设只要相关的 ’open’ 信号为高电平(表示文件已被主机打开),IP 核就会以最大速率向 FIFO 传 输数据或从 FIFO 接收数据。
对于从主机到 FPGA 的流,测试 FIFO 发生下溢时的情况是有益的。
建议通过使 FIFO 显示为已空(empty)来仿真此事件。例如,如果 FIFO 是测试平台的一部分,则测试平台将(连接到应用 逻辑的)’empty’ 信号变为高电平。或者,模拟主机数据流的测试平台部分可能简单地在一段时间内停止向 FIFO 推送数据。这会导致 FIFO 变空。
同样,对于从 FPGA 到主机的流: 可以将 ’full’ 线变为高电平,以测试 FIFO 的溢出。或者,测试平台可以在一 段时间内停止从 FIFO 获取数据,从而产生相同的效果。
破坏数据流连续性的一个可能原因是,应用逻辑试图超过流的带宽限制(或 IP 核总带宽的限制)。如果存在这种可能性,也 建议测试平台模拟带宽限制。这可以通过确保充当 IP 核的测试平台以受限于流预期带宽的数据速率填充或清空 FIFO 来实现。
但请注意,在许多应用中,这种仿真是没有必要的,因为应用逻辑不可能超过带宽限制。
5.3 仿真同步流
出于仿真目的,同步流(synchronous stream)的主要区别在于 IP 核的数据流不是连续的: 对于同步流,只有 在主机上存在挂起的函数调用(read() 或 write())时,IP 核才会向 FIFO 传输数据或从 FIFO 接收数据。
因此,IP 核的行为更多地依赖于应用程序软件的 I/O 请求。相应地,模拟 IP 核的测试平台部分必须考虑到应用程序软件的 访问模式。
对于同步流,仿真溢出或下溢可能无关紧要,因为当流的目的在于交换大量数据时,同步流是次优选择。然而,仿真这些条 件的方法与异步流相同。
5.4 一种简化的仿真方法
如果对测试溢出和下溢的响应不感兴趣,有一种更简单的 IP 核仿真方法。例如,在主机到 FPGA 方向: 可以 在测试平台中实现 FIFO,只需在读使能信号为高电平时,每个时钟上升沿从文件中读取一个数据字即可。这种简化的 FIFO 视图基于一个假 设:主机通过足够快地写入相关设备文件来防止 FIFO 变空。
在相反方向,测试平台在写使能信号为高电平时将数据字写入文件。与之前类似,假设主机通过足够快地读取数据来防止 FIFO 变满。
这种方法并没有忽视数据流连续性可能被破坏的可能性。相反,这种方法认识到数据流中断很可能是超出仿真范围的结 果: 过浅的 DMA 缓冲区、应用程序软件响应不佳,或主机整体状况导致的 CPU 被剥夺。如果此类事件真实发生,应用逻辑应 让主机知晓。如前所述,这种机制可以进行仿真。
然而,这种方法确实忽略了应用逻辑可能试图超过流带宽限制的可能性。如果这种情况是现实可能发生的,那么这种简化的 仿真方法可能不够充分。
