FPGA 原型验证专题 23:Gate→RTL 数据回映——查表、层次聚合、波形/SAIF 生成与重命名恢复
更新时间:2026-09-12。本文是「ASIC FPGA 原型验证系统」专题 06~25 深体系列分册,对应阶段 6(后处理映射)。映射表见 17 info_table 映射表 GateID↔RTLID/回溯/版本,原始数据来自 22 Gate 域信号采集 ILA/trace/带宽深度权衡,输出供 25 真实激励驱动 ASIC 签核 SAIF 反标/边界。
这一篇在链路里的位置
阶段 6 把"硬件能产生、但人/ASIC 工具读不懂"的 Gate 域数据,变成"对齐到原始 ASIC RTL 层次"的数据。它由原型团队主导流程、Compiler 团队保障映射表与归并语义。没有这一步,阶段 5 跑得再久也无法反哺 ASIC 分析。
本文要回答的问题
- 回映管线如何串:原始 Gate 数据 + info_table → 逐条查表 → 还原层次 → 聚合输出?
- 多对多映射怎么处理:一个 RTL 信号对应多根 gate net、向量打包、常量/消失信号?
- 活动统计如何归属:翻转次数、T0/T1、glitch 在 FPGA 数据里如何对待(能否用于功耗)?
- 如何生成 SAIF/层次化波形?总线/数组/generate 下标如何重建?被重命名/优化掉的信号怎么办?
- 多片数据如何按统一时钟周期对齐合并?跨片 TDM 延迟如何还原到事务时间?
- 回映的完整性度量:可还原信号占比、观测缺口如何报告?
- 版本门禁:如何在回映前强制校验数据/表/比特流同源,错版如何快速失败?
一、管线总览:输入、处理、输出
[采集原始数据 ×N片] ──┐
(build_id 头, GateID键) │
[info_table 同 build_id]┼─→ ①版本门禁 → ②查表 join → ③多对多归并
[TDM 时槽表] │ │
[时钟/频率计划] ──┘ ┌─────────────────┴────────────────┐
↓ ↓
④名字/层次/向量重建 ⑤时间重建(周期/跨片/TDM)
└─────────────────┬────────────────┘
↓
⑥输出 RTL 层次波形(VCD/FSDB 类) + SAIF + 覆盖率/计数
↓
⑦完整性与缺口报告(可还原覆盖率、eliminated 清单)输入是 22 Gate 域信号采集 ILA/trace/带宽深度权衡产物(波形流或活动计数,只含 GateID/槽位+时间)加 17 info_table 映射表 GateID↔RTLID/回溯/版本;输出是对齐到原始 ASIC RTL 层次、ASIC 工具链可直接读取的波形与活动文件。主导方是原型团队,归并语义和特殊单元折算由 Compiler 团队在 info_table 里预先定义。
把这条管线画成数据流图,可以看到版本门禁是整个管线的咽喉——两路输入(采集数据、info_table)都必须先过门禁,任何一步失败都不会有下游产物:

图中两个值得注意的结构点:一是门禁汇合了两路输入,说明「数据对不上表」和「表对不上版本」在工程上是同一类故障,处理方式也相同——直接 fail;二是归并之后才分叉出名字/时间重建,意味着多对多语义的裁决必须先于任何面向人的呈现,否则重建出的波形会把错误归属带进 RTL 层次。
二、第一步永远是版本门禁
打开任何采集文件先做三件事,任一不过直接 fail、不产出任何结果文件(宁可没有数据,不要错误数据):
- 采集头
build_id== info_table 构建头 build_id == manifest(20 比特流烧录与四方版本一致 manifest/门禁); - info_table 中网表哈希、GateID 表哈希与 manifest 一致;
- 采集配置的 probe 槽位表版本与 info_table 的 probe 三元组(17 info_table 映射表 GateID↔RTLID/回溯/版本)一致。
三道门禁各自的校验对象、典型失配原因与失败后果可以归纳如下表,排查版本问题时按表逐项对照最快:
| 门禁项 | 校验对象 | 典型失配原因 | 不拦截的后果 |
|---|---|---|---|
| build_id 三方一致 | 采集头 / info_table / manifest | 用了上一轮构建的映射表跑新数据 | 整份回映数据张冠李戴 |
| 网表与 GateID 表哈希 | info_table 与 manifest | Compiler 重跑过但表未重新交付 | GateID 查错行,信号归属全乱 |
| probe 槽位表版本 | 采集配置与 info_table 三元组 | 换过插桩配置而采集脚本未更新 | 槽位错位,波形通道互相串 |
表中最隐蔽的是第三项:前两项失配通常大面积报错、容易发现,槽位表失配可能只影响部分通道,产出的波形「看起来合理」却是错的,这正是门禁必须前置到任何处理之前的原因。
三、查表与多对多归并
按 rel 类型(17 info_table 映射表 GateID↔RTLID/回溯/版本)逐类处理:
- direct 1:1:值/翻转直接搬运;
- replicate 1:N(一根 RTL 信号被复制成多根 gate net):波形取副本间一致性校验后取任一副本(理论同值,不一致说明采集或时序有问题,要报 warning);翻转计数按去重计——同一逻辑跳变在多副本上各产生一次,只计 1;
- merge N:1(多 RTL 信号共享一根网):波形归属主源,非主源标记「共享观测」;活动计数不重复分摊给多个源做总和(会虚高),需要精细功耗时按来源占比模型加权,并在数据上标注「估算」;
- bus_expand:按位选择把
[i]位拼成 RTL 向量,逐周期重建整向量值(状态机枚举值由此恢复,24 活动覆盖率与性能调试闭环 热点/瓶颈/回放需要); - repack/blackbox_port:BRAM 替身的端口活动按规则库位映射台账(11 ASIC→FPGA 等价单元替换 SRAM/时钟/IO/PHY)拆回原 SRAM 端口;位宽拼接/加宽(ECC)的多余位活动丢弃或单列,不计入原实例;
- constant:恒值信号直接填常量,不占采集带宽;
- eliminated:输出中该信号标记
UNOBSERVABLE而非填 0——填 0 会被下游当成「零翻转真数据」。
把七类关系的归并语义横向对比,可以看出每类处理的核心分歧点只有两个:波形值从哪来、翻转计数怎么算——这两个维度决定下游功耗与覆盖率结论的可信度:
| rel 类型 | 映射基数 | 波形处理 | 翻转计数口径 | 必须标注 |
|---|---|---|---|---|
| direct | 1:1 | 直接搬运 | 直接搬运 | 无 |
| replicate | 1:N | 副本一致性校验后取任一 | 去重,只计 1 次 | 副本不一致告警 |
| merge | N:1 | 归属主源 | 不重复分摊,精细功耗按占比加权 | 「估算」标记 |
| bus_expand | 位选拼向量 | 逐周期重建整向量 | 按重建向量统计 | 枚举值恢复 |
| repack/blackbox_port | 端口规则映射 | 按台账拆回原端口 | 多余位(ECC 等)单列 | 折算规则 ID |
| constant | 0:1 | 填常量 | 零翻转 | 常量值 |
| eliminated | 消失 | UNOBSERVABLE | 无数据 | 进缺口清单 |
表中 eliminated 一行是整条管线的「诚实底线」:宁可让下游看到一个空洞,也不能塞一个假零进去——前者触发补采或估算流程,后者静默污染功耗结论。
四、名字、层次与特殊单元重建
- 全限定名按 info_table 的层次锚点链重建(16 GateID 与逻辑网表模型 cell/net/ID 分配),generate 下标还原为
inst[3].q形态(17 info_table 映射表 GateID↔RTLID/回溯/版本); - retiming 移动过的寄存器按 moved 链挂回原始 RTL 信号,波形里呈现原信号名,但标注「观测点在移动后寄存器,延迟 1 拍」这类偏差;
- 替换单元的活动折算:SRAM→BRAM 后内部信号不可见,回映只输出端口级波形;SAIF 中存储阵列内部活动按端口模型(使能、读写、翻转位比例)折算,折算模型 ID 和参数随数据输出(25 真实激励驱动 ASIC 签核 SAIF 反标/边界 据此决定可信度等级);
- TDM 割边信号:wrapper 接收侧时隙流解聚合——按时槽表把 R 个时槽的数据还原成 R 个逻辑信号在连续逻辑周期上的值;静态 TDM 下这些信号的「时间轴」比片内稀疏,活动计数的 TC 也要用时隙有效周期数而不是物理周期数(19 原型频率与时序收敛 TDM 降频/关键路径)。
名字与层次重建的三条主线可以画成一张结构图:info_table 提供的层次锚点链、moved 链、位映射台账分别支撑三类恢复,最终都汇入同一棵 RTL 层次树:

这张图也揭示了为什么 info_table 是阶段 3 就必须冻结的交付物:三类锚点少了任何一个,回映时就只能用猜的——而猜测产生的名字在波形工具里和真名长得一模一样,排查成本极高。
五、时间重建:让多片数据落在同一根时间轴
- 周期网格:所有数据换算到「逻辑周期」而非物理纳秒——以各时钟计划(频率、分频、TDM 比率)为参数;同域数据按周期戳对齐;
- 多片合并:按同步清零的周期计数器(22 Gate 域信号采集 ILA/trace/带宽深度权衡)归并,触发广播的标定延迟在此补偿;
- 跨时钟域:不同时钟域各自建周期轴,交叉信号(握手、FIFO 边界)用时间戳区间标注,不强行插值;
- 锁步 co-model 模式(21 激励注入与软硬协同 co-model/transactor)的停钟区间必须从时间轴中扣减——活动率分母用「DUT 实际运行周期数」,否则经过停等的负载 T0/T1 全错;
- 触发窗口拼接:同一长负载分段录制时,按屏障快照点拼接,重叠窗口数据做一致性校验。
多片数据对齐的完整时序可以用一张交互图说明:同步清零广播是所有片共同的「时间零点」,触发广播的标定延迟在归并时补偿,跨时钟域信号只在握手事件处建立对应:

图中「锚点之间不做插值」是最容易被违反的一条:人眼看波形时天然想把两段曲线连起来,但两个异步域在握手之间没有定义明确的相对时刻,插值出来的「对齐」是假象。
六、输出产物
- RTL 层次波形:VCD/FSDB 类格式,层次树按原始 ASIC RTL 组织,变量名是 RTL 名,值按逻辑周期变化;可直接在 DVE/Verdi 类工具里对着 RTL 源码回放;
- SAIF(开关活动交换格式,背景见 23 SAIF):每个网/实例的 TC(观测周期数)、T0/T1(0/1 时间占比)、TG(内部翻转计数,视可得性)、IG(忽略标记);按实例层次聚合,直接喂 ASIC 功耗分析工具;
- 覆盖率/计数辅助文件:枚举状态覆盖、断言命中、自定义性能事件(24 活动覆盖率与性能调试闭环 热点/瓶颈/回放);
- 每个输出文件头同挂 build_id + 折算参数 + 观测覆盖率。
三类产物的消费方与关键字段各有不同,用一张表对齐它们的定位:
| 产物 | 消费方 | 关键字段 | 常见误用 |
|---|---|---|---|
| RTL 层次波形 | 人(调试)+ Verdi 类工具 | RTL 名、逻辑周期值 | 拿稀疏采样波形当连续波形读 |
| SAIF | ASIC 功耗分析工具 | TC/T0/T1/TG/IG | 把估算值当实测值反标 |
| 覆盖率/计数文件 | 验证与性能回归 | 状态覆盖、事件计数 | 跨 build 直接比绝对数 |
这张表同时解释了文件头三件套(build_id、折算参数、观测覆盖率)存在的理由:三种消费方都需要先回答「这份数据是真是假、覆盖到哪」,才能决定怎么用它。
七、完整性与可信度:说清楚什么没有
回映报告必须给出而不是藏起来的信息:
- 可观测覆盖率:有真实采集数据的 RTL 信号/实例占比;分模块统计(如 core 92%、PLL 黑盒 0%);
- eliminated/constant/估算 三类清单:哪些信号被优化消失、哪些恒值、哪些活动是模型折算而非实测;
- glitch 口径:FPGA 采到的是寄存器/探针采样点值,组合逻辑毛刺在周期级采集中天然被滤掉——SAIF 的 TG 不含 FPGA 布线毛刺,也不能把 FPGA 组合延迟上的毛刺当成 ASIC 毛刺证据;ASIC 功耗工具的 glitch 推断由其库模型另行处理;
- 采样误差:稀疏采样(1/N 周期)模式给出置信区间参数;亚稳态窗口采到的 X 要保留为 X 而不是强行二值化;
- TDM 稀疏度:每个割边信号的有效观测周期比例。
这些元数据让 25 真实激励驱动 ASIC 签核 SAIF 反标/边界能给每块数据分级,而不是让下游把「原型活动文件」当作无差别真理。
完整性报告内部的五项内容与它们守护的下游结论之间的关系,可以画成一张归属图:

五项信息共同回答一个问题:「这份活动数据的每一个数字,分别有多少把握」。缺任何一项,下游就只能二选一——要么全盘信任(危险),要么全盘弃用(浪费一次昂贵上板)。
八、工程化:海量 trace 的处理方式
十亿门级原型、小时级负载的 trace 体量在 TB 级,处理方式:
- 流式管线:采集文件按片/时间窗口分片,join 用排序合并而非全量装内存;info_table 的 gid→rid 映射做成只读哈希/排序列;
- 活动计数先行:SAIF 聚合是加法语义(计数累加),可边采边在主机侧增量聚合,不必先落完整波形;只有调试窗口才走波形重建;
- 增量回映:同一 build_id 下多轮用例的活动文件可直接相加(TC/T0/T1 累加),回归时按用例维度存储,支持子集重算;
- 回归比对:新旧 build 的同用例活动做结构对齐后 diff(用 RTL ID 而非 GateID 对齐——GateID 跨版本不稳定,16 GateID 与逻辑网表模型 cell/net/ID 分配,RTL ID 在 RTL 未变时稳定,10 RTL ID 体系 分配规则/层次绑定/稳定性),异常跳变(某模块翻转率突然 ×3)自动标红,这是发现「修复引入新行为」的便宜手段;
- 输出校验:重放已知黄金窗口(几个周期的全信号波形与仿真对拍,08 不可综合构造识别与存根替换 模拟IP/时钟门控)做端到端正确性抽检——连这段都对不上,整条采集-回映链就不可信。
流式管线的数据流向可以归纳成一张结构图:分片数据与只读映射表在 join 层汇合,之后兵分两路——计数走增量聚合直达 SAIF,波形只在调试窗口才重建:

图中「计数先行、波形殿后」的分叉是控制 TB 级成本的关键决策:波形重建的算力与存储消耗比计数聚合高几个数量级,让它只服务调试窗口,主干管线才能保持线性吞吐。
九、回映质量的量化与审计:别让「看起来合理」冒充可信
回映管线跑通、能产出 RTL 波形和 SAIF 之后,真正的风险才开始:一份文件格式正确、数值「看起来合理」的活动数据,仍可能因归并错误、版本错位或覆盖率不足而悄悄带偏下游功耗结论。阶段 6 必须用可量化、可审计的质量门禁,把「我觉得对」替换成「这些指标证明它在多大范围内对」。
第一组指标是可观测覆盖率。 要按 RTL 实例和层次统计:有多少比例的设计信号/端口/寄存器能被某个 GateID 观测到,多少落在 eliminated(被优化消失)、blackbox(替身/库单元)、constant(恒值)或未采集区域。一个模块如果 95% 的内部节点都没有观测来源,那么给它算出的活动率基本来自默认填充而非测量,必须在报告里显著标红。覆盖率还要分「结构性可观测」和「实际有活动数据」两层——前者是这版探针能看到什么,后者是这次运行真的看到了什么(某些信号虽接了槽位但整段没采)。下游签核按模块的真实反标覆盖率决定结论分级,低于门槛的模块只能叫估算。
第二组是一致性与健全性检查(sanity checks)。 在时间轴、值域和结构三个维度自动稽核:时间轴上,多片归并后同一逻辑周期不应出现矛盾的边沿计数,跨域只在握手机时刻建立对应而非插值;值域上,T0+T1+TC 的占空比统计应自洽,单周期翻转计数不应超过物理可能(一位信号每周期最多翻转一次,超出说明时槽折算或去重有误);结构上,direct/replicate/merge/bus_expand 各类关系的归并结果要满足守恒——replicate 多副本的翻转去重后应计一次,bus_expand 逐位拼回的向量宽度要和 RTL 声明一致,repack 拆回 SRAM 时 ECC/冗余位必须单列不进有效位活动。任何守恒破坏都作为硬错误拦下,而不是写进备注继续流转。
第三组是与已知基准对拍(golden correlation)。 选一小批设计和激励,让仿真与原型在相同输入下各产一份活动数据,在 RTL 层次对关键信号逐周期对拍翻转时刻和 T0/T1。允许的偏差来源要事先讲清:周期采样天然滤掉组合毛刺(这是预期差异,且必须明确原型不能提供 glitch 证据)、观测点位置差异、稀疏采样误差。除单点对拍外,还应做模块级活动率的统计相关性分析(原型与仿真的逐实例翻转率排序是否一致、比值是否在标定范围内),偏差超阈的模块进入人工复核。对拍通过的「黄金窗口」固化为回归,每次改 Compiler 或回映脚本都重跑,防止工具演进引入静默回归。
第四组是过程留痕与可重算性。 每一份输出都应能凭证据袋重算:原始 trace、版本门禁记录、所用 info_table/映射表、归并规则版本、折算参数、默认填充策略、被标记为估算/不可观测的清单。审计者拿到 SAIF 应能回答「这个数是测出来的、传播出来的还是默认填的」。把来源分成测量、结构传播、显式默认三档并逐节点标注(绝不用零冒充测量零),是可信度报告的核心。配合自动化的质量仪表盘(每次构建后出覆盖率、守恒检查、与上版 diff、黄金对拍结果),回映质量就不再依赖个人经验,而成为一条带门禁、可追溯、能挡住脏数据进入签核的工业化管线——这正是 68 分析和 69 消费敢于信任数据的前提。
四组质量指标的检查维度与拦截方式对比:
| 指标组 | 检查维度 | 拦截方式 | 失败后的动作 |
|---|---|---|---|
| 可观测覆盖率 | 结构性可观测 vs 实际有数据 | 分模块阈值 | 低于门槛的模块降级为估算 |
| 一致性 sanity | 时间/值域/结构三守恒 | 硬错误拦下 | 对应分区作废重跑 |
| 黄金对拍 | 逐周期 + 模块级统计相关 | 偏差超阈复核 | 工具链改动回滚定位 |
| 过程留痕 | 证据袋完整性 | 发布门禁 | 缺失则不许入签核库 |
四组指标是递进关系:覆盖率决定「能信多宽」,sanity 决定「有没有明显算错」,对拍决定「和真值差多远」,留痕决定「出了问题能不能查回来」——四层都过,数据才有资格进签核流程。
十、规模与自动化:TB 级 trace 时代的后处理系统观
入门阶段可以把回映想成「读一个文件、查一次表、输出一个 SAIF」,但真实大规模 SoC 原型的后处理面对的是完全不同的量级:数十片 FPGA、数小时运行、每秒 GB 级 trace、数十亿个 GateID 命中。这时候管线成败不取决于算法对不对,而取决于它是不是一个可伸缩、可容错、可运营的数据系统。这一节用数据工程的视角重看阶段 6。
先正视数据规模与分层存储。 短而细的调试波形和长而粗的活动统计要走不同的管线:前者总量小但要求保留时间序和突发细节,适合在触发窗口内落盘后直接 join;后者总量极大但每条记录信息熵低(一个 GateID 加翻转计数/时间戳),应在片上或采集边缘就做压缩和增量聚合,绝不能把每个周期的原始翻转都搬到服务器。跨片数据是分片产生的,天然适合按(片号、时间窗)分区存储为列式/分块格式,让后续 join 和聚合可以并行扫描、按需只读取相关层次的列。把「哪些数据值得留全量、哪些只留统计、哪些滚动覆盖」在采集端就决定好,是控制成本的关键。
join 是管线的算力中心。 回映的核心操作是把海量 GateID 命中记录与 info_table 做关联并按 RTL 实例聚合。在大规模下这是典型的分布式等值连接/聚合:GateID 作为 shuffle key 分桶,各节点在内存中维护哈希表做增量累加(同 build 多用例可直接累加活动计数,再统一折算),避免对原始 trace 反复排序。info_table 本身也大,需要按 GateID 范围分片并广播/加载到对应 worker。checkpoint 和断点续算不可省略——处理几小时的数据跑到 90% 因一条坏记录崩溃再从头来是不可接受的,管线要做到分片级重试、脏记录隔离与计数。
正确性在规模下靠「不变量」守护。 数据量一大,人已经无法肉眼判断输出对不对,必须把守恒关系做成贯穿管线的断言:输入命中总数与归并后归属总数的对账、各关系类型(direct/replicate/merge/expand)处理计数、丢包/溢出计数从采集头透传并影响可信度、多片时间窗无重叠无遗漏。任何一个不变量被打破就让对应分区失败并标记,而不是产出一份「总数看着差不多」的 SAIF。这与数字验证里「自检 testbench」的精神一致:规模越大,越要让系统自己证明自己没在处理过程中丢数或重复计数。
最后把后处理当持续服务而非一次性脚本。 它要支持版本化(映射表、归并规则、折算参数都带版本,旧 build 的数据多年后仍能用当时的规则重算)、幂等(同一份原始数据重跑产出逐位一致)、血缘追溯(SAIF 里每个数字能追溯到哪些原始分区、哪些填充默认值)、以及资源弹性(夜间批量回映、结果入覆盖/功耗数据库供 68/69 查询)。当回映具备了门禁、对账、分区、血缘这些数据工程要素,它才算真正配得上「为 ASIC 签核供数」的定位——因为签核的前提不仅是算法正确,更是在工业规模下仍可重复、可审计、可运营。
十一、重命名、retiming 与优化:在「信号已不存在」的世界里恢复语义
回映最本质的困难,是用户要的 RTL 信号与物理上存在的 Gate 网之间不存在一一对应:综合为了速度、面积和可布线性,会改名、复制、合并、移动甚至彻底删除逻辑。回映质量的上限,取决于 info_table 在这些变换面前还能恢复多少语义。这一节系统梳理几类变换及其恢复策略,让缺失成为可解释、可分级的显式信息而非静默的零。
重命名(renaming)是最浅层的问题。 综合给每个中间网起器件相关的名字,层次边界也可能被打平(flatten)。恢复依赖两类锚点:一是编译器保留的名字映射与层次保留策略(打平程度是可配置的,打平越少、回映越准但代价越高,这是阶段 2 就要做的取舍);二是结构锚点链——寄存器的输入输出关系、模块端口在网表中的扇入扇出,使后处理能在名字全失时仍按拓扑把网挂回 RTL 实例。generate 展开的数组索引、循环展开的实例编号,则按展开规则还原成带索引的 RTL 路径。工程纪律上,RTL 侧避免在关键观测信号上使用会被改名的写法、对需要长期跟踪的信号加综合属性保留,能显著提高恢复率。
复制与常量传播制造「多对一」和「一对多」。 为降扇出,一个寄存器可能被复制成多个物理副本(replicate);常量传播则可能让某条分支在网表中整体消失。副本的语义恢复要去重并做一致性校验——正常情况下各副本波形应相同,若不同,说明映射或时槽对齐有问题,应告警而非任选其一。被常量优化掉的信号不存在「活动」可言,必须标记为常量并注明常量值,供下游区分「测出来不翻转」和「物理上不存在」——这两者对功耗和覆盖率的含义完全不同。
retiming 把寄存器在时间轴上搬了家。 为平衡流水线延迟,综合会把寄存器从组合路径一端移到另一端,此时物理寄存器对应不到任何单一 RTL 信号,而是若干信号在不同拍次的混合。恢复策略是把这类寄存器挂回最相关的 RTL 信号并显式标注拍数偏移,让波形在阅读时知道「这是该信号提前/滞后 N 拍的等价态」。对活动率统计,retiming 不改变寄存器总数和总翻转量级,模块级活动仍可信,但信号级精确波形必须带偏移标注,否则逐周期对拍必然失败且难查根因。
存储与硬核的黑盒化。 大容量 RAM 往往被替换成原型平台的替身存储器,端口保留而内部阵列不可见;DSP、时钟单元、PHY 等硬核也以黑盒形式存在。回映只能输出端口级波形,阵列内部活动按端口读写模式用模型折算,并随结果附带模型标识和参数。ECC、冗余位、修复逻辑等 ASIC 特有结构在 FPGA 原型中不存在或形态不同,相关位必须单列,绝不允许折算进有效数据位的活动——否则下游会把不存在的翻转算进功耗。
被消除逻辑(eliminated)是最终的边界,必须诚实标注。 永远不要为了文件完整而对不可观测信号填零:零是一个合法测量值,会被下游当成「该信号从不翻转」,从而低估功耗、误判覆盖率。正确产物是三态分类——有测量值的、按结构关系传播或模型折算并标注为估算的、确认不可观测(UNOBSERVABLE)并在完整性报告中列名的——再附上每个模块的观测覆盖率。让「看不见」本身成为清晰可见的信息,下游才能据此决定是补探针重跑、用仿真向量补这一角,还是接受估算级结论。回映团队的专业价值,很大程度正体现在这些变换的恢复深度和缺失信息的诚实分级上,而不是输出一份看起来无所不有、实则真假难辨的波形。
各类综合变换对回映的破坏方式与恢复手段汇总如下表,可作为排查「信号找不到」问题时的速查索引:
| 变换类型 | 物理后果 | 恢复手段 | 残留风险 |
|---|---|---|---|
| 重命名/打平 | 名字与层次全失 | 名字映射 + 结构锚点链 | 打平过多时拓扑挂错 |
| 复制/常量传播 | 多副本/分支消失 | 去重一致性校验、常量标注 | 副本不一致掩盖时序问题 |
| retiming | 寄存器跨拍移动 | moved 链挂回 + 拍数偏移标注 | 逐周期对拍必须带偏移 |
| 黑盒化(RAM/硬核) | 内部阵列不可见 | 端口级波形 + 模型折算 | 折算模型失真 |
| eliminated | 信号物理消失 | UNOBSERVABLE 显式标注 | 填零则静默污染下游 |
这张表还有一个读法:从上往下,恢复的可信度单调下降——重命名恢复完和原信号几乎等价,eliminated 则本质上不可恢复,只能诚实声明。下游使用数据时应对照此表决定信任级别。
十二、时间重建的细节:多时钟、稀疏采样与停钟区间
时间轴是回映产物能被人和工具正确理解的基础,也是错误最隐蔽的地方:波形看起来完整,但若周期折算错了,所有活动率和延迟结论都会系统性偏移。这一节把时间重建的几个关键细节讲清楚。
统一到逻辑周期而非物理秒。 每个时钟域有自己的周期基准,回映内部时间应以「该域的逻辑周期号」为单位,只在最终需要物理时间的报告里才乘上经确认的实际频率。这样做有两个好处:频率变了(降频运行、换速度档)活动数据不必重算;TDM 设计里被多路复用的逻辑周期可以与时槽表一一对应。多域数据合到一张波形时,用域间握手事件建立锚点(一次请求/应答、一个 FIFO 读写对应),锚点之间不做线性插值——两个异步域在锚点之间没有定义明确的相对时刻。
割边信号的时槽还原。 跨 FPGA 分割的信号经 TDM 传输时,物理上一个快时钟周期内可能承载多个逻辑时槽。回映必须按时槽表把观察到的值「解聚合」成连续的逻辑周期序列,并保证有效周期计数(活动率分母)只统计该逻辑实际占用的时槽。常见错误有两个方向:用全部物理周期做分母导致活动率被稀释;把时槽顺序当成逻辑顺序导致波形错位。时槽表必须与构建版本强绑定,这也是版本门禁的内容之一。
稀疏采样的置信问题。 为省带宽,长活动统计可能只在部分周期采样(如每 N 个周期采一次)。对均匀活动,稀疏估计无偏但有采样误差,报告应给出按采样率和样本量计算的置信区间;对突发活动(错误处理、中断风暴),稀疏采样可能整段漏掉,这类场景必须用事件触发的连续窗口补采,不能只靠稀疏计数外推。结论的使用方需要在数据旁边看到采样方案,否则无法判断一个「活动率很低」的模块是真的不活跃,还是恰好没被采到。
停钟和锁步区间必须从时间账中扣除。 co-model 锁步、断点、单步执行期间,DUT 时钟被暂停或由主机驱动,这段物理时间内没有逻辑周期发生。采集头要记录所有停钟区间,回映时:活动率的周期分母扣除这些区间;跨区间的事件时间戳分别归属到停钟前后;波形上显式标注「此处时间不连续」。若不处理,停钟会表现为大量「长时间无翻转」,污染 idle 场景判定和长时统计。多片系统中任一芯片停钟,全局时间轴都要相应处理,不能只停本地时钟而其他片仍在计数。
时间对齐的验证方法。 时间重建正确性不能只靠目测波形,应建立自动检查:用已知周期信号(分频输出、固定模式发生器)验证折算后的周期间距精确;用跨域握手的因果顺序检查锚点(请求必在应答之前、间隔符合设计拍数);多片对齐用同步触发广播的响应拍数标定。把这些检查做成回映管线的固定步骤,时间轴错误就能在数据进入分析和签核之前被拦住——因为时间基准错了,后面所有看似精密的统计都没有意义。
知识脉络

与系列及现有篇目的衔接
- 映射表:17 info_table 映射表 GateID↔RTLID/回溯/版本;ID:10 RTL ID 体系 分配规则/层次绑定/稳定性、16 GateID 与逻辑网表模型 cell/net/ID 分配
- 数据来源:22 Gate 域信号采集 ILA/trace/带宽深度权衡;版本:20 比特流烧录与四方版本一致 manifest/门禁
- 下游:24 活动覆盖率与性能调试闭环 热点/瓶颈/回放、25 真实激励驱动 ASIC 签核 SAIF 反标/边界
- 活动文件背景:23 FPGA 功耗签核 SAIF、DPA 侧 DPA 导读
总结
一句话总结:阶段 6 把硬件能产生但人和 ASIC 工具读不懂的 Gate 域数据翻译成对齐原始 ASIC RTL 层次的数据,管线是版本门禁→查表 join→多对多归并→名字/层次重建→时间重建→输出波形与 SAIF→完整性报告;第一步永远是 build_id/哈希强校验(采集头、info_table、manifest 三方一致),不一致立即 fail、宁可不产数据也不产错数据;归并按关系类型处理——direct 直搬,replicate 多副本翻转去重计一次并做一致性告警,merge 不把一根网的活动重复计入多个源、精细功耗按模型加权并标注估算,bus_expand 逐位拼回向量以恢复枚举值,repack/blackbox 端口按规则库位映射台账拆回原 SRAM 且 ECC 多余位单列,constant 填常量,eliminated 标 UNOBSERVABLE 而绝不能填 0(否则被下游当成零翻转真数据);名字按层次锚点链和 generate 索引还原,retiming 移动的寄存器挂回原信号并标注拍数偏差,BRAM 替身只输出端口级波形、阵列内部活动由端口模型折算并随数据带模型 ID;TDM 割边信号按时槽表解聚合成连续逻辑周期,活动计数的分母用时槽有效周期而非物理周期;时间轴统一到逻辑周期,多片按同步周期计数器和触发广播标定延迟归并,跨时钟域不插值而在握手处建立对应,co-model 锁步停钟区间必须从活动率分母中扣减;输出为 RTL 层次 VCD/FSDB 类波形、按实例聚合的 SAIF(TC/T0/T1/TG/IG)和覆盖率/性能事件文件,文件头挂 build_id、折算参数和观测覆盖率;报告必须显式给出可观测覆盖率分模块统计、eliminated/恒值/估算三类清单、glitch 口径(周期采样天然滤毛刺,不能拿 FPGA 组合毛刺当 ASIC 证据)、稀疏采样置信参数和 TDM 稀疏度,供签核侧分级;工程上 TB 级 trace 走流式分片排序合并、活动计数边采边增量累加、同 build 多用例活动可相加,跨版本回归用稳定的 RTL ID(而非易变的 GateID)对齐做翻转率 diff,并以黄金窗口与仿真对拍做端到端链路抽检。