FPGA IP核开发流程概要

开发和验证 fpga ip 不仅仅是编写 hdl,而是需要更多的思考。让我们来看看如何做吧!
介绍
当我们开发基于 fpga 的解决方案时,我们会尽可能利用手上的 ip,因为这会加速开发。然而,在某些情况下,我们需要使用自定义 ip 核,以应对新项目。
开发和验证此 ip 块会带来一些挑战,如果做得不正确,可能会让项目进度变得缓慢。
当然,在使用 fpga 时,我们需要考虑的关键事情之一是需要首先考虑我们希望实现的功能,以及遵循正确的开发流程。
为了说明这个过程,我们以实际项目为示例,过程如下:
定义需求
创建微架构和接口
编写模块的rtl描述
开发 rtl 接口的总线功能模型
创建仿真平台进行验证
要求
示例项目,我们将创建一个简单的 axi stream qspi 从接口ip,具有以下要求:
创建ip的这些要求非常简单。然后,我们可以将该模块与之前的项目集成,例如:可以通过 qspi 访问芯片内的axi4总线。
微架构和接口
接下来我们需要创建微架构,这意味着我们需要了解串行存储器模式下的 qspi 是如何工作的。
read4io 和 pp4io 的波形如下所示
它们首先使用单线到 io0 来发送命令 0x38(用于写入操作)或 0xeb(用于读取操作)。
命令发送后,将使用所有 io 执行事务的其余部分。
对我们架构的影响是,我们需要一个 8 元素移位寄存器用于 io0,2 元素移位寄存器用于 io1-3。收到命令后,我们就可以仅使用 io0 寄存器的较低两个元素。
因此,我们的微架构需要能够执行以下操作
通过识别 csn 的下降沿来检测新事务
启用新事务后检测 sck 上的上升沿
使能数据移入 io0 寄存器
一旦 8 位数据位于 io0 寄存器中,具体取决于检查是否有效的读或写命令
对于写使能 io1-3 以及 io0 - 每两个 sclk 在 axis 接口上输出一个字节的数据。确保 io 驱动程序在该状态下处于三态。
对于读取,在虚拟时钟周期期间,从 axis 接口读取
对于在虚拟周期结束时读取,输出 io0-io3 上的数据
csn 的取消断言会停止事务并复位状态机等。
微代码架构完成后,我们就可以编写 hdl。
设计微架构时的关键要素之一是以合理的方式定义接口,尤其是 fpga 内部与其他模块连接的接口。虽然定义自己的接口可能很爽,但是还是要选择行业标准,例如 axi 等。这样不仅能够轻松定义接口,同时确保其他开发人员在集成时能够轻松使用它们。使用行业标准还简化了接口验证,因为可以使用标准 bfm,随着时间的推移,它还会建立一个有用的 ip 模块存储库,可以在多个项目中重复使用,从而减少开发时间和同类型项目成本。
因此,该块使用 axi stream 通过 qspi 接口发送和接收数据。
hdl 设计
该设计的 hdl 可以在文末看到。
ip 的接口如下是:
设计中的状态机:
hdl 完成后,下一步是仿真验证。
仿真
我们如何通过创建测试平台来验证 fpga 设计是否按预期工作。测试台对被测单元 (uut) 施加激励并观察 uut 的输出,以确保其行为符合预期。
本次我们不想使用波形进行验证,我们检查 uut 的行为并将其记录到文件中,验证其是否按照预期运行。
如果我们发现预期结果存在异常,我们再使用波形来调试 uut。
每个测试用例都是一组独特的激励,它将特定测试应用于 uut 以检查该激励的特定结果。
创建这些测试用例可能很复杂,并且是验证过程中最耗时的部分。根据 uut 的复杂性,可能有少量测试用例,也可能有数十个甚至数百个。
因此,我们希望将测试平台与测试用例分开。我们使用几个不同的抽象层来实现这一目标,包括
测试用例 - 一个或多个测试用例,通过测试框架向 uut 施加激励。
测试工具 - 包含 uut 的映射以及 ip 模型(例如 rams、ddr 模型等)的连接
uut - 我们正在测试的单元。
为了以最简单的方式实现这一目标,我们将使用大量的总线功能模型 (bfm) 和事务级模型 (tlm)。
当然,我们可以将 uvm、uvvm 和 osvvm 等框架用于这些应用程序,但是,由于该项目的目的是演示,因此我们将从头开始。
如果本次设计可以完美完成,将使测试用例成为一系列 bfm / tlm 级别的调用和相关检查。通过这种方式,测试用例看起来更像脚本而不是传统的 hdl 文件。
这样的灵活性非常重要,因为我们需要能够适应 uut 功能的变化,这些变化会导致需要创建更多的测试用例。
对于此应用程序,我们有以下内容:
测试用例 - 应用激励 - 在这种情况下,我们有一个测试用例,其中包含一个简单的测试。
测试台 - 包含测试台的测试基础设施。这包括 uut、axis fifo 和时钟/复位电路。
uut - 我们正在测试的 qspi ip 核
qspi bfm 库 - 包含许多 bfm 的库,作为 qspi 主设备通过接口执行读写操作。
vivado 项目
为了测试该项目,我们可以创建一个包含 hdl 和测试平台的 vivado 项目。我们使用 vivado 在测试台中提供 axis fifo,允许循环回写入的命令,以验证读回。
如果我们查看项目层次结构,我们将看到测试用例位于顶层的验证结构,下面的测试台包含 axis fifo 和 uut。
看不到该包,因为它仅在库视图下可用
运行 hdl 行为仿真将打开波形视图。选择 uut 并将信号添加到波形中。
单击“run all”,仿真完成后将看到 io 信号和内部信号的波形。
在这种情况下,我们期望的是,我们收到的每个写入值与测试平台执行此检查时返回的值相同。
对于关键应用,可能不同的工程师来执行验证并提供验证结果。
总结
在这个项目中,我们提供了 fpga ip 核开发的流程概要。有些流程尚未涵盖,例如编码规则和静态分析等,但它为那些希望开始的人提供了很好的开端。


ARM正式发布了针对物联网设备的AI芯片设计——Cortex-M55
智能交通与车联网概述
最后的Velite5,最酷的仔
医学+数据科学的未来怎样
福禄克针对储能电池及双向储能变流器提供深入的巡检维护解决方案
FPGA IP核开发流程概要
ZigBee短距离无线通信技术概述
2020年你得知道关于5G的哪一些事情
机器人市场竞争非常激烈的现象及新产品新应用的局限与挑战
迎接RV减速器企业的将是残酷的淘汰赛
RL78/G16触摸套件开发板演示(下)
ARM与DSP的接口设计
美信推出业内尺寸最小的18位逐次逼近型ADC MAX11156
集成电路人才缺口产生的原因分析
ARM能否成功取代x86架构
新基建为液压油缸需求注入新动能,助推行业高速、高质量发展
迷你风扇的制作图解
基于CAN总线的语音节点设计方案
当下买新能源汽车因该注意哪些问题?
HarmonyOS开发技巧分享 路由组件体验