FPGA的透明片上断言
Eddie Hung, Tim Todman, Wayne Luk
伦敦帝国学院计算系,英国 {e.hung,timothy.todman,w.luk}@imperial.ac.uk
摘要
在软件设计中广泛使用的断言,是插入设计中的语句,用于确保其行为符合设计者的预期。尽管断言同样适用于硬件设计,但通常仅在逻辑仿真阶段被支持,并在物理实现之前被丢弃。我们提出了一种新的与硬件描述语言无关的语言,用于描述对延迟不敏感的断言,以及将此类断言透明地添加到已布局布线的电路中的创新方法,且不影响原有设计。我们还描述了如何利用该语言及相关技术实现半透明异常处理。本工作的关键在于,通过将硬件断言和异常视为对延迟无感知或不敏感,断言逻辑只需使用空闲FPGA资源即可实现。我们采用网络流技术,通过冗余触发器将必要的信号路由至断言,从而避免任何性能下降,即使在大型设计中(在一个测试中占92%的片)也能保持良好表现。实验评估表明,即使在运行频率超过200兆赫的大型基准测试中,关键路径延迟也完全不受影响,仅带来轻微的功耗代价。
一、引言
现场可编程门阵列(FPGA)是一种通用硅技术,能够实现几乎任何数字设计。这种预制灵活性提供了通用的逻辑资源(例如查找表和交换式布线互连),可在实现时进行配置。将设计综合到FPGA上需要使用计算机辅助设计(CAD)工具,以计算这些资源中某个子集的可行配置,从而实现所需的电路。
现代FPGA器件可以超过200亿个晶体管;因此,(i)FPGA CAD可能耗时[1],并且(ii)由于CAD算法的启发式特性,综合解的质量可能不稳定。Rubin 和 DeHon [2]发现布线算法初始条件的微小扰动会使延迟变化17–110%。因此,电路修改需要重新综合——这一冗长的过程可能会产生更差的结果,影响设计人员生产力。
我们提出了一种解决方案,可透明地将新的、延迟无关的逻辑(例如片上断言)插入到现有设计中,而无需重新编译整个电路。我们将延迟无关电路定义为在计算结果所需的时钟周期数上没有严格约束的电路;一个示例是使用跟踪缓冲区记录芯片内信号行为 [3]:对跟踪信号进行流水线处理不会影响可观测性。另一个示例是在系统无响应时触发电路复位。延迟无关电路的关键优势在于,它们引入了一个新的综合灵活性维度,从而实现透明插入。
传统上,由于无限的信号可见性、快速的重新编译周期以及类软件仪器,数字电路一直使用逻辑仿真环境进行开发。然而,随着设计变得日益复杂,电路仿真速度变慢,进而导致电路测试不够充分,并降低了设计人员生产力。
一种有前景的方法是使用片上断言[4]在运行时验证设计。由于它们与被测设计在同一电路中运行,片上断言可以比仿真快得多,从而使测试更加充分。片上断言可以是延迟无关的,因为设计者通常更关心是否有任何断言被违反,而不是需要立即收到警报。
我们插入额外的逻辑,例如断言,透明地,且不影响性能或功能。因此,我们在布局布线后插入,仅使用原始用户电路未使用的空闲FPGA资源。通过使用此类互斥资源,可以在不影响用户设计的情况下添加新功能。为了消除对原始设计关键路径的任何影响,我们利用其延迟无关的特性,对新电路进行激进流水线处理。我们的方法允许甚至大型电路也能被如此增强——我们已在使用大型FPGA多达92%切片的电路上进行了测试。因此,我们做出了以下贡献:
- 一种回收FPGA上未使用的空闲资源的方法,用于在电路实现后透明地插入新逻辑,例如电路内断言。
- 一种基于布尔逻辑的断言语言,允许在高层次上描述断言。
- 使用最小代价图流技术同时对所需逻辑的所有输入信号进行流水线与路由,且不影响电路时序。
- 扩展到电路内异常,允许在不重新运行布局和路由的情况下修复某些电路错误。
- 实验验证表明,我们的技术仅带来较小的功耗代价。
本文其余部分的组织如下:第二节回顾相关工作,第三节展示我们的断言语言;第四节详细描述我们的透明插入方法。第五节描述异常处理。第六节和第七节对方法论进行评估并展示实验结果。最后,第八节总结全文,并概述未来工作。
本文首次提出的核心概念见于[5]。此后,我们开发了一种新语言来描述延迟无关的断言和异常。该高级语言能够紧凑地描述复杂断言,并可转换为多种设计描述。
II. 背景和相关工作
延迟不敏感设计
我们利用插入无延迟感知逻辑的灵活性——即对组件间通信延迟不敏感的逻辑。无延迟感知逻辑的一个示例是用于记录片上信号活动以进行调试的跟踪缓冲区;对每个被跟踪信号进行流水线处理不会影响其可观测性。延迟不敏感设计[6]是一种创建对组件间通信延迟不敏感的设计的方法论,允许工具对其进行任意流水线处理以满足性能标准。这种改进的灵活性是以增加面积开销为代价的,并且不适用于通信局部性较差的设计。请注意,只有我们添加的元素是延迟不敏感的:设计的其余部分无需如此。
片上断言
断言指定了如果设计正常工作则应始终为真的布尔条件。在软件中的一个例子是“malloc()”系统调用必须返回非零值;在硬件中的一个例子是检查加法器的进位输出位始终为“0”,以表示未发生溢出。尽管像在仿真中那样停止硬件原型可能并不现实,但如果任何断言失败,仍然有必要向设计者发出警报。断言可以是组合的,也可以包含状态,例如,检查每次DRAM访问延迟都在某个界限之内,甚至检查统计特性[7]。
硬件断言是SystemVerilog语言标准(SVA)[8]的一部分,也可以使用属性规范语言(PSL)[9]进行描述。通常,这些结构仅由逻辑仿真器或形式验证工具支持,并在硬件实现中被丢弃,尽管研究人员已提出将其扩展到硅片中[4],[10]。然而,以往的方法通过修改原始硬件描述并重新综合整个电路来插入断言——HLS断言可能导致FPGA性能下降3%[4]。尽管增量编译方法可以加速该过程,但通常需要预先对原始电路进行划分,以预留断言所需的空间。
FPGA工具中的网络流算法
一个流程网络是一个图 G(V, E),包含一组顶点 V 和一组有向边 E,每条边连接两个顶点并具有容量 u ∈ N。当满足以下条件时,存在一个有效流解:(i) 每条边承载的流不超过其容量;(ii) 所有顶点处满足流守恒——进入某顶点的所有流之和必须等于离开该顶点的所有流之和,但源和汇两个顶点除外。源节点只能产生流;汇节点只能消耗流。单商品网络中仅存在一种类型的流。
存在用于计算单商品网络最大整数流的高效算法(多商品最大整数流已知为NP完全),这些算法已应用于FPGA CAD。FlowMap[11]在FPGA技术映射过程中采用最大流算法(具体为其对偶形式,即最小割)来生成逻辑深度最小的映射后的网表,而Lemieux等人[12]则使用最大流算法评估稀疏FPGA开关矩阵的可布线性。
结合最小成本和最大流算法的参考文献为[3],其中这些算法用于在FPGA调试期间将信号连接到跟踪缓冲区。相比之下,我们在本工作中,将信号集中到单个区域(而不是连接到分布在器件各处的跟踪缓冲区),且不影响电路性能。尽管先前的研究报告指出,添加跟踪缓冲区连接会使最高时钟频率从75兆赫降低到55兆赫,但我们通过流水线化信号布线来消除对性能的所有影响。
最近关于增量触发电路插入的工作[13]利用空闲FPGA资源插入触发电路以启用调试缓冲区。与我们方法不同,本工作由于未对信号进行流水线处理,导致关键路径延迟惩罚高达107%。
III. 断言语言
我们开发了一种基于布尔逻辑的高级语言,用于描述片上断言,并展示了通过系统化翻译到VHDL等目标语言的实现方法。由于断言采用高级语言编写,因此独立于特定实现,从而可在不同但相关的设计之间潜在地重复使用。
与工业断言语言(如SVA)相比,我们的断言语言对应于SVA的并发断言,每个周期评估一次,并与设计代码并行运行。我们的语言不支持SVA的立即断言,因为这些断言依赖于仿真概念,例如delta时间。与SVA不同,我们的断言不限于VHDL设计,还可以针对其他描述语言,如Verilog和OpenSPL。
断言语言包含适用于复杂设计的有用原语:包括浮点数的算术表达式、计数器和累加器,使得无需使用VHDL中的低级原语即可实现复杂的断言条件。延迟功能可使断言与流水线电路的延迟量相匹配。用户可以声明外部硬件模块,从而在断言条件中使用特定设计原语。
扩展巴科斯‐瑙尔范式语法如下(A∗表示零次或多次重复,A?表示可选项,粗体文本表示关键字,大写表示字面量):
d = userID(<e(,e)*>)? (e(,e)*) ({latency=e})?
| assertionID(<e(,e)*>)? (tID(,tID)*) {s;(s;)*}
t = int<e> | uint<e> | t[e]
s = varID = e
e = true | false | INT | FLOAT
| e • e | e ◦ e | −e | ¬e
| [e(:e)?]
| accum(e,e)
| counter(e,e)
| delay<e>(e)
其中,
d
是声明,包括可用于断言中的用户定义模块,这些模块使用尖括号中的静态(通用)参数和圆括号中的运行时参数,以及可选的延迟规格,或包含静态且带类型的通用参数的断言声明;
t
表示具有已声明位宽的类型——仅支持有符号整数、无符号整数及其数组;
s
将表达式赋值给变量——一旦赋值,变量不可重新赋值;
e
声明表达式:◦ ∈{+,−, ∗,/,<,≤,>,≥}(具有通常优先级的算术表达式);
e1 @ e2
将
e1
与
e2
进行位连接;INT 和 FLOAT 分别表示整数字面量和浮点数字面量;
e1[e2]
根据
e1
的类型选择位置
e2
处的单个位或数组元素。
e1[e2:e3]
选择位范围
e2
到
e3
(包含);
accum(e1, e2)
对表达式
e1
的值进行累加,当
e2
为真时重置为零;
counter(e1, e2)
从
e1
到
e2
以单步方式重复计数;
delay<e1>(e2)
将
e2
延迟
e1
个周期。
转换为延迟无关的断言
我们系统地将断言语言转换为延迟无关的实现。该转换是语法导向的,从断言条件的根节点递归地进行到叶节点,叶节点为原子命题或布尔字面量(true 或 false)。每个操作符一一映射到实现中的一个模块——例如,对应实现该操作符的 VHDL 模块。唯一的限制是,从每个电路输入到电路输出的循环延迟必须相同,以确保所有数据同步。该电路可以任意流水线化,以满足被测设计的时序要求。我们自动插入流水线寄存器,使用简单的 ASAP(尽可能早)算法,确保来自同一周期的输入在整个图中保持在同一周期到达。
示例
一个断言检查信号
C
在范围
[L, H]
内:
1 断言 inRange<L, H>(uint<32> C) {
2 (L <= C) ∧ (C <= H);
3 }
其中第1行声明了一个断言,包含两个编译时参数L和H(位于尖括号内)以及一个运行时参数C;第2行是一个表达式,用于检查C是否在范围[L, H]内。这可用于任何需要值处于指定范围的场景,例如确保软核CPU仅从有效内存空间读取指令。
IV. 透明逻辑插入
图1展示了我们通过六个步骤在电路中插入新逻辑透明电路的方法:步骤1像往常一样编译用户电路(例如,使用Xilinx ISE),无需预先保留任何资源,也不需要在常规编译过程中指定额外的约束。步骤2检查已编译结果的布局规划,识别出一个利用率低的区域(通常位于器件的外围),该区域可用于容纳任何新逻辑。目前,此步骤是手动完成的;未来工作可实现其自动化。
步骤3应用最小费用流技术,通过流水线寄存器将断言电路所需的用户信号(可能分布在整个器件上)传输到其附近。流水线级的确切数量以及各级之间的最大距离由用户参数决定。至关重要的是,仅使用原始电路未占用的空闲逻辑和布线资源——这使得我们的方法具有透明性。
根据步骤3的结果(该步骤指定了包含流水线中使用的所有触发器位置以及用户电路占用的所有逻辑资源的模板),步骤4应用厂商工具对实现新逻辑的独立电路进行编译(但不进行路由),该新逻辑根据此模板定制,并且同样仅使用那些冗余资源。由于该新逻辑电路与原始用户电路互斥,步骤5将来自步骤3的已流水线化并布线的电路与来自步骤4的新布局的电路合并。最后,步骤6使用厂商工具完成合并后的电路内部的未布线连接(从最终流水线阶段连接到新电路,以及新电路内部的连接)。
对于使用相同预布线信号集的新功能(情况(i)),如图1所示,仅需重复步骤4到6。然而,对于操作尚未路由信号的新逻辑(情况(ii)),还必须重复步骤3,以为任何新信号计算新的流水线化连接。
流水线与布线
该工具流程的一个关键能力是将分布在器件各处的电路信号传输到一个集中区域,作为新电路的输入,同时仅使用冗余资源。直接布线这些信号会导致较大的与距离相关的布线延迟。为了缓解可能引入新的关键路径的这些延迟,我们对信号进行流水线处理。由于我们的方法针对的是延迟无关逻辑,因此增加额外的流水线级数是可以接受的。尽管每个被路由信号的扇出增加了一,但这不太可能影响整体设计时序。现代商用现场可编程门阵列包含带缓冲的布线——为现有网络增加一个额外的布线分支只会带来很小的电容负载;在我们测试所用的Xilinx平台上,时序分析报告其影响为< 5ps。
我们将现场可编程门阵列布线资源图(移除用户电路占用的节点后)使用与[3]类似的技术转换为流网络,并采用最小费用流技术将所有必要信号从候选集路由到唯一的流水线寄存器。该特定布线问题的一个重要自由度(在用户布线中不存在)是每个信号可以连接到候选集中的任意寄存器;这即使在受限情况下也提供了显著的布线灵活性。我们的方法不同于传统CAD工具所采用的分离的布局与布线阶段;在某些方面,我们的工具可被视为同时进行信号路由、解决拥塞以及放置流水线寄存器simultaneously。此外,与参考文献[3]不同,我们并不寻求具有最大信号可观测性的布线解决方案,而是使用流算法在信号流水线过程中同时执行布局和布线。
给定流网络中每条边的时序估计(代价),目标函数最小化的是每个连接的平均情况时序,而不是决定关键路径延迟的所有连接中的最坏情况时序。然而,我们的实验表明,当用户通过流水线跳数以及每跳到锚点的距离保守地选择候选寄存器集合时,我们的方法可以返回不增加关键路径延迟的解决方案。需要指出的是,我们并未应用最小费用流技术来寻找最优时序解决方案,因为出于以下原因:a) 由于网络流问题的特性,我们只能针对平均情况时序进行优化;b) 我们以启发式方式修改网络,以引导算法行为,但这些修改并不能真实反映器件的情况;c) 尽管每次应用最小成本流都被证明可以找到全局最优解,但在以迭代方式(分段地)应用于每个流水线阶段时,无法再保证整体最优性。因此,我们认为该流方法是解决此类布线问题的一种有效启发式技术。
在我们的工具中,候选寄存器集合被定义为位于距(X, Y)锚点位置的用户指定半径范围内的冗余触发器。冗余触发器可能存在于部分被用户电路占用的逻辑片内(必须确保此类逻辑片与所传输信号属于兼容的时钟域),或存在于未占用站点中。由锚点和半径确定的区域是一个圆(如果被FPGA边界截断,则为一个片段)。通过在多次路由过程中迭代地减小该圆的半径,从而逐步减少流水线寄存器的候选集,可以将信号迁移到锚点位置,但每次流水线跳转会带来额外延迟。图2说明了这一点:在每次迭代中,位于候选区域外的信号被路由到该区域内成本最小的触发器;而已经位于区域内的信号则被路由到区域内的另一个触发器,以保持信号之间的延迟。
为了引导最小成本流算法找到有效的布线解决方案,我们对网络进行了两项启发式修改。首先,我们对所有跨越FPGA时钟区域的网络边施加惩罚。在大多数器件中,所有资源都仅属于一个时钟区域,由于时钟网络的设计,跨区域传输的信号会产生时钟偏移。在我们的实验中观察到,有时最小成本算法会返回跨越两个不同区域的非常短的布线路径,这些路径结合正向时钟偏移,会导致保持时间违规。为了抑制此类路径,我们对所有此类边添加了放大的延迟惩罚。其次,我们观察到最小成本算法可能会连接到其输出引脚因布线拥塞而被阻塞的流水线寄存器。鉴于我们采用分段方式布线信号,单次最小成本迭代无法理解下一次迭代的可布线性。为缓解此问题,在候选触发器选择期间,我们会剪除那些剩余空闲扇出不足以支持下游使用的寄存器。
V. 异常:半透明逻辑插入
我们的方法以透明的方式插入逻辑(电路行为得以保留),但透明插入的能力存在局限性;本质上,我们仅限于添加额外的电路输出。在本节中,我们将方法扩展为允许对电路行为进行有限的修改(放弃严格透明性),从而能够纠正电路中的错误。类比软件,我们将这些新增部分称为异常;与软件异常类似,它们允许进行错误纠正和恢复。我们将这些新增部分称为半透明:它们仅影响被替换的电路信号,而不会直接影响电路的其余部分。
激励示例
上一节使用了范围检查:检测电路信号(例如软处理器中的程序计数器)是否处于有效范围内。纠正程序计数器时,例如可用服务例程的地址替换错误值,从而让操作系统软件处理该错误。我们的方法适用于可容忍有限延迟的异常情况——例如流水线处理器的程序计数器。
异常的断言语言扩展
我们扩展了断言语言以支持异常。与软件异常不同,每个异常与一个断言一一对应。扩展巴科斯‐瑙尔范式语法如下:
d = ··· | assertionID(<e(,e)*>)? (tID(,tID)*) {s;(s;)* catch{ID = e}}
其中,额外的产生式允许断言声明包含一个异常处理程序:一条赋值语句,允许覆盖传递给断言的某个运行时参数。
程序计数器范围检查器可以如下所示:
1 断言 inRange<L,H,OutOfRangeTrap>(uint<32> C){
2 (L <= C) ∧ (C <= H);
3 catch{
4 C = OutOfRangeTrap;
5 }
6 }
其中第1‐2行像之前一样声明断言;第3‐4行声明一个异常处理程序,如果断言被触发,则使用OutOfRangeTrap(软件处理程序的地址)覆盖电路信号C的值,如果断言失败。
实现
图3展示了我们使用第四节方法的实现:SRC是带有相关断言和异常的电路信号。首先,断言和异常逻辑的输入被传输到备用(可能是不连续的)逻辑区域,断言和异常位于该区域中。接着,我们再次应用流水线与路由方法,将断言条件和异常值传回其原始驱动器。一个多路复用器根据断言条件在SRC和异常值之间进行选择,并尽可能重用现有布线。请注意,从SRC经异常路径到SRC’的周期总数延迟等于经过异常电路和断言电路的延迟之和(这两个电路必须均衡),且可能需要小于某个约束值(例如处理器流水线深度)。尽管这两个电路必须保持均衡,但并不需要固定为某一特定值;此外,该延迟可以在输入链路、输出链路以及备用区域之间任意分配,以进一步提高CAD灵活性。
语义与正确性:显然,添加异常并非完全透明,因为如果断言引发异常,则电路行为会发生改变。然而,只要满足以下两个条件,便可保持电路时序:1)被监测信号SRC不在关键路径上;2)额外的多路复用器不会使从SRC到其下游读取单元的路径变为关键路径。
即使保持了时序,电路仍可能不正确:如果触发了断言,被监控信号将延迟几个周期,因为它需要经过流水线‐和路由网络以及断言和异常逻辑。对于某些应用而言,这并不重要:视频或音频应用的数据路径可能能够容忍几个周期的延迟。在程序计数器示例中,处理器会运行几个周期(但在任何错误计算被清除之前)跳转到陷阱例程:异常值将替换程序计数器。
摘要:扩展我们的方法以允许异常,在断言被触发时用异常值替换电路信号,这种方法并非透明,但如果小心避免改变关键路径或引入新的关键路径,则在某些应用中可能有用。通常情况下,生成的电路可能并不完全相同;然而,对于某些有用的应用,该方法允许在不重新运行耗时的布局和路由过程的情况下修正电路。
VI. 评估方法:赛灵思
尽管我们认为我们的技术可应用于所有FPGA厂商,但我们是在赛灵思技术上评估我们的工作。在评估过程中,我们首先使用Xilinx ISE v13.3编译原始用户电路(图1中的步骤1)。对于有时序约束的设计,我们将这些约束应用到ISE中;而对于没有时序约束的设计,我们在“性能评估模式”下运行ISE,该模式会从电路中推断所有时钟并最小化其周期。在步骤2中,我们在赛灵思的FPGA编辑器中打开已编译的设计以查看其布局规划,并识别一个利用率低的区域来容纳任何新电路。
接下来,步骤3 使用命令
xdl ‐ncd2xdl
将 ISE 返回的布局布线后的网表从其专有的二进制格式 NCD 转换为赛灵思设计语言格式 XDL。XDL 格式是可读的,包含对赛灵思网表的完整描述:从查找表掩码、组件布局、源引脚和目标引脚,甚至每个已布线网络所包含的各个导线。工具包(如 Torc [14])可以操作此格式。解码电路后,我们应用流水线与布线工具(使用Torc操作XDL,并使用LEMON [15]进行流计算)来执行第二节中描述的流程。图4说明了该过程:给定一个XDL电路网表、一组待布线信号(可能是匹配XDL网表中网络的正则表达式)、它们的时钟域,以及候选寄存器集合(由锚点(X, Y)和半径 r 指定),该工具应用我们的技术将所有信号传输到该区域内的流水线触发器。输出结果是一个以XDL格式表示的增强型电路网表,以及可用于在下一步构建新电路的模板:一个 Verilog文件,用于指定所有流水线寄存器的位置;以及一个 Xilinx用户约束文件(UCF),用于指明器件上哪些资源已被占用(使用PROHIBIT约束)。我们的流水线与布线工具是可重入的:输出的网表可以作为下一次布线运行的输入网表,从而允许对该流程针对每个流水线跳转迭代执行。
步骤4采用上一步生成的模板,向源代码中添加新功能,并使用ISE对该电路进行综合和布局(不进行布线)。UCF约束文件强制实现以下两点:1)用户电路与断言电路之间的逻辑资源互斥性;2)利用AREA_GROUP约束,使赛灵思布局器仅使用步骤2中确定的宿主区域。需要注意的是,目前在赛灵思工具流程中,对布线资源实施互斥性约束是不现实的(或许不可能)。在步骤5中,我们将添加的电路转换为 XDL,然后使用自定义工具将其与步骤3中的电路合并。
最后,步骤6使用命令
xdl ‐xdl2ncd
将合并后的XDL电路转换为NCD格式(同时调用设计规则检查(DRC)),并在可重入模式下调用布线器,以:1)对新增加的电路进行布线,2)完成从最终流水线阶段到新电路输入端的最后一英里布线。我们设置RCT SIGFILE环境变量,以强制仅使用_空闲布线资源,而不是拆除用户电路网络。
我们的目标是Xilinx ML605评估套件,该套件包含一个 Virtex6 FPGA(xc6vlx240t),在由 162×240个slice组成的阵列中集成了150,000个六输入查找表。我们采用了四个基准测试,选择它们是因为其复杂性和高时钟频率:LEON3,一种片上系统设计;两种AES编码器/解码器的变体;一个浮点数据路径。对于每个基准测试,我们插入断言以验证其正确运行。
| 实验1:LEON3片上系统 | 实验2:AES(3对) | 实验3:AES(2对) | 实验4:FloPoCo |
|---|---|---|---|
| 本工作 | 重新合成 | 本工作 | 重新合成 |
| 用户电路: | |||
| 切片利用率 | 30,698 (81%) | 34,880 (92%) | 26,362 (69%) |
| LUT利用率 | 82,830 (54%) | 108,132 (71%) | 71,976 (47%) |
| 寄存器利用率 | 60,725(20%) | 32,022(10%) | 21,391(7%) |
| 关键路径延迟 | 13.324纳秒 | 4.213纳秒 | 4.153纳秒 |
| 管道和布线路板: | |||
| 信号已布线 | 240 | - | 384 |
| 切片利用率 | 30,720 (+22) | - | 34,985 (+105) |
| LUT利用率 | 82,925 (+95) | - | 108,264 (+132) |
| 寄存器利用率 | 61,205 (+480) | - | 33,942 (+1,920) |
| 关键路径延迟 | 13.324纳秒 | - | 4.213纳秒 |
| 流水线延迟 | 2 | - | 5 |
| 断言电路: | |||
| 切片利用率 | 30,770 (+50) | 33,642 | 35,140 (+155) |
| LUT利用率 | 83,078 (+153) | 82,489 | 108,831 (+567) |
| 寄存器利用率 | 61,454 (+249) | 60,973 | 34,636 (+694) |
| 关键路径估计 | 3.729纳秒 | - | 2.436纳秒 |
| 断言延迟 | 3 | 3 | 8 |
| 最终电路: | |||
| 关键路径延迟 | 13.324纳秒 | 13.327纳秒 | 4.213纳秒 |
表I:我们提出的方法与重新合成方法的详细比较。
编码器+解码器。)
基准测试1:LEON Aeroflex Gaisler LEON3[16]是一款开源的VHDL多核SoC设计,能够启动Linux,可通过参数化来自定义SPARC核心的数量、大小和配置以及片上外设。我们将 LEON3配置为8个核心,每个核心具有64kB的指令缓存和数据缓存,并配备内存管理单元、DDR3存储控制器、以太网和 CompactFlash外设。LEON3 ML605模板将主SoC时钟限制为 75兆赫(13.33纳秒)。
基准测试2和3:高级加密标准 对于面向数据路径的基准测试,我们构建了128位高级加密标准编码器/解码器的两个变体;图5展示了3对变体的框图。该电路源自[17],经过修改后在每个高级加密标准轮次中插入了一个额外的流水线级,提升了性能,但将编码和解码延迟增加到了20 个周期。该基准测试的优点在于其完全自激励(明文和编码器密钥输入均由线性反馈移位寄存器生成),并且具备自检能力,每个编码器都配有一个解码器,可将解码结果与通过偏移LFSR重新生成的原始明文输入进行比对验证。
基准测试4: FloPoCo 最后,我们使用 FloPoCo [18] 构建的浮点数据路径。我们使用 P 个 W抽头的单精度浮点移动平均滤波器的并行副本。每个滤波器的输入由一个 32 位线性反馈移位寄存器激励;对于 400兆赫的目标频率,FloPoCo 返回的电路具有 45 的流水线延迟。为了生成中等利用率的电路,我们选择 P=24, W=8 并在 ISE 中禁用移位寄存器提取(这会将流水线寄存器转换为移位寄存器),从而创建一个具有更高触发器利用率的基准测试。
七、结果
A. 实验1 — 针对 LEON3的简单片上断言
我们插入一条断言,用于检查 8 个核心中每个核心的程序计数器是否位于存储控制器的内存空间内,确保指令仅来自主存。使用我们的断言语言,该断言在第三节中展示;我们系统地将其转换为实现。
未修改的 LEON3 基准测试消耗了 81% 的逻辑片和 54% 的查找表资源,满足 13.33纳秒(75兆赫)的时钟约束(表 I,第2列)。检查布局规划后发现,器件左上方存在一个利用率低的区域;锚点为 (0,185)。我们调用两次流水线与布线(图1中的步骤3),通过两个阶段将信号传输至该锚点,半径分别为160和80。总共路由了240位:包括8个核心中每个核心的30位程序计数器(最低有效位中的2位未使用)。最终生成的电路消耗了适度的额外资源(来自现有和新的片的寄存器,以及用作直通路由的查找表)。
接下来,我们综合断言电路(步骤4);它在流水线电路中占用了50个片切和153个查找表。由于断言较为简单,其流水线电路的布线前关键路径时序估计为3.73纳秒(实际上,估计的关键路径位于最后流水线阶段和断言电路之间),轻松满足13.33纳秒的电路约束。在将断言电路与用户电路合并并进行布线后(步骤5和6),我们发现未引入新的关键路径,且电路在13.32纳秒下满足时序要求。
我们将透明逻辑插入的效率与在源代码级别添加断言并重新综合整个电路的传统方法进行了比较。为了确保公平性,我们手动修改源代码,通过电路层次结构将关注信号引出,并将其连接到相同的断言HDL实例上。表I中“重新综合”标题下列出了结果。最终结果显示,在本实验中,由于两个电路都满足约束条件,因此对时序没有影响,但设计者仍需针对每组断言重新综合其电路。有趣的是,逻辑资源上存在显著的10%差异。
(不包括步骤3、流水线与路由)和用例(ii)(包括)的运行时间。)
图6 绘制了我们方法的运行时优势。在此基准测试中,透明插入断言比重新综合快 3.9 × 倍。对于流水线与布线,运行时间主要由使用厂商工具进行的最终布线决定。
B. 实验2 — 针对高级加密标准的有状态断言(3对编解码器)
我们的第二个实验将有状态断言逻辑插入到一个具有高最高时钟频率和高器件利用率的电路中:带有3对编解码器的高级加密标准(图5)。
使用我们的断言语言,该断言为:
1 用户 uint<128> deAES(uint<128>, uint<128>)
2 {延迟=N };
3 断言 checkAES(uint<128> msg, uint<128> key1,
4 uint<128> key2, uint<128> key3, uint<128> enc ){
5 delay<4*N>( msg) ==
6 deAES( delay<3*N>(key1),
7 deAES(delay<2*N>(key2),
8 deAES(delay<N>(key3),enc))) ;
9 }
其中,第1‐2行声明了高级加密标准解码器(一个延迟为N的用户定义模块deAES),第3‐7行将断言定义为一系列高级加密标准解码器;延迟密钥以平衡解码延迟。
该电路使用了71%的查找表和92%的逻辑片,表明我们的方法适用于大型设计。AES电路没有时序约束,因此我们在性能评估模式下运行ISE以获得最佳时序;为减轻CAD噪声的影响,我们使用五种不同的布局种子(布局器代价表)进行编译,最佳结果得到的关键路径延迟为4.21纳秒,即 237兆赫。表II列出了五个种子的全部时序数据。
检查原始电路布局(图7a),我们发现器件的右上区域利用不足,因此调用我们的工具五次,将信号流水线与路由到该区域。我们选择最右上角的坐标作为锚点位置 (161,239),并在每次迭代中使用递减半径:200、160、120、80、40。所选信号来自3个编码器的128位总线(具体为十轮编码中的第五轮的key_out[127:0]寄存器),共计384个信号。图7b显示了所使用的流水线触发器,每次迭代在黄色和绿色之间交替。
安全加密函数的输出应该是均匀分布的;其输出应类似于均匀随机数生成器。单比特测试 [19] 用于统计数据流中 ‘1’的数量。在长序列中,‘0’和‘1’的数量应在某个统计边界内相等。我们将三个这样的断言附加到AES电路中,每个编码器一个,然后将这些结果进行与操作,驱动一个片外LED。单比特测试电路在每128位向量中统计‘1’的数量,并在256个周期内累积(形成一个32,768位的数据流)比特)。范围检查测试验证“1”的数量是否在界限内:对于统计显著性p值< 0.01,结果为 32768 / 2 ±466。总共,这三个单比特电路消耗了155个逻辑片和567个查找表,布线前时序估计为2.44纳秒。
使用我们的断言语言,单比特测试如下所示:
1 用户 int<N> popcnt(int<2^N>);
2 断言 monobit(int<N> 输入, int<15> A,
3 int<15> B) {
4 var count = counter(0, 256);
5 var inp = accum(
6 ((popcnt(输入[127:96]) + popcnt(输入[95:64])) +
7 (popcnt(输入[63:32]) + popcnt(输入[31:0]))),
8 count == 0);
9 (A < inp) ∧ (inp < B);
10 }
其中第1行声明了一个用户定义模块用于计算高位数量;第2至第9行构成断言,声明一个计数器(第4行),在计数器非零时累加种群数量(第5至第8行),并测试范围条件(第9行)。
图7b显示了最终合并电路平面图:断言电路逻辑以白色表示;一条信号的流水线信号布线以青色表示。在对合并后的电路进行布线并保留所有现有用户网络后,通过Xilinx工具进行的静态时序分析显示对关键路径没有影响;该电路在237兆赫下仍满足时序要求。
与重新综合电路(带断言)相比,在五个布局种子下,原始电路和插桩电路之间的关键路径延迟影响可忽略不计(改善7ps)。偶然情况下,两种情况下的最佳布局均在种子值为5时获得;检查其他种子(表II)显示两种综合方案之间存在显著差异:对于默认种子值1,这种时序影响超过10%。该电路采用透明方法的运行时间改进为3.0倍;虽然由于这是一个复杂度较低的电路(仅一个时钟域),布线运行时间有所减少,但我们必须调用流水线与布线工具五次。
C. 实验3 — 针对AES(2对)的复杂断言
使用2对AES编码器/解码器电路,占用69% 47%的逻辑片和47%的查找表,运行频率为241兆赫兹。在此基准测试中,我们将来自两个编码器模块的两组 128位总线(共512位)路由到器件的右上区域,并对每组应用更复杂的模式计数器测试。该测试将每个128位值划分为不重叠的4位段,统计每个4位模式的出现次数。与单比特测试类似,在长比特流中,所有 2⁴=16种可能的模式应等概率出现。四个模式计数器占用了1,155个逻辑片和4,262个LUT。
使用我们的方法不会影响原始的关键路径延迟(4.15纳秒)。在源代码级别插入相同的断言并重新综合后,关键路径延迟恶化至4.32纳秒(232兆赫兹)。该断言代码类似于单比特测试。
C. 实验4 — FloPoCo断言
最后一个实验使用了我们的 FloPoCo设计。在禁用移位寄存器提取的情况下,该基准测试占用了全部逻辑片的65%,全部查找表的41%,关键路径延迟为 6.23纳秒(160兆赫兹)。该断言检查流水线中每个抽头处是否存在无穷大或非数条件。每种条件在FloPoCo的内部格式中由一个置位的比特表示;对于所有抽头,总共为144位。
我们构建了一个优先级编码器,将144位输入转换为8位编码输出,以帮助设计者定位故障,而不仅仅是指示是否有断言失败。
FloPoCo 断言可以定义如下:
1 用户 uint<3> pri(uint<8>) { 延迟=... };
2 断言 inRange(uint<34> input[24][8]){
3 pri(input[0][0][32]@ input[0][1][32]@...
4 @ input[0][7][32])
5 @ pri(input[1][0][32]@...@ input[1][7][32])
6 ...
7 @ pri(input[23][0][32]@...@ input[23][7][32])
8 @ pri(input[0][0][33]@...@ input[0][7][33])
9 ...
10 @ pri(input[23][0][33]@...@ input[23][7][33]);
11 }
其中第1行将优先级编码器声明为一个用户定义模块,第 2‐10行定义了断言,该断言的输入是一个32位浮点数数组,并连接了优先级编码器的输出,这些优先级编码器的输入是每个数组元素的第32位和第33位——即每个并行滤波器中每个抽头的非数位和无穷大位。我们断言语言的未来版本将增加循环功能,以简化重复性断言的生成。
该断言电路也被成功添加到用户电路中,且未影响关键路径延迟,而使用相同布局种子进行重新综合后,最大频率从160兆赫兹降至低于100兆赫兹。在五个种子下,最佳的重新合成结果为162兆赫兹,如表II所示。
| 实验1: LEON3 | 实验2: AES x3 | 实验3:AES x2 | 实验4:FloPoCo |
|---|---|---|---|
| 时钟速度 → | 75兆赫 | 66兆赫 150兆赫 | 66兆赫 200兆赫 |
| User | 3.32万 | 6.00万 | 11.42万 |
| 重新合成 | 3.32万 | 6.03万 | 11.57万 |
| 本工作 | 3.32万 | 6.09万 | 11.68万 |
表III:测得的功耗。
E. 功耗评估
最后,我们研究了带断言和不带断言电路的功耗情况。我们利用ML605对片上功耗测量的支持(通过 Virtex6的系统监控器)——表III中的结果显示了功耗数据:原始用户电路在无断言检查时的功耗;在源代码级别添加断言并对整个电路进行重新综合后的功耗;以及本文提出的透明方法的功耗。所有功耗测量均使用ChipScope分析器,在芯片温度稳定后,对128秒内的数据取平均值。
在实验1中,我们在SoC上启动一个支持最多4核的 Linux镜像,并使用来自/dev/urandom的gzip实例对每个核心进行压力测试。对于基于自激励AES基准测试变体的实验2 和实验3,我们在两个不同的时钟频率下收集结果。遗憾的是,在200兆赫下运行‘AES x3’导致器件温度/电流过高,触发了电源调节器的关断机制,因此我们仅展示150兆赫下的结果。
结果表明,不出所料,添加额外的断言电路会增加功耗——重新综合平均增加2%,我们的技术平均增加4%。尽管重新综合可能比原始用户电路更高效(由于更密集的布局决策导致面积更小),但我们的方法由于需要通过流水线寄存器将所有断言输入传输到一个区域以供给断言电路,因而消耗更多功耗。这引入了多跳的额外开关活动,而在重新综合方法中并不存在这种情况,因为后者可以将断言逻辑分布在靠近信号源的位置而无需流水线。对于集成了断言逻辑并经过重新综合的电路而言,除非使用额外的门控技术,否则这2%的功耗开销是永久性的;而对于我们的方法,这种开销只是临时的——如果不再需要断言逻辑,可以通过恢复至原始比特流来消除这4%的开销。
第八节. 结论
我们提出了一种以与硬件描述语言无关的方式描述电路内硬件断言的语言,并介绍了将延迟无关的断言电路透明地插入综合后电路的方法。我们的流程在用户电路完成后布局布线后,仅利用冗余资源插入新的电路after;断言可以被添加、修改或移除,而不会影响原始电路。为了保持关键路径延迟,我们对新插入的电路及其输入信号的路由进行激进流水线处理。为了实现信号的流水线化,我们采用最小费用流技术,通过流水线寄存器高效传输信号,并同时进行布局和路由。
透明插入的关键优势在于:a) 即使在大型复杂设计中也仅需使用冗余资源;b) 关键路径延迟不受影响;c) 比重新综合快2–3.9倍。我们的方法会带来较小的临时性功耗开销:由于对新电路输入进行流水线处理而增加的开关活动。
我们进一步扩展了我们的技术,以支持电路内异常处理;通过放宽严格透明性,某些电路错误可以在不重新运行耗时的布局和路由的情况下得到修复。
目前,由于使用Xilinx工具流程处理不支持的应用,我们的透明插入流程受到过于宽泛的约束限制。在构建插入电路(我们流程的步骤4)时,我们只能以片粒度标记逻辑资源为已占用——即使四个片LUT中只有一个被占用,我们也无法使用该片的其余部分;此外,我们无法以相同方式标记布线资源为已占用。此外,我们必须使用约束来强制将插入电路放置在流水线信号附近,以尽量减少用户电路与插入电路之间的布线拥塞,因为当前流程在编译插入电路时并不了解剩余的布线情况。通过构建用于创建和插入透明电路的工具流程,例如修改VTR到比特流项目[20],这些限制可能得以解除。
从长远来看,我们希望考虑对FPGA架构和CAD工具流程进行改进,以进一步提高插入断言和异常的有效性。
559

被折叠的 条评论
为什么被折叠?



