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 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 Version: 1.4.6 Mon Sep 29 14:20:12 2008 |