DFT 中的 On-Chip Clock Controller (OCC) 架构设计
OCC 简介与背景
OCC(On-Chip-Clock Controller)的全称是片上时钟控制器,主要作用是在结构性测试的 At-Speed Delay 测试中管理时钟。在 atspd 测试中,需要精准产生两个 at-speed clock cycles 来完成 Launch 和 Capture 的过程。然而,PLL 产生的时钟是一直运行(Free-Running)的,且 ATE 无法直接提供测试所需的高速时钟。因此,需要一个模块来对测试过程中的时钟进行控制,OCC 就是为了解决这个问题而设计的。
关于 Scan Test 过程的一些补充说明:
- Shift:ATE 提供 Test Clock,shift in 数据的同时对比 shift out 的数据。
- Dummy Cycles:SE 驱动所有寄存器时负载非常大,transition 时间长,且 shift 过程 Toggle 高可能导致芯片电压降低。因此在 AC 测试中,shift 完成后需等待一段时间让芯片电压恢复。
- Force PI & Memory PO:对于 Full Scan 设计,所有 IO PAD 都被当做 Scan in/Scan out(Wrapper Cores),此时不需要此过程,但 ATPG Pattern 默认会有这两个 cycles。
OCC 基本设计与优化
插入 OCC 后,Design 中的时钟结构会发生变化,所有 regs 的时钟都来自 OCC 的输出端口。设计一个 OCC 需要考虑以下几点:
- 正常工作模式:regs 需要一直使用 func clk,因此 OCC 应有一个 Test Mode 端口。当 Test Mode = 0(即正常工作模式),OCC 的 clk out 端口上的时钟和 func clk 完全相同。
- 测试模式切换:在测试模式下,Shift 阶段使用慢速时钟,AC Capture 阶段使用快速时钟。clk 切换的时间是在 scan_en 由高拉低之后,可以利用 scan_en 来控制 clk 的切换过程。
- 延时处理:scan_en 拉低之后,并不是立刻就要用到 fast clock,两者之间有一定的延时,这一点可以用移位寄存器来实现。
基础方案示例
基于 N bits 移位寄存器的 OCC 基本结构中,MUX C 用于选择 Func Clock 或 Test Clock。当 Test Mode = 0 时,芯片工作在 Func Mode,OCC 处于 Bypass Mode,对 Func 模式透明。当 Test Mode = 1 时,芯片进入 DFT 测试模式:
- Shift Enable = 1 时,MUX B 选中 Scan Clock,OCC 输出低速时钟,完成 Shift 过程,同时 0 被保存到移位寄存器中。
- Shift 完成后,Shift Enable = 0,芯片进入 Capture Mode。移位寄存器 Q0 - Qn 开始被 Shift 1。
- 移位寄存器最后三级的输出值经过组合逻辑连接到 ICG 的 E 端口,移位寄存器的长度决定了等待时间。
- 当 At-Speed Mode = 0(DC 测试),MUX A 选中 0,特定条件下 MUX 输出 1,ICG 打开,OCC 输出一个 Capture Clock Pulse。
- 当 At-Speed Mode = 1(AC 测试),MUX A 选中 1,ICG 打开可产生两个 Capture Clock Pulses。
优化方案
基础方案存在风险:Capture Clock Cycles 和 scan_en 之间的时间间隔取决于移位寄存器的级数,设计完成后无法动态调整;scan_en 负载大,切换时间可能超过间隔导致测试失败;scan_en 直接连接移位寄存器可能引入不定态。
优化后的 OCC 在 scan_en 上增加了一级由 slow clock 驱动的 sen_retiming 寄存器。这样虽然 slow clock cycles 和 Launch/Capture Clock Cycles 之间的时间是固定的,但 scan_en 和 slow clock cycles 之前的时间间隔可以通过 ATE 动态调整,进而实现 Launch/Capture Clock Cycles 到来时间的动态调整。分析该 OCC 的工作过程:
- scan_en = 1 时,所有寄存器被 shift 1。
- shift 结束后,slow clock 关闭,CDC 和 sen_sync 等寄存器值不更新,待 scan_en 稳定后给 slow clock cycles,scan_en 的 0 会被 shift 到其他寄存器中。
- 当两级寄存器值为 11 时,launch_en 使能,ICG 打开,提供 Launch Clock Cycles。
- 当两级寄存器值为 01 时,capture_en 使能,ICG 打开,提供 Capture Clock Cycles。

