参考答案与判断依据
先完成自己的推演,再对照答案。示例计算使用讲义给定的假设;后续设计实验需要自己的 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/形式分析和物理阶段分别标记未完成,不由理论正确推断工具结果通过。
原有讲义六题对照
- A5 首位与八个采样点:见 02;首位在 CS 拉低时准备。
- 精确 2 MHz:见 04,需要非整数 D=12.5,当前实现不能精确产生。
- D=10:2.5 MHz、半周期 200 ns、CS=3.4 μs。
- busy 中 tx_data 改变不影响原交易:接受时已锁存 tx_shift,首位 mosi 也已锁存。
- 网表与关键路径:见 08–09;当前最差路径 miso→rx_data_reg[0]/D,经控制/选择基础门。依据实际 timing.rpt 沿实例名称查连接,不凭 RTL 行数猜逻辑深度。
- 同步/异步复位与 SCLK:见 05、11;Master 的 SCLK 是输出状态,用 clk 使能更新;把它当内部时钟会改变时钟架构与约束。
原有报告三题对照
- 同步复位由采样边沿执行,常表现为 D 端选择复位值;实际映射也可能使用具有相应同步功能的单元。
- MUX 逻辑可以分解成 NAND/NOR/INV,因此没有 MUX 实例名不表示没有保持/更新选择。
- 固定路径与预算下,周期从 20 ns 改为 5 ns,slack 从 14.239 降到 −0.761 ns;真实重新综合不能直接沿用旧延迟作最终结果。