本文主要分析總結芯片驗證過程中遇到的仿真器掛死(就是通常所說的hang)的情形。給出的解決方案都是基于Cadence的仿真工具incisive(當然利用xcelium也是沒有問題的)和debug工具simvision(當然利用更強大的indago也是沒問題的),需要指出來的一點是如果利用xcelium和indago聯合調試,需要注意版本兼容問題,利用simvision來debug就不存在這個問題,因為simvision是位于incisive或xcelium的安裝目錄下的,并不需要單獨的license。由于這類問題比較普遍,而且scenario也比較復雜,所以我打算把它做成一個系列。今天是開篇,先列出所有的場景和類型,后續有對應的具體的解決方案。
一、仿真器卡在無限循環或者hang住的場景有很多,原因也各不相同。但大致可以分為如下幾類:
1.1:rtl/netlist(網表)無限循環;
1.1.1signal glitches(信號毛刺)
使用irun/xrun的-delay_trigger這個option可以過濾掉毛刺,能夠使得仿真進行下去。
1.1.2無限deltacycles
當仿真時間不能往前推進,但是delta cycle無限增加的情形下。可以在仿真開始時,使用如下tcl命令,可以使得delta cycle增加到一定數量后,讓仿真自動停下來(注意這時候仿真并未中斷,這時候可以繼續操作仿真器)。它跟gateloopwarn這個option有點類似。
stop -delta 5000 -timestep -delbreak 1
一旦仿真停下來,我們就可以使用以下tcl命令debug該循環了:
>run -step//單步調試,注意這有一個前提就是要確保-linedebug這個option是事先打開的
>drivers -active //對應跨越verilog和VHDL邊界的網絡就該使用drivers -effective命令
1.1.3zero-delay gate level無限循環
如果是gate level的仿真,注意要用-gateloopwarn這個option,其他參考1.1.2的做法
1.1.4錯誤的使用timescale/time-precision
可以使用
>xrun -timescale 1ns/1ps -override_timescale//在elaborate階段使用即可
1.1.5設計中有組合邏輯環
可以使用toggle coverage來檢測是否有組合邏輯環。當然也可以用HAL, 還可以用profiler,甚至還可以用高大上的JasperGold,工具如此之多,是不是有點懵逼,哈哈
1.2與仿真器(incisive)接口的C/C++代碼內部的無限循環,比如PLI/VPI/DPI等;
這個足夠展開成一個專題了,這里就不展開了。
1.3仿真環境中的復雜隨機約束導致的仿真器掛死(hang)
簡單來講就是啟用仿真器的心跳功能,
如果使用命令行啟用是這樣的
>xrun -xceligen heartbeat
如果通過Tcl命令啟用是這樣的:
xcelium>xceligen -heartbeat
如果通過環境變量啟用是這樣的
Setenv XCELIGEN_HEARTBEAT=[value]
BTW,如果想看求解器是如何迭代或被stuck的,可以使用-utrace這個選項。
1.4for循環的最大值不確定導致的無限循環
類似這種:for(int i=0; i!=var;i++) //如果var是X的話for循環就會進入死循環(循環終止條件不確定)
1.5low power仿真中的hang(仿真掛起);
這也可以展開成一個專題了,在這里就不展開了。
二、上面說的如此抽象,有裝逼的嫌疑,那到底該如何實現呢?別急后續結合具體的小例子慢慢展開,保證有圖有真相,敬請期待……
審核編輯 :李倩
-
芯片
+關注
關注
456文章
51019瀏覽量
425387 -
仿真器
+關注
關注
14文章
1019瀏覽量
83843
原文標題:如何debug設計中的無限循環(仿真器hang)系列(1)開篇
文章出處:【微信號:Rocker-IC,微信公眾號:路科驗證】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論