2016-11-08 1 views

Répondre

2

Oui, vous pouvez utiliser l'opérateur de type faire générer, si/cas ou procédure en cas/cas comme:

real r; 

if (type(r) == type(real)) ... 

Mais malheureusement, la le code dans toutes les branches doit encore compiler avec succès, quelle que soit la condition. Vous ne pourrez pas référencer un membre struct qui n'existe pas.

typedef struct {int a;} s1_t; 
    typedef struct {int a;int b;} s2_t; 
    s1_t s; 
initial 
     #1 // procedural-if 
    if (type(s) == type(s1_t)) 
     $display("%m s.a = %0d",s.a); 
    else if (type(s) == type(s2_t)) 
     $display("%m s.b ==%0d",s.b); // this will not compile 
1

Il y a type() opérateur décrit dans IEEE1800-2012 § 6.23. Exemple d'utilisation de de la LRM:

bit[12:0] A_bus, B_bus; 
parameter typebus_t = type(A_bus); 
generate 
    case(type(bus_t)) 
    type(bit[12:0]): addfixed_int #(bus_t) (A_bus,B_bus); 
    type(real): add_float #(type(A_bus)) (A_bus,B_bus); 
    endcase 
endgenerate

Il y a aussi $typename() décrit dans IEEE1800-2012 § 20.6.1. $typename() Retourne une chaîne du type. Exemple d'utilisation de de la LRM:

// source code   // $typename would return 
typedef bitnode;   // "bit" 
node [2:0] X;    // "bit [2:0]" 
int signedY;    // "int" 
packageA; 
enum{A,B,C=99} X;   // "enum{A=32'sd0,B=32'sd1,C=32'sd99}A::e$1" 
typedef bit[9:1'b1] word; // "A::bit[9:1]" 
endpackage: A 
importA::*; 
moduletop; 
typedef struct{node A,B;} AB_t; 
AB_t AB[10];    // "struct{bit A;bit B;}top.AB_t$[0:9]" 
... 
endmodule