我几乎无法相信痛楚竟是由这么一个小东西造成的。……我压根就无法相信,它竟能造成如此难以忍受的疼痛,而且还持续了那么长时间。
——《安迪密恩的觉醒》
有诗赞曰:
“莫道阵列身材小,上天入地称英豪。各种应用多傲娇,现场编程有奇巧。若要时钟频率高,约束文件要写好。要问夸赞多玄奥,混饭需要做广告。”
(“哎呀呀,说漏嘴了!不怕,不怕,我把面子再找回来”)
下面客官问了:“这是说谁啊?”
“当然是那个扫地的和尚了!难道我会自己说自己?”
上几次老道不在,可是被那个比丘说惨了,这次连本带利的讨回来。半泽直树说得好:“以牙还牙,加倍奉还。”
闲话少叙,贫道的名言是:“不以结婚为目的的恋爱,是耍流氓;没有(能读懂的)注释的代码,是耍流氓;不讲时序约束的FPGA设计,更是耍无赖。”这一讲里面老仙我就给大家好好讲解一下如何在FPGA设计过程中进行时序约束。
在任何一本《数字电子技术》教材的某个犄角旮旯,总有类似下面的论述:
“组合逻辑电路中,同一信号经不同的路径传输后,到达电路中某一会合点的时间有先有后,这种现象称为逻辑竞争,而因此产生输出干扰脉冲的现象称为冒险。
竞争(Competition)定义为:在组合逻辑电路中,某个输入变量通过两条或两条以上的途径传到输出端,由于每条途径的延迟时间不同,到达输出门的时间就有先有后,这种现象称为竞争。把不会产生错误输出的竞争的现象称为非临界竞争。把产生暂时性的或永久性错误输出的竞争现象称为临界竞争。
冒险(Risk)定义为:信号在器件内部通过连线和逻辑单元时,都有一定的延时,延时的大小与连线的长短和逻辑单元的数目有关,同时还受器件的制造工艺、工作电压、温度等条件的影响。信号的高低电平转换也需要一定的过渡时间。由于存在这两方面因素,多路信号的电平值发生变化时,在信号变化的瞬间,组合逻辑的输出有先后顺序,并不是同时变化,往往会出现一些不正确的尖峰信号,这些尖峰信号称为‘毛刺’。如果一个组合逻辑电路中有‘毛刺’出现,就说明该电路存在冒险。
竞争、冒险都是由于延迟时间的存在,当一个输入信号经过多条路径传送后又重新会合到某个门上时,由于不同路径上门的级数不同,或者门电路延迟时间的差异,导致到达会合点的时间有先有后,从而产生瞬间的错误输出。”
为什么每次读教科书,都觉得是大筒木辉夜的惊天阴谋呢?有一种不让读者进入无限月读 ,誓不罢休的霸气外露(典故见《火影忍者疾风传》)。当然这是题外话,大家乐一乐(非拉面广告啊)。列位少安勿燥,待贫道说人话解释一番。
竞争就是三字经“人之初,性本善。性相近,习相远”的道理。同一个服务器的数据包,有的是电驴似的P2P(点对点,Point to Point)几乎及时到达,有的却莫名其妙被发配去粮食基地周游一圈花了五分钟才到达你的计算机网口。如果只是上网浏览一些网页,还倒罢了,这就是非临界的。假使是看视频,就会卡在那里,用户会很不爽,这就算临界竞争了。一个竞争的例子如图1.8所示。图中的输入信号经过了两个不同的路径,因为处理及布线延时的缘故,不同路径的有效输出信号(对应路径1命名为输出1,对应路径2命名为输出2。图中假设两个输出的理论输出都是从“0”到“1”的变化)的时间可能是不同的。
图1.8 竞争的示意图
冒险的情况与当年“萨尔浒之战”(不知道是什么?可以参考单(田芳)老的评书《努尔哈赤》里的第四十一回《排后事明军挺进辽东击后金杨镐分兵派将》到第四十三回《萨尔浒后金告捷北路军叶赫胆裂》。因为版权原因,此处省略三十万字。隔空喊话:“单老不用谢,人艰不拆啊!”)很神似,坏就坏在“分进合击”上面。一组本来好好的输入,非要经过不同道路到达器件,结果有了时间差,再被后面的器件处理,后果不堪设想。一个冒险的例子如图1.9所示。图中的两个输入信号,经过了两个不同的路径,因为处理及布线延时的缘故,对于器件的有效输入信号的时间可能是不同的。器件进行处理获得的输出(假设理论上的输出应该保持“0”不变)产生了预料之外的、急风暴雨般的“1”。这个短时的高电平就是所谓的毛刺。
图1.9 冒险的示意图
说到这里,肯定有听众朋友问了:为什么不能把时延啊、处理啊这之类的劳什子搞到一样呢?尽出一些竞争、冒险的事情来捣乱。
贫道早就算到有此一生死劫,也就自然有免灾的方法,还不用破财,就是费点嘴皮子,更不用动用“洪荒之力”了。
首先,要求布线的时延一致是不可能的。一巴掌伸出来,指头还不齐呢!做印制电路板布线已经不易了,还要一样长度,不带这样难为人的。不是人人都是阿汤哥,能完成《不可能的任务》。
其次,各个型号肯定需要进行不同的处理,因此完全无法保证处理的时延一致。试想要求一个加法和一个乘法的处理速度一样,这算神一般的任务呢,还是猪一样的要求?也别提什么“双工热备份”,芯片里不兴这个。如果两路的结果不一样,难道能让芯片掷硬币决定用哪一个?
最后,值得强调的是,在实际电路中,竞争、冒险总是存在的。只要不影响系统的输出结果,工程师尽可以“睁一只眼闭一只眼”。
那么,什么叫“影响系统的输出结果”呢?对于时序仿真,那就是所谓的“全国江山一片红”(仿真输出信号,存在大量的显示为红色的信号,也即“x”。至于“x”是什么东西,下文书自有交代)。如果你艺高人胆大,那就是系统的输出与你的预期不符合了(当然需要排除你的预期错误、仪表有问题等因素。这就是为什么那个和尚总说要“进行时序仿真”的原因,不得不说在这点上他没错)。
前文书中某家给大家介绍了组合逻辑里存在的时间问题,所谓“祸不单行”,现在趁热打铁,摆一摆时序电路中间和时间有关的龙门阵。
问题从最简单的开始解决,这是一个原则。先来瞧瞧一个D触发器对于输入信号的要求,也就是你的耳朵都听出茧子的建立时间和保持时间问题。建立时间(Set up time,简写为T su )是指触发时钟沿(一般为时钟信号的上升沿,本书中也沿用这个约定)到达D触发器之前,要求输入信号必须已经达到稳定的时间。对应的,保持时间(Hold time,简写为T h )是指触发时钟沿到达D触发器之后,要求输入信号还需要保持必须稳定的时间。建立时间、保持时间相对于触发时钟沿的关系如图1.10所示。
图1.10 建立时间、保持时间相对于触发时钟沿的关系
“我们都是木头人,不许说话不准动”,建立时间和保持时间就是输入信号的“木头人时间”。做游戏时,“木头人时间”内有了晃动或出声,游戏就输了。电路里,如果输入信号在建立时间或保持时间里发生了变化,那就是仿真(尤其是时序仿真)里的所谓“全国山河一片红”了,这个绝对是灾难。
D 触发器的输出也会有时延,也就是说,D 触发器的输出信号(Q)一般会晚于对应时钟信号的出发沿输出有效信号。这个时延一般称为D 触发器的输出时延(Clock Output delay,简写为T co ),如图1.11所示。
图1.11 D触发器的输出时延
对于两个都是晚于触发时钟沿而生的信号——保持时间和输出延时,它们的关系如何呢?可以说很和谐,尤其是在FPGA器件内部,必须满足图1.12所示的触发器链(原来也叫菊花链,现在“菊花”这个词被异化了,“菊花链”容易引起邪恶的联想,不敢提及了)的要求。道理是这样的,前一级D触发器的输出在触发时钟沿之后T co 的时间变换,然后经过两级触发器之间的布线延时D W 到达第二级D触发器的输入。按照保持时间的要求,上述的输入信号需要在 T h 之后才允许变化。大家知道,D W 这个值最小可以到达皮秒(ps)级别,此时相对于T co 和T h 可以忽略。这样就必须要求T co ≤T h 。当然在不满足上面的要求时,也可以通过增加 D W 的值来满足要求。但是,这种“生于线死于线”的想法是有问题的。首先,线上的延时很难控制,这对于系统内部布线的要求太高,很难工程化。其次,D触发器是什么做的?硅,就是沙子。线呢,可是纯净白银的。哪个贵?因此,甘愿在设计D触发器时满足要求,也不愿在布线上找麻烦,这个道理是理所应当的。说到这里,ASIC后端和IC生产工程师要找我说理了:“嘻,汝了解工艺否?”。其实,在工艺生产这方面,老道的水平既不在二百五之上,也不在二百五之下。以上论述纯属虚构,帮助大家记忆用。哪个面试敢用,后果自负。
值得强调的是,这两个时间(建立时间和保持时间)加上一个时延(输出时延)是由器件/电路本身的工艺、结构等特性决定的,用户只有选择权,没有改编权。换句话说,就是你可以选择这三个参数比较短的器件,当然时间越短价格也越高。这个和选择相机的道理是一样的,越专业的相机可以支持越快的快门速度,自然价格越贵。另外,器件一旦选择完毕,这三个参数对应的数值就是常数,就不可改变,你要有“认赌服输”的觉悟。对于FPGA而言,这就是选择器件的型号;对于ASIC来说,这就是选择厂家和工艺。
图1.12 二级触发器链结构
至于这三个参数产生的原理,可以参考负责任的作者写的《数字电子技术》教材(本着中立的态度,在此不推荐,因为没人给我广告费)。本书的读者知道有这个东西就行,没有必要深究。看电视的人,完全不必知道三峡电站是如何建造的。有好奇心是好事,追根究底也需要一个底线。用量子力学方法计算世界的样子,估计一辈子也不知道钢如何制成菜刀(据说“论道”可以提升格调,这样见到依琳小师妹才有安全感。姑且忍耐贫道啰唆,大家成人之美可好?)。
下面增加一点点难度系数,看一个比较实用的场景,如图1.13所示。考虑理想的时钟情况,即各个D触发器的时钟之间没有相位差,保持时钟沿严格对齐。数据由D触发器(D1)的 Q 管脚输出,经过一些连接线(W1)到达完成具体功能的组合逻辑(C)部分。经过组合逻辑的处理,信号通过连接线(W2)到达另一个D触发器(D2)的D管脚输入。这是最常见的电路局部结构,至于为什么,且听后文书道来,现在诸位接受就好。
图1.13 典型同步电路
现在以一个除法时钟沿为开始时间,按照第一个D触发器到第二个D触发器的方向一点点捋信号建立的时间。为了方便表示,在图1.13中标记了a~d四个关键的位置。具体的时间如图1.14所示,图中的D W1 和D W2 是两段连线的时延,D C 是组合逻辑的时延,而T是系统的时钟周期。
图1.14 信号的时序关系
对于保持时间的要求,按照前面有关“和谐”的约定自然是满足的。为了满足建立时间的要求,在时序上必须满足:
合并连线实验的同类项,定义D W =D W1 +D W2 。通过简单的移项处理,可以得到最终老怪:
这个公式说明两个问题。首先,忽略连线时延和组合逻辑的时延,可以获得时钟周期的理论下限,也就是系统的理论最高工作频率[这个值是由器件的特性(T su 和T co )决定的]。其次,实际系统的最高工作频率由器件的特性、布线造成的时延及组合逻辑划分造成的时延共同决定(个人很不喜欢这个计算,感觉有些本末倒置:工程中是先根据需求了解系统的工作频率,再进行设计的。但是很多面试里特别喜欢问这种问题。为了帮助读者通过面试,不得不书写这个内容。一句话:形式比人强啊!完全不说违心的话也难)。话反过来说倒是还有点意义,当设计不满足需求的时钟要求时,为了提高设计的时钟频率,可以考虑两个方向:降低布局布线造成的时延(D W )或降低组合逻辑的时延(D C )。再多啰唆一句,同样一个东西,有时这样说是好事,反过来就不对路了。总结:少言慎行活得久。
上面的公式还可以扩展,如加上时钟的抖动等因素。但是,万变不离其宗,道理是一样的,就是信号的到达满足建立时间的要求。
上文书说道:“当设计不满足需求的时钟要求时,为了提高设计的时钟频率,可以考虑两个方向:降低布线造成的时延(D W )或降低组合逻辑的时延(D C )”(在后面关于组合逻辑拆分的内容里,上面引号里的文字还会被复制一次,以期符合“重要的事情说三次”的原则)。可是,“说书人一张嘴,说不了两家事”,这里只能先说“降低布局布线造成的时延”这个话题,至于“降低组合逻辑的时延”的奥义只有等到后文书慢慢道来。
首先,这里解答“什么是布局布线”这个问题。简单理解,“布局布线”就是在器件(FPGA/ASIC)里画 PCB。布局是把器件放到相应的位置上,布线是把有关联的器件连接起来。
机器都是笨的,即使是号称“电脑”的计算机也需要人来操作才能完成规定的任务。如果仅仅把设计给了设计环境,不做任何设计上的说明(也即所谓的“时序约束”),机器绝对会搞出一些工程师不希望的结果出来。记住:任何工具都不会注重尝试寻找结果最优的布局布线结果。这个正如画PCB的工程师绝对不会完全使用软件提供的所谓“自动布线”一样。
对于设计性能的要求,是通过“时序约束”这个灵媒告诉工具的。一般而言,时序约束可以使得相关的功能器件被放在较近的位置上,从而使得走线的时延也较小。另外,更加靠近输入/输出的管脚,可控制出入输出时延。图1.15是一个示意,图中假设有两个独立的功能。
图1.15 时序约束前后的布局布线示意图
常用的时序约束主要包括时钟性质定义、输入路径时延定义、输出路径时延定义、多周期定义和虚假路径定义。当然,还有其他不是十分常用的内容,如果全部详细论述,就是一部专著的内容了。限于本书的篇幅,贫道只对上面的五种约束稍加介绍,其他内容可以参考有关厂商的资料。
现在演出的是今晚的压轴大戏(什么啊!老话说“前三场没好戏”。懂不懂啊!一开始就压轴,生意不做了?):时钟性质定义。时钟始终是数字逻辑系统里最为重要的信号。按照理论指导实践的精神,参考前面推导出的那个不等式,可知时钟的频率和性质决定了其他时延的上限。时钟频率越高、时钟抖动越大,允许的布局布线时延及组合逻辑时延也就越小。
时钟信号包括三个性质:周期与占空比、时钟间的偏移和时钟的抖动。如图1.16所示,时钟的周期定义为理想时钟的两个触发沿之间的时间间隔;时钟的占空比定义为一个周期内,理想时钟高电平“1”信号占整个时钟周期的比例;时钟之间的偏移定义为两个同源时钟之间的、固定的触发沿的时间差;时钟的抖动定义为一个时钟信号相对于理想时钟,上升沿与下降沿可能变换的前后范围。最后多说一句,这些实际系统中的时钟与理想时钟的差别是芯片内的“时钟树”造成的。
图1.16 时钟的时序约束参数
下面两折比较类似,现在合并演出(台下:“偷工减料,退票!”):输入/输出路径时延表标记芯片的前端/后端芯片的时序特性/要求。这基本上就是把前端芯片看作D触发器,告诉工具前端芯片的输出时延,这样可以保证系统对于输入可靠采样。同样的,把后端芯片看作D触发器,通知工具后端芯片的建立时间和保持时间,可以保证可靠的信号输出。整个系统的链接情况如图1.17所示。
图1.17 输入/输出路径时延
下一出是《珍珠塔》,“皇帝家也有三门草鞋亲,谢谢!”(这就完了!?台下骚动:“退票!退票!”)。在实际系统中,很少有必须工作时间都一致的,总会存在一些“急先锋”遇到“慢郎中”。别抬杠,您老没遇到,只能说明您还毛嫩。多周期的时序约束实际上是减少布局布线压力的,这个和前面存在差异。对于这些需要计算较慢的单元/路径,可以降低要求,把好的资源让渡给需要快速的部分使用。图1.18就是一个例子,上面是需要快速解决的单元们,下面是可以“慢慢来”的部分。多周期约束定义了到底可以多慢做完这个工作。
图1.18 多路径约束
最后出场的是“虚假路径”这个草包,主要表演时钟域之间的路径和测试逻辑,工具对这类任务采取的是不闻不问、听之任之的态度。
各位听众,本次演出的提供者是草台班子剧团,多谢大家捧场。
再多说一句,对于各个厂商的器件,用来定义时序约束的工具不同,需要专门学习。另外,在时序约束的大森林里,诸位从本书里看到的顶多是几片相对比较绿的叶子。要了解整个林子的全貌,请列位找寻专业讨论时序约束的资料观览。
这正是:
“冒险竞争两现场,组合逻辑调整难。建立保持器件原,输出还需顾时延。若要时钟跑得欢,布线组合控制严。时序约束布局线,组合拆分下文见。”