最近遇到一個棘手的問題,用VCS跑simulation hang住了。
遇到此類問題,我第一個想到的是去打印一些log看看,比如設置定時打印,調高UVM打印級別等。我在仿真環境里面設置定時打印log的信息,發現hang住之后不會打印了。由此猜測是環境里面存在0延時的死循環,導致仿真無法繼續推前。
VCS提供了ucli可以進行單步調試,如果遇到0延時的死循環,理論上進行單步調試的時候,會循環的執行某一段代碼。但是考慮到可能涉及到的循環邏輯比較多,單純用手工單步調試會非常困難。如果用腳本自動運行幾千行,然后將單步調試的結果保存在log文件中,將非常有助于分析出死循環的代碼。對于這種想法網友已經用tcl腳本實現。讓我們看看網友怎么用loop detect的方式尋找0延時的死循環。
第一步用vcs -debug_all 編譯文件。
第二步用simv -ucli 執行文件
第三步在ucli界面里面source loop_detect.tcl 這個 tcl文件
Loop_detect.tcl 的文件內容如下
#!/usr/bin/tclsh
proc loop_detect(args) {
set help"-help"
if{[stringequal $args $help] != 1} {
set i 0;
while {$i< $args} {
run_step
incr i
}
}
else {
puts"Usage: loop_detect
}
}
proc run_step{} {
redirect -floop.txt -a {set x [step]};
redirect -floop.txt -a {set y [scope]};
puts $x;
puts $y;
}
第四步在ucli 里面用run {time} 執行到hang住的地方,比如simulation 是在1000ns的地方hang住了,可以用run1000ns 執行到此處。
第五步在ucli里面用loop_detect {number of steps} 檢查hang住的原因,比如我用loop_detect 1000 則表示單步執行了1000次,并將每步的結果存在loop.txt 中。然后從loop.txt 中查看是否有0延時的死循環。
我的問題用這種方法尋找到了0延時的死循環邏輯。如果通過上面五步,在loop detect中沒有看到死循環怎么辦,還有其他辦法嗎?這可能需要借助 Verdi和VCS進行聯合仿真了。怎么用Verdi和VCS進行單步調試呢?
第一步用vcs -debug_access+all -kdb -lca進行編譯
第二步用 simv -gui=verdi啟動聯合單步調試
通過verdi進行單步調試,讓debug變比較容易。
如果通過Verdi和VCS聯合單步調試還沒發現問題呢?各位同行們還有什么手段,歡迎各位留言討論。
審核編輯:劉清
-
TCL
+關注
關注
10文章
1723瀏覽量
88596 -
VCS
+關注
關注
0文章
79瀏覽量
9605 -
Verdi
+關注
關注
0文章
22瀏覽量
8777 -
GUI
+關注
關注
3文章
660瀏覽量
39670
原文標題:當simulation hang住的時候該怎么辦?
文章出處:【微信號:處芯積律,微信公眾號:處芯積律】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論