2016-12-09 3 views

Antwort

1

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.

0

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.

+0

Dies funktioniert gut für einzelne Instanz. Ich brauche eine generische Lösung, die auf alle Komponenten angewendet werden kann. – Romeo

+0

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

0

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 
0

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

Verwandte Themen