课程目标
仿真的结果和预计的的不一样(debugging simulation mismatches)
if (data=3) //这个语句用于为真
好的coding方式
if(3===data)
- race 竞争冒险
vcddiff
比较vcd文件是不是一样
1. Mismatches原因
PPT1
- 仿真工具的不同,仿真工具不同的版本
- RTL和门级仿真的结果的不一样,前仿和后仿的记过不一样
PPT2
PPT3 仿真事件队列
2. 竞争的例子
PPT1 同时读取
第10个仿真时间单位同时对a
读取和写
PPT2
在数字电路中避免这种coding style
不定态指的是,仿真的时候,复位信号到来之前未知的状态,真实的情况是不存在的
PPT3
3. 零延时竞争
PPT1
最开始的时候不知道reset=x
是多少,如果最开始是不知道是什么
改进后为
#### PPT2
最开始的时候rst给1,那么val是多少呢
4. 触发器的竞争
- 仿真的结果是不是你想要的
- 综合工具综合处理的电路是不是我们想要的
使用非阻塞电路的结构
5. Coding Style建议
多驱动,一般是在SoC顶层,双向端口
6. 发现并解决Race的方法
PPT1
PPT2
编译时加上开关选项
PPT3
更多的是依靠人的经验的,少了一个等于号,通过方法避免
PPT4
7. vcat和Vcdiff
8. 实验环节
- 增加style1和style2
Style1 是非阻塞赋值
Style2 是阻塞赋值
结果并不是晚一拍
定义宏的方式:
综合电路 `define DFF_STYLE2
综合结果,第一种非阻塞结果是两个触发器,第二种是也是两个触发器
结论:综合结果是对的,仿真是错的
- 增加增加了两种情况,放在一个always语句
两级的触发器
style3是两级的延迟,style4不是,是同一拍的,
Style4结果是只有1个触发器:
增加了第5种和第六种
顺序颠倒了
第五种仿真的结果是对的
第六种电路仿真结果是对的!
综合结果也是两个触发器
- 第七种和第八种
结论:通过阻塞赋值,有些情况仿真通过,但是综合不通过;有些仿真不通过,综合通过