c仿真ok,rtl仿真stall可能问题
一、设计概述
1.vivado hls设计中,最麻烦的地方,就是明明你C仿真功能ok,但是你rtl仿真就是不行;
2.第一种情况,你c仿真ok,rtl仿真失败,如果rtl仿真失败,这种问题其实还是好解决的;
3.第二种情况,你c仿真ok,rtl仿真直接仿真超过了一天都没有仿真完成,这种情况仿真没有挂死,但是仿真一直运行,但是就是不结束;
4.第三种情况,你c仿真ok,rtl仿真直接stall,始终挂起,一直仿真。
这三种情况中,第二种和第三种情况,非常坑,基本上你没有任何手段去定位问题,这个也是vivado hls一直被诟病的问题。
二、c仿真ok,rtl仿真stall可能是指令的问题
1.约束指令的问题,这个需要排查
hls::stream的depth的深度是否合理
2.m_axi的detph指定是否合理
3.顶层上volatile指针使用是否合理
4.dependence指令约束是否合适
不要随便使用dependence约束,可以尝试约束和不约束dependence有没有影响。
三、c仿真ok,rtl仿真stall可能是代码的问题
1.array数组是否越界
2.array bank访问是否撞车
3.array是否存在越界访问
4.for循环的循环边界问题
5.串行逻辑和并行逻辑的问题
6.数据类型的问题,有符号和无符号的瞎用
7.浮点和定点转换的问题,浮点定点化开销太大,造成仿真很难结束
8.有符号定点和无符号定点问题。
总结:
1.c仿真ok,rtl仿真挂起,很多时候就是代码的问题,你只能一行行代码看,从本人开发那么多模块来看,真的没有特别好的办法来查看问题;
2.如果你牛逼,你可以看c综合的rtl代码有没有啥问题,我尝试看过,很难,因为生成的verilog代码和c代码并不是一一对应的,所以还是认真查看你的c代码吧。
如果,上述经验对你有帮助,三联支持吧!!!!!
