run method
- 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 < lanes.length; i++) {
// read side reset
_dataReadResponseMetadataQueue[_readAddrToChannel[i]!].clear();
_dataReadResponseDataQueue[_readAddrToChannel[i]!].clear();
// _dataReadResponseErrorQueue[_readAddrToChannel[i]!].clear();
_dataReadResponseIndex[_readAddrToChannel[i]!] = 0;
// write side reset
_writeMetadataQueue[_writeAddrToChannel[i]!].clear();
_writeDataQueue[_writeAddrToChannel[i]!].clear();
_writeReadyToOccur[_writeAddrToChannel[i]!] = false;
}
});
// register listeners on requests
// AR (read request)
// AW (write request)
// W (write request data)
for (var i = 0; i < lanes.length; i++) {
lanes[i]
.writeAgent
.reqAgent
.monitor
.stream
.listen((d) => _receiveWrite(packet: d, index: i));
lanes[i]
.writeAgent
.dataAgent
.monitor
.stream
.listen((d) => _captureWriteData(packet: d, index: i));
lanes[i]
.readAgent
.reqAgent
.monitor
.stream
.listen((d) => _receiveRead(packet: d, index: i));
}
// wait for reset to complete
await sIntf.resetN.nextPosedge;
// handle responding to requests
while (!Simulator.simulationHasEnded) {
await sIntf.clk.nextNegedge;
for (var i = 0; i < lanes.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
// _driveWriteReadys(index: i);
_respondWrite(index: i);
// _captureWriteData(index: i);
// _receiveWrite(index: i);
// deal with reads after writes
// _driveReadReadys(index: i);
_respondRead(index: i);
// _receiveRead(index: i);
}
}
}