on chip clock的由來(lái)
在工藝節(jié)點(diǎn)在130nm以下的時(shí)候,很多情形下的物理缺陷都是由于延時(shí)來(lái)引起的。因此在對(duì)這種類型的chip做dft的時(shí)候,需要建立一個(gè)新的故障模型,業(yè)內(nèi)稱之為延時(shí)故障模型(time delay model)。解決的方法就是at-speed test,所謂的at-speed test就是讓芯片工作在自己高倍時(shí)鐘頻率上,這個(gè)頻率往往是要高過(guò)ATE的時(shí)鐘的。這樣對(duì)掃描模型的建立就提出了新的要求。
大家工作中接觸的一般的dft時(shí)鐘是不是頻率不高。
片上時(shí)鐘控制器 (On-chip Clock Controllers ,OCC) ,也稱為掃描時(shí)鐘控制器 (Scan Clock Controllers,SCC)。OCC 是插入 SOC 的邏輯,用于在 ATE(自動(dòng)測(cè)試設(shè)備)上進(jìn)行回片測(cè)試期間控制時(shí)鐘。由于?at-speed test在capture mode下需要兩個(gè)時(shí)鐘脈沖,其頻率續(xù)等于func mode下的最高時(shí)鐘頻率,因此在沒(méi)有 OCC 的情況下,我們需要通過(guò) I/O??pad提供這些at-speed?clock脈沖。但是這些I/O ?pad它們?cè)诳梢灾С值淖畲箢l率方面存在限制;另一方面,OCC 使用內(nèi)部 PLL clock來(lái)生成時(shí)鐘脈沖進(jìn)行測(cè)試。在?stuck-at test期間,OCC 確保在capture階段僅生成一個(gè)時(shí)鐘脈沖。同樣,在at-speed test期間,OCC 確保在capture階段生成兩個(gè)時(shí)鐘脈沖,其頻率等于功能時(shí)鐘的頻率。
因此,在scan做的比較好的design中所有的test clock都通過(guò) OCC 進(jìn)行通路控制, OCC 控制scan mode下的時(shí)鐘操作(在stuck-at test和at-speed test中)并繞過(guò)func mode下的功能時(shí)鐘。
基本OCC結(jié)構(gòu)
本文我們將討論一個(gè)非?;镜?OCC 設(shè)計(jì),其唯一目的是演示它是如何工作的。與此處討論的 OCC 相比,行業(yè)標(biāo)準(zhǔn) OCC 更先進(jìn),更能抵御時(shí)鐘毛刺。
圖1??基本片上時(shí)鐘控制器結(jié)構(gòu)示意圖(具有 n 位移位寄存器)
當(dāng)電路處于func mode(Test Mode = 0)時(shí),OCC 會(huì)傳播功能時(shí)鐘(參見(jiàn)圖 1)。但在shift階段(Shift Enable = 1),scan clock在 OCC 的輸出端propagate。在capture階段(Shift Enable = 0),移位寄存器開(kāi)始shift“1”并啟用Clock Gate,以根據(jù)test type來(lái)允許單脈沖或雙脈沖。OCC 在stuck-at test(At-speed Mode = 0)中生成一個(gè)時(shí)鐘脈沖,在at-speed test(At-speed Mode?= 1)中生成兩個(gè)時(shí)鐘脈沖。
此 OCC(具有 5 位移位寄存器)在at-speed test的行為如圖 2 所示。兩個(gè)捕獲脈沖出現(xiàn)在功能時(shí)鐘的 5 個(gè)正沿之后(因?yàn)槲覀兪褂玫氖?5 位移位寄存器) .
注意:一旦 Shift Enable 置為低電平,n 位移位寄存器根據(jù)功能時(shí)鐘的上升沿?cái)?shù)量決定延遲,之后功能時(shí)鐘在 OCC 的輸出端propagate。
圖 2??圖 1 中所示 OCC 結(jié)構(gòu)的仿真波形(具有 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