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