假设你拿到一套毛坯房,想把它装成“一进门灯就亮、一开水龙头水温就合适”的智能样板间。第一件事不是搬家具,而是把需求画成效果图(这就是 RTL 代码);接着施工队把效果图翻译成材料清单和施工图——哪些墙要拆、哪里放柜体、配哪种门锁和烤箱(这是综合);然后木工电工进场,决定每个柜体摆在哪面墙、管线怎么从配电箱穿到每个房间(这是布局布线);最后是通电验收——按下开关,灯必须在一个整点到来之前亮起来,而且亮起后不能一闪就灭(这是时序分析)。整篇文章就沿着“装修”这条线,把 FPGA 后端三大阶段——综合、布局布线、时序分析——讲透。
理解 FPGA 后端实现流程与时序收敛方法论,是从“能写 RTL”迈向“能交付可靠硬件产品”的分水岭,也是 AI 加速芯片物理实现工程师的看家本领。
可视化演示
展示FPGA后端三大阶段:RTL综合为门级网表、布局布线映射FPGA物理资源、时序分析建立保持时间检查,交互切换理解实现流程。
本节配有交互动效(进入视口后自动加载,约 3KB)。
RTL综合Synthesis Verilog RTL转换为门级网表 逻辑优化与技术映射 RTL→Netlist 综合是FPGA实现的第一步
综合原理与映射
效果图是抽象的——业主说“这里要一面书架墙”,施工队得决定用哪种标准柜体、配几块层板、承重多少。RTL 代码里写“两个数相加”,综合器同样要翻译成具体材料:用几块查找表(LUT)、要不要进位链、能否直接调用一个 DSP 硬核。这一步就叫综合,它是从“行为描述”走向“物理实现”的第一座桥。
综合(synthesis)大体分两步:逻辑优化(logic optimization)和技术映射(technology mapping)。前者把 RTL 化简成更紧凑的布尔表达式,类似施工队删掉效果图里重复的装饰;后者把表达式装进 FPGA 真正拥有的资源——LUT、触发器(FF)、DSP、BRAM——产出的网表(netlist)就是布局布线的输入材料。
FPGA 的基本逻辑单元是查找表 LUT,它本质是一个“查表”电路。你可以把它想成一个小货架:货架有 2 的 K 次方个格子,每个格子预先填好 0 或 1;K 根输入线组成“索引”,索引到哪个格子就输出哪个值。正因为这种查表结构,同一块 K 输入 LUT 能实现任意 K 输入布尔函数——这是 FPGA 通用性的根源,也是映射算法的数学基础。
综合器像资深施工队长,它还会在“用料省”和“亮灯快”之间反复权衡:把复杂逻辑拆进更多小 LUT,面积省了但路径变长;直接调用 DSP 硬核,算得快但资源金贵。面积与速度的拉锯战,从这一阶段就正式开打。
- 输入端口数 KLUT 的输入引脚数量,FPGA 中常见 K=4 或 K=6,代表货架索引的位数。
- 输入组合总数K 个输入共有 2^K 种取值组合,每种组合对应真值表的一行,也就是货架上的一格。
- 可实现的函数数每个格子的输出可以填 0 或 1,所以所有填法共有 2 的 2^K 次方种,每一种填法就是一个布尔函数。
布局算法与资源
材料清单到手,下一步是把柜体、电器从清单上挪到真实房间。书架放门口还是阳台,直接影响走动路线。布局(placement)做的就是这件事:把网表中成千上万个 LUT/FF/DSP 单元,安排到 FPGA 网格坐标上的具体位置。
放置的目标是“总分最短”:彼此频繁连接的单元要尽量靠近,否则后面布线绕远,时序必差。同时布局器还要尊重物理资源分布——DSP 和 BRAM 只存在于固定的列上,把烤箱塞进衣柜里当然不行。此外,一个区域如果塞进了太多单元,布线通道会提前埋下拥塞隐患,所以布局阶段就会做拥塞评估(congestion estimation),好比装修前先算清每面墙能挂多少个柜体。
现代布局器最经典的算法是模拟退火(simulated annealing):先给所有单元一个随机摆放,然后反复尝试交换两个单元的位置,看总代价(线长、拥塞)是否下降。下降就接受;变差则按一定概率“勉强接受”,靠这种容忍差的策略跳出局部最优。温度 T 高时像漫无目的地瞎逛,随着 T 降低,算法逐渐收敛到精细调整。
家具放得好不好,直接决定水电工后面好不好干活。布局把“经常一起用”的电器聚在一起,等于提前给时序收敛打好了第一层地基。
- 代价增量新布局相对旧布局的代价差,线长变短为负、变长为正。
- 温度参数 T控制随机扰动幅度的调度参数,随迭代进程逐渐降低。
- 接受较差解的概率ΔE 为正时,以 e 的负 ΔE/T 次方概率接受;T 大则容易接受“差一点”的方案,T 小则几乎只挑好的。
布线算法与拥塞
家具就位后,水电工进场:把每个插座、开关、烤箱用管线连起来。FPGA 里没有“无限长的电线”,只有一层层可编程开关与短导线组成的布线资源网络。这些资源抽象成一张巨大的图,叫布线资源图(routing resource graph)。
布线器要为每条信号在这张图上找一条可行路径:从源单元引脚出发,穿过若干开关盒与线段,到达目的引脚——本质是导航软件式的路径搜索,常用迷宫布线或 A*/Dijkstra 变体。资源有限,所有信号都想抄近路,当某个区域被线段塞满,就产生拥塞(congestion),布线器不得不拆线重布(rip-up and reroute),把绕路的信号挪到空闲区域。
时序驱动布线(timing-driven routing)则会“偏心”:给关键路径上的网线更高优先级,让它们优先使用更宽、更快的长线,少绕弯。为什么线延迟如此重要?因为一根线被拉长一倍,其电阻电容延迟大约按平方关系增长——就像水管越长,水压损失越厉害,灯亮之前信号本身可能就先“迟到”了。
管线走得漂亮,通电验收才不会亮红灯;反过来,管线绕了三个房间,电线本身就是最大的“迟到分子”。所以布线器宁可让普通信号多绕两步,也要保证关键信号走直线。
- 第 i 级单元延迟路径上每个 LUT/FF 等逻辑单元的固有延迟。
- 第 j 段线网延迟每段布线的电阻电容延迟,与线长和走线层的宽度相关。
- 路径总延迟把 M 级单元延迟与 N 段线延迟全部相加,得到这条路径端到端的传播时间。
时序分析基础
装修完工后的验收夜,全屋唯一的“报时器”开始工作:每天晚上 7 点整,所有检查员同时按下开关,看每盏灯能不能在规定时刻亮起,亮起后能不能稳得住。这个报时器,就是数字电路里的时钟(clock)。
要让触发器正确采样,数据必须满足两个条件。建立时间(setup time):在时钟有效沿“之前”至少提前 Tsetup 稳定下来,像灯必须在 7 点整之前准备好;保持时间(hold time):在时钟沿“之后”还要继续维持 Thold 不变,像灯亮起来后至少坚持到 7 点零 0.1 秒,不能立刻灭掉。两条约束缺一不可。
静态时序分析(STA, Static Timing Analysis)就是这支验收队伍:它不依赖仿真波形,而是穷举设计中所有寄存器到寄存器的路径,逐条核对建立与保持是否满足。核心变量有四个——时钟周期 Tclk、触发器从时钟沿到输出稳定的时间 Tco、路径上组合逻辑与线网延迟 Tlogic、以及时钟到达源端和目的端的偏斜 Tskew。
除了建立时间,还有一条容易被忽视的保持时间约束。它检查的是“最快的路”——数据如果到得太快,在沿后立刻变化,就会把上一拍的数据顶掉。
建立时间像“灯必须赶在整点前亮”,保持时间像“灯亮了不能马上灭”。STA 就是拿着秒表逐间房验收的质检员,它会精确地告诉你每间房差多少、超多少。
- 保持时间 Thold时钟沿之后,数据必须继续维持不变的最短时长。
- 不等式含义源触发器吐出的新数据,最早也不能早于目的触发器读完旧数据的那一刻,否则就“覆盖”了采样窗口。
时序违例修复
质检报告出来了:大部分房间合格,但客厅顶灯这条链路,信号比要求时间晚到了 0.3 纳秒——这就是时序违例(timing violation)。报告首页两个关键数字:WNS(最差负裕量)是全场最差一条路径有多惨,TNS(总负裕量)是全场总共有多少违例量。
裕量(slack)的定义很朴素:要求时间减到达时间。为正说明按时到达,为负说明迟到。定位违例时,先看 WNS 找到最差那条路,再用报告把路径展开到具体层次化模块——就像质检员圈出“客厅顶灯”后,还要打开吊顶看看是哪段线路绕了远。
修复手段通常分几路并进。插流水线:在长组合链中间切一刀,插一组寄存器,把一段长路拆成两段短路;重综合/物理综合:让综合器针对关键路径重新优化逻辑级数;布局约束:用 Pblock 等把相关单元物理拉近,缩短线延迟;还有一条“剑走偏锋”的路——如果这条路径本来就是允许跨多个时钟周期完成的多周期路径,就在 SDC 约束文件里声明 multicycle path,让工具按正确时序要求检查,而不是误报违例。
修复时序违例就像装修返工:先看质检报告圈出的最差房间,再检查那面墙里的管线为什么绕远;要么加一个转接插座把线路分段(流水线),要么把设备挪近(布局约束),要么在验收标准里注明“这盏灯本来就可以晚点亮”(多周期约束)。
- 单条路径裕量每条寄存器到寄存器路径各自的 slack 值。
- 取负值部分只保留小于零的裕量,正裕量按 0 处理,表示只统计“欠债”。
- 总负裕量把所有违例欠债相加,TNS 越负,说明需要修复的路径越多或越严重。
跨时钟域处理
不是所有房间共用同一个报时器。客厅报时器 7 点整,卧室报时器每 7 点过一分才响——两个时钟不同步,信号从客厅传到卧室时,卧室的触发器很可能恰好踩在信号“半明半暗”的瞬间采样。
这个“半明半暗”的中间态叫亚稳态(metastability):触发器输出既不是确定的 0,也不是确定的 1,而是在合法电平之间振荡、缓慢恢复的非法电压。更危险的是,这个不确定值会像传染病一样往后级逻辑传播。亚稳态无法根除,工程上的目标是把它出现的概率压到足够低——低到设备寿命期内几乎不可能发生。
最常用的手段是两级同步器:用两个背靠背的触发器“打两拍”,给亚稳态留出一整个时钟周期的恢复时间。单比特控制信号跨域多用此法;多比特数据则要搬进异步 FIFO 或走握手协议,配合格雷码指针,让读写指针跨域时最多只有 1 比特翻转,避免多位同时跳变被采乱。CDC 验证工具会穷举所有跨域路径,确认每一条都有同步机制兜底。
两个不同步的房间之间,门口必须设一个“翻译缓冲台”:单比特信号打个招呼再进门(两级同步器),整包数据则放进中转仓库按节奏搬运(异步 FIFO)。没有这层缓冲,房间之间就会频繁“鸡同鸭讲”。
- 解析时间触发器输出必须稳定下来的时间窗口,窗口越长越难满足。
- 亚稳态时间常数触发器从亚稳态恢复的快慢参数,工艺相关,通常只有皮秒级。
- 捕获窗口宽度触发器判定为亚稳态的采样窗口时间宽度。
- 频率乘积采样时钟频率与数据变化频率相乘,代表亚稳态被踩中的机会密度。
- 平均无故障时间分子指数增长、分母线性增长,因此每多一级同步,MTBF 都会指数级改善。
流水线设计优化
装修公司发现一间一间做太慢,改成流水作业:木工在 A 房装柜子,同时电工在 B 房布线,油漆工在 C 房刷墙——三间房同时推进,总工期大幅缩短。这就是流水线(pipeline)思想。
电路同理:一条组合逻辑链太长,时钟只能放慢;把链条在中间切开,插上一排触发器,数据像接力棒一样一段段传递。切分后每一段组合逻辑都变短了,时钟就能跑得更快,整个系统的吞吐率(每秒处理的数据量)随之提升。这就是修复 setup 违例时“插流水线”能立竿见影的原因。
流水线设计的关键是寄存器平衡(retiming):各段延迟要尽量均匀,因为最慢的一段决定整条流水线的周期——就像装修流水线上,油漆工把一面墙刷三小时,整条线就只能按三小时节拍走。同时要接受一个事实:从单个数据输入到输出的延迟(latency)会增加,因为要经过更多级工序;但流水线上同时有很多数据在排队加工,整体吞吐仍然大幅提升。
流水线不是“蛮力插寄存器”,而是像装修公司排工序那样精心算计:哪段活重就多分几级,哪段活轻就合并,最终让所有工序几乎同时收工——这是时序收敛中最常用的“提速大法”。
- 第 k 级流水段延迟第 k 段包含的组合逻辑延迟加上触发器开销。
- 取最大值整条流水线的节拍由最慢的一段决定,类似木桶效应。
- 最小可用的时钟周期所有段中最长的那个延迟,就是时钟周期能压到的最小值,其倒数即最大吞吐率。
AI 应用场景
高速 SerDes 通信接口时序收敛
阶段:AI 加速芯片/FPGA 原型验证中的硬件后端实现阶段
解决的问题:10G/25G 以太网或 PCIe 接口数据通路组合逻辑深、频率要求高,布局布线后 STA 报告 WNS 违例。传统做法靠经验盲目降频,而 AI 训练与推理集群对带宽极度敏感,硬件工程师必须快速迭代时序收敛,才能匹配上层算法的吞吐需求。
具体案例:某 AI 推理加速卡上的 10G MAC 接收通路在 250MHz 下 setup 违例 0.4ns。工程师打开 STA 报告定位到 CRC 校验链路,在中间插入两级流水线并用 Pblock 把相关 LUT 物理拉近,关键路径延迟从 4.6ns 降到 3.7ns,WNS 由负转正,顺利通过时序签核。
多时钟采集系统的跨时钟域桥接
阶段:AI 数据管道(传感器采集 → FPGA 预处理 → 上送处理器)中的时钟域设计
解决的问题:图像传感器像素时钟与系统总线时钟异步,直接连接会频繁进入亚稳态,导致点云与图像数据偶发错位、校验失败。传统接法靠“运气”,AI 时代数据量激增后错误概率被放大到不可接受。
具体案例:激光雷达信号处理 FPGA 中,将 50MHz 像素域数据通过异步 FIFO 桥接到 200MHz 处理域,读写指针采用格雷码跨域,指针同步用两级触发器。改造后跨域误码率从 10^-6 量级降至仪表可测下限以下,点云拼接不再出现“飞点”。
星载 FPGA 的面积与速度权衡
阶段:边缘智能与高可靠场景的硬件综合优化阶段
解决的问题:卫星载荷对资源与功耗极其敏感,综合时不能一味求快。综合器需要在面积优先与速度优先之间找平衡,必要时通过资源共享牺牲少量时序换取大量资源。
具体案例:一颗遥感卫星上的 FPGA 资源利用率逼近 92%,综合器在面积优先模式下自动共享互斥的乘法器与加法器,把 DSP 用量砍掉 30%。关键路径虽然增加了 0.5ns,但配合两处流水线微调后仍满足 100MHz 预算,最终通过时序验收并降低整板功耗。
Python 演示
# 简易 STA 演示:DAG 关键路径分析与建立时间违例检测from collections import defaultdict, deque # 单元延迟(ns):触发器与组合逻辑的简化延迟模型delay = { "ff1/q": 0.2, "ff2/q": 0.2, "lut1": 0.4, "lut2": 0.4, "lut3": 0.4, "dsp": 1.2, "mux": 0.3, "ff3/d": 0.0,} # 有向边:信号流向,终点为寄存器采样端 ff3/dedges = [ ("ff1/q", "lut1"), ("ff2/q", "lut1"), ("lut1", "lut2"), ("lut2", "dsp"), ("dsp", "lut3"), ("lut3", "mux"), ("ff2/q", "mux"), ("mux", "ff3/d"),] def build_graph(edges): graph = defaultdict(list) # 前驱到后继 preds = defaultdict(list) # 后继到前驱 indeg = defaultdict(int) for src, dst in edges: graph[src].append(dst) preds[dst].append(src) indeg[dst] += 1 return graph, preds, indeg def longest_path(delay, edges): graph, preds, indeg = build_graph(edges) # 到达时间:自身延迟 + 最晚前驱的到达时间 arr = dict(delay) q = deque([n for n in delay if indeg[n] == 0]) while q: u = q.popleft() for v in graph[u]: arr[v] = max(arr[v], arr[u] + delay[v]) indeg[v] -= 1 if indeg[v] == 0: q.append(v) return arr, preds def critical_path(end, preds, arr): path = [end] while preds.get(path[-1]): cur = path[-1] prev = max(preds[cur], key=lambda p: arr[p]) path.append(prev) return list(reversed(path)) Tclk = 4.0Tsetup = 0.3end = "ff3/d"arr, preds = longest_path(delay, edges)required = Tclk - Tsetupslack = required - arr[end] path = critical_path(end, preds, arr)print("数据到达时间 arrival(%s) = %.2f ns" % (end, arr[end]))print("数据要求时间 required = %.2f ns" % required)print("建立时间裕量 slack = %+.2f ns" % slack)print("关键路径:", " -> ".join(path))print("结论:", "满足 setup(MET)" if slack >= 0 else "setup 违例(VIOLATION)")
arr = dict(delay)每个节点的初始到达时间就是它自身的延迟,相当于“进门就要花掉的材料费”。q = deque([n for n in delay if indeg[n] == 0])从没有前驱的输入寄存器开始,像验收队从源头逐级推进。arr[v] = max(arr[v], arr[u] + delay[v])核心递推:一条路径的到达时间等于最晚前驱的到达时间加上自身延迟,STA 就是靠这条规则逐级累加的。slack = required - arr[end]把要求时间减去到达时间,得到建立时间裕量,正负直接决定验收结论。prev = max(preds[cur], key=lambda p: arr[p])从终点往回找到达时间最晚的前驱,把关键路径完整还原出来。print("结论:", "满足 setup(MET)" if slack >= 0 else "setup 违例(VIOLATION)")输出与 STA 报告一致的验收判定。
常见误区
误区反正有综合器帮我转电路,Verilog 写得像 C 语言也没关系,工具会自动优化成好电路。
正解综合器只接受可综合子集(寄存器、组合逻辑等),initial 语句、#延迟、不可展开的循环要么报错要么被忽略。同样的功能,写成一长串 if-else 可能综合出级联比较器,写成 case 则映射为并行选择器,网表质量天差地别。效果图画得再炫,施工队也得有明确的做法和材料。
为何常见:综合工具自动化程度高,容易给人“黑盒”错觉;而且仿真能过的代码,不一定能综合出期望的电路。
误区一键跑完 place & route,FPGA 工具会自动保证我的设计满足时序。
正解工具只在约束(SDC)正确的前提下优化。没写时钟约束、误设 false path,工具就会把资源浪费在无关路径上,真正关键的路反而没人管。时序是否收敛,最终靠 STA 报告人工判断——就像施工队再专业,也得按验收标准干活。
为何常见:厂商工具封装得太“一键化”,让人误以为约束是工具自动生成的,而忽略了约束本身就是设计的一部分。
误区时钟频率越低路径越容易满足,所以只要把频率降下来,所有时序问题都能解决,保持时间无关紧要。
正解保持时间检查的是“最快路径”,与时钟周期无关。信号跑得太快、组合逻辑太短时,可能在沿后还没稳定够就冲到下一级,把上一拍的数据顶掉。工艺越先进,hold 违例越常见,修复通常靠插延迟缓冲器。快也会闯祸,这才是保持时间反直觉的地方。
为何常见:建立时间与频率挂钩,直观好懂;保持时间违背“越快越好”的直觉,容易被轻视。
误区时钟跑不动就降频率,简单粗暴,反正功能正确就行。
正解降频牺牲性能且治标不治本。正确顺序是看 STA 报告定位关键路径,再选择插流水线、重综合优化逻辑级数、用布局约束缩短线长、或修正 SDC 多周期路径。降频应该是最后手段,而不是第一反应。
为何常见:降频立竿见影且不需要理解深层原因,是新手最容易走上的“捷径”。
误区只要数据跨时钟域就打两拍,所有亚稳态问题全部解决。
正解两级同步器只适用于单比特控制信号,而且它降低的是亚稳态传播概率而非彻底消除。多比特总线跨域打两拍会导致各位采样时刻不一致,必须用异步 FIFO 或握手协议;快时钟到慢时钟还要保证信号维持时间足够长。CDC 验证要逐条确认每条跨域路径都有正确机制。
为何常见:“打两拍”被很多教程当作标准答案,听起来像万能药,让人忽略了完整 CDC 方法论。
面试题
Q1. 综合(synthesis)阶段的主要产物是什么?
- A.将 RTL 转化为门级网表← 正确答案
- B.将逻辑单元摆放到阵列
- C.连接各单元间的信号线
- D.检查时钟是否满足时序
答案:A。综合把 RTL 行为描述翻译成由 LUT、FF、DSP 等单元组成的门级网表,相当于施工队把效果图变成材料清单;布局摆位置、布线连线路、时序分析做验收,分别是后续阶段的事。
Q2. 布局(placement)阶段主要完成什么?
- A.决定逻辑单元在器件上的位置← 正确答案
- B.把硬件描述语言翻译成网表
- C.生成用于下载的比特流文件
- D.对设计进行功能级仿真
答案:A。布局负责把网表中的单元安排到 FPGA 网格的具体坐标上,目标是让互连密切的单元靠近,对应装修中“家具摆位”。翻译网表是综合、生成比特流是布局布线之后、仿真是前端的活。
Q3. 建立时间(setup time)是指什么?
- A.数据必须在时钟沿前稳定的最短时间← 正确答案
- B.数据必须在时钟沿后保持的最短时间
- C.时钟从源端到达目的端的时间
- D.信号在组合逻辑中的传播时间
答案:A。建立时间要求数据在时钟有效沿之前提前稳定,像灯必须在整点前准备好;沿后保持的最短时间叫保持时间,时钟走线延迟叫偏斜,组合逻辑传播时间属于路径延迟的一部分。
Q4. 关于保持时间(hold time),下列说法正确的是?
- A.数据在时钟有效沿后保持稳定的最短时间← 正确答案
- B.数据在时钟有效沿前到达的最晚时间
- C.保持时间违例可通过提高频率修复
- D.保持时间只与时钟周期大小相关
答案:A。保持时间是沿后数据必须维持不变的最短时间。它与时钟周期无关,所以提高频率无法修复 hold 违例;相反,数据到得太快才容易破坏上一拍的数据,通常靠插延迟缓冲器修复。
Q5. 某寄存器到寄存器路径:时钟周期 5ns,Tco=0.5ns,组合逻辑延迟 3.2ns,建立时间 0.3ns,则建立时间裕量 slack 为?
- A.1.0ns← 正确答案
- B.0.6ns
- C.1.4ns
- D.0.4ns
答案:A。slack = Tclk - Tco - Tlogic - Tsetup = 5 - 0.5 - 3.2 - 0.3 = 1.0ns。就像装修验收:总预算 5 小时,材料搬运和施工占了 3.7 小时,再扣掉 0.3 小时准备时间,还剩 1 小时富余。
Q6. 关键路径(critical path)通常指的是?
- A.组合逻辑与线延迟之和最大的路径← 正确答案
- B.包含逻辑电路单元数量最多的路径
- C.需要跨越多个时钟域的复杂路径
- D.在版图上布线长度最短的路径
答案:A。关键路径是延迟总和最大、最容易导致 setup 违例的路径,单元数量多不代表延迟大,布线最短更不可能。定位关键路径是时序修复的第一步,相当于先找到全屋最慢的回路。
Q7. 下列哪些手段可以有效修复建立时间违例?
- A.在关键路径中插入流水线寄存器← 正确答案
- B.优化组合逻辑级数降低路径延迟← 正确答案
- C.用布局约束缩短关键单元间距← 正确答案
- D.简单提高系统全局时钟频率
答案:ABC。插流水线把长路切短、优化逻辑级数直接降低延迟、布局约束缩短线长,都是标准修复手段。提高频率只会让预算更紧、违例更严重,方向完全相反。
Q8. 关于跨时钟域(CDC)处理,正确的说法有?
- A.单比特跨域常用两级同步器处理← 正确答案
- B.多比特跨域宜用异步 FIFO 桥接← 正确答案
- C.两级同步器可彻底消除亚稳态
- D.同步器能降低亚稳态传播概率← 正确答案
答案:ABD。两级同步器适合单比特信号,异步 FIFO 用于多比特数据,二者都只是把亚稳态概率压到极低而非消除。说“彻底消除”是错的——亚稳态是物理现象,只能通过 MTBF 量化控制,不能根除。
Q9. 综合时采用资源共享(resource sharing)的代价通常是?
- A.增加组合逻辑级数并可能恶化时序← 正确答案
- B.一定能同时改善面积与工作速度
- C.会减少设计中寄存器的使用数量
- D.能够消除所有可能的时序违例
答案:A。资源共享让多个运算共用同一个算术单元,省了面积,但往往要在输入端加多路选择器、在输出端加控制逻辑,级数变深、路径变长,时序可能变差。它是典型的面积与速度权衡。
Q10. STA 报告中,下列哪些情况需要特别关注?
- A.保持时间裕量为负且 WNS 违例← 正确答案
- B.关键路径穿越未约束时钟域← 正确答案
- C.跨时钟域路径缺乏同步处理← 正确答案
- D.WNS 为正但 TNS 同时为负
答案:ABC。hold 违例与未约束/未同步的跨域路径都可能造成真实功能错误。D 在逻辑上不可能成立:WNS 是所有路径中最差的 slack,WNS 为正说明没有负 slack,TNS 必然为 0,不可能同时为负——这类自相矛盾的指标一旦出现,说明报告或约束本身就出了问题。