efuse controller测试说明文档
efuse简介
efuse是一种一次性可编程存储器。是利用电子迁移(EM)特性来生成的一种小型的熔丝结构。
EM熔丝可以在芯片上编程,采用I/O电路的片上电压(通常为2.5V),一个持续200微秒的10毫安直流脉冲就足以编程单根熔丝,该特性决定了efuse存储器每个bit仅支持一次编程,常见的是方法是从0编程为1,无法从1编程为0。
efuse controller简介
efuse controller是kl3芯片内部封装的用于控制芯片内部efuse存储器的功能模块,其简化了软件访问efuse的复杂度,软件只需要配置少量寄存器即可实现efuse的读写操作。
目前的测试程序需要注意以下几点:
- 目前fpga中并没有真实的efuse存在,测试efuse controller时,是asic将内部ram模拟成efuse,用于测试读写功能是否正常,因此FPGA重新上电时ram数据会被清零,按键重启不会。
- kl3取消了efuse保护寄存器。
- kl3 efuse驱动有改动,更改为上电之后读取efuse所有数据并保存在ram中,后续的读操作直接返回ram中的数据,写操作也先检查ram数据判定是否需要真实的写入efuse。考虑到多核之间的数据同步问题,目前仅允许plc(core1)访问efuse。
- 需要重新整理efuse驱动,做好分层设计和适配之前的程序。
在2021-11-9之后的image版本中,efuse controller内部增加了1k bits寄存器,用于备份efuse数据,减少对efuse的实际操作(kl3采用的efuse存在读寿命,约400万次),并且支持上电后硬件自动加载efuse数据到寄存器中。
测试例程说明
efuse测试例程使用到的外设包含efuse controller、uart。
- efuse controller:测试对象,用于测试对外部efuse存储器的访问和控制。
- uart:使用uart0,实现调试信息打印,接收case配置信息等与PC的交互功能。
sfc测试例程遵循自动化测试框架,在例程执行之后,初始化串口0,通过串口发送“start”字段到PC,并等待PC发送“config”字段来获取本次需要执行的测试case。
在获取到case组合之后,初始化efuse controller,并根据case组合开始执行测试case。
这里的测试在软件上对读写做了一定限制,例如将已经置1的bit置1时不会发生写操作,而是直接返回,对已经置1的bit置0时将直接返回错误。以上限制都是基于存在efuse数据备份的基础上完成,efuse数据备份分两种方案:
- 使用纯软件备份efuse数据方案:上电之后主动将efuse数据读取出来保存在ram中,优先从ram中读取数据。
- 使用efuse controller 寄存器备份方案:上电后将efuse数据读取到寄存器中,优先从寄存器中读取数据。
case:0:efuse data dump测试
data dump测试极其简单,在efuse初始化之后,将efuse所有数据读取到指定的结构体中,并将所有数据打印出来即可。
该测试固定判定执行成功。
在设想中,该结构体和efuse中数据一一对应,并且可根据该结构体限制用户对efuse的操作
case1:efuse写、读测试
本case用于测试efuse controller对于efuse(fpga中实际为ram)的读写功能。测试流程如下:
-
对efuse指定偏移offset的地址写入数据A,按字节写入。
这里软件会判断写入的数据与efuse中现有的数据是否一致,根据判断结果会产生以下行为:
- 如果写入的数据中存在bit试图将1更改为0,则会返回错误,此时所有bit都未写入到efuse中。
- 相同的bit将不会更改,直接判断其他bit。
- 0更改为1会执行写入操作,将efuse中指定地址的对应bit更新为1,同时更新ram中备份的efuse数据。
也可以直接调用更改bit的api来修改efuse数据
-
使用读api读取数据B,此时返回的是ram中保存的数据。
-
读取efuse中的数据C。
-
对比数据B、数据C是否与数据A相等,不等则判定失败。
测试结果通过,能正常的更改efuse(fpga版本为ram)数据。