当前位置: 首页 > news >正文

如何将FPGA设计的验证效率提升1000倍以上(4)

本文为系列文章的完结篇。

用户应用设计中的信号,在经历编译器的多次迭代优化之后,在FPGA芯片内部运行时,可能已经被重新命名、“改头换面”或“机里机气”。要想以人工经验进行追踪,构建目标寄存器信号与RTL设计源码之间的映射关系,往往耗时且费力。

用户可通过forgedaX软件提供“一键溯源”功能,以自动化方式,快速构建RTL 源码与芯片内部寄存器信号之间的精准映射关系,用EDA工具的自动化算力,直接代替或高效辅助以往建立在大量工程实践基础上才能具备的手工寻址过程,进一步提升定位解决问题的工作效率。

所见即所得(Full Visibility):无需事先在源码或网表级别植入探针,即可获得对整个系统的可观测能力(Global State Visibility),这是厂商ILA/Chipscope工具无法提供的能力。

所改即所需(Controllability):直接在FPGA位流级别完成0/1数据改写,没有硬件重新编译过程。

以下为正文

forgedaX软件的“溯源”功能,是将布局布线后的网表信号,与RTL源码精准对应(Mapping the FPGA registers to the RTL source code),帮助用户加快问题的定位,实现加速设计左移;

然后是如何在集成事件断点功能的基础上,通过对状态机(FSM)、关键寄存器(Key Register)的0/1数据改写,以硬件速度进行故障注入,在线查看待测设计(DUT)的反应。

01 信号的RTL溯源功能

Step 1  功能安装与卸载

在您选择目标信号,并首次使用“Trace to RTL”功能时,将自动在后台安装该功能。

安装成功后,在Vivado工具栏,将显示名为“sigTrace”的forgedaX软件专属溯源图标,如下图所示。

注意:首次安装时,如果Vivado已处于打开状态,请先退出。在重新启动后,将载入并显示已安装的forgedaX sigTrace功能按钮

如果您想删除已安装的RTL溯源功能图标,可通过Vivado工具栏中的“Tools -> Custom Commands -> Custom Commands”菜单项,进行设置。

进入到“自定义功能按钮设置”对话框,点击删除按钮,即可卸载该图标。

Step 2 ​​​​​​​ 点击forgedaX软件“Trace to RTL”功能

在forgedaX调试界面,选择任意目标信号,依次点击信号追踪功能“Trace to RTL”,将其增加到待追踪分析的信号列表中。

Step 3 ​​​​​​​ 信号溯源

在forgedaX软件已经对目标信号进行精准定位的基础上,用户可利用在Vivado环境“Go to Source”功能,直接查找对应的RTL源码。

例如,以上一篇文章中counter为例,使用“Trace to RTL”功能,对信号inst_count/count_reg[3]进行溯源分析。

先在Vivado工具中打开counter样例设计,点击forgedaX软件专属溯源功能按钮sigTrace,将自动加载目标信号的电路图(Schematic)。

单击电路图中高亮显示的count_reg[3]目标信号,显示如下:

继续点击右键,在赛灵思给出的功能菜单中选择“Go to Source(F7)”。

自动加载该信号对应的RTL源码,并用黄色高亮显示相应的代码行位置,如下图所示。

如果选择的是inst_count/count_o[0],Vivado左下的Net Properties窗口栏显示类型为SIGNAL。

此时,表示该信号为互连线,无法直接定位RTL源码,但用户可在电路图中,选择驱动该互连线的相邻寄存器信号count_out_reg[0],进行溯源操作。

02  对状态机和关键寄存器的故障注入

对包含UART、以太网等通信接口在内,较复杂的FPGA应用开发设计,通过集成事件断点方式,由用户自定义的事件触发信号来冻结时钟,对设计中的状态机和关键寄存器直接进行故障注入,以高效便捷的方式,服务日常调试验证。

即便是那些FPGA在运行数小时、甚至数天,才能“重现”的事件,您也能够按照自己的调试验证需要,在设定的事件触发时点,对目标状态机和关键寄存器信号的值,进行一次或者多次0 ->1、1 -> 0 改写,在线查看待测目标设计(DUT)的反应。

以下以本系列文章第二篇中的uart通信为例,介绍如何对选择的状态机、关键寄存器信号进行在线故障注入。

如下图所示,uart样例在初始化结束后,发送完整的欢迎消息。在首个断点处,输出字符“T”之后暂停运行。

Step 1 ​​​​​​​ 点击“Get Value”,获取目标信号值

选择“已发送字符的计数指针strIndex”作为关键寄存器信号,对其进行故障注入操作。

Step 2 ​​​​​​​ 在“Value Write”的数据列表中,直接进行0/1数据改写

将strIndex_reg[3]的值,从0 改写为1,如下图所示 。

Step 3 ​​​​​​​ 点击“Fault Injection”,对目标信号进行强制赋值,完成在线故障注入

此时,strIndex_reg[4:0]从“00101”,原位修改为“01101”,即从“已发送5个字符”,更改为“已发送13个字符”。

Step 4 ​​​​​​​ 释放冻结的时钟,设计恢复全速运行

在界面左侧“Programming and Clock Control”区域,输入“FFFF_FFFF_FFFF_FFFF”,点击“Set Breakpoint”,清除硬件断点,使FPGA继续全速运行。

在“串口调试助手”界面中,显示DUT运行结果:输出被错误截断的消息。

对目标状态机的故障注入操作,与关键寄存器的操作过程完全相同。

以uart样例中的“数据发送状态机”state为例,点击“暂停运行"按钮,把uartState[2:0]从101(WAIT_BTN),强制赋值为010(SEND_CHAR),再通过“Fault Injection”确认以上更改,完成故障注入操作。

在释放时钟,设计恢复全速运行后,UART状态机进入“跑飞”的无限循环状态。

对信号进行故障注入的工作机制,就像在软件仿真中使用“强制赋值操作”类似。前者是直接用FPGA的硬件速度完成(真实物理世界),后者是依赖CPU算力进行(数字逻辑世界),两者在验证效率上,有几个数量级的差异。

对于非常简单的counter设计,软件仿真速度通常只有几K Hz,而FPGA是100M Hz;对于更复杂的设计,前者的速度在极端情况下,比如EDA硬件辅助验证行业的超大规模设计,软仿速度甚至低至几个Hz,FPGA高性能原型验证平台可达数M Hz以上,用FPGA制造的硬件仿真平台(Emulation),性能则是介于两者之间。

同样的,对于状态机(FSM)、关键寄存器(Key Register)的故障注入效率,在真实硬件环境下,可将FPGA冻结时钟、在暂停运行时,在位流级别直接对01数据进行改写,即可完成,没有硬件重新编译的时间开销,以硬件速度进行故障注入,效率自然比软件仿真要快数千倍以上。

换而言之,我们就是把EDA硬件辅助验证行业已经长期成熟使用的技术,在易用性、可获得性等方面进行创新和深度重构后,使“普通/常规”的FPGA应用开发设计,也能使用,因为前者的诸多调试验证技术,本身就是来源赛灵思、然后再“高于”赛灵思的,两者技术同源。

Using emulation to verify today's complex designs

source:用硬件仿真工具验证今天的复杂设计

在提供EDA硬件辅助验证服务的三大核心能力象限中,除了专用于超大规模IC设计的“划片(Partitionning)”技术外,像在线调试和信号可见性(Debugging/Visibility)技术,IC设计和FPGA应用开发,两者完全一样,并且随着FPGA自身越来越先进、容量规模更大,换句话说,FPGA应用市场的用户,类似的先进技术同样可以用来服务日常的设计开发;

用户使用此类EDA工具可以获得的诸多收益是,不仅能够加快设计开发效率,还可以提升设计质量,进而提升产品可靠性、系统可用性。

软件下载地址:https://www.gitee.com/forgeda,解锁更多位流级别EDA工具相关信息。

全文完,感谢您的耐心阅读

http://www.dtcms.com/a/278232.html

相关文章:

  • Flink数据流高效写入MySQL实战
  • 大模型微调(一):基于Swift框架进行自我认知微调(使用Lora微调Qwen3-8B模型)
  • 芯片相关必备
  • 初识drag2框架,drag2注入的基本原理
  • [Python 基础课程]元组
  • HashMap 和 ConcurrentHashMap 的区别
  • JAVA学习笔记 JAVA开发环境部署-001
  • 【Datawhale夏令营】用AI做带货视频评论分析
  • Origin自带的悬浮尺子,Screen Ruler的最佳平替
  • C# 接口(接口可以继承接口)
  • 终极剖析HashMap:数据结构、哈希冲突与解决方案全解
  • 【面板数据】上市公司诉讼风险、诉讼次数等数据集(2007-2023年)
  • 【LeetCode100】--- 4.移动零【复习回顾】
  • 剑指offer58_和为S的连续正数序列
  • 深入理解 LangChain:AI 应用开发的全新范式
  • 人工智能到底是什么?揭开 AI 的神秘面纱
  • Spring @Autowired:依赖注入的核心奥秘
  • markdown-it-mathjax3-pro —— 新一代 Markdown 数学公式渲染插件
  • 代码精进之路
  • NumPy 中 np.c_ 的用法解析
  • Prometheus 第一篇:快速上手
  • 哪些行业的“反内卷”前景更好?
  • DL00454-深度学习牲畜资产管理圈养生猪行为识别含数据集
  • Docker搭建Redis哨兵集群
  • 代码部落 20250713 CSP-S复赛 模拟赛
  • Windows上使用配置Claude Code教程
  • 软件文档体系深度解析:工程视角下的文档架构与治理
  • 知识图谱构建简单分享
  • Task-driven Image Fusion with Learnable Fusion Loss
  • 嵌入式固件 .pkg 打包流程