2017-09-08 116 views
0

對於在EDA Playground中使用VCS中的DPI-C的以下代碼,我沒有得到正確的輸出。我期望6作爲答案,但我每次獲得248,而不考慮a和b的值。我已經嘗試在helloFromC.c中使用svLogic,int和unsigned char作爲a_int的數據類型。在DPI-C中,哪些數據類型用於內部變量?

module automatic test; 

    import "DPI-C" function void helloFromC(logic [2:0] a, logic [2:0] b); 

    initial run(); 

    task run(); 
    logic [2:0] a; 
    logic [2:0] b; 
    logic [2:0] c; 
    a = 3'b100; 
    b = 3'b010; 
    c = a+b; 
    $display("Output from SV is %0d", c); 
    helloFromC(a,b); 

    endtask 

endmodule 

這是我的C程序

#include <stdio.h> 
#include <svdpi.h> 


extern "C" int helloFromC(svLogic a, svLogic b) { 
    svLogic a_int = a+b; 
    printf("Output from C is %d", a_int); 
    return 0; 
} 

我得到的輸出

Output from SV is 6 
Output from C is 248 
+0

從'svdpi.h'頭看起來'svLogic'是'uint8_t'。如果是這樣,那與C中的「%d」格式字符串不匹配。 –

+0

「邏輯」是一個4狀態變量。嘗試'位'。另外,因爲你使用3位變量,所以在'c'中掩碼m/ – Serge

+0

@Serge我沒有得到你的意思「掩蓋m中的'c'」 –

回答

1

svLogic應該映射到一個位logic。你有一個向量(aka packed arrays),因此你應該使用svLogicVecVal。它仍然是一個4狀態值,因此在C端執行的SystemVerilog值的算法操作可能無法按您期望的方式工作。在SystemVerilog端使用bit [2:0],在C端使用svBitVecVal將按照您的預期工作。或者簡化事物並在兩邊使用int

更多關於DPI,請參閱IEEE1800-2012第35條,附錄H和附件一

+0

它是svLogicVecValue還是svLogicVecVal?此外,我得到一個錯誤:錯誤:'operator +'不匹配(操作數類型是'svLogicVecVal {aka vpi_vecval}'和'svLogicVecVal {aka vpi_vecval}') svLogicVecVal a_int = a + b; –

+0

@ShankhadeepMukerji它是'svLogicVecVal'。我修正了錯字。它是附件H.10.1.2中定義的一個結構類型。如果運算符+沒有爲此類型定義,那麼您需要自己定義它(搜索「C自定義運算符」或「C超載運算符」),或直接訪問操作中的結構項目。我搜索的結果爲 – Greg

+0

,我得到的結果是C運營商可以定製或超載。如果有一個例子,那會很棒。 –

1

從鏈接之一,addition using DPI call我能找到我一直在尋找

#include <stdio.h> 
#include <svdpi.h> 


extern "C" void 
add_bpv(
    const svBitVecVal* a, 
    const svBitVecVal* b, 
    svBitVecVal* c) { 
    *c = *a + *b; 
    printf("Output from C is %d", *c); 
} 

現在在SV程序DPI調用

module automatic test; 

    import "DPI-C" function void add_bpv(input bit [3:0] a,b, output bit [3:0] c); 

    initial run(); 

    task run(); 
    bit [3:0] a,b,c; 
    a = 3'b100; 
    b = 3'b010; 
    c = a+b; 
    $display("Output from SV is %d", c); 
    add_bpv(a,b,c); 
    endtask 

endmodule 

輸出是什麼,我想

Output from SV is 6 
Output from C is 6 
+0

看起來不錯。你打算接受你自己的答案嗎? – Greg

+0

那麼如果它解決我的問題,那麼是的:D –

相關問題