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
|