Разница между портами uvm_analysis

Не могли бы вы помочь понять функциональность и четкую разницу между:

  1. uvm_analysis_export
  2. uvm_analysis_port
  3. uvm_analysis_imp

Я искал в Интернете, есть некоторые объяснения, например:

Но все же я чувствую, что нужно больше объяснений. Может кто-нибудь помочь, пожалуйста.


uvm
person haykp    schedule 01.03.2016    source источник


Ответы (2)


uvm_analysis_port — это издатель, они транслируют транзакции

uvm_analysis_imp являются подписчиками, они получают транзакции и вызывают функцию с именем 'write' в классе, в котором они определены.

uvm_analysis_export может быть более запутанным, они используются для предоставления портов 'imp' на более высоком уровне иерархии. Например, если у вас есть агент, который содержит компонент с analysis_imp, и вы хотите сделать этот «имп» доступным на уровне интерфейса агента. В этой ситуации вы объявляете и создаете экземпляр analysis_export в классе агента, затем в connect_phase подключаете analysis_export агента к analysis_imp вашего внутреннего компонента.

Стоит отметить, что экспорт предназначен для подписки, но на стороне публикации можно использовать обычные порты uvm_analysis_port. Таким образом, агент может создавать экземпляры analysis_ports и подключать их к analysis_port внутреннего компонента.

Это хорошо, потому что позволяет вам не обращаться к иерархии при соединении компонентов (что упрощает обслуживание):

Плохо:

bus_agent.internal_monitor.packet_port.connect(checker.ref_model.packet_imp) 

хороший:

bus_agent.packet_port.connect(checker.packet_export)

Также полезно ознакомиться с макросом uvm_analysis_imp_decl(). Это позволяет вам использовать более одного analysis_imp в компоненте.

person Ashley Winn    schedule 01.03.2016
comment
Большое спасибо за ваше объяснение! Я думаю, что теперь я понимаю uvm_analysis_export — это больше похоже на буфер, который берет эти данные из порта и передает их в имп. Он используется для сокращения пути иерархии. У меня есть один вопрос относительно вашего примера. Мне не очень понятна иерархия «хорошего» примера. Правильно ли я понимаю иерархию в вашем примере: Плохо: - person haykp; 03.03.2016
comment
Пожалуйста, взгляните на эту ссылку sites.google.com/site. /ysulogicdesign/uvm/ - person haykp; 03.03.2016
comment
Привет, рад помочь. На вашей диаграмме я бы добавил к «хорошей» части еще один «analysis_port» в bus_agent, параллельный «export» в контролере. На стороне издателя «порт» также может играть роль соединителя, как и «экспорт». - person Ashley Winn; 07.03.2016
comment
Итак связь такая: port-›analysis_port-›export-›imp Спасибо большое за знание - person haykp; 08.03.2016

Преимущество этого порта анализа заключается в том, что пользователь может передавать данные от одного производителя нескольким потребителям, которые не архивируются с помощью uvm_blocking_put_port.

Это также поясняется на рисунке.

Здесь я привожу пример кода, чтобы получить больше ясности для uvm_analysis_port.

Помните: соединение через порт используется для соединения двух или более независимых компонентов.

На этом изображении поясняется uvm_analysis_port

uvm_analysis_port ПРИМЕР

class transaction extends uvm_sequence_item;
  `uvm_object_utils(transaction);
  rand int unsigned a;
  rand int unsigned b;

  function new(string name ="");
    super.new(name);
  endfunction

endclass


class producer extends uvm_component;
  `uvm_component_utils(producer);
  transaction tr_inst;
  uvm_analysis_port #(transaction) produce_to_consumer_p;

  function new(string name ="",uvm_component parent);
    super.new(name,parent);
    produce_to_consumer_p = new("produce_to_consumer_p",this);
    tr_inst = new("tr_inst");
  endfunction


  task run_phase(uvm_phase phase);
    super.run_phase(phase);
    phase.raise_objection(this);
//    tr_inst.randomize();
    `uvm_info(get_full_name(),"Write the data from PRODUCER",UVM_LOW);
    tr_inst.a = 10; tr_inst.b = 20;
    produce_to_consumer_p.write(tr_inst);
    phase.drop_objection(this);
  endtask

endclass

class consumer_1 extends uvm_component;
  `uvm_component_utils(consumer_1);
  uvm_analysis_imp#(transaction,consumer_1) write_imp_1;  

  function new(string name ="",uvm_component parent);
    super.new(name,parent);
    write_imp_1 = new("write_imp_1",this); 
  endfunction

  function void write(transaction tr_inst);
    `uvm_info(get_full_name(),"Got the data in CONSUMER_1",UVM_LOW);
    `uvm_info(get_full_name(),$sformatf("The value of a = %0d and b = %0d",tr_inst.a,tr_inst.b),UVM_LOW);
  endfunction

endclass

class consumer_2 extends uvm_component;
  `uvm_component_utils(consumer_2);
  uvm_analysis_imp#(transaction,consumer_2) write_imp_2;  

  function new(string name ="",uvm_component parent);
    super.new(name,parent);
    write_imp_2 = new("write_imp_2",this); 
  endfunction

  function void write(transaction tr_inst);
    `uvm_info(get_full_name(),"Got the data in CONSUMER_2",UVM_LOW);
    `uvm_info(get_full_name(),$sformatf("The value of a = %0d and b = %0d",tr_inst.a,tr_inst.b),UVM_LOW);
  endfunction

endclass

class consumer_3 extends uvm_component;
  `uvm_component_utils(consumer_3);
  uvm_analysis_imp#(transaction,consumer_3) write_imp_3;  

  function new(string name ="",uvm_component parent);
    super.new(name,parent);
    write_imp_3 = new("write_imp_3",this); 
  endfunction

  function void write(transaction tr_inst);
    `uvm_info(get_full_name(),"Got the data in CONSUMER_3",UVM_LOW);
    `uvm_info(get_full_name(),$sformatf("The value of a = %0d and b = %0d",tr_inst.a,tr_inst.b),UVM_LOW);
  endfunction

endclass

class env extends uvm_component;
  `uvm_component_utils(env);

  producer p_inst;
  consumer_1 c_inst_1;
  consumer_2 c_inst_2;
  consumer_3 c_inst_3;

  function new(string name="",uvm_component parent);
    super.new(name,parent);
    p_inst = new("p_inst",this);
    c_inst_1 = new("c_inst_1",this);
    c_inst_2 = new("c_inst_2",this);
    c_inst_3 = new("c_inst_3",this);
  endfunction

  function void connect();
    p_inst.produce_to_consumer_p.connect(c_inst_1.write_imp_1);
    p_inst.produce_to_consumer_p.connect(c_inst_2.write_imp_2);
    p_inst.produce_to_consumer_p.connect(c_inst_3.write_imp_3);
  endfunction

endclass

module main();

  env env_inst;
  initial 
  begin
    env_inst = new("env_inst",null);
    run_test();
  end

endmodule

Вот ссылка, которая дает вам больше ясности для порта анализа, а также uvm_port.

Ссылка: http://i.stack.imgur.com/7rUZ3.png

person Ashutosh Rawal    schedule 01.07.2016