[UVM]UVM中的analysis port 和analysis export

                UVM中的analysis port 和analysis export

一、analysis port 和analysis export與port 和export的區別

  • 都是用于传递transaction
  • analysis port(analysis export)与IMP 之间的通信是一种一对多的通信,而PORT 和EXPORT 与IMP 的通信是一种一对一的通信
  • PORT 和EXPORT,有put,get,transport 操作,一个PORT 要么是put_port,要么是get_port,要么是transport_port,不可能是三者兼有。但是对于analysis port(analysis export)来说,它只有一种操作write。write 的意思就是广播一下,剩下的事情就与他无关了。
  • 作为PORT 和EXPORT,都有阻塞和非阻塞的区分。相应的put,get,transport 操作也分成了阻塞和非阻塞的。但是对于analysis port 和analysis export 来说,没有阻塞和非阻塞的概念。因为它本身就是广播,不必等待与其相连的其它port的响应。所以不存在阻塞和非阻塞。

二、一个analysis port和多个IMP相连接进行通信的例子

2.1.analysis_port A

class component_a extends uvm_component;
  
  transaction                         trans;
  //Step-1. Declaring analysis port
  uvm_analysis_port#(transaction)     analysis_port_a;
  
  `uvm_component_utils(component_a)
  
  //---------------------------------------
  // Constructor
  //---------------------------------------
  function new(string name, uvm_component parent);
    super.new(name, parent);
    
    //Step-2. Creating analysis port
    analysis_port_a = new("analysis_port_a", this);
  endfunction : new
  //---------------------------------------
  // run_phase
  //---------------------------------------
  virtual task run_phase(uvm_phase phase);
    phase.raise_objection(this);
    
    trans = transaction::type_id::create("trans", this);
    //void'(trans.randomize());
    assert(trans.randomize());
    `uvm_info(get_type_name(), $sformatf(" tranaction randomized"),UVM_LOW)
    `uvm_info(get_type_name(), $sformatf(" Printing trans, \n %s", trans.sprint()), UVM_LOW)
                                              
    `uvm_info(get_type_name(),$sformatf(" Before calling port write method"), UVM_LOW)
    //Ste-3. Calling write method
    analysis_port_a.write(trans);
    `uvm_info(get_type_name(), $sformatf(" After  calling port write method"), UVM_LOW)
    
    phase.drop_objection(this);
  endtask : run_phase
endclass : component_a

2.2.analysis_imp B(需要寫写一个write任务)

class component_b extends uvm_component;
  
  transaction trans;
  //Step-1. Declaring analysis imp port
  uvm_analysis_imp#(transaction,component_b)         analysis_imp_b; 
  `uvm_component_utils(component_b)
  
  //---------------------------------------
  // Constructor
  //---------------------------------------
  function new(string name, uvm_component parent);
    super.new(name, parent);
    //Step-2. Creating analysis imp_port
    analysis_imp_b = new("analysis_imp_b", this);
  endfunction : new
  
  //---------------------------------------
  // Analysis Imp port write method
  //---------------------------------------
  //Step-3. Implementing write method
  virtual function void write(transaction trans);
    `uvm_info(get_type_name(), $sformatf(" Inside write method. Recived trans On Analysis Imp Port"), UVM_LOW)
                                          
    `uvm_info(get_type_name(), $sformatf(" Printing trans, \n %s", trans.sprint()), UVM_LOW)
                                          
  endfunction
endclass : component_b

2.3.analysis_imp D(需要寫写一个write任务)

class component_d extends uvm_component;
  
  transaction                                     trans;
  //Step-1. Declaring analysis imp port
  uvm_analysis_imp#(transaction,component_b)      analysis_imp_d; 
  `uvm_component_utils(component_d)
  
  //---------------------------------------
  // Constructor
  //---------------------------------------
  function new(string name, uvm_component parent);
    super.new(name, parent);
    //Step-2. Creating analysis imp_port
    analysis_imp_d = new("analysis_imp_d", this);
  endfunction : new
  
  //---------------------------------------
  // Analysis Imp port write method
  //---------------------------------------
  //Step-3. Implementing write method
  virtual function void write(transaction trans);
    `uvm_info(get_type_name(), $sformatf(" Inside write method. Recived trans On Analysis Imp Port"), UVM_LOW)
                                          
    `uvm_info(get_type_name(), $sformatf(" Printing trans, \n %s", trans.sprint()), UVM_LOW)
                                          
  endfunction
endclass : component_d

2.4.Component C

class C extends uvm_component;
  component_a             a;
  component_b             b;
  component_d             d;

  function void build_phase(uvm_phase phase);
    super.build_phase(phase);
    a = component_a::type_id::create(“a”, this);
    b = component_b::type_id::crate(“b”, this);
    d = component_d::type_id::create(“d”, this);
  endfunction

  function void connect_phase(uvm_phase phase);
    super.connect_phase(phase);
    a.analysis_port_a.connect(b.analysis_imp_b);
    a.analysis_port_a.connect(d.analysis_imp_d);
  endfunction

endclass
发布了214 篇原创文章 · 获赞 158 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/gsjthxy/article/details/105550107