最近使用SignalTap对信号观察比较多,经常会出现个别信号变红且观测不到的情况,痛定思痛来解决这个问题!
问题
发现如果SIgnalTap中前面的变量名变红,大部分都是中间定义的reg型、wire型变量,如下图所示:
reg [ 6:0] cnt0 ;
wire add_cnt0 ;
wire end_cnt0 ;
reg [ 4:0] cnt1 ;
wire add_cnt1 ;
wire end_cnt1 ;
在下图可以看出,在signaltap中抓取的信号变量名称变红,且抓取不到信号的准确值,
原因
查阅资料之后发现原因是:因为quartus在综合的时候会将这些中间变量综合掉,从而在signaltap上没办法对其信号进行采样!!
解决办法!!!!
在reg型变量前面加上代码(* preserve *)
、在wire型变量前面加上代码(* keep *)
避免在综合的过程中信号被综合。具体操作如下
(* preserve *) reg [ 6:0] cnt0 ;
(* keep *) wire add_cnt0 ;
(* keep *) wire end_cnt0 ;
(* preserve *) reg [ 4:0] cnt1 ;
(* keep *) wire add_cnt1 ;
(* keep *) wire end_cnt1 ;
修改之后,signaltap不用关闭,直接进行编译,编译结束之后,原来变红的信号会直接变成黑色,连续抓取即可观察到正确的信号。结果如下图所示,信号名称变黑,且可以正确读取出所有信号的值!!!