FPGA 原型验证专题 17:info_table 映射表——GateID↔RTL ID↔层次路径的回溯算法、多对多归并与版本对齐
更新时间:2026-09-12。本文是「ASIC FPGA 原型验证系统」专题 06~25 深体系列分册,对应阶段 3 建立映射、阶段 6 查表回映。ID 本体见 10 RTL ID 体系 分配规则/层次绑定/稳定性 与 16 GateID 与逻辑网表模型 cell/net/ID 分配,消费侧见 23 Gate→RTL 数据回映 查表/聚合/SAIF。
这一篇在链路里的位置
阶段 3 在分配 GateID 的同时回溯建立 info_table 初稿;阶段 5 硬件只吐出 Gate 域数据,阶段 6 完全依赖这张表把数据翻译回 RTL 层次。没有 info_table,板级数据就是一堆无法归属的网线翻转。
本文要回答的问题
- 综合过程中如何记录"这个 gate cell/net 由哪个 RTL 实例/信号/源码行生成"?
- 多对多关系怎么处理:RTL 信号展成多 net、多位向量打包、常量传播/死逻辑导致信号消失?
- 层次被打平、信号被重命名后,如何恢复原始 RTL 全限定名?
- 存储元件(替换成 BRAM 的 ASIC SRAM)的活动如何归到原实例?
- info_table 的格式与查询:按 GateID 查 RTL、按 RTL 路径反查 Gate、按实例聚合
- 为什么版本四位一体(RTL↔网表↔比特流↔info_table)?错版会发生什么、如何用哈希/构建 ID 防护?
- 插桩/观测点在表中如何表达,支撑阶段 6 的波形还原?
一、映射表:跨域的唯一桥梁
info_table 在阶段 3 随综合写出初稿,在阶段 6(23 Gate→RTL 数据回映 查表/聚合/SAIF)才真正被消费。它回答三类问题:
- 正向:GateID
G是哪个/哪些 RTL 对象产生的?(采集数据归属) - 反向:RTL 信号
S现在对应哪些 GateID、是否还可观测?(插桩校验、覆盖率对齐) - 结构:这个 GateID 在原始层次树的什么路径、什么位选择上?(波形重建)
没有 info_table,板级数据就是一堆无法归属的网线翻转。它与 RTL ID 清单(10 RTL ID 体系 分配规则/层次绑定/稳定性)、GateID 表(16 GateID 与逻辑网表模型 cell/net/ID 分配)同属构建产物,而不是人写的文档。
二、溯源机制:综合中的来源传播
映射质量取决于综合时来源(provenance)如何随变换传播:
- 寄存器/直接映射:每个非黑盒 cell 创建时挂来源指针——源文件、行号、生成它的 RTL 行为(赋值/表达式/实例)、所属 RTL 实例 ID;
- 表达式展开:
assign y = (a & b) | c产生的 AND/OR 两个 cell 都指向同一赋值,nety的主来源是左侧信号 ID; - 边界保持:实例端口的进出 net 同时挂模块端口名(形式参数)和上层连接名(实际信号),使名字可以双向恢复;
- 属性标注:综合属性(
// synthesis keep/dont_touch、probe 槽位、时钟域标记、替换台账 ID)作为来源的附加字段,不靠命名猜测; - pass 纪律:每个优化 pass 都必须是「来源保持变换」——复制时分裂指针、合并时取并集、删除时登记,禁止产生无来源 cell。综合后做全表审计:无来源 cell 数必须为 0。
三、关系基数与消失/重命名分类
每条映射边带一个关系类型,阶段 6 归并时按类型决定语义:
| 基数/类型 | 典型成因 | 回映语义 |
|---|---|---|
| 1:1 direct | 普通寄存器/网线 | 直接搬运波形与翻转 |
| 1:N replicate | 高扇出复制、多级缓冲 | 任一副本活动即源信号活动;多副本翻转去重计一次 |
| N:1 merge | 等价合并、常量折叠后合网 | 多源共享数据,报告归属给主源并在表中列出并集 |
| 1:N bus_expand | 向量逐位展开 | 按位选择回填,重建向量波形 |
| N:M repack | 多位打包进宽 LUT/合并存储 | 按存储端口映射台账逐位拆账 |
| constant | 常量传播 | 标注恒定值,无 GateID,SAIF 中记零翻转 |
| eliminated | 死逻辑删除 | 标注「不可观测」,缺口报告必列 |
| renamed/moved | retiming/打平重命名 | 来源链有效但原路径名需按链恢复 |
| blackbox_port | SRAM→BRAM 等替换单元 | 端口按替换台账映射,内部活动用模型折算 |
「消失」必须显式登记而不是静默缺行:阶段 6 靠它区分「信号没翻转」和「信号根本没被观测」——这两者对功耗和覆盖率结论天差地别。
四、名字与层次恢复
flatten 后网表网名形如 u_top/u_core/u_alu/_temp_123_i_5_n_0,恢复工作包括:
- 全限定名重建:层次锚点(16 GateID 与逻辑网表模型 cell/net/ID 分配)+ 边界记录给出
top.core.alu.temp[5]; - 向量/数组:位选择后缀
[5]、存储器数组下标(多为 generate/参数化展开结果)逐位回填; - generate 下标:展开时记录 genvar 取值与生成块名,恢复成
u_reg[3].u_bit.q而不是u_reg_3_u_bit_q_n_17; - 重命名恢复:被 retiming 挪动的寄存器按 moved 来源链定位到原始信号,表中同时给出「优化后名」与「原始名」,波形里呈现原始名;
- 名字冲突:SystemVerilog 作用域下合法的同名局部信号靠 RTL ID(而非字符串)消歧,这是不能只存名字串的原因。
五、特殊对象的映射
- 替换库单元(11 ASIC→FPGA 等价单元替换 SRAM/时钟/IO/PHY):BRAM 替身 cell 挂原 SRAM 实例 ID + 规则库规则 ID;端口位宽变化(ECC、拼接)按规则里的位映射台账拆账;使能/CE 语义差异在表中标注折算方式;
- 跨片 TDM(13 跨 FPGA 互联与 TDM SerDes/跨片同步/降频):wrapper 内部 net 标记为「TDM 内部、不归用户 RTL」;每个时隙携带的割边信号单独有一张时隙↔GateID↔源 RTL 信号表,回映时按时隙解聚合;静态 TDM 下割边信号频率要除以比率(19 原型频率与时序收敛 TDM 降频/关键路径);
- probe 点(14 可观测性插桩 dont_touch/probe/可见性预算):probe 槽位 → GateID → RTL 信号三元组单独成表,采集配置文件直接消费它;
- 时钟与复位:时钟 net 的映射带时钟域标签,回映时用于周期对齐和 CDC 路径标注,不把时钟翻转计入普通活动。
六、物理格式与查询
典型实现是一组带构建头的列式文件(Parquet/SQLite/二进制都行,原则是可流式、可随机查):
gate_cells(gid, type, src_ids[], rel[], src_file, line)、gate_nets(gid, driver_gid, load_gids[], width, flags);rtl_index(rid, fqname, kind)、probes(slot, gid, rid)、tdm_slots(slot, cycle_pos, gid, rid)、blackbox_map(gid, orig_rid, rule_id, port_map);- 构建头:构建 ID、RTL commit、网表哈希、综合器版本、规则库版本、片数、生成时间。
查询方向:gid→rtl(回映热路径,批量 join)、rtl→gid[](插桩/覆盖率反查)、instance subtree→gid[](按实例聚合活动)。规模参考:十亿门级原型的 cell+net 条目数在数千万量级,列式存储 + 排序 join 可在分钟级完成一次全量回映。构建期一致性校验:GateID 表与 info_table 的 gid 集合必须完全一致;probe 表引用的 gid 必须存在;每个替换 cell 必须有规则 ID——任一不符则本次构建判废。
七、版本对齐:四件套(实际五件套)绑定
绑定的不只是「四件套」,完整清单(20 比特流烧录与四方版本一致 manifest/门禁 详述):RTL commit / 网表+GateID / info_table / 各片比特流 / 固件·向量·co-model,共享同一个构建 ID,manifest 里逐项记内容哈希。
错版为什么可怕且静默:GateID 是稠密整数,旧表查新数据几乎永远「查得到」——12345 在旧网表是 core.fsm.state,新网表可能是 dma.buf[7],回映产出一个合法但张冠李戴的波形/SAIF,功能可能不报错、功耗结论却完全错误。防护:
- 比特流内嵌一段构建 ID 指纹寄存器(probe 可读),bring-up 首读;
- 采集文件头写入实际读到的构建 ID,回映工具打开即与 info_table 头比对,不一致直接 fail,不产出文件;
- 抽查哈希:info_table 中网表哈希与服务器存网表哈希比对;
- 增量构建时 info_table 分区带版本号,旧区复用、新区刷新,混合版本同样禁止消费。
八、给回映与签核的接口
阶段 6(23 Gate→RTL 数据回映 查表/聚合/SAIF)拿到的是:映射表 + 采集数据 → 按 gid 批量 join → 按 rel 类型归并 → 按 rtl 路径聚合成 RTL 层次波形(VCD/FSDB 类)和 SAIF(TC/T0/T1)。阶段 7(25 真实激励驱动 ASIC 签核 SAIF 反标/边界)消费时,每个数据块都自带:构建 ID、观测覆盖清单(哪些 rid 有数据、哪些 eliminated)、TDM 折算参数与可信度分级。info_table 交付的不只是「对照表」,而是带语义、带缺口、带版本的完整溯源契约。
九、映射表的构建性能:亿级关系如何生成与查询
现代 SoC 原型的网表轻松达到几千万 cell、上亿根网,info_table 如果按朴素的「每个对象一行文本」实现,生成时间和查询延迟都会失控;这张表的工程形态本身就是一个数据库问题。生成期的流式设计:综合各 pass 在做来源传播时不直接写最终表,而是输出追加式事件流(某对象创建、合并、改名、删除,附来源集合),构建末期归并事件流生成表;这样多线程综合的各 worker 只写自己的分片,避免共享数据库锁,归并按 GateID 排序即可确定性产出(呼应 54 篇逐字节可复现)。列式存储:最终表按列组织(GateID 列、RTL ID 列、类型列、层次路径列、来源标记列、芯片列),分析查询几乎总是「扫一列做聚合」(统计每个 RTL 实例的 cell 数、汇总每层次的活动),列存配合压缩比行存快一个数量级;主键列有序,点查走二分或哈希索引。分层而非一张大平表:实践中拆成对象表(GateID→类型、芯片、坐标)、映射表(GateID 集合↔RTL ID,多对多独立存储)、层次表(RTL ID↔路径与父子关系)、编码表(重编码对象的位语义)、版本表(五件套 hash 与规则库版本);映射关系的多对多基数(第三节)用独立的边表表达,避免在对象行里塞变长列表。查询模式导向的索引:回映工具的高频查询是三类——给定 GateID 找 RTL 位置(点查,哈希)、给定 RTL 子树找全部 GateID(区间/闭包查询,层次路径前缀或闭包表)、给定一批活动 GateID 聚合到层次(批量 join,按 GateID 排序后归并)。为这三类查询分别建索引,而不是指望通用数据库优化器。增量更新:增量综合后只更新变化子树的关系(配合 60 篇的指纹 diff),重建全表是分钟级、增量是秒级,让每次小改后的回映准备不必等全量。数据生命周期:映射表与构建版本绑定不可变存储,历史活动数据依赖旧表,因此旧版本表随活动数据归档,不能被新表覆盖;表文件与比特流、网表、采集配置进同一个 manifest(第七节)。做完这些,info_table 才从「一个 CSV」变成支撑 23/24/69 篇所有分析的真正数据库。
十、映射可信度:当一个 GateID 找不到干净的 RTL 家
并不是每个网表对象都能映射回一个干净的 RTL 归属;映射系统如何表达「不确定」,和它如何表达确定映射同样重要。常见的灰色情形有:多来源合并——优化把两个 RTL 信号合并成一根网,该网的翻转只能归因于「A 或 B」,无法拆开;映射关系标记为多来源并附合并原因(功能等价合并/冗余消除),活动回映到 A、B 时报告为「共享活动」,分析侧可以按保守策略(两边都计)或结构推断(若合并条件是恒等,则可等价归属),但策略必须显式。优化新生对象——综合插入的缓冲、复制寄存器、TDM 同步单元没有 RTL 对应物,映射到「平台/编译器插入」命名空间,在 DUT 活动统计中可剔除或单列;这是防止平台税污染 69 篇签核数据的关键。消失的 RTL 对象——常量折叠掉的信号、被删死逻辑,RTL ID 在网表侧无对应:回映报告「逻辑常量/不存在」而非零活动;这一类同时反哺 68 篇的覆盖/死代码分析。推断错位风险——名字相似但来源链断裂时,严禁用模糊匹配把 GateID 猜配到 RTL,宁可标「未映射」;模糊猜测一旦混入,回映出的波形会在偶尔几个周期对不上,比没有数据更摧毁信任。未映射率因此是映射质量的一级指标:每次构建报告未映射 cell/net 比例及按层次分布,未映射集中在某个替换模型内部是预期(平台网),集中在 DUT 核心逻辑则是编译器 bug 信号,应阻断发布。可信度随数据走:每条回映后的活动数据带映射质量标记(精确/多来源/推断/未映射/平台),下游报告和签核包保留标记,消费方一眼知道哪些数字是硬数据、哪些经过了归因假设。映射系统的诚实程度,最终决定整个「Gate 域→RTL 域」故事在 ASIC 签核会议上能不能站住。
十一、与调试现场的闭环:映射表的交互式消费
映射表的消费者不只有离线回映管线,调试现场(工程师在 bring-up 和问题复盘中)会高频地反向使用它,交互体验值得专门设计。双向跳转:在 RTL 视图(源码或层次树)点一个信号,应立即列出它在各芯片上的所有物理化身及观测可行性(该 GateID 是否已被 dont_touch、在哪个采集槽、需要哪版配置才可见);反过来,从采集波形里点一个物理信号,跳到 RTL 源文件行号和实例路径。53/54 篇建立的 ID 体系在这里变成工程师手底下的导航。「为什么看不见」的解释器:工程师最常见的挫折是「我要的信号采不到」。映射表加综合台账可以给出机器生成的原因链:该信号因无扇出于综合 pass X 被删(给出删除事件)→若要保留需在哪层加 dont_touch(给出具体属性和预期代价)→当前观测槽位是否够(给出预算)。把第七、八节的观测规划从专家经验变成自助查询。跨片路径可视化:给定 RTL 路径跨越了哪些 FPGA、经过几跳 TDM、每段延迟多少,映射表与 56/57 篇的分区/互联数据联表即可画出;这是解释「为什么这个交互比 ASIC 慢」的直接证据,支撑 63 篇的性能校正。影响面分析:计划改一个 RTL 模块名/层次前,查询它关联的 GateID、采集配置、历史波形、签核数据包数量,评估改名成本(呼应 54 篇稳定性)。现场标签:调试会话中给 GateID 打私人/团队标签(「怀疑点:仲裁器输出」),标签绑定版本,不改动任何正式数据,却能让多人共享排查上下文。权限与体积:交互查询服务化部署,多板农场里的工程师通过浏览器/插件访问同一映射数据库,配合 39/64 篇的远程 lab;表本身保持只读,交互层缓存热点查询。做到这一步,info_table 就从流水线末尾的归档文件,变成贯穿设计、调试、分析、签核全过程的活的基础设施。
十二、映射质量的度量与回归:把「对得上」变成持续指标
映射表正确性在项目初期靠人工抽查还能维持,规模一大就必须变成可度量、可回归的工程指标,否则质量会在无人察觉中缓慢劣化。核心指标集至少有五项:一是精确映射率,即活动/波形查询中数据可直接归因到唯一 RTL 对象的比例,目标接近百分之百(剩余主要是平台插入对象,本来就不要求映射);二是未映射率及分布,按层次和原因分类(优化删除、平台网、规则缺口、工具异常),集中在替换模型内部是健康信号,散落在自研 RTL 中则是报警;三是多来源占比,多对一关系的比例上升,往往说明优化跨边界合并增多,活动归因要更保守;四是往返一致性,随机抽取 RTL 对象沿映射到 GateID 再反查,必须回到同一对象,这是最直接的端到端正确性测试;五是跨版本稳定性,对未改动的子树,映射关系在版本间必须零 diff。回归测试的构成:一组小而全的黄金设计(覆盖各类原语、替换、跨片、删除、重编码),每次规则库或编译器变更后重跑,断言映射表与预期一致;一组真实大型设计的抽样对比,捕捉黄金设计盖不住的规模效应;以及前述往返与稳定性测试,纳入 CI 跑。事故响应流程:发现一条错误映射(波形对不上、归因错位),处理不能停在改这一条——要在黄金设计里加一个最小复现用例,让同类错误今后被自动拦截;这和普通软件缺陷管理同理,映射表本质就是编译器的输出,对它适用同样的质量纪律。质量看板与发布门槛:把五项指标随构建趋势展示,发布门槛设为「未映射的自研 RTL 对象为零、无新增多来源归因、往返测试全过」;门槛要自动执行,不允许在交付截止前手工忽略。数据侧的信任传递:映射质量指标要随数据包一起交给签核消费方(69 篇),让对方知道这批活动数据的归因置信度,而不是只给数字。最终目标是把「Gate 域到底能不能查回 RTL」这个系列级的根本问题,从一句承诺变成每天被自动化证明几百次的事实。
十三、映射系统失效的社会学:为什么错误映射总能混进来
技术机制之外,映射质量的长期最大威胁是组织行为:在进度压力下,人会怎样绕过映射纪律,以及系统该怎么抵御这些绕过。第一种模式是「先跑起来再说」——为赶点亮,工程师手工改网表或临时绑定名字,承诺事后补台账,事后从不发生;防御方式是让无台账的构建无法生成正式版本号,临时实验只能在显式标记为不可信的沙箱比特流中运行。第二种是「就这一个例外」——评审中不断累积的特殊映射,每个单独看都合理,几百个之后映射表变成无人敢动的遗迹;防御方式是例外数量设硬上限并按版本下降,每个例外带到期版本。第三种是「模糊匹配兜底」——映射失败时工具猜测最像的名字继续流程,表面上提高成功率,实际制造最难排查的错位数据;防御方式是把「未映射」设计成显式、可见、阻断发布的状态,让失败停在离原因最近的地方。第四种是「下游不读标记」——回映和报告工具忽略可信度字段,把推断当精确,灰色数据在层层表格传递后被洗成确定结论;防御方式是标记不可静默剥离,任何聚合报告必须同时汇总数据质量。第五种是「只在项目末期想起来要映射」——早期不为追溯性设计,末期发现活动数据无法解释,已经无法补救;这正是为什么 54 到 61 篇的体系必须从第一天就在流水线里。管理者层面要认识到:映射系统不产生可见的性能数字,它的价值是风险避免,因此最容易在资源争夺中被牺牲;把映射质量指标(未映射率、往返一致性、数据撤回次数)放进项目级质量看板,让它和频率、资源一样被看见,是保护这类基础设施的唯一办法。技术可以解决「能不能对上」,组织纪律才能保证「十年里一直对得上」。
十四、结语:一张诚实的表胜过一份漂亮的报告
info_table 在系列里是最不起眼的主题:没有高速接口的戏剧性,没有时序收敛的紧迫感,不过是「把对应关系记下来」。但整个原型验证体系的可信度最终都压缩在这张表里——67 篇的回映、68 篇的覆盖率与活动分析、69 篇喂给签核的活动文件,输入全部是它。映射表工程的成败标准因此极其朴素:问任何一个物理对象「你从哪来」,它都有确定答案;问任何一个 RTL 对象「你变成了什么」,答案完整且不带猜测;问「这份数据可信吗」,可信度本身就是随数据行走的字段。这要求系统设计者在三个方向上同时用力:技术上,把来源传播、列式存储、增量更新、索引查询做到规模可承受;质量上,用未映射率、往返一致性、稳定性回归把「对得上」变成每日自动验证的事实;组织上,抵御「先跑通、例外就这一个、模糊匹配兜底」这类短期理性的持续侵蚀。漂亮的性能报告可能事后被证明是误会,一张诚实标注了未知与多来源的映射表却永远不会背叛它的使用者。原型数据进入流片决策的那一刻,工程师签下的名字背后,依赖的正是这张表的诚实。给建设者最后一条实操建议:当系统规模还小、朴素文件还撑得住时,就把「不猜测、未映射可见、随版本不可变」三条规则立成铁律——数据库可以以后换,信任一旦靠模糊匹配建立起来就再也拆不掉。映射表的技术形态会随数据量演进,但它所承载的科学态度不会变:知道,就给出处;不知道,就说不知道。这十个字值得写在映射数据库的每一份导出报告的页眉上——它提醒每个阅读数据的人:你面前不是一堆确定的数字,而是一段经过翻译的证据,翻译的质量和边界都清清楚楚地写在旁边。尊重这份边界的人,才配使用这份证据;而这正是整套原型验证体系能被严肃对待的开始,也是它走得稳、走得远的底气。
知识脉络

与系列及现有篇目的衔接
- 上游:10 RTL ID 体系 分配规则/层次绑定/稳定性、16 GateID 与逻辑网表模型 cell/net/ID 分配、15 编译器逻辑综合 工艺无关网表/两级综合
- 替换单元归属:11 ASIC→FPGA 等价单元替换 SRAM/时钟/IO/PHY
- 消费方:23 Gate→RTL 数据回映 查表/聚合/SAIF、25 真实激励驱动 ASIC 签核 SAIF 反标/边界
- 版本纪律:20 比特流烧录与四方版本一致 manifest/门禁
总结
一句话总结:info_table 是 Gate 域回 RTL 域的唯一桥梁,阶段 3 随综合写出、阶段 6 查表消费,回答「GateID 来自哪些 RTL 对象」「RTL 信号现在对应哪些 GateID、是否还活着」「原始层次路径和位选择是什么」三类问题;它的质量来自综合时严格的来源传播纪律——cell 创建即挂源文件/行号/RTL 实例指针,实例端口同时记形式名与实际名,复制分裂指针、合并取并集、删除要登记,每个优化 pass 必须来源保持,综合后审计无来源 cell 必须为零;每条映射边带关系类型:direct/replicate/merge/bus_expand/repack 决定归并语义,constant/eliminated 显式登记「没翻转」与「没观测」的区别(这对覆盖率和功耗结论是生死线),renamed/moved 按来源链恢复原名,blackbox_port 按替换台账拆账;名字恢复依赖层次锚点、边界记录和 RTL ID 消歧而不是猜网名字符串,向量位、数组下标、generate 索引逐位回填;特殊对象有专门映射——替换 cell 挂原实例 ID+规则 ID,TDM wrapper 内部 net 不归用户 RTL 而用时隙表解聚合割边信号(静态 TDM 活动还要除以比率),probe 槽位单独成三元组表;物理上用列式/SQLite 表支持 gid→rtl、rtl→gid、子树聚合三类查询,构建期强制 GateID 集合与表一致、probe 引用有效、替换 cell 有规则 ID,否则构建判废;版本上 RTL/网表/info_table/比特流/固件向量五件套共享构建 ID 与内容哈希——因为 GateID 是稠密整数,错版查表几乎总能查到但张冠李戴且静默无报错,所以用片上指纹寄存器、采集头构建 ID 与表头强校验做到不一致即 fail;最终交付给回映/签核的不只是对照表,而是带关系语义、观测缺口清单和版本指纹的完整溯源契约。