Verilog入门者
简单总结:先判断违例类型,再找最可能的原因(路径延迟、时钟偏移),最后对症下药。Setup违例药方:减速时钟(对捕获触发器)、加速数据。Hold违例药方:加速时钟(对捕获触发器)、减速数据。具体手段就那些:缓冲器、逻辑优化、流水线、重定时。答题时步骤清晰,别跳步。
简单总结:先判断违例类型,再找最可能的原因(路径延迟、时钟偏移),最后对症下药。Setup违例药方:减速时钟(对捕获触发器)、加速数据。Hold违例药方:加速时钟(对捕获触发器)、减速数据。具体手段就那些:缓冲器、逻辑优化、流水线、重定时。答题时步骤清晰,别跳步。
别忘了检查触发器的建立保持时间本身是否被正确考虑。有些题目会给出非零的Tsu和Th,计算时要加上。修改方案如果允许改库,可以换更快的触发器(减小Tcq)或更宽松的触发器(减小Tsu/Th)。但笔试通常假设单元固定。
考虑时钟域交叉了吗?虽然笔试题多数是单时钟域,但如果出现两个时钟,就要检查同步器结构。异步时钟下的setup/hold分析更复杂,但基本思路仍是满足接收时钟域的时序要求。修改方案可能涉及添加同步触发器或调整时钟关系。
实际设计中,修hold违例常用插入延迟单元(delay cell),但要注意这些单元本身有工艺波动,可能带来边际效应。笔试时可以不提这个,但知道更好。修setup违例有时会用操作数隔离(operand isolation)降低动态功耗,但可能增加延迟,需权衡。笔试题一般只考基础延迟调整。
从考试技巧看,这类题答案往往很模板化。原因分析写:数据路径延迟过大/过小,时钟偏移不利。修改方案写:1. 优化组合逻辑,减少门级数(对setup)或增加门级数(对hold,需谨慎)。2. 插入缓冲器调整延迟。3. 重新平衡时钟树,调整时钟偏移。4. 采用流水线设计。把公式列上,计算过程写清楚,基本就能拿满分。
笔试中常见电路图是两级触发器之间夹着组合逻辑。如果组合逻辑延迟大于时钟周期减触发器开销,就setup违例。如果组合逻辑延迟太小(甚至直接连线),加上时钟偏移影响,就可能hold违例。修改:setup违例可拆组合逻辑为流水线;hold违例可在数据路径加延迟单元。注意,加延迟单元可能反过来引起setup违例,所以需要平衡。
我习惯先定性分析:看电路图里组合逻辑是不是一堆门串起来,是的话很可能setup违例。看时钟树是不是一根线直接连,没有缓冲,那可能hold违例(因为时钟延迟小,数据相对太快)。然后定量算。修改方案除了插缓冲,还可以考虑寄存器重定时(retiming),即把寄存器往组合逻辑中间挪,平衡前后级延迟。这需要题目允许移动寄存器。
对于hold违例,一个典型场景是时钟路径上有缓冲器而数据路径没有。这时可以在数据路径上插入与时钟路径相似的延迟单元。反过来,如果数据路径上有缓冲而时钟没有,可能导致setup违例。解题时对比两条路径的缓冲器数量就能发现端倪。修改就是补对称。另外,注意触发器本身的hold时间需求,不同工艺库值不同,题目会给。
除了延迟,还要考虑时钟不确定性(uncertainty),包括偏移(skew)和抖动(jitter)。笔试题里常把skew明确给出。计算时,setup检查要用最坏情况延迟(max),hold检查用最好情况延迟(min)。修改方案有时会要求在不增加面积的情况下解决,那可能就得用时钟门控调整或逻辑重组。还有,多周期路径、假路径的设置也可能成为考点,但基础题一般不会涉及。
我总结了一个快速判断法:setup违例——数据跑太慢,没在捕获沿前稳定;hold违例——数据跑太快,在捕获沿后变了。所以改setup就帮数据加速或让时钟慢点来(对捕获触发器);改hold就拖慢数据或让时钟快点来。具体操作:加速数据可优化逻辑、换更快的单元;拖慢数据可插缓冲。时钟方面,可用时钟缓冲调整延迟。注意,插缓冲要放对位置,别弄反了。
别忘了检查时钟路径上的缓冲器是否对称。如果时钟树不平衡,偏移会很大,容易导致hold违例。解题时,假设两个触发器时钟路径延迟不同,计算偏移值。修改方案:重新平衡时钟树,在快时钟路径上加缓冲器。还有,注意数据路径上的毛刺可能引起误触发,但笔试一般只考纯延迟分析。
从实际工程角度说,STA违例修改是有优先级的。第一选择是优化RTL,比如逻辑重构、重定时(retiming)。第二才是后端手段:插缓冲、调尺寸、加延迟单元。笔试题目往往简化了,但思路一致。遇到hold违例,经常是在数据路径上插延迟缓冲(注意不要影响setup);setup违例则可能需降低时钟频率(但题目通常不让降频),所以只能优化路径。另外,检查时钟门控是否引入额外延迟,这也是常见考点。