Wenn Sie UVM Klassenhierarchie (Link: [https://www.google.co.in/search?biw=1366&bih=620&tbm=isch&sa=1&btnG=Search&q=uvm+class+hierarchy#imgrc=Laxc9UWNpnGTpM%3A][1]) beziehen.. Dann finden Sie, dass uvm_transaction Elternklasse, während uvm_sequence Kind Klasse ist
So können Kind-Klasse alle die Eigenschaft der übergeordneten Klasse zugreifen aber Elternklasse kann nicht untergeordnete Klasse Eigenschaft zugreifen.
uvm_sequence_item seine eigene Funktionalität wie get_sequencer_id hat, set_sequencer_id, get_root_sequence.
diese durch Sequenzer Methoden intern bei Schichtfolgen.
Sie rufen Sequenz durch Startmethode, uvm_do Familie oder config_db auf.
Jede dieser Methoden ruft start_item (req) und finish_item (req) auf.
task start_item(uvm_sequence_item item)
task finish_item(uvm_sequence_item item)
Wenn Sie den Datentyp im ersten Argument in beiden Funktionen beobachten, ist uvm_sequence_item.
Es gibt insgesamt acht uvm-Klassen.
(1) uvm_driver.svh
(2) uvm_push_driver.svh
(3) uvm_sequencer.svh
(4) uvm_push_sequencer.svh
(5) uvm_sequencer_library.svh
(6) uvm_sequencer_analysis_fifo.svh
(7) uvm_sequence.svh
(8) uvm_sequencer_param_base.svh
Diese Klassen sind parametriert mit uvm_sequence_item nicht mit uvm_transaction.
Wenn Sie uvm_transaction statt uvm_sequence_item verwenden dann ti einen Fehler rufen (set_sequence_id nicht gefunden, welche Eigenschaft von uvm_sequence_item nicht uvm_transaction ist) von uvm_sequencer_param_base.svh.
Die Kommunikation zwischen Sequenz, Sequenzer und Treiber ist damit nicht abgeschlossen.
In den meisten Fällen, die ich beobachte, wenn Sie einen Code haben, in dem Sie nicht gehen, um uvm_sequencer zu verwenden, können Sie uvm_transaction verwenden, es wird kein Fehler schreien.
Aber wenn Ihr Code uvm_sequener enthält und Sie uvm_transaction dann wird es einen Fehler rufen (konnte nicht finden Mitglied ‚set_sequence_id‘).
Ja. Ich verstehe das. Meine Frage ist, warum kann uvm_sequence_item nicht haben, was es jetzt hat plus uvm_transaction? Warum brauchen wir uvm_transaction separat? – user1978273
Sie überdenken wahrscheinlich dies - Sie haben Recht, wir hätten 'uvm_sequence_item' implementiert mit was auch immer es jetzt hat und den ganzen Code in' uvm_transaction', und das wäre in Ordnung gewesen. Die Entwickler der Basisklasse haben wahrscheinlich mit dem Letzten begonnen und dann zusätzliches Material implementiert, indem sie diese Klasse erweitert haben. Zu diesem Zeitpunkt haben sie sich wahrscheinlich dazu entschieden, 'uvm_sequence_item' als empfohlene Basisklasse für alle benutzerdefinierten Typen zu verwenden. – AndresM