zoukankan      html  css  js  c++  java
  • 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.

  • 相关阅读:
    强行删除带点的文件夹
    如何设置让iis服务器支持.apk文件的下载
    纯CSS下拉导航菜单
    <UL>中<li>标签前编号图片的简单调用
    滑动门效果【鼠标滑过鼠标单击两种】
    SQL Server中,NumricDecimalMoney三种字段类型的区别
    SQL Server 20个最常用的时间格式
    Gridview------Set BackgroundColor
    c# 中is 和 as 运算符
    SQL LEFT JOIN 关键字 SQL RIGHT JOIN 关键字 fulljoin
  • 原文地址:https://www.cnblogs.com/dpc525/p/8075872.html
Copyright © 2011-2022 走看看