run method

  1. @override
Future<void> run(
  1. Phase phase
)
override

Executes this Component's activities related to running the test.

Overrides of run must call super.run in an unawaited fashion. For example:

@override
Future<void> run(Phase phase) async {
  unawaited(super.run(phase));
  // New code goes here!
}

Implementation

@override
Future<void> run(Phase phase) async {
  unawaited(super.run(phase));

  sIntf.resetN.negedge.listen((event) {
    storage.reset();
    for (var i = 0; i < channels.length; i++) {
      if (channels[i].hasRead) {
        _dataReadResponseMetadataQueue[_readAddrToChannel[i]!].clear();
        _dataReadResponseDataQueue[_readAddrToChannel[i]!].clear();
        // _dataReadResponseErrorQueue[_readAddrToChannel[i]!].clear();
        _dataReadResponseIndex[_readAddrToChannel[i]!] = 0;
      }
      if (channels[i].hasWrite) {
        _writeMetadataQueue[_writeAddrToChannel[i]!].clear();
        _writeReadyToOccur[_writeAddrToChannel[i]!] = false;
      }
    }
  });

  // wait for reset to complete
  await sIntf.resetN.nextPosedge;

  while (!Simulator.simulationHasEnded) {
    await sIntf.clk.nextNegedge;
    for (var i = 0; i < channels.length; i++) {
      // write handling should come before reads for the edge case in which a
      // read happens in the cycle after the final WVALID for the same
      // channel/address
      if (channels[i].hasWrite) {
        _driveWriteReadys(index: i);
        _respondWrite(index: i);
        _captureWriteData(index: i);
        _receiveWrite(index: i);
      }
      if (channels[i].hasRead) {
        _driveReadReadys(index: i);
        _respondRead(index: i);
        _receiveRead(index: i);
      }
    }
  }
}