2014-10-11 22:02:23 +02:00
|
|
|
|
|
|
|
# Name of model to be built and evaluated
|
|
|
|
ModelName = Router
|
|
|
|
|
|
|
|
# Query string to choose what to evaluate (use '\' to enable multiline config)
|
|
|
|
QueryString = \
|
|
|
|
Energy>>Router:WriteBuffer@0 \
|
|
|
|
Energy>>Router:ReadBuffer@0 \
|
|
|
|
Energy>>Router:TraverseCrossbar->Multicast1@0 \
|
|
|
|
Energy>>Router:ArbitrateSwitch->ArbitrateStage1@0 \
|
|
|
|
Energy>>Router:ArbitrateSwitch->ArbitrateStage2@0 \
|
|
|
|
Energy>>Router:DistributeClock@0 \
|
|
|
|
NddPower>>Router:Leakage@1 \
|
|
|
|
Area>>Router:Active@1 \
|
|
|
|
|
|
|
|
|
|
|
|
# Injection rate (# flits per cycle per port), assuming that the router is not
|
|
|
|
# saturated
|
|
|
|
InjectionRate = 0.3
|
|
|
|
# Evaluation string
|
|
|
|
EvaluateString = \
|
|
|
|
ejection_rate = $(NumberInputPorts) * $(InjectionRate) / $(NumberOutputPorts); \
|
|
|
|
buf_rd_dynamic = $(Energy>>Router:ReadBuffer) * $(Frequency); \
|
|
|
|
buf_wr_dynamic = $(Energy>>Router:WriteBuffer) * $(Frequency); \
|
|
|
|
buf_static = $(NddPower>>Router->InputPort:Leakage) * $(NumberInputPorts) + ($(NddPower>>Router->PipelineReg0:Leakage) + $(NddPower>>Router->PipelineReg1:Leakage)) * $(NumberInputPorts) * $(NumberBitsPerFlit); \
|
|
|
|
xbar_o_dynamic = $(Energy>>Router:TraverseCrossbar->Multicast1) * $(Frequency); \
|
|
|
|
xbar_static = $(NddPower>>Router->Crossbar:Leakage) + $(NddPower>>Router->PipelineReg2_0:Leakage) * $(NumberOutputPorts) * $(NumberBitsPerFlit); \
|
|
|
|
sa_o_dynamic = ($(Energy>>Router:ArbitrateSwitch->ArbitrateStage1) + $(Energy>>Router:ArbitrateSwitch->ArbitrateStage2)) * $(Frequency); \
|
|
|
|
sa_static = $(NddPower>>Router->SwitchAllocator:Leakage); \
|
|
|
|
clock_o_dynamic = $(Energy>>Router:DistributeClock) * $(Frequency); \
|
|
|
|
clock_static = $(NddPower>>Router->ClockTree:Leakage); \
|
|
|
|
buffer_dynamic = buf_wr_dynamic * $(InjectionRate) * $(NumberInputPorts) + buf_rd_dynamic * ejection_rate * $(NumberOutputPorts); \
|
|
|
|
buffer_leakage = buf_static; \
|
|
|
|
xbar_dynamic = xbar_o_dynamic * ejection_rate * $(NumberOutputPorts); \
|
|
|
|
xbar_leakage = xbar_static; \
|
|
|
|
sa_dynamic = sa_o_dynamic * ejection_rate * $(NumberOutputPorts); \
|
|
|
|
sa_leakage = sa_static; \
|
|
|
|
clock_dynamic = clock_o_dynamic; \
|
|
|
|
clock_leakage = clock_static; \
|
|
|
|
total_dynamic = buffer_dynamic + xbar_dynamic + sa_dynamic + clock_dynamic; \
|
|
|
|
total_leakage = buffer_leakage + xbar_leakage + sa_leakage + clock_leakage; \
|
|
|
|
buf_area = ($(Area>>Router->InputPort:Active) + ($(Area>>Router->PipelineReg0:Active) + $(Area>>Router->PipelineReg1:Active)) * $(NumberBitsPerFlit)) * $(NumberInputPorts); \
|
|
|
|
xbar_area = $(Area>>Router->Crossbar:Active) + $(Area>>Router->Crossbar_Sel_DFF:Active) + $(Area>>Router->PipelineReg2_0:Active) * $(NumberBitsPerFlit) * $(NumberOutputPorts); \
|
|
|
|
sa_area = $(Area>>Router->SwitchAllocator:Active); \
|
|
|
|
other_area = $(Area>>Router->ClockTree:Active); \
|
|
|
|
print "Buffer:"; \
|
|
|
|
print " Dynamic power: " buffer_dynamic; \
|
|
|
|
print " Leakage power: " buffer_leakage; \
|
|
|
|
print "Crossbar:"; \
|
|
|
|
print " Dynamic power: " xbar_dynamic; \
|
|
|
|
print " Leakage power: " xbar_leakage; \
|
|
|
|
print "Switch allocator:"; \
|
|
|
|
print " Dynamic power: " sa_dynamic; \
|
|
|
|
print " Leakage power: " sa_leakage; \
|
|
|
|
print "Clock:"; \
|
|
|
|
print " Dynamic power: " clock_dynamic; \
|
|
|
|
print " Leakage power: " clock_leakage; \
|
|
|
|
print "Total:"; \
|
|
|
|
print " Dynamic power: " total_dynamic; \
|
|
|
|
print " Leakage power: " $(NddPower>>Router:Leakage); \
|
|
|
|
print "Area:"; \
|
|
|
|
print " Buffer: " buf_area; \
|
|
|
|
print " Crossbar: " xbar_area; \
|
|
|
|
print " Switch allocator: " sa_area; \
|
|
|
|
print " Other: " other_area; \
|
|
|
|
|
|
|
|
# Technology file (see other models in tech/models)
|
2014-10-11 23:16:00 +02:00
|
|
|
ElectricalTechModelFilename = ext/dsent/tech/tech_models/Bulk45LVT.model
|
2014-10-11 22:02:23 +02:00
|
|
|
|
|
|
|
###############################################################################
|
|
|
|
# Timing optimization
|
|
|
|
###############################################################################
|
|
|
|
|
|
|
|
# True if want to perform timing optimization; otherwise, false.
|
|
|
|
IsPerformTimingOptimization = true
|
|
|
|
# Nets that the timing optimizer starts from
|
|
|
|
TimingOptimization->StartNetNames = [*]
|
|
|
|
# Operating frequency (Hz)
|
|
|
|
Frequency = 1.0e9
|
|
|
|
|
|
|
|
###############################################################################
|
|
|
|
# Model specifications
|
|
|
|
###############################################################################
|
|
|
|
|
|
|
|
# Number of input ports
|
|
|
|
NumberInputPorts = 5
|
|
|
|
# Number of output ports
|
|
|
|
NumberOutputPorts = 5
|
|
|
|
# Flit width (bit)
|
|
|
|
NumberBitsPerFlit = 64
|
|
|
|
|
|
|
|
# In this example, we define 2 virtual networks (message classes), VN1 and VN2.
|
|
|
|
# VN1 VN2
|
|
|
|
# Number of VCs 2 3
|
|
|
|
# Number of buffers / VC 4 5
|
|
|
|
#
|
|
|
|
# So in total, there are (2 * 4) + (3 * 5) = 23 flit buffers
|
|
|
|
#
|
|
|
|
# Number of virtual networks (number of message classes)
|
|
|
|
NumberVirtualNetworks = 2
|
|
|
|
# Number of virtual channels per virtual network
|
|
|
|
NumberVirtualChannelsPerVirtualNetwork = [2, 3]
|
|
|
|
# Number of buffers per virtual channel
|
|
|
|
NumberBuffersPerVirtualChannel = [4, 5]
|
|
|
|
|
|
|
|
# InputPort
|
|
|
|
# ---------
|
|
|
|
# buffer model
|
|
|
|
InputPort->BufferModel = DFFRAM
|
|
|
|
|
|
|
|
# Crossbar
|
|
|
|
# --------
|
|
|
|
# crossbar model
|
|
|
|
CrossbarModel = MultiplexerCrossbar
|
|
|
|
|
|
|
|
# Switch allocator
|
|
|
|
# ----------------
|
|
|
|
# arbiter model
|
|
|
|
SwitchAllocator->ArbiterModel = MatrixArbiter
|
|
|
|
|
|
|
|
# Clock tree
|
|
|
|
# ----------
|
|
|
|
# clock tree model
|
|
|
|
ClockTreeModel = BroadcastHTree
|
|
|
|
# number of levels
|
|
|
|
ClockTree->NumberLevels = 5
|
|
|
|
# wire layer
|
|
|
|
ClockTree->WireLayer = Global
|
|
|
|
# wire width multiplier
|
|
|
|
ClockTree->WireWidthMultiplier = 1.0
|
|
|
|
|