Wrapper Cells 分析与插入全解析

------ 从 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。 |

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

相关推荐
迷失的小猫2 天前
Scan Test Point 插入全解析
dc·tessent·test point
灰色孤星A2 年前
MyBatisPlus详解(二)条件构造器Wrapper、自定义SQL、Service接口
java·数据库·后端·sql·mybatis·mybatisplus·wrapper
氦客2 年前
Android Gradle 开发与应用 (一) : Gradle基础
android·gradle·构建工具·groovy·wrapper·rumen
yimtcode3 年前
Swift | 属性包装器
swift·wrapper·属性包装器
何小有3 年前
Ubuntu 22 Python 虚拟环境配置
linux·python·ubuntu·virtualenv·wrapper