aboutsummaryrefslogtreecommitdiff
path: root/task5/tb_datapath.sv
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--task5/tb_datapath.sv338
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