☰
异步SAR逻辑电路综合后出错原因与解决:从时序约束到门级仿真
2026/10/12 3:18:36 网站建设 项目流程

1. 为什么异步SAR逻辑电路在综合后容易出问题

1.1 异步SAR到底“异步”在哪

先对齐一下概念。SAR是逐次逼近型模数转换器的核心逻辑,传统同步SAR需要一个比采样时钟高得多的系统时钟,把每一位比较结果按节拍移位、存储,再控制DAC逐位逼近。异步SAR的思路不一样:它不需要外部高频时钟一拍拍驱动,而是让“上一位比较完成”这个事件直接触发下一位的比较启动,整个转换过程靠一条事件驱动链路自动推进。这条链路里的关键信号是比较器输出的valid事件,它既表示当前位比较结束,又作为下一级逻辑的触发源,形成“比较完成→逻辑处理→DAC建立→下一次比较开始”的自定时回路。

这个结构的最大收益是功耗。没有高频时钟树,就没有大量动态翻转。另一个好处是速度自适应:输入较大时比较器出结果快,整个链就跑得快,输入较小时自动放慢,不需要像同步SAR那样按最慢情况留死裕量。

但问题也随之而来。同步逻辑里所有寄存器由同一个时钟沿统一更新,工具处理起来很成熟。异步SAR里没有一个周期固定的参考时钟,valid事件之间的间隔随输入信号、比较器噪声、工艺角都在变。综合工具拿到这样的RTL,如果约束写得不精确,它就只能按照默认的同步模型去理解、去优化,接下来的每一步都可能走偏。我见过太多团队把异步SAR当一个小模块随便综合,结果后端天天对着违例叫苦,甚至芯片回来功能都是错的。

1.2 综合工具默认模型与异步语义的冲突

逻辑综合工具的核心引擎是基于同步时序模型构建的。它默认所有触发器由同一个或可明确定义的时钟沿更新,对每一条寄存器到寄存器的路径,都要满足在一个时钟周期内完成跳变、建立和保持。路径太长就插buffer,路径太短就修hold。这套方法论在纯同步设计里是黄金标准,但放到异步SAR上,第一道坎就是:valid信号不是一个可以被normal约束工具正确识别的“时钟”,它不是一个周期性信号,频率和占空比都会变。

如果设计者不给valid相关的路径做特殊约束,综合工具就会按照某个默认时钟周期去约束。问题在于,一个系统时钟周期与异步握手链上真实的“事件间隔”之间根本没有直接换算关系。比如系统时钟是200MHz,工具认为每两条寄存器之间的路径有5ns可用,但异步SAR握手链上valid到下一级逻辑的实际窗口可能只有几百ps。工具按照5ns的宽松约束优化,觉得延迟大点也没关系,结果综合出来的网表里这条路径被优化得非常长,放到真实芯片上直接毁掉整个握手时序。

反过来还有一种情况是工具认为周期极短,于是一路狂插buffer,把面积和功耗撑爆,但握手链上依然不收敛。原因都一样:约束没有表达出真实的事件驱动语义。说白了,工具不蠢,但它手里拿的是“同步地图”,你让它找异步路,它只能瞎猜着走。

1.3 规模不大,出错代价却不小

异步SAR的逻辑电路通常只有几百个门,相比CPU核、GPU计算单元,规模小得可以忽略。很多工程师因此放松警惕,觉得逻辑这么少,综合还能出什么幺蛾子?实际上,这个几百门的电路是整个ADC的“心脏”,它一条关键路径上的微小毛刺,就可能让compare结果晚到或者被错误采样,轻则ENOB掉个一两位,重则转换过程直接乱套。

这类问题最难缠的地方在于不可预测。时序裕量充足的时候一切正常,温度、电压一变,握手链上某个传播延迟差了几十皮秒,芯片的行为就变了。模拟组和数字组互相排查,最终一看,往往不是某个逻辑功能写错,而是综合阶段对异步路径的处理埋了雷。异步SAR逻辑面积小,但它对时序的要求极其敏感,这个反差让很多项目栽跟头。理解了这一点,再看下面的具体原因,就会有更清晰的排查主线。

2. 约束层面的坑:大部分“综合后出错”的根子在这里

2.1 没约束的异步握手路径,工具只能在“猜”的基础上优化

综合后出错,我第一个查的永远是约束文件。不是那种跑不起流程的语法错误,而是约束逻辑和设计行为对不上号。异步SAR里最典型的错误,就是没有对valid事件到SAR逻辑核心的路径做任何声明。

举个具体的例子。某项目中,SAR内部握手链从比较器valid到移位寄存器D端的实际可用窗口大约是1.5ns,而系统时钟是100MHz。综合工具在没有额外约束的情况下,会默认这条路径有10ns的周期预算。它在优化时发现路径延迟只要3ns,完全没压力,于是认为不需要特殊处理,甚至为了省面积可能把某些缓冲器删掉。到了门级仿真或者芯片实测中,valid事件到达D端的时间窗口远小于3ns,采样失败就发生了。

反过来也成立。如果系统时钟是1GHz,工具认为路径周期只有1ns,而真实异步窗口其实是3ns,工具就会拼命插buffer去满足一个根本不存在的1ns要求,导致设计面积增大、功耗上升,但正常功能照样可能出错,因为工具优化的目标和真实需求完全错位。解决思路很简单:把异步握手域的路径从同步时钟域的默认约束中摘出来,并为每条关键事件路径明确给出时间预算。摘出来的方法,常见做法是声明异步时钟组,组合使用set_max_delay和set_data_check。

2.2 误标false path,等于把功能路径也放弃了

另一个特别常见的坑是把异步SAR的握手链路径直接设成set_false_path。为什么有人这么干?因为综合后时序报告一片红,为了快速清违例,就想“反正这条路径是异步的,不需要按周期收敛”,顺手就标了false。

这个做法在纯跨时钟域同步器的场景下通常没错,因为消息通过两级同步器之后,不需要关心原来时钟域的相位关系。但异步SAR的valid路径不是“无所谓”路径,它是SAR状态机的启动信号,是功能核心。标成false path等于告诉综合工具:这条路不用管,好坏都行。工具执行得很听话,不再优化这条路径的延迟。STA报告中违例确实消失了,但门级仿真或者芯片里,valid路径的延迟可能被放任到无法接受,功能直接挂掉。

更隐蔽的是,有时STA工具在优化其他路径时,为了全局时序收敛,会把这条标成false的路径上的buffer资源借走,延迟变化更大。我在实际项目中遇到过调了两天、最后发现就是约束文件里多了一条false path的案例:功能仿真全绿,综合报告干净,其他都正常,就某一位置数据不定。把那条false path删掉,换成set_max_delay和data check,门级仿真一次通过。

2.3 data check和max delay才是异步时序约束的正确姿势

异步握手链的本质是“事件A发生后,事件B必须在某个时间窗口内完成”。这类约束标准SDC里有一套对应的表达。用set_data_check来约束两个事件信号之间的最小和最大间隔,用set_max_delay来约束从valid事件到寄存器的数据路径最大延迟。

一个可行的约束写法是这样:

# 异步SAR内部,valid_event 到下一级寄存器D端的数据路径 # 实际时序预算来自模拟仿真:最小0.3ns,最大1.2ns set_max_delay -from [get_pins comp_stage/valid_event] \ -to [get_pins sar_shift_reg/D] 1.2 # 强制检查 valid_event 上升沿与下一级使能信号之间的时间关系 set_data_check -from [get_pins comp_stage/valid_event] \ -to [get_pins sar_shift_reg/clk_en] \ -setup 0.05 -clock [get_clocks clk_sys]

参数怎么定?不能拍脑袋。它应该来源于模拟仿真和设计目标:比较器输出valid到后端逻辑采样窗口的实际裕量是多大?考虑PVT变化后的最差情况是多少?这些数值要由设计团队和模拟组一起评审,而不是随便写。真实项目中,这条约束如果写得过紧,综合工具会疯狂插buffer,面积爆炸;写得太松,工具又会不当回事,功能出错。综合后一定要看这个约束对应的推荐器上是否还有余量,并且确认工具优化时确实考虑了它,而不是只在STA里拿来做检查。set_max_delay配合set_data_check同时使用,一个是优化指导,一个是验证标准,两者缺一不可。

3. 门级仿真里的X态与竞争冒险:看着像功能错,其实是仿真模型问题

3.1 零延迟仿真导致握手链事件竞争

综合后跑门级仿真,默认有两种模式:零延迟网表仿真和反标SDF延迟的仿真。零延迟仿真最容易出事,因为网表里所有逻辑门都有0延迟,传输链路上所有信号在同一时刻翻转。如果这个设计是异步SAR,握手链上天然存在“同一个事件边沿既驱动这条寄存器,又驱动那条寄存器”的情况。在真实芯片里,信号沿有先后顺序,由物理延迟决定;在零延迟仿真里,先后顺序变得完全依赖仿真器的事件调度机制,没有任何物理意义。

结果就是仿真波形上出现大量X态。寄存器的D端和时钟使能在同一时刻变化,建立时间和保持时间同时被违反,仿真器只能给出X。而RTL仿真阶段,因为寄存器行为是用语言语义描述的,always块内部对事件处理有明确的先后逻辑,不会出现这种竞争。所以很多设计RTL仿真功能全绿,一到零延迟GLS就一片红。这不代表综合网表逻辑错了,而是仿真模型碰撞到了异步结构的本质特性。

处理办法有几个层次。第一,尽量用带SDF延迟的仿真,把物理延迟引入事件调度。第二,在关键异步路径上给寄存器初值,把X态隔离掉。第三,也是最根本的,通过约束和RTL设计让握手链上的事件边沿不同时到达,比如在关键valid路径上人为加入延迟单元,但这个方法要非常小心,不能为了仿真好看而污染设计本身。我通常建议先跑零延迟GLS确认X态来源,再用带SDF的GLS验证真实时序行为,两者结合定位问题。

3.2 SDF反标后的时序违例,有真有假

反标SDF后的门级仿真更接近真实芯片,但也会暴露出一类让新手头痛的现象:仿真log里刷屏的setup violation和hold violation,Realtime waveform上全是负slack标记。异步SAR的握手信号之间没有共同的参考时钟,仿真器却按照库单元自带的检查约束,在每一对相关信号边沿之间强行检查建立/保持时间。有些violation是真实的,比如SDF反标之后,valid脉冲宽度被延迟累积压到小于触发器最小脉宽,这确实是硬件会犯的错误。但很多violation是“假”的,因为握手链的设计意图就是让信号之间通过请求/应答互相等待,本来就不需要满足固定的相位关系,仿真器却不了解这个语义。

处理这类问题时,很多人第一反应是全跑一遍再挨个看,结果被吓住。正确思路是分两类处理:对于真正的功能路径,必须保证所有时序检查干净;对于纯异步互锁路径,在仿真约束中合理地设置假路径标记,或者用notifier关闭特定异步路径的检查函数,但上下文一定要理清楚。更稳妥的做法是回到SDC层面,把异步时钟域用set_clock_groups声明清楚,让STA和GLS工具都知道这些路径是异步关系。很多假violation在时钟组声明正确之后自动消失,因为这不再是一个“违规”,而是设计意图的一部分。

3.3 窄脉冲被标准单元延迟吃掉的隐藏问题

异步SAR的valid事件有时是组合逻辑产生的窄脉冲,尤其是从比较器输出直接经过几级逻辑整形后产生的。综合工具在逻辑上保持等价,但它不会知道这个脉冲的真实宽度在延迟累积后被压缩到多少。标准单元库里每个触发器都对最小脉冲宽度有要求,这个参数叫min_pulse_width,如果输入时钟使能或异步置位引脚上的有效脉冲比库要求还窄,触发器在芯片上不会可靠工作。

这个问题在门级波形上表现得不直观:你不会看到一个明显的时序违例报告,只会在某些操作条件下发现某位寄存器没更新。排查时要用波形量化工具抓取valid信号的脉冲宽度,和标准单元库里对应引脚的最小脉宽做对比。如果差距很小,说明设计冗余不够;如果明显更窄,问题就锁定了。预防方法是RTL阶段就保证关键valid信号由寄存器输出,或者至少经过两级展宽逻辑,不要直接用组合逻辑输出窄脉冲去驱动事件链。

4. 综合优化“好心办坏事”:工具改写逻辑后,异步行为变了

4.1 逻辑等价变换改变了延迟比例,但改变了事件时序

综合工具在做逻辑优化时,默认目标是面积、时序、功耗的综合最优。它会把RTL描述的逻辑进行布尔等价变换,意思是逻辑功能表完全一致,但实现结构变了。对同步逻辑来说,功能一致通常意味着行为等价;对异步设计来说,这个假设不成立。

布尔等价和事件时序等价是两回事。举个例子,握手链上一个信号原来的通路是“与门→或门→触发器D端”,综合工具可能把它重组成“或门→与门→触发器D端”。逻辑真值表完全一样,但valid上升沿到达D端的绝对延迟变了,下降沿到达的绝对延迟也变了,上升沿和下降沿的相对偏差可能更大。对异步SAR来说,真正重要的是“event_a发生之后,event_b必须在一个窗口内到达”,而不是布尔函数是否等价。工具并不理解这个窗口,它只看到逻辑功能一样,就做了变换。结果就是STA报告里延迟变了、但setup/hold都满足,仿真也过了,芯片回来却总是有问题,且问题出现在特定温度、特定输入条件下。

对付这个问题,唯一稳妥的办法是在综合脚本里给关键异步握手链设置dont_touch或结构保护,让工具不要对某些子模块做逻辑重组。如果整个设计面积和功耗预算不允许全套保护,至少把比较器valid接入的路径、SAR移位寄存器的路径保护起来。我一般习惯把异步SAR核心单独例化为一个子模块,在综合时对这块区域设置dont_touch,然后整个模块内部再手动优化。

4.2 扫描链插入和寄存器合并带来的负载变化

后端流程里,设计综合完之后往往还要做DFT。扫描链插入会在每个触发器的Q端挂上扫描输出逻辑和下一级扫描输入逻辑,这些额外负载会让寄存器Q端的延迟变大。异步SAR的握手链对延迟变化极其敏感,在正常模式下,扫描逻辑不工作,但它造成的负载不会消失。这是一个被很多团队忽视的暗坑:综合后的时序报告是在没有扫描负载时算的,DFT插入后normal mode时序可能已经变了,但很多人没重新分析异步路径。

另一个操作是寄存器合并。工具发现两个寄存器在某些条件下加载相同值,就可能把它们合并成一个寄存器,或者把其中一组触发器的Q端驱动到另一组触发器的D端。同步逻辑下这种优化通常安全,异步SAR里,合并后往往会出现一条“原本不存在”的组合路径,把某个握手信号从A寄存器引到B寄存器的D端,导致事件传播顺序改变。

保护手段很直接:在综合脚本里对SAR逻辑模块设置dont_touch,在DFT阶段将这组寄存器设置scan例外,避免改结构和加负载。芯片面积耗一点,但异步时序可靠性比那几百个门的面积重要得多。

4.3 异步置位/复位寄存器的映射陷阱

异步SAR逻辑里经常用到带异步置位或复位的触发器,比如用比较器valid来异步置位一个标志寄存器,表示比较结束。RTL里写得很自然:

always_ff @(posedge clk or posedge valid_event) begin if (valid_event) flag_reg <= 1'b1; else flag_reg <= next_value; end

这个代码在RTL仿真中表现完美。综合的时候,工具需要从标准单元库里找一个带异步置位端的DFF来映射。问题是,目标库可能没有这样的单元,或者库里有但面积代价大,工具就会“聪明地”转换实现:把valid_event路径引入组合逻辑,以同步方式实现置位功能,然后在STA中补一条宽松约束。功能真值表可能一样,但置位行为从“事件边沿立即生效”变成了“下一个时钟沿同步生效”,完全改变了异步SAR事件的时序语义。芯片里这条路径经常会变成“毛刺敏感”路径,任何valid上的毛刺都可能误触发置位。

排查这个问题的信号很明确:看综合log里是否有寄存器类型替换的warning,或者查看门级网表中对应寄存器是否真的有异步置位端。预防手段是约束文件和RTL注释里明确要求保留异步置位属性,更实际的是提前确认标准单元库里有哪些带异步置位/复位的触发器可用,RTL风格从一开始就贴合库的能力。

4.4 组合环路被工具当“坏逻辑”处理

异步SAR握手链中,如果设计者为了追求极致的速度,把比较器输出直接反馈到某级逻辑的输入端,无形中就会产生组合环路。比如valid在没有任何寄存器的参与下,经过两个与非门又绕回valid自身。综合工具检测到组合环路会报warning,更严重的是,某些优化策略会对组合环路区域做特殊处理,可能导致部分逻辑被“阉割”或优化掉。门级仿真中,这类环路上的信号通常表现为X态,因为仿真器无法计算组合环的稳态。

正确做法是确保异步SAR的每一条反馈路径上都至少有寄存器或锁存器参与,形成真正的“事件状态机”,而不是纯组合环。如果性能要求确实需要快速反馈,也应将“比较器valid经过一个最小的脉冲整形单元”看作一个带重置和置位的半锁存器结构,确保环上至少有一个状态单元。RTL设计阶段就避开组合环,综合阶段才不会遭遇那些莫名其妙的优化结果。综合日志里如果看到“Combinational loop”字样,我建议直接停下来处理,不要带着警告往下走。

5. 实操排查:从约束到门级仿真的完整检查清单

5.1 综合前RTL自查:从warning里读异常信号

与其等综合后再猜,不如在设计输入阶段就把风险压住。每次综合完毕,我第一件事是打开综合log,搜索三类warning:Inferred latch、Combinational loop、Unconstrained path。这三个词几乎覆盖了异步SAR逻辑电路综合后出错的绝大部分根因。

Inferred latch通常意味着RTL里某个if或case分支没有写全,产生了一个工具推断出的锁存器。这个锁存器在异步环境下可能变成握手链上的隐藏状态节点,带来意外的延迟和竞争。Combinational loop说明设计里存在纯组合反馈,这是异步SAR的大忌,必须拆掉或者显式纳入状态机中。Unconstrained path说明某条寄存器路径没有被时钟约束覆盖,工具对它没有做时序优化,这基本等同“裸奔”。还有一个容易被忽略的问题,是异步置位/复位信号是否出现在always块敏感列表中。如果敏感列表漏了valid_event,RTL仿真阶段就不会反映真实硬件行为,综合后仿真差异很难定位。

5.2 约束文件对照速查表

下面这张表是我每次核对异步SAR约束时都在用的,整理一下方便直接对照。

路径对象推荐约束方式常见错误
系统时钟到SAR结果寄存器正常set_input_delay/set_output_delay,按同步路径收敛忘记约束,工具按默认周期瞎猜
比较器valid到SAR核心逻辑set_max_delay + set_data_check组合直接标false path,功能路径被放弃
异步时钟域之间的交互路径set_clock_groups -asynchronous不声明,工具按同步路径优化产生多余buffer
valid到DAC控制逻辑set_max_delay + set_load只设max_delay不设load,负载与实际不符
扫描模式下的SAR逻辑路径声明为scan例外或dont_touchDFT插入后normal模式时序不再满足

约束不是写完了就完事。每次综合后,我还会从report_timing里抓一条valid到SAR核心的真实路径延迟,算一下相比设置的set_max_delay还剩多少余量。如果工具实际优化后的延迟已经贴着上限甚至超出,说明这条约束没有真正传导到优化过程,或者工具认为它不可控,需要调整约束粒度。约束数值也要反复校准,因为set_max_delay设置得太小,工具会插大量缓冲,面积和功耗都爆;设得太大,功能上又不保险。这个平衡点只能靠实验数据逼近:先跑一版综合,看关键路径延迟分布,再回头微调约束。

5.3 门级仿真差异定位五步法

综合后门级仿真和RTL仿真不一致时,不要一上来就大范围看波形,我的调试流程是五步走。

第一步,锁第一个差异点。用波形对比工具,把RTL仿真结果和GLS结果放在一起,定位第一条不一样的信号是什么、发生在哪个时刻。这一步的目的不是找根因,而是缩小范围。绝大多数问题只需要追这一个差异点,因为后续的错误往往是它传播出来的。

第二步,回看RTL敏感列表。确认这个信号在RTL中的驱动是否完整:是always块没写全,还是敏感列表里漏了某个关键事件。很多“仿真与综合不符”其实是RTL仿真本身就失真,只是没有意识到。

第三步,查约束。把差异信号作为终点或起点,列出来它的时序路径上设置了哪些约束,false path是否有冲突、set_max_delay是否合理。这一步能发现大量“约束把功能路径废掉”的问题。

第四步,固定X态。在门级仿真中对比较器valid、状态寄存器等关键信号做初始值设定,屏蔽X态传播,看功能是否恢复。如果恢复,问题大概率在异步事件竞争和初始化,不在逻辑功能本身。

第五步,量脉冲。用仿真工具的测量功能,抓取关键握手信号的有效脉冲宽度,对比标准单元库的最小脉冲宽度要求。这一步可以直接暴露窄脉冲问题。五步走完,问题没有露出水面,才考虑上仿真加速和更细粒度的信号追踪,但那种情况非常少。

5.4 综合后问题现象到原因的对照速查表

现象可能原因解决方向
门级仿真一片X零延迟竞争 / 未初始化 / 组合环路带SDF仿真、初始化关键信号、拆组合环
某一位输出不定valid窄脉冲 / 毛刺量脉冲宽度、RTL中做展宽处理
STA收敛但后仿真失败约束没传导到优化 / 事件窗口分析不正确复核set_max_delay和data_check约束
芯片实测与门级仿真不一致PVT变化下裕量不足 / 置位映射错误插入保护带、检查异步置位寄存器映射
面积和功耗意外增大约束过紧 / 工具过度插入buffer放宽假周期约束、给异步域分组
综合log有组合环路警告反馈路径上没有寄存器RTL重构,把环放入状态机

6. 工程上真正能少踩坑的几条经验

6.1 写RTL时就给工具“立规矩”

异步SAR的逻辑不复杂,但用哪种风格去写,直接决定了综合工具怎么理解它。我比较推荐把这个逻辑写成标准有限状态机的形态:显式定义状态编码,用always_ff描述状态转移,用组合逻辑或带寄存器的输出逻辑描述事件产出。这样工具能识别出这是一个同步状态机结构,即使时钟来自事件域,它的时序语义也足够明确。

另一种写法是“每当valid来一次就对某个计数器加1”这种事件计数风格。RTL仿真跑得通,但综合工具很难推断出它和握手链时序的关系,优化起来容易走样。还有一点经验:关键事件信号,比如valid_event,不要让它是纯组合逻辑直接输出,最好打一拍再使用。这样虽然会引入一个时钟周期的事件延迟,但换来的是信号质量稳定,对异步握手链来说价值极大。

6.2 给异步SAR逻辑单独设置保护属性

综合脚本里,我会对异步SAR核心子模块设置dont_touch和dont_retime,同时把扫描模式下的影响排除掉。示例写法:

# 保护异步SAR核心,禁止工具重组逻辑和寄存器重定时 set_dont_touch [get_cells -hier -filter {ref_name =~ sar_core_inst*}] true set_dont_retime [get_cells -hier -filter {ref_name =~ sar_core_inst*}] true # 避免扫描逻辑挂到关键握手链寄存器上,normmal 模式时序不被污染 set_dft_signal -type ScanEnable -active_state 0 -view existing_dft \ [get_ports scan_en] set_scan_element false [get_cells sar_core_inst/*]

dont_touch是双刃剑,它防止了工具做有害优化,但也意味着这个子模块内部不会再被工具优化,面积和延迟需要设计者自己在RTL里控制好。我的做法是只对真正的异步握手链状态寄存器打上保护,组合逻辑部分留一些优化空间,面积和可靠性的平衡点需要在项目中摸索。

6.3 我每次综合后必做的三件事

第一件事,打开综合log,搜索Combinational loop、Inferred latch、Unconstrained path这三类关键warning。任何一个出现,都不跳过,直接定位。这三类warning是我见过的异步SAR逻辑综合后出错的最主要信号源,而且它们往往在综合阶段就暴露了,等到门级仿真和芯片测试阶段再处理就晚了很多。

第二件事,把时序报告里valid到SAR核心所有的路径全部列出来,逐条确认,有没有哪条路径不在set_max_delay和set_data_check的覆盖范围内。这一步看着枯燥,但能避免很多“STA全绿但芯片不干活”的诡异问题。只要有一条握手路径没有纳入约束,它就可能成为全盘崩溃的导火索。

第三件事,跑门级仿真时,不只跑功能pattern,还会专挑温度和电压的极端角做一遍带SDF的仿真。异步SAR的时序问题有一个特性:常规角下可能完全看不出来,但工艺角和低温下突然爆发。尽早暴露这些问题,比等到芯片回来再猜原因要高效得多。

最后再分享一个真实的体会。有一次某项目在门级仿真里一直有一位置数据不稳,查了两天,RTL、逻辑、仿真平台、测试向量都翻遍了,最后发现竟然只是约束里把比较器valid到SAR移位寄存器的路径误标成了false path。工具忠实地执行了指令,不再优化这条关键路径,甚至在优化其它路径时把它当资源池一样随便借用。删掉那行false path,改成set_max_delay和data check之后,一次通过。从那以后,我形成了一个习惯:所有异步SAR综合和仿真问题,先查约束文件里有没有“太粗暴”的声明,再谈其它。异步逻辑电路的综合,难点真的不在于RTL写了多少,而在于你让工具理解了多少。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询