on chip clock的由来
在工艺节点在130nm以下的时候,很多情形下的物理缺陷都是由于延时来引起的。因此在对这种类型的chip做dft的时候,需要建立一个新的故障模型,业内称之为延时故障模型(time delay model)。解决的方法就是at-speed test,所谓的at-speed test就是让芯片工作在自己高倍时钟频率上,这个频率往往是要高过ATE的时钟的。这样对扫描模型的建立就提出了新的要求。
大家工作中接触的一般的dft时钟是不是频率不高。
片上时钟控制器 (On-chip Clock Controllers ,OCC) ,也称为扫描时钟控制器 (Scan Clock Controllers,SCC)。OCC 是插入 SOC 的逻辑,用于在 ATE(自动测试设备)上进行回片测试期间控制时钟。由于 at-speed test在capture mode下需要两个时钟脉冲,其频率续等于func mode下的最高时钟频率,因此在没有 OCC 的情况下,我们需要通过 I/O pad提供这些at-speed clock脉冲。但是这些I/O pad它们在可以支持的最大频率方面存在限制;另一方面,OCC 使用内部 PLL clock来生成时钟脉冲进行测试。在 stuck-at test期间,OCC 确保在capture阶段仅生成一个时钟脉冲。同样,在at-speed test期间,OCC 确保在capture阶段生成两个时钟脉冲,其频率等于功能时钟的频率。
因此,在scan做的比较好的design中所有的test clock都通过 OCC 进行通路控制, OCC 控制scan mode下的时钟操作(在stuck-at test和at-speed test中)并绕过func mode下的功能时钟。
基本OCC结构
本文我们将讨论一个非常基本的 OCC 设计,其唯一目的是演示它是如何工作的。与此处讨论的 OCC 相比,行业标准 OCC 更先进,更能抵御时钟毛刺。
图1 基本片上时钟控制器结构示意图(具有 n 位移位寄存器)
当电路处于func mode(Test Mode = 0)时,OCC 会传播功能时钟(参见图 1)。但在shift阶段(Shift Enable = 1),scan clock在 OCC 的输出端propagate。在capture阶段(Shift Enable = 0),移位寄存器开始shift“1”并启用Clock Gate,以根据test type来允许单脉冲或双脉冲。OCC 在stuck-at test(At-speed Mode = 0)中生成一个时钟脉冲,在at-speed test(At-speed Mode = 1)中生成两个时钟脉冲。
此 OCC(具有 5 位移位寄存器)在at-speed test的行为如图 2 所示。两个捕获脉冲出现在功能时钟的 5 个正沿之后(因为我们使用的是 5 位移位寄存器) .
注意:一旦 Shift Enable 置为低电平,n 位移位寄存器根据功能时钟的上升沿数量决定延迟,之后功能时钟在 OCC 的输出端propagate。
图 2 图 1 中所示 OCC 结构的仿真波形(具有 5 位移位寄存器)
Systemverilog code of the OCC
module occ
#(
parameter SHIFT_REG_BITS = 5
)
(
input logic test_mode,
input logic atspeed_mode,
input logic shift_en,
input logic scan_clk,
input logic func_clk,
output logic occ_out_clk
)
logic cg_en;
logic cg_out_clk;
logic sync_flop;
logic [SHIFT_REG_BITS-1:0]shift_reg;
always @(func_clk or cg_en) begin
if (cg_en == 1)
cg_out_clk = func_clk;
else
cg_out_clk = 0;
end
always_ff @(posedge scan_clk) begin
sync_flop <= ~shift_en;
end
always_ff @(posedge func_clk) begin
shift_reg <= shift_reg << 1;
shift_reg[0] <= sync_flop;
end
assign occ_out_clk = test_mode ? (shift_en ? scan_clk : cg_out_clk) : func_clk;
assign cg_en = atspeed_mode ? (~shift_reg[SHIFT_REG_BITS-1] & shift_reg[SHIFT_REG_BITS-3]) : (~shift_reg[SHIFT_REG_BITS-1] & shift_reg[SHIFT_REG_BITS-2]);
endmodule
END