2017-08-06 61 views
2

我有一種情況,我有2個C函數。這些C函數有很多錯誤檢查場景,我使用exit(1)來清除。系統verilog代碼中的一百萬個位置通過DPI調用來調用這2個C函數。在SystemVerilog + C DPI呼叫的情況下,如何堆疊跟蹤信息?

我在我的C例程中使用了execinfo.h和backtrace()函數,但棧跟蹤 info顯示了C函數,但上面只是顯示了一些隨機vcs_exe.sim.1234_1.so作爲主調用函數。

我甚至試圖在發佈的區域中尋找這個vcs_exe.sim.1234.so,但它並沒有指向任何已知的Sv文件。

那麼,當堆棧跟蹤顯示時,如何獲得調用者非C/SV函數?

+0

我想嘗試一些放在這裏的想法。將更新爲什麼 – user3662733

回答

1

理想情況下,你的模擬器將有一個指導,告訴你如何做到這一點。這可能會涉及到更改構建腳本中的內容以允許額外的可見性。如果在手冊中找不到關於此的任何信息,供應商的支持部門應該能夠爲您提供幫助。

如果你的工具不允許這樣做,你可以嘗試自己實現一些東西。如果您的DPI方法是上下文您可以使用svScope概念來計算出來電者信息。我沒有測試它,但它應該是這樣的:

svScope scope; 
scope = svGetScope(); 

char *fileName, *lineNumber; 
scope.svGetCallerInfo(fileName, lineNumber); 

這假定svGetCallerInfo(...)返回true,這我想它應該方面 DPI方法。

0

它用vcs工作的方式是調用一個導出函數,該函數將輪流調用$ stack。在這個例子中,它適用於'默認'和'純'綁定。

import "DPI-C" context function void testStack(); 

export "DPI-C" function printStack; 

function void printStack; 
    $display("====%m====="); 

    $stack; 
endfunction 

module dpis; 
    sub sub(); 
endmodule // dpis 

module sub; 
    initial 
    testStack(); 
endmodule // sub 

class Test; 
    function void test; 
     testStack(); 
    endfunction // test 
endclass // Abc 

program abc; 
    Test a = new; 
    initial 
    a.test(); 
endprogram // abc 

和 'c':

#include <svdpi.h> 

extern void pringStack(); 

void testStack() { 
    svScope scope; 
    scope = svGetScopeFromName("$unit"); 
    svSetScope(scope); 
    printStack(); 
} 

,結果是這樣的:

====$unit::printStack===== 
#0 in printStack at dpis.sv:9 
#1 in DPI function 
#2 in dpis.sub 
====$unit::printStack===== 
#0 in printStack at dpis.sv:9 
#1 in DPI function 
#2 in <protected code> 
#3 in abc at dpis.sv:30 
#4 in abc 

因此,它提供了有關位置,無論是作爲一個模塊實例路徑或一些信息一個文件/亞麻布。

+0

這對我來說是一種作品...它說printstack不能找到,但它defintiely告訴哪個sv文件叫它...但這是一個偉大的地方開始和探索..謝謝你 – user3662733

0

如何更改C代碼以便它不會退出(1),而只是打印一條錯誤消息並優雅地返回到SV域?

你需要調試的問題是在打印輸出錯誤信息的行處設置一個斷點,然後返回到模擬器中的SV域。瞧!現在不僅您知道哪個SV類對象調用C-DPI,您可以看到SV類對象的局部變量來幫助診斷問題。

+0

不會工作,因爲這些在迴歸中失敗了,我希望通過迴歸運行傾倒的堆棧跟蹤給我一個線索,告訴我哪個SV函數是有問題的。 – user3662733

相關問題