@@ -8,6 +8,7 @@ module CSRFile_tb;
88 reg [11 :0 ] csr_read_address;
99 reg [11 :0 ] csr_write_address;
1010 reg [31 :0 ] csr_write_data;
11+ reg instruction_retired;
1112
1213 wire [31 :0 ] csr_read_out;
1314 wire csr_ready;
@@ -20,6 +21,7 @@ module CSRFile_tb;
2021 .csr_read_address(csr_read_address),
2122 .csr_write_address(csr_write_address),
2223 .csr_write_data(csr_write_data),
24+ .instruction_retired(instruction_retired),
2325
2426 .csr_read_out(csr_read_out),
2527 .csr_ready(csr_ready)
@@ -39,6 +41,7 @@ module CSRFile_tb;
3941 csr_read_address = 12'h000 ;
4042 csr_write_address = 12'h000 ;
4143 csr_write_data = 32'h0 ;
44+ instruction_retired = 0 ;
4245 #10 ;
4346 reset = 0 ;
4447 #10 ;
@@ -48,6 +51,8 @@ module CSRFile_tb;
4851 $display ("mvendorid = %h (expected 52564B43)" , csr_read_out);
4952
5053 csr_read_address = 12'hF12 ; #10 ;
54+ instruction_retired = 1'b1 ; #10 ;
55+ instruction_retired = 1'b0 ;
5156 $display ("marchid = %h (expected 34365335)" , csr_read_out);
5257
5358 csr_read_address = 12'hF13 ; #10 ;
@@ -134,22 +139,22 @@ module CSRFile_tb;
134139
135140 $display ("Write ignored : mvendorid = %h (expected 52564B43)" , csr_read_out);
136141
137- // Test 7: mcycle/minstret reset value check
142+ // Test 7: mcycle/minstret auto-increment check (read-only counters)
138143 csr_read_address = 12'hB00 ; #10 ;
139- $display ("mcycle (lower 32-bit, reset ) = %h (expected 00000000 )" , csr_read_out);
144+ $display ("mcycle (lower 32-bit) = %h (auto-incremented, not 0 )" , csr_read_out);
140145
141146 csr_read_address = 12'hB80 ; #10 ;
142- $display ("mcycleh (upper 32-bit, reset ) = %h (expected 00000000 )" , csr_read_out);
147+ $display ("mcycleh (upper 32-bit) = %h (should be 0, no overflow yet )" , csr_read_out);
143148
144149 csr_read_address = 12'hB02 ; #10 ;
145- $display ("minstret (lower 32-bit, reset ) = %h (expected 00000000 )" , csr_read_out);
150+ $display ("minstret (lower 32-bit) = %h (should be 1, one instruction retired in Test 1 )" , csr_read_out);
146151
147152 csr_read_address = 12'hB82 ; #10 ;
148- $display ("minstreth (upper 32-bit, reset ) = %h (expected 00000000 )" , csr_read_out);
153+ $display ("minstreth (upper 32-bit) = %h (should be 0, no overflow yet )" , csr_read_out);
149154
150- // Test 8: csrrw; mcycle lower 32-bit
155+ // Test 8: Read-only test for mcycle - write should be ignored
151156 csr_read_address = 12'hB00 ; #10 ;
152- $display ("mcycle (before write) = %h (expected 00000000) " , csr_read_out);
157+ $display ("mcycle (before write attempt ) = %h" , csr_read_out);
153158
154159 csr_write_address = 12'hB00 ;
155160 csr_write_data = 32'h12345678 ;
@@ -160,11 +165,11 @@ module CSRFile_tb;
160165 #10 ;
161166
162167 csr_read_address = 12'hB00 ; #10 ;
163- $display ("mcycle (after write) = %h (expected 12345678 )" , csr_read_out);
168+ $display ("mcycle (after write attempt ) = %h (write should be ignored, auto-incremented )" , csr_read_out);
164169
165- // Test 9: csrrw; mcycleh upper 32-bit
170+ // Test 9: Read-only test for mcycleh - write should be ignored
166171 csr_read_address = 12'hB80 ; #10 ;
167- $display ("mcycleh (before write) = %h (expected 00000000) " , csr_read_out);
172+ $display ("mcycleh (before write attempt ) = %h" , csr_read_out);
168173
169174 csr_write_address = 12'hB80 ;
170175 csr_write_data = 32'hABCDEF00 ;
@@ -175,17 +180,11 @@ module CSRFile_tb;
175180 #10 ;
176181
177182 csr_read_address = 12'hB80 ; #10 ;
178- $display ("mcycleh (after write) = %h (expected ABCDEF00 )" , csr_read_out);
183+ $display ("mcycleh (after write attempt ) = %h (write should be ignored, should remain 0 )" , csr_read_out);
179184
180- csr_read_address = 12'hB00 ; #10 ;
181- $display ("mcycle (should remain) = %h (expected 12345678)" , csr_read_out);
182-
183- $display ("Full 64-bit mcycle = %h_%h (expected ABCDEF00_12345678)" ,
184- csr_file.mcycle[63 :32 ], csr_file.mcycle[31 :0 ]);
185-
186- // Test 10: csrrw; minstret lower 32-bit
185+ // Test 10: Read-only test for minstret - write should be ignored
187186 csr_read_address = 12'hB02 ; #10 ;
188- $display ("minstret (before write) = %h (expected 00000000) " , csr_read_out);
187+ $display ("minstret (before write attempt ) = %h" , csr_read_out);
189188
190189 csr_write_address = 12'hB02 ;
191190 csr_write_data = 32'hDEADBEEF ;
@@ -196,11 +195,11 @@ module CSRFile_tb;
196195 #10 ;
197196
198197 csr_read_address = 12'hB02 ; #10 ;
199- $display ("minstret (after write) = %h (expected DEADBEEF )" , csr_read_out);
198+ $display ("minstret (after write attempt ) = %h (write should be ignored, should remain 1 )" , csr_read_out);
200199
201- // Test 11: csrrw; minstreth upper 32-bit
200+ // Test 11: Read-only test for minstreth - write should be ignored
202201 csr_read_address = 12'hB82 ; #10 ;
203- $display ("minstreth (before write) = %h (expected 00000000) " , csr_read_out);
202+ $display ("minstreth (before write attempt ) = %h" , csr_read_out);
204203
205204 csr_write_address = 12'hB82 ;
206205 csr_write_data = 32'hCAFEBABE ;
@@ -211,15 +210,42 @@ module CSRFile_tb;
211210 #10 ;
212211
213212 csr_read_address = 12'hB82 ; #10 ;
214- $display ("minstreth (after write) = %h (expected CAFEBABE )" , csr_read_out);
213+ $display ("minstreth (after write attempt ) = %h (write should be ignored, should remain 0 )" , csr_read_out);
215214
216- csr_read_address = 12'hB02 ; #10 ;
217- $display ("minstret (should remain) = %h (expected DEADBEEF)" , csr_read_out);
215+ // Test 12: mcycle auto-increment verification
216+ $display ("\n === Auto-increment verification ===" );
217+ csr_read_address = 12'hB00 ;
218+ #10 ;
219+ $display ("mcycle at T0 = %h" , csr_read_out);
220+ #20 ; // Wait 2 cycles
221+ csr_read_address = 12'hB00 ;
222+ #10 ;
223+ $display ("mcycle at T0+2 = %h (should be +2 from previous)" , csr_read_out);
224+
225+ // Test 13: minstret increment with instruction_retired
226+ $display ("\n === instruction_retired test ===" );
227+ csr_read_address = 12'hB02 ;
228+ #10 ;
229+ $display ("minstret before retired = %h" , csr_read_out);
230+
231+ instruction_retired = 1 ;
232+ #10 ;
233+ instruction_retired = 0 ;
234+ csr_read_address = 12'hB02 ;
235+ #10 ;
236+ $display ("minstret after 1 retired = %h (should be +1)" , csr_read_out);
218237
219- $display ("Full 64-bit minstret = %h_%h (expected CAFEBABE_DEADBEEF)" ,
220- csr_file.minstret[63 :32 ], csr_file.minstret[31 :0 ]);
238+ instruction_retired = 1 ;
239+ #10 ;
240+ instruction_retired = 1 ;
241+ #10 ;
242+ instruction_retired = 0 ;
243+ csr_read_address = 12'hB02 ;
244+ #10 ;
245+ $display ("minstret after 2 more retired = %h (should be +2)" , csr_read_out);
221246
222- // Test 12: Full 64-bit value integrity check
247+ // Final values
248+ $display ("\n === Final Counter Values ===" );
223249 csr_read_address = 12'hB00 ; #10 ;
224250 $display ("Final mcycle[31:0] = %h" , csr_read_out);
225251
@@ -234,7 +260,7 @@ module CSRFile_tb;
234260 $display ("Final minstret[63:32] = %h" , csr_read_out);
235261 $display ("Final Full minstret = 0x%h_%h" , csr_file.minstret[63 :32 ], csr_file.minstret[31 :0 ]);
236262
237- $display ("\n ==================== Register File Test END ====================" );
263+ $display ("\n ==================== CSR File Test END ====================" );
238264 $stop ;
239265 end
240266
0 commit comments