2016-07-03 1 views
0

У меня есть требование, когда мне нужно иметь два класса uvm_tlm_b_target_socket, поскольку он будет получать транзакцию от двух разных агентов. Мне нужно обработать данные, полученные из двух сокетов по-разному, поэтому я не могу выполнить одну задачу b_transport. Есть ли что-то эквивалентное для целевого сокета терминатору портов анализа, мы могли бы использовать макрос uvm_analysis_imp_decl, который позволяет нам иметь другую реализацию функции write? В справочном руководстве по классу я мог найти этот макрос uvm_blocking_transport_imp_decl, но не смог найти пример того, как его использовать. В итоге я пытаюсь сделать этоМожет ли быть два «uvm_tlm_b_target_socket» и две соответствующие реализации «b_transport» в одном объекте?

uvm_tlm_b_target_socket A; 
umv_tlm_b_target_socket B; 

// b_transport task implementation for socket "A" 
task b_transport; 

// b_transport task implementation for socket "B" 
task b_transport; 

ответ

0

Помимо классических розеток TLM2, есть также *_transport_imps. Насколько я могу судить, они делают то же самое, что и сокеты. Вы использовать *_decl макрос так же, как вы используете uvm_analysis_imp_decl:

class some_class; 
    `uvm_blocking_transport_imp_decl(_a) 
    `uvm_blocking_transport_imp_decl(_a) 

    uvm_transport_imp_a A; 
    umv_transport_imp_b B; 

    task b_transport_a(...); 
    task b_transport_b(...); 
endclass 
+0

может 'uvm_tlm_b_initiator_socket' подключиться к' uvm_transport_imp'? – Gautam

1

uvm_tlm_b_target_socket когда инстанцирован необходимо предусмотреть два параметра.

1) базовый класс, где реализация - b_transport проживает

2) другой элемент данных сам по себе.

uvm_tlm_b_target_socket #(receiver, data_item) A; 

В классе приемника может быть только одна функция transport_b. Но вы можете использовать класс-оболочку для подключения других функций в классе вашего приемника к другим целевым сокетам.

typedef class receiver; // name of the parent class processing the transport call. 

class connect_transport ; // does not need to be a component but if you need it can - extends uvm_component; 
receiver m_parent; // parent class 
    function new(string name = "receiver", receiver parent = null); 
     m_parent = parent; // connect the parent class 
    endfunction 
    task b_transport(data_item data, uvm_tlm_time delay); 
     // transport_b for B. 
     m_parent.b_transport_b(data,delay); // call the function in the parent class. 
    endtask 
endclass 

в классе приемника

class receiver extends umm_component ; 
`uvm_component_utils(receiver) 
    connect_transport c1; 

..... 
    uvm_tlm_b_target_socket #(receiver, data_item) A; // connects to the local b_transport function 
    uvm_tlm_b_target_socket #(connect_transport, data_item) B; // connect to the wrapper class 

    function new(string name = "receiver", uvm_component parent = null); 
     super.new(name, parent); 
     A = new("A", this); 
     c1 = new ("c1",this); // create the connecting class 
     B = new("B", this,c1); // connect the target socket to the connecting class 

    endfunction 

    //for socket B 
    task b_transport_b(data_item data, uvm_tlm_time delay); 
    ...... 
    end task 

    // will be connected to A socket. 
    task b_transport(data_item data, uvm_tlm_time delay); 
    ...... 
    end task 
endclass 

Вы можете обернуть это в макрос, и иметь _imp_decl вид реализации. Вы также можете реализовать проверку непосредственно в connect_transport.

Смежные вопросы