在计算领域中,FPGA 和可编程 SoC 是独立于 CPU、MCU、DSP 和 GPU 设备之外的一类设备。FPGA 为开发人员实现了更高的吞吐率、更低的延迟和更高的确定性。
在计算领域中,FPGA 和可编程 SoC 是独立于 CPU、MCU、DSP 和 GPU 设备之外的一类设备。FPGA 为开发人员实现了更高的吞吐率、更低的延迟和更高的确定性。
FPGA 和可编程 SoC 均包含查找表、寄存器和块 RAM 等可编程逻辑单元。当开发人员创建可编程逻辑解决方案时,开发人员定义的是这些逻辑单元的配置和连接。
由于开发人员描述逻辑单元的配置而非指令的执行顺序,因此这导致开发流程变得大不相同。这种区别还为开发人员带来新的挑战,包括:
- 验证 — 设计人员如何验证和调试功能?
- 资源分配 — 设备是否包含足以实现设计的逻辑资源?
- 时序收敛 — 所使用的逻辑单元能否按需连接并仍可达到所需的工作频率?
- 功率耗散 — 电源和热环境能否接受最终设计的功率耗散?
设计捕获
自从 1984 年引入这一概念以来,捕获可编程逻辑设计的方式已经发生了重大变化。这一进程已发展到设计输入从为每个逻辑单元定义逻辑公式演变为有章可循地捕获逻辑电路、使用硬件描述语言以及最近的高级合成。
当然,用于为设备编程的抽象级别不断提高背后一个关键性的推动因素已是设备不断提高的容量和能力。
使用 Verilog 或 VHDL 等硬件描述语言 (HDL) 捕获大多数新型设计。通过这两种语言,开发人员可描述要在寄存器传输级 (RTL) 实现的功能。定义一个 RTL 设计意味着开发人员描述一个同步逻辑设计以及信息在寄存器 — 例如状态机和计数器之间的传输。
虽然 HDL 语言包含某种编程语言应有的构造(如处理文件),但该语言只有一小部分可用于创建可编程逻辑解决方案。在验证设计期间使用剩余的构造。
倒是,可编程逻辑解决方案的开发人员越来越多地使用 C、C++、OpenCL 和 Matlab/Simulink 等高级语言进行设计捕获。这些语言与高级合成工具(例如 Vivado HLx 或 Intel 的 HLS 编译器)一起使用,后者负责将高级语言转换为 VHDL 或 Verilog 描述。然后使用标准 FPGA 开发流程实现此 HDL 描述。
与所有其他开发一样,无论使用 HDL 还是高级语言,使用模块化方法都是一个好的做法,这样更容易理解和按需重用。
测试平台
在开发每个 HDL 或 HLS 模块时,它将需要测试以确保按预期执行功能。这正是测试平台发挥作用的地方。测试平台将激励应用于模块的输入和监视器。在高级情况下,它将在输出信号的动作执行完毕后进行报告。由于我们在设计中模拟每个寄存器的事务,因此逻辑模拟可能要慢得多。
虽然在概念上类似于软件测试工具,但测试平台可能需要进行更详细的交互,因为每个信号和总线必须正确驱动和计时才能激发模块。在读取激励设置或将结果记录到文本文件时,在测试平台中使用的语言构造更广泛。
模拟的一个关键要素是对于边角情况和边界条件的测试,这些情况可能会导致模块运行达不到预期。
要将测试平台应用于被测单元,需要使用(Vivado HLx 随附的)Vivado Simulator 等 HDL 模拟器,因为这样使开发人员可模拟逻辑设计。
在设备中实现之前模拟设计是常见的做法。但是,这意味着模拟的结果不考虑在所实现的设备中产生的计时延迟(例如建立和保持时间)。因此,它仅模拟功能的执行。虽然可在实现设计后用这些信息为模拟进行反标注,但这样做将显著延长模拟运行时间。
实现
当开发人员对功能的执行感到满意后,即到达开发的最后一个阶段,实现。
实现可分为四个不同的阶段:合成、放置、路由和生成编程文件。虽然实现由多个阶段组成,但使用所选设备供应商提供的专有工具(如 Intel Quartus 或 Xilinx Vivado)执行所有阶段。
合成取得 HDL 文件,然后将其合成为要实现的逻辑电路的描述。因此,合成决定可配置的逻辑单元、寄存器和块 RAM 以及目标设备中可用的其他专用逻辑资源的设置。正是在合成阶段,将进行大部分逻辑优化,并将修剪未使用的信号和变量。这可能会导致进行不需要的优化或合成决策。因此,开发人员可使用合成约束控制合成选项、策略和优化。约束为文本形式,并在合成工具运行时指挥它。
合成的输出是一个网表,它描述设计的逻辑行为。实现的下一阶段是真实地将每个逻辑功能放入设备。一般而言,放置器工具将使用内置算法,这些算法定义它如何将逻辑单元放置到设计中。但是,如果需要,用户还可通过使用放置约束而检查和移动逻辑单元的放置。当我们尝试在设计上实现时序收敛时,这种做法很有用。
映射逻辑功能后,即执行实现的倒数第二个阶段。必须使用设备中可用的资源按设计中所定义的那样连接这些映射的资源。此过程称为“路由”,而路由算法正是在此时使用所需的计时性能尝试并达到所需的工作频率。达到所需的工作频率称为“时序收敛”,表示设计中的每个寄存器和时钟要素达到所需的建立和保持时间。
如果未达到时序收敛,则可使用从选择不同的实现策略到更新放置约束的多种方法将对时序起关键作用的块靠得更近,以及在合成期间更新 HDL 设计以实现更理想的逻辑结构。
实现过程的最后一个阶段是生成编程文件,而该文件可用于配置目标设备。完成此阶段后,我们即可将它下载到设备,然后开始享受与更大范围系统集成的乐趣。
当然,集成对于 FPGA 开发人员和系统集成商可能会产生它自己的挑战。
结语
FPGA 开发过程显然与用于创建更加传统的计算解决方案的过程不同。但是,由于它涉及语言和工具链(尤其是 HLS),因此学习曲线并没有最初想象得那样陡峭。用充足的时间研究这些过程后,开发人员即可开始实现提供更高吞吐率、更低延迟和更高确定性的基于 FPGA 的解决方案。