------ 从 Core Wrapper 概念到 DC/Tessent 实操流程
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
在大规模 SoC 设计中,将整个芯片作为一个单一整体进行 Scan 测试既不现实也不高效。通常的做法是将设计划分为多个 block/core/IP,分别完成 Scan Insertion 和 ATPG。但这带来一个关键问题:各 IP 之间的边界逻辑(即 glue logic)如何被测试到?答案就是------Wrapper Cell。
本文将从 Wrapper 的基本概念出发,深入讲解 Core Wrapper 的工作原理、Intest 与 Extest 测试模式的区别,以及在 DC 和 Tessent 中如何配置和插入 Wrapper Cell。
一、Core Wrapper 基本概念
1.1 为什么需要 Wrapper?
在层次化设计中,各个 Core/IP 各自完成了内部的 Scan Insertion,但 Core 与 Core 之间的边界逻辑却往往被忽略。这些"无人管"的区域恰恰可能是缺陷的重灾区。Wrapper Cell 的核心目的就是:
• 在 Core level 完成 Scan Insertion 的基础上,对 Core 与 Core 之间、Core 与 Top Level 之间的边界进行测试
• 将 Core 内部逻辑与外部隔离,实现独立测试
• 通过 Wrapper Chain 提供边界信号的控制能力和观测能力

图 1:Test Wrapper 的核心目的 ------ 将设计划分为多个 Core,通过 Wrapper 测试边界逻辑
1.2 Input/Output Wrapper Chain
Wrapper Cell 根据其功能分为 Input Wrapper Chain 和 Output Wrapper Chain,它们在测试中扮演着不同的角色:

图 2:Input/Output Wrapper Chain 结构示意
• 控制 + 观测: Input Wrapper Chain:与 Core 的 input port 对应的 wrapper cell 串联而成。在 Intest 模式下用于控制,在 Extest 模式下提供观测性。
• 观测 + 控制: Output Wrapper Chain:与 Core 的 output port 对应的 wrapper cell 串联而成。在 Intest 模式下用于观测,在 Extest 模式下用于控制。
|---------------------------------------------------------------------------------------------------------------------------------------------|
| �� 重要区分 Input/Output Wrapper Chain 是分开的,它们与 Core 内部的普通 Scan Chain(Core Chain)是不同的概念。Wrapper Chain 专门用于边界测试,而 Core Chain 用于 Core 内部逻辑测试。 |
1.3 Share Wrapper 与 Dedicated Wrapper
Wrapper Cell 有两种实现方式,它们在面积开销和功能等效性上有着显著差异:

图 3:Share Wrapper ------ 复用设计中已有的寄存器

图 4:Dedicated Wrapper ------ 工具额外插入的新寄存器
|-------------------|----------------------|----------|----------|
| 类型 | 定义 | 面积开销 | 数据路径 |
| Share Wrapper | 复用设计中已有的与 I/O 关联的寄存器 | 无额外开销 | 保持原始功能路径 |
| Dedicated Wrapper | 工具新增的专用 wrapper cell | 有额外面积开销 | 为专用数据路径 |
工具会根据用户指定的 Reuse Threshold 来决定使用哪种类型:只有在追踪到的组合逻辑数量低于 Threshold 时,才会使用 Share Wrapper;否则将插入 Dedicated Wrapper。

图 5:Share/Dedicated Wrapper 的选择策略 ------ 基于 Reuse Threshold
1.4 Shifting 与 Holding Wrapper Cell
在 Tessent 中,Wrapper Cell 还可以根据行为模式进一步分为两种:

图 6:Shifting vs Holding Wrapper Cell 对比
• Shifting Wrapper Cell: 每个 capture 周期都会将数据从前一级传递到当前级,适用于边界数据需要实时更新的场景。
• Holding Wrapper Cell: 在 capture 时保持当前数据不变,优化 timing,通过 set_wrapper_analysis_options -capture_window_behavior hold 设置。
|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| �� 本节小结 Wrapper Cell 是 Core 边界测试的基础设施。它分为 Input 和 Output 两种 Chain,实现方式包括 Share Wrapper(零额外面积)和 Dedicated Wrapper(额外面积开销),工具通过 Reuse Threshold 和 Depth Threshold 进行智能选择。 |
二、Intest 与 Extest 测试模式
Wrapper 支持两种测试模式,它们测试的范围和使用的 Chain 截然不同。理解这两种模式的区别,是掌握 Wrapper 测试的关键。
2.1 Intest Mode ------ 测试 Core 内部
Intest 模式用于对 Core 内部逻辑进行测试。在这种模式下,Wrapper Chain 与 Core Chain 协同工作:

图 7:Intest Mode 原理 ------ Input Wrapper 控制,Output Wrapper 观测
• 控制端: Input Wrapper Chain 作为"信号发生器",通过 shift in 数据来控制 Core 内部与 input port 相关的逻辑
• 观测端: Output Wrapper Chain 作为"响应观测器",将 Core 内部输出信号 capture 后 shift out
• 涉及 Chain: 同时使用 wrapper chain 和 core chain
Intest Mode 数据路径

图 8:Intest Mode 数据路径示意

图 9:Intest 模式下 Shift 与 Capture 时的数据路径差异
• Shift 阶段: 所有 Scan Chain(包括 wrapper chain 和 core chain)通过 shift path 进行数据传输。
• Capture 阶段: Core Chain 和 Output Wrapper Chain 通过 function path 进行数据传输(即捕捉实际逻辑值);而 Input Wrapper Chain 仍然保持 shift path 传输数据(因为它的责任是提供控制信号)。
|-------------------------------------------------------------------------------------------------|
| �� 核心理解 Intest 模式的核心思想是:用 Wrapper Chain "包裹"住 Core 的输入输出,使得 ATPG 可以像测试一个封闭模块一样测试 Core 内部逻辑。 |
2.2 Extest Mode ------ 测试 Core 边界
Extest 模式与 Intest 恰好相反,它专门测试 Core 边界与外部交互的逻辑:

图 10:Extest Mode 原理 ------ 仅使用 Wrapper Chain
• 观测端: Input Wrapper Chain 提供观测性,捕捉来自外部的边界信号
• 控制端: Output Wrapper Chain 用于控制,向外部发送测试激励
• 涉及 Chain: 仅使用 wrapper chain,不涉及 core chain

图 11:Extest 模式下 Shift 与 Capture 时的数据路径
• Shift 阶段: 所有 Wrapper Chain 通过 shift path 传输数据。
• Capture 阶段: Input Wrapper Chain 通过 function path capture input port 上来自外部的数据;而 Output Wrapper Chain 仍保持 shift path 传输(因为它的责任是向外部发送控制信号)。
|-------------------|----------------------------|-------------------|
| 特性 | Intest Mode | Extest Mode |
| 测试范围 | Core 内部逻辑 | Core 边界与外部交互逻辑 |
| 使用的 Chain | Wrapper Chain + Core Chain | 仅 Wrapper Chain |
| Input Wrapper 角色 | 控制(提供激励) | 观测(捕捉响应) |
| Output Wrapper 角色 | 观测(捕捉响应) | 控制(提供激励) |
| 类比 | 像"封装"Core 内部进行测试 | 像"探测"Core 外部的连接逻辑 |

图 12:Extest Mode 测试边界逻辑示例
|-----------------------------------------------------------------------------------------------------------------------------------------------------|
| �� 本节小结 Intest 测试 Core 内部逻辑,使用全部 Chain;Extest 测试 Core 边界外部逻辑,仅使用 Wrapper Chain。两种模式下 Input 和 Output Wrapper 的控制/观测角色恰好相反。测试完整的层次化设计需要同时覆盖这两种模式。 |
三、Wrapper Cell 插入流程
理解了 Wrapper 的概念和测试模式后,我们来看如何在实际工具中完成 Wrapper Cell 的配置与插入。下面分别介绍 Tessent 和 DC 两种工具的操作流程。
3.1 Tessent Wrapper Flow 概览
Tessent 的 Wrapper 插入流程可以概括为以下几个关键步骤:
• 加载 Design 和 Library
• 定义 Clock 和 Design Constraints
• 排除不需要 Wrapper 的 Port(如 clock、global reset、power、scan channel、debug port 等)
• 使用 set_wrapper_analysis_options 和 analyze_wrapper_cells 识别和分配 Wrapper Cell
• 通过 trace PO/PI 判断是否需要 Dedicated Wrapper

图 13:Tessent 通过 trace PO/PI 判断是否插入 Dedicated Wrapper
强制控制 Dedicated Wrapper
在 Tessent 中,可以通过以下命令强制控制某些 Port 是否加 Dedicated Wrapper:
强制某些 port 加 dedicated wrapper
set_dedicated_wrapper_cell_options -ports {port_list} -type WC_D1 on
强制排除某些 port 不加 dedicated wrapper
set_dedicated_wrapper_cell_options -ports {port_list} -type WC_D1 off
定义多测试模式
在 Tessent 中,需要使用 add_scan_mode 定义至少两个测试模式:
add_scan_mode internal # 包含所有 scan chain
add_scan_mode external # 仅包含 wrapper scan chain

图 14:Dedicated Wrapper 控制示例------自动排除与强制指定
3.2 DC Wrapper Flow ------ 完整命令流程
在 DC(Design Compiler)中插入 Wrapper Cell 需要一系列配置命令。以下是完整的操作流程:
Step 1:启用 Core Wrapper
首先需要加载包含 Wrapper Cell 定义的 DesignWare 库,然后打开 Wrapper 开关:
加载包含 wrapper cell 定义的库
set link_library {* my_tech_lib.db dw_foundation.sldb}
打开 core wrapper 开关
set_dft_configuration -wrapper enable
Step 2:定义 Wrapper 信号
定义 Wrapper 的 Shift 信号。有两种方式:
方式 1:定义专用的 wrapper shift signal
set_dft_signal -view spec -type wrp_shift -port my_wrp_shift
方式 2:复用已有的 Scan-Enable 信号
set_dft_signal -view spec -type ScanEnable -port my_test_se
set_dft_signal -view spec -type wrp_shift -port my_test_se
如果需要将 Input 和 Output Wrapper 的 Shift 信号分开:
分开定义 input/output wrapper shift
set_dft_signal -view spec -type wrp_shift \
-port {wrp_ishift wrp_oshift}
set_wrapper_configuration -class core_wrapper \
-mix_cells false \
-input_shift_enable wrp_ishift \
-output_shift_enable wrp_oshift
Step 3:定义 Dedicated Wrapper Clock
方式 1:使用已有的 clock 作为 dedicated wrapper clock
set_dft_signal -view spec -type wrp_clock -port port_name
方式 2:依赖工具自动选择系统 clock
set_wrapper_configuration -class core_wrapper \
-use_system_clock_for_dedicated_wrp_cells enable
|-----------------------------------------------------------------------------------------------------|
| �� Clock 选择建议 如果没有为 Dedicated Wrapper 指定 Clock,工具会根据前后逻辑自动选择恰当的 Clock。但建议在多时钟域设计中显式指定,避免工具选择不当。 |
Step 4:指定 Wrapper Chain 配置
指定 wrapper chain 数量
set_wrapper_configuration -class core_wrapper -chain_count N
或者指定最大长度
set_wrapper_configuration -class core_wrapper -max_length X
将 input 和 output wrapper chain 分开
set_wrapper_configuration -class core_wrapper -mix_cells disable
Step 5:启用 Maximized Reuse

图 15:Maximized Reuse 原理 ------ 根据 Threshold 选择 Share/Dedicated Wrapper
启用最大复用并设置全局 threshold
set_wrapper_configuration -class core_wrapper \
-maximize_reuse enable -reuse_threshold N
为特定 port 设置不同的 threshold
set_boundary_cell -class core_wrapper \
-reuse_threshold N -ports {port_list}
强制为某些 port 加 dedicated wrapper
set_boundary_cell -class core_wrapper \
-ports {port_list} -type WC_D1
Step 6:细粒度控制 Share Wrapper
工具还提供了更细粒度的控制能力,可以手动指定或排除特定寄存器作为 Share Wrapper:
超过 threshold 但仍希望使用 share wrapper
set_boundary_cell -class core_wrapper \
-include {IO_register_cell_list} -ports {port_name}
满足 threshold 但想排除某些寄存器
set_boundary_cell -class core_wrapper \
-exclude {IO_register_cell_names} -ports {port_name}
强制指定某些 scan cell 作为 wrapper cell
set_wrapper_configuration -maximize_reuse enable \
-input_wrapper_cells [get_object_name [get_cells IN_CFG*reg]] \
-output_wrapper_cells [get_object_name [get_cells OUT_CFG*reg]]
Step 7:Combinational Depth Threshold

图 16:Depth Threshold 原理 ------ 根据组合逻辑深度判断
除了 Reuse Threshold,还可以设置 Combinational Depth Threshold。当 I/O 与寄存器之间的组合逻辑层级数低于该阈值时,使用 Share Wrapper;超过则插入 Dedicated Wrapper:
set_wrapper_configuration -class core_wrapper -depth_threshold 1
Step 8:Preview Wrapper Cells
在正式插入之前,使用 preview_dft 命令查看 Wrapper Cell 的分配情况:
preview_dft -test_wrapper all

图 17:Preview 输出示例------ 包含 Wrapper Cell 类型、功能、Clock 等信息
Preview 输出包含以下关键信息:
• Wrapper Cell 类型(Share 或 Dedicated)
• Wrapper Cell 功能(Input/Output/Three-state/Control)
• 关联的 Port Name
• Wrapper Cell 的 Clock 和 Instance Name
|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| �� 本节小结 Wrapper Cell 插入流程的关键步骤:启用 Wrapper → 定义信号(Shift/Clock)→ 配置 Chain 参数 → 启用 Maximized Reuse → 细粒度控制 → Preview 确认 → 正式插入。关键是合理设置 Reuse Threshold 和 Depth Threshold,在面积和可控性之间取得平衡。 |
四、完整命令流程汇总
下表汇总了 DC 中完成 Wrapper Cell 插入的全部关键命令:
|--------------------|---------------------------------------------------------------------|------------------------------|
| 步骤 | 命令 | 说明 |
| 1. 加载库 | set link_library {* my_tech_lib.db dw_foundation.sldb} | 加载包含 wrapper cell 的库 |
| 2. 启用 Wrapper | set_dft_configuration -wrapper enable | 打开 core wrapper 开关 |
| 3. 定义 Shift 信号 | set_dft_signal -view spec -type wrp_shift -port ... | 定义或复用 shift 信号 |
| 4. 定义 Clock | set_dft_signal -view spec -type wrp_clock -port ... | 为 dedicated wrapper 指定 clock |
| 5. 配置 Chain | set_wrapper_configuration -chain_count N / -max_length X | 指定 wrapper chain 数量或长度 |
| 6. 分离 I/O Chain | set_wrapper_configuration -mix_cells disable | 将 input/output chain 分开 |
| 7. Maximized Reuse | set_wrapper_configuration -maximize_reuse enable -reuse_threshold N | 启用复用优化 |
| 8. Depth Threshold | set_wrapper_configuration -depth_threshold N | 基于组合逻辑深度判断 |
| 9. 细粒度控制 | set_boundary_cell -include/exclude/ -type ... | 手动指定或排除 wrapper cell |
| 10. Preview | preview_dft -test_wrapper all | 查看 wrapper cell 分配结果 |
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| �� 实操建议 1. Reuse Threshold 建议起始设置为较大值(如 5~10),先尽可能使用 Share Wrapper 节省面积,再根据 coverage 结果调整。 2. 多时钟域设计中,建议显式指定 Dedicated Wrapper 的 Clock。 3. Preview 是必不可少的步骤,仔细检查每个 Port 的 Wrapper 分配是否合理。 4. 特别注意三态端口(Tristate)和双向端口(Bidirectional)的 Wrapper 配置,它们需要特殊的 Control Wrapper。 |
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━