2017-09-08 1 views
0

Je ne reçois pas la sortie correcte pour le morceau de code suivant en utilisant DPI-C dans VCS dans EDA Playground. J'attends 6 comme réponse mais j'obtiens 248 à chaque fois, indépendamment des valeurs a et b. J'ai essayé d'utiliser svLogic, int et unsigned char pour le type de données pour a_int dans helloFromC.c.En DPI-C, quels types de données utiliser pour les variables internes?

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 

Ceci est mon programme 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; 
} 

je reçois comme sortie

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

De l'en-tête 'svdpi.h', il semble que' svLogic' soit un 'uint8_t'. Si tel est le cas, cela ne correspond pas à la chaîne de format "% d" dans C. –

+0

'logic' est une variable à 4 états. Essayez «bit». De plus, puisque vous utilisez des vars 3 bits, masquez le m dans 'c'/ – Serge

+0

@Serge Je n'ai pas compris ce que vous vouliez dire par "masquer le m dans 'c'" –

Répondre

1

svLogic est censé correspondre à un seul bit logic. Vous avez un vecteur (aka tableau emballé), par conséquent vous devriez utiliser svLogicVecVal. Il s'agit toujours d'une valeur à 4 états, de sorte que les opérations algorithmiques des valeurs SystemVerilog effectuées sur le côté C peuvent ne pas fonctionner comme prévu. L'utilisation de bit [2:0] sur le côté SystemVerilog et svBitVecVal sur le côté C fonctionnera plus que prévu. Ou simplifier les choses et utiliser int des deux côtés.

Pour en savoir plus sur DPI, reportez-vous à IEEE1800-2012 l'article 35, l'annexe H, et à l'annexe I.

+0

Est-ce svLogicVecValue ou svLogicVecVal? De plus, Im obtenant une erreur: erreur: aucune correspondance pour 'opérateur +' (les types d'opérande sont 'svLogicVecVal {aka vpi_vecval}' et 'svLogicVecVal {aka vpi_vecval}') svLogicVecVal a_int = a + b; –

+0

@ShankhadeepMukerji c'est 'svLogicVecVal'. J'ai corrigé la faute de frappe. C'est un type de structure défini à l'annexe H.10.1.2. Si l'opérateur + n'est pas défini pour ce type, vous devrez soit le définir vous-même (recherchez "C opérateur personnalisé" un "opérateur de surcharge C"), soit accéder directement aux éléments struct de votre opération. – Greg

+0

de ce que j'ai cherché, j'ai obtenu des résultats que les opérateurs C peuvent être personnalisés ou surchargés. S'il y a un exemple, ce serait génial. –

1

D'un des liens, addition using DPI call je pourrais trouver ce que je cherchais

#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); 
} 

Et maintenant le programme SV DPI appel

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 

la sortie est ce que je voulais

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

Ça a l'air bien. Allez-vous accepter votre propre réponse? – Greg

+0

Eh bien, si c'est la résolution de ma question, alors oui: D –