RTL 作为单一事实源:一份代码怎样被整条链同时消费(S1)
本系列顺着设计数据而不是工具来走(主线编号 S0–S7,详见运维规划)。上一站 S0 冻结了规格与参考模型,本站把它们写成 RTL;下一站 S2 综合交接 把 RTL 变成门级网表。若想看「仿真器/Lint 工具具体怎么操作」,那是工具族篇的内容,本篇只讲RTL 这份数据本身怎么被多视图共享、怎么冻结、怎么交接。
一、本站在数据总图上的位置

关键认知:RTL 只应该有一份权威拷贝(single source of truth),但它会被很多个「视图」读。仿真看到的 RTL、Lint 检查的 RTL、综合映射的 RTL,必须是同一版、同一组宏与参数、同一套文件顺序。本站的工程价值不在「怎么写 Verilog」,而在「怎么保证所有消费方读到的是同一个事实」。
二、输入清单(上游交接面)
| 输入 | 形式 | 来源 | 版本/成熟度要求 |
|---|---|---|---|
| 微架构规格、接口定义 | 文档/IP-XACT | S0、架构团队 | 接口信号与位宽冻结 |
| 功能参考模型 / ISS | C/C++/SystemC | S0 | 已作为黄金模型、可对拍 |
| 寄存器 spec | SystemRDL/IP-XACT/表 | S0、设计 | 地址映射冻结(固件依赖) |
| UPF 低功耗意图草案 | .upf/.cpf | S0、低功耗负责人 | 电源域划分冻结 |
| 编码规范与可测性需求 | 文档 | 设计/DFT 团队 | DFT 规则在编码前下发 |
寄存器 spec 与 RTL 必须同源生成或单向派生。若两边各手写一份,固件按错误偏移跑通了 FPGA、却在硅上翻车,是最经典的 S0→S1 交接事故。
三、本站产出:不只是一堆 .v 文件
很多人以为本站交付物就是 rtl/ 目录,实际是一组数据:
| 产出 | 格式 | 下游消费者 | 交接作用 |
|---|---|---|---|
| golden RTL | Verilog/SystemVerilog/VHDL | S2 综合、所有视图 | 唯一权威源码,打 tag 冻结 |
| 编译清单 | filelist.f、宏定义 | 仿真/综合 | 决定读哪些文件、什么顺序、哪些 -D 宏 |
| 断言 | SVA / bind 文件 | 仿真、形式 | 把接口协议规则机器化 |
| 检查豁免 | Lint/CDC waiver 文件 | 综合后检查、后端 | 记录「这条告警为什么可以放过」 |
| 波形 | VCD/FSDB/WLF | 调试 + S5 功耗签核 | 提供翻转活动,是跨好几站的数据 |
| 低功耗意图 | UPF 1.0 | S2/S3/S5 | 电源域、隔离、retention 合同 |
| 验证与冻结记录 | 报告/签名 | 项目管理 | 证明 RTL 达到可综合的成熟度 |
注意 VCD/FSDB 是一份「长寿命」数据:它在 S1 为调试而录,却要一直活到 S5 功耗签核被反标活动率。这意味着录波形时选的 testcase、时段、层次,会在几周后决定功耗数字是否可信。
四、核心机制:为什么「多视图读同一份 RTL」会出事
4.1 filelist:仿真世界与综合世界最容易分叉
仿真常用 stub 模型替换掉慢速 IP、用 ifdef SIM 关掉可综合不了的行为段;综合则必须读真实模块。一旦仿真 filelist 与综合 filelist 指向不同实现,就会出现「仿真全绿、综合后功能不等价」。
仿真读到的: usb_agent.sim_stub.v (行为模型)
综合读到的: usb_agent.v (真实 RTL)
→ 两条世界线,仿真从未验证过真正要流片的逻辑治理办法是一套源 filelist + 视图差异用明确的变量开关管理,并在发布时让 LEC/形式把「综合网表」对回「仿真验证过的 RTL 配置」,而不是对另一套。
4.2 waiver 是数据,不是「点掉弹窗」
Lint/CDC 报出的违例,确认是误报或可接受后要落 waiver(带原因、签名、有效期)。waiver 必须随设计数据一起版本化,并在综合后、插入时钟门控/DFT 后重跑检查——因为新插入的逻辑可能制造新的跨时钟路径,旧的「干净」结论作废。
4.3 宏与参数的组合爆炸
-D 宏、parameter、generate 配置决定实际电路。同一文件在 WIDE=1 与 WIDE=0 下是两颗不同芯片。冻结 RTL 必须连配置向量一起冻结,否则「同一 commit」也能综合出不同网表。
五、本站的数据契约与成熟度判据(DoD)
进入 S2 之前,至少满足:
- RTL、filelist、宏配置、UPF、waiver 打同一个版本 tag,任何人按发布说明能复现出同一套读入。
- 功能验证达到约定覆盖率与断言通过标准;关键模块有形式或 ISS 对拍证据。
- Lint 无未裁决告警;CDC/RDC 违例要么修复要么有已评审 waiver。
- 仿真 filelist 与综合 filelist 的差异显式列清单,且差异部分不影响待流片功能。
- 供 S5 的波形已按代表性 testcase 录制并记录时段/层次(避免后期随便抓一段算功耗)。
六、三条回灌支路在本站的表现
- 时序反馈:S2 综合 WNS 很负,可能回流要求 RTL 改写法(拆分大 mux、推断 SRAM、减少复位)。
- 活动/功耗反馈:S5 发现某模块翻转率异常高,可能回流要求在 RTL 加时钟门控使能。
- 物理反馈:S3 发现两个强耦合模块被 floorplan 拉到芯片两端,回流要求 RTL/接口重新切分。
本站最危险的,是这些回流修改后只改了 RTL、忘了同步 filelist/waiver/UPF,导致视图再次分叉。
七、典型交接事故
| 事故 | 根因 | 在本站如何拦住 |
|---|---|---|
| 仿真绿、硅上错 | 仿真用 stub、综合用真模块,两 filelist 分叉 | filelist 差异清单化 + LEC 对回验证配置 |
| CDC bug 流到后端 | 初版 CDC 干净,插 DFT 后未重查 | 每次网表变更后重跑 CDC,waiver 版本化 |
| 功耗签核失真 | 随手录的复位/空转波形被当活动率 | S1 即定代表性 testcase 并记录口径 |
| 固件偏移错 | 寄存器表与 RTL 各写一份 | spec 单向生成,地址自动对拍 |
| 同 commit 出不同网表 | 宏/参数配置未冻结 | 配置向量纳入发布 tag |
相关与延伸
- 下一站:S2 综合交接 看 RTL+SDC+LIB 如何变成门级网表。
- 本站伴随的时序合同怎么随流程演化,见 F2 SDC 生命周期。
- 波形数据如何被 S5 反标,见 F6 活动数据 VCD/SAIF;字段定义可读 仿真波形数据库与格式横评。
- 工具操作视角见 仿真器怎样跑 RTL 与 EDA 验证工具链。
总结
S1 交付的不是一堆 .v,而是「同一版 RTL + 配套的 filelist/宏配置/SVA/waiver/UPF/代表性波形」这一包事实;本站的全部纪律,都是为了保证仿真、Lint、形式、综合读到的是同一个世界。