diff options
| author | Warrick Lo <warrick.s.z.lo@gmail.com> | 2026-02-04 15:58:18 -0800 |
|---|---|---|
| committer | Warrick Lo <warrick.s.z.lo@gmail.com> | 2026-02-04 15:58:18 -0800 |
| commit | 84a3a165abca3a301701326c09361a537b940ac3 (patch) | |
| tree | c6abb4b510164053c3fac4107c110be87e9c4426 /task5/tb_datapath.sv | |
| parent | Redesign state machine (diff) | |
Diffstat (limited to 'task5/tb_datapath.sv')
| -rw-r--r-- | task5/tb_datapath.sv | 338 |
1 files changed, 334 insertions, 4 deletions
diff --git a/task5/tb_datapath.sv b/task5/tb_datapath.sv index 64ff5ab..823ead5 100644 --- a/task5/tb_datapath.sv +++ b/task5/tb_datapath.sv @@ -1,7 +1,337 @@ +`define ACE 7'b0001000 +`define TWO 7'b0100100 +`define THREE 7'b0110000 +`define FOUR 7'b0011001 +`define FIVE 7'b0010010 +`define SIX 7'b0000010 +`define SEVEN 7'b1111000 +`define EIGHT 7'b0000000 +`define NINE 7'b0010000 +`define TEN 7'b1000000 +`define JACK 7'b1100001 +`define QUEEN 7'b0011000 +`define KING 7'b0001001 +`define BLANK 7'b1111111 + module tb_datapath(); + logic err, slow_clock, fast_clock, resetb, + load_pcard1, load_pcard2, load_pcard3, + load_dcard1, load_dcard2, load_dcard3; + logic [3:0] pcard3_out, pscore_out, dscore_out; + logic [6:0] HEX0, HEX1, HEX2, HEX3, HEX4, HEX5; + + datapath DUT(slow_clock, fast_clock, resetb, + load_pcard1, load_pcard2, load_pcard3, + load_dcard1, load_dcard2, load_dcard3, + pcard3_out, pscore_out, dscore_out, + HEX5, HEX4, HEX3, HEX2, HEX1, HEX0); + + task check; + input logic [3:0] expected_pscore, expected_dscore; + input logic [6:0] expected_HEX0, expected_HEX1, expected_HEX2, + expected_HEX3, expected_HEX4, expected_HEX5; + + if (pscore_out !== expected_pscore) begin + err = 1; + $display("FAILED: pscore_out is incorrect.",); + end + if (dscore_out !== expected_dscore) begin + err = 1; + $display("FAILED: dscore_out is incorrect.",); + end + if (HEX0 !== expected_HEX0) begin + err = 1; + $display("FAILED: HEX0 is incorrect.",); + end + if (HEX1 !== expected_HEX1) begin + err = 1; + $display("FAILED: HEX1 is incorrect.",); + end + if (HEX2 !== expected_HEX2) begin + err = 1; + $display("FAILED: HEX2 is incorrect.",); + end + if (HEX3 !== expected_HEX3) begin + err = 1; + $display("FAILED: HEX3 is incorrect.",); + end + if (HEX4 !== expected_HEX4) begin + err = 1; + $display("FAILED: HEX4 is incorrect.",); + end + if (HEX5 !== expected_HEX5) begin + err = 1; + $display("FAILED: HEX5 is incorrect.",); + end + endtask: check + + initial forever begin + slow_clock = 1'b0; + #5; + slow_clock = 1'b1; + #5; + end + + initial begin + err = 0; + + {resetb, load_pcard1, load_pcard2, load_pcard3, + load_pcard1, load_pcard2, load_pcard3} + = 7'b0; + + #10; + + resetb = 1'b1; + + /* Player: AK8, dealer: TJ9. */ + + /* Load A. */ + + $display("Test 1.1"); + + force tb_datapath.DUT.new_card = 4'd1; + load_pcard1 = 1'b1; + + #10; + + check(4'd1, 4'd0, `ACE, `BLANK, `BLANK, `BLANK, `BLANK, `BLANK); + load_pcard1 = 1'b0; + + /* Load T. */ + + $display("Test 1.2"); + + force tb_datapath.DUT.new_card = 4'd10; + load_dcard1 = 1'b1; + + #10; + + check(4'd1, 4'd0, `ACE, `BLANK, `BLANK, `TEN, `BLANK, `BLANK); + load_dcard1 = 1'b0; + + /* Load K. */ + + $display("Test 1.3"); + + force tb_datapath.DUT.new_card = 4'd13; + load_pcard2 = 1'b1; + + #10; + + check(4'd1, 4'd0, `ACE, `KING, `BLANK, `TEN, `BLANK, `BLANK); + load_pcard2 = 1'b0; + + /* Load J. */ + + $display("Test 1.4"); + + force tb_datapath.DUT.new_card = 4'd11; + load_dcard2 = 1'b1; + + #10; + + check(4'd1, 4'd0, `ACE, `KING, `BLANK, `TEN, `JACK, `BLANK); + load_dcard2 = 1'b0; + + /* Load 8. */ + + $display("Test 1.5"); + + force tb_datapath.DUT.new_card = 4'd8; + load_pcard3 = 1'b1; + + #10; + + check(4'd9, 4'd0, `ACE, `KING, `EIGHT, `TEN, `JACK, `BLANK); + load_pcard3 = 1'b0; + + /* Load 9. */ + + $display("Test 1.6"); + + force tb_datapath.DUT.new_card = 4'd9; + load_dcard3 = 1'b1; + + #10; + + check(4'd9, 4'd9, `ACE, `KING, `EIGHT, `TEN, `JACK, `NINE); + load_dcard3 = 1'b0; + + /* Reset. */ + + $display("Test 1.7"); + + resetb = 1'b0; + + #10; + + check(4'd0, 4'd0, `BLANK, `BLANK, `BLANK, `BLANK, `BLANK, `BLANK); + resetb = 1'b1; + + /* Player: 234, dealer: 567. */ + + /* Load 2. */ + + $display("Test 2.1"); + + force tb_datapath.DUT.new_card = 4'd2; + load_pcard1 = 1'b1; + + #10; + + check(4'd2, 4'd0, `TWO, `BLANK, `BLANK, `BLANK, `BLANK, `BLANK); + load_pcard1 = 1'b0; + + /* Load 5. */ + + $display("Test 2.2"); + + force tb_datapath.DUT.new_card = 4'd5; + load_dcard1 = 1'b1; + + #10; + + check(4'd2, 4'd5, `TWO, `BLANK, `BLANK, `FIVE, `BLANK, `BLANK); + load_dcard1 = 1'b0; + + /* Load 3. */ + + $display("Test 2.3"); + + force tb_datapath.DUT.new_card = 4'd3; + load_pcard2 = 1'b1; + + #10; + + check(4'd5, 4'd5, `TWO, `THREE, `BLANK, `FIVE, `BLANK, `BLANK); + load_pcard2 = 1'b0; + + /* Load 6. */ + + $display("Test 2.4"); + + force tb_datapath.DUT.new_card = 4'd6; + load_dcard2 = 1'b1; + + #10; + + check(4'd5, 4'd1, `TWO, `THREE, `BLANK, `FIVE, `SIX, `BLANK); + load_dcard2 = 1'b0; + + /* Load 4. */ + + $display("Test 2.5"); + + force tb_datapath.DUT.new_card = 4'd4; + load_pcard3 = 1'b1; + + #10; + + check(4'd9, 4'd1, `TWO, `THREE, `FOUR, `FIVE, `SIX, `BLANK); + load_pcard3 = 1'b0; + + /* Load 7. */ + + $display("Test 2.6"); + + force tb_datapath.DUT.new_card = 4'd7; + load_dcard3 = 1'b1; + + #10; + + check(4'd9, 4'd8, `TWO, `THREE, `FOUR, `FIVE, `SIX, `SEVEN); + load_dcard3 = 1'b0; + + /* Reset. */ + + $display("Test 2.7"); + + resetb = 1'b0; + + #10; + + check(4'd0, 4'd0, `BLANK, `BLANK, `BLANK, `BLANK, `BLANK, `BLANK); + resetb = 1'b1; + + /* Player: 89, dealer: JQK. */ + + /* Load 8. */ + + $display("Test 3.1"); + + force tb_datapath.DUT.new_card = 4'd8; + load_pcard1 = 1'b1; + + #10; + + check(4'd8, 4'd0, `EIGHT, `BLANK, `BLANK, `BLANK, `BLANK, `BLANK); + load_pcard1 = 1'b0; + + /* Load J. */ + + $display("Test 3.2"); + + force tb_datapath.DUT.new_card = 4'd11; + load_dcard1 = 1'b1; + + #10; + + check(4'd8, 4'd0, `EIGHT, `BLANK, `BLANK, `JACK, `BLANK, `BLANK); + load_dcard1 = 1'b0; + + /* Load 9. */ + + $display("Test 3.3"); + + force tb_datapath.DUT.new_card = 4'd9; + load_pcard2 = 1'b1; + + #10; + + check(4'd7, 4'd0, `EIGHT, `NINE, `BLANK, `JACK, `BLANK, `BLANK); + load_pcard2 = 1'b0; + + #10; + + /* Load Q. */ + + $display("Test 3.4"); + + force tb_datapath.DUT.new_card = 4'd12; + load_dcard2 = 1'b1; + + #10; + + check(4'd7, 4'd0, `EIGHT, `NINE, `BLANK, `JACK, `QUEEN, `BLANK); + load_dcard2 = 1'b0; + + /* Load K. */ + + $display("Test 3.5"); + + force tb_datapath.DUT.new_card = 4'd13; + load_dcard3 = 1'b1; + + #10; + + check(4'd7, 4'd0, `EIGHT, `NINE, `BLANK, `JACK, `QUEEN, `KING); + load_dcard3 = 1'b0; + + /* Reset. */ + + $display("Test 3.6"); + + resetb = 1'b0; + + #10; + + check(4'd0, 4'd0, `BLANK, `BLANK, `BLANK, `BLANK, `BLANK, `BLANK); + resetb = 1'b1; -// 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();"). + if (~err) + $display("All tests passed."); -endmodule + #10; + $stop; + end +endmodule: tb_datapath |