Für alle meine Komponenten (Monitor, Treiber, Sequenzer usw.) muss ich eine Aufgabe erstellen, die alle 100 Zyklen aufgerufen wird. Ich denke, es gibt einen Weg, dies mit benutzerdefinierten Phasen zu tun, aber nicht sicher, wie. Irgendeine Hilfe.UVM: Erstellen Sie eine Aufgabe, die alle 100 Zyklen für die gesamte Komponente aufgerufen wird.
Antwort
Die pseudo-multiple erben Feature in 1800-2012 eingeführt über "Interface-Klasse" und "implementiert" ist die beste Lösung. Um Ihre Anforderung zu erfüllen, können Sie das Entwurfsmuster von Observer anwenden. Unten ist ein Beispiel-Code
interface class tick;
pure virtual task trigger_tick(....);
end class
class observer extends uvm_components;
......
tick tick_list[$];
virtual function void register_tick(tick t);
tick_list.push_back(t);
endfunction
virtual task run_phase(uvm_phase phase);
forever begin
repeat(100) @(posedge top.clock);
foreach (tick_list[i]) tick_list[i].trigger_tick();
end
endtask
end class
class my_component extends uvm_component implements tick;
......
virtual task trigger_tick();
//do something
endtask
end class
Dann können Sie eine Instanz Beobachter Creat und alle Komponenten auf die Instanz registrieren.
Ich glaube nicht, dass Sie benutzerdefinierte Phasen dafür implementieren müssen. Hier ist ein Beispiel dafür, wie Sie dies tun können.
task run_phase(uvm_phase phase);
forever begin
// wait for reset ....
fork
your_task1();
join_none
// do other things .....
end
endtask : run_phase
task your_task1(); // this task will keep running forever..
int count=1;
forever begin
@(posedge vif.clk);
if(count%100 == 0) // will be true only when count becomes multiple of 100
your_task2();
count++;
end
endtask : your_task1
task your_task2(); // one which you wanted to call every 100 clk cycles
// add your logic
endtask : your_task2
Hoffe das hilft.
Sie können diese Logik in run_phase
jeder Komponente in der folgenden Manner hinzufügen.
task run_phase (uvm_phase phase);
fork
begin
forever
begin
repeat (100) @(posedge virtual_interface.clk);
your_task();
end
end
// Other threads
join_none
wait_fork;
endtask
Sie uvm_events wie von jeder Komponente erzeugen, die Veranstaltung zu 100. Zyklus nutzen könnten, und von Ihrer eigenen Klasse fangen, das Ereignis und rufen Sie die Aufgabe
Könnten Sie erklären, warum Sie eine Aufgabe ausführen müssen für jeder der Komponente? Ich denke, Sie sind etwas Debugging, möglicherweise Transaktion Aufzeichnung oder uvm_printer wäre hier hilfreicher
- 1. Kennen Sie die Komponente, die eine Funktion aufgerufen
- 2. korrekt this.props für die gesamte Komponente Destrukturierung
- 3. Wie wird die gesamte Festplatte für alle PDF-Dateien durchsucht?
- 4. Reagiert die Komponente selbstständig, wenn eine Methode aufgerufen wird
- 5. Erstellen Sie eine Timelineansicht, die die gesamte Tabellenansicht abdeckt
- 6. So erstellen Sie einen Rahmen für die gesamte Tabelle
- 7. UVM-Phasen für Transaktionsobjekte
- 8. Was würde dazu führen, dass die Aufgabe "put" von uvm consumer aufgerufen wird, bevor der Produzent den myport.put ausführt
- 9. componentDidMount() wird nicht aufgerufen, wenn die reaktive Komponente gemountet wird
- 10. Sellerie-Konfiguration wird aktualisiert, wenn eine andere Aufgabe aufgerufen wird
- 11. Wie erstellen Sie eine reaktive Komponente, die Daten selbst lädt?
- 12. So erstellen Sie eine Funktion, die alle Malloced-Speicher verbraucht
- 13. Legen Sie die gleiche Schriftart für alle Komponente Java
- 14. Ändern Sie die TastaturApparent für die gesamte App
- 15. Angular 2 wird routerOnActivate Verfahren nie für eine Komponente aufgerufen, die OnActivate implementiert
- 16. Stoppen Sie die gestartete Aufgabe Wenn die App geöffnet wird
- 17. Transiente Komponente, die eine PerWebRequest-Komponente verwendet, wann wird die PerWebRequest-Komponente nicht mehr unterstützt?
- 18. Wie diese Komponente aufgerufen wird und wie sie implementiert wird
- 19. Meine wiederkehrende Aufgabe wird nicht aufgerufen
- 20. Cookie für die gesamte Website?
- 21. Setzen Sie die Elementhöhe auf 100% für eine Zeilenspanne td?
- 22. Erstellen Sie eine Animation für alle Kinder
- 23. Führen Sie eine Aufgabe alle x Sekunden
- 24. eine Gulp Aufgabe Legen Sie die Standard
- 25. Alle Fremdschlüsseleinschränkungen für die gesamte MySQL-Datenbank anzeigen
- 26. Wiederverwenden einer Komponente ohne die gesamte wiederverwendbare Komponente, die denselben Status hat
- 27. Erstellen Sie eine Hintergrundaufgabe, die immer ausgeführt wird
- 28. Wie erhalten Sie eine Methode, die aufgerufen wird, wenn ein DBGrid angezeigt wird?
- 29. Wie alle 10 Sekunden eine JS-Funktion aufgerufen wird, die dann eine Funktion im Winkel aktiviert
- 30. Wird setTimout (function, 100) die Leistung beeinflussen?
Dies funktioniert gut für einzelne Instanz. Ich brauche eine generische Lösung, die auf alle Komponenten angewendet werden kann. – Romeo
Sie könnten eine Basisklasse erstellen und Ihre Treiber-, Monitor- und Sequenzerkomponenten davon erben lassen. Mit SystemVerilog 2012 können Sie mehrere Vererbungen erzielen, indem Sie eine Klasse aus mehreren Klassen mithilfe des Schlüsselworts "implements" (ähnlich wie in Java) erweitern. Sehen Sie sich diesen Link an http://cfs-vision.com/2016/03/10/multiple-inheritance-in-systemverilog/ Aber Sie brauchen einen Simulator, der dies unterstützt. – sundar