aboutsummaryrefslogtreecommitdiff
path: root/task5/tb_statemachine.sv
diff options
context:
space:
mode:
authorWarrick Lo <warrick.s.z.lo@gmail.com>2026-02-04 15:58:18 -0800
committerWarrick Lo <warrick.s.z.lo@gmail.com>2026-02-04 15:58:18 -0800
commit84a3a165abca3a301701326c09361a537b940ac3 (patch)
treec6abb4b510164053c3fac4107c110be87e9c4426 /task5/tb_statemachine.sv
parentRedesign state machine (diff)
Add testbenchHEADmaster
Diffstat (limited to '')
-rw-r--r--task5/tb_statemachine.sv268
1 files changed, 264 insertions, 4 deletions
diff --git a/task5/tb_statemachine.sv b/task5/tb_statemachine.sv
index 032359f..da4c601 100644
--- a/task5/tb_statemachine.sv
+++ b/task5/tb_statemachine.sv
@@ -1,7 +1,267 @@
module tb_statemachine();
+ logic err, slow_clock, resetb, load_pcard1, load_pcard2, load_pcard3,
+ load_dcard1, load_dcard2, load_dcard3,
+ player_win_light, dealer_win_light;
+ logic [3:0] dscore, pscore, pcard3;
-// Your testbench goes here. Make sure your tests exercise the entire design
-// in the .sv file. Note that in our tests the simulator will exit after
-// 10,000 ticks (equivalent to "initial #10000 $finish();").
+ statemachine DUT(slow_clock, resetb, dscore, pscore, pcard3,
+ load_pcard1, load_pcard2, load_pcard3,
+ load_dcard1, load_dcard2, load_dcard3,
+ player_win_light, dealer_win_light);
-endmodule
+ task check;
+ input logic [7:0] expected;
+
+ if (load_pcard1 !== expected[7]) begin
+ err = 1;
+ $display("FAILED: load_pcard1 is incorrect.",);
+ end
+ if (load_pcard2 !== expected[6]) begin
+ err = 1;
+ $display("FAILED: load_pcard2 is incorrect.",);
+ end
+ if (load_pcard3 !== expected[5]) begin
+ err = 1;
+ $display("FAILED: load_pcard3 is incorrect.",);
+ end
+ if (load_dcard1 !== expected[4]) begin
+ err = 1;
+ $display("FAILED: load_dcard1 is incorrect.",);
+ end
+ if (load_dcard2 !== expected[3]) begin
+ err = 1;
+ $display("FAILED: load_dcard2 is incorrect.",);
+ end
+ if (load_dcard3 !== expected[2]) begin
+ err = 1;
+ $display("FAILED: load_dcard3 is incorrect.",);
+ end
+ if (player_win_light !== expected[1]) begin
+ err = 1;
+ $display("FAILED: player_win_light is incorrect.",);
+ end
+ if (dealer_win_light !== expected[0]) begin
+ err = 1;
+ $display("FAILED: dealer_win_light is incorrect.",);
+ end
+ endtask: check
+
+ initial forever begin
+ slow_clock = 1'b0;
+ #5;
+ slow_clock = 1'b1;
+ #5;
+ end
+
+ initial begin
+ #10000;
+ $stop;
+ end
+
+ initial begin
+ err = 0;
+ pcard3 = 4'b0;
+
+ /* Natural 9 vs natural 8: deal four cards, player win. */
+
+ $display("Test 1");
+
+ resetb = 1'b0;
+ pscore = 4'd9;
+ dscore = 4'd8;
+
+ #10;
+
+ resetb = 1'b1;
+
+ check(8'b10000000); #10;
+ check(8'b00010000); #10;
+ check(8'b01000000); #10;
+ check(8'b00001000); #10;
+ check(8'b00000000); #10;
+ check(8'b00000010); #10;
+
+ /* Natural 8 vs natural 9: deal four cards, dealer win. */
+
+ $display("Test 2");
+
+ resetb = 1'b0;
+ pscore = 4'd8;
+ dscore = 4'd9;
+
+ #10;
+
+ resetb = 1'b1;
+
+ check(8'b10000000); #10;
+ check(8'b00010000); #10;
+ check(8'b01000000); #10;
+ check(8'b00001000); #10;
+ check(8'b00000000); #10;
+ check(8'b00000001); #10;
+
+ /* 7 vs 6: deal four cards, player win. */
+
+ $display("Test 3");
+
+ resetb = 1'b0;
+ pscore = 4'd7;
+ dscore = 4'd6;
+
+ #10;
+
+ resetb = 1'b1;
+
+ check(8'b10000000); #10;
+ check(8'b00010000); #10;
+ check(8'b01000000); #10;
+ check(8'b00001000); #10;
+ check(8'b00000000); #10;
+ check(8'b00000010); #10;
+
+ /* 7 vs 5: player stands, dealer hits, dealer win. */
+
+ $display("Test 4");
+
+ resetb = 1'b0;
+ pscore = 4'd7;
+ dscore = 4'd5;
+
+ #10;
+
+ resetb = 1'b1;
+
+ check(8'b10000000); #10;
+ check(8'b00010000); #10;
+ check(8'b01000000); #10;
+ check(8'b00001000); #10;
+
+ /* Dealer 3rd card is a 3. */
+ check(8'b00000100);
+ dscore = 4'd8;
+ #10;
+
+ check(8'b00000001); #10;
+
+ /* 3 vs 4: player hits and gets 7, dealer hits, dealer win. */
+
+ $display("Test 5");
+
+ resetb = 1'b0;
+ pscore = 4'd3;
+ dscore = 4'd4;
+
+ #10;
+
+ resetb = 1'b1;
+
+ check(8'b10000000); #10;
+ check(8'b00010000); #10;
+ check(8'b01000000); #10;
+ check(8'b00001000); #10;
+
+ /* Player draws a 7. */
+ pcard3 = 4'd7;
+ pscore = 4'b0;
+ check(8'b00100000);
+ #10;
+
+ /* Dealer 3rd card is a 3. */
+ check(8'b00000100);
+ dscore = 4'd8;
+ #10;
+
+ check(8'b00000001); #10;
+
+ /* 0 vs 3: player hits and gets 8, dealer stands, player win. */
+
+ $display("Test 6");
+
+ resetb = 1'b0;
+ pscore = 4'd0;
+ dscore = 4'd3;
+
+ #10;
+
+ resetb = 1'b1;
+
+ check(8'b10000000); #10;
+ check(8'b00010000); #10;
+ check(8'b01000000); #10;
+ check(8'b00001000); #10;
+
+ /* Player draws a 8. */
+ pcard3 = 4'd8;
+ pscore = 4'd8;
+ check(8'b00100000);
+ #10;
+
+ check(8'b00000010); #10;
+
+ /* 5 vs 0: player hits and gets 9, dealer hits, tie. */
+
+ $display("Test 7");
+
+ resetb = 1'b0;
+ pscore = 4'd5;
+ dscore = 4'd0;
+
+ #10;
+
+ resetb = 1'b1;
+
+ check(8'b10000000); #10;
+ check(8'b00010000); #10;
+ check(8'b01000000); #10;
+ check(8'b00001000); #10;
+
+ /* Player draws a 9. */
+ pcard3 = 4'd9;
+ pscore = 4'd4;
+ check(8'b00100000);
+ #10;
+
+ /* Dealer 3rd card is a 4. */
+ check(8'b00000100);
+ dscore = 4'd4;
+ #10;
+
+ check(8'b00000011); #10;
+
+ /* 5 vs 0: player hits and gets 9, dealer hits, dealer win. */
+
+ $display("Test 8");
+
+ resetb = 1'b0;
+ pscore = 4'd5;
+ dscore = 4'd0;
+
+ #10;
+
+ resetb = 1'b1;
+
+ check(8'b10000000); #10;
+ check(8'b00010000); #10;
+ check(8'b01000000); #10;
+ check(8'b00001000); #10;
+
+ /* Player draws a 9. */
+ pcard3 = 4'd9;
+ pscore = 4'd4;
+ check(8'b00100000);
+ #10;
+
+ /* Dealer 3rd card is a 5. */
+ check(8'b00000100);
+ dscore = 4'd5;
+ #10;
+
+ check(8'b00000001); #10;
+
+ if (~err)
+ $display("All tests passed.");
+
+ #10;
+ $stop;
+ end
+endmodule: tb_statemachine