对于仿真,大部分习惯用modelsim去仿真FPGA代码,但是注意到毕竟与真实环境有差异,用siganltap实物联合仿真,更有利于查到问题所在。但是在运用singaltap过程中,如果仅仅检测输入输出信号,可能不会出什么大问题,但是如何检测中间变量问题就来了。针对自己今天遇到相关问题,在这做个总结。
问题1:普通情况如何查找到所需要的信号。
大部分情况下,我们通常是采用如下操作选择想要的信号,如图1
图1 正常查找信号名称
(1)首先我们点pin all 选项,找到所要管脚;
(2)然后点List,这个时候Nodes Found下方就会出现我们所需要的管脚;
(3)选中我们想要的管脚
(4)点>建添加过去。
问题2: 如果该信号不是输入输出管脚,而是中间变量,如何查询
往往很多时候要观察信号内部传输情况,此时选择pin类型将无法找到我们想要的信号,这时候就要更换类型,最好的一种方式,也是不管要搜索的是什么类型的变量,都可以适用的一种,如图2显示的all name选项。
图2 Design Entry(all name)
如果选择这个选项后,再点击List按钮,则会出现原先没有出现的变量名。也就是该选项可以让所有任何一个你定义的变量,都显示出来。
问题3:工程过大,信号太多,如何快速定位
作为菜鸟的我来说,当选择了all name时,变量过多,工程文件过多,有时候几百个变量名中找那么一个,太麻烦。这个时候就要用到‘look in ’区域。如图3
图3 使用look in 所需寻找范围
一般情况下,LOOK IN 的默认范围是从顶层文件开始往下覆盖,为了快速找到目标,我们可以在顶层文件范围下,再添加一个范围,从而缩小寻找范围。
问题4:为什么确定后的信号名字是红色的,或者运行时没有波形,数据一直是00h
这个问题在一般情况下不会出现,很大可能出现的情况就是你要观察中间变量,如一个reg 一个wire变量上的数据,这个时候才会出现,意思是信息无效,最主要的原因是,singaltap在综合时,对该信号进行了优化,使得数值被忽略。下面提供解决方法(方法有很多,我这里就说一个,只是告诉自己以后就这么用了 反正效果一样,用一个就ok了):
如果你要观察一个wire型变量。那么你在定义这个变量后请如下操作:
wire name/* synthesis keep */;
如果你要观察一个reg类型的变量,请如下操作:
(* preserve *) reg name; //任意一个变量或者模块
(* noprune *) reg name; //用于没有扇出的变量
我后来也去网上查了一下,有一个大佬总结了一个更完全的,在这我把他的链接附加上:
https://blog.csdn.net/weixin_30267785/article/details/96729139
总结
基本上,所以的问题都在这里了,如果后续还有别的问题发现了,继续更新。