uvm_analysis_port——TLM1事务级建模方法(二)
UVM中的TLM1端口,第一类是用于uvm_driver 和uvm_sequencer连接端口,第二类是用于其他component之间连接的端口,如uvm_monitor和uvm_scoreboard。首先让我们看第二类。首先来看uvm_analysis_port。
//------------------------------------------------------------------------------ // Title: Analysis Ports //------------------------------------------------------------------------------ // // This section defines the port, export, and imp classes used for transaction // analysis. // //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ // Class: uvm_analysis_port // // Broadcasts a value to all subscribers implementing a <uvm_analysis_imp>. // //| class mon extends uvm_component; //| uvm_analysis_port#(trans) ap; //| //| function new(string name = "sb", uvm_component parent = null); //| super.new(name, parent); //| ap = new("ap", this); //| endfunction //| //| task run_phase(uvm_phase phase); //| trans t; //| ... //| ap.write(t); //| ... //| endfunction //| endclass //------------------------------------------------------------------------------ class uvm_analysis_port # (type T = int) extends uvm_port_base # (uvm_tlm_if_base #(T,T)); function new (string name, uvm_component parent); super.new (name, parent, UVM_PORT, 0, UVM_UNBOUNDED_CONNECTIONS); m_if_mask = `UVM_TLM_ANALYSIS_MASK; endfunction virtual function string get_type_name(); return "uvm_analysis_port"; endfunction // Method: write // Send specified value to all connected interface function void write (input T t); uvm_tlm_if_base # (T, T) tif; for (int i = 0; i < this.size(); i++) begin tif = this.get_if (i); if ( tif == null ) uvm_report_fatal ("NTCONN", {"No uvm_tlm interface is connected to ", get_full_name(), " for executing write()"}, UVM_NONE); tif.write (t); end endfunction endclass //------------------------------------------------------------------------------ // Class: uvm_analysis_imp // // Receives all transactions broadcasted by a <uvm_analysis_port>. It serves as // the termination point of an analysis port/export/imp connection. The component // attached to the ~imp~ class--called a ~subscriber~-- implements the analysis // interface. // // Will invoke the ~write(T)~ method in the parent component. // The implementation of the ~write(T)~ method must not modify // the value passed to it. // //| class sb extends uvm_component; //| uvm_analysis_imp#(trans, sb) ap; //| //| function new(string name = "sb", uvm_component parent = null); //| super.new(name, parent); //| ap = new("ap", this); //| endfunction //| //| function void write(trans t); //| ... //| endfunction //| endclass //------------------------------------------------------------------------------ class uvm_analysis_imp #(type T=int, type IMP=int) extends uvm_port_base #(uvm_tlm_if_base #(T,T)); `UVM_IMP_COMMON(`UVM_TLM_ANALYSIS_MASK,"uvm_analysis_imp",IMP) function void write (input T t); m_imp.write (t); endfunction endclass //------------------------------------------------------------------------------ // Class: uvm_analysis_export // // Exports a lower-level <uvm_analysis_imp> to its parent. //------------------------------------------------------------------------------ class uvm_analysis_export #(type T=int) extends uvm_port_base #(uvm_tlm_if_base #(T,T)); // Function: new // Instantiate the export. function new (string name, uvm_component parent = null); super.new (name, parent, UVM_EXPORT, 1, UVM_UNBOUNDED_CONNECTIONS); m_if_mask = `UVM_TLM_ANALYSIS_MASK; endfunction virtual function string get_type_name(); return "uvm_analysis_export"; endfunction // analysis port differs from other ports in that it broadcasts // to all connected interfaces. Ports only send to the interface // at the index specified in a call to set_if (0 by default). function void write (input T t); uvm_tlm_if_base #(T, T) tif; for (int i = 0; i < this.size(); i++) begin tif = this.get_if (i); if (tif == null) uvm_report_fatal ("NTCONN", {"No uvm_tlm interface is connected to ", get_full_name(), " for executing write()"}, UVM_NONE); tif.write (t); end endfunction endclass
我们可以看到所有的类都是继承自uvm_port_base #(uvm_tlm_if_base #(T,T))。uvm_analysis_imp其实更像一个普通的imp,它不具备有任何analysis的性质,即不具备任何广播的性质。对于uvm_analysis_port 和uvm_analysis_export 只能是analysis_imp.