tlm_req_rsp.svh

Go to the documentation of this file.
00001 // $Id: tlm__req__rsp_8svh-source.html,v 1.1 2008/10/07 21:54:31 alex.marin Exp $
00002 //----------------------------------------------------------------------
00003 //   Copyright 2007-2008 Mentor Graphics Corporation
00004 //   Copyright 2007-2008 Cadence Design Systems, Inc.
00005 //   All Rights Reserved Worldwide
00006 //
00007 //   Licensed under the Apache License, Version 2.0 (the
00008 //   "License"); you may not use this file except in
00009 //   compliance with the License.  You may obtain a copy of
00010 //   the License at
00011 //
00012 //       http://www.apache.org/licenses/LICENSE-2.0
00013 //
00014 //   Unless required by applicable law or agreed to in
00015 //   writing, software distributed under the License is
00016 //   distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
00017 //   CONDITIONS OF ANY KIND, either express or implied.  See
00018 //   the License for the specific language governing
00019 //   permissions and limitations under the License.
00020 //----------------------------------------------------------------------
00021 
00022 // This file contains the two bidirectional tlm channels
00023 
00024 //+ tlm_req_rsp_channel contains a request fifo and a response fifo.
00025 // These fifos can be of any size. This channel is particularly useful
00026 // for dealing with pipelined protocols.
00027 
00028 class tlm_req_rsp_channel #( type REQ = int , type RSP = int )
00029   extends ovm_component;
00030 
00031   typedef tlm_req_rsp_channel #( REQ , RSP ) this_type;
00032 
00033   protected  tlm_fifo #( REQ ) m_request_fifo;
00034   protected tlm_fifo #( RSP ) m_response_fifo;
00035 
00036   // request exports and analysis_port
00037 
00038   ovm_put_export #( REQ ) put_request_export;
00039   ovm_blocking_put_export #( REQ ) blocking_put_request_export;
00040   ovm_nonblocking_put_export #( REQ ) nonblocking_put_request_export;
00041 
00042   ovm_get_export #( REQ ) get_request_export;
00043   ovm_blocking_get_export #( REQ ) blocking_get_request_export;
00044   ovm_nonblocking_get_export #( REQ ) nonblocking_get_request_export;
00045 
00046   ovm_peek_export #( REQ ) peek_request_export;
00047   ovm_blocking_peek_export #( REQ ) blocking_peek_request_export;
00048   ovm_nonblocking_peek_export #( REQ ) nonblocking_peek_request_export;
00049 
00050   ovm_get_peek_export #( REQ ) get_peek_request_export;
00051   ovm_blocking_get_peek_export #( REQ )
00052     blocking_get_peek_request_export;
00053   ovm_nonblocking_get_peek_export #( REQ )
00054     nonblocking_get_peek_request_export;
00055 
00056   ovm_analysis_port #( REQ ) request_ap;
00057 
00058   // response exports and analysis_port
00059 
00060   ovm_put_export #( RSP ) put_response_export;
00061   ovm_blocking_put_export #( RSP ) blocking_put_response_export;
00062   ovm_nonblocking_put_export #( RSP ) nonblocking_put_response_export;
00063 
00064   ovm_get_export #( RSP ) get_response_export;
00065   ovm_blocking_get_export #( RSP ) blocking_get_response_export;
00066   ovm_nonblocking_get_export #( RSP ) nonblocking_get_response_export;
00067 
00068   ovm_peek_export #( RSP ) peek_response_export;
00069   ovm_blocking_peek_export #( RSP ) blocking_peek_response_export;
00070   ovm_nonblocking_peek_export #( RSP ) nonblocking_peek_response_export;
00071 
00072   ovm_get_peek_export #( RSP ) get_peek_response_export;
00073   
00074   ovm_blocking_get_peek_export #( RSP )
00075     blocking_get_peek_response_export;
00076   
00077   ovm_nonblocking_get_peek_export #( RSP )
00078     nonblocking_get_peek_response_export;
00079 
00080   ovm_analysis_port #( RSP ) response_ap;
00081 
00082   // master and slave exports
00083 
00084   ovm_master_imp #( REQ , RSP ,
00085           this_type ,
00086           tlm_fifo #( REQ ) , tlm_fifo #( RSP ) 
00087                    ) master_export;
00088   
00089   ovm_slave_imp #( REQ , RSP ,
00090          this_type ,
00091          tlm_fifo #( REQ ) , tlm_fifo #( RSP )
00092                  ) slave_export;
00093 
00094   ovm_blocking_master_imp #( REQ , RSP ,
00095               this_type ,
00096               tlm_fifo #( REQ ) , tlm_fifo #( RSP )
00097              ) blocking_master_export;
00098   
00099   ovm_blocking_slave_imp #( REQ , RSP ,
00100              this_type ,
00101              tlm_fifo #( REQ ) , tlm_fifo #( RSP )
00102             ) blocking_slave_export;
00103 
00104   ovm_nonblocking_master_imp #( REQ , RSP ,
00105             this_type ,
00106             tlm_fifo #( REQ ) , tlm_fifo #( RSP )
00107                ) nonblocking_master_export;
00108   
00109   ovm_nonblocking_slave_imp #( REQ , RSP ,
00110                 this_type ,
00111                 tlm_fifo #( REQ ) , tlm_fifo #( RSP ) 
00112               ) nonblocking_slave_export;
00113 
00114   // constructor : the default size for the request and response fifos
00115   // is one.
00116 
00117   function new( string name , ovm_component parent = null , 
00118                 int request_fifo_size = 1 ,
00119                 int response_fifo_size = 1 );
00120 
00121 
00122     // check parent = false because this component could be used in
00123     // module and so have no parent
00124     
00125     super.new( name, parent );
00126 
00127     m_request_fifo = new("request_fifo" , this , request_fifo_size );
00128     m_response_fifo = new("response_fifo" , this , response_fifo_size );
00129 
00130     request_ap = new("request_ap" , this );
00131     response_ap = new("response_ap" , this );
00132             
00133     create_request_exports();
00134     create_response_exports();
00135     
00136     create_master_slave_exports();
00137 
00138     set_report_id_action_hier( s_connection_error_id , OVM_NO_ACTION );
00139     
00140     
00141   endfunction // new
00142 
00143   function void post_new();
00144     export_request_connections();
00145     export_response_connections();
00146     
00147     m_request_fifo.put_ap.connect( request_ap );
00148     m_response_fifo.put_ap.connect( response_ap );
00149   endfunction  
00150 
00151   function void create_request_exports();
00152     put_request_export = new("put_request_export" , this );
00153   
00154     blocking_put_request_export =
00155       new("blocking_put_request_export" , this );
00156   
00157     nonblocking_put_request_export =
00158       new("nonblocking_put_request_export" , this );
00159   
00160     get_request_export = new("get_request_export" , this );
00161   
00162     blocking_get_request_export
00163       = new("blocking_get_request_export" , this );
00164   
00165     nonblocking_get_request_export
00166       = new("nonblocking_get_request_export" , this );
00167   
00168     peek_request_export = new("peek_request_export" , this );
00169   
00170     blocking_peek_request_export
00171       = new("blocking_peek_request_export" , this );
00172   
00173     nonblocking_peek_request_export
00174       = new("nonblocking_peek_request_export" , this );
00175 
00176     get_peek_request_export = new("get_peek_request_export" , this );
00177   
00178     blocking_get_peek_request_export
00179       = new("blocking_get-peek_request_export" , this );
00180   
00181     nonblocking_get_peek_request_export
00182       = new("nonblocking_get_peek_request_export" , this );
00183   
00184   endfunction 
00185 
00186   function void create_response_exports();
00187     put_response_export = new("put_response_export" , this );
00188   
00189     blocking_put_response_export =
00190       new("blocking_put_response_export" , this );
00191   
00192     nonblocking_put_response_export =
00193       new(" nonblocking_put_response_export" , this );
00194   
00195     get_response_export = new("get_response_export" , this );
00196   
00197     blocking_get_response_export
00198       = new("blocking_get_response_export" , this );
00199   
00200     nonblocking_get_response_export
00201       = new("nonblocking_get_response_export" , this );
00202   
00203     peek_response_export = new("peek_response_export" , this );
00204   
00205     blocking_peek_response_export
00206       = new("blocking_peek_response_export" , this );
00207   
00208     nonblocking_peek_response_export
00209       = new("nonblocking_peek_response_export" , this );
00210 
00211     get_peek_response_export = new("get_peek_response_export" , this );
00212   
00213     blocking_get_peek_response_export
00214       = new("blocking_get-peek_response_export" , this );
00215   
00216     nonblocking_get_peek_response_export
00217       = new("nonblocking_get_peek_response_export" , this );
00218   
00219   endfunction 
00220 
00221 
00222   function void create_master_slave_exports();
00223  
00224     master_export = new("master_export" , this ,
00225          m_request_fifo , m_response_fifo );
00226   
00227     slave_export = new( "slave_export" , this ,
00228          m_request_fifo , m_response_fifo );
00229  
00230     blocking_master_export = new("blocking_master_export" , this ,
00231              m_request_fifo , m_response_fifo );
00232   
00233 
00234     blocking_slave_export = new("blocking_slave_export" , this ,
00235             m_request_fifo , m_response_fifo );
00236 
00237     nonblocking_master_export = new("nonlocking_master_export" , this ,
00238                 m_request_fifo , m_response_fifo );
00239   
00240 
00241     nonblocking_slave_export = new("nonblocking_slave_export" , this ,
00242                m_request_fifo , m_response_fifo );
00243   endfunction
00244   
00245   function void export_request_connections();
00246 
00247     put_request_export.connect( m_request_fifo.put_export );
00248     blocking_put_request_export.connect(
00249       m_request_fifo.blocking_put_export );
00250   
00251     nonblocking_put_request_export.connect( 
00252       m_request_fifo.nonblocking_put_export );
00253 
00254     get_request_export.connect( m_request_fifo.get_export );
00255   
00256     blocking_get_request_export.connect(
00257       m_request_fifo.blocking_get_export );
00258   
00259     nonblocking_get_request_export.connect( 
00260       m_request_fifo.nonblocking_get_export );
00261 
00262     peek_request_export.connect( m_request_fifo.peek_export );
00263   
00264     blocking_peek_request_export.connect(
00265       m_request_fifo.blocking_peek_export );
00266 
00267     nonblocking_peek_request_export.connect( 
00268       m_request_fifo.nonblocking_peek_export );
00269 
00270     get_peek_request_export.connect( m_request_fifo.get_peek_export );
00271   
00272     blocking_get_peek_request_export.connect( 
00273       m_request_fifo.blocking_get_peek_export );
00274 
00275     nonblocking_get_peek_request_export.connect( 
00276       m_request_fifo.nonblocking_get_peek_export );
00277 
00278   endfunction
00279 
00280   function void export_response_connections();
00281 
00282     put_response_export.connect( m_response_fifo.put_export );
00283              
00284     blocking_put_response_export.connect(
00285       m_response_fifo.blocking_put_export );
00286                 
00287     nonblocking_put_response_export.connect(
00288       m_response_fifo.nonblocking_put_export );
00289 
00290     get_response_export.connect( m_response_fifo.get_export );
00291   
00292     blocking_get_response_export.connect(
00293       m_response_fifo.blocking_get_export );
00294   
00295     nonblocking_get_response_export.connect(
00296       m_response_fifo.nonblocking_get_export );
00297 
00298     peek_response_export.connect( m_response_fifo.peek_export );
00299 
00300     blocking_peek_response_export.connect(
00301       m_response_fifo.blocking_peek_export );
00302 
00303     nonblocking_peek_response_export.connect(
00304       m_response_fifo.nonblocking_peek_export );
00305 
00306     get_peek_response_export.connect( m_response_fifo.get_peek_export );
00307 
00308     blocking_get_peek_response_export.connect(
00309       m_response_fifo.blocking_get_peek_export );
00310 
00311     nonblocking_get_peek_response_export.connect(
00312       m_response_fifo.nonblocking_get_peek_export );
00313 
00314   endfunction
00315 endclass
00316 
00317 // tlm_transport_channel is a tlm_req_rsp_channel that implements the
00318 // transport interface. Because the requests and responses have a
00319 // tightly coupled one to one relationship, the fifo sizes must be one.
00320 
00321 class tlm_transport_channel #( type REQ = int , type RSP = int ) 
00322   extends tlm_req_rsp_channel #( REQ , RSP );
00323 
00324   typedef tlm_transport_channel #( REQ , RSP ) this_type;
00325 
00326   ovm_transport_imp #( REQ , RSP , this_type ) transport_export;
00327 
00328   function new( string name ,
00329       ovm_component parent = null );
00330     
00331     super.new( name , parent , 1 , 1 );
00332     
00333     transport_export = new( "transport_export" , this );
00334     
00335   endfunction
00336 
00337   // The transport task simply calls put( request ) followed by
00338   // get( response ).
00339 
00340 // begin codeblock transport
00341   task transport( input REQ request , output RSP response );
00342     this.m_request_fifo.put( request );
00343     this.m_response_fifo.get( response );
00344   endtask
00345 // end codeblock transport caption path
00346 
00347   function bit nb_transport( input REQ req, output RSP rsp );
00348     if(this.m_request_fifo.try_put(req)) 
00349       return this.m_response_fifo.try_get(rsp);
00350     else
00351       return 0;
00352   endfunction
00353 
00354 endclass

Intelligent Design Verification
Intelligent Design Verification
Project: OVM, Revision: 1.1.0
Copyright (c) 2008 Intelligent Design Verification.
Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.2 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
A copy of the license is included here:
http://www.intelligentdv.com/licenses/fdl.txt
doxygen
Doxygen Version: 1.4.6
Mon Sep 29 14:20:12 2008
Find a documentation bug? Report bugs to: bugs.intelligentdv.com Project: DoxygenFilterSV