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