Computer Laboratory

Bluepsec Examples

Thacker's Tiny 3 Computer - Test Bench

Overview

This package contains a test bench for Thacker's Tiny 3 Computer.

The code

package TinyTestBench;

import FIFO::*;
import GetPut::*;
import StmtFSM::*;
import TinyTypes::*;
import TinyAsm::*;
import Tiny3::*;
import BRAM::*;
import Vector::*;
import BuildVector::*;


// example assembler program - a simple loop with output
function List#(AsmLineT) simple_loop(function ImmT findaddr(String label));
  let program_memory = vec(
     asmi("",    0, 0),                                             // r0 = 0
     asmi("",    1, 10),                                            // r1 = 10
     asmi("",    2, findaddr("loop")),                              // r2 = loop address
     asm("loop", OpOut,      FDECb, ShiftNone, SkipZero,  1, 0, 1), // r1-- and output, skip if zero
     asm("",     OpJump,     FaORb, ShiftNone, SkipNever,32, 2, 0), // jump r2, r32=temporary to dispose of func result
     asm("",     OpReserved, FaORb, ShiftNone, SkipNever, 0, 0, 0)  // stop processor
     );
  return toList(program_memory);
endfunction


// example assembler to do a simple memory test
function List#(AsmLineT) simple_memory_test(function ImmT findaddr(String label));
  let program_memory = vec(
     asmi("",       0, 0),                                              // put 0 in r0
     asmi("",       1, 16),                                             // put 16 in r1 (loop max)
     asmi("",       2, 4),                                              // initial data value
     asmi("",       16, findaddr("memfill")),                           // loop address in r16
     asm("memfill", OpStoreDM, FaORb,  ShiftNone, SkipNever, 32, 2, 0), // store: dmem[r0] = r2
     asm("",        OpNormal,   FaADDb,ShiftNone, SkipNever,  2, 2, 2), // r2=r2+r2
     asm("",        OpNormal,   FINCb, ShiftNone, SkipNever,  0, 0, 0), // r0++
     asm("",        OpNormal,   FDECb, ShiftNone, SkipZero,   1, 0, 1), // r1--, skip if zero
     asm("",        OpJump,     FaORb, ShiftNone, SkipNever, 32,16,16), // jump r2 (skipped if r1 was zero)
     asmi("",       0, 0),                                              // put 0 in r0
     asmi("",       1, 16),                                             // put 16 in r1 (loop max)
     asmi("",       16, findaddr("memread")),                           // loop address in r16
     asm("memread", OpLoadDM,   FaORb, ShiftNone, SkipNever,  2, 0, 0), // r2=dmem[r0]
     asm("",        OpOut,      FaORb, ShiftNone, SkipNever,  2, 2, 2), // output r2
     asm("",        OpNormal,   FINCb, ShiftNone, SkipNever,  0, 0, 0), // r0++
     asm("",        OpNormal,   FDECb, ShiftNone, SkipZero,   1, 0, 1), // r1--, skip if zero
     asm("",        OpJump,     FaORb, ShiftNone, SkipNever, 32,16,16), // jump r2 (skipped if r1 was zero)
     asm("",        OpReserved, FaORb, ShiftNone, SkipNever,  0, 0, 0)  // stop processor
     );
  return toList(program_memory);
endfunction


module mkTinyTestBench(Empty);
  
  let codeToRun = simple_loop;
//  let codeToRun = simple_memory_test;

  InstructionROM_T irom = assembler(codeToRun);
  
  TinyCompIfc tiny <- mkTinyComp(irom);

  // check assembly of ROM worked   
  Reg#(Bool) report_rom_state <- mkReg(True);
  rule disassemble (report_rom_state);
    report_rom_state <= False;
    // check for duplicate labels
    let fd = find_duplicate_labels(codeToRun);
    if(tpl_1(fd))
      begin
	$display("Assembler error - duplicate labels found:");
	$write(tpl_2(fd)); // report any errors
      end
  endrule

  rule handle_output;
      let out <- tiny.out.get();
      $display("%05t: \t\t\t*********************",$time);
      $display("%05t: \t\t\t* output = %8d *",$time,out);
      $display("%05t: \t\t\t*********************",$time);
  endrule

endmodule



endpackage: TinyTestBench


Link to the TinyTestBench.bsv source