mirror of
				https://github.com/KevinMidboe/linguist.git
				synced 2025-10-29 17:50:22 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			110 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			110 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| package TbTL;
 | |
| 
 | |
| import TL::*;
 | |
| 
 | |
| interface Lamp;
 | |
|    method Bool changed;
 | |
|    method Action show_offs;
 | |
|    method Action show_ons;
 | |
|    method Action reset;
 | |
| endinterface
 | |
| 
 | |
| module mkLamp#(String name, Bool lamp)(Lamp);
 | |
|    Reg#(Bool) prev <- mkReg(False);
 | |
| 
 | |
|    method changed = (prev != lamp);
 | |
| 
 | |
|    method Action show_offs;
 | |
|       if (prev && !lamp)
 | |
|       $write (name + " off, ");
 | |
|    endmethod
 | |
| 
 | |
|    method Action show_ons;
 | |
|       if (!prev && lamp)
 | |
|       $write (name + " on, ");
 | |
|    endmethod
 | |
| 
 | |
|    method Action reset;
 | |
|       prev <= lamp;
 | |
|    endmethod
 | |
| endmodule
 | |
| 
 | |
| 
 | |
| (* synthesize *)
 | |
| module mkTest();
 | |
|    let dut <- sysTL;
 | |
| 
 | |
|    Reg#(Bit#(16)) ctr <- mkReg(0);
 | |
| 
 | |
|    Reg#(Bool) carN <- mkReg(False);
 | |
|    Reg#(Bool) carS <- mkReg(False);
 | |
|    Reg#(Bool) carE <- mkReg(False);
 | |
|    Reg#(Bool) carW <- mkReg(False);
 | |
| 
 | |
|    Lamp lamps[12];
 | |
| 
 | |
|    lamps[0] <- mkLamp("0:  NS  red  ", dut.lampRedNS);
 | |
|    lamps[1] <- mkLamp("1:  NS  amber", dut.lampAmberNS);
 | |
|    lamps[2] <- mkLamp("2:  NS  green", dut.lampGreenNS);
 | |
|    lamps[3] <- mkLamp("3:  E   red  ", dut.lampRedE);
 | |
|    lamps[4] <- mkLamp("4:  E   amber", dut.lampAmberE);
 | |
|    lamps[5] <- mkLamp("5:  E   green", dut.lampGreenE);
 | |
|    lamps[6] <- mkLamp("6:  W   red  ", dut.lampRedW);
 | |
|    lamps[7] <- mkLamp("7:  W   amber", dut.lampAmberW);
 | |
|    lamps[8] <- mkLamp("8:  W   green", dut.lampGreenW);
 | |
| 
 | |
|    lamps[9]  <- mkLamp("9:  Ped red  ", dut.lampRedPed);
 | |
|    lamps[10] <- mkLamp("10: Ped amber", dut.lampAmberPed);
 | |
|    lamps[11] <- mkLamp("11: Ped green", dut.lampGreenPed);
 | |
| 
 | |
|    rule start (ctr == 0);
 | |
|       $dumpvars;
 | |
|    endrule
 | |
| 
 | |
|    rule detect_cars;
 | |
|       dut.set_car_state_N(carN);
 | |
|       dut.set_car_state_S(carS);
 | |
|       dut.set_car_state_E(carE);
 | |
|       dut.set_car_state_W(carW);
 | |
|    endrule
 | |
| 
 | |
|    rule go;
 | |
|       ctr <= ctr + 1;
 | |
|       if (ctr == 5000) carN <= True;
 | |
|       if (ctr == 6500) carN <= False;
 | |
|       if (ctr == 12_000) dut.ped_button_push;
 | |
|    endrule
 | |
| 
 | |
|    rule stop (ctr > 32768);
 | |
|       $display("TESTS FINISHED");
 | |
|       $finish(0);
 | |
|    endrule
 | |
| 
 | |
|    function do_offs(l) = l.show_offs;
 | |
|       function do_ons(l) = l.show_ons;
 | |
|       function do_reset(l) = l.reset;
 | |
| 
 | |
|       function do_it(f);
 | |
|          action
 | |
|          for (Integer i=0; i<12; i=i+1)
 | |
|             f(lamps[i]);
 | |
|          endaction
 | |
|       endfunction
 | |
| 
 | |
|       function any_changes();
 | |
|          Bool b = False;
 | |
|          for (Integer i=0; i<12; i=i+1)
 | |
|              b = b || lamps[i].changed;
 | |
|          return b;
 | |
|       endfunction
 | |
| 
 | |
|       rule show (any_changes());
 | |
|       do_it(do_offs);
 | |
|       do_it(do_ons);
 | |
|       do_it(do_reset);
 | |
|       $display("(at time %d)", $time);
 | |
|    endrule
 | |
| endmodule
 | |
| 
 | |
| endpackage
 |