How to implement more than 1 Analysis Implementation Ports in a Class in UVM
Hi All,
In this post, we will discuss about how to include more than 1 Analysis Implementation Port in a Class in UVM.
Analysis Ports are used for many purposes like Coverage Collection, Received/Transmitted Packet Checking. And sometimes, you may need to take coverage on different packets (so you will require different analysis implementation ports) and you do not want to define 2 different class, just for coverage.
So if there are more than 1 (suppose 2) analysis implementation ports in a class, then obvious (and the first also !!!) question arises in the mind is that, how to implement 2 write methods in the same class.
Well, in UVM, we have 2 different methods to address the problem.
In this post, we will discuss about how to include more than 1 Analysis Implementation Port in a Class in UVM.
Analysis Ports are used for many purposes like Coverage Collection, Received/Transmitted Packet Checking. And sometimes, you may need to take coverage on different packets (so you will require different analysis implementation ports) and you do not want to define 2 different class, just for coverage.
So if there are more than 1 (suppose 2) analysis implementation ports in a class, then obvious (and the first also !!!) question arises in the mind is that, how to implement 2 write methods in the same class.
Well, in UVM, we have 2 different methods to address the problem.
Method - 1 : Use "imp" Suffix defined via Macro
- Declare Macro `uvm_analysis_imp_decl(<Postfix>) outside of the component. This macro adds post-fix to the analysis implementation port class name and associated write method.
- Instantiate Analysis Implementation Port with uvm_analysis_imp_<Postfix> class name.
- Implement write_<Postfix> method.
`uvm_analysis_imp_decl(_port1)
`uvm_analysis_imp_decl(_port2)
class x extends uvm_component;
// Other Stuff, like registering in Factory, new method
uvm_analysis_imp_port1 #(packet1, x) a1;
uvm_analysis_imp_port2 #(packet2, x) a2;
virtual function void write_port1 (packet1 p);
// Write Method for a1 Analysis Implementation Port
endfunction : write_port1
virtual function void write_port2 (packet2 p);
// Write Method for a2 Analysis Implementation Port
endfunction : write_port2
endclass : x
Method - 2 : Use Analysis FIFO
- Declare Analysis Export Ports & Analysis FIFOs.
- Connect Analysis Exports to the Analysis FIFOs in connect_phase.
- run_phase must pull data from Analysis FIFOs, for further processing.
Now Example,
class x extends uvm_component;
// Other Stuff, like registering in Factory, new method
uvm_tlm_analysis_fifo #(packet1) port1_fifo;
uvm_tlm_analysis_fifo #(packet2) port2_fifo;
uvm_analysis_export #(packet1) a1;
uvm_analysis_export #(packet2) a2;
function void connect_phase (uvm_phase phase);
// Analysis Exports will connect to the analysis_export of FIFOs
a1.connect(port1_fifo.analysis_export);
a2.connect(port2_fifo.analysis_export);
endfunction : connect_phase
task run_phase (uvm_phase phase);
// Pull data from FIFOs for further processing
port1_fifo.get(p1);
port2_fifo.get(p2);
endfunction : connect_phase
endclass : x
Comments
Post a Comment