仿真调试说明——摘抄龙芯杯官方文件

news2024/11/17 17:48:18

1.仿真调试说明

你需要具备以下知识:

  • 仿真工具的使用,比如Vivado的Xsim
  • Verilog的基本语法
    通过本文的学习,你将获得:
  • 各类仿真错误排查的方法
  • CPU逻辑出错的调试指导
  • Verilog 运算符的优先级
1.1 调试指导思想概述

全局上的调试原理是从结果推原因,难点是定位错误的源头。本文档编写采用的调试思路是时间上先定错,空间上再定错。

  • 时间上先定错:在出错的大片时间段里,定位出源头部分,源头部分是一个较小的时间段
  • 空间上再定错:在源头时间段里,查看设计电路的控制部分和数据通路,定位是哪个信号带来的错误,或者是哪几个信号的组合带来的错误,或者是设计上哪里有疏忽带来的错误。
    比如一个设计的CPU在执行测试程序出错了,这个程序是分很多指令的,这些指令是在时间上顺序执行的,我们首先需要找出第一个错误的指令(也就是时间上定位错误),随后在CPU的数据通路和控制信号里定位该指令错误的原因(也就是空间上定位错误)。
    时间上的定位更加困难。
1.2 仿真出错分类
  • 波形出错:从波形图里直接观察,而不需要分析电路设计的功能,就能判断的错,比如波形中信号为“X”。
  • 逻辑出错:波形直接观察很正常,但其电路执行结果不符合预期,属于逻辑出错,比如加法器运行结果不正确
1.3 出错分类一:波形出错
  • 发现信号为“Z”。
    “Z”表示高阻,电路短路了就是显示为高阻,往往是模块调用的信号未连接导致的信号悬空。
    在这里插入图片描述
    编码建议:
  1. 编写时注意代码规范,特别是模块调用时,按接口顺序一一对应
  2. 所有input类接口被调用时不允许悬空
  3. 一旦发现一个信号为“Z”,向前追踪产生该信号的因子信号,看是那个为“Z”,一直追踪下去指导追踪到该模块里的input接口,随后进行修正。
  4. 有可能“Z”,只出现在向量信号里的某几位上,也是一样的追踪,有可能调用时某个接口存在宽度不匹配也会带来“Z”。
  • 发现信号为“X”
    "X"表示不定值,往往是RTL里信号未赋值导致
    在这里插入图片描述
    另外 Vivado 对于多驱动(2个及2个以上电路单元驱动同一信号),仿真时也会产生“X”,先进行综合,观察下Critical warning,此时会爆出多驱动的警告。
    建议:
    针对信号为“X”情况,我们有以下几点建议:
  1. 向前追踪该信号的因子信号,看是那个为“X”,一直追踪下去指导追踪到某个信号未赋值,随后修正。
  2. 如果没有因子为“X”的,则很可能是多驱动导致的,则综合排查Error和Critical warning。
  3. 寄存器型信号如果没有复位值,在复位阶段其他值可能为“X”,这可能并不会带来错误
  4. “X”和“1”进行或运算结果为“1”,“X”和“0”进行或结果为“0”.
  • 波形停止
    波形停止是指仿真停止某一时刻,再也无法前进分毫,而仿真却显示不停地在运行。
    波形停止基本都是由于组合环路导致的,所谓组合环路就是信号A的组合逻辑表达式中某个产生因子为B,而B的组合逻辑表达式中又用到了信号A。仿真器是在每个周期内计算该周期的所有表达式,组合逻辑循环嵌套,带来的是仿真器的循环计算,导致其无法退出该计算,带来波形停止。
    建议
  1. 一旦发现波形停止,先对设计进行综合
  2. 查看综合后产生的Error和Critical warning,并尝试修正。
  • 越沿采样:上升沿采样到被采样数据在上升沿后的值
    在波形出错中,是一个隐藏较深的出错,往往可能会和逻辑出错混在一起。
    越沿采样是指一个被采样的信号在上升沿采样到了其在上升沿的值,一般情况下,认为这是一个错误。
    每一次赋值,分为两步:先计算等式左侧的表达式和赋值给右侧的信号,简记为计算和赋值。在一个上升沿到来时,所有由上升沿驱动的信号按照以下顺序进行处理:
  1. 先处理阻塞赋值,先完成计算和赋值,同一信号完成计算后立马进行赋值。同一always块里的阻塞赋值从上到下按顺序串行执行,不同always块里的阻塞赋值依赖工具实现确定顺序串行执行,一一完成计算和赋值。
  2. 再进行非阻塞赋值的计算。所有非阻塞赋值其等式左侧的值都同时计算好
  3. 上升沿结束时,所有非阻塞赋值同时完成最终的赋值动作。
    建议
  4. 所有always写的时序逻辑只允许采用非阻塞赋值
  5. 一旦发现越沿采样的情况,追踪被采样信号,指导追踪到某一阻塞赋值的信号,随后进行修正。
  • 其他,波形怪异:仿真波形图显示怪异,与设计的电路功能无关的错误
    当出现波形怪异类的错时,需要区分其是仿真工具还是RTL代码出错:
  1. 观察出错的信号,看其生成因子,如果自我判断RTL应该没有,且波形现实却是太怪异,则有可能是仿真工具出错。重启电脑或者重启工程。
  2. 如果无法从波形里区分是什么错误。可以尝试先运行综合,看出综合后的Error、Critical warning和warning。
  3. 经常有一些不符合规范的代码,Vivado也不会报出warning。比如:对input信号进行了赋值,模块调用信号连接错误,reset信号接成了clock信号等等。
1.4 逻辑出错

以数据和控制分开来看,逻辑出错可分为两类:数据通路出错和控制信号出错。其中数据通路通常属于较简单的错,比如加法器算两个加数的和,结果不对;而控制信号往往是设计时的边角问题考虑不周导致的,比如CPU的访存系统出错。

CPU逻辑出错调试

对于流水线CPU需要各流水线信号分组抓出,比如抓出每级流水线里的PC值、指令编码和执行结果。流水级间的进入和退出的控制信号也尤其重要,必须抓出,CPU初期调试往往都是流水线控制出错了。还有顶层总线接口也很重要,一旦取指出错了,或者调试访存指令出错了,就需要关注顶层总线接口上的信号了,CPU后期调试往往都是访存系统出错了。

  • 定位出错时间源头
    定位错误前,需要大家做好以下三项准备:
    首先,需要先理解测试程序的大致行为。理解过程中需要阅读测试程序的源码,CPU设计中会运行的程序有两类:功能测试程序func和性能测试程序coremark、dhrystone等。
    再者,需要对mips汇编和func编译环境有一定了解。我们在功能和性能测试程序的编译环境中会生成如下8个文件,位于编译目录的obj/下。其中test.s是我们调试过程中重点关注的,它对执行程序的每条机器指令进行了反汇编和注释,对我们调试很有帮助。
    在这里插入图片描述
    最后,需要对CPU内部逻辑比较熟悉。
    具体调试时,可以采用以下方案:
  • 在波形最后出错处,确认取回的指令和PC值是对应正确的,也就是确认取值正确,这时需要对照反汇编程序test.s
  • 如果取指不正确,则往前追溯,直到第一个取指正确的地方。追溯的方法也有讲究。追溯过程就是程序不停的压缩,指导找到第一个取值正确的地方,此时往往要用到仿真工具中加标签的方法()。
  • 找到第一个指令正确的地方后,可以先确认该指令执行结果是否正确。随后我们的测试目标是确认时间上的第一个出错的地方是在该指令前还是该指令后。
  • 以上方法是由后往前追,如果追溯过程中发现无法再追了,则可以考虑由前往后追。
定位出错空间源头

空间定错时,需要大家对CPU微架构有更深入的理解。建议大家以空间划分的视角去理解CPU,特别是流水线CPU,每一流水级都是有对应的部件的,应当理解清楚各流水级的划分。
空间定位时,有两种方法:

  • 从CPU流水前端向流水后端排查,确认指令在哪个流水级开始出错。
  • 从CPU流水后端向流水前端排查,确认指令是从哪个流水级出错的。
运算符号优先级

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1060093.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ChainForge:衡量Prompt性能和模型稳健性的GUI工具包

ChainForge是一个用于构建评估逻辑来衡量模型选择,提示模板和执行生成过程的GUI工具包。ChainForge可以安装在本地,也可以从chrome浏览器运行。 ChainForge可以通过聊天节点对多个对话可以使用不同的llm并行运行。可以对聊天消息进行模板化,并…

systrace/perfetto抓取方式分享

背景 近来有一些同学反馈性能分析,现在大部分都是其实已经开始使用perfetto了,连sdk上都已经找不到哦systrace相关工具,让马哥可以分享一些这个相关内容,其实以前企业里面那时候大部分都是使用老版本systrace的,相比新…

量化交易全流程(六)

本节目录 多因子风险模型 自从股票市场产生以来,大量的学者、业界人员都在研究股票的价格波动究竟是由什么决定的。一个明显的事实是,股票的价格波动一定是由多种因素决定的,比如大盘因素、市值因素和行业因素。对于大盘因素,股…

【Linux】Linux常用命令—文件管理(上)

创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞 关注支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; &#x1f525;c系列专栏&#xff1a;C/C零基础到精通 &#x1f525; 给大…

Mysql内置函数、复合查询和内外连笔记

目录 一、mysql内置函数 1.1.日期函数 1.2.字符串函数 1.3.数学函数 1.4.其他函数 二、复合查询 2.2 自连接 2.3 子查询 2.3.1单行自查询 2.3.2 多行子查询 2.3.3 多列子查询 2.3.4在from子句中使用子查询 2.3.5合并查询 三、表的内连和外连 3.1内连接 3.2外连接…

KNN算法与SVM支持向量机

KNN算法 KNN算法就是把要分类的对象&#xff08;例如一个特征向量&#xff09;与训练集中已知类标记的所有对象进行对比&#xff0c;并由K近邻对分类对象进行判断为那个类别。这种方法的效果好&#xff0c;但是也有弊端&#xff0c;与K-means聚类算法一样&#xff0c;需要先预…

【微服务】springboot整合neo4j使用详解

一、前言 在上一篇我们详细了解了neo4j的使用&#xff0c;从搭建到相关的语法操作&#xff0c;本篇紧接着之前的内容&#xff0c;来详细聊聊如何在springboot应用中集成和使用neo4j。 二、Spring Data Neo4j 和很多其他的中间件类似&#xff0c;都提供了类似jpa的方式与sprin…

sheng的学习笔记-【中文】【吴恩达课后测验】Course 1 - 神经网络和深度学习 - 第二周测验

课程1_第2周_测验题 目录&#xff1a;目录 第一题 1.神经元计算什么&#xff1f; A. 【  】神经元计算激活函数后&#xff0c;再计算线性函数&#xff08;zWxb&#xff09; B. 【  】神经元计算一个线性函数&#xff08;zWxb&#xff09;&#xff0c;然后接一个激活函数…

【Stm32-F407】Keil uVision5 的安装

文章内容如下&#xff1a; 1&#xff09;Keil uVision5 安装包的获取2&#xff09;Keil uVision5 的安装3&#xff09;Keil uVision5 中 Stm32-F407 芯片包的获取与安装4&#xff09;注册 Keil uVision5 1&#xff09;Keil uVision5 安装包的获取 Keil uVision5 安装包链接: h…

【LeetCode热题100】--199.二叉树的右视图

199.二叉树的右视图 思路&#xff1a; 使用根->右->左方法进行遍历节点&#xff0c;同时记录层数&#xff0c;将当前层数与记录的层数进行比较&#xff0c;如果当前层数大于记录的层数&#xff0c;添加该元素&#xff0c;若当前层数小于记录的层数&#xff0c;说明该层已…

接口测试复习

一。基本概念 接口概念&#xff1a;系统与系统之间 数据交互的通道。 接⼝测试概念&#xff1a;校验 预期结果 与 实际结果 是否⼀致。 特征&#xff1a; 测试⻚⾯测试发现不了的问题。&#xff08;因为&#xff1a;接⼝测试 绕过前端界⾯。 &#xff09; 符合质量控制前移理…

Python PEP8 代码规范常见问题及解决方案

Win11查看安装的Python路径及安装的库 Python3(基础|高级)语法实战(|多线程|多进程|线程池|进程池技术)|多线程安全问题解决方案 Python PEP8 代码规范常见问题及解决方案 Python3操作MySQL8.XX创建表|CRUD基本操作 Python3操作SQLite3创建表主键自增长|CRUD基本操作 anac…

为什么要用PLL时钟芯片替换传统晶体和振荡器?

随着社会智能化程度越来越高&#xff0c;数字化转型全面加速&#xff0c;市场对电子系统的精确度要求也越来越高&#xff01; 电子系统&#xff0c;如何保障运行精确度&#xff1f; 一般情况下需要用到“时钟信号”&#xff0c;用来同步各种组件的操作体系对应的数字逻辑&…

stm32之雨滴传感器使用记录

一、简介 雨滴传感器、烟雾传感器&#xff08;MQ2&#xff09;、轨迹传感器、干黄管等的原理都类似&#xff0c;都是将检测到的信号通过LM393进行处理之后再输出&#xff0c;可以输出数字信号DO&#xff08;0和1&#xff09;和模拟信号A0。 雨滴传感器在正常情况下是AO输出的是…

插入排序:简单而有效的排序方法

在计算机科学中&#xff0c;排序算法是一个重要且常见的主题&#xff0c;它们用于对数据进行有序排列。插入排序&#xff08;Insertion Sort&#xff09;是其中一个简单但有效的排序算法。本文将详细解释插入排序的原理和步骤&#xff0c;并提供Java语言的实现示例。 插入排序的…

react项目从webpack迁移到vite的解决方案

虽然webpack是前端工程编译工具的王者&#xff0c;但是最近vite牛逼吹的震天响&#xff0c;说什么开发/生产打包速度甩webpack 100条街。不管是不是事实&#xff0c;总得尝试一下吧。 于是说干就干&#xff0c;在网上找了很多资料&#xff0c;终于搞定了&#xff0c;以下就是r…

QT实现TCP服务器客户端

服务器 .cpp #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);//实例化一个服务器server new QTcpServer(this);// 此时&#xff0c;服务器已经成功进入监听状…

区间搜索指令(博途SCL)

S型速度曲线行车位置控制,停靠位置搜索功能会用到区间搜索指令,下面我们详细介绍区间搜索指令的相关应用。 S型加减速行车位置控制(支持点动和停车位置搜索)-CSDN博客S型加减速位置控制详细算法和应用场景介绍,请查看下面文章博客。本篇文章不再赘述,这里主要介绍点动动和…

sheng的学习笔记-【中文】【吴恩达课后测验】Course 1 - 神经网络和深度学习 - 第一周测验

课程1_第1周_测验题 目录&#xff1a;目录 第一题 1.“人工智能是新电力” 这个比喻指的是什么&#xff1f; A. 【  】人工智能为我们的家庭和办公室的个人设备供电&#xff0c;类似于电力。 B. 【  】通过“智能电网”&#xff0c;人工智能正在传递新一波的电力。 C. …

【多级缓存】

文章目录 1. JVM进程缓存2. Lua语法3. 实现多级缓存3.1 反向代理流程3.2 OpenResty快速入门 4. 查询Tomcat4.1 发送http请求的API4.2 封装http工具4.3 基于ID负载均衡4.4 流程小结 5. Redis缓存预热 传统的缓存策略一般是请求到达Tomcat后&#xff0c;先查询Redis&#xff0c;如…