Debug simulation hang的一些技巧
前言:作为DV,经常碰到各种simulation hang住的情况,比如使用wait忘了加delay、forever下面的blocking语句放在了if()语句里面,但是if()表达式不成立等等,有时候很难通过打log来定位导致Simulation Hung住的代码段。本文将分享一些Debug Simulation Hung住的技巧
一、基本方法
在初次起环境的时候,在所有的循环体前中后都写上打印信息,待TB Simulation PASS之后,提高该信息的打印等级。
二、高阶方法
通过增加VCS Option来实现单步调试,以定位导致Simulation Hung的代码,步骤如下:
- 使用DVE,在VCS compile option 中加-debug_all,在simulation option中加-gui,在DVE中设定断点然后simulation step by step。这种方法其实还是蛮繁琐的,因为即使1个cycle内就会有上万个step,一个step一个step点下去其实还是很耗时间。
 - 同样在compile option中加-debug_all,在simulation option中加:-ucli -i tmp.ucli
 - 在tmp.ucli中可以标注仿真时间,然后从这个时间过后开始step运行,从而找到死循环。(如下example,run 1000ns后,开始step by step执行,可以自己预期一下多少step后进行到死循环,如果少了可以 多写一些)
 - tmp.ucli ex:
 
run 1000ns
step
step
...
q 
 三、常见的导致Simulation Hung的代码总结
 
3.1、blocking port
3.2、do begin end waile();条件很成立
四、Coverage issue
某些comb condition coverage可能由於glitch的存在會導致理論上打不到的點被誤打到。
-  
Solution
 
- -cm_glitch 0 option可以起一定的效果,注意這個option只針對coverage起效,并不影響仿真結果
 - +delay_mode_zero, +updsched -add_seq_delay 1ps, 作用是墊一個delay 0, 其實就是把update 值的動作拿到最後再做
 - 如果需要在waveform上看到這個glitch可以加+fsdb+glitch=0 +fsdb+sequential +fsdb+region
 
五、参考文献
                  
                  
                  
                  
                            
本文分享了DebugSimulationHung住的技巧,包括基本方法如在循环体前后添加打印信息,高阶方法如利用VCSOption进行单步调试,以及常见导致SimulationHung的代码总结。还讨论了Coverageissue解决方案。
          
      
          
                
                
                
                
              
                
                
                
                
                
              
                
                
                    
              
            
                  
					604
					
被折叠的  条评论
		 为什么被折叠?
		 
		 
		
    
  
    
  
					
					
					


            