阶段复习四 RTL、综合与基础验证
1. 复习目标
这次复习覆盖第 17~21 章。完成后,你应能把一段功能需求拆成数据通路、控制器和存储器,写成边沿含义明确的可综合 RTL,用自检测试平台检查周期行为,再从综合结果与静态时序报告判断结构和速度是否满足目标。
建议闭卷完成第 4 节,再展开答案。满分 100 分,建议用时 120 分钟。第 8 题不要求运行工具,但要把结构、逐拍行为、RTL 计划、验证计划和时序计划连成一个闭环。
2. 第 17~21 章知识链
图 R4-1 第 17~21 章从结构设计到门级时序检查的知识链
这五章不是五项互相独立的工具操作。存储器读延迟会改变控制器拍数,控制器拍数会决定 RTL,RTL 的位宽和优先级会改变综合网表,网表和约束共同决定 STA 结果。设计时要反复沿这条链前后核对。
3. 五章核心检查表
| 章节 | 核心问题 | 你应能完成的动作 |
|---|---|---|
| 第 17 章 | 谁保存数据,谁决定何时操作? | 分离数据通路与控制器,定义控制字、状态和握手 |
| 第 18 章 | 数据怎样按地址保存和读写? | 计算容量与地址位宽,说明端口、读延迟和冲突语义 |
| 第 19 章 | 代码会生成什么硬件? | 区分组合块与时序块,控制位宽、赋值、优先级和复位 |
| 第 20 章 | 怎样证明周期行为符合规格? | 建立时钟与复位,编写自检、断言、记分板和边界用例 |
| 第 21 章 | 网表结构与速度是否合格? | 审查推断和警告,检查约束覆盖、建立/保持裕量与例外 |
4. 综合测验(100 分)
题 1 数据通路、控制器与接口(8 分)
一个模块收到单周期 start 后,需要依次完成“装载 A、计算
A+B、把结果送到输出、产生一拍 done”。
- 哪些对象适合放进数据通路?(3 分)
- 控制器至少要产生哪些控制信号?(3 分)
- 如果上游可能只给一拍
start,模块忙时怎样规定接口才不会产生歧义?(2 分)
题 2 存储器组织与同步读(8 分)
一个存储器保存 768 个 20 bit 字,采用单端口同步读。
- 总容量是多少 bit?地址至少多少位?有多少未使用地址编码?(4 分)
- “同步读”对给出地址和得到有效数据的周期关系意味着什么?(2 分)
- 同一周期读写同一地址时,设计文档必须补充什么?(2 分)
题 3 RTL 的硬件含义(10 分)
阅读下列片段:
always_comb begin
if (en)
y = a + b;
end
always_ff @(posedge clk) begin
q = d;
r = q;
end- 第一段有什么问题,会推断什么硬件?怎样修正?(4 分)
- 第二段为什么不应使用阻塞赋值?若目标是
r保存旧q,应怎样写?(4 分) - 若
a、b都是 8 bit 无符号数,而设计需要完整保留进位,y应多宽?表达式要注意什么?(2 分)
题 4 测试平台与周期竞争(10 分)
- 为什么在上升沿同时用阻塞赋值改变输入并立即检查输出,可能造成测试平台与 DUT 的调度竞争?(3 分)
- 给出一种稳定的驱动与采样策略。(3 分)
- 对一个有
valid/ready握手的加法模块,列出至少四类测试场景。(4 分)
题 5 综合推断与警告(10 分)
综合报告显示:一个应为 256×32 bit 的数组被实现为大量触发器;出现 12 个未连接输出;FSM 的一个状态不可达;某组合块推断锁存器。
- 对四类现象分别给出一个可能原因。(4 分)
- 哪些可以直接忽略?你应怎样处理警告?(3 分)
- 为什么功能仿真通过仍不能证明这些综合结果正确?(3 分)
题 6 建立、保持与时序摘要(14 分)
某寄存器到寄存器路径参数如下,单位均为 ps:\(L=40\)、\(C=70\)、\(T=900\)、\(t_{cq,max}=65\)、\(t_{data,max}=690\)、\(t_{setup}=75\)、\(U_{setup}=35\);最小延迟参数为 \(t_{cq,min}=25\)、\(t_{data,min}=20\)、\(t_{hold}=30\)、\(U_{hold}=10\)。
- 使用 arrival/required 形式计算建立裕量。(5 分)
- 计算保持裕量。(4 分)
- 若同一时序组的负裕量为
-25、-80、-10 ps,另有正裕量端点,求 WNS、负裕量简单求和和负裕量端点数。(3 分) - 把周期增大 100 ps 分别怎样影响本题建立和保持裕量?(2 分)
题 7 约束覆盖、例外与 CDC(10 分)
- 报告中所有已约束路径裕量为正,但有 9 个未约束端点,能否宣布时序通过?(2 分)
- 声明 false path 前要回答哪两个功能问题?(2 分)
- 一条真正需要三拍完成的路径,除设置多周期建立关系外,为什么还要检查保持关系?(2 分)
- 为什么 STA 不能代替 CDC 验证?单比特电平和多比特数据分别可采用什么方法?(4 分)
题 8 综合设计:8 字累加器(30 分)
设计一个单时钟模块。内部有 8×8 bit
单端口同步读存储器;收到空闲状态下的一拍 start
后,模块从地址 0 到 7 依次读取 8 个无符号数并求和。规格如下:
- 同步复位
rst优先级最高; - 存储器在上升沿采样读地址,读数据在该边沿后有效;
busy在处理期间为 1;- 最后一个数被累加后,下一状态进入 DONE;DONE
持续一整拍,
done=1,结果sum保持; - 忙时的
start被忽略; - 和必须不溢出。
完成以下任务:
- 确定地址和累加寄存器位宽,说明原因。(4 分)
- 划分数据通路和控制器,画出框图。(5 分)
- 设计状态并写出逐拍操作,特别说明为什么读地址和使用读数据不能想当然地放在同一拍。(7 分)
- 写出 RTL 实现计划:组合块、时序块、默认赋值、复位与计数结束条件。(5 分)
- 制定自检测试计划,至少包含正常、全零、全最大值、忙时 start、复位打断和随机数据。(5 分)
- 制定综合与 STA 验收清单,至少包含 RAM 推断、锁存器/多驱动、时钟、I/O 延迟、setup/hold、未约束路径和警告。(4 分)
图 R4-2 只在完成自己的结构和逐拍表后用于核对。
图 R4-2 同步读存储器、控制 FSM、加法器和累加寄存器组成的 8 字累加器
展开查看答案与评分点
5. 综合测验答案
题 1
- 数据通路包含 A、B 和结果寄存器,加法器,以及在不同数据来源之间选择的 MUX。寄存器保存跨周期数据,运算器完成变换。(3 分)
- 至少需要 A 装载使能、结果寄存器使能、输出寄存器使能或输出选择,以及反映当前阶段的控制。若 B 也需内部保存,还要 B 装载使能。(3 分)
- 接口要明确“仅空闲时接受 start”,最好给出
ready,以start && ready定义一次接收。没有ready时,也必须规定忙时脉冲被忽略并由上游保证重试。(2 分)
题 2
总容量为
\[768\times20=15360\ \text{bit}.\]
因为 \(2^9=512<768\le 1024=2^{10}\),地址至少 10 bit;未使用编码为 \(1024-768=256\) 个。(4 分)
同步读表示地址在有效边沿被存储器采样,读数据在边沿后经过存储器延迟出现。控制器应把“发出地址”和“消费数据”分成满足该接口契约的周期。(2 分)
读写同址时必须规定读优先、写优先、保持旧输出或结果未定义中的哪一种,并与目标存储宏、RTL 模板和仿真模型保持一致。(2 分)
题 3
en=0时y没有赋值,需要保存旧值,因此组合块会推断锁存器。可在块开头给y默认值,或写完整if/else;具体默认值应按功能规格确定。(4 分)时序块用阻塞赋值会让后一句在过程执行顺序上看到“新 q”,容易把并行触发器误写成程序式更新。应写:
always_ff @(posedge clk) begin q <= d; r <= q; end这样两者在同一边沿采样,
r得到边沿前的旧q。(4 分)最大和为 510,需要 9 bit。应先把操作数显式零扩展到 9 bit,再相加,避免表达式在 8 bit 宽度中先截断。(2 分)
题 4
- 测试平台和 DUT 可能在同一仿真时间槽的活动区执行,先后次序不应作为功能契约。于是 DUT 可能看到旧输入或新输入,检查也可能读到尚未完成非阻塞更新的旧输出。(3 分)
- 一种策略是在下降沿驱动输入,在下一上升沿让 DUT 采样,再等待一个微小采样偏移或使用 clocking block 的采样区检查输出。关键是驱动、采样和检查具有固定顺序。(3 分)
- 场景可包括:连续无停顿传输;
ready=0造成背压并检查输入保持;单笔传输;边界操作数;复位时有未完成事务;随机valid/ready;连续最大值;空闲间隔。任选四类且检查点明确得 4 分。(4 分)
题 5
- RAM 变触发器可能来自不匹配目标库的读写模板、异步读、复位每个存储字或端口数量不支持;未连接输出可能是废弃端口或连接遗漏;不可达状态可能是状态转移缺失或综合优化掉死分支;锁存器来自组合赋值不完整。(4 分)
- 四类现象都不能只凭名称直接忽略。逐条追到 RTL 和规格,确认是错误就修复;确认是有意未使用或工具信息性提示时,记录原因并采用窄范围抑制。复跑后检查警告清单是否只剩已审查项目。(3 分)
- RTL 功能仿真主要检查所施加激励下的行为,不会证明目标 RAM 被正确推断,也不会自动覆盖不可达状态、悬空接口、约束缺失和门延迟。(3 分)
题 6
建立到达时间为
\[A_{setup}=L+t_{cq,max}+t_{data,max}=40+65+690=795\ \text{ps}.\]
建立要求时间为
\[R_{setup}=C+T-t_{setup}-U_{setup}=70+900-75-35=860\ \text{ps}.\]
所以
\[S_{setup}=R-A=860-795=+65\ \text{ps},\]
建立通过。(5 分)
保持到达时间为
\[A_{hold}=L+t_{cq,min}+t_{data,min}=40+25+20=85\ \text{ps}.\]
保持要求时间为
\[R_{hold}=C+t_{hold}+U_{hold}=70+30+10=110\ \text{ps}.\]
所以
\[S_{hold}=A-R=85-110=-25\ \text{ps},\]
保持违例。(4 分)
负裕量集合中,WNS 为 \(-80\) ps,负裕量简单求和为 \(-25-80-10=-115\) ps,负裕量端点数为 3。(3 分)
周期增加 100 ps 后,建立要求时间增加 100 ps,建立裕量变为 +165 ps;基本单周期保持检查仍围绕同一捕获边沿,保持裕量仍为 -25 ps。(2 分)
题 7
- 不能。未约束端点没有完整 required time,必须补充约束或证明它们属于经过审查的功能例外。(2 分)
- 要回答:这条结构路径在所有合法功能模式下是否真的不会传递需采样的数据;切断它是否会遮住任何真实的建立或保持检查。(2 分)
- 多周期建立会改变捕获边沿关系;如果保持关系没有配套审查,工具可能检查错误的保持边沿或放松本应存在的保护。必须按协议实际发射和采样边沿成对定义。(2 分)
- STA 检查给定时钟关系下的延迟,不会证明异步采样不会亚稳,也不会证明多位数据一致。保持足够久的单比特电平可用两级同步器;多比特数据通常用保持数据加握手或异步 FIFO。(4 分)
题 8
- 8 个地址需要 3 bit。最大和为 \(8\times255=2040\),而 \(2^{10}=1024<2040<2048=2^{11}\),所以累加寄存器至少 11 bit;使用 12 bit 也安全,但应说明多出的一位不是必需位。(4 分)
- 数据通路包含地址寄存器、同步读存储器、读数据、零扩展加法器和累加寄存器;控制器保存状态,产生地址更新、累加使能、
busy和done。结构关系见图 R4-2。(5 分) - 可使用
IDLE、READ、ADD、DONE。IDLE 接收 start,清零地址和 sum;READ 给出/保持当前地址并让存储器在边沿采样;ADD 使用边沿后已稳定的读数据更新 sum。若地址不是 7,则地址加一并回 READ;若地址为 7,则转 DONE。DONE 保持结果并持续一拍,然后回 IDLE。同步读的地址采样和数据产生存在周期边界,不能把软件式“给地址后立即取数据”套进同一边沿。(7 分) - 组合块先给下一状态、下一地址、下一 sum
默认保持值,再按状态覆盖;必须完整覆盖所有状态并给非法状态回
IDLE。时序块只在上升沿用非阻塞赋值更新状态和寄存器;同步复位最高优先级。结束条件在
ADD 中以旧地址
addr==3'd7判断。(5 分) - 自检参考模型直接对初始化的 8 个字求整数和,在
done时比较sum,同时检查busy/done周期。用例包括全零结果 0、全 255 结果 2040、递增数据、随机数组、忙时重复 start 不重启、处理中复位立即回空闲并清结果。还应设置超时,避免 DUT 卡死时测试永不结束。(5 分) - 检查 RAM 是否按目标模板推断,状态机和加法位宽是否正确,无意外锁存器、多驱动、截断和未知警告;建立时钟、输入/输出最大最小延迟与不确定性;检查所有时序组的 setup/hold、WNS/TNS、未约束路径;逐条归因例外和警告,并在修复后重跑功能回归。(4 分)
6. 证据闭环
图 R4-3 功能、结构和时序证据互相补充,修复后需要回归受影响层
可以把一次小设计的验收压缩成三句话:
- 功能仿真说明在覆盖到的场景中,逐拍行为符合规格。
- 综合审查说明 RTL 变成了预期硬件,没有被警告揭示的明显结构错误。
- STA 说明在完整且正确的约束下,最长和最短数据路径满足采样窗口。
三句话缺一条,都不能称为完整验收。
7. 得分解释与薄弱点定位
| 得分 | 当前状态 | 建议动作 |
|---|---|---|
| 90~100 | 已建立完整闭环 | 进入第 22 章,开始把门级网表放进物理空间 |
| 75~89 | 主线清楚,局部接口或计算不稳 | 重做失分题,并把题 8 画成逐拍表 |
| 60~74 | 能写局部 RTL,但设计与验证脱节 | 重读第 17、20、21 章,先做结构图再写代码 |
| <60 | 周期、存储器或时序概念尚未连起来 | 按第 17→18→19→20→21 章顺序复习,每章只抓自检清单 |
按错题类型定位:
- 题 1、8 失分:数据通路与控制器划分不清。
- 题 2、8 失分:没有建立存储器端口和周期契约。
- 题 3、5 失分:仍把 RTL 当作顺序程序,没有持续追问“推断什么硬件”。
- 题 4、8 失分:测试平台缺少稳定的驱动、采样和自动比较机制。
- 题 6、7 失分:arrival、required、slack 与约束覆盖尚未形成统一框架。
8. 进入第 22 章前的自检
完成这些项目后,第 22 章会把门级网表继续推进到布局、时钟树、布线和签核前检查。