Merge branch 'master' of git.rhrk.uni-kl.de:EIT-Wehn/dram.vp.system
This commit is contained in:
3
.gitmodules
vendored
3
.gitmodules
vendored
@@ -4,3 +4,6 @@
|
||||
[submodule "DRAMSys/simulator/src/common/third_party/tinyxml2"]
|
||||
path = DRAMSys/simulator/src/common/third_party/tinyxml2
|
||||
url = https://github.com/leethomason/tinyxml2.git
|
||||
[submodule "DRAMSys/simulator/src/common/third_party/icewrapper"]
|
||||
path = DRAMSys/simulator/src/common/third_party/icewrapper
|
||||
url = https://github.com/myzinsky/IceWrapper.git
|
||||
|
||||
@@ -1,5 +1,21 @@
|
||||
TEMPLATE = subdirs
|
||||
|
||||
SUBDIRS = simulator/simulator.pro
|
||||
thermalsim = $$(THERMALSIM)
|
||||
isEmpty(thermalsim) {
|
||||
thermalsim = false
|
||||
}
|
||||
|
||||
$$eval(thermalsim) {
|
||||
message(Thermal Simulation Feature Enabled)
|
||||
|
||||
# build the project sequentially as listed in SUBDIRS
|
||||
CONFIG += ordered
|
||||
|
||||
SUBDIRS += simulator/src/common/third_party/icewrapper/3D-ICE-SystemC-Client.pro
|
||||
} else {
|
||||
message(Thermal Simulation Feature Disabled)
|
||||
}
|
||||
|
||||
SUBDIRS += simulator/simulator.pro
|
||||
SUBDIRS += analyzer/traceAnalyzer.pro
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
<memconfig>
|
||||
<BankwiseLogic value="0"/>
|
||||
<OpenPagePolicy value="1" />
|
||||
<MaxNrOfTransactions value="50" />
|
||||
<MaxNrOfTransactions value="8" />
|
||||
<Scheduler value="FR_FCFS" />
|
||||
<Capsize value="5" />
|
||||
<PowerDownMode value="TimeoutPDN" />
|
||||
|
||||
45
DRAMSys/simulator/resources/configs/temperature_sim/core.flp
Executable file
45
DRAMSys/simulator/resources/configs/temperature_sim/core.flp
Executable file
@@ -0,0 +1,45 @@
|
||||
CPUs :
|
||||
|
||||
position 0, 0 ;
|
||||
dimension 2750, 4300 ;
|
||||
|
||||
GPU :
|
||||
|
||||
position 3350, 0 ;
|
||||
dimension 2750, 4000 ;
|
||||
|
||||
BASEBAND1 :
|
||||
|
||||
position 4250, 4000 ;
|
||||
dimension 1850, 3300 ;
|
||||
|
||||
BASEBAND2 :
|
||||
|
||||
position 3350, 7300 ;
|
||||
dimension 2750, 3300 ;
|
||||
|
||||
LLCACHE :
|
||||
|
||||
position 0, 4300 ;
|
||||
dimension 1900, 3000 ;
|
||||
|
||||
DRAMCTRL1 :
|
||||
|
||||
position 1900, 4300 ;
|
||||
dimension 850, 3000 ;
|
||||
|
||||
DRAMCTRL2 :
|
||||
|
||||
position 3350, 4000 ;
|
||||
dimension 900, 3300 ;
|
||||
|
||||
TSVS :
|
||||
|
||||
position 2750, 2300 ;
|
||||
dimension 600, 6000 ;
|
||||
|
||||
ACELLERATORS :
|
||||
|
||||
position 0, 7300 ;
|
||||
dimension 2750, 3300 ;
|
||||
|
||||
16
DRAMSys/simulator/resources/configs/temperature_sim/mem.flp
Executable file
16
DRAMSys/simulator/resources/configs/temperature_sim/mem.flp
Executable file
@@ -0,0 +1,16 @@
|
||||
channel0 :
|
||||
position 150, 100 ;
|
||||
dimension 2600, 5200 ;
|
||||
|
||||
channel1 :
|
||||
position 3350, 100 ;
|
||||
dimension 2600, 5200 ;
|
||||
|
||||
channel2 :
|
||||
position 150, 5300 ;
|
||||
dimension 2600, 5200 ;
|
||||
|
||||
channel3 :
|
||||
position 3350, 5300 ;
|
||||
dimension 2600, 5200 ;
|
||||
|
||||
@@ -0,0 +1,8 @@
|
||||
<powerInfo>
|
||||
<!-- Power information must be provided for all floor plan elements -->
|
||||
<dram_die_channel0 init_pow="0" threshold="1.0" />
|
||||
<dram_die_channel1 init_pow="0" threshold="1.0" />
|
||||
<dram_die_channel2 init_pow="0" threshold="1.0" />
|
||||
<dram_die_channel3 init_pow="0" threshold="1.0" />
|
||||
</powerInfo>
|
||||
|
||||
48
DRAMSys/simulator/resources/configs/temperature_sim/stack.stk
Executable file
48
DRAMSys/simulator/resources/configs/temperature_sim/stack.stk
Executable file
@@ -0,0 +1,48 @@
|
||||
material SILICON :
|
||||
thermal conductivity 1.30e-4 ;
|
||||
volumetric heat capacity 1.628e-12 ;
|
||||
|
||||
material BEOL :
|
||||
thermal conductivity 2.25e-6 ;
|
||||
volumetric heat capacity 2.175e-12 ;
|
||||
|
||||
material COPPER :
|
||||
thermal conductivity 4.01e-04 ;
|
||||
volumetric heat capacity 3.37e-12 ;
|
||||
|
||||
heat sink :
|
||||
sink height 1e03, area 100e06, material COPPER ;
|
||||
spreader height 0.5e03, area 70e06, material SILICON ;
|
||||
heat transfer coefficient 1.3e-09 ;
|
||||
ambient temperature 318.15 ;
|
||||
|
||||
layer PCB :
|
||||
height 10 ;
|
||||
material BEOL ;
|
||||
|
||||
die DRAM :
|
||||
layer 58.5 SILICON ;
|
||||
source 2 SILICON ;
|
||||
layer 1.5 BEOL ;
|
||||
layer 58.5 SILICON ;
|
||||
|
||||
dimensions :
|
||||
chip length 6100, width 10600 ;
|
||||
cell length 1000, width 1000 ;
|
||||
|
||||
stack:
|
||||
die DRAM_DIE DRAM floorplan "./mem.flp" ;
|
||||
layer CONN_TO_PCB PCB ;
|
||||
|
||||
solver:
|
||||
transient step 0.01, slot 0.05 ;
|
||||
initial temperature 300.0 ;
|
||||
|
||||
output:
|
||||
Tflpel(DRAM_DIE.channel0 , "temp_flp_element_ch0.txt" , average , slot );
|
||||
Tflpel(DRAM_DIE.channel1 , "temp_flp_element_ch1.txt" , average , slot );
|
||||
Tflpel(DRAM_DIE.channel2 , "temp_flp_element_ch2.txt" , average , slot );
|
||||
Tflpel(DRAM_DIE.channel3 , "temp_flp_element_ch3.txt" , average , slot );
|
||||
Tmap (DRAM_DIE, "output1.txt", slot) ;
|
||||
Pmap (DRAM_DIE, "output2.txt", slot) ;
|
||||
|
||||
@@ -0,0 +1,9 @@
|
||||
all:
|
||||
modulecmd bash load gnuplot/latest
|
||||
modulecmd bash load image-magick/latest
|
||||
./temperatur.pl
|
||||
movie:
|
||||
ffmpeg -start_number 00000000 -i ../out/%08d.jpg -vcodec mpeg4 ../out.avi
|
||||
|
||||
clean:
|
||||
rm *.out *.err
|
||||
@@ -0,0 +1,135 @@
|
||||
#!/usr/bin/perl -w
|
||||
use warnings;
|
||||
use strict;
|
||||
use File::Copy;
|
||||
|
||||
my $file = shift;
|
||||
my $id = shift;
|
||||
my $samples = shift;
|
||||
my $inputPath = "/gu2/jungma/thermal/in/out-backup";
|
||||
my $extractPath = "/gu2/jungma/thermal/tmp/$id";
|
||||
|
||||
print "Create TMP path... ";
|
||||
system("mkdir $extractPath");
|
||||
print " done\n";
|
||||
|
||||
print "Extract... ";
|
||||
system("tar -xf $inputPath/$file -C $extractPath");
|
||||
print " done\n";
|
||||
|
||||
print "Preprocessing... ";
|
||||
system("sed '1d' $extractPath/out/output_core_die_full.txt > $extractPath/die0.txt");
|
||||
system("sed '1d' $extractPath/out/output_mem_die_1_full.txt > $extractPath/die1.txt");
|
||||
system("sed '1d' $extractPath/out/output_mem_die_2_full.txt > $extractPath/die2.txt");
|
||||
system("sed '1d' $extractPath/out/output_mem_die_3_full.txt > $extractPath/die3.txt");
|
||||
system("sed '1d' $extractPath/out/output_mem_die_4_full.txt > $extractPath/die4.txt");
|
||||
print " done\n";
|
||||
|
||||
print "Gnuplot...";
|
||||
open( my $GP, '|-', 'gnuplot' );
|
||||
print $GP "
|
||||
reset
|
||||
set terminal pngcairo size 500,500 enhanced font 'Verdana,10'
|
||||
|
||||
set border linewidth 0
|
||||
unset key
|
||||
unset colorbox
|
||||
unset tics
|
||||
set lmargin screen 0.0
|
||||
set rmargin screen 1.0
|
||||
set tmargin screen 1.0
|
||||
set bmargin screen 0.0
|
||||
|
||||
set pm3d map
|
||||
set pm3d interpolate 2,2
|
||||
set cbrange [318.0:388.0]
|
||||
|
||||
#set palette rgbformulae 22,13,-31
|
||||
set palette defined ( 0 \"blue\", 3 \"green\", 4 \"yellow\", 5 \"red\", 6 \"black\" )
|
||||
|
||||
set output '$extractPath/die0.png'
|
||||
splot '$extractPath/die0.txt' matrix every ::1
|
||||
|
||||
set output '$extractPath/die1.png'
|
||||
splot '$extractPath/die1.txt' matrix every ::1
|
||||
|
||||
set output '$extractPath/die2.png'
|
||||
splot '$extractPath/die2.txt' matrix every ::1
|
||||
|
||||
set output '$extractPath/die3.png'
|
||||
splot '$extractPath/die3.txt' matrix every ::1
|
||||
|
||||
set output '$extractPath/die4.png'
|
||||
splot '$extractPath/die4.txt' matrix every ::1";
|
||||
close($GP);
|
||||
print " done\n";
|
||||
|
||||
print "Wait for files... ";
|
||||
while (1) { last if -e "$extractPath/die0.png"; print "."; sleep 1;}
|
||||
while (1) { last if -e "$extractPath/die1.png"; print "."; sleep 1;}
|
||||
while (1) { last if -e "$extractPath/die2.png"; print "."; sleep 1;}
|
||||
while (1) { last if -e "$extractPath/die3.png"; print "."; sleep 1;}
|
||||
while (1) { last if -e "$extractPath/die4.png"; print "."; sleep 1;}
|
||||
print " done\n";
|
||||
|
||||
print "Composite ...";
|
||||
system("composite -gravity center constants/thermal_model_core.png $extractPath/die0.png $extractPath/die0b.png");
|
||||
system("composite -gravity center constants/thermal_model_dram_0_1.png $extractPath/die1.png $extractPath/die1b.png");
|
||||
system("composite -gravity center constants/thermal_model_dram_2_3.png $extractPath/die2.png $extractPath/die2b.png");
|
||||
system("composite -gravity center constants/thermal_model_dram_4_5.png $extractPath/die3.png $extractPath/die3b.png");
|
||||
system("composite -gravity center constants/thermal_model_dram_6_7.png $extractPath/die4.png $extractPath/die4b.png");
|
||||
print " done\n";
|
||||
|
||||
print "Wait for files... ";
|
||||
while (1) { last if -e "$extractPath/die0b.png"; print "."; sleep 1;}
|
||||
while (1) { last if -e "$extractPath/die1b.png"; print "."; sleep 1;}
|
||||
while (1) { last if -e "$extractPath/die2b.png"; print "."; sleep 1;}
|
||||
while (1) { last if -e "$extractPath/die3b.png"; print "."; sleep 1;}
|
||||
while (1) { last if -e "$extractPath/die4b.png"; print "."; sleep 1;}
|
||||
print " done\n";
|
||||
|
||||
print "Convert ...";
|
||||
system("convert $extractPath/die0b.png -alpha set -background none -shear 0x-40 -rotate 60 +repage -crop 1048x485+0+205 $extractPath/die0c.png");
|
||||
system("convert $extractPath/die1b.png -alpha set -background none -shear 0x-40 -rotate 60 +repage -crop 1048x485+0+205 $extractPath/die1c.png");
|
||||
system("convert $extractPath/die2b.png -alpha set -background none -shear 0x-40 -rotate 60 +repage -crop 1048x485+0+205 $extractPath/die2c.png");
|
||||
system("convert $extractPath/die3b.png -alpha set -background none -shear 0x-40 -rotate 60 +repage -crop 1048x485+0+205 $extractPath/die3c.png");
|
||||
system("convert $extractPath/die4b.png -alpha set -background none -shear 0x-40 -rotate 60 +repage -crop 1048x485+0+205 $extractPath/die4c.png");
|
||||
print " done\n";
|
||||
|
||||
print "Wait for files... ";
|
||||
while (1) { last if -e "$extractPath/die0c.png"; print "."; sleep 1;}
|
||||
while (1) { last if -e "$extractPath/die1c.png"; print "."; sleep 1;}
|
||||
while (1) { last if -e "$extractPath/die2c.png"; print "."; sleep 1;}
|
||||
while (1) { last if -e "$extractPath/die3c.png"; print "."; sleep 1;}
|
||||
while (1) { last if -e "$extractPath/die4c.png"; print "."; sleep 1;}
|
||||
print " done\n";
|
||||
|
||||
my $outFileName = sprintf("%08d", $id);
|
||||
|
||||
print "Produce Output ...";
|
||||
system("convert -size 1048x1680 xc:black $extractPath/die0c.png -geometry +0+1200 -composite $extractPath/die1c.png -geometry +0+900 -composite $extractPath/die2c.png -geometry +0+600 -composite $extractPath/die3c.png -geometry +0+300 -composite $extractPath/die4c.png -composite $extractPath/a$outFileName.jpg");
|
||||
|
||||
while (1) { last if -e "$extractPath/a$outFileName.jpg"; print "."; sleep 1;}
|
||||
system("convert $extractPath/a$outFileName.jpg -pointsize 80 -fill white -gravity northeast -draw \"text 20,20 '".$samples."ms'\" $extractPath/b$outFileName.jpg");
|
||||
|
||||
while (1) { last if -e "$extractPath/b$outFileName.jpg"; print "."; sleep 1;}
|
||||
system("convert $extractPath/b$outFileName.jpg constants/legend/legend4.png +append ../out/$outFileName.jpg");
|
||||
|
||||
print " done\n";
|
||||
|
||||
print "Produce Samples ...";
|
||||
for(my $i = 0; $i < $samples-1; $i++)
|
||||
{
|
||||
$id++;
|
||||
my $outFileNameCopy = sprintf("%08d", $id);
|
||||
copy("../out/$outFileName.jpg","../out/$outFileNameCopy.jpg");
|
||||
}
|
||||
print " done\n";
|
||||
|
||||
# cleanup
|
||||
print "Cleanup ... ";
|
||||
while (1) { last if -e "/gu2/jungma/thermal/out/$outFileName.jpg"; print "."; sleep 1;}
|
||||
system("rm -rf $extractPath");
|
||||
print " done\n";
|
||||
|
||||
##ffmpeg -start_number 00000000 -i %08d.jpg -vcodec mpeg4 test.avi
|
||||
@@ -0,0 +1,67 @@
|
||||
#!/usr/bin/perl -w
|
||||
use warnings;
|
||||
use strict;
|
||||
use List::Util qw( min max );
|
||||
|
||||
#/Volumes/Etana_tmp2/tmp_sadri/backup/sep_16/log_smartbench_traces_50_cpu_1650_mhz_100_mhz_dram_100_mhz_sampling8X_bankwise_on_test/out-backup
|
||||
my $inputPath = "../in/out-backup";
|
||||
my $extractPath = "../tmp";
|
||||
my $samplingFile = "../in/sampling";
|
||||
|
||||
# Read the input file names and store it in an array
|
||||
opendir (DIR, $inputPath) or die $!;
|
||||
|
||||
my @files;
|
||||
my @sortetFiles;
|
||||
|
||||
while (my $file = readdir(DIR))
|
||||
{
|
||||
push(@files, $file);
|
||||
}
|
||||
|
||||
@sortetFiles = sort @files;
|
||||
|
||||
|
||||
print "Cleanup\n";
|
||||
system("rm -rf *.err *.out");
|
||||
system("rm -rf ../tmp/*");
|
||||
print "Load modules\n";
|
||||
|
||||
|
||||
# Estimate sampeling numbers
|
||||
|
||||
open(SF,$samplingFile);
|
||||
|
||||
my @refreshRates;
|
||||
|
||||
while(<SF>)
|
||||
{
|
||||
$_ =~ /(\d+)\.0/;
|
||||
my $rate = $1;
|
||||
push(@refreshRates, $rate);
|
||||
}
|
||||
|
||||
print "Max. Rate:".max(@refreshRates)."\n";
|
||||
print "Min. Rate:".min(@refreshRates)."\n";
|
||||
|
||||
my $counter = 0;
|
||||
my $i = 0;
|
||||
# For each data package start one job!
|
||||
foreach(@sortetFiles)
|
||||
{
|
||||
my $file = $_;
|
||||
|
||||
if($file =~ /(\d+)-(\d+)-(\d+)-(\d+)-(\d+)-(\d+)-(\d+)\.tgz/)
|
||||
{
|
||||
my $samples = $refreshRates[$i];
|
||||
system("bsub -W 00:05 ./temperatur.job.pl $file $counter $samples");
|
||||
$counter+=$samples;
|
||||
$i++;
|
||||
#if($i == 100)
|
||||
#{
|
||||
# last;
|
||||
#}
|
||||
}
|
||||
}
|
||||
|
||||
##ffmpeg -start_number 00000000 -i %08d.jpg -vcodec mpeg4 test.avi
|
||||
@@ -1,13 +1,30 @@
|
||||
<simulation>
|
||||
<!-- General Simulator Configuration (used for all simulation setups) -->
|
||||
<simconfig>
|
||||
<Debug value="1" />
|
||||
<DatabaseRecording value="1" />
|
||||
<PowerAnalysis value="1" />
|
||||
<NumberOfTracePlayers value="4"/>
|
||||
<NumberOfTracePlayers value="1"/>
|
||||
<NumberOfMemChannels value="4"/>
|
||||
<ControllerCoreDisableRefresh value="0"/>
|
||||
<DynamicTemperatureSimulation value="0"/>
|
||||
</simconfig>
|
||||
|
||||
<!-- Temperature Simulator Configuration (used for all simulation setups) -->
|
||||
<temperature_simconfig>
|
||||
<TemperatureScale value="Celsius" />
|
||||
<StaticTemperatureDefaultValue value="89" />
|
||||
<DynTemperatureSimPeriod value="100" />
|
||||
<DynTemperatureSimUnit value="us" />
|
||||
<PowerInfoFile value="../../DRAMSys/simulator/resources/configs/temperature_sim/powerInfo.xml"/>
|
||||
<IceServerIp value="127.0.0.1" />
|
||||
<IceServerPort value="11880" />
|
||||
<SimPeriodAdjustFactor value="10" />
|
||||
<NPowStableCyclesToIncreasePeriod value="5" />
|
||||
<GenerateTemperatureMap value="1" />
|
||||
<GeneratePowerMap value="1" />
|
||||
</temperature_simconfig>
|
||||
|
||||
<memspecs>
|
||||
<memspec src="../../DRAMSys/simulator/resources/configs/memspecs/WideIO.xml"></memspec>
|
||||
</memspecs>
|
||||
@@ -17,7 +34,7 @@
|
||||
</addressmappings>
|
||||
|
||||
<memconfigs>
|
||||
<memconfig src="../../DRAMSys/simulator/resources/configs/memconfigs/fr_fcfs.xml"/>
|
||||
<memconfig src="../../DRAMSys/simulator/resources/configs/memconfigs/fifoStrict.xml"/>
|
||||
</memconfigs>
|
||||
|
||||
<tracesetups>
|
||||
@@ -25,5 +42,6 @@
|
||||
<device clkMhz="200">chstone-adpcm_32.stl</device>
|
||||
</tracesetup>
|
||||
</tracesetups>
|
||||
|
||||
</simulation>
|
||||
|
||||
|
||||
@@ -61,6 +61,7 @@ SOURCES += \
|
||||
src/simulation/Simulation.cpp \
|
||||
src/simulation/MemoryManager.cpp \
|
||||
src/simulation/main.cpp \
|
||||
src/simulation/TemperatureController.cpp \
|
||||
src/controller/scheduler/readwritegrouper.cpp \
|
||||
src/controller/core/configuration/ConfigurationLoader.cpp \
|
||||
src/controller/core/powerdown/NoPowerDown.cpp \
|
||||
@@ -116,10 +117,12 @@ HEADERS += \
|
||||
src/controller/scheduler/readwritegrouper.h \
|
||||
src/simulation/ReorderBuffer.h \
|
||||
src/controller/core/configuration/MemSpec.h \
|
||||
src/controller/core/configuration/temperatureSimConfig.h \
|
||||
src/simulation/StlPlayer.h \
|
||||
src/simulation/StlDataPlayer.h \
|
||||
src/simulation/TracePlayerListener.h \
|
||||
src/simulation/TraceGenerator.h \
|
||||
src/simulation/TemperatureController.h \
|
||||
src/controller/core/powerdown/NoPowerDown.h \
|
||||
src/controller/Command.h \
|
||||
src/controller/RowBufferStates.h \
|
||||
@@ -131,3 +134,32 @@ HEADERS += \
|
||||
src/controller/core/configuration/ConfigurationLoader.h \
|
||||
src/error/errormodel.h
|
||||
|
||||
thermalsim = $$(THERMALSIM)
|
||||
isEmpty(thermalsim) {
|
||||
thermalsim = false
|
||||
}
|
||||
|
||||
$$eval(thermalsim) {
|
||||
message(Thermal Simulation Feature Enabled)
|
||||
|
||||
LIBS += -L/opt/3D-ICE/lib -lthreed-ice-2.2.5
|
||||
LIBS += -L/opt/SuperLU_4.3/lib -lsuperlu_4.3
|
||||
LIBS += -lblas
|
||||
message(Libraries: $${LIBS})
|
||||
|
||||
INCLUDEPATH += /opt/3D-ICE/include
|
||||
INCLUDEPATH += /opt/SuperLU_4.3/SRC
|
||||
INCLUDEPATH += /opt/systemc/include
|
||||
INCLUDEPATH += src/common/third_party/icewrapper
|
||||
message(Include paths: $${INCLUDEPATH})
|
||||
|
||||
OBJECTS += $$(PWD)/src/common/third_party/icewrapper/IceWrapper.o
|
||||
message(Objects: $${OBJECTS})
|
||||
|
||||
QMAKE_CXXFLAGS += -DTHERMALSIM
|
||||
message(Compiler flags: $${QMAKE_CXXFLAGS})
|
||||
|
||||
} else {
|
||||
message(Thermal Simulation Feature Disabled)
|
||||
}
|
||||
|
||||
|
||||
1
DRAMSys/simulator/src/common/third_party/icewrapper
vendored
Submodule
1
DRAMSys/simulator/src/common/third_party/icewrapper
vendored
Submodule
Submodule DRAMSys/simulator/src/common/third_party/icewrapper added at 2179c985a0
@@ -151,7 +151,7 @@ void Controller<BUSWIDTH>::buildScheduler()
|
||||
}
|
||||
else if (selectedScheduler == "FIFO_STRICT")
|
||||
{
|
||||
scheduler = new FifoStrict(*this, *controllerCore);
|
||||
scheduler = new FifoStrict(*controllerCore);
|
||||
}
|
||||
else if (selectedScheduler == "FR_FCFS")
|
||||
{
|
||||
@@ -316,16 +316,7 @@ void Controller<BUSWIDTH>::controllerCorePEQCallback(tlm_generic_payload &payloa
|
||||
|
||||
if (phase == BEGIN_RD || phase == BEGIN_WR)
|
||||
{
|
||||
if(Configuration::getInstance().Scheduler == "FIFO_STRICT")
|
||||
{
|
||||
// special case for the Fifo_strict scheduler, because it may have to unblock
|
||||
// the current front element
|
||||
dynamic_cast<FifoStrict*>(scheduler)->NotifyBeginRDWR();
|
||||
}
|
||||
else
|
||||
{
|
||||
scheduleNextFromScheduler(DramExtension::getBank(payload));
|
||||
}
|
||||
scheduleNextFromScheduler(DramExtension::getBank(payload));
|
||||
}
|
||||
else if (phase == BEGIN_REFB)
|
||||
printDebugMessage("Entering REFB on bank " + to_string(bank.ID()));
|
||||
|
||||
@@ -87,6 +87,26 @@ EPowerDownMode string2PDNMode(string s)
|
||||
}
|
||||
}
|
||||
|
||||
enum sc_time_unit string2TimeUnit(string s)
|
||||
{
|
||||
if (s == "s")
|
||||
return SC_SEC;
|
||||
else if (s == "ms")
|
||||
return SC_MS;
|
||||
else if (s == "us")
|
||||
return SC_US;
|
||||
else if (s == "ns")
|
||||
return SC_NS;
|
||||
else if (s == "ps")
|
||||
return SC_PS;
|
||||
else if (s == "fs")
|
||||
return SC_FS;
|
||||
else {
|
||||
SC_REPORT_FATAL("Configuration", ("Could not convert to enum sc_time_unit: " + s).c_str());
|
||||
throw;
|
||||
}
|
||||
}
|
||||
|
||||
void Configuration::setParameter(std::string name, std::string value)
|
||||
{
|
||||
if(name == "BankwiseLogic")
|
||||
@@ -123,6 +143,8 @@ void Configuration::setParameter(std::string name, std::string value)
|
||||
NumberOfMemChannels = string2int(value);
|
||||
else if (name == "ControllerCoreDisableRefresh")
|
||||
ControllerCoreDisableRefresh = string2bool(value);
|
||||
else if (name == "DynamicTemperatureSimulation")
|
||||
DynamicTemperatureSimulation = string2bool(value);
|
||||
// Specification for ErrorChipSeed, ErrorCSVFile path and ErrorStoreMode
|
||||
else if(name == "ErrorChipSeed")
|
||||
ErrorChipSeed = string2int(value);
|
||||
@@ -130,6 +152,36 @@ void Configuration::setParameter(std::string name, std::string value)
|
||||
ErrorCSVFile = value;
|
||||
else if(name == "ErrorStoreMode")
|
||||
ErrorStoreMode = StringToEnum(value);
|
||||
// Temperature Simulation related
|
||||
else if (name == "TemperatureScale") {
|
||||
if (value != "Celsius" && value != "Fahrenheit" && value != "Kelvin") {
|
||||
SC_REPORT_FATAL("Configuration", ("Invalid value for parameter " + name + ".").c_str());
|
||||
throw;
|
||||
}
|
||||
temperatureSim.TemperatureScale = value;
|
||||
}
|
||||
else if (name == "StaticTemperatureDefaultValue")
|
||||
temperatureSim.StaticTemperatureDefaultValue = string2int(value);
|
||||
else if (name == "DynTemperatureSimPeriod")
|
||||
temperatureSim.DynTemperatureSimPeriod = std::stod(value.c_str());
|
||||
else if (name == "DynTemperatureSimUnit")
|
||||
temperatureSim.DynTemperatureSimUnit = string2TimeUnit(value);
|
||||
else if (name == "PowerInfoFile") {
|
||||
temperatureSim.powerInfoFile = value;
|
||||
temperatureSim.parsePowerInfoFile();
|
||||
}
|
||||
else if (name == "IceServerIp")
|
||||
temperatureSim.IceServerIp = value;
|
||||
else if (name == "IceServerPort")
|
||||
temperatureSim.IceServerPort = string2int(value);
|
||||
else if (name == "SimPeriodAdjustFactor")
|
||||
temperatureSim.SimPeriodAdjustFactor = std::stoi(value.c_str());
|
||||
else if (name == "NPowStableCyclesToIncreasePeriod")
|
||||
temperatureSim.NPowStableCyclesToIncreasePeriod = std::stoi(value.c_str());
|
||||
else if (name == "GenerateTemperatureMap")
|
||||
temperatureSim.GenerateTemperatureMap = string2bool(value);
|
||||
else if (name == "GeneratePowerMap")
|
||||
temperatureSim.GeneratePowerMap = string2bool(value);
|
||||
else
|
||||
{
|
||||
SC_REPORT_FATAL("Configuration", ("Parameter " + name + " not defined in Configuration").c_str());
|
||||
@@ -145,4 +197,3 @@ void Configuration::setParameters(std::map<std::string, std::string> parameterMa
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -41,6 +41,7 @@
|
||||
#include <systemc.h>
|
||||
#include <string>
|
||||
#include "MemSpec.h"
|
||||
#include "temperatureSimConfig.h"
|
||||
#include "../../../common/Utils.h"
|
||||
|
||||
enum class ErrorStorageMode;
|
||||
@@ -62,7 +63,7 @@ struct Configuration
|
||||
//MemConfig
|
||||
bool BankwiseLogic = false;
|
||||
bool OpenPagePolicy = true;
|
||||
unsigned int MaxNrOfTransactions = 50;
|
||||
unsigned int MaxNrOfTransactions = 8;
|
||||
std::string Scheduler;
|
||||
unsigned int Capsize = 5;
|
||||
sc_time getPowerDownTimeout(){return powerDownTimeoutInClk*memSpec.clk;}
|
||||
@@ -78,6 +79,7 @@ struct Configuration
|
||||
unsigned int NumberOfTracePlayers = 1;
|
||||
unsigned int NumberOfMemChannels = 1;
|
||||
bool ControllerCoreDisableRefresh = false;
|
||||
bool DynamicTemperatureSimulation = false;
|
||||
|
||||
//MemSpec(from DRAM-Power XML)
|
||||
MemSpec memSpec;
|
||||
@@ -90,6 +92,9 @@ struct Configuration
|
||||
std::string ErrorCSVFile ="not defined.";
|
||||
ErrorStorageMode ErrorStoreMode;
|
||||
|
||||
// Temperature Simulation related
|
||||
TemperatureSimConfig temperatureSim;
|
||||
|
||||
private:
|
||||
Configuration();
|
||||
unsigned int powerDownTimeoutInClk = 3;
|
||||
|
||||
@@ -62,6 +62,22 @@ void ConfigurationLoader::loadSimConfig(Configuration& config, XMLElement* simco
|
||||
loadConfig(config, simconfig);
|
||||
}
|
||||
|
||||
void ConfigurationLoader::loadTemperatureSimConfig(Configuration &config, std::string temperature_simconfigUri)
|
||||
{
|
||||
loadConfigFromUri(config, temperature_simconfigUri, "temperature_simconfig");
|
||||
}
|
||||
|
||||
void ConfigurationLoader::loadTemperatureSimConfig(Configuration &config, XMLElement *temperature_simconfig)
|
||||
{
|
||||
if (temperature_simconfig->Attribute("src")) {
|
||||
// Configuration is inside another a file
|
||||
std::string uri(temperature_simconfig->Attribute("src"));
|
||||
loadConfigFromUri(config, uri, "temperature_simconfig");
|
||||
} else {
|
||||
loadConfig(config, temperature_simconfig);
|
||||
}
|
||||
}
|
||||
|
||||
void ConfigurationLoader::loadConfig(Configuration& config, XMLElement* configNode)
|
||||
{
|
||||
XMLElement* element;
|
||||
@@ -73,6 +89,14 @@ void ConfigurationLoader::loadConfig(Configuration& config, XMLElement* configNo
|
||||
}
|
||||
}
|
||||
|
||||
void ConfigurationLoader::loadConfigFromUri(Configuration &config, std::string uri, std::string first_element)
|
||||
{
|
||||
tinyxml2::XMLDocument doc;
|
||||
loadXML(uri, doc);
|
||||
XMLElement *e = doc.FirstChildElement(first_element.c_str());
|
||||
loadConfig(config, e);
|
||||
}
|
||||
|
||||
void ConfigurationLoader::loadMemSpec(Configuration& config, string memspecUri)
|
||||
{
|
||||
tinyxml2::XMLDocument doc;
|
||||
|
||||
@@ -46,16 +46,20 @@ class ConfigurationLoader
|
||||
{
|
||||
public:
|
||||
static void loadMemConfig(Configuration& config, std::string memconfigUri);
|
||||
static void loadSimConfig(Configuration& config, std::string simconfigUri);
|
||||
static void loadMemConfig(Configuration& config, tinyxml2::XMLElement* memconfig);
|
||||
|
||||
static void loadSimConfig(Configuration& config, std::string simconfigUri);
|
||||
static void loadSimConfig(Configuration& config,tinyxml2::XMLElement* simconfig);
|
||||
|
||||
static void loadMemSpec(Configuration& config, std::string memspecUri);
|
||||
static void loadMemSpec(Configuration& config, tinyxml2::XMLElement* memspec);
|
||||
|
||||
static void loadTemperatureSimConfig(Configuration &config, std::string simconfigUri);
|
||||
static void loadTemperatureSimConfig(Configuration& config, tinyxml2::XMLElement *simconfig);
|
||||
private:
|
||||
ConfigurationLoader(){}
|
||||
static void loadConfig(Configuration& config, tinyxml2::XMLElement* configNode);
|
||||
static void loadConfigFromUri(Configuration &config, std::string uri, std::string first_element);
|
||||
|
||||
//specific loader
|
||||
static void loadDDR3(Configuration& config, tinyxml2::XMLElement* memspec);
|
||||
|
||||
@@ -0,0 +1,123 @@
|
||||
/*
|
||||
* Copyright (c) 2015, University of Kaiserslautern
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are
|
||||
* met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright notice,
|
||||
* this list of conditions and the following disclaimer.
|
||||
*
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
*
|
||||
* 3. Neither the name of the copyright holder nor the names of its
|
||||
* contributors may be used to endorse or promote products derived from
|
||||
* this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||||
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER
|
||||
* OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* Authors:
|
||||
* Eder F. Zulian
|
||||
* Matthias Jung
|
||||
*/
|
||||
|
||||
#ifndef TEMPERATURE_SIM_CONFIG_H_
|
||||
#define TEMPERATURE_SIM_CONFIG_H_
|
||||
|
||||
#include <systemc.h>
|
||||
#include <iostream>
|
||||
#include <string>
|
||||
|
||||
#include "../../../common/DebugManager.h"
|
||||
#include "../../../common/third_party/tinyxml2/tinyxml2.h"
|
||||
#include "../../../common/Utils.h"
|
||||
|
||||
struct TemperatureSimConfig {
|
||||
|
||||
// Temperature Scale
|
||||
std::string TemperatureScale;
|
||||
|
||||
// Static Temperature Simulation parameters
|
||||
int StaticTemperatureDefaultValue;
|
||||
|
||||
// Dynamic Temeperature Simulation parameters
|
||||
double DynTemperatureSimPeriod;
|
||||
enum sc_time_unit DynTemperatureSimUnit;
|
||||
std::string IceServerIp;
|
||||
unsigned int IceServerPort;
|
||||
unsigned int SimPeriodAdjustFactor;
|
||||
unsigned int NPowStableCyclesToIncreasePeriod;
|
||||
bool GenerateTemperatureMap;
|
||||
bool GeneratePowerMap;
|
||||
|
||||
// Power related information
|
||||
std::string powerInfoFile;
|
||||
std::vector<float> powerInitialValues;
|
||||
std::vector<float> powerThresholds;
|
||||
|
||||
void parsePowerInfoFile()
|
||||
{
|
||||
printDebugMessage("Power Info File: " + powerInfoFile);
|
||||
|
||||
// Load the XML file into memory and parse it
|
||||
tinyxml2::XMLDocument xml;
|
||||
loadXML(powerInfoFile, xml);
|
||||
tinyxml2::XMLElement *powInfoElem = xml.FirstChildElement("powerInfo");
|
||||
|
||||
if (powInfoElem == NULL) {
|
||||
// Invalid file
|
||||
std::string errormsg = "Invalid Power Info File " + powerInfoFile;
|
||||
printDebugMessage(errormsg);
|
||||
SC_REPORT_FATAL("Temperature Sim Config", errormsg.c_str());
|
||||
throw;
|
||||
}
|
||||
|
||||
for (tinyxml2::XMLElement *e = powInfoElem->FirstChildElement(); e != NULL; e = e->NextSiblingElement()) {
|
||||
|
||||
// Load initial power values for all devices
|
||||
std::string init_pow_str = e->Attribute("init_pow");
|
||||
float pow = std::stof(init_pow_str);
|
||||
powerInitialValues.push_back(pow);
|
||||
|
||||
// Load power thresholds for all devices (changes in power dissipation that exceed the threshods will make the thermal simulation to be executed more often)
|
||||
std::string thr_str = e->Attribute("threshold");
|
||||
float thr = std::stof(thr_str);
|
||||
powerThresholds.push_back(thr);
|
||||
}
|
||||
|
||||
showTemperatureSimConfig();
|
||||
}
|
||||
|
||||
void showTemperatureSimConfig()
|
||||
{
|
||||
int i = 0;
|
||||
for (auto e : powerInitialValues) {
|
||||
printDebugMessage("powerInitialValues[" + std::to_string(i++) + "]: " + std::to_string(e));
|
||||
}
|
||||
i = 0;
|
||||
for (auto e : powerThresholds) {
|
||||
printDebugMessage("powerThreshold[" + std::to_string(i++) + "]: " + std::to_string(e));
|
||||
}
|
||||
}
|
||||
|
||||
void printDebugMessage(std::string message)
|
||||
{
|
||||
DebugManager::getInstance().printDebugMessage("Temperature Sim Config", message);
|
||||
}
|
||||
};
|
||||
|
||||
#endif /* TEMPERATURE_SIM_CONFIG_H_ */
|
||||
|
||||
@@ -37,77 +37,83 @@
|
||||
|
||||
#include "FifoStrict.h"
|
||||
|
||||
void FifoStrict::schedule(gp *payload)
|
||||
void FifoStrict::schedule(tlm::tlm_generic_payload *payload)
|
||||
{
|
||||
buffer.push_back(payload);
|
||||
printDebugMessage("New payload scheduled. Total number " + std::to_string(buffer.size()) + "\n");
|
||||
}
|
||||
|
||||
void FifoStrict::printFrontElementState()
|
||||
{
|
||||
if(buffer.size() > 0)
|
||||
{
|
||||
printDebugMessage("Front element state - Bank: " + DramExtension::getBank(buffer.front()).toString() + " Operation: " +
|
||||
commandToString(getNextCommand(*buffer.front())) + "\n");
|
||||
}
|
||||
else
|
||||
{
|
||||
printDebugMessage("No fron element. Buffer is empty \n ");
|
||||
}
|
||||
}
|
||||
|
||||
void FifoStrict::NotifyBeginRDWR()
|
||||
{
|
||||
buffer.erase(buffer.begin());
|
||||
printDebugMessage("Front element finished. New front Element: ");
|
||||
printFrontElementState();
|
||||
|
||||
if(buffer.size() > 0)
|
||||
{
|
||||
// If the new front element was orginally blocked, because it had to wait on the old front element, we have to call
|
||||
// controller.scheduleNextFromScheduler explicitly, otherwise there will be a deadlock in the system
|
||||
controller.scheduleNextFromScheduler(DramExtension::getBank(buffer.front()));
|
||||
}
|
||||
Bank bank = DramExtension::getExtension(payload).getBank();
|
||||
buffer.push_back(std::pair<Bank, tlm::tlm_generic_payload *>(bank, payload));
|
||||
}
|
||||
|
||||
std::pair<Command, tlm::tlm_generic_payload *> FifoStrict::getNextRequest(Bank bank)
|
||||
{
|
||||
if(buffer.empty())
|
||||
{
|
||||
return pair<Command, tlm::tlm_generic_payload*>(Command::NOP, NULL);
|
||||
}
|
||||
if (!buffer.empty()) {
|
||||
|
||||
else if(DramExtension::getBank(buffer.front()) == bank)
|
||||
{
|
||||
Command command = getNextCommand(*buffer.front());
|
||||
pair<Command, tlm::tlm_generic_payload*> result(command, buffer.front());
|
||||
printDebugMessage("Operation for front Element scheduled. ");
|
||||
printFrontElementState();
|
||||
if (buffer.front().first == bank) {
|
||||
// The next request in the FIFO is for the bank passed as parameter
|
||||
|
||||
return result;
|
||||
}
|
||||
else
|
||||
{
|
||||
for(unsigned int i = 1; i < buffer.size(); ++i)
|
||||
{
|
||||
if(DramExtension::getBank(buffer[i]) == bank)
|
||||
{
|
||||
Command command = getNextCommand(*buffer[i]);
|
||||
tlm::tlm_generic_payload *payload = buffer.front().second;
|
||||
|
||||
// RD/WR operations have to be strictly in order across banks, so only allow progress on commands
|
||||
// other than RD/WR commands.
|
||||
if(commandIsIn(command, {Command::Read, Command::Write, Command::ReadA, Command::WriteA}))
|
||||
{
|
||||
printDebugMessage("Current queue element " + std::to_string(i) + " blocked. Waiting for earlier rd/wr to finish\n");
|
||||
return pair<Command, tlm::tlm_generic_payload*>(Command::NOP, NULL);
|
||||
}
|
||||
else
|
||||
{
|
||||
return pair<Command, tlm::tlm_generic_payload*>(command, buffer[i]);
|
||||
// For a given request (a given payload) one or more commands will
|
||||
// be sent to the DRAM in order to process it.
|
||||
//
|
||||
// getNextRequest() may be called more than once for the same
|
||||
// enqueued request until the appropriate sequence of commands is
|
||||
// sent to the DRAM.
|
||||
//
|
||||
// Every time getNextRequest() it is called it calls
|
||||
// getNextCommand() that returns the suitable command to be sent
|
||||
// to the DRAM.
|
||||
//
|
||||
// getNextCommand() returns the proper command based on the
|
||||
// internal status of the DRAM.
|
||||
//
|
||||
// In the worst case getNextCommand() need to be called three
|
||||
// times for a given element in the requests queue: first for
|
||||
// precharge, second for activate and finally for read or write
|
||||
// (accordingly the nature of the request). In contrast, for the
|
||||
// case of an already open row (due to a previous request) the
|
||||
// command itself could be directly issued.
|
||||
//
|
||||
Command command = IScheduler::getNextCommand(*payload);
|
||||
|
||||
if(commandIsIn(command, {Command::Read, Command::Write, Command::ReadA, Command::WriteA})) {
|
||||
buffer.pop_front();
|
||||
}
|
||||
|
||||
return pair<Command, tlm::tlm_generic_payload*>(command, payload);
|
||||
|
||||
} else {
|
||||
// The next request in the FIFO is NOT for the bank passed as parameter.
|
||||
|
||||
// Search for the next request related to the bank passed as parameter.
|
||||
for (auto req = buffer.begin(); req != buffer.end(); req++) {
|
||||
if (req->first == bank) {
|
||||
// Found a request to this bank in the queue
|
||||
tlm::tlm_generic_payload *payload = req->second;
|
||||
|
||||
// Get the appropriate command to be sent to the DRAM
|
||||
// regarding this request.
|
||||
//
|
||||
// Commands other than read and write will be issued.
|
||||
// Reads and writes will not be issued since this
|
||||
// scheduler executes all read and writes in a strict
|
||||
// order.
|
||||
Command command = getNextCommand(*payload);
|
||||
if(commandIsIn(command, {Command::Read, Command::Write, Command::ReadA, Command::WriteA})) {
|
||||
// Reads and writes must be executed in order. Then if
|
||||
// the next command for this request is read or write
|
||||
// NOP will be returned and no operation will be
|
||||
// performed.
|
||||
return pair<Command, tlm::tlm_generic_payload*>(Command::NOP, NULL);
|
||||
} else {
|
||||
// Commands other than read and write are issued normally.
|
||||
return pair<Command, tlm::tlm_generic_payload*>(command, payload);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return pair<Command, tlm::tlm_generic_payload*>(Command::NOP, NULL);
|
||||
}
|
||||
|
||||
// The FIFO is empty
|
||||
return pair<Command, tlm::tlm_generic_payload*>(Command::NOP, NULL);
|
||||
}
|
||||
|
||||
|
||||
@@ -38,33 +38,26 @@
|
||||
#ifndef FIFOSTRICT_H
|
||||
#define FIFOSTRICT_H
|
||||
|
||||
#include "../core/ControllerCore.h"
|
||||
#include "../Command.h"
|
||||
#include "../../common/dramExtension.h"
|
||||
#include "IScheduler.h"
|
||||
#include <deque>
|
||||
#include <map>
|
||||
#include <utility>
|
||||
|
||||
#include "../core/ControllerCore.h"
|
||||
#include "../Command.h"
|
||||
#include "IScheduler.h"
|
||||
|
||||
class FifoStrict : public IScheduler
|
||||
{
|
||||
public:
|
||||
FifoStrict(IController &controller,ControllerCore &controllerCore) :
|
||||
IScheduler(controllerCore), controller(controller)
|
||||
{}
|
||||
virtual ~FifoStrict()
|
||||
{}
|
||||
FifoStrict(ControllerCore &controllerCore) : IScheduler(controllerCore) {}
|
||||
virtual ~FifoStrict() {}
|
||||
|
||||
void schedule(gp* payload) override;
|
||||
std::pair<Command, tlm::tlm_generic_payload*> getNextRequest(Bank bank) override;
|
||||
void NotifyBeginRDWR();
|
||||
void NotifyBeginRD();
|
||||
|
||||
private:
|
||||
std::vector<gp*> buffer;
|
||||
IController &controller;
|
||||
void printFrontElementState();
|
||||
std::deque<std::pair<Bank, tlm::tlm_generic_payload *>> buffer;
|
||||
};
|
||||
|
||||
#endif /* FIFOSTRICT_H */
|
||||
|
||||
#endif // FIFOSTRICT_H
|
||||
|
||||
@@ -35,12 +35,16 @@
|
||||
|
||||
#include "errormodel.h"
|
||||
#include "../common/DebugManager.h"
|
||||
#include "../simulation/TemperatureController.h"
|
||||
|
||||
#include <random>
|
||||
#include <chrono>
|
||||
#include <bitset>
|
||||
|
||||
errorModel::errorModel()
|
||||
void errorModel::init()
|
||||
{
|
||||
powerAnalysis = Configuration::getInstance().PowerAnalysis;
|
||||
dynTemperatureSim = Configuration::getInstance().DynamicTemperatureSimulation;
|
||||
// Get Configuration parameters:
|
||||
busWidth = Configuration::getInstance().Buswidth;
|
||||
burstLenght = Configuration::getInstance().memSpec.BurstLength;
|
||||
@@ -49,6 +53,7 @@ errorModel::errorModel()
|
||||
numberOfRows = Configuration::getInstance().memSpec.NumberOfRows;
|
||||
numberOfBitErrorEvents = 0;
|
||||
|
||||
|
||||
// Initialize the lastRow Access array:
|
||||
lastRowAccess = new sc_time[numberOfRows];
|
||||
for(unsigned int i = 0; i < numberOfRows; i++)
|
||||
@@ -101,10 +106,20 @@ errorModel::errorModel()
|
||||
//weakCells[0].row = 0;
|
||||
//weakCells[0].dependent = true;
|
||||
|
||||
setTemperature(89);
|
||||
markBitFlips();
|
||||
}
|
||||
|
||||
errorModel::errorModel(libDRAMPower *dp)
|
||||
{
|
||||
this->DRAMPower = dp;
|
||||
init();
|
||||
}
|
||||
|
||||
errorModel::errorModel()
|
||||
{
|
||||
init();
|
||||
}
|
||||
|
||||
errorModel::~errorModel()
|
||||
{
|
||||
// Remove all data from the dataMap:
|
||||
@@ -229,6 +244,7 @@ void errorModel::load(tlm::tlm_generic_payload &trans)
|
||||
|
||||
void errorModel::markBitFlips()
|
||||
{
|
||||
double temp = getTemperature();
|
||||
for(unsigned int row = 0; row < Configuration::getInstance().memSpec.NumberOfRows; row++)
|
||||
{
|
||||
// If the row has never been accessed ignore it and go to the next one
|
||||
@@ -238,7 +254,7 @@ void errorModel::markBitFlips()
|
||||
sc_time interval = sc_time_stamp() - lastRowAccess[row];
|
||||
|
||||
// Obtain the number of bit flips for the current temperature and the time interval:
|
||||
unsigned int n = getNumberOfFlips(temperature, interval);
|
||||
unsigned int n = getNumberOfFlips(temp, interval);
|
||||
|
||||
// Check if the current row is in the range of bit flips for this interval
|
||||
// and temperature, if yes mark it as flipped:
|
||||
@@ -489,9 +505,27 @@ unsigned int errorModel::getBit(int row, int column, int byteInColumn, int bitIn
|
||||
return getBit(key, byteInColumn, bitInByte);
|
||||
}
|
||||
|
||||
void errorModel::setTemperature(double t)
|
||||
double errorModel::getTemperature()
|
||||
{
|
||||
temperature = t;
|
||||
// FIXME
|
||||
// make sure the context is set (myChannel has the proper value) before
|
||||
// requesting the temperature.
|
||||
double temperature = 89;
|
||||
|
||||
if (this->myChannel != -1) {
|
||||
if (dynTemperatureSim == true && powerAnalysis == true) {
|
||||
// TODO
|
||||
// check if this is best way to request information to DRAMPower.
|
||||
DRAMPower->updateCounters(true);
|
||||
DRAMPower->calcEnergy();
|
||||
float average_power = (float)DRAMPower->getPower().average_power;
|
||||
temperature = TemperatureController::getInstance().getTemperature(this->myChannel, average_power);
|
||||
} else {
|
||||
temperature = TemperatureController::getInstance().getTemperature(this->myChannel, 0);
|
||||
}
|
||||
}
|
||||
|
||||
return temperature;
|
||||
}
|
||||
|
||||
void errorModel::parseInputData()
|
||||
@@ -678,55 +712,52 @@ void errorModel::prepareWeakCells()
|
||||
// Retrieve number of flipping bits which fits best to temperature input and time since last refresh
|
||||
unsigned int errorModel::getNumberOfFlips(double temp, sc_time time)
|
||||
{
|
||||
// Check if the provided temperature and time are in a valid range that
|
||||
// is covered by the input data stored in the errorMap:
|
||||
if(temp > maxTemperature)
|
||||
{
|
||||
// Check if the provided temperature and retention time are in a valid
|
||||
// range that is covered by the input data stored in the errorMap. In case
|
||||
// of values out of the valid range the simulation will be aborted.
|
||||
if (temp > maxTemperature) {
|
||||
SC_REPORT_FATAL("errormodel","temperature out of range");
|
||||
}
|
||||
else if(time > maxTime)
|
||||
{
|
||||
|
||||
if (time > maxTime) {
|
||||
SC_REPORT_FATAL("errormodel","time out of range");
|
||||
}
|
||||
else
|
||||
|
||||
// Find nearest temperature:
|
||||
double nearestTemperature = 0;
|
||||
for( const auto &i : errorMap )
|
||||
{
|
||||
// Find nearest temperature:
|
||||
double nearestTemperature = 0;
|
||||
for( const auto &i : errorMap )
|
||||
if(i.first >= temp) // for worst case reasons we go to the next bin
|
||||
{
|
||||
if(i.first >= temp) // for worst case reasons we go to the next bin
|
||||
{
|
||||
nearestTemperature = i.first;
|
||||
break;
|
||||
}
|
||||
nearestTemperature = i.first;
|
||||
break;
|
||||
}
|
||||
|
||||
// Find nearest time:
|
||||
sc_time nearestTime;
|
||||
for( const auto &i : errorMap[nearestTemperature])
|
||||
{
|
||||
if(i.first >= time) // for worst case reasons we go to the next bin
|
||||
{
|
||||
nearestTime = i.first;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
errors e = errorMap[nearestTemperature][nearestTime];
|
||||
|
||||
//std::stringstream msg;
|
||||
//msg << "ACT/REF temp:" << temp
|
||||
// << " time:" << time
|
||||
// << " nearestTemp:" << nearestTemperature
|
||||
// << " nearestTime:" << nearestTime
|
||||
// << " ind:" << e.independent
|
||||
// << " dep:" << e.dependent;
|
||||
|
||||
//DebugManager::getInstance().printDebugMessage(name, msg.str());
|
||||
|
||||
return e.independent + e.dependent;
|
||||
}
|
||||
return 0;
|
||||
|
||||
// Find nearest time:
|
||||
sc_time nearestTime;
|
||||
for( const auto &i : errorMap[nearestTemperature])
|
||||
{
|
||||
if(i.first >= time) // for worst case reasons we go to the next bin
|
||||
{
|
||||
nearestTime = i.first;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
errors e = errorMap[nearestTemperature][nearestTime];
|
||||
|
||||
//std::stringstream msg;
|
||||
//msg << "ACT/REF temp:" << temp
|
||||
// << " time:" << time
|
||||
// << " nearestTemp:" << nearestTemperature
|
||||
// << " nearestTime:" << nearestTime
|
||||
// << " ind:" << e.independent
|
||||
// << " dep:" << e.dependent;
|
||||
|
||||
//DebugManager::getInstance().printDebugMessage(name, msg.str());
|
||||
|
||||
return e.independent + e.dependent;
|
||||
}
|
||||
|
||||
void errorModel::setContext(DecodedAddress addr)
|
||||
|
||||
@@ -37,12 +37,14 @@
|
||||
#define ERRORMODEL_H
|
||||
#include "../controller/core/configuration/Configuration.h"
|
||||
#include "../common/xmlAddressdecoder.h"
|
||||
#include "../common/third_party/DRAMPower/src/libdrampower/LibDRAMPower.h"
|
||||
#include <map>
|
||||
#include <iostream>
|
||||
|
||||
class errorModel
|
||||
{
|
||||
public:
|
||||
errorModel(libDRAMPower *dp);
|
||||
errorModel();
|
||||
~errorModel();
|
||||
|
||||
@@ -52,8 +54,13 @@ class errorModel
|
||||
void refresh(unsigned int row);
|
||||
void activate(unsigned int row);
|
||||
void setTemperature(double t);
|
||||
double getTemperature(void);
|
||||
|
||||
private:
|
||||
void init(void);
|
||||
bool powerAnalysis;
|
||||
libDRAMPower *DRAMPower;
|
||||
bool dynTemperatureSim;
|
||||
// Configuration Parameters:
|
||||
unsigned int busWidth;
|
||||
unsigned int burstLenght;
|
||||
@@ -65,7 +72,6 @@ class errorModel
|
||||
std::string name;
|
||||
|
||||
// Online Parameters:
|
||||
double temperature;
|
||||
unsigned int numberOfBitErrorEvents;
|
||||
|
||||
// Private Methods:
|
||||
|
||||
@@ -43,6 +43,7 @@
|
||||
#include <systemc.h>
|
||||
#include <tlm_utils/peq_with_cb_and_phase.h>
|
||||
#include <tlm_utils/simple_target_socket.h>
|
||||
#include <vector>
|
||||
#include "../common/DebugManager.h"
|
||||
#include "../common/dramExtension.h"
|
||||
#include "../controller/core/TimingCalculation.h"
|
||||
@@ -69,7 +70,7 @@ struct Dram : sc_module
|
||||
|
||||
// Error Model related:
|
||||
ErrorStorageMode ErrorStoreMode = Configuration::getInstance().ErrorStoreMode;
|
||||
errorModel * ememory;
|
||||
std::vector<errorModel *> ememory;
|
||||
|
||||
// Data Storage:
|
||||
map< unsigned long int, unsigned char[BUSWIDTH/2] > memory;
|
||||
@@ -169,7 +170,15 @@ struct Dram : sc_module
|
||||
// For each bank in a channel a error Model is created:
|
||||
if(ErrorStoreMode == ErrorStorageMode::ErrorModel)
|
||||
{
|
||||
ememory = new errorModel[Configuration::getInstance().memSpec.NumberOfBanks];
|
||||
for (unsigned i = 0; i < Configuration::getInstance().memSpec.NumberOfBanks; i++) {
|
||||
errorModel *em;
|
||||
if (powerAnalysis == true) {
|
||||
em = new errorModel(DRAMPower);
|
||||
} else {
|
||||
em = new errorModel();
|
||||
}
|
||||
ememory.push_back(em);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -183,7 +192,9 @@ struct Dram : sc_module
|
||||
cout << name() << string("\tAverage Power: \t") + to_string(DRAMPower->getPower().average_power) << endl;
|
||||
}
|
||||
// Clean up:
|
||||
delete [] ememory;
|
||||
for (auto e : ememory) {
|
||||
delete e;
|
||||
}
|
||||
//std::cout << "Simulated Memory Size: " << memory.size() << endl; // TODO Aufrauemen
|
||||
}
|
||||
|
||||
@@ -217,7 +228,7 @@ struct Dram : sc_module
|
||||
|
||||
if (ErrorStoreMode == ErrorStorageMode::ErrorModel)
|
||||
{
|
||||
ememory[bank].activate(row);
|
||||
ememory[bank]->activate(row);
|
||||
}
|
||||
}
|
||||
else if (phase == BEGIN_WR)
|
||||
@@ -235,7 +246,7 @@ struct Dram : sc_module
|
||||
}
|
||||
else // == 2 Use Storage with Error Model
|
||||
{
|
||||
ememory[bank].store(payload);
|
||||
ememory[bank]->store(payload);
|
||||
}
|
||||
sendToController(payload, END_WR, delay + getExecutionTime(Command::Write, payload));
|
||||
}
|
||||
@@ -257,7 +268,7 @@ struct Dram : sc_module
|
||||
}
|
||||
else if(ErrorStoreMode == ErrorStorageMode::ErrorModel)// use ErrorStorageMode with errormodel
|
||||
{
|
||||
ememory[bank].load(payload);
|
||||
ememory[bank]->load(payload);
|
||||
}
|
||||
|
||||
sendToController(payload, END_RD, delay + getExecutionTime(Command::Read, payload));
|
||||
@@ -277,7 +288,7 @@ struct Dram : sc_module
|
||||
}
|
||||
else // == 2 Use Storage with Error Model
|
||||
{
|
||||
ememory[bank].store(payload);
|
||||
ememory[bank]->store(payload);
|
||||
}
|
||||
sendToController(payload, END_WRA, delay + getExecutionTime(Command::WriteA, payload));
|
||||
}
|
||||
@@ -299,7 +310,7 @@ struct Dram : sc_module
|
||||
}
|
||||
else if(ErrorStoreMode == ErrorStorageMode::ErrorModel)// use ErrorStorageMode with errormodel
|
||||
{
|
||||
ememory[bank].load(payload);
|
||||
ememory[bank]->load(payload);
|
||||
}
|
||||
|
||||
sendToController(payload, END_RDA, delay + getExecutionTime(Command::ReadA, payload));
|
||||
@@ -312,7 +323,7 @@ struct Dram : sc_module
|
||||
|
||||
if (ErrorStoreMode == ErrorStorageMode::ErrorModel)
|
||||
{
|
||||
ememory[bank].refresh(row);
|
||||
ememory[bank]->refresh(row);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -401,7 +412,7 @@ struct Dram : sc_module
|
||||
}
|
||||
else
|
||||
{
|
||||
ememory[bank].load(trans);
|
||||
ememory[bank]->load(trans);
|
||||
}
|
||||
}
|
||||
else if ( cmd == tlm::TLM_WRITE_COMMAND )
|
||||
@@ -412,7 +423,7 @@ struct Dram : sc_module
|
||||
}
|
||||
else
|
||||
{
|
||||
ememory[bank].store(trans);
|
||||
ememory[bank]->store(trans);
|
||||
}
|
||||
}
|
||||
return len;
|
||||
|
||||
@@ -48,6 +48,7 @@
|
||||
#include "../controller/core/configuration/ConfigurationLoader.h"
|
||||
#include "../common/Utils.h"
|
||||
#include "../simulation/StlDataPlayer.h"
|
||||
#include "../simulation/TemperatureController.h"
|
||||
|
||||
using namespace std;
|
||||
|
||||
@@ -62,13 +63,13 @@ Simulation::Simulation(sc_module_name __attribute__((unused)) name, string pathT
|
||||
ConfigurationLoader::loadMemConfig(Configuration::getInstance(), setup.memconfig);//pathToResources + string("configs/memconfigs/") + setup.memconfig);
|
||||
ConfigurationLoader::loadMemSpec(Configuration::getInstance(), setup.memspec);//pathToResources + string("configs/memspecs/") + setup.memspec);
|
||||
ConfigurationLoader::loadSimConfig(Configuration::getInstance(), setup.simconfig);
|
||||
ConfigurationLoader::loadTemperatureSimConfig(Configuration::getInstance(), setup.temperature_simconfig);
|
||||
|
||||
instantiateModules(traceName, pathToResources, devices);
|
||||
bindSockets();
|
||||
setupDebugManager(traceName);
|
||||
}
|
||||
|
||||
|
||||
void Simulation::setupDebugManager(const string& traceName)
|
||||
{
|
||||
auto& dbg = DebugManager::getInstance();
|
||||
@@ -78,7 +79,6 @@ void Simulation::setupDebugManager(const string& traceName)
|
||||
dbg.openDebugFile(traceName + ".txt");
|
||||
}
|
||||
|
||||
|
||||
void Simulation::setupTlmRecorders(const string &traceName, const string &pathToResources, const std::vector<Device> &devices)
|
||||
{
|
||||
// Create TLM Recorders, one per channel.
|
||||
@@ -105,6 +105,10 @@ void Simulation::setupTlmRecorders(const string &traceName, const string &pathTo
|
||||
|
||||
void Simulation::instantiateModules(const string &traceName, const string &pathToResources, const std::vector<Device> &devices)
|
||||
{
|
||||
// The first call to getInstance() creates the Temperature Controller.
|
||||
// The same instance will can be accessed by all other modules.
|
||||
TemperatureController::getInstance();
|
||||
|
||||
for (size_t i = 0; i < Configuration::getInstance().NumberOfTracePlayers; i++) {
|
||||
std::string playerStr = "player" + std::to_string(i);
|
||||
TracePlayer<> *player;
|
||||
|
||||
@@ -53,13 +53,14 @@
|
||||
|
||||
struct DramSetup
|
||||
{
|
||||
DramSetup():memspec(NULL),memconfig(NULL),simconfig(NULL),addressmapping(NULL){}
|
||||
DramSetup(tinyxml2::XMLElement* memspec, tinyxml2::XMLElement* memconfig, tinyxml2::XMLElement* simconfig, tinyxml2::XMLElement* addressmapping)
|
||||
: memspec(memspec), memconfig(memconfig), simconfig(simconfig), addressmapping(addressmapping) {}
|
||||
DramSetup():memspec(NULL),memconfig(NULL),simconfig(NULL),addressmapping(NULL), temperature_simconfig(NULL) {}
|
||||
DramSetup(tinyxml2::XMLElement* memspec, tinyxml2::XMLElement* memconfig, tinyxml2::XMLElement* simconfig, tinyxml2::XMLElement* addressmapping, tinyxml2::XMLElement *tsc)
|
||||
: memspec(memspec), memconfig(memconfig), simconfig(simconfig), addressmapping(addressmapping), temperature_simconfig(tsc) {}
|
||||
tinyxml2::XMLElement* memspec;
|
||||
tinyxml2::XMLElement* memconfig;
|
||||
tinyxml2::XMLElement* simconfig;
|
||||
tinyxml2::XMLElement* addressmapping;
|
||||
tinyxml2::XMLElement* temperature_simconfig;
|
||||
};
|
||||
|
||||
struct Device
|
||||
|
||||
@@ -100,6 +100,8 @@ void SimulationManager::parseSimulationBatch(XMLElement* simulation)
|
||||
|
||||
XMLElement* simconfig = simulation->FirstChildElement("simconfig");
|
||||
|
||||
XMLElement *temperature_simconfig = simulation->FirstChildElement("temperature_simconfig");
|
||||
|
||||
XMLElement* memspecs = simulation->FirstChildElement("memspecs");
|
||||
if(memspecs == NULL) memspecs = simulation;
|
||||
|
||||
@@ -120,7 +122,7 @@ void SimulationManager::parseSimulationBatch(XMLElement* simulation)
|
||||
for (XMLElement* memconfig = memconfigs->FirstChildElement("memconfig");
|
||||
memconfig != NULL; memconfig = memconfig->NextSiblingElement("memconfig"))
|
||||
{
|
||||
batch.dramSetups.push_back(DramSetup(memspec, memconfig, simconfig, addressmapping));
|
||||
batch.dramSetups.push_back(DramSetup(memspec, memconfig, simconfig, addressmapping, temperature_simconfig));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
174
DRAMSys/simulator/src/simulation/TemperatureController.cpp
Normal file
174
DRAMSys/simulator/src/simulation/TemperatureController.cpp
Normal file
@@ -0,0 +1,174 @@
|
||||
/*
|
||||
* Copyright (c) 2015, University of Kaiserslautern
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are
|
||||
* met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright notice,
|
||||
* this list of conditions and the following disclaimer.
|
||||
*
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
*
|
||||
* 3. Neither the name of the copyright holder nor the names of its
|
||||
* contributors may be used to endorse or promote products derived from
|
||||
* this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||||
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER
|
||||
* OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* Authors:
|
||||
* Eder F. Zulian
|
||||
* Matthias Jung
|
||||
*/
|
||||
|
||||
#include <cmath>
|
||||
|
||||
#include "TemperatureController.h"
|
||||
#include "../controller/core/configuration/Configuration.h"
|
||||
|
||||
double TemperatureController::temperatureConvert(double tKelvin)
|
||||
{
|
||||
if (temperatureScale == "Celsius") {
|
||||
return tKelvin - 273.15;
|
||||
} else if (temperatureScale == "Fahrenheit") {
|
||||
return (tKelvin - 273.15) * 1.8 + 32;
|
||||
}
|
||||
|
||||
return tKelvin;
|
||||
}
|
||||
|
||||
double TemperatureController::getTemperature(int deviceId, float currentPower)
|
||||
{
|
||||
printDebugMessage("Temperature requested by device " + std::to_string(deviceId) + " current power is " + std::to_string(currentPower));
|
||||
|
||||
if (dynamicTempSimEnabled == true) {
|
||||
currentPowerValues.at(deviceId) = currentPower;
|
||||
checkPowerThreshold(deviceId);
|
||||
|
||||
// FIXME using the static temperature value until the vector of
|
||||
// temperatures is filled
|
||||
if (temperatureValues.empty())
|
||||
return temperatureConvert(staticTemperature + 273.15);
|
||||
|
||||
return temperatureConvert(temperatureValues.at(deviceId));
|
||||
} else {
|
||||
printDebugMessage("Temperature is " + std::to_string(staticTemperature));
|
||||
return staticTemperature;
|
||||
}
|
||||
}
|
||||
|
||||
void TemperatureController::updateTemperatures()
|
||||
{
|
||||
#ifdef THERMALSIM
|
||||
thermalSimulation->sendPowerValues(¤tPowerValues);
|
||||
thermalSimulation->simulate();
|
||||
thermalSimulation->getTemperature(temperaturesBuffer, TDICE_OUTPUT_INSTANT_SLOT, TDICE_OUTPUT_TYPE_TFLPEL, TDICE_OUTPUT_QUANTITY_AVERAGE);
|
||||
|
||||
std::string mapfile;
|
||||
sc_time ts = sc_time_stamp();
|
||||
if (genTempMap == true) {
|
||||
mapfile = temperatureMapFile + "_" + std::to_string(ts.to_default_time_units()) + ".txt";
|
||||
thermalSimulation->getTemperatureMap(mapfile);
|
||||
}
|
||||
if (genPowerMap == true) {
|
||||
mapfile = powerMapFile + "_" + std::to_string(ts.to_default_time_units()) + ".txt";
|
||||
thermalSimulation->getPowerMap(mapfile);
|
||||
}
|
||||
#endif
|
||||
// Save values just obtained for posterior use
|
||||
temperatureValues = temperaturesBuffer;
|
||||
// Clear the buffer, otherwise it will grow every request
|
||||
temperaturesBuffer.clear();
|
||||
}
|
||||
|
||||
void TemperatureController::checkPowerThreshold(int deviceId)
|
||||
{
|
||||
if (std::abs(lastPowerValues.at(deviceId) - currentPowerValues.at(deviceId)) > powerThresholds.at(deviceId)) {
|
||||
decreaseSimPeriod = true;
|
||||
}
|
||||
lastPowerValues.at(deviceId) = currentPowerValues.at(deviceId);
|
||||
}
|
||||
|
||||
double TemperatureController::adjustThermalSimPeriod()
|
||||
{
|
||||
// Temperature Simulation Period Dynamic Adjustment
|
||||
//
|
||||
// 1. Adjustment is requierd when:
|
||||
//
|
||||
// 1.1. The power dissipation of one or more devices change considerably
|
||||
// (exceeds the configured threshold for that device in any direction,
|
||||
// i.e. increases or decreases substantially) during the current
|
||||
// simulaiton period.
|
||||
//
|
||||
// 1.1.1. The simulation period will be reduced by a factor of 'n' so the
|
||||
// simulation occurs 'n' times more often.
|
||||
//
|
||||
// 1.1.2. The step 1.1.1 will be repeated until the point that there are
|
||||
// no sustantial changes in power dissipation between two consecutive
|
||||
// executions of the thermal simulation, i.e. all changes for all devices
|
||||
// are less than the configured threshold.
|
||||
//
|
||||
// 1.2. The current simulation period differs from the target period
|
||||
// defined in the configuration by the user.
|
||||
//
|
||||
// 1.2.1 Provided a scenario in which power dissipation changes do not
|
||||
// exceed the thresholds, the situation period will be kept for a number
|
||||
// of simulation cycles 'nc' and after 'nc' the period will be increased
|
||||
// again in steps of 'n/2' until it achieves the desired value given by
|
||||
// configuration or the described in 1.1 occurs.
|
||||
|
||||
if (decreaseSimPeriod == true) {
|
||||
period = period / periodAdjustFactor;
|
||||
cyclesSinceLastPeriodAdjust = 0;
|
||||
decreaseSimPeriod = false;
|
||||
printDebugMessage("Thermal Simulation period reduced to " + std::to_string(period) + ". Target is " + std::to_string(targetPeriod));
|
||||
} else {
|
||||
if (period != targetPeriod) {
|
||||
cyclesSinceLastPeriodAdjust++;
|
||||
if (cyclesSinceLastPeriodAdjust >= nPowStableCyclesToIncreasePeriod) {
|
||||
cyclesSinceLastPeriodAdjust = 0;
|
||||
period = period * (periodAdjustFactor / 2);
|
||||
if (period > targetPeriod)
|
||||
period = targetPeriod;
|
||||
printDebugMessage("Thermal Simulation period increased to " + std::to_string(period) + ". Target is " + std::to_string(targetPeriod));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return period;
|
||||
}
|
||||
|
||||
void TemperatureController::temperatureThread()
|
||||
{
|
||||
while (true) {
|
||||
updateTemperatures();
|
||||
double p = adjustThermalSimPeriod();
|
||||
|
||||
int i = 0;
|
||||
for (auto t : temperatureValues) {
|
||||
printDebugMessage("Temperature[" + std::to_string(i++) + "] is " + std::to_string(t));
|
||||
}
|
||||
printDebugMessage("Thermal simulation period is " + std::to_string(p));
|
||||
|
||||
wait(sc_time(p, t_unit));
|
||||
}
|
||||
}
|
||||
|
||||
void TemperatureController::printDebugMessage(std::string message)
|
||||
{
|
||||
DebugManager::getInstance().printDebugMessage(name(), message);
|
||||
}
|
||||
|
||||
150
DRAMSys/simulator/src/simulation/TemperatureController.h
Normal file
150
DRAMSys/simulator/src/simulation/TemperatureController.h
Normal file
@@ -0,0 +1,150 @@
|
||||
/*
|
||||
* Copyright (c) 2015, University of Kaiserslautern
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are
|
||||
* met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright notice,
|
||||
* this list of conditions and the following disclaimer.
|
||||
*
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
*
|
||||
* 3. Neither the name of the copyright holder nor the names of its
|
||||
* contributors may be used to endorse or promote products derived from
|
||||
* this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||||
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER
|
||||
* OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* Authors:
|
||||
* Eder F. Zulian
|
||||
* Matthias Jung
|
||||
*/
|
||||
|
||||
#ifndef TEMPERATURE_CONTROLLER_H_
|
||||
#define TEMPERATURE_CONTROLLER_H_
|
||||
|
||||
#include <systemc.h>
|
||||
#include <iostream>
|
||||
#include <string>
|
||||
#include <fstream>
|
||||
|
||||
#include "../common/DebugManager.h"
|
||||
#include "../common/Utils.h"
|
||||
#include "../controller/core/configuration/Configuration.h"
|
||||
|
||||
#ifdef THERMALSIM
|
||||
#include "IceWrapper.h"
|
||||
#endif
|
||||
|
||||
SC_MODULE(TemperatureController) {
|
||||
public:
|
||||
static inline TemperatureController &getInstance()
|
||||
{
|
||||
static TemperatureController temperaturectrl("TemperatureController");
|
||||
return temperaturectrl;
|
||||
}
|
||||
|
||||
SC_CTOR(TemperatureController)
|
||||
{
|
||||
temperatureScale = Configuration::getInstance().temperatureSim.TemperatureScale;
|
||||
|
||||
dynamicTempSimEnabled = Configuration::getInstance().DynamicTemperatureSimulation;
|
||||
|
||||
staticTemperature = Configuration::getInstance().temperatureSim.StaticTemperatureDefaultValue;
|
||||
|
||||
if (dynamicTempSimEnabled == true) {
|
||||
#ifdef THERMALSIM
|
||||
// Connect to the server
|
||||
std::string ip = Configuration::getInstance().temperatureSim.IceServerIp;
|
||||
unsigned int port = Configuration::getInstance().temperatureSim.IceServerPort;
|
||||
thermalSimulation = new IceWrapper(ip, port);
|
||||
printDebugMessage("Dynamic temperature simulation. Server @ " + ip + ":" + std::to_string(port));
|
||||
#else
|
||||
SC_REPORT_FATAL(name(), "DRAMSys was build without support to dynamic temperature simulation. Check the README file for further details.");
|
||||
#endif
|
||||
// Initial power dissipation values (got from config)
|
||||
currentPowerValues = Configuration::getInstance().temperatureSim.powerInitialValues;
|
||||
lastPowerValues = currentPowerValues;
|
||||
|
||||
// Substantial changes in power will trigger adjustments in the simulaiton period. Get the thresholds from config.
|
||||
powerThresholds = Configuration::getInstance().temperatureSim.powerThresholds;
|
||||
decreaseSimPeriod = false;
|
||||
periodAdjustFactor = Configuration::getInstance().temperatureSim.SimPeriodAdjustFactor;
|
||||
nPowStableCyclesToIncreasePeriod = Configuration::getInstance().temperatureSim.NPowStableCyclesToIncreasePeriod;
|
||||
cyclesSinceLastPeriodAdjust = 0;
|
||||
|
||||
// Get the target period for the thermal simulation from config.
|
||||
targetPeriod = Configuration::getInstance().temperatureSim.DynTemperatureSimPeriod;
|
||||
period = targetPeriod;
|
||||
t_unit = Configuration::getInstance().temperatureSim.DynTemperatureSimUnit;
|
||||
|
||||
genTempMap = Configuration::getInstance().temperatureSim.GenerateTemperatureMap;
|
||||
temperatureMapFile = "temperature_map";
|
||||
std::system("rm -f temperature_map*");
|
||||
|
||||
genPowerMap = Configuration::getInstance().temperatureSim.GeneratePowerMap;
|
||||
powerMapFile = "power_map";
|
||||
std::system("rm -f power_map*");
|
||||
|
||||
SC_THREAD(temperatureThread);
|
||||
} else {
|
||||
printDebugMessage("Static temperature simulation. Temperature set to " + std::to_string(staticTemperature));
|
||||
}
|
||||
}
|
||||
|
||||
double getTemperature(int deviceId, float currentPower);
|
||||
|
||||
private:
|
||||
std::string temperatureScale;
|
||||
double temperatureConvert(double tKelvin);
|
||||
|
||||
double staticTemperature;
|
||||
|
||||
bool dynamicTempSimEnabled;
|
||||
|
||||
#ifdef THERMALSIM
|
||||
IceWrapper *thermalSimulation;
|
||||
#endif
|
||||
std::vector<float> temperaturesBuffer;
|
||||
std::vector<float> temperatureValues;
|
||||
|
||||
std::vector<float> currentPowerValues;
|
||||
std::vector<float> lastPowerValues;
|
||||
std::vector<float> powerThresholds;
|
||||
|
||||
double targetPeriod;
|
||||
double period;
|
||||
enum sc_time_unit t_unit;
|
||||
void temperatureThread();
|
||||
void updateTemperatures();
|
||||
double adjustThermalSimPeriod();
|
||||
void checkPowerThreshold(int deviceId);
|
||||
bool decreaseSimPeriod;
|
||||
unsigned int periodAdjustFactor;
|
||||
unsigned int cyclesSinceLastPeriodAdjust;
|
||||
unsigned int nPowStableCyclesToIncreasePeriod;
|
||||
|
||||
bool genTempMap;
|
||||
std::string temperatureMapFile;
|
||||
bool genPowerMap;
|
||||
std::string powerMapFile;
|
||||
|
||||
void printDebugMessage(std::string message);
|
||||
};
|
||||
|
||||
#endif /* TEMPERATURE_CONTROLLER_H_ */
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
<memconfig>
|
||||
<BankwiseLogic value="0"/>
|
||||
<OpenPagePolicy value="1" />
|
||||
<MaxNrOfTransactions value="50" />
|
||||
<MaxNrOfTransactions value="8" />
|
||||
<Scheduler value="FR_FCFS" />
|
||||
<Capsize value="5" />
|
||||
<PowerDownMode value="TimeoutPDN" />
|
||||
@@ -9,7 +9,7 @@
|
||||
<!-- Error Model: -->
|
||||
<ErrorChipSeed value="42" />
|
||||
<ErrorCSVFile value="../../DRAMSys/simulator/src/error/error.csv" />
|
||||
<ErrorStoreMode value="ErrorModel" /> <!--3 Modes: NoStorage, Store (store data without errormodel), ErrorModel (store data with errormodel)-->
|
||||
<ErrorStoreMode value="NoStorage" /> <!--3 Modes: NoStorage, Store (store data without errormodel), ErrorModel (store data with errormodel)-->
|
||||
<!--
|
||||
<Buswidth value="128" />
|
||||
<ReadWriteGrouping value="false" />
|
||||
|
||||
@@ -1,12 +1,22 @@
|
||||
<simulation>
|
||||
<!-- General Simulator Configuration (used for all simulation setups) -->
|
||||
<simconfig>
|
||||
<Debug value="0" />
|
||||
<DatabaseRecording value="0" />
|
||||
<PowerAnalysis value="1" />
|
||||
<NumberOfTracePlayers value="1"/>
|
||||
<NumberOfMemChannels value="4"/>
|
||||
<ControllerCoreDisableRefresh value="0"/>
|
||||
<DynamicTemperatureSimulation value="0"/>
|
||||
</simconfig>
|
||||
|
||||
<!-- Temperature Simulator Configuration (used for all simulation setups) -->
|
||||
<temperature_simconfig>
|
||||
<StaticTemperatureDefaultValue value="89" />
|
||||
<DynTemperatureSimPeriod value="100" />
|
||||
<DynTemperatureSimUnit value="ms" />
|
||||
</temperature_simconfig>
|
||||
|
||||
<memspecs>
|
||||
<memspec src="../../DRAMSys/tests/error/WideIO.xml"></memspec>
|
||||
</memspecs>
|
||||
|
||||
227
README.md
227
README.md
@@ -21,8 +21,9 @@ $ git clone --recursive https://<user>@git.rhrk.uni-kl.de/EIT-Wehn/dram.vp.syste
|
||||
```
|
||||
|
||||
The *--recursive* flag tells git to initialize all submodules within the
|
||||
repository. **DRAMPower** [2] and **tinyxml** are examples third party
|
||||
repositories that were embedded within the source tree as submodules.
|
||||
repository. **DRAMPower** [2], **tinyxml** and **icewrapper** are examples
|
||||
third party repositories that were embedded within the source tree as
|
||||
submodules.
|
||||
|
||||
It is possible to work with a **fork** of the official codebase. In that case,
|
||||
after pushing changes into your fork you should create a **pull request** in
|
||||
@@ -112,6 +113,152 @@ $ cd analyzer
|
||||
$ ./traceAnalyzer
|
||||
```
|
||||
|
||||
### DRAMSys Thermal Simulation
|
||||
|
||||
Before starting make sure you have a **clean repository** without any previous
|
||||
automatic generated Makefiles. One way to ensure this is by running the
|
||||
command below inside your DRAMSys repository, but keep in mind that
|
||||
**untracked files and directories will be removed** from the repository.
|
||||
|
||||
``` bash
|
||||
$ git clean -fdx
|
||||
```
|
||||
|
||||
This feature can be enabled via an environment variable.
|
||||
|
||||
``` bash
|
||||
$ export THERMALSIM=true
|
||||
$ qtcreator &
|
||||
```
|
||||
|
||||
or
|
||||
|
||||
``` bash
|
||||
$ mkdir build
|
||||
$ cd build
|
||||
$ export THERMALSIM=true
|
||||
$ qmake ../DRAMSys/dram.vp.system.pro
|
||||
$ make
|
||||
```
|
||||
|
||||
The thermal simulation is performed by a **3D-ICE** [8] server accessed
|
||||
through the network. Therefore users interested in thermal simulation during
|
||||
their DRAMSys simulations need to make sure they have a 3D-ICE server up and
|
||||
running before starting.
|
||||
|
||||
More information about how to obtain 3D-ICE and how to intall it can be found
|
||||
in the official website http://esl.epfl.ch/3D-ICE.
|
||||
|
||||
Provided the user fulfilled this installation requisite, before starting
|
||||
DRAMSys it is necessary to run the 3D-ICE server passing to it two arguments:
|
||||
a suitable configuration file and an Internet socket port number. And then
|
||||
wait until the server is ready to receive requests.
|
||||
|
||||
``` bash
|
||||
$ 3D-ICE-Server <stack file> <port>
|
||||
Preparing stk data ... done !
|
||||
Preparing thermal data ... done !
|
||||
Creating socket ... done !
|
||||
Waiting for client ... done !
|
||||
```
|
||||
|
||||
The IP address and the port number related to the server shall be informed in
|
||||
DRAMSys' configuration to subsequent use by DRAMSys to access the thermal
|
||||
simulation server.
|
||||
|
||||
#### Usage Example
|
||||
|
||||
The DRAMSys' main configuration file is presented below.
|
||||
|
||||
``` xml
|
||||
<simulation>
|
||||
<!-- General Simulator Configuration (used for all simulation setups) -->
|
||||
<simconfig>
|
||||
<Debug value="1" />
|
||||
<DatabaseRecording value="1" />
|
||||
<PowerAnalysis value="1" />
|
||||
<NumberOfTracePlayers value="1"/>
|
||||
<NumberOfMemChannels value="4"/>
|
||||
<ControllerCoreDisableRefresh value="0"/>
|
||||
<DynamicTemperatureSimulation value="1"/>
|
||||
</simconfig>
|
||||
|
||||
<!-- Temperature Simulator Configuration (used for all simulation setups) -->
|
||||
<temperature_simconfig>
|
||||
<TemperatureScale value="Celsius" />
|
||||
<StaticTemperatureDefaultValue value="23" />
|
||||
<DynTemperatureSimPeriod value="100" />
|
||||
<DynTemperatureSimUnit value="us" />
|
||||
<PowerInfoFile value="../../DRAMSys/simulator/resources/configs/temperature_sim/powerInfo.xml"/>
|
||||
<IceServerIp value="127.0.0.1" />
|
||||
<IceServerPort value="11880" />
|
||||
<SimPeriodAdjustFactor value="10" />
|
||||
<NPowStableCyclesToIncreasePeriod value="5" />
|
||||
<GenerateTemperatureMap value="1" />
|
||||
<GeneratePowerMap value="1" />
|
||||
</temperature_simconfig>
|
||||
|
||||
<memspecs>
|
||||
<memspec src="../../DRAMSys/simulator/resources/configs/memspecs/WideIO.xml"></memspec>
|
||||
</memspecs>
|
||||
|
||||
<addressmappings>
|
||||
<addressmapping src="../../DRAMSys/simulator/resources/configs/amconfigs/am_wideio.xml"></addressmapping>
|
||||
</addressmappings>
|
||||
|
||||
<memconfigs>
|
||||
<memconfig src="../../DRAMSys/simulator/resources/configs/memconfigs/fr_fcfs.xml"/>
|
||||
</memconfigs>
|
||||
|
||||
<tracesetups>
|
||||
<tracesetup id="fifo">
|
||||
<device clkMhz="1000">../../../tests/error/test_error.stl</device>
|
||||
</tracesetup>
|
||||
</tracesetups>
|
||||
|
||||
</simulation>
|
||||
```
|
||||
|
||||
Enable the error model in fr_fcfs.xml.
|
||||
|
||||
``` xml
|
||||
<memconfig>
|
||||
<BankwiseLogic value="0"/>
|
||||
<OpenPagePolicy value="1" />
|
||||
<MaxNrOfTransactions value="8" />
|
||||
<Scheduler value="FR_FCFS" />
|
||||
<Capsize value="5" />
|
||||
<PowerDownMode value="TimeoutPDN" />
|
||||
<PowerDownTimeout value="100" />
|
||||
<!-- Error Model: -->
|
||||
<ErrorChipSeed value="42" />
|
||||
<ErrorCSVFile value="../../DRAMSys/simulator/src/error/error.csv" />
|
||||
<ErrorStoreMode value="ErrorModel" /> <!--3 Modes: NoStorage, Store (store data without errormodel), ErrorModel (store data with errormodel)-->
|
||||
</memconfig>
|
||||
```
|
||||
|
||||
Generate the input trace file for DRAMSys.
|
||||
|
||||
``` bash
|
||||
$ cd DRAMSys/tests/error/
|
||||
$ ./generateErrorTest.pl > test_error.stl
|
||||
```
|
||||
|
||||
Start the 3D-ICE server providing the stack file and the port number.
|
||||
|
||||
``` bash
|
||||
$ cd DRAMSys/simulator/resources/configs/temperature_sim
|
||||
$ 3D-ICE-Server stack.stk 11880
|
||||
```
|
||||
|
||||
In another terminal or terminal tab start DRAMSys. Here the program's output
|
||||
is redirected to a file.
|
||||
|
||||
``` bash
|
||||
$ cd build/simulator/
|
||||
$ ./dramSys > output
|
||||
```
|
||||
|
||||
### DRAMSys Configuration
|
||||
|
||||
The **dramSys** executable supports one argument which is a XML file that
|
||||
@@ -123,7 +270,7 @@ The XML code below shows a typic configuration:
|
||||
``` xml
|
||||
<simulation>
|
||||
|
||||
<!-- Simulator Configuration -->
|
||||
<!-- General Simulator Configuration (used for all simulation setups) -->
|
||||
<simconfig>
|
||||
<Debug value="1"/>
|
||||
<DatabaseRecording value="1"/>
|
||||
@@ -131,8 +278,24 @@ The XML code below shows a typic configuration:
|
||||
<NumberOfTracePlayers value="5"/>
|
||||
<NumberOfMemChannels value="1"/>
|
||||
<ControllerCoreDisableRefresh value="0"/>
|
||||
<DynamicTemperatureSimulation value="0"/>
|
||||
</simconfig>
|
||||
|
||||
<!-- Temperature Simulator Configuration (used for all simulation setups) -->
|
||||
<temperature_simconfig>
|
||||
<TemperatureScale value="Celsius" />
|
||||
<StaticTemperatureDefaultValue value="89" />
|
||||
<DynTemperatureSimPeriod value="100" />
|
||||
<DynTemperatureSimUnit value="ms" />
|
||||
<PowerInfoFile value="../../DRAMSys/simulator/resources/configs/temperature_sim/power_thresholds.xml"/>
|
||||
<IceServerIp value="127.0.0.1" />
|
||||
<IceServerPort value="11880" />
|
||||
<SimPeriodAdjustFactor value="10" />
|
||||
<NPowStableCyclesToIncreasePeriod value="5" />
|
||||
<GenerateTemperatureMap value="1" />
|
||||
<GeneratePowerMap value="1" />
|
||||
</temperature_simconfig>
|
||||
|
||||
<!-- Memory Specifications -->
|
||||
<memspecs>
|
||||
<memspec src="../../DRAMSys/simulator/resources/configs/memspecs/WideIO.xml"></memspec>
|
||||
@@ -213,7 +376,7 @@ simulation.
|
||||
|
||||
Below are listed the configuration sections and configuration fields.
|
||||
|
||||
- **Simulator configuration**
|
||||
- **Simulator Configuration**
|
||||
- *Debug* (boolean)
|
||||
- "1": enables debug output on console
|
||||
- "0": disables debug output
|
||||
@@ -230,8 +393,44 @@ Below are listed the configuration sections and configuration fields.
|
||||
- *ControllerCoreDisableRefresh* (boolean)
|
||||
- "1": disables refreshes
|
||||
- "0": normal operation (refreshes enabled)
|
||||
- *DynamicTemperatureSimulation* (boolean)
|
||||
- "1": enables the dynamic temperature simulation feature
|
||||
- "0": static temperature during simulation
|
||||
|
||||
- **Memory specification**
|
||||
- **Temperature Simulator Configuration**
|
||||
- *TemperatureScale* (string)
|
||||
- "Celsius"
|
||||
- "Fahrenheit"
|
||||
- "Kelvin"
|
||||
- *StaticTemperatureDefaultValue* (int)
|
||||
- Temperature value for simulations with static temperature
|
||||
- *DynTemperatureSimPeriod* (double)
|
||||
- Period of the dynamic temperature simulation
|
||||
- *DynTemperatureSimUnit* (string)
|
||||
- "s": seconds
|
||||
- "ms": millisecond
|
||||
- "us": microseconds
|
||||
- "ns": nanoseconds
|
||||
- "ps": picoseconds
|
||||
- "fs": femtoseconds
|
||||
- *PowerInfoFile* (string)
|
||||
- File containing power related information: devices identifiers, initial power values and power thresholds.
|
||||
- *IceServerIp* (string)
|
||||
- 3D-Ice server IP address
|
||||
- *IceServerPort* (unsigned int)
|
||||
- 3D-Ice server port
|
||||
- *SimPeriodAdjustFactor* (unsigned int)
|
||||
- When substantial changes in power occur (i.e., changes that exceed the thresholds), then the simulation period will be divided by this number causing the thermal simulation to be executed more often.
|
||||
- *NPowStableCyclesToIncreasePeriod* (unsigned int)
|
||||
- Wait this number of thermal simulation cycles with power stability (i.e., changes that do not exceed the thresholds) to start increasing the simulation period back to its configured value.
|
||||
- *GenerateTemperatureMap* (boolean)
|
||||
- "1": generate temperature map files during dynamic temperature simulation
|
||||
- "0": do not generate temperature map files during dynamic temperature simulation
|
||||
- *GeneratePowerMap* (boolean)
|
||||
- "1": generate power map files during dynamic temperature simulation
|
||||
- "0": do not generate power map files during dynamic temperature simulation
|
||||
|
||||
- **Memory Specification**
|
||||
|
||||
A file with memory specifications. This information comes from datasheet and
|
||||
usually does not change.
|
||||
@@ -324,7 +523,7 @@ Below are listed the configuration sections and configuration fields.
|
||||
- "Store": store data without error model
|
||||
- "ErrorModel": store data with error model [6]
|
||||
|
||||
- **Trace setups**
|
||||
- **Trace Setups**
|
||||
- *id* (string)
|
||||
- Trace setup id. Two kinds of output files are generated by DRAMSys:
|
||||
SQLite databases containing transactions related to each memory channel
|
||||
@@ -384,4 +583,20 @@ C. Weis, M. Jung, P. Ehses, C. Santos, P. Vivet, S. Goossens, M. Koedam, N. Wehn
|
||||
|
||||
[7] http://www.uni-kl.de/3d-dram/publications/
|
||||
|
||||
[8] A Sridhar, A Vincenzi, D Atienza, T Brunschwiler, 3D-ICE: a compact
|
||||
thermal model for early-stage design of liquid-cooled ICs, IEEE Transactions
|
||||
on Computers (TC 2013, accepted for publication).
|
||||
|
||||
[9] A Sridhar, A Vincenzi, M Ruggiero, T Brunschwiler, D Atienza, 3D-ICE: Fast
|
||||
compact transient thermal modeling for 3D-ICs with inter-tier liquid cooling,
|
||||
Proceedings of the 2010 International Conference on Computer-Aided Design
|
||||
(ICCAD 2010), San Jose, CA, USA, November 7-11 2010.
|
||||
|
||||
[10] A Sridhar, A Vincenzi, M Ruggiero, T Brunschwiler, D Atienza, Compact
|
||||
transient thermal model for 3D ICs with liquid cooling via enhanced heat
|
||||
transfer cavity geometries, Proceedings of the 16th International Workshop on
|
||||
Thermal Investigations of ICs and Systems (THERMINIC'10), Barcelona, Spain,
|
||||
6-8 October, 2010.
|
||||
|
||||
[11] http://esl.epfl.ch/3D-ICE
|
||||
|
||||
|
||||
Reference in New Issue
Block a user