2015-02-10 66 views
0

我試圖讓我的測試平臺具有更高的可擴展性,並且具有一組需要路徑名稱給實例的PLI函數。我試圖避免強硬的路徑。我可以用系統任務/功能構建路徑。我嘗試將此路徑定義爲SystemVerilog類型,但PLI拒絕它,我無法更改PLI。 PLI確實接受一個reg數組。pli調用的左對齊文本

挑戰是PLI需要左對齊文本,但$sformat,$sformatf%s都是正確的。

 left-justified : "tb.vdut[10].inst9.sample_func  " // Desired 
right-justified : "  tb.vdut[10].inst9.sample_func" // Actual 

示例功能:

function void call(
    integer dut_id, inst_id, 
    reg [CHAR_NUM-1:0] func_name, 
    integer arg0, arg1, argN); 

    reg [CHAR_NUM-1:0] path; 
    $sformat(path,"tb.vdut[%0d].inst%0d.%0s", dut_id, inst_id, func_name); 

    // Make path left-justified 
    /* missing convert code here */ 

    $display("path:'%s', arg0:%0d, arg1:%0d, argN:%0d", path, arg0, arg1, argN); 
    //$my_pli(path, arg0, arg1, argN); 
endfunction : call 

我有自己的答案,但我正在尋找一個清晰的解決方案。如果CHANR_NUM很大並且功能call經常執行,則while循環會吸取大量CPU時間。

+0

如何執行轉換的新PLI函數? – Ari 2015-02-10 23:58:27

+0

@Ari,如果我有一個源代碼爲'$ sformat'的源代碼,或者是一個如何編寫一個帶有N個參數的PLI的教程,那麼我會考慮編寫一個左對齊的PLI等價的'$ sformat'類型。 – Greg 2015-02-11 17:01:07

+0

爲什麼選擇源代碼?我正在考慮將字符串傳遞給一個PLI函數,該函數可以訪問'sformat','std:setw','std:right'或者甚至'Boost'等庫函數。 – Ari 2015-02-11 19:34:10

回答

0

找到另一種解決方案。首先爲格式字符串創建一個參數。在評估格式中使用參數僅在編譯/加工時發生,在模擬過程中它將是靜態的。

parameter FORMAT_LJUSTIFY = $sformatf("%%-%0ds",CHAR_NUM/8); 

所以,如果CHAR_NUM是640,那麼FORMAT_LJUSTIFY"%-80s",這意味着在過去80個字符將被左對齊。

然後使用$sformat(path, FORMAT_LJUSTIFY, path);。建議使用$sformat而不是$sformatf與reg數組。一些模擬器$sformatf作爲右對齊,其他人不會編譯,除非我打字鑄造。類型鑄造工作,但它是一個額外的。

約束條件:如果path的寬度必須爲CHAR_NUM否則會有前導和尾隨的空格或空格字符。

function void call(
    integer dut_id, inst_id, 
    reg [CHAR_NUM-1:0] func_name, 
    integer arg0, arg1, argN); 

    reg [CHAR_NUM-1:0] path; 
    $sformat(path,"tb.vdut[%0d].inst%0d.%0s", dut_id, inst_id, func_name); 

    // Make path left-justified 
    $sformat(path, FORMAT_LJUSTIFY, path); 

    $display("path:'%s', arg0:%0d, arg1:%0d, argN:%0d", path, arg0, arg1, argN); 
    //$my_pli(path, arg0, arg1, argN); 
endfunction : call 
0

我能夠通過while循環將右對齊轉換爲左對齊。

while(path[CHAR_NUM-1 -: 8] == " ") path <<= 8; 

限制:額外的CPU開銷時CHANR_NUM大,往往是執行功能call倍。

目前的解決方案:

function void call(
    integer dut_id, inst_id, 
    reg [CHAR_NUM-1:0] func_name, 
    integer arg0, arg1, argN); 

    reg [CHAR_NUM-1:0] path; 
    $sformat(path,"tb.vdut[%0d].inst%0d.%0s", dut_id, inst_id, func_name); 

    // Make path left-justified 
    while(path[CHAR_NUM-1 -: 8] == " ") path <<= 8; 

    $display("path:'%s', arg0:%0d, arg1:%0d, argN:%0d", path, arg0, arg1, argN); 
    //$my_pli(path, arg0, arg1, argN); 
endfunction : call