目录
1. LBIST架构
2. LBIST寄存器配置
3. LBIST触发时机
LBIST,全称Logic Built-in Self Test。
在TC3xx中,LBIST是一种硬件功能安全机制,目的是为了探测MCU内部逻辑电路的潜伏故障(latent faults)。
从使用者角度来看,只需要知道TC3xx的LBIST,它是基于对MCU进行量产测试的DFT(Design Fot Test)结构。这些测试逻辑是在芯片设计过程中被引入,流片后在ATE(自动测试仪)设备上通过对芯片进行测试,挑出有制造缺陷的芯片并淘汰掉,保证芯片的良率。
因此首先我们来熟悉熟悉LBIST架构。
1. LBIST架构
TC3xx LBIST结构如下图所示:
它主要由PRPG(Pseudo-Random Pattern Generator)、Scan Chains、MISR(Multiple-Input Signature Register)、LBIST Controller组成。
LBIST执行时,首先PRPG使用LFSR(Linear Feedback Shift Register )生成伪随机测试向量,送入到扫描链进行测试,然后compactor将得到结果通过异或门进行压缩,产生最终MISR签名,送入到LBIST Controller的相关寄存器中,以便应用软件比较。
基本原理看起来比较简单,但是我们知道,给用户端呈现得越简单,实际芯片设计过程就越复杂,所以接下来我们看看,LBIST模块相关寄存器有多简单(毕竟我也不懂DFT)。
2. LBIST寄存器配置
LBIST Controller相关寄存器总计只有4个,分别是LBISTCTRL0\1\2\3
- LBISTCTRL0
该寄存器主要用于设置LBIST Pattern个数、触发LBIST、表征LBIST测试状态、复位LBIST Controller等,是用户端主要关心的寄存器。
- LBISTCTRL1
该寄存器比较常用的是位域BODY,用于决定LBSIT执行时GPIO对外状态,一般建议配置为弱上拉
- LBISTCTRL2
该寄存器用于配置扫描链最大长度
- LBISTCTRL3
该寄存器存放MISR的签名值,可由软件读出,进行比对。
在最开始接触的时候,大家估计对寄存器中每个位域该如何配置非常困惑,毕竟pattern长什么样、个数应该怎么配置、签名的目标值是多少,对于使用者来说都是模糊的。
因此,英飞凌在每款芯片的具体UserManaul里都给出了推荐配置,例如TC37x AA LBIST配置推荐如下:
需要注意的是LBISTCTRL3是一个RH类型寄存器, 这里给的签名是给软件去做对比用的。
3. LBIST触发时机
LBIST的触发时间选择比较关键,因为根据文档描述,LBIST执行结束后会执行一个reset,
因此,一般多用在启动时进行一次LBIST测试, 英飞凌提供了两种选择:
- 通过UCB.BMHD.BMI的LSENAx位域,在BootRom阶段由SSW触发;
- 在应用启动阶段由软件进行触发
LBIST始终会触发Warm Reset,并且签名值的比较只能由用户软件处理,因此在设计LBIST触发时,我们应该先搞懂其运行逻辑,具体如下:
上图中,灰色部分为英飞凌的SSW软件,不可更改,只能通过UCB配置影响启动逻辑;绿色部分为应用软件部分,由用户实现。
- 系统从冷复位起来后,首先进入到SSW,该软件依次判断是否是Cold Reset、BMI.LBIST是否使能,如使能则触发LBIST,完成后进行warm reset,SSW会判断是否完成了LBIST,如果完成则跳转至用户代码(注意,SSW逻辑复杂,这里仅讨论LBIST相关);
- 用户启动后,去判断LBIST是否完成,如果LBIST已经完成了,就判断签名值是否匹配,不匹配则判断LBIST重试次数是否达到阈值,如没有则继续Trigger LBIST;
个人认为,英飞凌提出了使用UCB触发和软件自动触发的原因应该是最开始认为用户可以自定义去配置LBIST Pattern,但是我们发现,我们根本就看不懂这些寄存器说明,所以还是老老实实使用推荐配置。
既如此,那么上述逻辑就可以更进一步优化,使用时固定配置UCB.BMI.LBENAx打开,这样在SSW里就可以触发LBIST,那么Reset类型就为Warm Reset。因此在用户代码逻辑里,我们只要判断只要不是cold reset,我们就去比较签名值,这样就能节省启动时间。如下图:
当然,软件的设计是各种各样的,还可以直接读取复位状态寄存器RSTSTAT.LBTERM,如置位了就可以直接比较签名值,无论怎么样最终目的还是为了既能有效执行LBIST,又能加快启动时间。
最后,我们来考虑,上述代码应该在哪里执行?汽车ECU典型的用户代码分为Bootloader、App;个人理解既然LBIST是关系到MCU的内部逻辑电路,那么最好就是最早处理,因为一旦LBIST不成功,意味着代码就难以继续运行,故在Bootloader里做能及早发现问题。