一、Build Mode
-
讀入網表: BUILD-T> read_netlist /libs/0.18u/*/??DFF*.v (?代表1位,*代表n位)
- 若兩個同名文件默認讀入最后一個: set_netlist -redefined_module last | first
- 只能讀structural Verilog libraries
Empty Box VS. Black Box
set_build -reset_boxes; #Clears black & empty box list set_build -empty_box BUS SWITCH set_build -black_box RAM32x8 -empty_box IRQ_CORE # In Tcl mode, must use list for multiple black box modules: set_build -black_box [list RAM32x8 RAM64X8] # Report all black box modules: report_modules -black box
二、快速到達各個模式
(2)快速到達DRC Mode
第一次過程:
BUILD-T> read_netlist ...
BUILD-T> run_build_model
DRC> write_image pass1.image.gz -compress gzip -replace
隨后的過程(快速到DRC mode):
BUILD-T> read_image pass1.image.gz
DRC-T>
(2)快速到達TEST mode
第一次過程:
BUILD-T> read_netlist . .
BUILD-T> run_build_model
DRC-T> run_drc DUT.spf
TEST-T> write_image pass1.image.gz -compress gzip -replace -violations
隨后的過程(快速到test mode):
BUILD-T> read_image pass1.image.gz
TEST-T> #Ready to resume in TEST mode
三、Memory DFT
1.測試RAM / ROM內部fault
--無法通過門級stuck-at fault技術來測試RAM / ROM的晶體管級結構
--memory BIST(MBIST)通常用於測試內部memory fault
2.測試ATPG中的RAM / ROM 周圍的邏輯
①應用black box模型(不推薦):
綜合設計中的供應商RAM / ROM原語通常表現為black box,memory周邊邏輯的覆蓋率會很低
②對Basic-Scan ATPG使用bypass模式(常用):
如果memory支持bypass模式,則可以使用bypass模式來獲取周圍邏輯的覆蓋范圍
③編寫順序ATPG的功能模型(最好):
通過用用戶提供的功能Verilog模型替換black box RAM / ROM單元,可以最大化周圍邏輯的可測試性
(后兩者可結合使用)
Black Box or Bypass Mode
非掃描順序單元(包括memoty)會導致DFT阻塞
解決:
① 對RAM添加bypass,以便圍繞RAM的某些邏輯可以使用Basic-Scan ATPG測試;
手動修復RTL(如果memory沒有bypass模式);
② 使用TetraMAX model
-- 啟用Fast-Sequential ATPG以允許TetraMAX通過memory進行測試
-- 將寫入控制信號傳遞到top-level port:在順序周期內控制寫;在掃描移位期間保護memory
3.Memory應該clock穩定&load穩定
① momery is “clock stable”——如果當所有時鍾都處於“off state”時其內容穩定
-- memory必須是時鍾穩定才能被ATPG使用
② momery is “load stable”——如果momery在掃描移位期間處於穩定狀態
-- 通常用有ScanEnable的memory的WriteEnable或ChipSelect信號來實現
-- 通過使用多個負載來測試memory周圍的故障,從而使ATPG更加有效
-- 還具有降低scan shift期間功耗的好處
③ 報告memory的屬性:
report memory -all -verbose
4.示例
RAM model
本示例中的RAM具有level敏感的write和read端口
module MY_ATPG_RAM(read,write, data_in,data_out, read_addr , write_addr ); input read, write; input [7:0] data_in; //8bit data width input [3:0] read_addr; //16 words input [3:0] write_addr; //16 words output [7:0] data_out; //8 bit data width reg [7:0] data_out; //output holding reg reg [7:0] memory [0:15]; //memory storage event WRITE_OP; //event for write-thru always @(write or write_addr or data_in) if (write) begin memory[write_addr] = data_in; #0; ->WRITE_OP; end always (read or read_addr or WRITE_OP) if(read) data_out = memory[read_addr] ; endmodule
ROM model
module ROM_8x4 (ADDR, SINE); input [2:0] ADDR; output [ 3:0] SINE; reg [3:0] SINE; reg [3:0] ROM [0:7]; initial $readmcmb ("ROM_Bx4.dat” , ROM ); always @ ( ADDR ) if (ADDR<=7) SINE = ROM[ADDR] endmodule