2016-12-09 5 views
0

Для всех моих компонентов (монитор, драйвер, секвенсор и т. Д.) Мне нужно создать задачу, которая вызывается каждые 100 циклов. Я думаю, что есть способ сделать это с пользовательскими фазами, но не уверен, как это сделать. Любая помощь.UVM: создайте задачу, которая вызывается каждые 100 циклов для всего компонента.

ответ

1

Функция множественного множественного наследования, введенная в 1800-2012 году через «класс интерфейса» и «инструменты», является лучшим решением. Чтобы удовлетворить ваши требования, вы можете применить шаблон проектирования Observer. Ниже приведен пример кода

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 

Затем вы можете создать экземпляр наблюдателя и зарегистрировать все компоненты экземпляра.

0

Я не думаю, что вам нужно реализовать пользовательские этапы. Вот пример того, как вы можете это сделать.

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 

Надеюсь, это поможет.

+0

Это будет отлично работать для одного экземпляра. Мне нужно общее решение, которое может применяться ко всем компонентам. – Romeo

+0

Вы можете создать базовый класс и позволить вашим компонентам драйвера, монитора, секвенсора наследовать от этого. В стандарте SystemVerilog 2012 вы можете добиться множественного наследования, расширив класс из более чем одного класса, используя ключевое слово «реализует» (похожее на java). Проверьте эту ссылку http://cfs-vision.com/2016/03/10/multiple-inheritance-in-systemverilog/ Но у вас должен быть симулятор, который поддерживает это. – sundar

0

Вы можете добавить эту логику в run_phase каждого компонента в следующем mannger.

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

Вы можете использовать uvm_events как из каждого компонента генерировать событие в 100-й цикл, и от вашего собственного класса уловом, что событие и вызовите задачу

Не могли бы вы объяснить, почему вам нужно выполнить задачу каждый из компонентов? Я думаю, что вы отлаживаете что-то, может быть, запись транзакции или uvm_printer были бы более полезными здесь