public virtual void ClockCycle() { _simulatorContext.DeltaCycle = 0; do { _simulatorContext.CurrentTime++; var stageResult = _topLevel.DeltaCycle(_simulatorContext.DeltaCycle); _simulatorContext.TotalDeltaCycles++; TraceSignals(); // no modules were modified during stage iteration, all converged if (stageResult == RTLModuleStageResult.Stable) { break; } }while (++_simulatorContext.DeltaCycle < _simulatorContext.MaxDeltaCycles); if (_simulatorContext.DeltaCycle >= _simulatorContext.MaxDeltaCycles) { throw new MaxStageIterationReachedException(); } OnPostStage?.Invoke(_topLevel); _simulatorContext.CurrentTime = _simulatorContext.Clock * 2 * _simulatorContext.MaxDeltaCycles + _simulatorContext.MaxDeltaCycles; // clock fall is not handled in RTL module, all sync is done of clock rise at the moment _simulatorContext.ClockSignal?.SetValue(false); TraceSignals(); // clock rise will commit all changes _simulatorContext.Clock++; _simulatorContext.CurrentTime = _simulatorContext.Clock * 2 * _simulatorContext.MaxDeltaCycles; _simulatorContext.ClockSignal?.SetValue(true); _topLevel.Commit(); TraceSignals(); OnPostCommit?.Invoke(_topLevel); }
public void ClockCycle() { _simulatorContext.CurrentTime = _simulatorContext.Clock * 2 * _simulatorContext.MaxStageIterations; _simulatorContext.ClockSignal?.SetValue(true); _simulatorContext.Iteration = 0; do { _simulatorContext.CurrentTime++; var modified = _topLevel.Stage(_simulatorContext.Iteration); TraceSignals(); // no modules were modified during stage iteration, all converged if (!modified) { break; } }while (++_simulatorContext.Iteration < _simulatorContext.MaxStageIterations); if (_simulatorContext.Iteration >= _simulatorContext.MaxStageIterations) { throw new MaxStageIterationReachedException(); } OnPostStage?.Invoke(_topLevel); _simulatorContext.CurrentTime = _simulatorContext.Clock * 2 * _simulatorContext.MaxStageIterations + _simulatorContext.MaxStageIterations; _simulatorContext.ClockSignal?.SetValue(false); TraceSignals(); _topLevel.Commit(); OnPostCommit?.Invoke(_topLevel); _simulatorContext.Clock++; }