- Timestamp:
- Jan 15, 2013, 5:54:45 PM (12 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/modules/vci_vdspin_initiator_wrapper/caba/source/src/vci_vdspin_initiator_wrapper.cpp
r284 r287 23 23 * 24 24 * SOCLIB_LGPL_HEADER_END 25 * 26 * Maintainers: alexandre.joannou@lip6.fr 27 * 25 28 */ 26 29 … … 31 34 #define tmpl(x) template<typename vci_param, int dspin_cmd_width, int dspin_rsp_width> x VciVdspinInitiatorWrapper<vci_param, dspin_cmd_width, dspin_rsp_width> 32 35 33 ////////////////////////////////////////////////////////// :////////////////////////////////34 tmpl(/**/)::VciVdspinInitiatorWrapper( sc_module_namename,35 size_tcmd_fifo_depth,36 size_t rsp_fifo_depth)37 :soclib::caba::BaseModule(name),38 39 40 41 42 43 44 45 r_fifo_cmd("r_fifo_cmd", cmd_fifo_depth),46 r_fifo_rsp("r_fifo_rsp", rsp_fifo_depth)36 ////////////////////////////////////////////////////////////////////////////////////////// 37 tmpl(/**/)::VciVdspinInitiatorWrapper( sc_module_name name, 38 size_t cmd_fifo_depth, 39 size_t rsp_fifo_depth ) 40 : soclib::caba::BaseModule(name), 41 p_clk("p_clk"), 42 p_resetn("p_resetn"), 43 p_dspin_out("p_dspin_out"), 44 p_dspin_in("p_dspin_in"), 45 p_vci("p_vci"), 46 r_cmd_fsm("r_cmd_fsm"), 47 r_rsp_fsm("r_rsp_fsm"), 48 r_fifo_cmd("r_fifo_cmd", cmd_fifo_depth), 49 r_fifo_rsp("r_fifo_rsp", rsp_fifo_depth) 47 50 { 48 51 SC_METHOD (transition); 49 52 dont_initialize(); 50 53 sensitive << p_clk.pos(); 54 51 55 SC_METHOD (genMoore); 52 56 dont_initialize(); … … 56 60 assert( (dspin_rsp_width == 33) && "The DSPIN RSP flit width must have 33 bits"); 57 61 assert( (vci_param::N <= 40) && "The VCI ADDRESS field cannot have more than 40 bits"); 58 assert( (vci_param::B == 4) && "The VCI DATA filds must have 32 bits"); 59 assert( (vci_param::K == 8) && "The VCI PLEN field cannot have more than 8 bits"); 60 assert( (vci_param::S <= 14) && "The VCI SRCID field cannot have more than 8 bits"); 61 assert( (vci_param::T <= 8) && "The VCI TRDID field cannot have more than 8 bits"); 62 assert( (vci_param::E == 2) && "The VCI RERROR field cannot have more than 2 bits"); 62 assert( (vci_param::B == 4 ) && "The VCI DATA filds must have 32 bits"); 63 assert( (vci_param::K == 8 ) && "The VCI PLEN field cannot have more than 8 bits"); 64 assert( (vci_param::S <= 14) && "The VCI SRCID field cannot have more than 14 bits"); 65 assert( (vci_param::T <= 4 ) && "The VCI TRDID field cannot have more than 4 bits"); 66 assert( (vci_param::P <= 4 ) && "The VCI PKTID field cannot have more than 4 bits"); 67 assert( (vci_param::E <= 2 ) && "The VCI RERROR field cannot have more than 2 bits"); 63 68 64 69 } // end constructor … … 68 73 { 69 74 sc_uint<dspin_cmd_width> cmd_fifo_data; 70 bool cmd_fifo_write;71 bool cmd_fifo_read;75 bool cmd_fifo_write; 76 bool cmd_fifo_read; 72 77 73 78 sc_uint<dspin_rsp_width> rsp_fifo_data; 74 bool rsp_fifo_write;75 bool rsp_fifo_read;79 bool rsp_fifo_write; 80 bool rsp_fifo_read; 76 81 77 82 if (p_resetn == false) 78 83 { 79 84 r_fifo_cmd.init(); 80 85 r_fifo_rsp.init(); … … 123 128 else address = address << (39 - vci_param::N); 124 129 125 if ( is_broadcast ) 130 if ( is_broadcast ) // VCI broacast command 126 131 { 127 132 r_cmd_fsm = CMD_BROADCAST; … … 131 136 0x0000000001LL; 132 137 } 133 else if (is_read ) 138 else if (is_read ) // VCI READ command 134 139 { 135 140 r_cmd_fsm = CMD_READ; 136 141 cmd_fifo_data = address & 0x7FFFFFFFFELL; 137 142 } 138 else 143 else // VCI WRITE command 139 144 { 140 145 r_cmd_fsm = CMD_WRITE; … … 144 149 break; 145 150 } 146 case CMD_BROADCAST: // write second DSPIN flit in case of broadcast151 case CMD_BROADCAST: // write second DSPIN flit in case of broadcast 147 152 { 148 153 if( p_vci.cmdval && r_fifo_cmd.wok() ) … … 158 163 break; 159 164 } 160 case CMD_READ: // write second DSPIN flit in case of read/write165 case CMD_READ: // write second DSPIN flit in case of read/write 161 166 case CMD_WRITE: 162 167 { … … 179 184 if ( p_vci.cons.read() ) cmd_fifo_data = cmd_fifo_data | 0x0000200000LL ; 180 185 181 if( r_cmd_fsm == CMD_READ ) 186 if( r_cmd_fsm == CMD_READ ) // read command 182 187 { 183 188 r_cmd_fsm = CMD_IDLE; 184 189 cmd_fifo_data = cmd_fifo_data | 0x8000000000LL ; 185 190 } 186 else // write command191 else // write command 187 192 { 188 193 r_cmd_fsm = CMD_WDATA; … … 221 226 // The FIFO output is analysed and translated to a VCI packet 222 227 ////////////////////////////////////////////////////////////// 223 // - A N+1 flits DSPIN re ad response packet is translated228 // - A N+1 flits DSPIN response packet is translated 224 229 // to a N flits VCI response. 225 // - A single flit DSPIN writeresponse packet is translated226 // to a single flit VCI response .230 // - A single flit DSPIN response packet is translated 231 // to a single flit VCI response with RDATA = 0. 227 232 // A valid DSPIN flit in the fifo_rsp is always consumed 228 233 // in the CMD_IDLE state, but no VCI flit is transmitted. 229 // The VCI flits are sent in the RSP_READ & RSP_WRITE states. 234 // The VCI flits are sent in the RSP_DSPIN_SINGLE_FLIT & 235 // RSP_DSPIN_MULTI_FLIT states. 230 236 ////////////////////////////////////////////////////////////// 231 237 … … 235 241 236 242 // r_rsp_fsm, rsp_fifo_read 237 rsp_fifo_read = false; // default value 238 239 switch(r_rsp_fsm) { 243 rsp_fifo_read = false; // default value 244 245 switch(r_rsp_fsm) 246 { 240 247 case RSP_IDLE: 241 {242 if( r_fifo_rsp.rok() )243 {244 rsp_fifo_read = true;245 r_rsp_buf = r_fifo_rsp.read();246 if ( (r_fifo_rsp.read() & 0x000020000LL) == 0 ) r_rsp_fsm = RSP_READ;247 else r_rsp_fsm = RSP_WRITE;248 }249 break;250 }251 case RSP_READ:252 248 { 253 if( r_fifo_rsp.rok() && p_vci.rspack.read() ) 254 { 255 rsp_fifo_read = true; 256 if ( (r_fifo_rsp.read() & 0x100000000LL) ) r_rsp_fsm = RSP_IDLE; 257 } 258 break; 259 } 260 case RSP_WRITE: 261 { 262 if ( p_vci.rspack.read() ) r_rsp_fsm = RSP_IDLE; 263 } 249 if( r_fifo_rsp.rok() ) 250 { 251 rsp_fifo_read = true; 252 r_rsp_buf = r_fifo_rsp.read(); 253 if ( (r_fifo_rsp.read() & 0x100000000LL) == 0x100000000LL ) 254 r_rsp_fsm = RSP_DSPIN_SINGLE_FLIT; 255 else 256 r_rsp_fsm = RSP_DSPIN_MULTI_FLIT; 257 } 258 break; 259 } 260 case RSP_DSPIN_SINGLE_FLIT: 261 { 262 if ( p_vci.rspack.read() ) 263 r_rsp_fsm = RSP_IDLE; 264 break; 265 } 266 case RSP_DSPIN_MULTI_FLIT: 267 { 268 if( r_fifo_rsp.rok() && p_vci.rspack.read() ) 269 { 270 rsp_fifo_read = true; 271 if ( (r_fifo_rsp.read() & 0x100000000LL) == 0x100000000LL ) 272 r_rsp_fsm = RSP_IDLE; 273 } 274 break; 275 } 264 276 } // end switch r_rsp_fsm 265 277 … … 275 287 { 276 288 // VCI CMD interface 277 278 279 280 289 if ( ( r_cmd_fsm.read() == CMD_IDLE ) || ( r_cmd_fsm.read() == CMD_WRITE ) ) 290 { 291 p_vci.cmdack = false; 292 } 281 293 else 282 283 284 294 { 295 p_vci.cmdack = r_fifo_cmd.wok(); 296 } 285 297 286 298 // VCI RSP interface 287 299 if ( r_rsp_fsm.read() == RSP_IDLE ) 288 289 290 291 else if ( r_rsp_fsm.read() == RSP_WRITE)292 293 294 295 296 297 298 299 300 301 else if ( r_rsp_fsm.read() == RSP_READ)302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 300 { 301 p_vci.rspval = false; 302 } 303 else if ( r_rsp_fsm.read() == RSP_DSPIN_SINGLE_FLIT ) 304 { 305 p_vci.rspval = true; 306 p_vci.rdata = 0; 307 p_vci.rsrcid = (sc_uint<vci_param::S>)((r_rsp_buf.read() & 0x0FFFC0000LL) >> 18); 308 p_vci.rpktid = (sc_uint<vci_param::T>)((r_rsp_buf.read() & 0x000000F00LL) >> 8); 309 p_vci.rtrdid = (sc_uint<vci_param::P>)((r_rsp_buf.read() & 0x00000F000LL) >> 12); 310 p_vci.rerror = (sc_uint<vci_param::E>)((r_rsp_buf.read() & 0x000030000LL) >> 16); 311 p_vci.reop = true; 312 } 313 else if ( r_rsp_fsm.read() == RSP_DSPIN_MULTI_FLIT ) 314 { 315 p_vci.rspval = r_fifo_rsp.rok(); 316 p_vci.rdata = (sc_uint<8*vci_param::B>)(r_fifo_rsp.read() & 0x0FFFFFFFFLL); 317 p_vci.rsrcid = (sc_uint<vci_param::S>)((r_rsp_buf.read() & 0x0FFFC0000LL) >> 18); 318 p_vci.rpktid = (sc_uint<vci_param::T>)((r_rsp_buf.read() & 0x000000F00LL) >> 8); 319 p_vci.rtrdid = (sc_uint<vci_param::P>)((r_rsp_buf.read() & 0x00000F000LL) >> 12); 320 p_vci.rerror = (sc_uint<vci_param::E>)((r_rsp_buf.read() & 0x000030000LL) >> 16); 321 p_vci.reop = ((r_fifo_rsp.read() & 0x100000000LL) == 0x100000000LL); 322 } 323 324 // DSPIN_OUT interface 325 p_dspin_out.write = r_fifo_cmd.rok(); 326 p_dspin_out.data = r_fifo_cmd.read(); 327 328 // DSPIN_IN interface 329 p_dspin_in.read = r_fifo_rsp.wok(); 318 330 319 331 }; // end genMoore … … 330 342 }; 331 343 const char* rsp_str[] = { 332 "RSP_IDLE ",333 "RSP_ READ",334 "RSP_ WRITE",344 "RSP_IDLE ", 345 "RSP_DSPIN_SINGLE_FLIT", 346 "RSP_DSPIN_MULTI_FLIT ", 335 347 }; 336 348
Note: See TracChangeset
for help on using the changeset viewer.