added rate control for writes issued to memory system
This commit is contained in:
		
							parent
							
								
									5a4be62352
								
							
						
					
					
						commit
						b834fdbefe
					
				| 
						 | 
				
			
			@ -122,6 +122,17 @@ public class Cache extends SimulationElement {
 | 
			
		|||
		return mshr.isMSHRFull(addr);
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	private int maximumNumberOfOutstandingWrites;
 | 
			
		||||
	protected int numberOfOutstandingWrites;
 | 
			
		||||
	public void incrementNumberOfOutstandingWrites()
 | 
			
		||||
	{
 | 
			
		||||
		numberOfOutstandingWrites++;
 | 
			
		||||
	}
 | 
			
		||||
	public boolean canCacheAcceptWriteRequest()
 | 
			
		||||
	{
 | 
			
		||||
		return (numberOfOutstandingWrites < maximumNumberOfOutstandingWrites);
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	public Cache(String cacheName, int id, CacheConfig cacheParameters,
 | 
			
		||||
			CoreMemorySystem containingMemSys) {
 | 
			
		||||
		
 | 
			
		||||
| 
						 | 
				
			
			@ -210,6 +221,7 @@ public class Cache extends SimulationElement {
 | 
			
		|||
		makeCache(cacheParameters.isDirectory);
 | 
			
		||||
 | 
			
		||||
		this.mshr = new MSHR(cacheConfig.mshrSize, blockSizeBits, this);
 | 
			
		||||
		maximumNumberOfOutstandingWrites = cacheConfig.mshrSize;
 | 
			
		||||
 | 
			
		||||
		this.nucaType = cacheParameters.nucaType;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -257,6 +269,10 @@ public class Cache extends SimulationElement {
 | 
			
		|||
		
 | 
			
		||||
		noOfAccesses++;
 | 
			
		||||
		
 | 
			
		||||
		if (requestType == RequestType.Cache_Write) {
 | 
			
		||||
			numberOfOutstandingWrites--;
 | 
			
		||||
		}
 | 
			
		||||
		
 | 
			
		||||
		if(mshr.isAddrInMSHR(addr) && 
 | 
			
		||||
			(requestType==RequestType.Cache_Read || requestType==RequestType.Cache_Write || requestType==RequestType.EvictCacheLine)) {
 | 
			
		||||
			if(requestType==RequestType.Cache_Read || requestType==RequestType.Cache_Write)
 | 
			
		||||
| 
						 | 
				
			
			@ -493,6 +509,10 @@ public class Cache extends SimulationElement {
 | 
			
		|||
				event = new AddressCarryingEvent(c.getEventQueue(), 0, this, c,
 | 
			
		||||
						requestType, addr);
 | 
			
		||||
				addEventAtLowerCache(event, c);
 | 
			
		||||
				if(requestType == RequestType.Cache_Write)
 | 
			
		||||
				{
 | 
			
		||||
					c.incrementNumberOfOutstandingWrites();
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
		} else {
 | 
			
		||||
			Core core0 = ArchitecturalComponent.getCores()[0];
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -6,6 +6,7 @@ import generic.Event;
 | 
			
		|||
import generic.EventQueue;
 | 
			
		||||
import generic.RequestType;
 | 
			
		||||
import memorysystem.AddressCarryingEvent;
 | 
			
		||||
import memorysystem.Cache;
 | 
			
		||||
import memorysystem.CoreMemorySystem;
 | 
			
		||||
 | 
			
		||||
public class InorderCoreMemorySystem_MII extends CoreMemorySystem {
 | 
			
		||||
| 
						 | 
				
			
			@ -48,6 +49,18 @@ public class InorderCoreMemorySystem_MII extends CoreMemorySystem {
 | 
			
		|||
		if(l1Cache.isBusy(address)) {
 | 
			
		||||
			return false;
 | 
			
		||||
		}
 | 
			
		||||
		if(requestType == RequestType.Cache_Write)
 | 
			
		||||
		{
 | 
			
		||||
			Cache c = l1Cache;
 | 
			
		||||
			while(c != null)
 | 
			
		||||
			{
 | 
			
		||||
				if(c.canCacheAcceptWriteRequest() == false)
 | 
			
		||||
					return false;
 | 
			
		||||
				
 | 
			
		||||
				c = c.nextLevel;
 | 
			
		||||
			}
 | 
			
		||||
			this.l1Cache.incrementNumberOfOutstandingWrites();
 | 
			
		||||
		}
 | 
			
		||||
		
 | 
			
		||||
		this.l1Cache.getPort().put(addressEvent);
 | 
			
		||||
		
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -9,6 +9,7 @@ import generic.RequestType;
 | 
			
		|||
import generic.SimulationElement;
 | 
			
		||||
import main.ArchitecturalComponent;
 | 
			
		||||
import memorysystem.AddressCarryingEvent;
 | 
			
		||||
import memorysystem.Cache;
 | 
			
		||||
import memorysystem.CoreMemorySystem;
 | 
			
		||||
import memorysystem.LSQEntryContainingEvent;
 | 
			
		||||
import memorysystem.coherence.Directory;
 | 
			
		||||
| 
						 | 
				
			
			@ -109,6 +110,18 @@ public class OutOrderCoreMemorySystem extends CoreMemorySystem {
 | 
			
		|||
		if(l1Cache.isBusy(address)) {
 | 
			
		||||
			return false;
 | 
			
		||||
		}
 | 
			
		||||
		if(requestType == RequestType.Cache_Write)
 | 
			
		||||
		{
 | 
			
		||||
			Cache c = l1Cache;
 | 
			
		||||
			while(c != null)
 | 
			
		||||
			{
 | 
			
		||||
				if(c.canCacheAcceptWriteRequest() == false)
 | 
			
		||||
					return false;
 | 
			
		||||
				
 | 
			
		||||
				c = c.nextLevel;
 | 
			
		||||
			}
 | 
			
		||||
			this.l1Cache.incrementNumberOfOutstandingWrites();
 | 
			
		||||
		}
 | 
			
		||||
		
 | 
			
		||||
		this.l1Cache.getPort().put(addressEvent);		
 | 
			
		||||
				
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue