简单来说就是调试bug,因为对于硬件的调试方法和软件代码来说完全不同,在调试的过程上也有很大的差距,所以需要学习一些特定的调试方法
1)功能仿真波形分析
对于仿真波形图的观察来说是有一套套路的:
-
熟悉待调试的设计
-
找到一个能明确的错误点
-
沿着设计的逻辑链条逆向逐级查看信号,直至找到源头。
因为我们直接找到的出错点不一定是造成错误的源头,但是修正错误必须解决掉错误的源头,数字电路中各信号之间的关系是一环扣一环的,是遵循严格的逻辑因果关系的,所以从一个错误点触发,沿着逻辑追溯,就一定能找到错误的源头。
一般没有时序的波形时比较好看的,但在观察有时序逻辑的电路波形时:
- 需要先将电路中的时钟信号抓出来,但是要注意不要抓错时钟信号
- 因为有的电路并不只一个时钟信号
- 明确所观察的时序器件(比如说常见的触发器或者同步ram),观察是上升沿触发的还是下降沿触发的。然后找到这个错误值写入的那个时钟上升或者下降沿,然后对生成这个触发器或者RAM输入的组合逻辑继续追查下去,沿着时间轴向前找,一定要找到错误值写入的真正时机。
2)提高波形分析效率的技巧
-
给重要的时刻做标记
第一个是添加标记的按钮,第二第三个都是能快速跳转到标记的按钮
-
熟练使用波形缩小、放大的功能
-
将关联信号分割、分组
将相关联的信号用分割(Divider)和分组(Group)来区分
比如说可以把同一级流水的信号分成在同一个组中,建立分割时在你再想加分割空行的位置的上一个信号处,对信号右键new Divider ,删除就是点击分割,按Del ,分组也一样对准备放如一组的信号选上,然后右键New Group 即可
-
多位宽信号用值查找快速定位
为找到多位宽信号某个值的时刻,建议是用值查找Find value ,右键信号名点击Find value 然后再波形上方会出现与搜索相关的工具栏,根据提示输入数据就行
但是vivado 的Xsim不支持通配符,所以只能通过调整查找工具栏中Matching的方式来实现模糊查找的功能
3)波形异常类错误的调试
一般错误分为以下几类:
- 信号为Z
- 信号为X
- 波形停止
- 越沿采样:上升沿采样到被采样数据在上升沿之后的值
- 其他:波形怪异,仿真波形图显示怪异,与设计的电路功能无关的错误
1、信号为Z
Z 表示高阻,比如电路断路了,就是显示高阻
一般造成原因:
- RTL 声明的wire 从未被赋值
- 模块调用的信号未连接
- input 类接口被调用时不允许悬空,但是output 未连接是母模块里不使用该信号,可能是人为故意设置的
- 如果a是端口未连接,则从0时刻开始就是Z,但是如果是a_r 从一段时间之后才显示Z是因为a_r 是内部寄存器
解决建议:
- RTL 编写时注意代码规范特别是模块调用时,按接口顺序一一对应
- 所以input类接口被调用时不允许悬空
- 一旦发现一个信号是Z,向前追踪产生该信号的因子信号,看是哪个是Z,一直追踪下去直到追踪到该模块里的input接口
- Z也可能出现在向量信号的某几位上,也是一样的追踪,有可能是某个接口存在宽度不匹配带来接口上某些位为Z
2、信号为X
造成原因:
- RTL 里声明为reg型的变量,从未被赋值
- RTL里写成了多驱动的代码,有时候也可能导致X、
- 多驱动的情况一般会在综合的时候报出Cirtical warnings ,multi-driven
解决建议:
- 一旦发现仿真错误来自某个信号为X,则向前追踪该信号的因子信号,看是哪个为X,一直追踪下去直到发现某个信号未赋值,随后修改
- 如果因子信号都没有X,可能是多驱动导致的,则进行综合然后排查Error 和 Cirtical warning
- 寄存器型信号如果没有复位值,在复位阶段其值可能是X,但可能并不会带来错误
- X 和 1的运算结构为1,而X和0的运算结果为0
3、波形停止
状态显示:仿真停止在某一时刻,无法前进,但是仿真却吓死你hi不停的在运行,而造成的原因往往是因为RTL里面存在组合环路导致的。
wire c_t;
assign c_t = a_r & b_r +c;
assign c = a_r + c_t ;
有些波形停止表示是波形立刻停止,并显示检测出fatal,
比如说仿真模拟时迭代次数到了10000 的限制,其实是因为死循环模拟组合环的计算,达到次数上限之后自动停止仿真了:
会报错:
ERROR :[Simulator 45-1] A fatal run_time error was detected ,Simulation cannot continue
组合环路:
就是信号A的组合逻辑表达式中用到了某个产生因子B ,但是B 的组合逻辑中又用到了A
比如说上面源码中c_t 的信号的胜场用到了c,但是c又用到了c_t 。仿真器是在每个周期内计算该周期的所有表达式,组合逻辑循环嵌套,带来的是仿真器的循环计算,导致其无法退出该计算,进而导致了波形停止的现象。
但是并不是所有的组合环路都会导致波形停止,有些非常绕的组合环路(比如跨多个模块形成的组合环路),可能会被工具自动处理掉,但是这样的处理是由风险的,可能会导致仿真通过,但是上版不过
解决建议:
- 发现波形停止,对设计进行综合
- 查看综合产生的Error 和 cirtical warning,并尝试修正,比如说上面的组合环路经过Vivado 的综合变成了一个多驱动的关键警告
- 在没有综合前,可以使用Vivado 的TCL 命令,report_timing_summary,会检查组合环路,并爆出检查结果。但是综合变成多驱动的warning 可能无法爆出结果