2017-06-06 1 views
1

I ont un tableau associatif :randomisation de tableau associatif dans systemverilog

rand uvm_reg_field array_assoc[string]; 

le tableau contient la poignée des zones de registre UVM pour registres dans le DUT et est indexé par une chaîne de caractères (chaîne de caractères est le nom du champ). Dites que j'ai 2 champs de registre avec les noms "reg_field_1" et "reg_field_2".

Comme décrit,

array_assoc["reg_field_1"]= handle of field 1; 
    array_assoc["reg_field_2"]= handle of field 2; 

Je dois randomiser que l'un des champs, donc, je me tourne de manière sélective la rand_mode au large pour l'un des champs, dites "reg_field_1":

array_assoc["reg_field_1"].rand_mode(0); 

Maintenant, si je randomiser le tableau associatif, les deux champs de registre sont randomisés.

Ce qui est encore plus surprenant est que, si je déclare un tableau normal avec des indices entiers, tels que:

rand uvm_reg_field array_normal[2]; 

    array_normal[0]= handle of field 1; 
    array_normal[1]= handle of field 2; 

puis tour des rand_mode pour le champ 1:

array_normal[0].rand_mode(0); 

Cela fonctionne bien et le champ 1 n'est pas randomisé.

La question est: Pourquoi le champ registre « de reg_field_1 » se répartition aléatoire, même si son rand_mode a été fixé à 0 en cas de tableau associatif?

Répondre

3

La possibilité de définir rand_mode() sur des éléments individuels d'un tableau associatif semble avoir un support sporadique. Les travaux suivants pour moi dans Questa et un autre simulateur; me donne un "pas encore pris en charge" dans un autre, et les résultats que vous voyez dans un autre. Donc, je voudrais contacter votre fournisseur d'outils.

module top; 
class B; 
    rand byte m; 
endclass 
class A; 
    rand B a1[2]; 
    rand B a2[string]; 
    function void run; 
     a2["0"] = new; 
     a2["1"] = new; 
     a1[0] = new; 
     a1[1] = new; 
     a1[0].rand_mode(0); 
     a2["0"].rand_mode(0); 
     void'(randomize()); 
     $display(a1[0].m, a1[1].m,,a2["0"].m,a2["1"].m); 

     endfunction 
endclass 
    A a = new(); 
    initial repeat(3) a.run(); 
endmodule