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

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.mzph.cn/news/95031.shtml

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

相关文章

多卡片效果悬停效果

效果展示 页面结构 从页面的结构上看&#xff0c;在默认状态下毛玻璃卡片是有层次感的效果叠加在一起&#xff0c;并且鼠标悬停在卡片区域后&#xff0c;卡片整齐排列。 CSS3 知识点 transform 属性的 rotate 值运用content 属性的 attr 值运用 实现页面整体布局 <div …

案例题--Web应用考点

案例题--Web应用考点 负载均衡技术微服务XML和JSON无状态和有状态真题 在选择题中没有考察过web的相关知识&#xff0c;主要就是在案例分析题中考察 负载均衡技术 应用层负载均衡技术 传输层负载均衡技术 就近的找到距离最近的服务器&#xff0c;并进行分发 使用户就近获取…

S32K144 GPIO编程

前面的文章介绍了如何在MDK-Keil下面进行S32K144的开发&#xff0c;下面就使用该工程模板进行GPIO LED的编程试验。 1. 开发环境 S32K144EVB-Q100开发板MDK-Keil Jlink 2. 硬件连接 S32K144EVB-Q100开发板关于LED的原理图如下&#xff1a; 也就是具体连接关系如下&#xf…

【C++】vector相关OJ

文章目录 1. 只出现一次的数字2. 杨辉三角3. 电话号码字母组合 ヾ(๑╹◡╹)&#xff89;" 人总要为过去的懒惰而付出代价ヾ(๑╹◡╹)&#xff89;" 1. 只出现一次的数字 力扣链接 代码展示&#xff1a; class Solution { public:int singleNumber(vector<i…

6-1 选择排序

#include <stdio.h>#define N 1000 int arr[N];/* 对长度为n的数组arr执行选择排序 */ void selectionSort(int arr[], int n);/* 打印长度为n的数组arr */ void printArray(int arr[], int n);void swap(int *xp, int *yp) {int temp *xp;*xp *yp;*yp temp; }int mai…

uniapp iOS离线打包——如何创建App并提交版本审核?

uniapp 如何创建App&#xff0c;并提交版本审核&#xff1f; 文章目录 uniapp 如何创建App&#xff0c;并提交版本审核&#xff1f;登录 appstoreconnect创建AppiOS 预览和截屏应用功能描述技术支持App 审核信息 App 信息内容版权年龄分级 价格与销售范围App 隐私提交审核 登录…

华为云云耀云服务器L实例评测|安装搭建学生成绩管理系统

1.前言概述 华为云耀云服务器L实例是新一代开箱即用、面向中小企业和开发者打造的全新轻量应用云服务器。多种产品规格&#xff0c;满足您对成本、性能及技术创新的诉求。云耀云服务器L实例提供丰富严选的应用镜像&#xff0c;实现应用一键部署&#xff0c;助力客户便捷高效的在…

mybatis-plus控制台打印sql(mybatis-Log)

配置了mybatis-plus.configuration.log-implorg.apache.ibatis.logging.stdout.StdOutImpl&#xff1b;但是mybatis执行的sql没有输出 需要检查点&#xff1a; 1、日志级别设置&#xff1a;请确保你的日志级别配置正确。如果日志级别设置得太低&#xff0c;可能导致SQL语句不…

计算机竞赛 题目:基于LSTM的预测算法 - 股票预测 天气预测 房价预测

文章目录 0 简介1 基于 Keras 用 LSTM 网络做时间序列预测2 长短记忆网络3 LSTM 网络结构和原理3.1 LSTM核心思想3.2 遗忘门3.3 输入门3.4 输出门 4 基于LSTM的天气预测4.1 数据集4.2 预测示例 5 基于LSTM的股票价格预测5.1 数据集5.2 实现代码 6 lstm 预测航空旅客数目数据集预…

【kubernetes】CRI OCI

1 OCI OCI(Open Container Initiative)&#xff1a;由Linux基金会主导&#xff0c;主要包含容器镜像规范和容器运行时规范&#xff1a; Image Specification(image-spec)Runtime Specification(runtime-spec)runC image-spec定义了镜像的格式&#xff0c;镜像的格式有以下几…

【多级缓存】

文章目录 1. JVM进程缓存2. Lua语法3. 实现多级缓存3.1 反向代理流程3.2 OpenResty快速入门 4. 查询Tomcat4.1 发送http请求的API4.2 封装http工具4.3 基于ID负载均衡4.4 流程小结 5. Redis缓存查询5.1 实现Redis查询 6. Nginx本地缓存6.1 本地缓存API6.2 实现本地缓存查询 7. …

Django的模版使用(Django-03)

一 模版的使用 模板引擎是一种可以让开发者把服务端数据填充到html网页中完成渲染效果的技术。它实现了 把前端代码和服务端代码分离 的作用&#xff0c;让项目中的业务逻辑代码和数据表现代码分离&#xff0c;让前端开发者和服务端开发者可以更好的完成协同开发。 静态网页&…

深度学习笔记_4、CNN卷积神经网络+全连接神经网络解决MNIST数据

1、首先&#xff0c;导入所需的库和模块&#xff0c;包括NumPy、PyTorch、MNIST数据集、数据处理工具、模型层、优化器、损失函数、混淆矩阵、绘图工具以及数据处理工具。 import numpy as np import torch from torchvision.datasets import mnist import torchvision.transf…

用向量数据库Milvus Cloud 搭建AI聊天机器人

加入大语言模型(LLM) 接着,需要在聊天机器人中加入 LLM。这样,用户就可以和聊天机器人开展对话了。本示例中,我们将使用 OpenAI ChatGPT 背后的模型服务:GPT-3.5。 聊天记录 为了使 LLM 回答更准确,我们需要存储用户和机器人的聊天记录,并在查询时调用这些记录,可以用…

redis的持久化消息队列

Redis Stream Redis Stream 是 Redis 5.0 版本新增加的数据结构。 Redis Stream 主要用于消息队列&#xff08;MQ&#xff0c;Message Queue&#xff09;&#xff0c;Redis 本身是有一个 Redis 发布订阅 (pub/sub) 来实现消息队列的功能&#xff0c;但它有个缺点就是消息无法…

一键AI高清换脸——基于InsightFace、CodeFormer实现高清换脸与验证换脸后效果能否通过人脸比对、人脸识别算法

前言 1、项目简介 AI换脸是指利用基于深度学习和计算机视觉来替换或合成图像或视频中的人脸。可以将一个人的脸替换为另一个人的脸,或者将一个人的表情合成到另一个人的照片或视频中。算法常常被用在娱乐目上,例如在社交媒体上创建有趣的照片或视频,也有用于电影制作、特效…

全屋灯具选购指南,如何选择合适的灯具。福州中宅装饰,福州装修

灯具装修指南 灯具就像我们家里的星星&#xff0c;在黑暗中带给我们明亮&#xff0c;可是灯具如果选择的不好&#xff0c;这个效果不仅体现不出来&#xff0c;还会让人觉得烦躁。 灯具到底该怎么选呢&#xff1f;装修灯具有哪些注意事项呢&#xff1f;给大家做了一个总结&#…

C++设计模式-抽象工厂(Abstract Factory)

目录 C设计模式-抽象工厂&#xff08;Abstract Factory&#xff09; 一、意图 二、适用性 三、结构 四、参与者 五、代码 C设计模式-抽象工厂&#xff08;Abstract Factory&#xff09; 一、意图 提供一个创建一系列相关或相互依赖对象的接口&#xff0c;而无需指定它们…

笔试编程ACM模式JS(V8)、JS(Node)框架、输入输出初始化处理、常用方法、技巧

目录 考试注意事项 先审完题意&#xff0c;再动手 在本地编辑器&#xff08;有提示&#xff09; 简单题515min 通过率0%&#xff0c;有额外log 常见输入处理 str-> num arr&#xff1a;line.split( ).map(val>Number(val)) 初始化数组 new Array(length).fill(v…

国庆中秋特辑(七)Java软件工程师常见20道编程面试题

以下是中高级Java软件工程师常见编程面试题&#xff0c;共有20道。 如何判断一个数组是否为有序数组&#xff1f; 答案&#xff1a;可以通过一次遍历&#xff0c;比较相邻元素的大小。如果发现相邻元素的大小顺序不对&#xff0c;则数组不是有序数组。 public boolean isSort…