ZHCABS9A October 2017 – September 2022 TMS320F28075 , TMS320F28075-Q1 , TMS320F28374D , TMS320F28374S , TMS320F28375D , TMS320F28375S , TMS320F28375S-Q1 , TMS320F28376D , TMS320F28376S , TMS320F28377D , TMS320F28377D-EP , TMS320F28377D-Q1 , TMS320F28377S , TMS320F28377S-Q1 , TMS320F28379D , TMS320F28379D-Q1 , TMS320F28379S
本应用手册讨论 C2000™ 实时控制器中的硬件内置自检 (HWBIST) 功能。HWBIST 提供了一种在 C28x CPU 上达到高水平诊断覆盖率的方法,这通常是满足安全标准所必需的。
C2000™ and Code Composer Studio™are TMs ofTI corporate name.
Other TMs
HWBIST 是指由 ATPG 工具生成的电路和扫描模式,用于筛查目标电路内的逻辑故障。这种方法广泛用于半导体器件测试。所有 C2000 器件在器件制造过程中都利用某种级别的硬件辅助测试。一些较新的 C2000 器件支持客户在其系统测试中使用此测试技术,以测试 CPU 的完整性 (US 8,799,713 B2)。本文档介绍如何以及为何在系统级别利用 HWBIST。
表 1-1 列出了本应用报告中使用的术语和缩写。
缩写 | 术语 |
---|---|
ATPG | 自动生成测试模式 |
BIST | 内置自检 |
捕获 | 当种子通过待测逻辑计时时,嵌入式电路捕获变化逻辑的结果 |
C28x | TMS320C28x 器件中内核 32 位 CPU 的名称 |
CS | Code Composer Studio™ |
CLA | 控制律加速器 |
环境恢复 | 在完成硬件 BIST 微运行后恢复中央处理器 (CPU) 寄存器和状态标志的过程。这是由软件执行的。 |
环境保存 | 在启动硬件 BIST 微运行之前保存 CPU 寄存器和状态标志的过程。这是由软件执行的。 |
内核界限 | 在微运行测试期间,CPU 内核与外设和中断信号断开连接。测试后,内核重新连接到这些信号。 |
覆盖率 | 硬件 BIST 所覆盖的 CPU 逻辑的百分比。 |
CPU | 中央处理器 |
CRC | 循环冗余校验 |
DC | 诊断覆盖率 |
闪存 | 非易失性片上存储器 |
FPU | 浮点单元 |
HWBIST | 硬件内置自检 |
ISR | 中断服务例程 |
JTAG | 联合测试行动组。JTAG 是一种基于扫描的通信协议(如 I2C),它允许扫描到测试电路或仿真电路。 |
微运行 | 执行完整 HWBIST 测试执行的一部分。HWBIST 设计为支持分段执行完整覆盖率测试,以更好地管理中断延迟和功耗。这些微运行必须在更小的时间片中执行,以实现更高效的任务调度。在微运行期间,CPU 与所有外设和存储器隔离。此外,中断由 HWBIST 控制器记录。 |
MISR | 多输入签名寄存器 |
NMI | 不可屏蔽中断 |
PEST | 定期自检 |
PLL | 锁相环 |
POR | 加电复位 |
POST | 开机自检 |
RAM | 随机存取存储器 |
ROM | 只读存储器 |
种子 | 使用扫描路径加载到电路中的初始状态,以便电路在测试开始之前以已知状态开始 |
信标 | 通过多内核器件上使用的 CPU1 或 CPU2 获取对某些自检寄存器的写访问权限的机制 |
SDL | 软件诊断库 |
STL | 自检库 |
TMU | 三角函数加速器 |
TRM | 技术参考手册 |
VCU | Viterbi 和复杂数学单元 |
在具有 HWBIST 的 C2000 器件上,HWBIST 以 C28x CPU 和 FPU、VCU、CRC 以及 TMU 加速器为目标。还包括仿真分析电路,该电路管理这些处理元件和仿真器之间的通信,以及管理诸如断点、观察点和单步执行等功能。
HWBIST 不针对器件上的其余逻辑。器件上的另一个逻辑可通过器件特定安全手册中所述的其他自检或诊断机制进行测试。
有关 HWBIST 的可用性,请参阅器件特定数据表。您还可以查看以下文档,以了解 HWBIST 以及其他功能安全特性和配套资料:
虽然本文档重点介绍 HWBIST,但对于没有 HWBIST 且符合功能安全要求的 C2000 器件(如 F28004x 器件系列中的此类器件),提供了一个 C28x 自检库 (C28x STL),以使用基于软件的方法测试 CPU 逻辑的完整性。同样,HWBIST 不包括控制律加速器 (CLA),因此,对于具有 CLA 的器件,可以使用单独的 CLA 自检库 (CLA STL)。这些库是应要求提供的,请联系您当地的 TI 销售人员以请求访问权限。
图 1-1 展示了如 C2000 器件中使用的 HWBIST 方框图。橙色和粉红色部分展示了用于测试的逻辑。在系统使用中,这个逻辑是系统代码的处理引擎。数据按照执行系统代码的指示流经锁存器。
然而,这些相同的锁存器包括扫描访问,以便在测试该逻辑期间,高速测试流可以验证电路中门的操作。在这里讨论的情况下,逻辑中有许多并行扫描路径,以便可以并行测试逻辑的各重要部分。在这种测试模式下,逻辑的运行方式与处理器在运行代码时不同。
图形发生器为这些并行扫描路径提供种子,以提供在逻辑上验证目标门的操作所需的活动。这些种子是计算机生成的,并且使用标准 ATPG 工具验证覆盖率。这些种子经过优化,可在极少的周期内满足特定故障等级目标。这些优化器的供应商对这种优化感到非常自豪。
捕获和 MISR 部分跨所有并行链获取扫描操作的结果。扫描模式通过路径的步进交互与连接到锁存器的电路中的其他逻辑门交互。优化软件将故障注入到门中,如果 MISR 没有识别出故障,则需要额外的种子来验证出现故障的门。优化器将获得一个覆盖率目标,并将继续生成种子,直到满足此指标。达到 60% 的覆盖率相对简单;达到 95% 需要明显更多的种子,而达到 99% 则需要比 95% 明显更多的种子。
扫描操作的计时由 SYSCLK 驱动。BIST 控制器管理数据在扫描流程中如何移位和计时。BIST 控制器还管理 MISR 的种子和比较值的加载。在器件制造测试流程中,BIST 控制器和时钟源是使用 JTAG 等器件测试端口建立的。
这是对该测试方法的非常简化的描述。网络上提供了许多关于基于扫描的测试的详细学术文章。
如前所述,一些 C2000 器件支持使用 HWBIST 来筛查 CPU 在系统中是否存在逻辑故障,而不仅仅是在器件制造测试期间。图 1-2 展示了一个方框图,其中包括支持此选项的附加电路。
在器件测试环境中使用 HWBIST 时,测试仪管理每个目标逻辑部分以提供器件的总体测试。然而,当器件在系统中时,系统的各方面可能会受到待测目标逻辑的活动的不利影响。这些方面包括器件上和器件外部。出于这个原因,HWBIST 在目标逻辑周围包含一个屏障,以便 HWBIST 测试的活动与系统的其余部分隔离。在微运行测试期间,CPU 与外设和中断信号断开连接。测试后,内核重新连接到这些信号。这称为内核界限。在图 1-2 中,隔离屏障显示为绿色。同样,待测逻辑必须与系统中其他地方的活动隔离。这一屏障也发挥同样的作用。
但是,如果系统必须引起待测 CPU 的注意,那么它可能提供中断。当 BIST 控制器释放目标逻辑时,这些中断被捕获在缓冲器中,并提供给待测 CPU 逻辑。目标逻辑的完整覆盖率测试需要一段时间。覆盖率目标越高,所需时间就越长。C2000 器件中的 BIST 控制器将总覆盖率分为若干小部分来执行和验证,尽可能减少这些捕获的中断的延迟。这也解决了通过并行扫描路径产生的较高晶体管开关速率的一些功率问题。
在极端情况下,系统资源可能生成一个 NMI,该 NMI 会停止 HWBIST 操作并使用 HWBIST 复位恢复待测 CPU 运行。一旦环境恢复完成,就会获取 NMI 矢量,并且 NMI 服务例程可以解码 NMI 标志寄存器以确定中断的来源。NMI 将在 HWBIST 软件返回到调用序列之前设置陷阱。用户应用程序必须相应地管理 NMI 响应。
器件制造 HWBIST 和系统内 HWBIST 之间的一个显著差异在于:器件测试仪通过测试端口与 BIST 控制器进行通信,而系统内 HWBIST 使用 CPU 与 BIST 控制器进行通信。HWBIST 正在测试的 CPU 是管理 HWBIST 控制器的 CPU。更具体地说,待测 C28x CPU 控制 BIST 操作,其中所有锁存器都被多次更改。
下面是这个过程的工作原理。在 CPU 上运行的代码执行以下操作:
当 HWBIST 正在执行时,系统的其他方面也可以运行。如前所述,来自片外或片上源的中断保存在中断捕获缓冲器中。但是,将在 HWBIST 主动测试 CPU 时处理映射到 DMA 通道的触发器。例如,一旦完成步骤 6,就可以收集来自 SCI 或 I2C 端口的系统相关命令,并将其从端口移动到要处理的系统存储器中。这是因为所有器件总线都使用 HWBIST 屏障进行隔离。
前面概述中列出的所有操作都在 C2000 软件诊断库 (SDL) 中执行,该库是 C2000Ware 的一个组件。SDL 提供功能安全软件机制的实现,可帮助系统开发人员实现其安全目标。有关应用程序代码如何可以调用提供的 HWBIST 驱动程序的详细信息,请参阅 SDL 软件包中包含的用户指南。SDL 用户指南是有关 HWBIST 的器件特定的详细信息的更佳来源,例如支持的诊断覆盖率和执行时间。请在 <C2000Ware install directory>/libraries/diagnostic/<device>/docs 中查找此文档。
如前所述,当 C28x CPU 启动 HWBIST 控制器时,CPU 会关闭,以便 HWBIST 引擎可以测试内部的逻辑。图 1-3 在状态图中展示了此操作的流程。
当 HWBIST 检测到故障时,它会设置 HWBIST 状态寄存器中的相应位并退出 HWBIST 运行。此错误可能以如下形式出现:
在任何一种情况下,HWBIST 控制器都将故障信息保存到 HWBIST 状态寄存器中,为处理器生成 NMI,并在 NMI 标志寄存器中设置适当的位。在双处理器器件中,HWBIST 控制器为每个处理器生成 NMI。
在系统中使用 HWBIST 的原因有很多。下面展示了五个合理的示例:
HWBIST 对于原型调试的这一方面可能过于严格。仿真器为这项工作提供了更简单的方法。
作为系统制造的一部分,了解器件在电路板制造过程中没有受到损坏是很有用的。电路板制造事件极有可能对器件造成灾难性损坏,在这种情况下,HWBIST 无法在系统内运行。此外,损坏极有可能发生在未经 HWBIST 测试的引脚驱动器/缓冲器、外围电路或嵌入式存储器上。电路板或系统制造事件极不可能只损坏 HWBIST 所针对的电路。在电路板制造过程中,器件发生损坏的情况并不常见。但是,如果器件受到损坏,最好尽早知晓,以便在电路板生产线上进行调整。
在系统启动时运行 HWBIST 可解决前两个原因。系统温度和电压监控器可解决其余两个原因
这并不是 HWBIST 在系统中的有效用途,因为 HWBIST 已经在器件测试仪环境中运行,在该环境中可以通过更高的裕度(电压和温度)来执行。然而,如果 HWBIST 确实捕获了故障,则有理由担心系统中的某个器件在数据表中定义的工作范围之外运行良好。这可能无法在器件的引脚上测量,因为它可能是一个瞬时事件。
使用此电路时,晶体管出现一定程度的降级是正常的,符合预期。这是个小问题,设计和器件测试包括补偿这种漂移的裕度。
此外,还有一些潜在缺陷无法通过正常的器件测试方法进行筛查。这些缺陷机制要求施加一定程度的压力来加速故障发生过程。在器件制造测试中使用压力测试来加速大多数此类降级缺陷机制。
最后,HWBIST 有助于识别这些避开主动器件制造测试的降级机制。
本节介绍如何在系统中使用 HWBIST 以及与 C2000 软件诊断库紧密结合。本节仅提供有关如何执行 HWBIST 的摘要,但在 C2000Ware 的《SDL 用户指南》中提供了更多详细信息。本节还详细介绍在双核器件上运行的注意事项和调试技巧。
执行 HWBIST 涉及以下四个代码段:
大部分过程是通过软件诊断库函数实现的,用户的应用程序可以调用这些函数。头文件 stl_hwbist.h 中提供了函数定义。有关这些函数描述的更多详细信息,请参阅 stl_hwbist.h 或特定于器件的《SDL 用户指南》(位于库发布包的 /docs 文件夹中)。
包含多达八个函数,如下所示:
__interrupt void STL_HWBIST_errorNMIISR(void);
uint16_t STL_HWBIST_runFull(const STL_HWBIST_Error errorType);
uint16_t STL_HWBIST_runMicro(void);
void STL_HWBIST_restoreContext(void);
void STL_HWBIST_init(const STL_HWBIST_Coverage coverage);
void STL_HWBIST_injectError(const STL_HWBIST_Error errorType);
bool STL_HWBIST_claimSemaphore(const STL_HWBIST_Core core);
void STL_HWBIST_releaseSemaphore(void);
初始化 HWBIST 控制器是通过调用这个库函数来完成的:
void STL_HWBIST_init(const STL_HWBIST_Coverage coverage);
此函数初始化 HWBIST 控制器以进行操作。coverage 参数为枚举类型 STL_HWBIST_Coverage 并指定要实现的覆盖率。如果在多核器件上,则此函数预计尝试在 HWBIST 上执行运行的 CPU 已声明 HWBIST 信标。此函数初始化 HWBIST 寄存器,如下所示:
HWBIST 执行许多微运行操作,直到满足完全覆盖。软件诊断库提供了两个选项来完成 HWBIST。第一个选项是在每次 HWBIST 完整运行时,使用 STL_HWBIST_init() 对 HWBIST 控制器执行一次初始化,然后定期执行 STL_HWBIST_runMicro(),直到 HWBIST 完成。此选项允许对 HWBIST 进行更小的时间分片。第二个选项是调用 STL_HWBIST_runFull(),它完成一次完整的 HWBIST 运行,然后返回到用户的代码。此选项需要更长的时间,对于开机自检或可以分配更多时间来执行完整 HWBIST 运行时更有用。
要在待测 CPU 内核已声明信标并已执行一次性初始化后执行 HWBIST 的一次微运行,必须调用以下函数:
STL_HWBIST_runMicro();
此函数执行待测 CPU 的 HWBIST 微运行,并返回微运行的状态。此函数设计用作定期自检 (PEST)。
图 2-1 展示了一个流程图,该图详细介绍了 STL_HWBIST_runMicro() 函数的设计。 《诊断库用户指南》中也提供了此信息。
要使用 STL_HWBIST_runMicro() 函数针对小于或等于 95% 的覆盖率级别执行完整的 HWBIST,必须执行以下函数序列:
STL_HWBIST_claimSemaphore();
STL_HWBIST_init(STL_HWBIST_95_LOS);
STL_HWBIST_runMicro();
STL_HWBIST_releaseSemaphore();
要使用 STL_HWBIST_runMicro() 函数执行覆盖率为 99% 的完整 HWBIST(仅在 F2837x、F2807x 和 F2838x 器件上受支持),您通常按照上述步骤以达到 95%,重新初始化 HWBIST 以达到 99% 的覆盖率,然后重复调用 STL_HWBIST_runMicro(),直到它完成或发现错误。这些步骤因器件不同而稍有差异。有关更多详细信息,请参阅器件特定的《SDL 用户指南》。
图 2-2 展示了单个时间分片的微运行的设置和执行流程图。
要执行待测 CPU 的 HWBIST 的完整运行,请调用以下函数:
STL_HWBIST_runFull();
errorType 参数为枚举类型 STL_HWBIST_Error,它指定在执行 HWBIST 测试的完整运行之前要注入的错误类型。如果在多核器件上,此函数要求 CPU 先尝试运行完整的 HWBIST 以声明 HWBIST 信标,然后再调用该函数。此函数初始化 HWBIST 引擎,然后注入 errorType。它还将 STL_HWBIST_errorNMIISR() 函数注册为 NMI 处理程序。然后,该函数执行完整的 HWBIST 运行,从而实现器件支持的最大覆盖率。如果 HWBIST 中存在故障,则设置全局错误标志,而返回值指定故障。此外,如果在预期的微运行中没有实现覆盖率,则测试会因超限而失败。在返回之前,该函数恢复之前的 NMI 矢量。
如果 HWBIST 完整运行测试合格,在预期的微运行次数内没有出现错误,则此函数返回 HWBIST 的状态,该值将为值 STL_HWBIST_BIST_DONE 和 STL_HWBIST_MACRO_DONE 的按位或结果。如果测试失败,则 HWBIST 的状态和函数的返回值是以下各值的某种组合的按位或结果:STL_HWBIST_NMI、STL_HWBIST_BIST_FAIL、STL_HWBIST_INT_COMP_FAIL、STL_HWBIST_TO_FAIL 和 STL_HWBIST_OVERRUN_FAIL。
有关这些类型的错误的更多信息,请参阅《SDL 用户指南》。
图 2-3 展示了一个流程图,该图详细介绍了器件上支持 99% 覆盖率的 STL_HWBIST_runFull() 函数的设计。
要使用 STL_HWBIST_runFull() 函数执行覆盖率为 99% 的完整 HWBIST,请执行以下函数序列:
STL_HWBIST_claimSemaphore();
STL_HWBIST_runFull();
STL_HWBIST_releaseSemaphore();
该序列在单个时间片中执行完整的 HWBIST。图 2-4 展示了单个时间片中的完整 HWBIST 运行。