首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在哪里使用uvm_blocking_put_port和uvm_analysis_port?

在哪里使用uvm_blocking_put_port和uvm_analysis_port?
EN

Stack Overflow用户
提问于 2016-06-28 20:39:30
回答 1查看 1.7K关注 0票数 1

端口和分析端口有什么区别?在哪里使用uvm_blocking_put_port,在哪里使用uvm_analysis_port?uvm_analysis_port相对于uvm_blocking_put_port的优势是什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-06-28 20:50:59

端口连接用于连接两个独立的块(组件)。uvm_blocking_put_port和uvm_analysis_port都用来将数据从生产者转移到消费者。

(1) uvm_blocking_put_port:用于从单个生产者到单个消费者的数据传输。

(2) uvm_analysis_port:用于从单个生产者到单个消费者或多个消费者的数据传输。

此分析端口的优点是用户可以将数据从单个生产者传输到多个使用者,而这些用户没有借助uvm_blocking_put_port进行存档。

这件事在图中也有解释。

在这里,我提供了示例代码,以使uvm_blocking_put_port和uvm_analysis_port更加清晰。

端口

记住:端口连接用于连接两个或多个独立组件。

(1) uvm_blocking_put_port实例。

代码语言:javascript
复制
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_blocking_put_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.put(tr_inst);
    phase.drop_objection(this);
  endtask

endclass

class consumer extends uvm_component;
  `uvm_component_utils(consumer);
  uvm_blocking_put_imp#(transaction,consumer) put_imp;  
  //transaction tr_inst;

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

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

endclass

class env extends uvm_component;
  `uvm_component_utils(env);

  producer p_inst;
  consumer c_inst;

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

  function void connect();
    p_inst.produce_to_consumer_p.connect(c_inst.put_imp);
  endfunction

endclass

module main();

  env env_inst;

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

endmodule

端口 (2) uvm_analysis_port示例

代码语言:javascript
复制
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
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38085875

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档