2008年12月30日星期二

VCS2008在ubuntu上的安装

今天不上班,在家休息之余,装了个VCS2008,跑跑小仿真玩玩。在公司里仿真器都是采用cadence的ldv5.1,版本比较老,对systemverilog的支持比较弱,加上目前还找不到ius的仿真器,于是还是搞俺的VCS吧。

ubuntu版本:8.04
VCS版本:2008.12

安装过程采用synopsys推荐的标准安装方法,采用synopsys installer V1.8安装tar文件,然后就是设置环境变量,由于之前安装DC的时候license生成,并且指定好,所以这一步可以简化,只需要指定VCS_HOME环境变量。最后就是指定路径哈,比较简单。这些做完之后,试了一下在console中敲入vcs tb.v,结果通常会让人感到郁闷。
1.首先是一个linux内核的warning,实际上不影响最后的功能,为了每次不报告出warning,还是设置了一下环境变量:setenv VCS_ARCH_OVERRIDE linux
2.编译的时候stdio.h的文件找不到。查看了一下/usr/include内容,确实是没有该头文件,安装下面文件即可 sudo apt-get install build-essential
3.在链接文件的时候,提示lz错误,应该是缺少libz.a或者是libz.so文件,从网上download一个zlib的文件,tar解压后,使用./configuire来配置,并且make安装。安装完毕后可以在/usr/local/lib里发现多了一个libz.a文件,正是所需要的。

一切完毕之后编译链接都过了,产生一个simv文件,然后调用simv -gui,ok~,一切搞定,目前还没有发现其他的问题。

2008年12月26日星期五

set_ideal_network 和set_dont_touch_network的使用总结

set_ideal_network用来对port,pin,net来设置ideal_network属性,所谓的ideal_network属性就是0电阻0电容+所有的cell和net都dont_touch。因此就会0转换时间,0延时,综合优化的时候不会对路径的cell和net进行优化。

注意:1.对net进行设置的时候,必须要带上no_propagate的属性,否则是加不上去的。对port和pin可以加上带也可以不带no_propagate。2.当ideal_network经过一个组合logic的时候,只有当所有的输入都具有ideal属性,并且至少有一半具有传播的属性,即不带-no_propagate,输出端才有ideal_net属性。3.在定义时钟的时候,默认是具有这个属性的,但是要注意的是,当时钟网络上具有多输入组合逻辑的时候,时钟的ideal_net属性是不会穿过这个组合逻辑的。比如一个2in1 mux,输出端就不具备ideal_net属性,延时就会计算进去。所以定义时钟的时候最好还是加上这条命令。

set_dont_touch_network用来对port,pin,clock来设置dont_touch_network的属性。所谓的dont_touch_network属性就是在优化的时候,不会对原有的器件进行替换。

2008年12月25日星期四

tcl在DC中的使用-----part2

1.如何查询当前design的registers占leaf cell的比重呢?
registers数目可以用all_registers来得到,下面为tcl脚本:
set leafcells [get_cells *]
set flops [all_registers]
set cnt_leaf [size_of_collection $leafcells]
set cnt_flops [size_of_collection $flops]
set precentage [expr 100.0 * $cnt_flops / $cnt_leaf]
unset flops

实际上all_registers可以用另一种方法得到:
get_cells * -filter "is_sequential == true",在filter中常用的操作符有 == =~ !~ defined() undefined()。

2 timing path的深入操作上面标出了timing path最常用的七个属性,注意不能用get_object_name来对某条timing path在操作,因为timing path没有name的属性。只有具有name属性的单个对象的集合才可以使用get_object_name或者get_attribute XXX full_name。所以get_timing_paths要结合get_attribute使用。另外需要注意的是使用get_attribute得到的属性也有可能是一个集合,糊涂了是把。看看下面的例子:
get_timing_paths有很多的option,基本上和report_timing的option是一样的。因此用起来很方便。

tcl在DC中的使用-----part1

1.计算target library中mux单元的个数(mux单元都是mx开头的形式)

proc mux_cnt{{lib_name typical.db}} {
redirect -variable libdata {report_lib $lib_name}
set mx_number [regexp -all mx $libdata]
echo "the count of mux in $lib_name is \t $mx_number\n"
}

说明:
redirect不仅可以将命令的输出送到文件中,也可以送到某个变量中,如果送到文件中,也可以用unix下glob -c mx $file来计算mx_number。
regexp不仅可以返回是否匹配的标志,也可以使用-all来返回匹配的个数。

2.计算一个timing group中TNS

proc rpt_TNV {} {
redirect -variable rptstring {report_constraint -all_violators -nosplit}
foreach line [split $rptstring \n] {
if {[string match *VIOLATED* $line]} {
incr TNV } else {
echo $line set TNV 0 }
}
}; # End proc

说明:
split函数可以用来将string分成list,然后使用foreach来遍历每个元素。

3.lsearch和string match的使用
lsearch有三个option,-exact,-glob,-regexp 后面紧跟这list,最后是patten。注意list和pattern的先后顺序,与glob命令和regexp是不一样的。返回的值是最先匹配到元素的indice值。可以结合lindex来使用,查看匹配的元素。
string match后面先跟着pattern,最后才是string。返回是否匹配的布尔值。

4.完善自定义proc的help功能。
使用define_proc_attribute来实现。
define_proc_attributes clean_log \
-info "Removing duplicating timing report" \
-command_group my_goup \
-define_args { {infile "log file to be cleaned" infile} {outfile "cleaned file" outfile}}

proc clean_log{infile outfile}{
set in_file_hd [open $infile r]
set out_file_hd [open $outfile w]
while {[gets $in_file_hd each_line] != -1} {
puts $out_file_hd $each_line}
close $in_file_hd
close $out_file_hd
}

说明:上面定义的proc有一个不足,就是infile和outfile位置都是固定的,不能颠倒,处于robust的考虑,可以采用clean_log -infile file_name -outfile file_name的方式就好了。可以使用parse_proc_arguments -args $args results,这样程序可以写成如下的形式:
proc clean_log {args} {
parse_proc_arguments -args $args results
set in_file_hd [open $results(-infile) r]
set out_file_hd [open $results(-outfile) w]
……
}
注意在使用这种不需要位置的参数,需要在defien_proc_attribute中来define_args。

5.关于collection的使用。
如果将collection赋给某个变量,比如下面的命令set allclock [all_clocks],然后试图在终端查看它,使用echo,你会得到一个_selxx的值,很郁闷把,DC在查看collection的时候,使用了两条专有的命令,一个是query_objects,一个是get_object_name,从名字上就可以看出来,query_objects可以看多具有多个对象的collection内容,而get_object_name只可以查看具有一个对象的collection内容。

2008年12月24日星期三

register retiming的逻辑综合

所谓的register retiming 指的是通过改变寄存器在组合逻辑的位置来达到优化时序和面积的优化技术。一般compile和compile_ultra里面的优化是通过布尔代数来优化组合逻辑,不会改变寄存器的位置。

register retiming有三个命令,optimize_registers,pipeline_registers,balance_registers。其中optimize_registers最常用,可以优化同步寄存器和异步寄存器位置来达到优化时序和面积的目的,而且默认情况下还执行一次增量编译。pipeline_registers主要是用来对纯组合逻辑按照指定的流水级数插入流水线。balance_registers只用来移动寄存器的位置来改善时序,而不会优化面积,也不会执行增量编译。

2008年12月22日星期一

复杂clock的综合约束总结

1.多clock的关系有三种,同步关系,异步关系和逻辑互斥关系。前两种很容易理解,关键是逻辑互斥关系(logic-exclusive)。这种时钟关系表示时钟之间没有逻辑上的timing path,最常见的例子就是mux结构的时钟。如下图:


对这种结构进行逻辑综合的时候,如何进行设置时钟?method :首先创建四个时钟,分别是ck1,ck2,ck3,ck4,由于时钟会穿过逻辑门进行分析,因此mux结构的输出并不需要定义时钟,老版本DC可能只会分析最近定义的一个时钟,DC2007则没有这个问题。如果想查看一下mux的输出管脚的时钟,可以用get_attribute [get_pins mux/Y] clocks来查看。然后就是设置false path的问题,除了ck1和ck3,ck2和ck4有逻辑上时钟路径需要分析外,其余均为逻辑互斥时钟,因此可以定义
set_clock_groups -logically_exclusive -group [get_clocks "clk1 clk3"] -group [get_clocks "clk2 clk4"]
来代替众多的set_false_path。

2.create_generated_clock中combinational选项的使用

该选项的意义有两个,一个是告诉DC,分频比为1,一个是告诉DC,在分析network latency的时候,只追溯组合逻辑。

3.时钟截断命令。

对于下面的电路:

clkin要求考虑到两个时钟,一个慢时钟,一个快时钟,在输入快时钟时,上半部分有效,在输入为慢时钟时,下半部分有效工作,对于这种电路,如何约束呢?(method:首先在clkin这个port上定义两个时钟,注意使用create_clock的add选项,然后针对每一个时钟设置input_delay。然后最重要的就是将某些时钟剔除,比如lsdin_reg只有在慢时钟才有效工作。那么就在在该寄存器的时钟输入端剔除快时钟,剔除的命令就是

set_clock_sense -stop_propagation -clock hclk [get_pins lsd*_reg/CP]set_clock_sense -stop_propagation -clock lclk [get_pins hsd*_reg/CP]

2008年12月19日星期五

the next two days plan

1.bist learning,especially mbist

2.linux study

全速测试(at speed test)

在工艺节点在130nm以下的时候,很多情形下的物理缺陷都是由于延时来引起的。因此在对这种类型的chip做dft的时候,需要建立一个新的故障模型,业内称之为延时故障模型(time delay model)。解决的方法就是全速测试,所谓的全速测试就是让芯片工作在自己高倍时钟频率上,这个频率往往是要高过ATE的时钟的。这样对扫描模型的建立就提出了新的要求。即至少要保证芯片的latch clock和capture clock为芯片内部的高倍时钟。synopsys对此种问题的解决方法就是OCC(on chip clocking)。DFT Compiler支持两种模式的带OCC的扫描链插入,一种是自身的设计已经带上OCC电路的,另一种是不带OCC电路的。
下面分别说说这两种插入的流程。
1.OCC的自动插入
  • 使能occ的插入,使用的命令是
set_dft_configuration -clock_controller enable

  • 定义时钟,包括参考时钟,ATE时钟,PLL产生的时钟。
参考时钟的定义:如果周期跟默认的测试周期相同,定义方法

set_dft_signal -view existing_dft -type MasterClock -port my_clock -timing {45 55}

set_dft_signal -view exsiting_dft -type refclock -port my_clock -period 100 -timing {45 55}

如果周期不同,就只需要定义refclock,不需要定义MasterClock

set_dft_signal -view exsiting_dft -type refclock -port my_clock -period 10 -timing {4 6}

ATE时钟的定义:

set_dft_signal -view exsiting_dft -type ScanClock -port ate_clock -timing {45 55}

set_dft_signal -view exsiting_dft -type Oscillator -port ate_clock

PLL产生时钟的定义:

set_dft_signal -view existing_dft -type Oscillator -hookup_pin pll/clk1

set_dft_signal -view existing_dft -type Oscillator -hookup_pin pll/clk2

  • 指定全局信号,包括pll_bypass,pll_reset,ScanEnble,TestMode

set_dft_signal -view spec -type pll_reset -port pll_rst

set_dft_signal -view spec -type pll_bypass -port pll_bp

set_dft_signal -view spec -type ScanEnable -port scan_en

set_dft_signal -view spec -type TestMode -port test_en

  • clock controller的设置

set_dft_clock_controller -cell_name u1 -design_name occ_clock_mux

-pllclocks [pll/clk1 pll/clk2] -ateclocks [ate_clock]

-cycles_per_clock 2


  • scan_configuration的设置

2.OCC已经存在

这种情况下由于OCC已经插入,因此命令set_dft_clock_controller在这里已经没有意义了,这里需要让DFT知道occ输出时钟信号的属性,使用的方法还是set_dft_signal。另外需要指定clock chains,使用set_scan_path来指定,将其complete化。另外如果使用到adaptive scan,注意test mode在两种模式下都必须指定啊。

2008年12月17日星期三

illinois扫描结构

一个芯片的测试成本主要受到三个因素的影响,第一个就是测试的时间,就是将所有的测试向量灌到芯片里面,并收集结果所花费的时间。第二个就是测试数据的数量,第三个就是测试的管脚。举一个IBM chip的例子,设计逻辑部分有7 百万个门,有25万个寄存器单元,采用full scan的结构,如下图:假设需要的测试向量为7000个,则移位寄存器需要消耗的测试时间为7000*250000=1.75G cycle。假设测试时钟周期是100M,则需要耗时17.5s。需要消耗的memory为1.75G bit。很庞大,是把。怎么解决呢,容易想到的就是将这个扫描链的长度减小,用多个扫描链来替代,结构如下图:
将这一个长的扫描链分解成1000个250个长度的扫描链,这样移位寄存器的load time就减少到以前的1/1000,但是付出的代价是测试管脚增加了太多,一方面芯片不可能提供这么多管脚做DFT,另外一般的ATE只有10到200个扫描信道,所以说上面的方案仍然需要改进。选取2500个寄存器做个一个扫描链的长度,这样就将扫描信道减小到100,就可以忍忍使用了。需要注意的是,这种并行的方法只是减少了数据的load的时间,数据量并没有减少。 能不能有一种方法能减少load time,同时又能减小pin和data volume的?illinois就是其中的一种方法。具体原理见下图:
上图的四个扫描链共享一个scan data输入,这样减小了pin的使用,但是这样会有问题,就是覆盖率的问题。见下图对于上面的与门,输入只会出现两种情况,一种就是000,一种就是111,不会出现其他的情况,这样就会减低故障覆盖率。这怎么办才好么?方法就是采用两种模式相结合的方式。下图:
下面的几个图是说明使用illinois扫描结构效果的示意图:














效果很好,但是有一个选择分组的问题,也就是说把哪些扫描链共享一个scan_in。分组的原则就是将对覆盖率的损害降到最低。

2008年12月16日星期二

DFT Compiler的学习------part8 tips and tricks

1.down-top的扫描链插入处理。

主要的考虑是在顶层直接处理会造成占用内存太大,容易溢出。采取的方法是层次化插入扫描链,先对底层的模块进行扫描链插入,插入完毕后,写出test model,并且释放内存。test model的形式有两种,一种是ddc形式,一种是ctl形式。ctl形式是可以查看内容的,是用ascii文件表示的。如果整个流程呢个都是galaxy流程的化,最好使用ddc的格式。释放内存remove_design就可以了。对底层模块都插入完毕后,在顶层首先是读入各个test model。使用的命令是read_ddc或者是read_test_model。注意这里read_ddc读入的不是底层模块的网表,而是test model。读入test model 之后,使用use_test_model -true [design]来指定,然后该干啥就干啥。

2008年12月15日星期一

DFT Compiler的学习------part7 DFTMAX

DFTMAX的核心就是adaptive scan技术。所谓的adaptive scan类似于边界扫描,不同的是在chip扫描信号和内部多个扫描链之间插入压缩和解压缩逻辑。目的就是为了减少测试的时间和测试的数据。

1.使能adaptive scan
在set_dft_configuration的选项里面有一个scan_compression,将其enable,就可以了。这样在使用insert_dft的时候,就会产生两种测试的模式,一种是scan compression模式,扫描单元由压缩单元进行驱动,一种是internal scan模式,扫描单元由外部信号进行驱动。

2.多种测试模式的支持。
上面提到在使用scan_compression的时候,会产生两种测试的模式。当然也可以自定义test mode。使用命令define_test_mode mode_label -usage mode_usage。mode_usage可以为scan或者为scan_compression。

3.如果设置扫描链的个数。
在scan的test mode下,可以使用set_scan_configuration -chain_count X来设置,在scan compression 的mode 下,可以使用set_scan_compression_configuration -minimum_compression x来设置(默认为10)。得到的chain的个数为chain_count*comp*1.2

4.test mode的信号设置
在使用adaptive scan的时候,需要插入一个test mode 信号,用来选择是压缩的模式还是基本的模式。在使用autofix的时候,也需要一个test mode,用来选择是否使能修复逻辑。这两个test mode不能共用一个port。

2008年12月12日星期五

DFT Compiler的学习-----part6 report和输出文件

1.preview_dft

功能:在做inser_dft之前查测试点的信息,扫描链的信息。根据这些信息来确定所加的dft 规格是否完备。

一般是在规则写完并进行dft_drc之后,用此命令查看信息。最常用的就是默认的不带任何option的preview_dft,下面是一个preview_dft的报告。


****************************************
Preview_dft report
For : 'Insert_dft' command
Design : clk
Version: X-2005.09-SP4
Date : Fri Dec 12 09:55:48 2008
****************************************
Number of chains: 1
Scan methodology: full_scan
Scan style: multiplexed_flip_flop
Clock domain: mix_clocks
Scan enable: scan_en (no hookup pin)
Scan chain '1' (data_in[0] --> data_out[0]) contains 31 cells

************ Test Point Plan Report ************
Total number of test points : 1
Number of Autofix test points: 1
Number of Wrapper test points: 0
Number of test modes : 1
Number of test point enables : 0
Number of data sources : 1
Number of data sinks : 0
**************************************************
Dft signals:
TestData: clk_in (no hookup pin)
TestMode: test_en (no hookup pin)

最常用的还有preview_dft show all和preview_dft -test_points all

2.insert_dft
功能:将非扫描的触发器用扫描的触发器替代,添加额外的逻辑来提高fc(需启动autofix),执行增量编译来修复timing和DRC错误。

3.dft_drc -coverage_estimate
功能:执行DRC检查和测试覆盖率的分析,在insert_dft命令之后执行。下面是一个报告。

In mode: Internal_scan...
Design has scan chains in this mode
Design is scan routed
Post-DFT DRC enabled
Information: Starting test design rule checking. (TEST-222)
Loading test protocol
...basic checks...
...basic sequential cell checks...
...checking vector rules...
...checking clock rules...
...checking scan chain rules...
...checking scan compression rules...
...checking X-state rules...
...checking tristate rules...
...extracting scan details...
-----------------------------------------------------------------
DRC Report
Total violations: 0
-----------------------------------------------------------------
Test Design rule checking did not find violations
-----------------------------------------------------------------
Sequential Cell Report
0 out of 31 sequential cells have violations
-----------------------------------------------------------------
SEQUENTIAL CELLS WITHOUT VIOLATIONS * 31 cells are valid scan cells

Information: Test design rule checking completed. (TEST-123)
Running test coverage estimation...
1394 faults were added to fault list.
ATPG performed for stuck fault model using internal pattern source.
----------------------------------------------------------
#patterns #faults #ATPG faults test process stored detect/active red/au/abort coverage CPU time
--------- ------------- ------------ -------- --------
Begin deterministic ATPG:
#uncollapsed_faults=1099,
abort_limit=10... 0 1098 1 0/0/0 99.35% 0.02 0 1 0 0/0/0 99.42% 0.03
Pattern Summary Report
-----------------------------------------------
#internal patterns 0
-----------------------------------------------
Uncollapsed Stuck Fault Summary Report
-----------------------------------------------
fault class code #faults
------------------------------ ---- ---------
Detected DT 1372 Possibly detected PT 0 Undetectable UD 14 ATPG untestable AU
8 Not detected ND 0
test coverage 99.42%
-----------------------------------------------
Information: The test coverage above may be inferior than the real test coverage with customized protocol and test simulation library.

4.report_scan_configuration
功能:报告scan的配置信息

****************************************
Report : Scan configuration
Design : clk
Version: X-2005.09-SP4
Date : Fri Dec 12 12:47:49 2008
****************************************
========================================
TEST MODE: all_dft
VIEW : Specification
========================================
Chain count: 1
Scan Style: Multiplexed flip-flop
Maximum scan chain length: Undefined
Physical Partitioning: Horizontal
Replace: True
Preserve multibit segments: True
Clock mixing: Mix clocks
Internal clocks: none
Add lockup: TrueLockup
type: latchInsert
terminal lockup: False
Create dedicated scan out ports: False
Shared scan in: 0
Bidirectional mode: No bidirectional type
Minimize Hold Time Violations: False
Maximum Addtional Wire Length (%): Undefined
Test Clocks by System Clocks: False
Hierarchical Isolation: False
Multiple Scan Enable: Disable
Pipeline Scan Enable: Disable
Voltage Mixing: False

5.report_dft_signal
功能:报告由set_dft_signal设置的内容项,可以分成-view spec和-view existing_dft分着报

6.report_scan_path
功能:报告由set_scan_path指定的path和insert_dft插入的scan path。
选项:-view当指定spec的时候,报告set_scan_path指定的路径,当指定为existing_dft的时候,报告由insert_dft插入的scan path.
-chain指定报告的具体chain,如要报告所有的chain,使用all。
-cell报告指定chain的cell。

总结:

#write out scan reports

report_scan_configuration > reports/scan_config

report_dft_signal -view existing_dft > reports/dft_signals

report_scan_path -view existing_dft -chain all > reports/scan_chains

report_scan_path -view existing_dft -cell all > reports/scan_cells



#write out netlist and spf file for Tetramax

change_names -rules verilog -hier

set test_stil_netlist_format verilog

write -format ddc -hierarchy -output mapped_scan/RISC_CORE.ddc

write -f verilog -h -o tmax/RISC_CORE_SCAN.v

write_test_protocol -o tmax/RISC_CORE_SCAN.spf

2008年12月11日星期四

DFT Compiler的学习-----part5 Autofix的使用

Autofix可以自动修正一些test DRC的错误,比如:不可控的时钟,不可控的异步置位和复位信号,以及三态和双向信号。举个例子,比如一个寄存器的时钟输入是不可控的,如果启动了autofix的功能,则会在时钟输入端添加一个mux,由testMode信号来控制。需要注意的是这里的testMode信号和ScanEnable信号是不一样的。ScanEnable信号是控制扫描链数据的移动和抓取的。而testMode信号必须在整个测试周期内都必须有效。

如何使用autofix呢?首先需要时能test point的autofix行为,具体命令是set_dft_configuration。注意与set_scan_configuration的区别。前者是对test point进行配置的,而后者是对扫描链进行配置的。比如想启动clock的autuofix的功能,就使用set_dft_configuration -fix_clock enable。其次是指定test point的信号。使用set_dft_signal -type来指定,这里test point的类型有两种,一种是TestData,比如clock信号,异步置位复位信号,一种是TestMode,用来对这些TestData信号进行控制。最后就是指定autofix的行为。使用的命令是set_autofix_configuration和set_autofix_element。比如
set_autofix_configuration -type clock -test_data clk -control_signal my_test_mode

这个单元涉及到的主要命令有set_dft_configuration,set_autofix_configuration,set_autofix_element。下面着重对他们的使用方法做说明。

1.set_dft_configuration

用途:对test point进行配置。
选项:-fix_clock,-fix_set,-fix_reset,-fix_bus,-fix_bidirectional,-fix_xpropagation都是用来使能或者禁止autofix功能的。

2.set_autofix_configuration

用途:对autofix的行为进行配置。
选项:-type指定fix的类型,有clock,set,reset,x_propagation,internal_bus,external_bus,bidirectional,每次只能指定一个类型。
-control_signal 指定test_control的信号,这个信号应该预先定义的TestMode或者ScanEnable信号,如果没有指定该选项,则autofix会被任何一个TestMode信号来控制,如果没有预先没有定义该信号,则autofix会自己创建一个。
-test_data指定test_data信号。比如一个clk port,如果要使用autofix,除了要将其配置成具有clocktype之外,还需要配置成test_data,如果没有配置成test_data,将会自己寻找。
-method指定autofix的方法。对不同的type有不同的默认方法。比如对异步set和reset,使用mux,对内部总线enable_one,对外部总线使用disable_all,对双向信号使用input。
-fix_data使能时则对时钟信号作为寄存器data输入的情况进行自动修复。
-include_element -exclude_element指定autofix适用的design。

3.set_autofix_element
用途:对某个具体的element实施autofix的配置,选项跟set_autofix_configuration差不多。

2008年12月9日星期二

DFT Compiler的学习-----part4 构建test design

本学习单元为DFT compiler的重点内容。

准备好设计之后,就可以考虑构建test design。

1.DFT规格的指定。

1.1 扫描链的构建

利用set_scan_configuration来对全局的scan chain进行配置。比如扫描链的类型,长度,个数等

等信息。利用set_dft_signal来对指定test port管脚。这些都是全局性的配置。

除了对全局性的scan chain进行配置之外,也可以对某个特定的scan path进行配置。

利用set_scan_path来对scan path进行配置,这条命令可以对scan chain命名,指定扫描链的长度

等等,功能很强大。option很多,建议看看man文档,这里挑几个常用的来说明。

<1> exact_length:指定某个扫描链的长度。例如:

set_scan_path chain_name1 -exact_length 10

如果要对整个扫描链设置长度。使用set_scan_configuration -exact_length来设置。

<2>complete trulefalse :指定当前的扫描链是否完备,如果完备,则insert_dft不会添加新的

scan cell来balance 扫描链,否则就可以添加。

如何控制routing order呢?可以通过set_scan_path的-ordering_list选项来指定顺序。

一般扫描单元有两个输出,一个是scan_out,一个是其反相scan_out_inverted,DFT会根据时序

选择一个好的,如果要改变默认的行为,可以将变量test_disable_find_best_scan_out置为

true。

如何对扫描链进行重新连线呢?一般DFT为了优化设计,会进行下面的处理:会对扫描单元做单

独的优化来满足时序等信息,如果插入的扫描单元不满足test DRC,会在insert_dft的时候,将其

还原成原先的非扫描结构的形式。

如果不考虑优化来连接扫描链呢?这又叫做快速扫描链综合,比如在top层做扫描链,底层的扫描

链都已经优化好了,在顶层只需要将其连接起来就可以了。又比如不想在logic综合中优化,而是

放在后面的物理设计中优化,也可以先直接将扫描链先连接起来。可以使用命令

set_scan_replacement -none_scan none_scan_cell_list -multiplexed_flip_flop scan_cell。

注意上面的命令的option必须成对出现,而且scan_cell只能有一个。

1.2 扫描信号的构建

如何抑制某些时序单元的scan替代呢?使用set_scan_element -false cell_list来实现。

如何对三态信号进行处理呢?为了防止出现bus竞争和bus漂移,DFT会在scan_shift的时候保证

只有一个drive。DFT会自动判断内部的三态逻辑是否满足一个drive有效的要求,如果不满足,

会自动在内部添加逻辑来满足要求。如果设计的逻辑本身已经加入了此种逻辑,则可以使用命令

让DFT不用加入该disable逻辑。使用的命令是set_dft_configuration -fix_bus disable。如果采用

bottom-up的方式来插入扫描链,需要注意在底层可以将fix_bus disable掉,但顶层需要将其

enable。

如何对双向端口进行处理呢?同上面处理三态的方法一样,如果设计本身就包含处理的模块,那

么可以使用set_dft_configuration -fix_bidirectional false。同理,DFT也提供了对特定的双向端

口处理和全局的双向端口处理的命令。对特定的双向端口处理,可以使用set_auto_element的命

令。

如何控制lock-up element的插入?如果相邻的时序cell是由不同的时钟来驱动的,那么DFT会默

认在cell之间插入一个lock-up element。可以通过set_scan_configuration -add_lockup truelfalse

来指定,也可以通过选项 -lockup_type latchflip_flop来选择插入的lock-up element的类型。

1.3 测试时钟的构建

需要特别注意的是多时钟的构建,DFT在默认的时候是为每个时钟域创建一个scan chain,当然可

以使用set_scan_configuration -clock_mixing mixing_clocks就允许多个时钟域的信号位于同一个

扫描链上。

还有就是内部时钟。默认情况下DFT在处理的时候会将所有内部时钟都由顶层定义的test clock来

驱动。可以通过设置set_scan_configuration的-internal_clocks multi选项来将其当作不同的时

钟,这样如果没有mixing的化,将会创建出两条扫描链,如果mixing的化,将会加入lock-up单

元。

2.post_scan DRC的检查。

DFT Compiler的学习------part3 pre-scan的test DRC

关于pre-scan的test DRC问题
1.test DRC的流程
很简单,只要注意到只有在创建test_protocol之后才可能test DRC检查。

2.test DRC后时序单元的分类
分为两类,一类是有违例的,一类是没有违例的,需要对违例的时序单元进行违例排除。

3.模型的违例
黑盒违例:在链接库中找不到该cell。需要查看链接库是不是没有给全。DFTC会将黑盒看成一个时序单元。latch违例:DFTC找不到带扫描链的latch,就会把latch当成黑盒来处理。

4.设置时序的属性
两种strobe协议:一种是strobe_after_clock,一种是strobe_before_clock。默认是strobe_after_clock的。几个时序属性:test_default_period:定义测试周期,如果测试仪和被测芯片允许,可以设更小的值,默认是100ns。test_default_delay:定义输入延时,缺省值为5。test_default_bidir_delay:定义双向端口的时序。test_default_strobe:定义探测点的位置test_default_strobe_width:定义探测的宽度,默认为0。

5.创建测试协议
使用的命令就是create_test_protocol的方法。

6.屏蔽DRC错误
DRC错误按照严重程度可以分为:error,warning,ignore。可以使用set_dft_drc_rules来对某种错误进行降低或者升级处理,使用的方法就是set_dft_drc_rules -error XXX -cells YYY如果要恢复到默认的等级,可以使用reset_dft_drc_rules。如果要查看DRC错误的等级,可以使用report_dft_drc_rules。

DFT Compiler的学习-----part2 scan replacement

今天着重分析下扫描单元替换(scan replacement)的内容。所谓scan replacement,顾名思意就是在设计中用扫描单元替代非扫描单元。如果设计是以RTL形式给出的,则在RTL综合成门级网表的过程中自动插入扫描单元。如果设计是以门级网表给出来的,则专门做一次扫描替换。

流程:1.选择扫描链的策略---> 2.test DRC检查---> 3.带扫描链的综合

在做扫描链之前,还需要考虑下面问题:
1 .根据目前设计的格式,选择插入扫描链的流程。
如果是RTL或者未优化的门级设计,则采用test-ready Compile,如果是优化的门级设计,采用constraint-optimized 插入方式。test-ready Compile包括逻辑优化和扫描链插入。采用的命令就是 compile -scan。优点就是流程简单,能够得到更好时序和面积。注意test-ready Compile只是将单元替代,并没有将扫描单元连接起来。

2.找出扫描替代的障碍。
障碍有很多种啊,比如本身工艺库就不提供扫描单元,或者某些寄存器找不到相对应的扫描单元,或者设计本身有dont_touch属性或者scan_element属性为false等等。
(set_scan_element truefalse [get_cells ADA])
扫描链类型本身有带mux的寄存器,LSSD,clocked SD。具体选择那一个要考虑到工艺库和本身的设计,一般采用带mux的寄存器。有两种方式来设置扫描链的类型,一种就是设计test_default_scan_style变量。设置的方法跟tcl设置变量的方法一样,默认的是multiplexed_flip_flop。另一种设置的方式是set_scan_configuration -style来设置。
(tips:如何查看typical库中是否有扫描单元呢。
get_pins typical/*/* -filter "signal_type==test_scan_in")

在插入扫描链的过程中,可以指定扫描单元。使用的命令是set_scan_register_type。选项有- exact和-type,如果使用了exact选项,则在后面的优化过程中(compile -increment)仍然会保留只使用type列表中的扫描单元。(注意DC命令中类似的命令就是set_register_type)。

下面说说constraint-optimized的扫描链插入流程。包括插入扫描链,根据约束优化扫描逻辑,修正DRC错误。对于这种流程,输入可以是优化后的门级网表,可以不包含扫描单元,也可以包含扫描单元。这里需要用到的命令有:
set_drc_configuration
preview_dft.
这些命令以后再深入学习把。


2008年12月8日星期一

DFT Compiler的学习------part1

一、定义测试协议
1.set_dft_signal:
功能:用来指定输入输出端口为DFT信号。
选项:
view ---有两种类型,一种是existing_dft,一种是spec。所谓existing_dft,就是告诉工具,这个port已经被用作某种类型的DFT信号了,此时扫描链已经插入了。所谓spec,就是告诉工具,下面指定的port将被用做某种类型的DFT信号。
type---用于指定DFT信号的类型,包括:Reset,Constant,TestMode,TestData,ScanDataIn,ScanDataOut,ScanMasterClock,ScanSlaveClock等。
port---用于指定规则适用的端口。
active_state---用于指定Reset,ScanEnable,TestMode,Constant是高电平有效,还是低电平有效。
timing---用于指定ScanClock的波形。
例子:
set_dft_signal -view existing_dft -type ScanClock -timing {45 55} -port Clk
set_dft_signal -view existing_dft -type Reset -active_state 0 -port Reset

2. create_test_protocol:
功能:根据当前设计指定的规则,比如set_dft_signal,set_scan_path,set_scan_configuration。来创建测试协议。
选项:infer_clock,infer_asynth。如果先前没有对clock和异步信号进行指定,可以由DFT Compiler自己去判断哪个是clock,哪个是异步信号。(不推荐)。

创建完测试协议后,可以通过write_test_protocol -output XXX.SPF命令将其输出到文件,该文件的格式是SPIL格式。

二、DFT的设计规则检查
dft_drc:对先前指定的规则检查test DRC

三、对RTL test DRC的检查
需要理解各种violation,主要的violation有三种。
第一种是阻止扫描链的插入违例。主要的原因有:时钟不可控,latch在时钟周期开始的时候就使能,异步控制信号处于有效的状态。
第二种是阻止采样数据的违例。主要的原因有:时钟信号作为寄存器的数据输入端,黑盒产生的信号控制时钟端或者异步控制端,源寄存器在目的寄存器获取数据之前又采样了新的数据,三态总线冲突。
第三种就是影响fault覆盖率的违例。比如时钟作为数据,多个时钟驱动一个寄存器,以及黑盒。

2008年12月5日星期五

2008年12月2日星期二

AEC的硬件实现1---自适应滤波算法的实现

最近工作比较轻松,闲暇之余研究下echo canceller的算法和硬件实现。 算法的核心就是基于NLMS算法的自适应滤波器。如图所示:



所谓自适应滤波器,就是滤波系数随着输入信号特征的变化而变化。在实现的时候采用512阶FIR的结构。由于阶数较多,采用DA算法会造成查找表的开销比较大,因此采用类似DSP的架构,将运算单元和数据单元分离的方法来实现。实现的时候需要两个512*16bit大小的RAM,一个用来对输入数据进行寄存,一个用来保存系数,完成一个乘加运算需要时钟周期三个,一个周期用来取数,一个周期用来完成乘法运算,一个周期用来完成加法运算。使用流水线的方法来减少周期消耗。 流水线如图所示:








set_max_delay的使用总结

DC在逻辑综合的时候,对于时序约束,默认都是基于单cycle的方法。set_max_delay可以对时序路径的延时设定一个特定的值进行直观的约束,这个值可以大于一个cycle,所以说set_max_delay设定的路径就属于一个时序例外(timing exception),对于这类路径可以通过report_timing_requirement来报告出来。在使用set_max_delay的时候,尤其需要注意的是约束的对象一定要是一条合法的时序路径,所谓合法的路径,就是startpoint和endpoint都必须合法,如果约束的对象只是一条合法时序路径的一个部分,那么将会创建出新的startpoint和endpoint,由于这些新的startpoint和endpoint都没有其他的约束路径,因此会忽略该部分路径,导致分析的错误。