本系列文章从数字芯片设计项目技术总监的角度出发,介绍了如何将芯片的产品定义与设计和验证规划进行结合,详细讲述了在FPGA上使用IP核来开发ASIC原型项目时,必须认真考虑的一些问题。文章从介绍使用预先定制功能即IP核的必要性开始,通过阐述开发ASIC原型设计时需要考虑到的IP核相关因素,用八个重要主题详细分享了利用ASIC IP来在FPGA上开发原型验证系统设计时需要考量的因素。
在上篇文章中,我们分享了第二到第四主题,介绍了使用FPGA进行原型设计时需要立即想到哪些基本概念、在将专为ASIC技术而设计的IP核移植到FPGA架构上时通常会遇到的困难,以及为了支持基于FPGA的原型,通常会对ASIC IP核进行的一些更改。本篇文章是SmartDV数字芯片设计经验分享系列文章的第三篇,将继续分享第五、第六主题,包括确保在FPGA上实现所需的性能和时钟两个方面的考量因素。
作为全球领先的验证解决方案和设计IP提供商,SmartDV的产品研发及工程应用团队具有丰富的设计和验证经验。在国产大容量FPGA芯片和IP新品不断面市,国内RISC-V CPU等IP提供商不断发展壮大的今天,SmartDV及其中国全资子公司“智权半导体”愿意与国内FPGA芯片开发商、RISC-V IP和其他IP提供商、集成电路设计中心(ICC)合作,共同为国内数字芯片设计公司开发基于本地FPGA的验证与设计平台等创新技术与产品。
主题5:我们如何确保在FPGA上实现所需的性能?
当已经在ASIC上实现的IP核被移植到FPGA中时,解决性能问题至关重要。在具有高时钟频率的ASIC上运行的电路,在原型上可能必须进行调整,以达到运行所需的时钟频率。甚至可能需要以较低的时钟频率或降低复杂性来运行电路。这里以PCIe接口为例,这样的接口在物理上是用ASIC中的几个通道(lane)来实现的,但在FPGA中可能必须限制为单个通道。
另一种解决方案是使用被称为“降速桥(speed bridge)”的电路。这种电路能够降低以高时钟速度输入数据流的频率,然后馈送至FPGA中以较低时钟速度运行的IP核进行读取。这时在IP核的输出端需要另一个电路,因为输出数据流必须重新相应地提高时钟。否则,输入和输出的数据将不会与电路设计的其余部分同步。
这样的解决方案在技术上非常复杂,并且通常只在硬件模拟器或专用ASIC原型设计平台中提供。两者的成本都是极高的,因此遵循前面描述的电路改变路径通常更有意义:实现适合FPGA的IP核,例如使用单通道PCI接口而不是在ASIC中通常使用的四通道。当然,这意味着IP核制造商在将ASIC的功能移植到FPGA的目标架构上时需要付出额外的努力;但结果是,FPGA的复杂性和资源占用程度都降低了,并且可以期望实现更高的时钟频率。
通常还需要使RTL代码适应FPGA特定的结构。相关的例子有乘法器、移位寄存器和存储器。FPGA具有所谓的“硬宏(hard macro)”,可以有效地实现复杂的电路。如果去构造一个由逻辑单元和寄存器组合而成的功能等效电路,而不是提供硬连线乘法器,这将导致一种带有许多“逻辑级别”上的实现,并且只能在FPGA上低效地映射。这反过来又导致可实现的时钟频率大大降低。ASIC是不会提供这种预先定义结构,因此必须调整RTL代码以使FPGA逻辑综合工具有机会去识别将要实现的功能。否则,有关该函数标识的信息(例如,乘法器、移位寄存器或存储器)可能会丢失。
同样,重要的是要确保主IP输入和输出的时钟是干净的。这是确保通过使用FPGA上提供的寄存器对物理输入和输出进行寻址的唯一方法。如果做不到这一点,它就不太可能满足时钟到输出规则的时序(tCO约束)要求。使用寄存的输入和输出通常是一种良好的设计实践,但必须注意要确保引入了良好电路设计这一要求。
图4:对于可靠的器件运行,诸如遵循时钟域交叉规则等良好的设计实践至关重要。
良好的设计实践是至关重要的。遵循时钟域交叉规则(CDC)可以支持可靠的器件运行,并避免发生时序违规。作为IP核的制造商,您有义务根据电路实现的通用规则开发您的产品。在具有一个以上时钟域的电路中,应特别注意避免亚稳态(metastable state)。从一个时钟域干干净净地过渡到另一个时钟域至关重要。为了实现这一点,必须在每种情况下选择最合适的变量。这可以是上面展示的通过寄存器级的简单同步,也可以根据需要通过更复杂的电路实现。一种可靠方法的案例是使用FIFO存储器。
主题6:在时钟方面必须加以考量的因素有哪些?
将IP核从ASIC移植到FPGA上时的另一个要点是时钟分布。这是指IP核中包含的时钟结构,如果电路有多个内部使用的时钟域,并且在IP核中生成所需的时钟,则该时钟结构的实现必须兼容FPGA。为了能够在FPGA上无故障地运行电路,同步时钟分布是必不可少的。事实上,这是避免过多的时钟偏移(clock skew)和不可预测的时钟延迟的唯一方法。这意味着内部生成的时钟既不是波纹时钟(从FF时钟分频器产生的时钟信号),也不是门控时钟(从组合逻辑门中派生的时钟,如多路复用器)。这种结构并不可靠,因为在时钟分布中会出现不可预测的延迟。
FPGA具有专门的时钟网络来分配时钟信号,以确保在整个芯粒(die)上没有明显的偏移。如果因为使用派生时钟而不使用这些时钟网络,这不仅会导致时序问题,还会导致故障。一方面,不能保证在寄存器逻辑上可以保持已设置时间,这是因为时钟信号在分配到所有寄存器中后难以计算的延迟。另一方面,不能保证时钟信号到达寄存器时钟输入端时的速度,会比数据信号到达用于电路实现的顺序单元的“D输入”端更快,这反过来又会导致在保持时间方面出现违规行为。
与ASIC设计相反,FPGA存在一个根本问题。在ASIC库中,为所有组件都定义了最短和最长时长。另一方面在FPGA中,时序分析只计算“情况最坏时的时间”——即最大延迟。正因为如此,数据信号也可以用比时序分析中的估计值更短的时间分配:因此,数据信号可以比时钟信号更早出现在寄存器中。为了解决这个问题,在可编程逻辑模块中经常使用一种兼容FPGA的时钟分布。不是使用许多不同的、彼此之间有明确联系的时钟信号,而是使用一个单一的时钟信号,并从其派生出使能信号(而不是分频时钟)。然后使用这些使能信号来实现所需的时钟域,结果是时钟域之间都是物理同步。
IP核内时钟分配的另一种可能性是使用锁相环/延迟锁相环(PLL/DLL),FPGA都有相应单元供开发者使用,他们也可被用于时钟生成。有必要使电路去适应目标架构,从而确保一个兼容的(同步)时钟分布。FPGA中的时钟分配要求与ASIC中的时钟分配要求不同。为了可靠地运行电路,可能需要更改IP核的RTL代码。理解这一点是重要的,即使完全相同的功能已经在ASIC上成功实现,情况亦是如此。此外,还需要提供特别用于FPGA的逻辑综合和P&R约束。
例如:如果使能信号被用于提供不同的时钟域,则所有的时钟控制单元(如FF、存储器)都要连接到一个主时钟上。这个时钟通常具有系统中最高的时钟频率。对于运行速度稍微比主时钟慢的时钟域来说,必须定义所谓的多周期约束。否则可能导致整个系统无法达到所需的时钟频率。在没有提供适当约束的情况下,时序估计假设所有时钟域都必须达到主时钟定义的系统时钟频率。当然,现实中并非如此;一大部分电路根本不需要达到这个频率,因为它们是通过使能逻辑控制的。反过来,缺少约束将导致时序违规。因此,在创建打算映射到FPGA中的电路时,就应该特别注意提供合适的逻辑综合和布局布线(P&R)约束。
即使在IP核具有多个时钟域的情况下,必须注意确保时钟比率是被明确地进行定义;在FPGA的启动阶段中,其设计是确保电路功能在定义的时间点覆盖所有的时钟域,并且通过使用一个合适的时钟生成器和适当的时序约束来避免时钟之间的偏移。
图5:PLL/DLL可用于在多时钟设计中创建一个已定义的启动序列。(图片来源:SmartDV)
PLL/DLL的用途并不局限于调偏、频率合成和时钟操作。另一个应用是以这种方式去设计FPGA的启动序列,电路功能在所有时钟域的规定时间内都能得到保证。PLL上电后自动锁定;无需额外重置。只有当时钟稳定时,复位才会解除。这在具有多个时钟域的电路中是必不可少的。
当然,这种预防措施只有在时钟彼此同步的情况下才有必要。在这种情况下,就需要通过相应的逻辑综合约束来定义相关时钟域的确切比例。这不仅需要提供带有相应设置脚本的RTL代码,还需要提供将IP核集成到电路中的所有必要的时钟约束和时序特例,如多周期路径和假路径约束。
需要注意的是,如果一个电路包含多个时钟,不仅要特别注意时钟结构,还要特别注意复位分布。如果没有特别注意到同步复位域,就不会以违反时序要求而终止运行,但可能导致电路故障。
图6:如果一个电路包含多个时钟,必须同时特别注意到时钟和复位分配。
为了无故障地使用IP核,时钟域的同步是必不可少的。在分配复位信号时,需要对复位域交叉采取适当的预防措施。原文链接:https://www.eeworld.com.cn/aOSCan9