2017-05-18 5 views
1

Nehmen wir an, ich dieses Gerät habenGibt es in Specman "Parallele"?

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

ich eine Liste von Agenten haben, variieren die Anzahl der Agenten. Ich möchte die Methode init_all_regs() alle Agenten aufrufen, so dass sie alle parallel laufen.

Gibt es eine Kombination von "alle" und "für jede" Syntax?

Antwort

3

Es gibt keine "alle für jede" -Syntax, aber es ist einfach mit bestehender Syntax zu implementieren. Zum Beispiel können Sie Einwände verwenden. Definieren Sie ein objection_kind und verwenden Sie es zum Synchronisieren.

zum Beispiel:

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

Eine andere Möglichkeit ist, einen Zähler zu verwenden, mit statisches Element implementiert. Ein Nachteil ist, dass es mehr Linien benötigt.

Etwas Ähnliches -

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