资讯动态

异步SAR数字控制逻辑综合后出错:五大根因与排查实战

发布时间:2026/10/14 16:52:05 来源:尧图企业网站定制
干过异步SAR数字控制逻辑的人十有八九都经历过这么一个场景RTL功能仿真跑得干干净净波形漂亮得像教科书结果逻辑综合完网表仿真一跑输出就开始随机抽风——某一比特判错了、某个事件信号丢了、甚至整个握手状态卡死。这个时候第一反应是“综合工具是不是有Bug”但查到最后大多数问题都出在我们自己写的代码和处理综合流程的方式上。这篇文章就专门聊“异步SAR逻辑电路综合后出错的可能原因”。我会从异步SAR逻辑电路本身的特殊性讲起把综合工具对这类电路的默认处理方式、最容易踩的五类坑、排查思路和实际修改经验都串起来。适合正在做异步SAR ADC数字控制、混合信号数字接口或者单纯对异步逻辑综合感兴趣的数字IC工程师参考。内容偏实操不绕弯子。1. 异步SAR逻辑电路和综合工具的天然隔阂1.1 异步SAR逻辑电路到底“长”什么样SAR逐次逼近寄存器ADC的数字侧核心任务是控制DAC与比较器完成逐位逼近。同步SAR的做法很直接用一个主时钟驱动环形计数器或者状态机每个时钟周期完成一次比特试探。异步SAR则不一样它没有统一的全局时钟而是靠事件传递来完成整个逼近过程。比如比较器输出“完成”事件这个事件直接触发DAC切换DAC稳定后再“拉起”下一个比较器启动信号一级一级往下传像一队人接力跑而不是靠哨声统一发令。这种电路的关键信号是各种握手事件请求、应答、完成、启动。它们没有固定的周期可能有很长的数据依赖链也可能有反馈环。写RTL的时候我们脑子里想的是“事件到了我就变状态”综合工具眼里看到的却是“一堆组合逻辑加寄存器的混合物”。它默认你是同步时序逻辑分析路径的起点终点都挂在时钟沿上可异步SAR里很多关键路径根本没有时钟沿做锚点。1.2 综合工具默认对异步逻辑做了什么逻辑综合默认的行为模型是寄存器之间是纯组合逻辑寄存器只需关注建立时间和保持时间。只要约束满足综合工具就会依据时钟周期重新优化组合逻辑把不必要的延迟删掉、把结构改掉。这套逻辑对同步电路是高效的但放在异步事件链上就有点水土不服。工具拿到异步SAR控制逻辑后会想办法把事件信号“当作”普通数据信号处理。有些事件链被识别成单纯组合路径工具会用默认时钟周期去约束它结果时序报告一堆violation有些事件链里带反馈工具可能默认有组合环直接给你报warning严重时甚至用某个默认策略把环“断开”或“置常值”。更麻烦的是综合工具不关心事件“上升沿代表开始、下降沿代表完成”这种语义它只看布尔函数优化出来的网表逻辑上可能等价时序特性却完全变了。1.3 “综合后出错”的分类不是只有一种错很多人一看到“综合后出错”就认为是时序问题实际上至少分四类出错类型典型表现排查侧重点逻辑功能错误综合后网表仿真结果和RTL不一致某一位判决错误组合环、锁存器、case分支、综合优化选项X态传播错误仿真中出现大量X状态机卡死或输出不定寄存器初始化、未定义状态、门级仿真X态语义时序违例STA报告setup/hold违反或门级时序仿真报timing check失败约束是否合理、false path/multicycle path设置结构完整性错误扫描链、时钟门控等可测试性插入破坏了异步事件链DFT配置、时钟门控单元、扫描寄存器替换这几类错误经常同时出现。比如组合环被工具改写之后输出出现XX又沿着事件链传播成功能错最后在时序仿真里放大成卡死。所以排查时不能急着只看一处得一套组合拳下来。2. 最典型的五类根因2.1 组合反馈环被综合工具“重新理解”异步SAR逻辑里最容易踩的坑就是组合环。很多初版的RTL描述里有类似这样的写法某个握手信号由另一个握手信号直接组合产生同时这个信号又会反过来影响前者。比如“比较器完成事件”和“转换开始事件”互相纠缠中间没有任何寄存器隔开就形成了纯组合反馈。RTL仿真阶段仿真器对这种组合环有一套迭代机制0延迟环境下常常能收敛到某个稳定值看起来一切正常。但综合工具对组合环的处理策略不一有的直接当成错误报告有的默认断开环有的把环上的某些信号tie到0或1。无论哪一种都可能让综合后网表的行为和RTL仿真对不上。我遇到过的情况是一个启动脉冲信号和一个完成反馈信号组成了组合环综合工具把这个环判断成“非功能电路”优化时直接给我删了一条路径。RTL里事件能正常传递网表里事件传了一半就断掉后续所有比较器位判决全部错位。排查这种问题最好的办法是用Lint工具先查组合环把代码里的反馈路径列出来然后逐条确认是不是有意为之。有意的反馈环最好改成“寄存器加组合判断”的结构哪怕只是多加一个内部节点也能让综合工具明确识别语义。2.2 锁存器推断导致综合前后行为偏差异步逻辑里很多信号天然有“保持”属性事件还没到输出保持当前值。比如“DAC粗调完成”之前“粗调保持使能”就应该一直维持。如果代码里用always (*)块给这种信号赋值又漏写了某个分支综合工具就会推断成锁存器。锁存器本身并不一定是坏事异步逻辑里用锁存器做事件保持也是常见手段。问题在于很多工程师写的时候没意识到自己写了锁存器RTL综合前也没有针对性检查。综合工具推断出的锁存器和仿真器里的理想锁存器在时序细节上有差异数据信号和使能信号哪个后到、使能时钟怎么处理、复位怎么加入网表行为都可能和RTL不一致。门级仿真时如果数据在使能沿附近变化就可能出现输出毛刺或锁存错误值。从实际操作来看异步SAR控制逻辑里想要明确使用锁存器最好写成结构清晰的方式不要靠“缺else”让工具猜。凡是不想要的锁存器用完整的if else语句把所有输出写全凡是刻意要用的锁存器单独拉出来一个模块做成带异步复位、使能信号和控制信号都清晰的单元这样综合工具能准确推断后端也能针对优化。2.3 时序约束错误假路径设得太过随意异步SAR逻辑没有统一时钟综合工具不知道哪些路径是“真正的关键路径”。于是很多人的做法是把所有异步握手信号之间的路径都设成false path因为“反正没有时钟分析不了”。这个操作短期能消除STA报错但副作用是工具对该路径完全不做时序优化。比较悲剧的场景是虽然握手链是异步的但它仍然有物理延迟约束。比如比较器稳定时间要求DAC输出在N纳秒内建立如果工具认为这是false path它可能不会对这条路径做足够的优化最后综合网表在硅片上就是慢异步事件链变形转出来的位码就是错的。还有的团队把所有异步事件路径设成false path后信号从寄存器输出到组合逻辑再到下一个寄存器的路径没人管结果在门级时序仿真里疯狂报timing violation。更合理的做法是给异步SAR逻辑专门建立“虚拟时钟域”约束。把握手链上的关键路径设成max_delay约束指定一个合理的最大延迟目标对确实不关心的握手反馈路径再单独设置false path。这样既能让工具知道哪些路径需要优化又不会让它陷入一堆无法满足的默认时钟约束。对异步SAR电路来说时序约束不是“越少越好”而是“谁该管、谁不该管”要分清楚。2.4 复位与初始化策略在网表阶段不匹配异步SAR逻辑对复位的要求比较高。转换开始时所有握手信号要回到确定状态转换过程中任何信号处于X态都会通过事件链传播最后变成错误位。RTL仿真阶段我们没有芯片上电的过程寄存器都默认初始化为0仿真波形一般很干净。可综合后的网表仿真不是这样网表里寄存器没有初始值如果复位释放时某些握手信号还没就位X态就会顺着组合逻辑扩散。还有一种更隐蔽的情况工具对复位网络做了一定优化认为某个复位信号“在特定条件下等价于另一个信号”把一部分寄存器改成由组合逻辑驱动的异步复位。异步SAR的事件链本身就快复位释放瞬间如果刚好和某个完成事件碰撞综合后网表里就可能出现亚稳态或者毛刺表现成“偶发的、和激励顺序有关”的错误。处理这个问题我在实践中发现最有效的是给所有寄存器明确复位初值并在门级仿真一开始就注入复位同时检查综合报告里有没有复位网络优化策略如果工具动了复位树的拓扑结构宁可关掉这类优化也要保证复位行为“所见即所得”。2.5 扫描链和可测试性插入破坏事件链综合流程中DFT可测试性设计插入往往被当成后端步骤很多做异步SAR逻辑的工程师在综合阶段根本不会留意。但扫描插入会默认把所有可寄存单元替换成扫描寄存器这类寄存器多了一个SE扫描使能信号和一个SI扫描输入端口。如果异步SAR事件链上的寄存器被扫描替换而scan_enable信号在仿真或者实际使用中没有被正确置成功能模式完成信号就会被扫描链逻辑劫持事件链整个瘫痪。尤其是那些用锁存器做事件保持的模块扫描插入时可能被处理成不可扫描单元或者被绕过综合工具的DFT报告里会提示这些单元“没有扫描链覆盖”。如果实现的人忽略了这些报告后续时序仿真里一旦工具自动给扫描相关信号一个默认值事件链上就会冒出莫名其妙的X态。所以我现在的习惯是在综合脚本里显式声明异步SAR逻辑区域为scan_disable区域把这些锁存器和特殊握手寄存器排除在扫描链覆盖范围之外。如果项目没有DFT需求就在综合时直接关闭扫描插入省得后面惹麻烦。3. 综合前中后三层排查路径3.1 第一层综合前用Lint和结构检查“自证清白”不要等到综合后出了问题才开始怀疑工具。综合之前我会先跑一轮针对异步逻辑的静态检查重点看三样东西组合环、锁存器推断、未初始化寄存器。组合环用Lint工具直接列出所有反馈环路锁存器检查就是看综合报告的inferred latch warning未初始化寄存器则要靠代码走查和lint规则一起过滤。这一步花的时间最少但能拦下至少一半的“综合后出错”。很多异步SAR逻辑综合后出错根源在RTL写的就有歧义综合工具只是把歧义翻译成了网表。3.2 第二层综合后立即用零延迟门级仿真对拍拿到综合网表文件后不要急着跑带SDF的时序仿真。第一步先用零延迟或默认单位延迟模式下跑一遍门级功能仿真和RTL仿真用完全相同的testbench和激励逐位比对接线、事件顺序、状态输出。这一步能暴露出纯粹的逻辑功能差异。零延迟网表仿真里没有时序violation干扰如果这里就对不上说明是结构性问题比如组合环被改、锁存器推断不对、扫描链干预、逻辑重映错误。只有零延迟门级仿真和RTL对上了才值得继续跑SDF时序仿真。我经常在这个阶段加一些断言检查专门监控握手事件序列。比如正常情况下事件A的上升沿必须在事件B下降沿之后出现如果门级仿真里事件顺序乱掉断言立刻报出来。比盯着波形肉眼找效率高得多。3.3 第三层SDF仿真中的时序错误要分“真的违反”和“虚假违反”带SDF的门级时序仿真报violation是家常便饭。但异步SAR逻辑里有很多violation是“约束制造出来的”不是电路真实会犯的错。比如某一握手信号路径的默认约束来自综合工具自己创建的虚拟时钟SDF反标后仿真器在这个边界上检查setup/hold结果RTL里根本不在乎这个边界有没有时钟沿对齐。遇到SDF仿真报错我会先看报错的路径是不是真正受约束路径。打开约束文件反查这条路径有没有定义false_path、max_delay或者virtual clock。如果发现是很随意的默认约束导致的violation我会修改综合约束再重新综合如果确实是有实际延迟限制的路径那就要看路径上哪些单元延迟超标通过优化RTL结构或增加驱动能力来解决。排查层次工具/手段解决的问题综合前Lint、结构检查、RTL走查组合环、锁存器、X态源综合后零延迟仿真门级网表仿真、断言比对逻辑功能不一致综合后SDF仿真STA报告、SDF时序仿真时序violation、异步边界错误流片前形式验证、等价性检查优化导致的逻辑不等价3.4 用“事件计数”做异步链的快速体检异步SAR逻辑最怕事件丢失我强烈建议设计一个基础检查用例跑完一次完整转换统计所有关键握手信号的事件数量。比如比较器完成事件应该等于转换位数DAC粗调的触发次数应该等于预置次数握手链上每一级完成信号都应该有对应数量的沿。这个检查在RTL仿真、零延迟门级仿真、SDF仿真三个环节各跑一遍然后把三份事件计数放一起比对。哪一级少了沿问题基本就锁定在哪一级附近的组合逻辑或寄存器上。事件计数是异步逻辑最不容易被“波形相似但逻辑错误”骗过的检查方法。4. 异步SAR综合后的常见“坑”速查表这里把我这些年见过、踩过的问题整理成一张速查表对着现象查原因会方便很多表象可能原因检查方向常用对策某些位次随机错误跟激励顺序有关组合环被工具断开或置常值Lint报告组合环对比RTL综合网表反馈环改为寄存器和组合判断混合描述所有信号全是X状态卡死寄存器无初始值且复位不完整初始化检查、复位注入时序加全局复位门级仿真先复位再工作低频仿真正常高频时事件链断裂默认时钟约束导致工具优化不足STA报告、关键路径延迟用max_delay限制握手链替换优化策略多个单元被推断成latch行为诡异always块缺else意外latch综合报告inferred latch检查补全分支明确写锁存器或改寄存器综合前后逻辑功能等价但时序仿真乱false path设太多错过真实路径约束文件审计SDF报错路径交叉验证按实际延迟需求重新约束只设必要false path扫描插入后事件链断裂扫描寄存器替换或锁存器绕过DFT报告、scan_config异步区域设置scan_disable复位释放瞬间偶发错误复位和握手事件竞争复位发散检查、门级仿真多次随机扰动优化复位网络拓扑禁止复位树重定时门级仿真0延迟正常SDF仿真必挂异步边界上被套用同步时序检查检查所有异步边界约束用虚拟时钟和max_delay替代统一时钟默认约束这张表不是万能药但排查时先对号入座能节省大量时间。很多工程师拿到一个错误直接冲进代码里改逻辑改了半天没用就是因为没先判断错误到底属于哪一类。异步SAR综合后出错定位比修改重要得多。5. 一次实实在在的异步SAR逻辑综合问题复盘5.1 现象描述某项目在综合后网表仿真阶段连续出现了偶发的位判决错误。RTL仿真几千个cycle都没有问题但综合后网表仿真跑到大约十几个转换周期的时候出现一次转换结果最低位错误。错误频率不高但存在。最初怀疑是时序收敛问题因为综合报告确实有几条setup violation集中在DAC切换路径上。团队改了好几次约束把violation压下去之后错误依然存在只是出现频率变了。5.2 排查过程我接手之后先做了两件事一是把RTL和综合网表的零延迟仿真结果逐拍对比二是统计所有握手信号的事件数量。对比结果里RTL仿真的DAC_settle信号在每个转换周期都有固定的上升沿和下降沿而门级仿真里每大约十六个周期这个信号就会丢失一个下降沿。事件计数上理论要求每个转换周期完成一次DAC settle门级仿真实际少了若干次。接着查这个信号的前级组合逻辑发现它由一个组合反馈环控制。RTL里这个反馈环的存在很隐蔽代码里两个握手信号互相置位看起来是标准握手但中间没有任何寄存器或锁存器做状态隔离。Lint报告里其实已经把这个环列出来了只是当时没当回事。综合工具在后端优化时把这个环当成了冗余逻辑的一部分部分路径被重新映射成更简化的等价电路等价性虽然保持了但事件下降沿的传播被工具视为“可以优化的冗余”直接改变了行为。5.3 修复方法修复方式不是重新加约束而是改RTL描述。我把这个组合反馈环改成了“一个带异步复位的握手寄存器加一个组合判断逻辑”的结构寄存器保存当前握手阶段组合逻辑负责判断事件是否到达然后更新阶段。这样综合工具能明确看到寄存器的状态边界不会再随意优化掉事件传播路径。改完以后重新跑Lint组合环清零综合网表零延迟仿真和RTL逐拍完全对齐SDF仿真连续跑了几万个转换周期没有再出现位判决错误。这个case给我的教训很直接异步SAR逻辑里凡是涉及事件反馈的路径尽量不要用纯组合逻辑描述给工具一个明确的时序边界工具才不会自作主张。6. 从流程层面降低异步SAR综合后出错率6.1 交付之前先做异步逻辑“专项体检”每次做异步SAR逻辑综合我都会把“专项体检”作为交付流程的固定环节。体检项包括组合环数量、意外latch报告、寄存器初始化覆盖率、异步边界路径清单、DFT插入对异步区域的干扰情况。体检结论写清楚哪些是确认没问题的哪些是需要后端特别处理的。这套流程看起来很机械但非常管用。因为异步逻辑综合后出错往往不是单一原因而是一个链条上多个隐患叠加。比如一个组合环本身可能问题不大但叠加锁存器推断和扫描链插入最终就在综合后仿真中爆发。越早把隐患分类列出来越能在综合前把链条剪断。6.2 事件信号尽量做成“脉冲化”而不是“电平握手”异步SAR逻辑里很多握手信号是电平型握手拉高表示请求拉低表示完成。这种电平握手在时序上对路径延迟比较敏感一旦信号畸变成毛刺或者被优化事件链就乱了。我在后期项目中开始尝试把部分关键握手信号改成“脉冲握手”用很窄的脉冲表示事件发生电平不再承担“状态”功能。这种风格最大好处是综合工具对脉冲传递的理解更接近数据路径不容易产生组合反馈环而且事件丢失在波形上极其显眼排查效率高。代价是脉冲逻辑需要额外保证脉冲宽度能穿过所有组合路径设计时要算清楚延迟。6.3 没有足够的后端经验就先用“同步粗粒度加异步细粒度”的混合方案对于很多团队来说纯异步SAR控制逻辑的综合和后端难度是偏高的。如果团队对异步设计、STA约束、后端优化都还在摸索期我的建议是别一上来就做全异步。一种稳妥的混合方案是用同步时钟做粗粒度位循环调度例如每32个时钟周期完成一个“粗调阶段”的切换在单个时钟周期内部用异步事件链完成细粒度的比较器重触发和DAC切换。这样大部分逻辑仍然能被综合工具以同步方式处理只有很小一部分核心异步逻辑需要特殊约束综合后出错的风险面大大缩小。最后说点我的实际感受做了好几轮异步SAR逻辑的流量和后端配合我自己最大的体会是综合后出错工具bug占的比例极低绝大部分问题都出在我们对“工具如何看待异步电路”的认知偏差上。综合工具不是不能做异步逻辑但它需要你给它清晰的时序边界和明确的约束意图。你不在代码里把状态隔清楚不在约束里把路径管明白工具就只能按照它默认的同步世界观乱猜。所以我后来养成了一个习惯每次综合后出问题第一件事不是打开波形而是先问三句话——这里有没有组合环工具推断出了几个锁存器异步边界到底有没有被人为约束过这三个问题问完百分之七八十的错误原因基本就暴露了。然后再去跑仿真、挖波形效率会高得多。如果你也在做类似的事建议你先从这三句话开始。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑