forked from CompArchFA17/HW4
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathregfile.t.v
288 lines (237 loc) · 7.99 KB
/
regfile.t.v
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
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
//------------------------------------------------------------------------------
// Test harness validates hw4testbench by connecting it to various functional
// or broken register files, and verifying that it correctly identifies each
//------------------------------------------------------------------------------
`include "regfile.v"
module hw4testbenchharness();
wire[31:0] ReadData1; // Data from first register read
wire[31:0] ReadData2; // Data from second register read
wire[31:0] WriteData; // Data to write to register
wire[4:0] ReadRegister1; // Address of first register to read
wire[4:0] ReadRegister2; // Address of second register to read
wire[4:0] WriteRegister; // Address of register to write
wire RegWrite; // Enable writing of register when High
wire Clk; // Clock (Positive Edge Triggered)
reg begintest; // Set High to begin testing register file
wire dutpassed; // Indicates whether register file passed tests
// Instantiate the register file being tested. DUT = Device Under Test
regfile DUT
(
.ReadData1(ReadData1),
.ReadData2(ReadData2),
.WriteData(WriteData),
.ReadRegister1(ReadRegister1),
.ReadRegister2(ReadRegister2),
.WriteRegister(WriteRegister),
.RegWrite(RegWrite),
.Clk(Clk)
);
// Instantiate test bench to test the DUT
hw4testbench tester
(
.begintest(begintest),
.endtest(endtest),
.dutpassed(dutpassed),
.ReadData1(ReadData1),
.ReadData2(ReadData2),
.WriteData(WriteData),
.ReadRegister1(ReadRegister1),
.ReadRegister2(ReadRegister2),
.WriteRegister(WriteRegister),
.RegWrite(RegWrite),
.Clk(Clk)
);
// Test harness asserts 'begintest' for 1000 time steps, starting at time 10
initial begin
begintest=0;
#10;
begintest=1;
#1000;
end
// Display test results ('dutpassed' signal) once 'endtest' goes high
always @(posedge endtest) begin
$display("DUT passed?: %b", dutpassed);
end
endmodule
//------------------------------------------------------------------------------
// Your HW4 test bench
// Generates signals to drive register file and passes them back up one
// layer to the test harness. This lets us plug in various working and
// broken register files to test.
//
// Once 'begintest' is asserted, begin testing the register file.
// Once your test is conclusive, set 'dutpassed' appropriately and then
// raise 'endtest'.
//------------------------------------------------------------------------------
module hw4testbench
(
// Test bench driver signal connections
input begintest, // Triggers start of testing
output reg endtest, // Raise once test completes
output reg dutpassed, // Signal test result
// Register File DUT connections
input[31:0] ReadData1,
input[31:0] ReadData2,
output reg[31:0] WriteData,
output reg[4:0] ReadRegister1,
output reg[4:0] ReadRegister2,
output reg[4:0] WriteRegister,
output reg RegWrite,
output reg Clk
);
// loop index
integer index;
// Initialize register driver signals
initial begin
WriteData=32'd0;
ReadRegister1=5'd0;
ReadRegister2=5'd0;
WriteRegister=5'd0;
RegWrite=0;
Clk=0;
end
// Once 'begintest' is asserted, start running test cases
always @(posedge begintest) begin
endtest = 0;
dutpassed = 1;
#10
// Test Case 1:
// Write '42' to register 2, verify with Read Ports 1 and 2
// (Passes because example register file is hardwired to return 42)
WriteRegister = 5'd2;
WriteData = 32'd42;
RegWrite = 1;
ReadRegister1 = 5'd2;
ReadRegister2 = 5'd2;
#5 Clk=1; #5 Clk=0; // Generate single clock pulse
// Verify expectations and report test result
if((ReadData1 != 42) || (ReadData2 != 42)) begin
dutpassed = 0; // Set to 'false' on failure
$display("Test Case 1 Failed");
end
// Test Case 2:
// Write '15' to register 2, verify with Read Ports 1 and 2
// (Fails with example register file, but should pass with yours)
WriteRegister = 5'd2;
WriteData = 32'd15;
RegWrite = 1;
ReadRegister1 = 5'd2;
ReadRegister2 = 5'd2;
#5 Clk=1; #5 Clk=0;
if((ReadData1 != 15) || (ReadData2 != 15)) begin
dutpassed = 0;
$display("Test Case 2 Failed");
end
//--------Deliverable 8---------
// 1
// Test Case 1:
// Write maximum value to all register. Then check the value of them
WriteData = 32'hFFFFFFFF;
RegWrite = 1;
for(index=1;index<32;index=index+1) begin
WriteRegister = index;
ReadRegister1 = index;
ReadRegister2 = index;
#5 Clk=1; #5 Clk=0;
if((ReadData1 != 4294967295) || (ReadData2 != 4294967295)) begin
dutpassed = 0;
$display("Type 1 Test Case 1 Failed");
end
end
// 2. Write Enable is broken / ignored – Register is always written to.
// Test Case 1:
// After writing '1955103904 - 10*(register number)' to a register, disenable RegWrite.
// Then try to write '3410 + (register number)*(register number)' to the register. Repeat for all register.
for(index=1;index<32;index=index+1) begin
WriteRegister = index;
WriteData = 32'd1955103904 - 10*index;
RegWrite = 1;
#5 Clk=1; #5 Clk=0;
RegWrite = 0;
WriteData = 32'd3410 + index*index;
#5 Clk=1; #5 Clk=0;
ReadRegister1 = index;
ReadRegister2 = index;
if((ReadData1 != 1955103904 - 10*index) || (ReadData2 != 1955103904 - 10*index)) begin
dutpassed = 0;
$display("Type 2 Test Case 1 Failed: A register changes while Write Enable is off");
end
end
// 3. Decoder is broken – All registers are written to.
// Test Case 1:
// After reset all register to zero, write '795546904 - 34*(register number)' to all register. Then check the value of each register
// Reset all register to zero
RegWrite = 1;
WriteData = 0;
for(index=1;index<32;index=index+1) begin
WriteRegister = index;
#5 Clk=1; #5 Clk=0;
end
for(index=1;index<32;index=index+1) begin
WriteRegister = index;
WriteData = 32'd795546904 - 34*index;
#5 Clk=1; #5 Clk=0;
end
for(index=1;index<32;index=index+1) begin
ReadRegister1 = index;
ReadRegister2 = index;
if((ReadData1 != (795546904 - 34*index)) || (ReadData2 != (795546904 - 34*index))) begin
dutpassed = 0;
$display("Type 3 Test Case 1 Failed: Decoder is broken");
end
end
// Test Case 2:
// Write '8193' to register 13, '4294901760' to register 31, and '15793935' to register 16.
// Then Check the value of register 1, 13, 16, 31
WriteRegister = 5'd13;
WriteData = 32'd8193;
#5 Clk=1; #5 Clk=0;
WriteRegister = 5'd31;
WriteData = 32'd4294901760;
#5 Clk=1; #5 Clk=0;
WriteRegister = 5'd16;
WriteData = 32'd15793935;
#5 Clk=1; #5 Clk=0;
ReadRegister1 = 5'd1;
ReadRegister2 = 5'd13;
if((ReadData1 != 795546870) || (ReadData2 != 8193)) begin
dutpassed = 0;
$display("Type 3 Test Case 2 Failed: Decoder is broken");
end
ReadRegister1 = 5'd16;
ReadRegister2 = 5'd31;
if((ReadData1 != 15793935) || (ReadData2 != 4294901760)) begin
dutpassed = 0;
$display("Type 3 Test Case 2 Failed: Decoder is broken");
end
// 4. Register Zero is actually a register instead of the constant value zero.
// Test Case 1:
ReadRegister1 = 5'd0;
ReadRegister2 = 5'd0;
if((ReadData1 != 0) || (ReadData2 != 0)) begin
dutpassed = 0;
$display("Type 4 Test Case 1 Failed: Zero register has a non-zero value.");
end
// Test Case 2:
// Write '3410' to register 0, check its value changes
WriteRegister = 5'd0;
WriteData = 32'd3410;
RegWrite = 1;
#5 Clk=1; #5 Clk=0;
if((ReadData1 != 0) || (ReadData2 != 0)) begin
dutpassed = 0;
$display("Type 4 Test Case 2 Failed: Zero register has a non-zero value");
end
// Test Case 3:
// Write '47186640' to register 0, check its value changes
WriteData = 32'd47186640;
#5 Clk=1; #5 Clk=0;
if((ReadData1 != 0) || (ReadData2 != 0)) begin
dutpassed = 0;
$display("Type 4 Test Case 3 Failed: Zero register has a non-zero value");
end
// All done! Wait a moment and signal test completion.
#5
endtest = 1;
end
endmodule