@@ -224,8 +224,14 @@ class DPICBatch(template: Seq[DifftestBundle], batchIO: BatchIO, config: Gateway
224
224
override def dpicFuncAssigns : Seq [String ] = {
225
225
val bundleEnum = template.map(_.desiredModuleName.replace(" Difftest" , " " )) ++ Seq (" BatchInterval" , " BatchFinish" )
226
226
val bundleAssign = template.zipWithIndex.map { case (t, idx) =>
227
+ val bundleName = bundleEnum(idx)
228
+ val perfName = " perf_Batch_" + bundleName
227
229
s """
228
- | else if (id == ${bundleEnum(idx)}) {
230
+ | else if (id == $bundleName) {
231
+ |#ifdef CONFIG_DIFFTEST_PERFCNT
232
+ | dpic_calls[ $perfName] += num;
233
+ | dpic_bytes[ $perfName] += num * ${t.getByteAlignWidth / 8 };
234
+ |#endif // CONFIG_DIFFTEST_PERFCNT
229
235
| for (int j = 0; j < num; j++) {
230
236
| ${getDPICBundleUnpack(t)}
231
237
| }
@@ -312,6 +318,7 @@ private class DummyDPICBatchWrapper(
312
318
313
319
object DPIC {
314
320
val interfaces = ListBuffer .empty[(String , String , String )]
321
+ private val perfs = ListBuffer .empty[String ]
315
322
316
323
def apply (control : GatewaySinkControl , io : Valid [DifftestBundle ], config : GatewayConfig ): Unit = {
317
324
val bundleType = chiselTypeOf(io)
@@ -321,6 +328,7 @@ object DPIC {
321
328
module.io := io
322
329
val dpic = module.dpic
323
330
if (! interfaces.map(_._1).contains(dpic.dpicFuncName)) {
331
+ perfs += dpic.dpicFuncName
324
332
val interface = (dpic.dpicFuncName, dpic.dpicFuncProto, dpic.dpicFunc)
325
333
interfaces += interface
326
334
}
@@ -333,6 +341,8 @@ object DPIC {
333
341
module.io := io
334
342
val dpic = module.dpic
335
343
interfaces += ((dpic.dpicFuncName, dpic.dpicFuncProto, dpic.dpicFunc))
344
+ perfs += dpic.dpicFuncName
345
+ perfs ++= template.map(" Batch_" + _.desiredModuleName.replace(" Difftest" , " " ))
336
346
}
337
347
338
348
def collect (): GatewayResult = {
@@ -388,7 +398,7 @@ object DPIC {
388
398
s """
389
399
|#ifdef CONFIG_DIFFTEST_PERFCNT
390
400
|enum DIFFSTATE_PERF {
391
- | ${(interfaces. map(" perf_" + _._1 ) ++ Seq (" DIFFSTATE_PERF_NUM" )).mkString(" ,\n " )}
401
+ | ${(perfs.toSeq. map(" perf_" + _) ++ Seq (" DIFFSTATE_PERF_NUM" )).mkString(" ,\n " )}
392
402
|};
393
403
|long long dpic_calls[DIFFSTATE_PERF_NUM] = {0}, dpic_bytes[DIFFSTATE_PERF_NUM] = {0};
394
404
|#endif // CONFIG_DIFFTEST_PERFCNT
@@ -426,6 +436,7 @@ object DPIC {
426
436
| diffstate_buffer = nullptr;
427
437
|}
428
438
""" .stripMargin
439
+ val diffstate_perfhead = if (perfs.head.contains(" Batch" )) 1 else 0
429
440
interfaceCpp +=
430
441
s """
431
442
|#ifdef CONFIG_DIFFTEST_PERFCNT
@@ -438,12 +449,14 @@ object DPIC {
438
449
|void diffstate_perfcnt_finish(long long msec) {
439
450
| long long calls_sum = 0, bytes_sum = 0;
440
451
| const char *dpic_name[DIFFSTATE_PERF_NUM] = {
441
- | ${interfaces .map(" \" " + _._1 + " \" " ).mkString(" ,\n " )}
452
+ | ${perfs .map(" \" " + _ + " \" " ).mkString(" ,\n " )}
442
453
| };
443
454
| for (int i = 0; i < DIFFSTATE_PERF_NUM; i++) {
455
+ | difftest_perfcnt_print(dpic_name[i], dpic_calls[i], dpic_bytes[i], msec);
456
+ | }
457
+ | for (int i = ${diffstate_perfhead}; i < DIFFSTATE_PERF_NUM; i++) {
444
458
| calls_sum += dpic_calls[i];
445
459
| bytes_sum += dpic_bytes[i];
446
- | difftest_perfcnt_print(dpic_name[i], dpic_calls[i], dpic_bytes[i], msec);
447
460
| }
448
461
| difftest_perfcnt_print(\"DIFFSTATE_SUM\", calls_sum, bytes_sum, msec);
449
462
|}
0 commit comments