我的西皮优学习笔记(三)->仿真常见错误及其调试方法

简单来说就是调试bug,因为对于硬件的调试方法和软件代码来说完全不同,在调试的过程上也有很大的差距,所以需要学习一些特定的调试方法

1)功能仿真波形分析

对于仿真波形图的观察来说是有一套套路的:

  1. 熟悉待调试的设计

  2. 找到一个能明确的错误点

  3. 沿着设计的逻辑链条逆向逐级查看信号,直至找到源头。

    因为我们直接找到的出错点不一定是造成错误的源头,但是修正错误必须解决掉错误的源头,数字电路中各信号之间的关系是一环扣一环的,是遵循严格的逻辑因果关系的,所以从一个错误点触发,沿着逻辑追溯,就一定能找到错误的源头。

一般没有时序的波形时比较好看的,但在观察有时序逻辑的电路波形时:

  1. 需要先将电路中的时钟信号抓出来,但是要注意不要抓错时钟信号
    1. 因为有的电路并不只一个时钟信号
  2. 明确所观察的时序器件(比如说常见的触发器或者同步ram),观察是上升沿触发的还是下降沿触发的。然后找到这个错误值写入的那个时钟上升或者下降沿,然后对生成这个触发器或者RAM输入的组合逻辑继续追查下去,沿着时间轴向前找,一定要找到错误值写入的真正时机。

2)提高波形分析效率的技巧

  1. 给重要的时刻做标记

    第一个是添加标记的按钮,第二第三个都是能快速跳转到标记的按钮

  2. 熟练使用波形缩小、放大的功能

  3. 将关联信号分割、分组

    将相关联的信号用分割(Divider)和分组(Group)来区分

    比如说可以把同一级流水的信号分成在同一个组中,建立分割时在你再想加分割空行的位置的上一个信号处,对信号右键new Divider ,删除就是点击分割,按Del ,分组也一样对准备放如一组的信号选上,然后右键New Group 即可

  4. 多位宽信号用值查找快速定位

    为找到多位宽信号某个值的时刻,建议是用值查找Find value ,右键信号名点击Find value 然后再波形上方会出现与搜索相关的工具栏,根据提示输入数据就行

    但是vivado 的Xsim不支持通配符,所以只能通过调整查找工具栏中Matching的方式来实现模糊查找的功能

3)波形异常类错误的调试

一般错误分为以下几类:

  1. 信号为Z
  2. 信号为X
  3. 波形停止
  4. 越沿采样:上升沿采样到被采样数据在上升沿之后的值
  5. 其他:波形怪异,仿真波形图显示怪异,与设计的电路功能无关的错误

1、信号为Z

Z 表示高阻,比如电路断路了,就是显示高阻

一般造成原因:

  1. RTL 声明的wire 从未被赋值
  2. 模块调用的信号未连接
    1. input 类接口被调用时不允许悬空,但是output 未连接是母模块里不使用该信号,可能是人为故意设置的
    2. 如果a是端口未连接,则从0时刻开始就是Z,但是如果是a_r 从一段时间之后才显示Z是因为a_r 是内部寄存器

解决建议:

  1. RTL 编写时注意代码规范特别是模块调用时,按接口顺序一一对应
  2. 所以input类接口被调用时不允许悬空
  3. 一旦发现一个信号是Z,向前追踪产生该信号的因子信号,看是哪个是Z,一直追踪下去直到追踪到该模块里的input接口
  4. Z也可能出现在向量信号的某几位上,也是一样的追踪,有可能是某个接口存在宽度不匹配带来接口上某些位为Z

2、信号为X

造成原因:

  1. RTL 里声明为reg型的变量,从未被赋值
  2. RTL里写成了多驱动的代码,有时候也可能导致X、
    1. 多驱动的情况一般会在综合的时候报出Cirtical warnings ,multi-driven

解决建议:

  1. 一旦发现仿真错误来自某个信号为X,则向前追踪该信号的因子信号,看是哪个为X,一直追踪下去直到发现某个信号未赋值,随后修改
  2. 如果因子信号都没有X,可能是多驱动导致的,则进行综合然后排查Error 和 Cirtical warning
  3. 寄存器型信号如果没有复位值,在复位阶段其值可能是X,但可能并不会带来错误
  4. 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 。仿真器是在每个周期内计算该周期的所有表达式,组合逻辑循环嵌套,带来的是仿真器的循环计算,导致其无法退出该计算,进而导致了波形停止的现象。

但是并不是所有的组合环路都会导致波形停止,有些非常绕的组合环路(比如跨多个模块形成的组合环路),可能会被工具自动处理掉,但是这样的处理是由风险的,可能会导致仿真通过,但是上版不过

解决建议:

  1. 发现波形停止,对设计进行综合
  2. 查看综合产生的Error 和 cirtical warning,并尝试修正,比如说上面的组合环路经过Vivado 的综合变成了一个多驱动的关键警告
  3. 在没有综合前,可以使用Vivado 的TCL 命令,report_timing_summary,会检查组合环路,并爆出检查结果。但是综合变成多驱动的warning 可能无法爆出结果

你可能感兴趣的:(CPU)