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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
|
`timescale 1ns / 1ps
module testbench_register_file();
reg clk;
reg rst;
reg we;
reg [4:0] addr_rs0, addr_rs1, addr_rd2;
reg [31:0] data_rd2;
wire [31:0] data_rs0, data_rs1;
register_file uut (
.clk(clk),
.rstn(!rst),
.we(we),
.ra1(addr_rs0),
.ra2(addr_rs1),
.wa3(addr_rd2),
.rd1(data_rs0),
.rd2(data_rs1),
.wd3(data_rd2)
);
integer file, r, eof;
reg [100*8:1] line;
reg [31:0] test_count, error_count;
reg [31:0] expected_data_rs0, expected_data_rs1;
always #5 clk = ~clk;
reg [1023:0] testvec_filename;
reg [1023:0] waveform_filename;
integer i;
initial begin
if ($value$plusargs("testvec=%s", testvec_filename)) begin
end else begin
$display("ERROR: testvec not specified");
$finish;
end
if ($value$plusargs("waveform=%s", waveform_filename)) begin
end else begin
$display("ERROR: waveform not specified");
$finish;
end
end
initial begin
$dumpfile(waveform_filename);
$dumpvars(0,testbench_register_file);
end
initial begin
clk = 0;
rst = 0;
we = 0;
addr_rs0 = 0;
addr_rs1 = 0;
addr_rd2 = 0;
data_rd2 = 0;
test_count = 0;
error_count = 0;
rst = 1;
@(posedge clk);
rst = 0;
for (i = 0; i < 32; i = i + 1) begin
we = 1;
addr_rd2 = i;
data_rd2 = 32'b0;
@(posedge clk);
#1;
end
file = $fopen(testvec_filename, "r");
if (file == 0) begin
$display("ERROR: failed to open testvec");
$finish;
end
while (!$feof(file)) begin
eof = $fgets(line, file);
eof = $sscanf(line, "%8h_%8h__%8h_%8h__%8h_%8h_%1h",
addr_rs0, expected_data_rs0,
addr_rs1, expected_data_rs1,
addr_rd2, data_rd2, we);
@(posedge clk);
@(negedge clk);
if (data_rs0 !== expected_data_rs0 || data_rs1 !== expected_data_rs1) begin
$display("ERROR (register_file), test %d: addr_rs0: %08h, addr_rs1: %08h, addr_rd2: %08h, data_rd2: %08h, we: %b",
test_count, addr_rs0, addr_rs1, addr_rd2, data_rd2, we);
$display(" data_rs0: %08h (expected: %08h)", data_rs0, expected_data_rs0);
$display(" data_rs1: %08h (expected: %08h)", data_rs1, expected_data_rs1);
error_count = error_count + 1;
end
test_count = test_count + 1;
end
$display("FINISHED (register_file) with %d errors out of %d tests", error_count, test_count);
$fclose(file);
$finish;
end
endmodule
|