Mentor-dft 学习笔记 day9-Internal Scan and Test Circuitry Insertion

发布于:2022-10-18 ⋅ 阅读:(623) ⋅ 点赞:(0)
Internal Scan and Test Circuitry Insertion
接下来的部分主要讲的是关于插入,分为以下模块进行:

 

Introduction to Tessent Scan

Tessent Scan使用极其灵活,有多种选项和功能 。使用Tessent Scan,可以分析设计,根据设计和用户约束分配新的扫描链,并在对设计执行实际扫描插入之前分析扫描链的分布和平衡。Tessent Scan的另一个重要功能是多模式扫描插入功能。对于多模式,可以指定任意数量的扫描模式或扫描配置。

图5-1显示了合成工具外的网表如何与Tessent Scan一起使用。网表可以替换扫描单元而不缝合,或者只替换非扫描单元,而非扫描单元可以在执行扫描缝合时替换为扫描单元。设计规则检查是从系统模式设置转换为分析时运行的S规则。仅当在要实现分层DFT的分层区域上执行扫描插入时,才需要标识包装单元,其中用于测试此块/模块逻辑的测试模式可以独立运行和/或计划从下一级别重新定位。如果使用分层测试应用程序,则需要在指定扫描配置之前识别包装单元。这在包裹型芯的扫描插入部分中进行了描述。可以提供输入以指定所需的扫描配置,以便在插入和缝合扫描链之前对其进行分析。可以更改扫描配置规范,以查看扫描链在通过执行分析缝合后将如何结束。插入扫描链后,会写出网表和TCD(Tessent Core Description),其中包含扫描更改如何缝合的详细信息

Features of Tessent Scan

这些是Tessent Scan的一些功能:

1.支持多模式扫描插入,所有模式的扫描链长度均为最佳。

2.它允许将扫描分析阶段与扫描链的实际缝合分开,并在缝合之前提供扫描链分布。

3.它支持扫描数据模型的自我检查,并允许指定扫描拼接期间扫描单元的分组方式

Tessent Scan Inputs and Outputs
在扫描插入过程,会产生多输入和多输出

Tessent Scan使用以下输入:

Design (netlist)-需要提供Verilog门级网络列表作为输入。

Circuit Setup (or Dofile or Tcl file) -这是一组命令,提供有关电路和如何插入测试结构的工具信息。您可以在工具任务中以交互方式发出这些命令,或将其放置在dofile或Tcl文件中。

Library -Tessent Cell库包含设计使用的所有单元的描述。该库还包括工具用于将非扫描单元映射到扫描单元以及为添加的测试逻辑电路选择组件的信息。

Input TCD File-如果有在*中描述的预先存在的扫描段。tcd_scan文件,然后需要提供它们作为扫描插入的输入。你可以阅读使用setdesignsources命令。tcd_scan文件的完整语法可在《Tessent Shell参考手册》的扫描部分找到。此外,如果预先存在扫描段的CTL模型,可以使用stil2mgc转换这些模型,然后读入。

Test Procedure File-该文件定义了通过定义的扫描链移动扫描数据的刺激。此输入仅在包含预先存在的扫描电路或需要初始化测试模式(测试设置)的设计上是必需的。

Tessent Scan生成以下输出:

Design (Netlist) -该网络列表包含使用插入的测试结构修改的原始设计。输出网络列表格式为门级Verilog

TCD (Tessent Core Description) -此文件包含扫描插入期间指定的所有扫描模式。ATPG工具使用此文件生成模式。如果从以前的插入过程或较低级别的核心读取任何.tcd文件,则扫描模式将附加到输入*.tcd文件,并写入tsdb_outdir目录

Invoking Tessent Scan
SETUP> set_context dft -scan
举个例子
目录-进入-读表-读库-加时钟-跑drc
# SETUP
# Set the context
>set_context dft -scan
# Read the verilog
>read_verilog ../design/cpu.v
# Read the library
>read_cell_library ../library/adk.tcelllib
>read_cell_library ../library/ram.lib
>set_current_design cpu
# Add clocks in the design
>add_clock 0 clk1
>add_clock 0 clk2
>add_clock 0 clk3
>add_clock 0 clk4
>add_clock 0 ramclk
//RUN DRC
>set_system_mode analysis
# Specify constraints to stitch up scan chains
>set_scan_insertion_options -chain_count 100
>analyze_scan_chains
>report_scan_chains
>insert_test_logic -write_in_tsdb On
>report_scan_chains
Tool Terminology and Concepts
Scan Element
简单来说,扫描元素可以是称为leaf单元的库单元(最低级别模型),也可以是子链/段。库单元/leaf单元可以是单位(例如触发器)或多位扫描元素。

 

 

 图5-6是内存模块内描述的带有子链/段的扫描元件的示例。可以使用输入tcd_scan文件或add_scan_segments命令描述该扫描元素。

 

 

扫描元素对象类型在《Tessent Shell参考手册》的扫描数据模型一节中进行了描述。它可以在设计中进行反思,并且属性友好。这有助于描述所需的扫描配置。大多数扫描元素叶是根据DRC结果填充的,但有些是通过计划插入某些类型的模块(如专用包装单元)来推断的;这些扫描元素被认为是“虚拟的”,因为它们还不存在,但为了分析和规划目的,假设存在。

Scan Chain Family
scan_chain_family是一个智能容器,用于控制特定扫描元素总体中新扫描链的分配。 命令create_scan_chain_family用于生成新的链族。
Examples
Example 1
以下示例显示如何使用create_scan_chain_family命令创建新扫描链族。为时钟域clk1中的所有scan_elements创建名为family_clk1的scan_chain_family。为下面的时钟域clk 2和clk3创建名为家族_clk23的scan_chain_faily。该示例还显示了如何使用get_scan_chain_families报告创建的两个新scan_chain_families。
>create_scan_chain_family family_clk1 -include_elements \
[get_scan_element -filter "clock_domain == clk1”]
>create_scan_chain_family family_clk23 -include_elements \
[get_scan_element -filter "clock_domain == clk2 || clock_domain == clk3"]
>get_scan_chain_families
Example 2

命令create_scan_chain_family使更高级的用户能够控制如何将特定扫描元素子填充分配到链中。例如,如果只想对外部链端口使用特殊命名,可以通过为外部扫描元素的子总体创建扫描链族来实现,如下所示:

> analyze_wrapper_cells
> create_scan_chain_family ext_chains \
-si_port_format { ext_si[%d]} \
-so_port_format { ext_so[%d]} \
-include_elements [get_scan_elements -class wrapper]
在分配扫描链时,这些scan_chain_family对象比scan_element对象构成更大、更复杂的构建块。
Scan Mode
分层扫描插入允许您指定任意数量的扫描模式。 模式通常适用于整个扫描元素填充或大型子集(例如包装元素),并通过直接包含scan_element对象和/或scan_chain_family对象填充。扫描数据中描述了扫描模式内置属性 Tessent Shell参考手册的型号部分。 每个扫描模式的填充是通过包括scan_element和scan_chain_family对象来定义的。如果没有明确添加至少一个扫描模式,该工具将推断出一个默认模式,其中包括每个scan_element和scan_chain_family对象(如果存在)。 扫描模式定义的隐含含义是包含特定于该模式的扫描元素填充。模式定义还允许您使用一些特定于模式要求的选项覆盖常规扫描插入选项。Scan_mode对象选择性地包括Scan_element 和scanchain_family对象创建最佳链分配构建块。
Examples
Example 1
指定创建扫描链不超过100条 为mode1
> add_scan_mode mode1 -chain_count 100
Example 2
最大长度300
> add_scan_mode mode2 -chain_length 300
Example 3
示例3显示了如何在OCC中查找子链,并与其余扫描元素保持在单独的扫描链中:
1. Using the –single_cluster_chains option:
>set_attribute_value [get_scan_elements -below_instances *_occ_* ] \
-name cluster_name -value is_occ
>set edt_instance [get_instances -of_icl_instances \
[get_icl_instances -filter tessent_instrument_type==mentor::edt]]
>add_scan_mode edt -single_cluster_chains on -edt_instance $edt_instance
2. Using chain families:
>register_attribute -name is_occ -obj_type scan_element -value_type boolean
>set_attribute_value [get_scan_elements -below_instances *_occ_* ] -name is_occ
>create_scan_chain_family occ_chain -include_elements \
[get_scan_elements -filter is_occ ]
>create_scan_chain_family not_occ -include_elements \
[get_scan_elements -filter !is_occ ]
>set edt_instance [get_instances -of_icl_instances \
[get_icl_instances -filter tessent_instrument_type==mentor::edt]]
>add_scan_mode edt -include_chain_families {occ_chain not_occ} \
-edt_instance $edt_instance
Unwrapped Cores Versus Wrapped Cores

未包装的core是不包含包装cell的物理块。包裹core是包含包裹单元的物理块。包装core用于分层设计的RTL和扫描DFT插入流。对于未包装的core,扫描插入作为core单个视图执行。对于包裹的core,对core的两个视图执行扫描插入:内部模式和外部模式。在扫描插入过程中,包装单元被缝合成单独的扫描链,称为包装链。包装链内的逻辑称为核心的内部模式,而包装链外的逻辑称之为核心的外部模式。下图显示了一个未包装的core和一个已包装的core。

包装单元可以是专用单元类型,也可以是具有功能性触发器的共享包装单元类型。如果生成的ATPG模式要在核心实例化的下一个父级重新定位,请使用包装的核心。当在下一个父级组合或分组多个包裹核心以生成ATPG模式时,包裹核心也是必要的。如果不打算重新定位ATPG模式,那么不包装核心就足够了。

Pre-Existing Scan Segments
扫描段是存在于较低级别/子模块内的扫描链,扫描段的未连接扫描输入和扫描输出位于较低级别或子模块的边界。在analyze_scan_chains过程中,预先存在的扫描段与其他扫描元素连接,以形成新的扫描链。 必须为每个预先存在的扫描段指定扫描输入、scan_output和scan_enable引脚。除了通过连接scan_In和scan_out将段缝合成链外,该工具还将scan_enable端口连接到适当的信号,具体取决于 缝合到的扫描链的类型。如果存在到端口的现有连接,则将按照上述方式删除并替换该连接。
1. Using tcd_scan:

如果设计中有扫描段,则使用子模块的输入tcd_scan文件描述这些扫描段。输入tcd_scan文件的完整语法为如《Tessent Shell参考手册》的扫描部分所述。此方法独立于dofile,只需要在设计时读入tcd_scan文件。这对于带有预先存在的扫描段的IP或具有内置旁路扫描链的内存非常有效。

下面是读取tcd file

>set_context dft -scan -hierarchical_scan_insertion
>read_cell_library ../library/adk.tcell_library
>read_verilog ../from_synthesis/piccpu.v
>set_design_sources -format tcd_scan -Y ../for_sub_modules -extensions tcd_scan
tcd文件的例子:
Core(display_header_sync__10) {
Scan {
allow_internal_pins : 1;
is_hard_module : 1;
internal_scan_only : 0;
Mode(mode1) {
type : unwrapped;
traceable : 1;
ScanChain {
length : 8;
scan_in_clock : ~cmp_gclk;
scan_out_clock : cmp_rclk;
scan_in_port : ts_si[0];
scan_out_port : ts_so[0];
}
ScanEn(scan_en) {
active_polarity : all_ones;
}
Clock(cmp_gclk) {
off_state : 1'b0;
}
Clock(cmp_rclk) {
off_state : 1'b0;
} } } }
2. Using add_scan_segments:

可以使用add_scan_segments命令描述设计中存在的扫描段。在存在预先存在扫描段的子模块的每个设计中,都需要使用add_scan_segments命令。需要提供加载/卸载testproc文件,以帮助工具跟踪这些子链。

例如:

>dofile trace.testproc
>add_scan_segments mychain1 -length 8 -on_module display_header_sync__10 \
-si_connections ts_si[0] -so_connections ts_so[0] \
-clock_pins {cmp_gclk cmp_rclk} -clock_update_edges {trailing leading} \
-scan_enable_pins scan_en -scan_enable_inversion false
Pre-Existing Scan Chains
如果有预先存在的扫描链已经连接到需要执行扫描插入的模块边界,那么如果扫描前网络列表中已经存在EDT IP,则需要将其连接到EDT IP。 如果预先存在的扫描链未连接到EDT IP,则预先存在的搜索链将以add_scan_mode命令指定的所有扫描模式存在,并且即使在EDT模式下也将保持为未压缩的扫描链。预先存在的扫描链不会自动连接到EDT IP。 如果设计中存在预先存在的扫描链,并且您决定将其连接到EDT IP,请确保在EDT IP内为这些预先存在的扫链建立旁路,以便与旁路一起包括(多链旁路和/或单链旁路)。 一旦预先存在的扫描链连接到EDT IP,需要使用add_scan_chains命令声明这些链,并且需要一个带有加载/卸载和移位程序的测试程序文件。如果需要将设计设置为要跟踪的扫描链的特定状态,那么还需要一个test_setup过程。

以下是连接到EDT IP后如何指定预先存在的扫描链的示例:

>add_scan_group grp1 chain_trace.testproc
>add_scan_chains -internal my_chain0 grp1 |
corea_gate1_tessent_edt_c1_inst/edt_scan_in[0] \
corea_gate1_tessent_edt_c1_inst/edt_scan_out[0]
>add_scan_chains -internal my_chain1 grp1 \
corea_gate1_tessent_edt_c1_inst/edt_scan_in[1] \
corea_gate1_tessent_edt_c1_inst/edt_scan_out[1]

网站公告

今日签到

点亮在社区的每一天
去签到