# 参考答案与判断依据

先完成自己的推演，再对照答案。示例计算使用讲义给定的假设；后续设计实验需要自己的 RTL 和实际工具证据，不把这里的参考解释记作“已通过”。

## 01：接口契约

start 只有在 IDLE 的 clk 上升沿被接受。接受后 busy=1、cs_n=0；尾部结束时 busy=0、cs_n=1、done=1，下一个边沿 done 清零。若 start 持续高，busy 期间忽略它，但回到 IDLE 后会再次接受。因此必须由调用方提供单周期脉冲，或在上层实现明确的握手转换。

tx_data 在接受前满足采样时序，接受后可变化；它不影响已锁存的本次交易。done 是完成标志，rx_data 是结果存储，不能用“rx_data 变化”识别每次完成，因为两次接收值可能相同。

## 02：采样表

A5=10100101，3C=00111100。从 t=0 起八次采样分别在 0.5、1.5、2.5、3.5、4.5、5.5、6.5、7.5 μs。接收移位值依次为 00、00、01、03、07、0F、1E、3C。

首位在 t=0 已准备，采样发生在 0.5 μs，故没有先移位丢 MSB。8.0 μs 最后下降沿，8.5 μs CS 释放，done 高 20 ns。不要把最后一次采样和交易结束视为同一时刻。

## 03：寄存器更新

旧 tx_shift=A5，移位后 4A，MOSI 取旧 bit6=0。第八次采样前 rx_shift 低七位为 0011110，与 miso=0 拼接得到 00111100。直接 `rx_data <= rx_shift` 会保存缺少末位的旧值。

保持/更新选择可用反馈 MUX：D=en?新值:Q。同步复位再覆盖 D 的选择，因此常位于组合数据路径中。未赋值的时序寄存器保持 Q；组合过程输出未完整赋值可能形成 latch，这两种情况不能混为一谈。

## 04：分频和计数

| D | SCLK | 半周期 | CS 有效时间 |
|---:|---:|---:|---:|
| 1 | 25 MHz | 20 ns | 340 ns |
| 3 | 8.333… MHz | 60 ns | 1020 ns |
| 10 | 2.5 MHz | 200 ns | 3400 ns |
| 25 | 1 MHz | 500 ns | 8500 ns |

2 MHz 需要 D=12.5，无法用当前单一整数半周期精确产生。D=12/13 的近似频率各为 2.0833/1.9231 MHz。FINISH 保留末下降沿之后的一个半周期，而不是多发送第九位。

## 05：复位和完成

复位与 start 同边沿：复位优先，不开始交易。busy-start：丢弃。第八次采样后、CS 释放前复位：rx_data 清零，交易中止，不发 done。FINISH 中复位同理。复位释放后下一次合法 start 可开始新交易。

同步 rst_n 低脉冲若不覆盖采样边沿，可能完全无效。异步复位可以不等时钟置位，但释放有 recovery/removal 和域内同步问题。done 每周期先清零、完成分支再置高，限定其单周期宽度；busy 不是完成事件。

## 06：验证与错误注入

例一：首位 MOSI 改用 tx_data[6]。A5 bit7=1、bit6=0，第一采样沿的 MOSI 检查失败。例二：第八次采样把 rx_data 直接赋旧 rx_shift，独立回复 3C 将得到 1E，接收结果检查失败。

若删除 done 默认清零，会出现连续 done 或完成次数错误；若提早释放 CS，沿数/CS hold/帧时长检查应失败。每次只改一个点，记录失败位置再恢复；如果预计错误没有被发现，说明验证需要补充。

现有每组 258=首笔 A5/3C + 256 种 TX + 复位后恢复一笔；复位中止的一笔不计为完整交易。三组共 774。逻辑边界参数 D=1 不代表真实从设备能运行 25 MHz。

## 07：单元模型

输入负载上升可能使前级输出更慢、slew 更差，下一级门也可能因更差的输入 slew 增加延迟。增大驱动改善本级的同时增加前级电容，应评价整条路径。

Liberty 提供逻辑/时序等抽象；LEF 提供物理尺寸、引脚和布线抽象；SPICE 模型用于器件/电路仿真。教学库单位是 ns、pF，角为 typical_case、5 V、25°C；这些数值不能移植到真实工艺。报告显示单位与库单位可能不同，要分别核实。

## 08：综合优化

tx_shift[7] 存下后不再被读取，首位由 tx_data[7] 直接驱动；rx_shift[7] 的旧保存值也不参与接收更新，因而两位被删除。39 声明位减 2=37 DFF。

基础门能实现 MUX、加法、比较和译码，所以 277 个实例只含 fflopd/inv1/nand2/nor2 与功能需求并不矛盾。检查映射网表不应只搜索“有没有 MUX”或看面积数字；要核对所有实例类型、时钟连接和结构报告。

## 09：两类 slack

setup：2+0.1−0.1−0.15−1.6−0.15=0.10 ns。

hold：0.05+0.08−0.1−0.02−0.05=−0.04 ns。

正 skew 帮 setup、伤 hold；降低频率通常不解决此 hold 违例。

现有输入路径 slack=20−0.1−0.2−5−0.461=14.239 ns。周期改为 5 ns、其余数字固定，则 slack=−0.761 ns。输入预算已占 5 ns，故内部路径很短也无法通过。真实重综合会重新优化，该计算不是新工具结果。

## 10：约束与 SPI

系统周期 20 ns；不确定度 0.2 ns；输入/output delay、transition 和 load 分别对应外部到达、外部接收、源驱动斜率和输出电容。min 预算用于最早到达分析，不能只填 max。

给定外部例子总需求=2+3+40+3+1+0.1+5=54.1 ns。H=500 ns 时余量 445.9 ns，H=20 ns 时余量 −34.1 ns。真实首位、输出 MOSI、MISO hold、CS 和引脚限制仍需单独检查。

timing intent=0 说明当前检查未发现约束意图问题，但工具不能替你证明“5 ns 输入延迟”来自实际从设备。不能添加 false path/multicycle 来单纯让报告变绿。

## 11：Slave 架构

SCLK 域方案直接按外部时钟移位，但控制器/配置寄存器跨到 clk 域时需要 CDC，并考虑 SCLK 停止。过采样方案将事件转换到 clk 域，减少功能多域交互，但输入同步、最小脉宽与数据相位仍需分析。

两级同步的可见延迟取决于外部相位、RTL 检测结构和可能的解析延迟。理想 RTL 常表现为数个周期，不能把“固定两周期”当物理保证。对过采样系统，先用同步和检测的最大教学延迟预算检查 500 ns 高低宽度，再检查 MOSI/CS 相对关系。

## 12：CDC 的适用范围

长期保持的 enable 可用电平同步；偶发 update 用事件协议并限制速率；持续吞吐数据用明确握手或适当 FIFO。10 ns 脉冲可能完全夹在相隔 20 ns 的采样沿之间，因此增加后级同步级数并不能补救漏采样。

toggle 必须在接收/确认前保持；两次快速翻转回原值等同没有变化。同步器提高解析概率，MTBF 需要工艺数据和实际解析时间，普通 RTL 仿真不会给出它。

## 13：mailbox

源锁存 payload→翻转 req→保持 payload；目的同步 req→按协议等待→捕获 payload→返回 ack；源同步 ack 后才允许覆盖 payload。若目的钟暂停，源保持 busy 和 payload，不能超时后悄悄覆盖。

ack 确认捕获到缓冲，与 safe_update 应用完成分开。额外等待一周期只是协议的一部分，还需数据最大延迟与保持条件。源和目的 reset epoch 必须协调，否则 req/ack 可能被解释成假事务。

## 14：原子配置

如果完整 shadow=0xABC 时提交，pending 保存 0xABC；随后 shadow=0x123，不改变该 pending；safe_update 到达后 active=0xABC。若在写完高字节、未写低字节时 commit，提交的就是当时混合的 shadow，因此软件也必须遵守“全部字段写完再 commit”。

code 和 enable 同时从 pending 更新，保证数字字段一致。模拟输出仍可能因 Q 和互连传播不同出现瞬态，需要模拟侧明确锁存、blanking 或其他措施。复位默认值应让模拟电路处于可接受的状态。

## 15：复位和读回

测试必须检查接收次数、payload、ack/应用语义与恢复，而不只检查最终值。协同复位可规定中止全部未完成请求；独立复位要有重新同步 epoch 的协议。SCLK 停止时不能要求依赖 SCLK 的同步释放立即完成。

读命令解析后只有半周期时，不能默认跨域请求已经返回。增加 dummy 周期、分事务请求/取结果，或读带版本的已同步快照。过采样同 clk 的结课项目可在命令解析时锁存本地快照。

## 16：事务和寄存器

非法访问按规格返回错误/置状态，不改变目标配置。RO 写不生效；保留位的处理必须写清。W1C 同周期新事件优先：`(old & ~clear) | event`。

valid/ready 只有同时为 1 的 clk 边沿接受；等待时源保持 payload。总线访问完成、mailbox 捕获和模拟配置生效是三个可以不同的事件，必须由不同状态或协议表达。

## 17：FIFO

深度 4 的计数范围 0…4，需要 3 位 count；读写指针一般各 2 位。empty 时读拒绝，full 时写拒绝；同时合法读写 count 保持、两个指针各推进。边界策略按讲义采用保守规则，不能把非法请求也计算进去。

8 条命令在 t=1…8 μs 到达，读取发生在 t=2、4、6、8 μs；先写后读的瞬时峰值 5，读后峰值 4。若能安全支持满时同时读写，可改变接受策略和所需深度，但必须分析实现与事件排序。

平均输入长期高于输出时任何有限 FIFO 最终都会满；解决方法是限制输入、背压、拒绝或提高消费能力，而不是无限加深。

## 18：APB

两个等待周期的访问顺序：SETUP→ACCESS(PREADY=0)→ACCESS(0)→ACCESS(1 完成)。只有最后的完成边沿产生一次寄存器副作用。下一笔需经过新的 SETUP，即使 PSEL 在连续访问中保持高。

等待时地址、方向、写数据和控制保持。若 commit 忙，适配器可以等或完成并报告拒绝，但要选择明确规则，避免同一次写在等待期间重复提交。

## 19：物理输入

核心面积初估=10000/0.6=16666.7 μm²，边长约 129.1 μm；不能省略新增缓冲、时钟、电源和规则开销。tutorial.lib 的教学面积没有足够依据映射为当前工艺的 μm²。

没有配套物理和 RC 数据，就只完成输入审查与计算题。不能因为 Innovus 启动成功就声称实现完成。

## 20：时钟

在给定简化假设下，skew 增加 0.08 ns，使 setup 从 0.10 到 0.18 ns，hold 从 0.06 到 −0.02 ns。真正报告还会考虑场景、路径修正及不确定度等。

直接 AND 门控时钟可能产生窄脉冲；合适的 ICG 与门控检查、物理实现用于处理它。CTS 后必须核对时钟传播模型和 uncertainty 的来源，避免重复或遗漏预算。

## 21：寄生和修复

原 slack=1−0.10−0.60−0.10−0.10−0.10=0 ns。wire delay 增至 0.35 ns，新 slack=−0.25 ns。

先按 cell/net/clock 的贡献归因，再选逻辑重构、放置、缓冲或驱动调整。setup/hold 修复相互影响；改变频率主要帮 setup，插入数据延迟主要帮 hold但可能伤 setup。不要只用单角最差数字判断全部场景。

## 22：功耗

0.1×10 pF×1²×50 MHz=50 μW；α=0.01 时为 5 μW。此为等效负载充电功耗，不包含全部内部、漏电、时钟树和毛刺功耗。

模拟需求表至少定义 active 更新允许窗口、稳定时间、瞬态幅度与使能顺序，供电/地和耦合需要相应分析。没有真实库及活动证据时写“估算”，不能标记为已测功耗。

## 23：结课项目关键序列

参考状态序列：写 shadow_code=ABC、shadow_enable=1→commit 被接受→pending=1→shadow 改成123→再 commit 被拒绝并置 busy_reject→safe_update→active=ABC、enable=1、pending=0、applied 单周期。

短/长/非法帧不能改 shadow/active，frame_error 置位。写副作用在验证完整帧后发生，所以不会在第 24 位先提交、到第 25 位才发现长帧却无法撤销。读快照在命令解析时锁存，一帧保持一致；其发送不意味着尚未结束的帧一定合法。

旧 pending 应用与新 commit 同周期，保守策略仍拒绝新 commit；刚接受的 commit 不在同一边沿应用。用边沿前状态判定能避免 testbench 与实现各自作不同解释。

## 24：评审和学习完成

一个有效评审例子是“pending 期间 shadow 改写”：规格规定快照保持；RTL 用独立 pending 寄存器；testbench 的参考模型保存已接受快照；测试在 safe_update 前多次改 shadow 并核对 active；时序分析检查 pending→active 的实际寄存器路径。

能讲清功能、电路、验证与约束的联系，才算达到本课程学习目标。尚未运行的综合、CDC/形式分析和物理阶段分别标记未完成，不由理论正确推断工具结果通过。

## 原有讲义六题对照

1. A5 首位与八个采样点：见 02；首位在 CS 拉低时准备。
2. 精确 2 MHz：见 04，需要非整数 D=12.5，当前实现不能精确产生。
3. D=10：2.5 MHz、半周期 200 ns、CS=3.4 μs。
4. busy 中 tx_data 改变不影响原交易：接受时已锁存 tx_shift，首位 mosi 也已锁存。
5. 网表与关键路径：见 08–09；当前最差路径 miso→rx_data_reg[0]/D，经控制/选择基础门。依据实际 timing.rpt 沿实例名称查连接，不凭 RTL 行数猜逻辑深度。
6. 同步/异步复位与 SCLK：见 05、11；Master 的 SCLK 是输出状态，用 clk 使能更新；把它当内部时钟会改变时钟架构与约束。

## 原有报告三题对照

1. 同步复位由采样边沿执行，常表现为 D 端选择复位值；实际映射也可能使用具有相应同步功能的单元。
2. MUX 逻辑可以分解成 NAND/NOR/INV，因此没有 MUX 实例名不表示没有保持/更新选择。
3. 固定路径与预算下，周期从 20 ns 改为 5 ns，slack 从 14.239 降到 −0.761 ns；真实重新综合不能直接沿用旧延迟作最终结果。
