SystemVerilog en boucle dans la hiérarchie

J’ai des registres instanciés dans un bloc Registre Regblock tant que tel:

 DUT.Regblock.Register1 DUT.Regblock.RegisterA DUT.Regblock.RegisterABC ... 

Tous ces registres ont la même structure interne. Je voudrais simuler les effets des bits flips dans ces registres.

 //Here an attempt to do bit flips bitFlipLocation = $random; force DUT.RegBlock.Register1.reg[bitFlipLocation] = ~DUT.RegBlock.Register1.reg[bitFlipLocation]; release DUT.ABCStar1.RegBlock.Register1.reg[bitFlipLocation]; 

Existe-t-il un moyen de créer une boucle sur tous les DUT.Regblock.Register1, RegisterA, RegisterABC, ... intérieur de RegBlock et de créer ces RegBlock bits?

Il existe des moyens de le faire, mais pas dans le langage SystemVerilog lui-même. Vous pouvez écrire du code VPI en C pour itérer sur les noms de blocs et appliquer les forces utilisant l’API C. Vous pouvez également utiliser des commandes spécifiques à un outil pour parcourir les noms de blocs et utiliser des commandes (généralement Tcl) pour appliquer les forces.

Les deux sont au-delà de la scope de ce qui peut être montré dans ce forum.

Suite à la réponse de Dave, j’ai implémenté le code VPI en C pour boucler tous les registres de RegBlock et forcer de manière aléatoire les RegBlock bits à certaines positions (le registre a une largeur de 32 bits).

 #include  #include  #include  #include  #define NULL 0 void reg_flips() { vpiHandle module_iter; vpiHandle module_obj; vpiHandle module_regblk; vpiHandle reg_nets; vpiHandle net; //Starting from the RegBlock module_regblk = vpi_handle_by_name("DUT.RegBlock",NULL); //Iterator over all register in RegBlock module_iter = vpi_iterate(vpiModule,module_regblk); while (module_iter) { module_obj = vpi_scan(module_iter); if (module_obj) { reg_nets = vpi_iterate(vpiReg,module_obj); while (reg_nets) { net = vpi_scan(reg_nets); if (net) { s_vpi_value val; val.format = vpiIntVal; val.value.integer = rand()%2; int position = rand()%32; //Forcing the value at a given position. vpi_put_value(vpi_handle_by_index(net,position),&val,NULL,vpiNoDelay); } else { reg_nets = NULL; } } } } else { module_iter = NULL; } }