Mercurial > pygar
comparison modules/bluespec/Pygar/core/Processor.bsv @ 63:1d5cbb5343d2 pygar svn.64
[svn r64] mods to compile correctly for FPGA
author | punk |
---|---|
date | Mon, 10 May 2010 22:54:54 -0400 |
parents | 2991344775f8 |
children | cf8bb3038cbd |
comparison
equal
deleted
inserted
replaced
62:90fa9b289aab | 63:1d5cbb5343d2 |
---|---|
79 interface Put#(AudioProcessorUnit) sampleInput; | 79 interface Put#(AudioProcessorUnit) sampleInput; |
80 | 80 |
81 endinterface | 81 endinterface |
82 | 82 |
83 typedef enum { PCgen, Exec, Writeback } Stage deriving(Eq,Bits); | 83 typedef enum { PCgen, Exec, Writeback } Stage deriving(Eq,Bits); |
84 | |
85 //----------------------------------------------------------- | |
86 // Register file module | |
87 //----------------------------------------------------------- | |
88 | |
89 interface BRFile; | |
90 method Action wr( Rindx rindx, Bit#(32) data ); | |
91 method Bit#(32) rd1( Rindx rindx ); | |
92 method Bit#(32) rd2( Rindx rindx ); | |
93 endinterface | |
94 | |
95 module mkBRFile( BRFile ); | |
96 | |
97 RegFile#(Rindx,Bit#(32)) rfile <- mkBRegFile(); | |
98 | |
99 method Action wr( Rindx rindx, Bit#(32) data ); | |
100 rfile.upd( rindx, data ); | |
101 endmethod | |
102 | |
103 method Bit#(32) rd1( Rindx rindx ); | |
104 return ( rindx == 0 ) ? 0 : rfile.sub(rindx); | |
105 endmethod | |
106 | |
107 method Bit#(32) rd2( Rindx rindx ); | |
108 return ( rindx == 0 ) ? 0 : rfile.sub(rindx); | |
109 endmethod | |
110 | |
111 endmodule | |
112 | 84 |
113 //----------------------------------------------------------- | 85 //----------------------------------------------------------- |
114 // Helper functions | 86 // Helper functions |
115 //----------------------------------------------------------- | 87 //----------------------------------------------------------- |
116 | 88 |
223 // Standard processor state | 195 // Standard processor state |
224 | 196 |
225 Reg#(Addr) pc <- mkReg(32'h00001000); | 197 Reg#(Addr) pc <- mkReg(32'h00001000); |
226 Reg#(Epoch) epoch <- mkReg(0); | 198 Reg#(Epoch) epoch <- mkReg(0); |
227 Reg#(Stage) stage <- mkReg(PCgen); | 199 Reg#(Stage) stage <- mkReg(PCgen); |
228 BRFile rf <- mkBRFile; | 200 BRegFile rf <- mkBRegFile; |
229 | 201 |
230 // Branch Prediction | 202 // Branch Prediction |
231 BranchPred bp <- mkBranchPred(); | 203 BranchPred bp <- mkBranchPred(); |
232 FIFO#(PCStat) execpc <- mkLFIFO(); | 204 FIFO#(PCStat) execpc <- mkLFIFO(); |
233 | 205 |
333 | 305 |
334 // -- Memory Ops ------------------------------------------------ | 306 // -- Memory Ops ------------------------------------------------ |
335 | 307 |
336 tagged LW .it : | 308 tagged LW .it : |
337 begin | 309 begin |
338 Addr addr = rf.rd1(it.rbase) + sext(it.offset); | 310 let val_rbase <- rf.rd1(it.rbase); |
311 Addr addr = val_rbase + sext(it.offset); | |
339 dataReqQ.enq( LoadReq{ addr:addr, tag:zeroExtend(it.rdst) } ); | 312 dataReqQ.enq( LoadReq{ addr:addr, tag:zeroExtend(it.rdst) } ); |
340 wbQ.enq(tagged WB_Load it.rdst); | 313 wbQ.enq(tagged WB_Load it.rdst); |
341 end | 314 end |
342 | 315 |
343 tagged SW .it : | 316 tagged SW .it : |
344 begin | 317 begin |
345 Addr addr = rf.rd1(it.rbase) + sext(it.offset); | 318 let val_rbase <- rf.rd1(it.rbase); |
346 dataReqQ.enq( StoreReq{ tag:0, addr:addr, data:rf.rd2(it.rsrc) } ); | 319 let val_rsrc2 <- rf.rd2(it.rsrc); |
320 Addr addr = val_rbase + sext(it.offset); | |
321 dataReqQ.enq( StoreReq{ tag:0, addr:addr, data:val_rsrc2 } ); | |
347 wbQ.enq(tagged WB_Store); | 322 wbQ.enq(tagged WB_Store); |
348 end | 323 end |
349 | 324 |
350 // -- Simple Ops ------------------------------------------------ | 325 // -- Simple Ops ------------------------------------------------ |
351 | 326 |
352 tagged ADDIU .it : | 327 tagged ADDIU .it : |
353 begin | 328 begin |
354 Bit#(32) result = rf.rd1(it.rsrc) + sext(it.imm); | 329 let val_rsrc1 <- rf.rd1(it.rsrc); |
330 Bit#(32) result = val_rsrc1 + sext(it.imm); | |
355 wbQ.enq(tagged WB_ALU {data:result, dest:it.rdst}); | 331 wbQ.enq(tagged WB_ALU {data:result, dest:it.rdst}); |
356 end | 332 end |
357 tagged SLTI .it : wbQ.enq(tagged WB_ALU {dest:it.rdst, data:slt( rf.rd1(it.rsrc), sext(it.imm) )}); | 333 tagged SLTI .it : |
358 tagged SLTIU .it : wbQ.enq(tagged WB_ALU {dest:it.rdst, data:sltu( rf.rd1(it.rsrc), sext(it.imm) ) }); | 334 begin |
335 let val_rsrc1 <- rf.rd1(it.rsrc); | |
336 wbQ.enq(tagged WB_ALU {dest:it.rdst, data:slt( val_rsrc1, sext(it.imm) )}); | |
337 end | |
338 tagged SLTIU .it : | |
339 begin | |
340 let val_rsrc1 <- rf.rd1(it.rsrc); | |
341 wbQ.enq(tagged WB_ALU {dest:it.rdst, data:sltu( val_rsrc1, sext(it.imm) ) }); | |
342 end | |
359 tagged ANDI .it : | 343 tagged ANDI .it : |
360 begin | 344 begin |
345 let val_rsrc1 <- rf.rd1(it.rsrc); | |
361 Bit#(32) zext_it_imm = zext(it.imm); | 346 Bit#(32) zext_it_imm = zext(it.imm); |
362 wbQ.enq(tagged WB_ALU {dest:it.rdst, data:(rf.rd1(it.rsrc) & zext_it_imm)} ); | 347 wbQ.enq(tagged WB_ALU {dest:it.rdst, data:(val_rsrc1 & zext_it_imm)} ); |
363 end | 348 end |
364 tagged ORI .it : | 349 tagged ORI .it : |
365 begin | 350 begin |
351 let val_rsrc1 <- rf.rd1(it.rsrc); | |
366 Bit#(32) zext_it_imm = zext(it.imm); | 352 Bit#(32) zext_it_imm = zext(it.imm); |
367 wbQ.enq(tagged WB_ALU {dest:it.rdst, data:(rf.rd1(it.rsrc) | zext_it_imm)} ); | 353 wbQ.enq(tagged WB_ALU {dest:it.rdst, data:(val_rsrc1 | zext_it_imm)} ); |
368 end | 354 end |
369 tagged XORI .it : | 355 tagged XORI .it : |
370 begin | 356 begin |
357 let val_rsrc1 <- rf.rd1(it.rsrc); | |
371 Bit#(32) zext_it_imm = zext(it.imm); | 358 Bit#(32) zext_it_imm = zext(it.imm); |
372 wbQ.enq(tagged WB_ALU {dest: it.rdst, data:(rf.rd1(it.rsrc) ^ zext_it_imm )}); | 359 wbQ.enq(tagged WB_ALU {dest: it.rdst, data:(val_rsrc1 ^ zext_it_imm )}); |
373 end | 360 end |
374 tagged LUI .it : | 361 tagged LUI .it : |
375 begin | 362 begin |
376 Bit#(32) zext_it_imm = zext(it.imm); | 363 Bit#(32) zext_it_imm = zext(it.imm); |
377 wbQ.enq(tagged WB_ALU {dest: it.rdst, data:(zext_it_imm << 32'd16) }); | 364 wbQ.enq(tagged WB_ALU {dest: it.rdst, data:(zext_it_imm << 32'd16) }); |
378 end | 365 end |
379 | 366 |
380 tagged SLL .it : | 367 tagged SLL .it : |
381 begin | 368 begin |
369 let val_rsrc1 <- rf.rd1(it.rsrc); | |
382 Bit#(32) zext_it_shamt = zext(it.shamt); | 370 Bit#(32) zext_it_shamt = zext(it.shamt); |
383 wbQ.enq(tagged WB_ALU {dest: it.rdst, data:(rf.rd1(it.rsrc) << zext_it_shamt )} ); | 371 wbQ.enq(tagged WB_ALU {dest: it.rdst, data:(val_rsrc1 << zext_it_shamt )} ); |
384 end | 372 end |
385 tagged SRL .it : | 373 tagged SRL .it : |
386 begin | 374 begin |
375 let val_rsrc1 <- rf.rd1(it.rsrc); | |
387 Bit#(32) zext_it_shamt = zext(it.shamt); | 376 Bit#(32) zext_it_shamt = zext(it.shamt); |
388 wbQ.enq(tagged WB_ALU {dest: it.rdst, data:(rf.rd1(it.rsrc) >> zext_it_shamt )}); | 377 wbQ.enq(tagged WB_ALU {dest: it.rdst, data:(val_rsrc1 >> zext_it_shamt )}); |
389 end | 378 end |
390 tagged SRA .it : | 379 tagged SRA .it : |
391 begin | 380 begin |
381 let val_rsrc1 <- rf.rd1(it.rsrc); | |
392 Bit#(32) zext_it_shamt = zext(it.shamt); | 382 Bit#(32) zext_it_shamt = zext(it.shamt); |
393 wbQ.enq(tagged WB_ALU {dest: it.rdst, data:sra( rf.rd1(it.rsrc), zext_it_shamt )}); | 383 wbQ.enq(tagged WB_ALU {dest: it.rdst, data:sra( val_rsrc1, zext_it_shamt )}); |
394 end | 384 end |
395 tagged SLLV .it : wbQ.enq(tagged WB_ALU {dest: it.rdst, data:(rf.rd1(it.rsrc) << rshft(rf.rd2(it.rshamt)) )}); | 385 tagged SLLV .it : |
396 tagged SRLV .it : wbQ.enq(tagged WB_ALU {dest: it.rdst, data:(rf.rd1(it.rsrc) >> rshft(rf.rd2(it.rshamt)) )} ); | 386 begin |
397 tagged SRAV .it : wbQ.enq(tagged WB_ALU {dest: it.rdst, data:sra( rf.rd1(it.rsrc), rshft(rf.rd2(it.rshamt)) ) }); | 387 let val_rsrc1 <- rf.rd1(it.rsrc); |
398 tagged ADDU .it : wbQ.enq(tagged WB_ALU {dest: it.rdst, data:(rf.rd1(it.rsrc1) + rf.rd2(it.rsrc2) )} ); | 388 let val_rshamt <- rf.rd2(it.rshamt); |
399 tagged SUBU .it : wbQ.enq(tagged WB_ALU {dest: it.rdst, data:(rf.rd1(it.rsrc1) - rf.rd2(it.rsrc2) )} ); | 389 wbQ.enq(tagged WB_ALU {dest: it.rdst, data:(val_rsrc1 << rshft(val_rshamt) )}); |
400 tagged AND .it : wbQ.enq(tagged WB_ALU {dest: it.rdst, data:(rf.rd1(it.rsrc1) & rf.rd2(it.rsrc2) )} ); | 390 end |
401 tagged OR .it : wbQ.enq(tagged WB_ALU {dest: it.rdst, data:(rf.rd1(it.rsrc1) | rf.rd2(it.rsrc2) )} ); | 391 tagged SRLV .it : |
402 tagged XOR .it : wbQ.enq(tagged WB_ALU {dest: it.rdst, data:(rf.rd1(it.rsrc1) ^ rf.rd2(it.rsrc2) )} ); | 392 begin |
403 tagged NOR .it : wbQ.enq(tagged WB_ALU {dest: it.rdst, data:(~(rf.rd1(it.rsrc1) | rf.rd2(it.rsrc2)) )} ); | 393 let val_rsrc1 <- rf.rd1(it.rsrc); |
404 tagged SLT .it : wbQ.enq(tagged WB_ALU {dest: it.rdst, data:slt( rf.rd1(it.rsrc1), rf.rd2(it.rsrc2) ) }); | 394 let val_rshamt <- rf.rd2(it.rshamt); |
405 tagged SLTU .it : wbQ.enq(tagged WB_ALU {dest: it.rdst, data:sltu( rf.rd1(it.rsrc1), rf.rd2(it.rsrc2) ) }); | 395 wbQ.enq(tagged WB_ALU {dest: it.rdst, data:(val_rsrc1 >> rshft(val_rshamt) )} ); |
396 end | |
397 tagged SRAV .it : | |
398 begin | |
399 let val_rsrc1 <- rf.rd1(it.rsrc); | |
400 let val_rshamt <- rf.rd2(it.rshamt); | |
401 wbQ.enq(tagged WB_ALU {dest: it.rdst, data:sra( val_rsrc1, rshft(val_rshamt) ) }); | |
402 end | |
403 tagged ADDU .it : | |
404 begin | |
405 let val_rsrc11 <- rf.rd1(it.rsrc1); | |
406 let val_rsrc22 <- rf.rd2(it.rsrc2); | |
407 wbQ.enq(tagged WB_ALU {dest: it.rdst, data:(val_rsrc11 + val_rsrc22 )} ); | |
408 end | |
409 tagged SUBU .it : | |
410 begin | |
411 let val_rsrc11 <- rf.rd1(it.rsrc1); | |
412 let val_rsrc22 <- rf.rd2(it.rsrc2); | |
413 wbQ.enq(tagged WB_ALU {dest: it.rdst, data:(val_rsrc11 - val_rsrc22 )} ); | |
414 end | |
415 tagged AND .it : | |
416 begin | |
417 let val_rsrc11 <- rf.rd1(it.rsrc1); | |
418 let val_rsrc22 <- rf.rd2(it.rsrc2); | |
419 wbQ.enq(tagged WB_ALU {dest: it.rdst, data:(val_rsrc11 & val_rsrc22 )} ); | |
420 end | |
421 tagged OR .it : | |
422 begin | |
423 let val_rsrc11 <- rf.rd1(it.rsrc1); | |
424 let val_rsrc22 <- rf.rd2(it.rsrc2); | |
425 wbQ.enq(tagged WB_ALU {dest: it.rdst, data:(val_rsrc11 | val_rsrc22 )} ); | |
426 end | |
427 tagged XOR .it : | |
428 begin | |
429 let val_rsrc11 <- rf.rd1(it.rsrc1); | |
430 let val_rsrc22 <- rf.rd2(it.rsrc2); | |
431 wbQ.enq(tagged WB_ALU {dest: it.rdst, data:(val_rsrc11 ^ val_rsrc22 )} ); | |
432 end | |
433 tagged NOR .it : | |
434 begin | |
435 let val_rsrc11 <- rf.rd1(it.rsrc1); | |
436 let val_rsrc22 <- rf.rd2(it.rsrc2); | |
437 wbQ.enq(tagged WB_ALU {dest: it.rdst, data:(~(val_rsrc11 | val_rsrc22) )} ); | |
438 end | |
439 tagged SLT .it : | |
440 begin | |
441 let val_rsrc11 <- rf.rd1(it.rsrc1); | |
442 let val_rsrc22 <- rf.rd2(it.rsrc2); | |
443 wbQ.enq(tagged WB_ALU {dest: it.rdst, data:slt( val_rsrc11, val_rsrc22 ) }); | |
444 end | |
445 tagged SLTU .it : | |
446 begin | |
447 let val_rsrc11 <- rf.rd1(it.rsrc1); | |
448 let val_rsrc22 <- rf.rd2(it.rsrc2); | |
449 wbQ.enq(tagged WB_ALU {dest: it.rdst, data:sltu( val_rsrc11, val_rsrc22 ) }); | |
450 end | |
406 | 451 |
407 // -- Branches -------------------------------------------------- | 452 // -- Branches -------------------------------------------------- |
408 | 453 |
409 tagged BLEZ .it : | 454 tagged BLEZ .it : |
410 if ( signedLE( rf.rd1(it.rsrc), 0 ) ) | 455 begin |
411 begin | 456 let val_rsrc1 <- rf.rd1(it.rsrc); |
457 if ( signedLE( val_rsrc1, 0 ) ) | |
458 begin | |
412 newPC = pc_plus4 + (sext(it.offset) << 2); | 459 newPC = pc_plus4 + (sext(it.offset) << 2); |
413 branchTaken = True; | 460 branchTaken = True; |
414 end | 461 end |
462 end | |
415 | 463 |
416 tagged BGTZ .it : | 464 tagged BGTZ .it : |
417 if ( signedGT( rf.rd1(it.rsrc), 0 ) ) | 465 begin |
466 let val_rsrc1 <- rf.rd1(it.rsrc); | |
467 if ( signedGT( val_rsrc1, 0 ) ) | |
418 begin | 468 begin |
419 newPC = pc_plus4 + (sext(it.offset) << 2); | 469 newPC = pc_plus4 + (sext(it.offset) << 2); |
420 branchTaken = True; | 470 branchTaken = True; |
421 end | 471 end |
472 end | |
422 | 473 |
423 tagged BLTZ .it : | 474 tagged BLTZ .it : |
424 if ( signedLT( rf.rd1(it.rsrc), 0 ) ) | 475 begin |
476 let val_rsrc1 <- rf.rd1(it.rsrc); | |
477 if ( signedLT( val_rsrc1, 0 ) ) | |
425 begin | 478 begin |
426 newPC = pc_plus4 + (sext(it.offset) << 2); | 479 newPC = pc_plus4 + (sext(it.offset) << 2); |
427 branchTaken = True; | 480 branchTaken = True; |
428 end | 481 end |
482 end | |
429 | 483 |
430 tagged BGEZ .it : | 484 tagged BGEZ .it : |
431 if ( signedGE( rf.rd1(it.rsrc), 0 ) ) | 485 begin |
432 begin | 486 let val_rsrc1 <- rf.rd1(it.rsrc); |
433 newPC = pc_plus4 + (sext(it.offset) << 2); | 487 if ( signedGE( val_rsrc1, 0 ) ) |
434 branchTaken = True; | 488 begin |
435 end | 489 newPC = pc_plus4 + (sext(it.offset) << 2); |
490 branchTaken = True; | |
491 end | |
492 end | |
436 | 493 |
437 tagged BEQ .it : | 494 tagged BEQ .it : |
438 if ( rf.rd1(it.rsrc1) == rf.rd2(it.rsrc2) ) | 495 begin |
496 let val_rsrc11 <- rf.rd1(it.rsrc1); | |
497 let val_rsrc22 <- rf.rd2(it.rsrc2); | |
498 if ( val_rsrc11 == val_rsrc22 ) | |
439 begin | 499 begin |
440 newPC = pc_plus4 + (sext(it.offset) << 2); | 500 newPC = pc_plus4 + (sext(it.offset) << 2); |
441 branchTaken = True; | 501 branchTaken = True; |
442 end | 502 end |
503 end | |
443 | 504 |
444 tagged BNE .it : | 505 tagged BNE .it : |
445 if ( rf.rd1(it.rsrc1) != rf.rd2(it.rsrc2) ) | 506 begin |
507 let val_rsrc11 <- rf.rd1(it.rsrc1); | |
508 let val_rsrc22 <- rf.rd2(it.rsrc2); | |
509 if ( val_rsrc11 != val_rsrc22 ) | |
446 begin | 510 begin |
447 newPC = pc_plus4 + (sext(it.offset) << 2); | 511 newPC = pc_plus4 + (sext(it.offset) << 2); |
448 branchTaken = True; | 512 branchTaken = True; |
449 end | 513 end |
514 end | |
450 | 515 |
451 // -- Jumps ----------------------------------------------------- | 516 // -- Jumps ----------------------------------------------------- |
452 | 517 |
453 tagged J .it : | 518 tagged J .it : |
454 begin | 519 begin |
455 newPC = { pc_plus4[31:28], it.target, 2'b0 }; | 520 newPC = { pc_plus4[31:28], it.target, 2'b0 }; |
456 branchTaken = True; | 521 branchTaken = True; |
457 end | 522 end |
458 | 523 |
459 tagged JR .it : | 524 tagged JR .it : |
460 begin | 525 begin |
461 newPC = rf.rd1(it.rsrc); | 526 let val_rsrc1 <- rf.rd1(it.rsrc); |
527 newPC = val_rsrc1; | |
462 branchTaken = True; | 528 branchTaken = True; |
463 end | 529 end |
464 | 530 |
465 tagged JAL .it : | 531 tagged JAL .it : |
466 begin | 532 begin |
469 branchTaken = True; | 535 branchTaken = True; |
470 end | 536 end |
471 | 537 |
472 tagged JALR .it : | 538 tagged JALR .it : |
473 begin | 539 begin |
540 let val_rsrc1 <- rf.rd1(it.rsrc); | |
474 wbQ.enq(tagged WB_ALU {dest:it.rdst, data:pc_plus4 }); | 541 wbQ.enq(tagged WB_ALU {dest:it.rdst, data:pc_plus4 }); |
475 newPC = rf.rd1(it.rsrc); | 542 newPC = val_rsrc1; |
476 branchTaken = True; | 543 branchTaken = True; |
477 end | 544 end |
478 | 545 |
479 // -- Cop0 ------------------------------------------------------ | 546 // -- Cop0 ------------------------------------------------------ |
480 | 547 |
481 tagged MTC0 .it : //Recieve things from host computer | 548 tagged MTC0 .it : //Recieve things from host computer |
482 begin | 549 begin |
550 let val_rsrc1 <- rf.rd1(it.rsrc); | |
483 // $display( " PROCESSOR MTC0 call\n"); | 551 // $display( " PROCESSOR MTC0 call\n"); |
484 case ( it.cop0dst ) | 552 case ( it.cop0dst ) |
485 5'd10 : cp0_statsEn <= unpack(truncate(rf.rd1(it.rsrc))); | 553 5'd10 : cp0_statsEn <= unpack(truncate(val_rsrc1)); |
486 5'd21 : cp0_tohost <= truncate(rf.rd1(it.rsrc)); | 554 5'd21 : cp0_tohost <= truncate(val_rsrc1); |
487 5'd26 : cp0_progComp <= unpack(truncate(rf.rd1(it.rsrc))); //states audio program completed and termination okay | 555 5'd26 : cp0_progComp <= unpack(truncate(val_rsrc1)); //states audio program completed and termination okay |
488 5'd27 : outAudioFifo.enq(tagged Sample unpack(truncate(rf.rd1(it.rsrc)))); //Bit size is 16 not 32 | 556 5'd27 : outAudioFifo.enq(tagged Sample unpack(truncate(val_rsrc1))); //Bit size is 16 not 32 |
489 default : | 557 default : |
490 $display( " RTL-ERROR : %m : Illegal MTC0 cop0dst register!" ); | 558 $display( " RTL-ERROR : %m : Illegal MTC0 cop0dst register!" ); |
491 endcase | 559 endcase |
492 wbQ.enq(tagged WB_Host 0); //no idea wwhat this actually should be. | 560 wbQ.enq(tagged WB_Host 0); //no idea wwhat this actually should be. |
493 end | 561 end |