EETOP 创芯网论坛 (原名:电子顶级开发网)

标题: DFT中扫描链的插入而引入的测试端口是自己加上去的还是自动加上去的呢? [打印本页]

作者: sages    时间: 2012-8-6 10:34
标题: DFT中扫描链的插入而引入的测试端口是自己加上去的还是自动加上去的呢?
用DFTC做DFT的时候,compile -scan是将flop转为scanned flop,这是会自动添加SI/SE,这个没有什么问题。
小弟现在想咨询各位大神的是,在生成protocol的时候,之前的一些设置,比如
set_dft_signal -view existing_dft -type ScanClock -port clk_df -timing [list 45 55]
set_dft_signal -view existing_dft -type Reset -port reset_n -active_state 0
set_dft_signal -type ScanDataIn -port  test_in
set_dft_signal -type ScanDataOut -port  test_out
这四条设置命令中,clk_df就是原本自己模块的时钟吗?(按理说应该不是呀,那需要自己设置一个时钟吗?)
同理,reset_n就是自己模块的reset吗?那test_in和test_out呢?
这四个设置中的端口是模块自己本身的还是应该自己手动先在RTL级代码中添加的呢?(如果是自己添加进去的端口,比如test_in,那么这个test_in肯定就是接在一个MUX-flop的输入端的,那这样的话也就没有必要用compile -scan自动生成scan flop了吧,因为端口处的scan -flop的SI端口的输入就是test_in亚)
作者: otogyg    时间: 2012-8-6 13:15
与scan相关的信号有:test_clk,ext_rstn,scan_enable,scan_in,scan_out。
这些信号都要做到外部可控,也就是说这些信号最终要接到pad上(单独出或者复用)。
这几个命令是指定数字顶层哪些port是给这些信号用的。
测试的时候时钟是外部给的,rst信号也是外部给的,不用内部产生的时钟和rst信号,
其它的3个信号是控制scan使能和scan pattern的输入与输出的,同样是外部控制。
这几个信号一般在rtl都要考虑,在做DFT的时候将他们用你说的这几个指令指定就好了。
作者: helte320    时间: 2012-8-6 13:36
都是自己添加上去的,到了管脚部分,可以复用也可以单独引出
作者: sages    时间: 2012-8-6 19:07
回复 2# otogyg


   恩,非常感谢您的回答。还是有几个比较模糊的地方。您说到测试时钟是外部给的,不是内部产生的。那是不是指整个芯片上应该会有两个时钟pad,一个是function clock,即用于正常工作的时钟;另一个是测试时钟,即用于测试的。是这个意思吗?那这样的话两个时钟pad在芯片内部是通过一个选通的方式选择其中一个时钟吗?其他信号同理。   另外,有个不明白的,如果rtl已经设计好了DFT,比如一个将一个输入测试数据和一个正常数据进行MUX。那为什么还需要compile -scan呢?
   能否麻烦您解惑一下,非常感谢
与scan相关的信号有:test_clk,ext_rstn,scan_enable,scan_in,scan_out。
这些信号都要做到外部可控,也就是说这些信号最终要接到pad上(单独出或者复用)。
这几个命令是指定数字顶层哪些port是给这些信号用的。
测试的时候时钟是外部给的,rst信号也是外部给的,不用内部产生的时钟和rst信号,
其它的3个信号是控制scan使能和scan pattern的输入与输出的,同样是外部控制。
这几个信号一般在rtl都要考虑,在做DFT的时候将他们用你说的这几个指令指定就好了。

作者: sages    时间: 2012-8-6 19:10
回复 3# helte320


   请问一下复用的概念是指?今天我试着随便综合了一个电路,然后进行了DFT的综合。发现如果我set_dft signal -view e -type ScanClock -port clk的话(其中clk就是原来的function clock),发现在电路图上clk没有发生任何改变。如果我对输入的数据端口设置为ScanDataIn,那么这个数据端口就会进行串链。再另外,如果我对reset信号设置为-active_state 0 的dft_signa,发现也没有什么变化,请问这个是怎么回事?还是跟您说的不一样呢
作者: otogyg    时间: 2012-8-6 21:14
回复 4# sages


1)正如你所说function clock 和test clock 是分开的,芯片里要做clock选择,测试时芯片用的是test clock。
    test clock 可以与其它pin复用一个pad(节省pad)。
2)compile -scan 这个参数是指定设计里所用的filp_flop 都用scan filp_flop,如果没有-scan 综合是用一般的filp_flop的。
作者: sages    时间: 2012-8-6 22:03
回复 6# otogyg


   您好,我的意思是说,如果我在RTL级已经做了内部的信号选通了,为什么还要DC自动帮我换scan flop呢?或者您的意思是不是应该这样理解,就是只是在输入端口处的test_in、clock、reset、test_mode以及输出端口的test_out需要自己手动在RTL级添加代码,让他们能够进行选通。而芯片内部的flop则只需要通过compile -scan命令自动将flop换为scan flop即可。而在RTL级添加的选通,可以选择让test_in或者正常数据输入,选择让test_clock还是正常clock进入,选择让test_reset还是reset进入,而这些选择都是通过test_mode来进行的???

如果是这样的话,我想请问一下,为什么不直接利用正常的reset的端口呢?他俩有什么区别吗?
作者: otogyg    时间: 2012-8-7 09:23
回复 8# sages

1)只需要在输入输出端口添加,内部有工具做。
2)测试时要求芯片的复位信号外部可控,即由外部产生复位信号送入芯片,
     不能受内部信号影响。
不知道这么说,你明白不。
作者: sages    时间: 2012-8-7 11:13
回复 9# otogyg


   也就是说,在原来的功能模块中,直接添加test_clock, reset_n, test_mode, scanin和scanout这几个端口就行了。只定义前四个端口为input,最后一个为output就可以了吗?而至于该端口与内部应当怎么连接,不需要我手动定义,直接交给DC进行DFTC就可以了是吗?
作者: otogyg    时间: 2012-8-7 11:19
回复 10# sages

时钟和复位信号的选择还是要做的(用scan_enable来选)。
还有就是在dft compiler中用set_dft_signal 来告诉工具
哪个是测试时钟,哪个是测试复位信号,等等。。
作者: sages    时间: 2012-8-7 12:08
回复 11# otogyg


   恩,非常感谢您的耐心回答。那也就是说scanin和scanout端口就只需要在RTL级中添加端口即可,不需要在内部做RTL级的选通了吗?此外,如果我的clock和reset需要在RTL级做选通,那么在测试的时候,是不是ATE可以自动处理信号的切换呢?(比如只需要给ATE相应的类似STIL文件那样的东西)
作者: otogyg    时间: 2012-8-7 12:22
回复 12# sages

1)scanin和scanout,如果不做端口复用就不用选通。
2)测试时ATE控制所有的端口,根据STIL文件加激励,
     只要STIL是正确的就没什么问题。
作者: sages    时间: 2012-8-7 16:55
回复 13# otogyg


    OK,我大概懂您的意思了。我看了下lab中的程序,发现的确对于clock和reset单独做了两个模块。但是也有个问题想问一下,这两个是高扇出的网络。如果对clock和reset做了选通,比如时钟网络,那么在DC中做时钟约束的时候按理说应当对两个时钟都做处理吧?也就是说一个芯片会存在两个时钟数网络咯?但是如果这两个时钟的频率相差本来就比较大,比如一个100M(clk_a),一个1M(clk_b),假设选通后的为clk,那么对clk_a和clk_b做时钟树网络的时候,其实也就是对clk做时钟树网络,但是,比如在DC中加入transition之类的,对clk加的transition应当以clk_a还是clk_b为标准呢?

问题有点繁琐,非常感谢您的回答
作者: sages    时间: 2012-8-7 17:31
回复 13# otogyg

我这边写了一个简单的加法器,然后将时钟进行选通,选通的方式采用同步化处理,以避免毛刺。但是我发现我进行DFTC之后,没办法把所有链串上。想请问一下这个的原因是我的DC设置命令有问题,还是RTL级代码有问题呢。太麻烦你了,怎么转信元给您呢。
compile -scan
set_dft_signal -view existing_dft -type ScanClock -port clk_test -timing [list 45 55]
set_dft_signal -view existing_dft -type Reset -port reset_n -active_state 0
set_dft_signal -view existing_dft -type ScanDataIn -port test_in
set_dft_signal -view existing_dft -type ScanDataOut -port test_out
set_dft_signal -view existing_dft -type ScanEnable -port test_mode
create_test_protocol
dft_drc
dft_drc
preview_dft
insert_dft
report_scan_path -view existing_dft -chain all

////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    module adder(
    clk_df, reset_n,
    a, b,
    c_clk2,
    clk_test,
    //reset_test,
    test_mode,
    test_in,
    test_out
);

input clk_df, reset_n;
input a, b;
output c_clk2;

input clk_test;//, reset_test;
input test_mode;
input test_in;
output test_out;

reg c,c_clk1, c_clk2;
reg a_clk1, b_clk1;

wire en_test, en_func, clk1, clk2, clk;
reg    d_test, d_func;

//===================clock block
assign en_test = (~test_mode) ^ (~d_func);
assign en_func = (test_mode) ^ (~d_test);
assign clk1 = clk_test ^ (~d_func);
assign clk2 = clk_df ^ (d_test);
assign clk = clk1 || clk2;

always @ (negedge clk_test or negedge reset_n)
begin
    if (!reset_n)
        d_test <= 1'b0;
    else
        d_test <= en_test;
end

always @ (negedge clk_df or negedge reset_n)
begin
    if (!reset_n)
        d_func <= 1'b0;
    else
        d_func <= en_func;
end


always @ (posedge clk or negedge reset_n)
begin
    if (!reset_n)
        begin
            c <= 0;
            c_clk1 <= 0;
            c_clk2 <= 0;
            b_clk1 <= 0;
            a_clk1 <= 0;
        end
    else
        begin
            a_clk1 <= a;
            b_clk1 <= b;
            c <= a_clk1+b_clk1;
            c_clk1 <= c;
            c_clk2 <= c_clk1;
        end
end

endmodule
作者: otogyg    时间: 2012-8-7 18:51
回复 15# sages

insert dft后还需要做compile -incremental -scan
还要做dft_drc
作者: otogyg    时间: 2012-8-7 18:52
回复 14# sages

按最高时钟来约束,一般测试时钟是10M。
作者: qwpsmile    时间: 2012-8-7 21:40
test_en 和 scan_en 是专有端口。
scan_in scan_out scan_clk 可以复用 primary io。
作者: sages    时间: 2012-8-9 15:05
回复 16# otogyg


    我在create了protocol之后做dft_drc就报错,但是我没有找到如何修复这个错误的方法。错误如下
( , 下载次数: 84 )

如果我不管这个错误继续往下做。在insert_dft之后,我点开schematic,就显示出只有白色显示的一条扫描链,如下图,而且我感觉这个链不太对:
( , 下载次数: 86 )

如果之后我再compile -incr -scan,发现schematic跟上面这幅图没有什么区别。如下图所示:
( , 下载次数: 88 )


我不知道这是怎么回事呢
作者: sages    时间: 2012-8-9 15:07
回复 18# qwpsmile


    恩,好的,谢谢。大概懂这个端口的意思了,我发现scanin和out只需要定义一下,不需要在RTL级指定逻辑也可以。但是就是出现上面我描述的问题。不知道怎么回事。
作者: otogyg    时间: 2012-8-9 15:51
回复 19# sages

串的不对,filp-flop的si于se端都还接地,就没串上。
这个错误的意思是b_clk1_reg这个filp_flop的时钟在测试下是不可控的。
测试下这个DFF的时钟要直接用外部测试时钟,而不是经过内部逻辑之后的一个时钟。
作者: sages    时间: 2012-8-10 09:15
回复 21# otogyg


    但是有两个时钟端口,我必须首先对两个时钟端口进行一个选通操作后,将选通的结果连接到内部寄存器的时钟端口吧。还有就是感觉这个drc错误至少不应该影响到扫描链的形成,现在完全是懵的。请详细指教一下。
作者: sages    时间: 2012-8-10 09:32
回复 21# otogyg


    我看了下RTL级代码,如之前贴上的,接在所有寄存器的时钟端口的信号是选通后的时钟信号。
    不知道是不是在综合的时候要对两个时钟信号进行其他操作呢?我看DFTC的sg上,修改这种DRC错误都是回到RTL进行修改的。。。这个我就懵了。
作者: otogyg    时间: 2012-8-10 10:23
回复 23# sages


                               
登录/注册后可看大图


但你看这个图上的b_clk1_reg的CK端前面明显不仅有MUX。
作者: sages    时间: 2012-8-10 14:31
回复 24# otogyg


    恩,确实是。我在RTL级编写代码的时候,对两个时钟的选取采用的是首先利用时钟下降沿同步test_mode,然后再选通哪一路通过MUX。这样的原因是为了避免有毛刺和亚稳态出现。按照这个思路去写选通时钟,确实会出现你说的那种情况。今天中午我又尝试了直接利用MUX选通时钟,即assign clk = (test_mode)?clk_test:clk_df;   这样写了之后在dft_drc就不会出现drc违例,但是只利用一个MUX进行信号选通,test_mode上的毛刺会带来输出clk的毛刺,所以我很迷惑应当如何进行这种选通时钟的书写呢?
作者: otogyg    时间: 2012-8-10 15:03


   
回复  otogyg


    恩,确实是。我在RTL级编写代码的时候,对两个时钟的选取采用的是首先利用时钟下降 ...
sages 发表于 2012-8-10 14:31



测试下,无论是test_mode还是rst还是clk都是可控的,也就是说这些信号什么时候加都是可以控制的。
所以test_mode这个信号不会出现毛刺,亚稳态也不会有,你多虑了。
有时间了解下测试是怎么做的,就不会有这样的疑问了。
作者: sages    时间: 2012-8-10 15:33
回复 26# otogyg


    也就是说,不用考虑这些毛刺的问题了吗?wow,那设计就方便多了诶。很抱歉在测试这一块了解得确实太少了。我再自己看看如何DFTC吧。感觉始终没有综合出一个正常的电路图出来。。。
    PS:有没有介绍毛刺这一块的相关资料呢。麻烦推荐一下。
作者: sages    时间: 2012-8-10 15:43
回复 26# otogyg


    ( , 下载次数: 101 )

顺便问一下,我这次综合又报DRC的错,他说红色模块的clock端口是uncontrol的,但是我看这几个寄存器明显都是一样的接在同一根选通出来的时钟线上嘛。这种情况您有经验没呢
作者: otogyg    时间: 2012-8-10 16:01
回复 27# sages
测试下(除去功能测试)是不用考虑的。你是说亚稳态?
作者: pphongbo    时间: 2012-9-18 13:12
我会跟帖的 我也出现了这个问题
作者: xiubo541038    时间: 2013-2-1 11:05
我是新手,最近在做扫描链插入,遇到一些问题,希望大家指点下。
主要有下面几个疑问:
1、假如我们的设计有多个功能模块,有多个层次,那测试信号如scan_enbale,scan_datain,scan_dataout等信号只需要在顶层模块定义就行了吗?
2、如果设计中有多个时钟,每个时钟都有驱动寄存器,那时钟的选择怎么做
我发现我按本帖上的方法试了,但是好像没有插入扫描链,输入悬空的,输出被拉到地了
作者: 767616852    时间: 2013-11-22 14:33
回复 10# sages


   我想问一下,是在.v文件中自己手动敲入这些信号吗?不可以直接在dc过程中软件自动加入吗,你加入这些scanin scan out信号,又该和那个线连接呢
作者: CZB的筱    时间: 2023-6-21 10:49
学习到了
作者: aaker    时间: 2025-5-9 17:38
学习学习 不过还是iyou不懂
作者: lvfinn    时间: 6 天前


   
otogyg 发表于 2012-8-7 12:22
回复 12# sages

1)scanin和scanout,如果不做端口复用就不用选通。


请问做端口复用,scan_out和一个输出信号根据scan_mode做Mux连接到输出pin上,综合的时候将寄存器输出和scanout串起来,但这个二选一Mux却没有综合出来,是需要对这个scan_out做其他处理吗





欢迎光临 EETOP 创芯网论坛 (原名:电子顶级开发网) (https://bbs.eetop.cn/) Powered by Discuz! X3.5