1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
|
`define STATE_RESET 3'b000
`define STATE_HALT 3'b001
`define STATE_IF 3'b010
`define STATE_DECODE 3'b011
`define STATE_EXEC 3'b100
`define STATE_MEM 3'b101
`define STATE_WRITEBACK 3'b110
module lab7bonus_stage2_tb;
reg [3:0] KEY;
reg [9:0] SW;
wire [9:0] LEDR;
wire [6:0] HEX0, HEX1, HEX2, HEX3, HEX4, HEX5;
reg err;
reg CLOCK_50;
lab7bonus_top DUT(KEY, SW, LEDR, HEX0, HEX1, HEX2, HEX3, HEX4, HEX5, CLOCK_50);
always #5 CLOCK_50 = ~CLOCK_50;
initial begin
#2000;
$stop;
end
wire break = (LEDR[8] == 1'b1);
initial begin
err = 0;
CLOCK_50 = 1'b0;
KEY[1] = 1'b0; // reset asserted
#10; // wait until next falling edge of clock
KEY[1] = 1'b1; // reset de-asserted, PC still undefined if as in Figure 4
while (~break) begin
// Change the following line to wait until your CPU starts to you fetch
// the next instruction (e.g., IF1 state from Lab 7 or equivalent in
// your design). DUT.CPU.FSM is not required for by the autograder
// for Lab 8.
@(posedge (DUT.CPU.FSM.state == `STATE_IF) or posedge break);
@(negedge CLOCK_50); // show advance to negative edge of clock
$display("PC = %h", DUT.CPU.PC);
end
if (DUT.MEM.mem[25] !== -16'd23) begin err = 1; $display("FAILED: mem[25] wrong"); $stop; end
if (~err) $display("PASSED");
$stop;
end
endmodule
|