有数字芯片之母别称的FPGA,是国内在半导体行业率先取得重大突破的细分赛道,正迎来技术和市场形成共振的黄金发展期。
国内拥有最多的应用设计工程师与新兴从业人员,但到目前为止,还没有一款位流级别的专用EDA软件,服务用户日常应用开发所需的调试验证工作。
第一大厂商赛灵思,虽然早在二十年前,为高性能的SRAM FPGA能够应用在太空环境,就联合NASA推出的大型故障注入设备(XCRT),已成为包括火星车在内的诸多重大航天工程的基石,但只为境内联盟成员提供服务;
2012年,因应先进制程工艺(28nm)器件,芯片硬件电路对单粒子效应(SEU)更为敏感,用FPGA构造的产品更为“脆弱”的需求趋势,2012年正式将SEM IP核,作为FPGA在任务关键、安全关键等行业用户的首选解决方案。
包括航空、军工、汽车电子、医疗健康、数据中心、网络通信设备等的故障注入解决方案。
宣传语是“Error injection is a VERY Powerful tool”,就像自己就可以做“辐照”实验,但是更精准、功能更强大。
用户对设计进行非破坏性的日常故障注入测试,能够为产品的最终部署使用,注入更多信心。
理想丰满,现实骨感。FPGA应用开发难度大,全球用户都感同身受,应用设计不易,调试验证难度大,能够在真实硬件环境下对整个系统进行故障注入测试,难度系数再升两个等级。
有技术研发实力的申请发明专利,如军工巨头雷神技术2020年的“Fault injection can replace the beam test or mitigate risk of a failed beam test”;国内在体系结构研究走在最前沿的、也是FPGA应用研究最深之一的国防科大,2021年发表的《利用整帧翻转的SRAM型FPGA故障注入加速算法》等。
虽然赛灵思的故障注入解决方案已推出二十余年,要么是服务的不可获得性(XCRT),能获得甚至免费的SEM IP,又实在难以使用,把用工具直接提供的数据,做成了各个行业用户的学术论文。
从早年Jbits年代院士门生的博士毕业大论文,到现在各类政府资金资助项目的结题结项“学术论文”,汗牛不充栋,数量种类也是足够丰富。
调试是自动化最后的堡垒,数据是调试的生命线,而代表FPGA最先进调试能力的硬件辅助验证两大专用设备,配置的要么是太臃肿的复杂大软件,要不就是技术曲线过于陡峭,需要额外专业培训才能使用的昂贵EDA工具。
当软件早已不再只是单纯的工具,而是成为综合性的服务,在AI时代更是以成果为交付物的现在,我们希望全自主开发的forgedaFX软件,能成为帮助用户加快产品开发、提升质量的必备生产力工具:
轻量便捷、正版且花费不多
历经近十年的迭代优化,技术水平居于行业领先水平,化繁为简,事半功倍:Dancing with More People。
FPGA本身是建立在芯片基础上的软件生意:为用户节省时间,为芯片厂商节省人力成本支出! 简单的直接用EDA工具自动完成;复杂疑难问题,用EDA工具的自动化能力,辅助工程师完成。
本使用指南完整版本等更多产品资料,可通网站gitee.com/forgeda直接获取查阅,链接地址FPGA故障注入工具
以下为正文
非破坏性故障测试的主要目的,在于获取用于计算可靠性指标的“基础数据”,用来快速验证多模冗余、配置刷新等设计加固措施有效性等。
即便在非常特殊的空间领域应用场景,也已成为进入到物理故障注入前的最后确认测试环节,所需的事前准备工作。可避免如果直接进行“行业黄金法则”的破坏性辐照试验,因一次不成功造成的巨大成本风险。
forgedaFX软件的工作主界面,包含两大核心功能:第一部分是业内独创的位流数据分析,是用户在真实硬件环境下,实现对实物系统进行故障注入操作的基础;
第二部分是通过软件提供的故障注入数据库,对任意DUT快速搭建SEU 硬件仿真环境:由用户根据自己的测试向量,通过三种方式进行故障注入,并统计关键位(Critical bits)数量,包括可在刷新后恢复正常功能的Bits,以及最重要的持续性故障点(Persistent Bits)。
Persistent Bits也被称为不可恢复异常比特位(Unrecoverable Critical Bits)——不能通过定时刷新修复,也是卫星等行业在地面故障注入试验需要重点关注、着重评估并优化改进的比特位。
只能通过系统重启方式,才能恢复正常功能。
具体地,用户可通过位流数据分析和故障注入测试,统计设计“关键位”数量,获得降级因子 ε,从而表征设计易受SEU影响的程度,即随机发生的配置编程点翻转导致系统功能错误的概率。
使用上述降级因子数据,易于对三模冗余设计等加固措施的有效性进行量化评估;计算动态翻转截面数据,用于失效率等可靠性指标的估算。
降级因子的值越小,说明SEU翻转导致系统设计故障的概率越低。相应的,可靠性就越高,系统就越健壮。
以KU040 FPGA上的复杂处理器系统加固设计为例,通过计算降级因子,如下图所示:
用户只需比较两个降级因子,便可知采用TMR加固后的设计,与之前的设计相比,系统健壮性提升14.87倍。
如果您需要任何使用帮助或问题建议,可发送电子邮件至viewall@forgeda.com,我们乐于为您详尽解答。
forgedaFX软件与FPGA芯片型号绑定使用,并以其作为软件产品具体型号的命名规则。以本指南使用的forgedaFX-325软件为例,可支持两大类别、共51款Xilinx 7K325T芯片(详见第七章的FPGA具体型号列表)。
如您使用的是forgedaFX-690软件,可支持赛灵思公司第七代的所有Virtex 690T芯片,共32款型号。其中,通用型24款,高等级芯片8款。如您使用的是forgedaFX-060软件,则支持的是赛灵思更先进工艺(UltraScale)的全部KU060芯片,包括通用性XCKU(18)、高等级XQ(4)和宇航级XQR(1),共23款具体型号。
初识forgedaFX
forgedaFX软件为您提供了一个友好、简洁的使用界面,启动后显示的全景GUI,主要功能已在主菜单栏清晰列明。
左侧是FPGA芯片基本信息以及CRAM配置存储器数据展示窗口、右边为项目配置信息,控制台消息输出窗口,共7个区域。
FPGA芯片型号、当前项目名称、工作目录等信息自动显示在主界面。
① 主菜单栏
包括【项目】、【分析】、【查看】、【测试】、【帮助】等功能,您可通过选择相应的菜单,完成所需的操作:
【项目】
用于故障注入测试项目的创建、导入、关闭以及软件退出操作
【分析】
对FPGA位流数据进行自动分析,智能过滤与设计无关的冗余编程点,快速创建故障注入测试数据库文件(Fault Injection DB File)。
【查看】
提供“风险地图”、“编程点记录”、以及“概要信息”三种方式,便于用户查看位流数据分析结果。
【测试】
用于对DUT应用设计有关的编程点进行SEU故障注入操作。
【帮助】
可用于打开forgedaFX软件用户使用指南(本文档)、显示软件版本信息等。
除了选择以上菜单项来执行操作,您也可通过“Alt+快捷键”方式,直接运行要使用的功能,如直接用“Alt+P”快捷键,选择【项目】菜单。
② 工具栏
显示快捷工具图标,执行以下常用操作:
③ 当前项目信息显示区域
位于界面右上方,显示当前测试项目名称、工作目录,目标FPGA型号,以及FPGA应用设计对应的.dcp文件。
④ DUT信息显示区域
显示目标FPGA芯片基本信息,以及在分析后得到的“配置存储器数据规模”、“故障注入数据库中的编程点总数”。
⑤ 控制台消息输出窗口
在数据分析启动后,实时显示当前进程和状态消息
⑥ 进度条窗口
用于表示“程序正处于运行状态”
⑦状态栏
显示当前项目的状态描述信息
技术虽不能直接解决问题,但肯定可以提升效率。
forgedaFX软件的核心能力, 是提供智能化的二进制数据分类标记、过滤等功能,对用户设计有关的测试点集合进行归集,进而在海量配置存储器中,快速过滤大量与用户原生设计无关的冗余测试点,并且这个工作阶段是完全自动化,零门槛。
经过数据分析获得的故障注入数据库文件,是后续故障注入操作的基础。可避免大量无效的冗余点注入,做到有的放矢。与采用无差别的全芯片随机或遍历方式,就直接进行故障注入的常规测试方式相比,可将验证效率至少提升300%以上。
本章将以时钟计数器为样例(详见附录1),介绍如何创建您的第一个故障注入测试项目。
该样例以1/4秒为周期,由时钟计数器驱动LED显示,所有设计文件位于forgedaFX软件的demo/Vivado_counter_demo子目录。
3.1 新建项目
在正式启用软件前,首先创建一个专用空白目录,用于保存和记录在软件工作过程中,新生成的项目文件和测试数据等。
请注意命名规范,不含中文字符、空格符等,以免影响顺畅的使用体验或软件任务报错。
然后启动软件,在主界面工具栏选择“创建新项目”。
在“项目参数设置”对话框中,分别输入以下信息:
(1) 选择事先已准备好的专用工作目录(即此时无任何内容的空白目录);
(2) 直接在软件界面上命名“项目名称”;
(3) 选择目标FPGA芯片的详细信息(型号、速度等级、管脚封装等);
(4) 选择设计文件.dcp(即设计在布局布线后最终产生的_routed命名文件)。
在本演示样例中,输入的.dcp文件,位于demo/Vivado_counter_demo/
counter-base.runs/impl_1/led_test_routed
Step1
创建专用文件夹(例如,本演示样例名为counter_demo),作为当前项目专用工作目录,用于保存和记录测试文件和结果数据;
在正式启用forgedaFX软件后,数据分析日志、起止时间、故障注入测试结果等项目文件,会自动放置在该“空白”文件夹内,以便于随时查阅或回溯分析。
Step2
在forgedaFX软件主界面工具栏选择“创建新项目”,通过项目参数对话框,对该新项目进行命名(例如,本演示样例将counter_inject作为项目名称)。
项目参数设置完成,点击“确定”,完成项目创建。
右下角状态栏显示“new project created successfully”提示,表明项目已成功创建。软件界面右上侧将显示您所创建的项目信息,包括:项目名称、项目工作目录、设计文件、FPGA芯片型号,便于您核对检查,确认是否已正确无误。
该步骤完成后,在项目工作目录下,自动产生后缀名为.ipr的项目描述文件(counter_inject.ipr)。该文件作为forgedaFX软件专用的项目描述信息,便于您在后续用于快速导入该测试项目。
3.2 数据分析
项目创建成功之后,启动软件“数据分析”功能。
在运行过程中,界面右侧的控制台消息窗口实时显示当前工作进度,并在右下角状态栏显示“data analysis started”。
进入数据解析阶段,对 FPGA位流数据的处理过程全自动化,无需任何人工干预。
分析所用时间与FPGA芯片规模、应用设计复杂度密切相关,请耐心等待。比如在本样例中,数据分析耗时2分钟,工作速度为每秒钟超过600,000 bits以上。
一旦结束,消息窗口提示“data analysis completed”,在控制台消息窗口显示运行时间以及分析结果。
与此同时,软件界面左侧显示目标FPGA 配置存储器(CRAM)规模,以及用户设计相关位总数(Essential bits),即故障注入数据库(Fault Injection DB)规模。
如上图示,在该样例中,forgedaFX软件从目标器件(7K325T芯片)共计91530240 bits位流规模中,首先识别用于配置硬件电路的CRAM数据(72868672 bits),再过滤筛选与counter硬件电路结构、功能无关的冗余测试编程点,最后精准标记出只与该设计相关的Essential Bits(15114 bits),即FPGA故障注入所用数据。
该数据同时记录在故障注入测试数据库文件中(即图中的result_record.txt)。
分析过程结束,在当前项目工作目录下的report文件夹,产生日志文件biti.log,结果概要文件bits_summary.txt,以及完整的故障注入测试数据库文件result_record.txt,便于查阅。
故障注入测试数据库文件,提供了FPGA芯片内部,与DUT有关的完整配置编程点地址,是后续实现故障注入的基础。
3.3 查看分析结果
在数据分析过程结束之后,forgedaFX软件提供三种方式显示分析结果,可直接在软件工具栏点击对应图标按钮,直接“查看”相关的数据结果。
对数据分析结果的含义,具体解释如下:
3.3.1 编程点记录
选择“查看数据分析结果文件 ”后,软件分页加载并显示配置硬件电路的编程点信息,以列表方式展示各编程点的详细地址,即故障注入测试数据库文件。
也可在创建的工作目录下,点击/report/result_record.txt,查看完整的编程点地址数据。
forgedaFX软件在位流数据分析工作完成后,自动提供与硬件电路设计相关的所有编程点信息,100%全覆盖:具体列明每个编程点的详细物理帧地址、线性逻辑地址、以及详细的位置坐标,数据加载所需时间在10秒左右,如下图示:
各数据栏的详细释义如下:
① 物理帧地址(Physical Frame Address)
FPGA芯片位流数据按帧进行编址,物理帧地址是最直接的编程点寻址方式,也是故障注入操作所需的关键参数之一。在对实物进行故障注入操作时,按照提供的物理帧地址,实现对编程点所在配置帧的读写访问。
例如,上图中序号为1的编程点,物理帧地址为0x00000002,后续可在forgedaFX软件故障注入测试界面,直接作为指定的故障注入地址。
② 逻辑地址(Logic Address)
forgedaFX软件提供的逻辑地址,与芯片原厂商所使用的FPGA芯片编程点专用线性地址格式保持一致,数值是一个长度为9的16进制数。其中,前6位为逻辑帧地址(L),后3位为编程点所在的配置字(W)和配置位序号(B)。
③ 编程点位置
表示编程点在芯片内部的坐标,是物理帧地址、编程点序号的具体化。
④ 逻辑区域序号
forgedaFX软件提供编程点的逻辑区域SLR序号,当SLR序号为0,表示DUT芯片为非堆叠、平面架构的芯片。例如,本使用指南中的具体样例使用的FPGA 为7K-325T,就是非堆叠、只有一个维度的平面架构芯片。
当使用forgedaFX对多维堆叠架构的先进大容量FPGA进行自动解析时,例如目标型号为Kintex UltraScale KU115,当SLR序号值为1时,则表明该编程点位于第二个SLR,以此类推。
3.3.2 风险地图
forgedaFX软件为用户提供应用设计在FPGA芯片内部对应的配置视图,用于展现“ε1(配置资源利用率) ”的物理意义。以数据图谱方式,使得原本处于不可见“黑盒”状态的配置编程点,进行全景展示。
选择“查看编程点风险地图 ”后直接显示如下:
FPGA芯片中的所有配置编程点以“帧(Frame)”为单位进行组织,覆盖所有类型的逻辑单元(Logic Cells),即数据图谱中的蓝色部分,加上由forgedaFX故障注入数据库编程点组成的浅黄色部分,两者共同构成DUT设计在FPGA芯片内部的“风险地图”。
3.3.3 概要信息
您可通过软件工具栏的“概要信息 ”快捷菜单,查看数据分析简报:
也可在工作目录下的report文件夹,点击bits_summary.txt文本查看。
3.4 本章小结
EDA工具一直是用户降低经验门槛,减少不确定性风险的利器。
简单的直接用EDA工具的算力,自动完成;复杂疑难问题,用EDA工具的自动化能力,辅助工程师完成。
随着对计算性能的极致追求,FPGA芯片规模急剧增长,以及用户设计复杂度不断增加,以目前关键且重要领域使用的7K690T为例,包含的配置编程点数量已高达1亿7000万,是上一代主流器件Virtex-5的近10倍,对于如此量级的数据规模,以往依赖人工经验的解析方式,越来越费时耗力。
数据分析作为forgedaFX软件非常重要的一个核心工作流程,也是后续故障注入测试工作的基础工作和必要过程。
利用位流数据分析结果,可直接计算“设计相关位与全芯片配置编程点的比值”,获得降级因子ε1 (配置资源利用率),即构成降级因子ε 的第一个关键部分。
在本章样例中,按照概要简报,counter设计简单,相关位规模仅为15114 bits,全芯片配置编程点规模为72868672 bits,ε1 = 15114 / 72868672 = 2.07 × 10 ^(-4)。
备注:按照Xilinx统计数据,即便是Slice资源利用率接近极限的情况下,ε1最大值也不会超过33%。
像菊厂这样的FPGA大户专家可达90%以上,航天航空、军用等FPGA优势应用行业用户,因为考虑“冗余”可靠性需求,Slice资源利用率通常只是60%以下。
由分析过程得到的故障注入数据库,为用户提供了完整的相关位(Essential Bits)地址信息,明确了“What proportion of upsets effect the design”,是实现精准、高效的故障注入测试的关键。
故障注入数据库所提供的逻辑地址/物理地址等编程点数据,可直接输入到厂商SEM IP进行实物测试;也可以直接输入到专用测试设备,完成故障注入;或者通过forgedaFX proAPIs高级功能实现;对于非航天领域或其它无需遍历的故障注入,可直接在forgedaFX软件界面完成,具体操作过程详见下一章。
数据可见,生产力才能看得见!
在硬件真实环境下对FPGA芯片进行故障注入测试,由用户根据自己的测试向量确定哪些配置编程点(Configuration Bits)是“设计关键位”,并回答当配置编程点发生翻转时,“What Happens When They Do ?”, “How Many Upsets are Critical to Operations ?”两大问题。
用户通过对指定的帧地址进行配置回读,并对其中的编程点进行0/1数据改写,完成故障注入操作。眼见为实,用直观的测试数据,为产品的部署使用注入更多信心,做到“心中有数”,才能胸有成竹。
由于芯片内部结构事关厂商核心机密等商业利益,往往是保密(Confidential)或者只能间接方式获取,对大多数用户来说,解析不易,费事耗力。
forgedaFX软件提供了这样一种先进能力,用户无需了解任何器件底层结构信息,便可快速获取故障注入测试所需的全部数据,即包括所有的设计“相关位(Essential bits)”数据库,作为故障注入测试工具的基座,实现精准注入故障。
其中,逻辑地址/物理地址等编程点数据,可直接输入到芯片原厂提供专用工具SEM IP,进行实物测试;当用户采取专用故障注入设备进行验证时,也可直接使用数据库中的物理地址。
4.1 使用原厂的SEM IP进行故障注入
SEM IP是赛灵思公司为任务关键、安全关键的行业用户,提供的功能强大故障注入测试工具。自2012年首次推向市场后,已升级迭代到支持旗下所有先进器件进行实物级故障注入测试验证。也是除了较为特殊的航天领域外,推荐给航空、网络通信、数据中心、汽车电子等行业用户使用的主流解决方案。
当作为故障注入工具使用时,其用途类似于Altera公司的故障注入调试器。
按照赛灵思为用户给出的测试数据指引,用SEM IP进行500次的随机故障注入测试,已经相当于在FPGA在40000英尺高空连续运行工作18年,可能遇到的最坏情况,可靠性、安全性已经足够有保障。
关于如何使用SEM IP进行故障注入的具体方法,可参阅厂商为用户提供的相关文档,包括Xilinx UG036、UG187产品手册等。
相关功能设置与具体实现方法,用户也可进一步参考其它诸多第三方给出的SEM IP指南,以及国内外大量的相关论文资料等,具有相关介绍说明。
以下内容为用户直接在forgedaFX软件界面完成随机故障注入测试的详细介绍。
4.2 forgedaFX软件故障注入功能概览
在forgedaFX软件主界面,选择 “故障注入”,或者直接点击“ ”图标,就可进入“SEU Fault Injection”测试操作界面,共有5个功能区域:
① DUT基本信息 ② 位流下载与回读操作 ③ 设置故障注入编程点地址 ④ 运行状态输出 ⑤ 故障注入
界面左上角的“DUT基本信息”区域,显示待测编程点规模(Bits to be Tested via Fault Injection),以及故障注入测试数据库文件等用户硬件电路相关信息。
对目标板卡进行故障注入之前,您需要通过Vivado Hardware Manager,确认三个硬件连接参数:Hardware Server连接字符串、目标板卡Hardware Target序号、以及Hardware Device序号(即待测FPGA芯片在目标板卡JTAG链中的位置)。
以上图为例,Hardware Server连接字符串为localhost:3121,即本地连接;需要测试的Hardware Target目标板卡序号为0;在该目标板卡的JTAG链上,只包含一片XC7K325T FPGA,对应的Hardware Device序号为0。
4.3 位流下载及回读操作
在您确认上述设置正确无误后,在forgedaFX界面左侧“Configuration Settings”区域,先选择待测DUT对应的位流文件.bit、调试支撑文件.ltx(如有),并设置硬件连接参数。
按照以下三个步骤,完成故障注入操作前的准备工作。
在各步骤操作过程中,您可以随时从界面右侧Session Log消息输出窗口,同步了解当前工作状态和进展情况。
Step 1
单击“Download”按钮,载入完整位流文件
消息窗口提示“Download Process Ended Successfully.”,表示位流已成功载入。
Step 2
单击“Read AllFrames”按钮,回读所有的配置帧数据
在故障注入之前,作为基准配置数据(Golden Frames)
回读操作成功,提示Golden Frames写入预先指定的数据文件。
Step 3
单击“Read DeviceID”,读取FPGA芯片ID。
作为正式启动故障注入之前的“热身”,该操作用于确认JTAG读写操作是否正常。
操作结束后,显示读取的FPGA IDCode,版本号,提示“Get the Device IDCode Successfully”,表示JTAG正常工作,可启动故障注入测试操作。
4.4 硬件故障注入操作
用户通过forgedaFX操作界面右侧的“Get”按钮,从Fault Injection DB File中,随机抽取故障注入地址,或者直接输入目标编程点地址。
以下图为例,目标编程点的物理配置帧地址(Physical Frame Address)为0000021C,逻辑帧地址为0000AC,位序号(Bit Address)为第98个字(Word),第23个配置编程点(Bit)。
与此同时,在消息窗口同步显示如下信息:
点击界面右下角“Fault Injection”按钮,启动SEU故障注入。
以下为消息窗口输出内容:
在创建的项目工作目录/hardware中,可直接查看seu_inject.rec测试记录文件。
若编程点对应的“注入成功标识”置为1,表明SEU故障注入操作已顺利完成。
在本样例中,您可以直接观测四个LED灯的输出情况,判断是否导致Counter设计发生功能故障,即当前配置编程点是不是“关键位(Critical Bits)”。
对于其它FPGA应用设计,您可以按照硬件电路的功能定义,测试向量,对其运行结果进行比对判断,查看并记录响应情况。
例如,在forgedaFX软件提供的FIR样例,您可以通过点击FPGA硬件板卡上的按钮,启动结果比对,进而观察UART输出字符是“0”或者“1”,来判断当前故障注入操作是否会导致功能故障,记录其中的设计“关键位”。
4.5 配置帧恢复
不论故障注入是否影响硬件电路的功能,在每一次故障注入完成后,都可以使用Frame Restore功能,将配置帧数据重新“刷新”后复原,避免故障累积,以确保每次操作,都不受前一次测试的影响。
选择“Frame Restore”,即重新写入配置帧数据(Frame Scrub),进行复原操作。
Frame Restore通过对目标配置帧的写入操作完成,消息窗口显示如下:
以7系列 FPGA芯片为例,向目标配置帧写入101个字;若为UltraScale+ 系列,则写入93个字。
在Frame Restore操作之后,可直接点击“Get”获取新的编程点地址,继续进行下一次故障注入操作。
在Frame Restore操作之后,可继续观测DUT设计功能是否恢复正常,并记录那些不能恢复正常功能的持续性故障点(Persistent Bits)。
随后点击“Download”重新载入位流、“Read AllFrames”读取配置帧数据,再继续使用“Get”获取新的编程点地址,启动下一次测试。
在本章使用的Counter样例中,按照以上测试过程,随机注入10-20次,可观测到LED显示功能故障。
在所有故障注入测试操作完成后,对结果进行统计,得到“关键位与故障注入次数的比值”,即降级因子ε2 (故障传递率)。
作为计算降级因子ε 的另一个关键部分,按照Xilinx统计数据,即使是对于控制密集型的复杂电路,ε2的值通常在20%—33%之间。即,对故障注入数据库中的编程点进行故障注入测试,一般每3—5个编程点中,有1个会导致硬件电路功能故障。
4.6 本章小结
不论是数字信号处理,还是复杂处理器设计,都可利用forgedaFX软件提供的数据分析能力,在构建的SEU硬件仿真测试环境中,以故障注入方式,快速获得配置资源利用率ε1、故障传递率ε2,据此计算降级因子ε ,量化对三模冗余加固设计的可靠性提升效果;估算系统失效率等可靠性指标。
对于航天领域较为严苛的测试需求,或用于配合辐照试验时,以及其它对高安全、高可靠应用,用户需要对整个设计、指定硬件模块进行充分详尽的严苛验证,您可使用forgedaFX软件提供的高级功能(proAPIs)。
使用proAPIs创建测试脚本,以自动化方式全程代替手工操作,按需进行遍历/随机测试,具体使用方法,详见以下第5章节的使用说明。
forgedaFX为用户提供了系列标准编程接口proAPIs,作为软件的高级功能,您可以用于创建个性化的测试脚本,按需对DUT进行更详尽的充分测试。对复杂设计、或者海量编程点,以及辐照试验前设计准备阶段使用,技术水平居于行业前列。目前世界上只有极少数公司的工具,能够提供类似的服务。
采用创新的负载分割技术,支持对设计进行并行测试,进一步提升效率。单机的故障注入速度为每小时6000-10000个bits;假设采用10台主控计算机对同一设计进行验证,则相应的故障测试速度为单机10倍以上,以此类推。
系列proAPIs, 采用EDA行业广泛使用的Tcl语言编写,使用最常见的通用JTAG接口,对原生设计“按原样”进行故障注入,在整个测试工作中,无需额外再借助其它任何第三方软件/硬件或专属接口,为用户节省成本。
待测电路可以是整个系统、也可以是其中的关键模块,用户不论是采用随机测试、遍历测试、还是对指定的编程点进行故障注入,都能够拥有最大程度的灵活性。
本章将以相对复杂的FIR应用设计为样例,详细介绍proAPIs的功能及参数。
该样例所有设计文件位于forgedaFX软件的demo/Vivado_fir_demo子目录,详细说明见附录2。
与第三章中counter样例的使用流程一样,您应当先按照自己的硬件板卡定义,新建Vivado设计项目,导入RTL源文件,并修改管脚约束文件,重新进行编译,生成新的布局布线结果文件(.dcp),以及位流文件(.bit)。
在forgedaFX软件界面新建测试项目,并完成数据分析过程。下图为数据分析结束后,显示的概要信息:
5.1 功能介绍
forgedaFX proAPIs由12个标准的应用编程接口API组成,用户可快速创建测试脚本,也可在Vivado Tcl Shell环境下直接调用。
下表为forgedaFX proAPIs功能概览,以及各API类别对应的具体用途。
5.2 测试环境设置API
主要包括vInit和vClean API,用于测试环境的初始化,以及在测试结束后,关闭与FPGA板卡的硬件连接,安全退出。
环境初始化成功之后,Vivado Tcl Shell 界面显示如下:
退出当前测试环境之后,Vivado Tcl Shell提示如下:
5.3 故障注入功能APIs
在使用vInit API完成测试环境初始化之后,需要先将完整位流文件载入FPGA芯片,并读取FPGA芯片内部所有配置帧数据作为Golden Frames,再读取Device ID,以确认当前JTAG设置正确无误,最后启动故障注入操作。由4个API组成:
位流文件载入完成后,Vivado Tcl Shell显示如下:
以上图为例,对于FIR样例使用的7K325T FPGA,vReadAll API共读取22544帧配置数据,逻辑地址从0x000000到0x00580F,其中,每个配置帧包含101个配置字(序号为000-100)。
操作结束,Vivado Tcl Shell窗口显示相应的Device ID。
以上准备工作都顺利完成后,可通过vFaultInject API启动对目标编程点的故障注入测试操作。
故障注入操作结束后,Vivado Tcl Shell窗口输出以下信息:
单次故障注入所需时间< 30ms。
每分钟可注入的故障数为数千次以上(不计入DUT运行结果比对时间)。
5.4 运行时数据访问APIs
用于在线数据读写访问,包括对指定配置帧的在线读写、配置寄存器的状态获取,以及对芯片温度和工作电压进行监测。
上述操作完成后,可以在Vivado Tcl Shell中看到以下提示信息。
vWriteFrame与vReadFrame是两个对称的API,用于对指定的配置帧进行读写访问。
以上图中的Example为例,配置帧地址“00422FA6”,与vReadFrame API输入的帧地址完全相同,所写入的数据文件直接来自vReadFrame输出文件。
一旦操作完成,界面显示如下:
在实际测试工作中,您可通过vReadFrame,vWriteFrame,在任意时刻,对任意配置帧进行在线读写操作。
操作完成,显示如下信息:
用户可对照FPGA配置手册中的“Status Register Description”,对当前配置状态进行判断。
一旦监测到当前电压、温度发生偏离,API将直接输出警示信息。
5.5 故障注入数据库相关APIs
提供两个功能API,包括用于创建模块级别Fault Injection DB的vGetRegion、以及大规模随机测试使用的vRandomBits。
用户可使用vGetRegion,选择设计中的指定功能模块,创建该模块对应的Fault Injection DB。
以样例中的DUT FIR硬件模块为例,在Vivado 工具中,打开Implemented Design,从布局布线图中选择该模块,并通过模块属性窗口,获得所在的矩形区域坐标(10,276,17,291),如下图所示:
以下为调用vGetRegion API,获取该模块对应的Fault Injection DB file。
结果显示如下:
下图显示,从FIR样例的全芯片设计Fault Inject DB中,随机抽取5000个编程点,并写入到对应的DB文件中。
处理结束,生成随机测试DB File。
5.6 基于proAPIs创建测试脚本
用户使用APIs创建测试脚本,整个过程由控制模块(User Defined Test Controller)进行协同,各功能模块之间的关系如下图:
首先,故障注入测试模块(Fault Injector)调用proAPIs,按照Fault Inject DB File给出的地址集合,完成对DUT的故障注入。
随后,DUT加载测试向量(Test Vectors),执行预定义的功能;并由监测模块(User Defined Monitor)负责对运行结果进行判断,将故障注入地址,监测结果写入测试日志文件(Log)。
在forgedaFX软件的demo目录,为用户提供了融合proAPIs的FIR,以及SoC测试脚本样例,详细使用说明见附录2、附录3。
5.7 本章小结
forgedaX软件提供的proAPIs编程接口,将以往繁琐的、容易出错的工作,用API的自动化处理能力,自动进行SEU故障注入操作。
在测试过程中,获取芯片状态、监测电压温度等操作,也都是直接通过API调用方式,轻松完成。
如果您对某个硬件模块感兴趣,或者需要进行重点测试,也可快速用API构建“模块级”的故障注入数据库。
针对大量编程点组成的数据负载,forgedaFX在位流级别支持Partitioning,即设计划分。可将测试任务划分为任意多组,在服务器、台式机、笔记本等宿主机上,实现并行测试,非常先进。
如果您能熟练使用forgedaFX软件的全部功能,就可使用负载分割技术,将庞大的测试数据集合进行划分后,利用并行测试进一步提升工作效率。、
FPGA可定制开发满足各种功能用途,通常又被称作价格亲民的ASIC,现已深入应用到国民经济的各个角落。在硬件加速一切的异构计算时代,也从长期的偏安一隅,正式走上前台,一直延续到现在的AI平民化,万物智能且互相连接的可编程世界。
从云到端,从地面到太空,各个行业,都在用芯片构造更加智能的二进制数字世界。FPGA正在帮助人们把对未来生活的美好想象,加速成为现实。
对设计进行故障注入测试,成为验证设计质量、评估可靠性,通行且有效的方法。
与源码、网表级的故障注入测试工具相比,直接对配置硬件电路的CRAM位流数据进行01改写的验证方式,具有“所见即所得、所改即所需”两大应用优势,眼见为实,精简高效。
比如对于Microblaze处理器的三模冗余设计,forgedaFX软件的实际测试显示,硬件电路使用的编程点,只有2309419 bits,占CRAM编程点(72868672 bits)的比例还不到3.17%,除此之外的编程点故障注入,因为与设计无关,不可能对功能有影响。
通常情况下,即便是复杂设计,也只有10%-40%的数据与用户的硬件电路有关,即forgedaFX软件通过分析得到的故障注入数据库(Fault Injection DB)。
在故障注入数据库中,根据用户对DUT运行结果的实际比对判断,能明显观测到对电路功能有影响的编程点数目,相对于海量配置编程点规模,比例不到10%。根据用户应用设计的复杂程度不同,典型占比在2%-5%之间。
通过使用forgedaFX软件,用EDA工具算力降低经验成本。利用数据分析结果,您将得以摆脱芯片底层技术实现的繁琐细节,快速优化设计,交付更好的产品,不只是提升效率。
该样例是一个简单的计数器设计,可作为硬件设计的“Hello World”程序使用,便于您快速创建第一个forgedaFX测试项目。
对应的Vivado设计文件(Vivado_counter_demo),以及故障注入测试项目(counter_demo),均位于forgedaFX软件demo目录,用户可参考查阅。
输入时钟为200 MHz,按1/4 秒计时输出,驱动4个LED灯滚动显示。
//===========================================================================
// Module name: led_test.v
//===========================================================================
`timescale 1ns / 1ps
module led_test
(
sys_clk_p, // Differentia system clock 200Mhz input on board
sys_clk_n,
rst_n, // reset ,low active
led, // LED,use for control the LED signal on board
fan_pwm //fan control
);
//===========================================================================
// PORT declarations
//===========================================================================
input sys_clk_p;
input sys_clk_n;
input rst_n;
output [3:0] led;
output fan_pwm;
//define the time counter
reg [31:0] timer;
reg [3:0] led;
assign fan_pwm =1'b0;
//===========================================================================
//Differentia system clock to single end clock
//===========================================================================
wire sys_clk;
IBUFGDS u_ibufg_sys_clk //专用原语,差分信号输入
(
.I (sys_clk_p),
.IB (sys_clk_n),
.O (sys_clk )
);
//===========================================================================
// cycle counter:from 0 to 1 sec
//===========================================================================
always @(posedge sys_clk or negedge rst_n)
begin
if (~rst_n)
timer <= 32'd0; // when the reset signal valid,time counter clearing
else if (timer == 32'd199_999_999) //1 seconds count(200M-1=199999999) 系统时钟200Mhz,
timer <= 32'd0; //count done,clearing the time counter
else
timer <= timer + 1'b1; //timer counter = timer counter + 1,每周期上升沿计数
end
//===========================================================================
// LED control
//===========================================================================
always @(posedge sys_clk or negedge rst_n)
begin
if (~rst_n)
led <= 4'b0000; //when the reset signal active
else if (timer == 32'd49_999_999) //time counter count to 0.25 sec,LED1 lighten
led <= 4'b0001;
else if (timer == 32'd99_999_999) //time counter count to 0.5 sec,LED2 lighten
begin
led <= 4'b0010;
end
else if (timer == 32'd149_999_999) //time counter count to 0.75 sec,LED3 lighten
led <= 4'b0100;
else if (timer == 32'd199_999_999) //time counter count to 1 sec,LED4 lighten
led <= 4'b1000;
end
endmodule
对应的约束文件:
############## clock define ##################
create_clock -period 5.000 [get_ports sys_clk_p]
set_property PACKAGE_PIN AE10 [get_ports sys_clk_p]
set_property IOSTANDARD DIFF_SSTL15 [get_ports sys_clk_p]
############## reset define ##################
set_property PACKAGE_PIN AG27 [get_ports rst_n]
set_property IOSTANDARD LVCMOS25 [get_ports rst_n]
################# fan define ##################
set_property IOSTANDARD LVCMOS25 [get_ports fan_pwm]
set_property PACKAGE_PIN AE26 [get_ports fan_pwm]
############## LED define ##################
set_property PACKAGE_PIN A22 [get_ports {led[0]}]
set_property IOSTANDARD LVCMOS15 [get_ports {led[0]}]
set_property PACKAGE_PIN C19 [get_ports {led[1]}]
set_property IOSTANDARD LVCMOS15 [get_ports {led[1]}]
set_property PACKAGE_PIN B19 [get_ports {led[2]}]
set_property IOSTANDARD LVCMOS15 [get_ports {led[2]}]
set_property PACKAGE_PIN E18 [get_ports {led[3]}]
set_property IOSTANDARD LVCMOS15 [get_ports {led[3]}]
############# Configurate Setting ##################
set_property CFGBVS VCCO [current_design]
set_property CONFIG_VOLTAGE 3.3 [current_design]
当您按照创建Vivado设计项目,导入以上约束文件时,请按照自己的硬件板卡定义进行修改。
该样例对应的Vivado设计文件(Vivado_fir_demo),以及故障注入测试项目(fir_demo),均位于forgedaFX软件demo目录。
(1) 结构及功能简介
本样例为采用双模冗余结构的FIR设计,如下图所示:
测试向量事先存储在inputROM中,由DUT和GOLDEN两个完全相同的FIR模块进行处理。在故障注入完成后,启动FIR处理,并由Checker模块进行比对检测,如果相同,则输出字符“0”,否则输出字符“1”。
上述设计对应的top.vhd描述如下:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;
-- **********************************************
-- ENTITY
-- **********************************************
-- Top Entity
entity top is
port( CLK : in std_logic; -- Clock
RST : in std_logic; -- Reset
Read : in std_logic; -- Read
Addr : in integer range 0 to 10; -- Address
ERR : out std_logic_vector(7 downto 0) -- Error Signal
);
end top;
-- **********************************************
-- ARCHITECTURE
-- **********************************************
architecture Behavior of top is
-- inputROM Component
component inputROM is
port( CLK : in std_logic; -- Clock
Read : in std_logic; -- Read
Addr : in integer range 0 to 30; -- Address
X : out signed(7 downto 0) -- X
);
end component;
-- DCT Component
component FIR is
port( CLK : in std_logic; -- Clock
RST : in std_logic; -- Reset
X : in signed(7 downto 0); -- Input
Y : out signed(15 downto 0) -- Output
);
end component;
-- Checker component
component checker is
port( CLK : in std_logic; -- Clock
RST : in std_logic; -- Enable
Addr : in integer range 0 to 30; -- Address
Y0 : in signed(15 downto 0); -- DCT Output 0
Y1 : in signed(15 downto 0); -- DCT Output 1
ERR : out std_logic_vector(7 downto 0) -- Error Signal
);
end component;
-- Signal Definition
signal X : signed(7 downto 0);
signal Y0, Y1 : signed(15 downto 0);
begin
ROM : inputROM port map(
CLK => CLK,
Read => Read,
Addr => Addr,
X => X
);
FIR1 : FIR port map(
CLK => CLK,
RST => RST,
X => X,
Y => Y0
);
FIR2 : FIR port map(
CLK => CLK,
RST => RST,
X => X,
Y => Y1
);
CHCK : checker port map(
CLK => CLK,
RST => RST,
Addr => Addr,
Y0 => Y0,
Y1 => Y1,
ERR => ERR
);
end Behavior;
对以上设计进行功能仿真,结果如下:
(2) 模块区域约束及编译属性设置
选择DUT FIR模块,设置区域约束:
create_pblock pblock_FIR1
add_cells_to_pblock [get_pblocks pblock_FIR1] [get_cells -quiet [list DUT/FIR1]]
resize_pblock [get_pblocks pblock_FIR1] -add {SLICE_X0Y70:SLICE_X7Y84}
set_property EXCLUDE_PLACEMENT 1 [get_pblocks pblock_FIR1]
set_property USE_DSP48 no [get_cells -quiet [list DUT/FIR1]]
再对CHCK检测模块、UART模块,设置区域约束
create_pblock pblock_CHCK
add_cells_to_pblock [get_pblocks pblock_CHCK] [get_cells -quiet [list DUT/CHCK UART]]
resize_pblock [get_pblocks pblock_CHCK] -add {SLICE_X12Y52:SLICE_X21Y68}
注意:在启动编译之前,请先进行属性设置,保持FIR/Checker模块设计,不会被编译器优化掉,如下图:
Vivado编译完成后,DUT FIR模块的布局布线结果如下,矩形坐标(Rectangles Properties)为(10,276,17,291)。
后续内容,将说明如何使用该矩形坐标,获得该模块对应的Fault Injection DB。
(3) forgedaFX数据分析与测试准备
启动forgedaFX 软件GUI,新建测试项目,在数据分析完成后,生成FIR设计对应的Fault Injection DB File, 即下图中result_record.txt。
同时,在界面输出如下概要信息。
只需要在总计72868672bit的配置存储器中,对其中63512 bits进行故障注入,即可覆盖该设计的全部Critical Bits。
选择以DUT FIR模块为目标对象,采用遍历方式注入故障,准备工作包括:
- 在测试项目目录下,新建file-input子目录
将完整位流文件复制到该目录,以便测试脚本使用
- 创建Block_Walkthrough子目录
将proAPI目录下的所有APIs,复制到该目录,供测试脚本直接调用
- 调用vGetRegion API,获得DUT FIR模块对应的Fault Injection DB File,即下图中的block_db.txt
从上图中输出的Total Bits in pBlock结果可知,该模块对应的待测编程点规模为26343 bits。
(4) 对FIR模块进行遍历测试
forgedaFX软件提供pblock_walkthrough测试脚本。
该程序遍历block_db.txt中的配置编程点,逐一进行故障注入,并在每个编程点故障注入操作完成后,从UART接口读取Checker模块比对结果,写入测试数据记录文件inject.rec。
在本FIR样例中,当发送“故障注入已完成”命令后,双模冗余设计启动运行,并由比较器输出结果。
若观测到UART输出字符“0”,表示该编程点SEU未导致设计功能故障;若输出“1”,则表示设计发生功能故障。
具体可在demo/fir_demo/Block_Walkthrough目录,查阅该测试脚本源代码。
在启动Vivado Tcl Shell之后,您可以直接输入
source -notrace pblock_walkthrough.tcl
启动遍历测试。
当测试结束后,可打开Vivado.log日志,查看详细执行过程。
各测试点地址及分类标识,均完整记录在inject.rec文件中,供用户查阅。
上图中的第一条数据记录“0042019E-042-17”,表示该测试点位于地址为0x0042019E的配置帧, 具体位置为第42个字,第17位。
图中的“1-1-0”,代表Injected 标识为1,SEU故障已成功注入该测试点;
Critical 标识为1,表示检测到模块功能故障,该编程点为“关键位”;
Recoverable标识为0,表明即使通过Frame Restore,重新写入原有配置帧,模块功能也无法恢复正常,此时需要重新下载位流。
图中的“1-0-1”,代表SEU故障已成功注入该测试点(Injected = 1),并未导致功能故障(Critical = 0),且功能恢复标识置为1(Recoverable = 1)。
以上所有测试点的统计数据,记录在summary.txt文件中。
测试汇总数据如下表所示:
forgedaFX除了用于对硬件设计进行故障注入测试,也支持对较为复杂的SoC进行验证。本样例为内嵌Microblaze软核处理器的SoC系统,用于运行AES加密处理软件。
(1) SoC结构简介
下图是该SoC样例的系统结构,主要包括256M DDR,32K 指令存储模块,以及UART、LED等外设。
选择Microblaze处理器中的指令控制模块Data_Flow_I作为测试对象,并设置区域约束:
create_pblock pblock_Data_Flow_I
add_cells_to_pblock [get_pblocks pblock_Data_Flow_I] [get_cells -quiet [list design_1_i/microblaze_0/U0/MicroBlaze_Core_I/Performance.Core/Data_Flow_I]]
resize_pblock [get_pblocks pblock_Data_Flow_I] -add {SLICE_X104Y52:SLICE_X125Y99}
resize_pblock [get_pblocks pblock_Data_Flow_I] -add {DSP48_X3Y22:DSP48_X4Y39}
resize_pblock [get_pblocks pblock_Data_Flow_I] -add {RAMB18_X3Y22:RAMB18_X4Y39}
resize_pblock [get_pblocks pblock_Data_Flow_I] -add {RAMB36_X3Y11:RAMB36_X4Y19}
set_property EXCLUDE_PLACEMENT 1 [get_pblocks pblock_Data_Flow_I]
Vivado编译完成后,该模块对应的布局布线结果如下:
后续内容将使用上图中的(149, 261, 185, 309) 矩形区域坐标,获得该模块对应的Fault Injection DB File。
(2) 运行在CPU上的AES目标程序
在Vivado设计成功生成Bitstream后,导出SoC系统硬件,新建SDK项目,并导入aes_test软件。
该软件运行在Microblaze处理器上,对事先存储在DDR中的测试向量,进行AES加密处理,并与事先准备好的Golden测试结果进行比对,如果相同,向UART端口输出字符0;否则,输出字符0。
以下为aes_test.c主程序片段。
编译链接脚本设置如下:
_STACK_SIZE = DEFINED(_STACK_SIZE) ? _STACK_SIZE : 0x10000;
_HEAP_SIZE = DEFINED(_HEAP_SIZE) ? _HEAP_SIZE : 0x10000;
/* Define Memories in the system */
MEMORY
{
microblaze_0_local_memory_ilmb_bram_if_cntlr_microblaze_0_local_memory_dlmb_bram_if_cntlr : ORIGIN = 0x50, LENGTH = 0x7FB0
mig_7series_0 : ORIGIN = 0x80000000, LENGTH = 0x40000000
}
编译后的aes_test.elf程序大小为160K,存储在DDR中。
(3) forgedaFX数据分析与测试准备
启动forgedaFX软件,新建测试项目,在数据分析完成之后,获得该SoC设计对应的Fault Injection DB File,规模为3913364 Bits。
选择Microblaze处理器的指令控制模块Data_Flow_I,随机注入故障,准备工作包括:
- AES软件下载及启动控制
本样例提供了相应的控制脚本,由XSCT命令组成,在运行时可直接调用。
- 在测试项目文件夹,新建file-input目录
如上图示,将包含bootloop.elf程序的完整位流文件(download.bit)、AES测试程序 (aes_test.elf)、以及AES下载及启动控制脚本(aes_load.tcl、aes_check.tcl),全部复制到该目录。
- 创建Block_Test_Random子目录;
将proAPI目录下的所有API,复制到该目录,以便直接调用。
- 先调用vGetRegion API,获得Data_Flow_I硬件模块对应的Fault Injection DB File,即下图中的block_db.txt
该SoC系统,以及目标硬件模块的测试数据规模如下:
继续调用vRandomBits,从该目标模块中随机抽取2000个点,生成相应的Fault Injection DB File,即下图中的block_r2000.txt。
以上步骤准备就绪,即可启动随机测试。
(4) 对CPU控制模块进行随机测试
该样例通过pblock_random测试脚本进行随机测试。
该脚本从随机测试数据库文件block_r2000.txt中逐一读取编程点,进行故障注入,在对编程点注入故障后,启动AES软件,并从UART接口读取比对结果,并写入测试记录文件inject_rand.rec。
具体过程可查阅Block_Random目录中的测试脚本。
直接通过
source -notrace pblock_random.tcl
启动随机测试。
注意:在测试过程中,如需中断运行,可直接在Block_Walkthrough目录创建名为stop_sig.txt的空白文件,安全退出当前测试。并在下次重新启动测试之前,清除该文件即可。
详细过程记录在Vivado.log中,在测试结束后,可随时查阅。
也可通过inject_rand.rec,查看各编程点的地址和测试结果。
summary.txt文件,记录了本次测试的概要信息。
测试结果如下表:
forgedaFX故障注入测试软件,历经近十年的迭代,现已支持对赛灵思公司的全部芯片。为帮助用户真正节省成本“不浪费”,每款软件均与具体芯片型号绑定使用,并以其作为软件产品型号的命名规则,您可按照使用的FPGA芯片,选择对应的软件型号即可。
本文档样例所使用的forgedaFX-325T软件为例,可支持两大类别、共51款Xilinx 7K-325T芯片。
复及科技全自主开发的系列位流级别EDA软件,充分借鉴云计算领域先进的微服务模式,将复杂系统分而治之,只聚焦一个特定的业务功能和业务需求,在硬件加速一切的异构计算时代,为用户提供高效易用的全新解决方案。
正版,好用,不贵。
您在使用过程中如有需要任何帮助或建议,可发送至viewall@forgeda.com
全文完,感谢您的耐心阅读