2017-05-18 2 views
1

Supposons que j'ai cette unitéExiste-t-il "parallel all of" dans Specman?

unit agent { 
    init_all_regs() @clock is {…}; 
}; 

J'ai une liste d'agents, le nombre d'agents varient. Je veux appeler la méthode init_all_regs() tous les agents, de sorte que tous fonctionnent en parallèle.

Y a-t-il une combinaison de "tous" et "pour chaque" syntaxe?

Répondre

3

Il n'y a pas de syntaxe "tous pour chaque", mais il est facile à implémenter avec la syntaxe existante. Par exemple, vous pouvez utiliser des objections. Définissez un objection_kind et utilisez-le pour synchroniser.

par exemple:

extend objection_kind :[AGNETS_CHECK_REGS]; 

unit agent { 
    init_all_regs()@clk is { 
     raise_objection(AGNETS_CHECK_REGS); 
     //... 
     drop_objection(AGNETS_CHECK_REGS); 
    }; 
}; 
extend env { 
    my_method() @clock is { 
     for each in agents { 
     start it.init_all_regs(); 
     }; 

     wait cycle; 
     while get_objection_total(AGNETS_CHECK_REGS) > 0 { 
      wait cycle; 
     }; 
    }; 
}; 
1

Une autre option est d'utiliser un compteur, mis en œuvre avec un membre statique. Un inconvénient est qu'il a besoin de plus de lignes.

Quelque chose comme ça -

unit agent { 
    static active_counter : int = 0; 
    static increase_active_counter() is { 
     active_counter += 1; 
    }; 
    ////.... 
    init_all_regs()@clk is { 
     increase_active_counter(); 
     //.... 

     decrease_active_counter(); 
    }; 
}; 

extend env { 
    scenario() @any is { 

     agent::init_active_counter(); 

     for each in agents { 
      start it.init_all_regs(); 
     }; 

     wait cycle; 
     while agent::get_active_counter() > 0 { 
      wait cycle; 
     }; 
    }; 
    };