merge
This commit is contained in:
24
README.md
24
README.md
@@ -1,4 +1,24 @@
|
||||
dram
|
||||
====
|
||||
de.uni-kl.ems.dram.vp.system
|
||||
============================
|
||||
|
||||
Generic DRAM controller
|
||||
|
||||
#Setup with Eclipse
|
||||
|
||||
1. Start Eclipse ($eclipse)
|
||||
2. -> Import
|
||||
-> Git
|
||||
-> Projects from Git
|
||||
-> Existing Local Repository
|
||||
-> Add Path to $dram.vp.system
|
||||
-> Import Existing Projects
|
||||
-> Finish
|
||||
|
||||
3. Configure Eclipse:
|
||||
-> Run Configurations
|
||||
-> Environment
|
||||
-> Variable: LD_LIBRARY_PATH = /opt/systemc/lib-linux64/:/opt/gcc/lib64
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -1 +0,0 @@
|
||||
Jonny Schlemminger,jonny,ubuntu,08.04.2014 14:51,file:///home/jonny/.config/libreoffice/4;
|
||||
195
dram/.cproject
195
dram/.cproject
@@ -1,168 +1,27 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<?fileVersion 4.0.0?><cproject storage_type_id="org.eclipse.cdt.core.XmlProjectDescriptionStorage">
|
||||
<storageModule moduleId="org.eclipse.cdt.core.settings">
|
||||
<cconfiguration id="cdt.managedbuild.config.gnu.exe.debug.513647443">
|
||||
<storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="cdt.managedbuild.config.gnu.exe.debug.513647443" moduleId="org.eclipse.cdt.core.settings" name="build-simulation">
|
||||
<externalSettings/>
|
||||
<extensions>
|
||||
<extension id="org.eclipse.cdt.core.GCCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
|
||||
<extension id="org.eclipse.cdt.core.GASErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
|
||||
<extension id="org.eclipse.cdt.core.GLDErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
|
||||
<extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/>
|
||||
</extensions>
|
||||
</storageModule>
|
||||
<storageModule moduleId="cdtBuildSystem" version="4.0.0">
|
||||
<configuration artifactName="${ProjName}" buildArtefactType="org.eclipse.cdt.build.core.buildArtefactType.exe" buildProperties="org.eclipse.cdt.build.core.buildType=org.eclipse.cdt.build.core.buildType.debug,org.eclipse.cdt.build.core.buildArtefactType=org.eclipse.cdt.build.core.buildArtefactType.exe" cleanCommand="rm -rf" description="" id="cdt.managedbuild.config.gnu.exe.debug.513647443" name="build-simulation" parent="cdt.managedbuild.config.gnu.exe.debug">
|
||||
<folderInfo id="cdt.managedbuild.config.gnu.exe.debug.513647443." name="/" resourcePath="">
|
||||
<toolChain id="cdt.managedbuild.toolchain.gnu.exe.debug.784929216" name="Linux GCC" nonInternalBuilderId="cdt.managedbuild.target.gnu.builder.exe.debug" superClass="cdt.managedbuild.toolchain.gnu.exe.debug">
|
||||
<targetPlatform id="cdt.managedbuild.target.gnu.platform.exe.debug.2061818651" name="Debug Platform" superClass="cdt.managedbuild.target.gnu.platform.exe.debug"/>
|
||||
<builder autoBuildTarget="all" buildPath="${workspace_loc:/dram}/build-simulation" cleanBuildTarget="clean" enableAutoBuild="false" id="org.eclipse.cdt.build.core.internal.builder.1698165306" incrementalBuildTarget="all" keepEnvironmentInBuildfile="false" managedBuildOn="true" name="CDT Internal Builder" parallelBuildOn="true" parallelizationNumber="optimal" superClass="org.eclipse.cdt.build.core.internal.builder"/>
|
||||
<tool id="cdt.managedbuild.tool.gnu.archiver.base.1509734096" name="GCC Archiver" superClass="cdt.managedbuild.tool.gnu.archiver.base"/>
|
||||
<tool id="cdt.managedbuild.tool.gnu.cpp.compiler.exe.debug.789860529" name="GCC C++ Compiler" superClass="cdt.managedbuild.tool.gnu.cpp.compiler.exe.debug">
|
||||
<option id="gnu.cpp.compiler.exe.debug.option.optimization.level.2041174282" name="Optimization Level" superClass="gnu.cpp.compiler.exe.debug.option.optimization.level" value="gnu.cpp.compiler.optimization.level.most" valueType="enumerated"/>
|
||||
<option id="gnu.cpp.compiler.exe.debug.option.debugging.level.2092267417" name="Debug Level" superClass="gnu.cpp.compiler.exe.debug.option.debugging.level" value="gnu.cpp.compiler.debugging.level.max" valueType="enumerated"/>
|
||||
<option id="gnu.cpp.compiler.option.include.paths.1823643375" name="Include paths (-I)" superClass="gnu.cpp.compiler.option.include.paths" valueType="includePath">
|
||||
<listOptionValue builtIn="false" value="/opt/systemc-2.3.0/include"/>
|
||||
<listOptionValue builtIn="false" value="/opt/gmock-1.7.0/include"/>
|
||||
</option>
|
||||
<option id="gnu.cpp.compiler.option.preprocessor.def.2096973106" name="Defined symbols (-D)" superClass="gnu.cpp.compiler.option.preprocessor.def" valueType="definedSymbols">
|
||||
<listOptionValue builtIn="false" value="SC_INCLUDE_DYNAMIC_PROCESSES"/>
|
||||
<listOptionValue builtIn="false" value="TIXML_USE_STL"/>
|
||||
</option>
|
||||
<option id="gnu.cpp.compiler.option.other.other.1339801369" name="Other flags" superClass="gnu.cpp.compiler.option.other.other" value="-c -fmessage-length=0 -std=c++11 -fprofile-arcs -ftest-coverage" valueType="string"/>
|
||||
<option id="gnu.cpp.compiler.option.debugging.prof.523954048" name="Generate prof information (-p)" superClass="gnu.cpp.compiler.option.debugging.prof" value="false" valueType="boolean"/>
|
||||
<option id="gnu.cpp.compiler.option.debugging.gprof.1932984572" name="Generate gprof information (-pg)" superClass="gnu.cpp.compiler.option.debugging.gprof" value="false" valueType="boolean"/>
|
||||
<option id="gnu.cpp.compiler.option.dialect.std.739859284" name="Language standard" superClass="gnu.cpp.compiler.option.dialect.std" value="gnu.cpp.compiler.dialect.default" valueType="enumerated"/>
|
||||
<inputType id="cdt.managedbuild.tool.gnu.cpp.compiler.input.1847876781" superClass="cdt.managedbuild.tool.gnu.cpp.compiler.input"/>
|
||||
</tool>
|
||||
<tool id="cdt.managedbuild.tool.gnu.c.compiler.exe.debug.151665950" name="GCC C Compiler" superClass="cdt.managedbuild.tool.gnu.c.compiler.exe.debug">
|
||||
<option defaultValue="gnu.c.optimization.level.none" id="gnu.c.compiler.exe.debug.option.optimization.level.1290346028" name="Optimization Level" superClass="gnu.c.compiler.exe.debug.option.optimization.level" valueType="enumerated"/>
|
||||
<option id="gnu.c.compiler.exe.debug.option.debugging.level.1471334523" name="Debug Level" superClass="gnu.c.compiler.exe.debug.option.debugging.level" value="gnu.c.debugging.level.max" valueType="enumerated"/>
|
||||
<option id="gnu.c.compiler.option.include.paths.1530954752" name="Include paths (-I)" superClass="gnu.c.compiler.option.include.paths" valueType="includePath">
|
||||
<listOptionValue builtIn="false" value="/opt/systemc-2.3.0/include"/>
|
||||
<listOptionValue builtIn="false" value=""${workspace_loc:/dram/dram/src}""/>
|
||||
<listOptionValue builtIn="false" value="/opt/gmock-1.7.0/include"/>
|
||||
<listOptionValue builtIn="false" value="../dram/dram/src"/>
|
||||
</option>
|
||||
<option id="gnu.c.compiler.option.preprocessor.def.symbols.886802157" name="Defined symbols (-D)" superClass="gnu.c.compiler.option.preprocessor.def.symbols" valueType="definedSymbols">
|
||||
<listOptionValue builtIn="false" value="SC_INCLUDE_DYNAMIC_PROCESSES"/>
|
||||
<listOptionValue builtIn="false" value="TIXML_USE_STL"/>
|
||||
</option>
|
||||
<inputType id="cdt.managedbuild.tool.gnu.c.compiler.input.1721222219" superClass="cdt.managedbuild.tool.gnu.c.compiler.input"/>
|
||||
</tool>
|
||||
<tool id="cdt.managedbuild.tool.gnu.c.linker.exe.debug.699525857" name="GCC C Linker" superClass="cdt.managedbuild.tool.gnu.c.linker.exe.debug"/>
|
||||
<tool id="cdt.managedbuild.tool.gnu.cpp.linker.exe.debug.403667757" name="GCC C++ Linker" superClass="cdt.managedbuild.tool.gnu.cpp.linker.exe.debug">
|
||||
<option id="gnu.cpp.link.option.libs.1753762098" name="Libraries (-l)" superClass="gnu.cpp.link.option.libs" valueType="libs">
|
||||
<listOptionValue builtIn="false" value="systemc"/>
|
||||
<listOptionValue builtIn="false" value="sqlite3"/>
|
||||
<listOptionValue builtIn="false" value="gcov"/>
|
||||
<listOptionValue builtIn="false" value="pthread"/>
|
||||
</option>
|
||||
<option id="gnu.cpp.link.option.paths.1916142213" name="Library search path (-L)" superClass="gnu.cpp.link.option.paths" valueType="libPaths">
|
||||
<listOptionValue builtIn="false" value="/opt/systemc-2.3.0/lib-linux64"/>
|
||||
</option>
|
||||
<option id="gnu.cpp.link.option.debugging.prof.631946268" name="Generate prof information (-p)" superClass="gnu.cpp.link.option.debugging.prof" value="false" valueType="boolean"/>
|
||||
<option id="gnu.cpp.link.option.debugging.gprof.1817867753" name="Generate gprof information (-pg)" superClass="gnu.cpp.link.option.debugging.gprof" value="false" valueType="boolean"/>
|
||||
<inputType id="cdt.managedbuild.tool.gnu.cpp.linker.input.1335058803" superClass="cdt.managedbuild.tool.gnu.cpp.linker.input">
|
||||
<additionalInput kind="additionalinputdependency" paths="$(USER_OBJS)"/>
|
||||
<additionalInput kind="additionalinput" paths="$(LIBS)"/>
|
||||
</inputType>
|
||||
</tool>
|
||||
<tool id="cdt.managedbuild.tool.gnu.assembler.exe.debug.876145438" name="GCC Assembler" superClass="cdt.managedbuild.tool.gnu.assembler.exe.debug">
|
||||
<option id="gnu.both.asm.option.include.paths.1893217579" name="Include paths (-I)" superClass="gnu.both.asm.option.include.paths" valueType="includePath">
|
||||
<listOptionValue builtIn="false" value="/opt/systemc-2.3.0/include"/>
|
||||
<listOptionValue builtIn="false" value=""${workspace_loc:/dram/dram/src}""/>
|
||||
<listOptionValue builtIn="false" value="/opt/gmock-1.7.0/include"/>
|
||||
<listOptionValue builtIn="false" value="../dram/dram/src"/>
|
||||
</option>
|
||||
<inputType id="cdt.managedbuild.tool.gnu.assembler.input.207521263" superClass="cdt.managedbuild.tool.gnu.assembler.input"/>
|
||||
</tool>
|
||||
</toolChain>
|
||||
</folderInfo>
|
||||
<sourceEntries>
|
||||
<entry excluding="testing|src" flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name=""/>
|
||||
<entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="src/common"/>
|
||||
<entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="src/core"/>
|
||||
<entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="src/scheduler"/>
|
||||
<entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="src/simulation"/>
|
||||
</sourceEntries>
|
||||
</configuration>
|
||||
</storageModule>
|
||||
<storageModule moduleId="org.eclipse.cdt.core.externalSettings"/>
|
||||
</cconfiguration>
|
||||
</storageModule>
|
||||
<storageModule moduleId="cdtBuildSystem" version="4.0.0">
|
||||
<project id="DRAM.cdt.managedbuild.target.gnu.exe.355512678" name="Executable" projectType="cdt.managedbuild.target.gnu.exe"/>
|
||||
</storageModule>
|
||||
<storageModule moduleId="org.eclipse.cdt.core.LanguageSettingsProviders"/>
|
||||
<storageModule moduleId="refreshScope" versionNumber="2">
|
||||
<configuration configurationName="Release">
|
||||
<resource resourceType="PROJECT" workspacePath="/DRAM-Model"/>
|
||||
</configuration>
|
||||
<configuration configurationName="unit_test"/>
|
||||
<configuration configurationName="platformArchitect">
|
||||
<resource resourceType="PROJECT" workspacePath="/DRAM"/>
|
||||
</configuration>
|
||||
<configuration configurationName="build-simulation"/>
|
||||
<configuration configurationName="testing"/>
|
||||
<configuration configurationName="Debug">
|
||||
<resource resourceType="PROJECT" workspacePath="/DRAM-Model"/>
|
||||
</configuration>
|
||||
<configuration configurationName="simulation-build">
|
||||
<resource resourceType="PROJECT" workspacePath="/dram"/>
|
||||
</configuration>
|
||||
<configuration configurationName="standalone"/>
|
||||
<configuration configurationName="build-testing"/>
|
||||
<configuration configurationName="simulation"/>
|
||||
</storageModule>
|
||||
<storageModule moduleId="org.eclipse.cdt.internal.ui.text.commentOwnerProjectMappings">
|
||||
<doc-comment-owner id="org.eclipse.cdt.internal.ui.text.doctools.NullDocCommentOwner">
|
||||
<path value=""/>
|
||||
</doc-comment-owner>
|
||||
</storageModule>
|
||||
<storageModule moduleId="org.eclipse.cdt.make.core.buildtargets">
|
||||
<buildTargets>
|
||||
<target name="standalone" path="" targetID="org.eclipse.cdt.build.MakeTargetBuilder">
|
||||
<buildCommand>make</buildCommand>
|
||||
<buildArguments/>
|
||||
<buildTarget>standalone</buildTarget>
|
||||
<stopOnError>true</stopOnError>
|
||||
<useDefaultCommand>true</useDefaultCommand>
|
||||
<runAllBuilders>true</runAllBuilders>
|
||||
</target>
|
||||
</buildTargets>
|
||||
</storageModule>
|
||||
<storageModule moduleId="scannerConfiguration">
|
||||
<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/>
|
||||
<scannerConfigBuildInfo instanceId="cdt.managedbuild.config.gnu.exe.debug.1370040858;cdt.managedbuild.config.gnu.exe.debug.1370040858.;cdt.managedbuild.tool.gnu.cpp.compiler.exe.debug.1266973934;cdt.managedbuild.tool.gnu.cpp.compiler.input.643453324">
|
||||
<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/>
|
||||
</scannerConfigBuildInfo>
|
||||
<scannerConfigBuildInfo instanceId="cdt.managedbuild.config.gnu.exe.debug.1370040858.2044251296.868838098;cdt.managedbuild.config.gnu.exe.debug.1370040858.2044251296.868838098.;cdt.managedbuild.tool.gnu.c.compiler.exe.debug.2055122253;cdt.managedbuild.tool.gnu.c.compiler.input.1427026929">
|
||||
<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/>
|
||||
</scannerConfigBuildInfo>
|
||||
<scannerConfigBuildInfo instanceId="cdt.managedbuild.config.gnu.exe.debug.1370040858;cdt.managedbuild.config.gnu.exe.debug.1370040858.;cdt.managedbuild.tool.gnu.c.compiler.exe.debug.1190872096;cdt.managedbuild.tool.gnu.c.compiler.input.953626288">
|
||||
<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/>
|
||||
</scannerConfigBuildInfo>
|
||||
<scannerConfigBuildInfo instanceId="cdt.managedbuild.config.gnu.exe.release.1948932292;cdt.managedbuild.config.gnu.exe.release.1948932292.;cdt.managedbuild.tool.gnu.c.compiler.exe.release.1398731634;cdt.managedbuild.tool.gnu.c.compiler.input.1992326299">
|
||||
<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/>
|
||||
</scannerConfigBuildInfo>
|
||||
<scannerConfigBuildInfo instanceId="cdt.managedbuild.config.gnu.exe.debug.1370040858.2044251296;cdt.managedbuild.config.gnu.exe.debug.1370040858.2044251296.;cdt.managedbuild.tool.gnu.c.compiler.exe.debug.440486336;cdt.managedbuild.tool.gnu.c.compiler.input.940566522">
|
||||
<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/>
|
||||
</scannerConfigBuildInfo>
|
||||
<scannerConfigBuildInfo instanceId="cdt.managedbuild.config.gnu.exe.debug.513647443;cdt.managedbuild.config.gnu.exe.debug.513647443.;cdt.managedbuild.tool.gnu.cpp.compiler.exe.debug.789860529;cdt.managedbuild.tool.gnu.cpp.compiler.input.1847876781">
|
||||
<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/>
|
||||
</scannerConfigBuildInfo>
|
||||
<scannerConfigBuildInfo instanceId="cdt.managedbuild.config.gnu.exe.release.1948932292;cdt.managedbuild.config.gnu.exe.release.1948932292.;cdt.managedbuild.tool.gnu.cpp.compiler.exe.release.1633668164;cdt.managedbuild.tool.gnu.cpp.compiler.input.1777926483">
|
||||
<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/>
|
||||
</scannerConfigBuildInfo>
|
||||
<scannerConfigBuildInfo instanceId="cdt.managedbuild.config.gnu.exe.debug.1370040858.2044251296.868838098;cdt.managedbuild.config.gnu.exe.debug.1370040858.2044251296.868838098.;cdt.managedbuild.tool.gnu.cpp.compiler.exe.debug.192908432;cdt.managedbuild.tool.gnu.cpp.compiler.input.830919281">
|
||||
<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/>
|
||||
</scannerConfigBuildInfo>
|
||||
<scannerConfigBuildInfo instanceId="cdt.managedbuild.config.gnu.exe.debug.513647443;cdt.managedbuild.config.gnu.exe.debug.513647443.;cdt.managedbuild.tool.gnu.c.compiler.exe.debug.151665950;cdt.managedbuild.tool.gnu.c.compiler.input.1721222219">
|
||||
<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/>
|
||||
</scannerConfigBuildInfo>
|
||||
<scannerConfigBuildInfo instanceId="cdt.managedbuild.config.gnu.exe.debug.1370040858.2044251296;cdt.managedbuild.config.gnu.exe.debug.1370040858.2044251296.;cdt.managedbuild.tool.gnu.cpp.compiler.exe.debug.743207946;cdt.managedbuild.tool.gnu.cpp.compiler.input.1014131258">
|
||||
<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/>
|
||||
</scannerConfigBuildInfo>
|
||||
</storageModule>
|
||||
</cproject>
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<projectDescription>
|
||||
<name>dram</name>
|
||||
<comment></comment>
|
||||
<projects>
|
||||
</projects>
|
||||
<buildSpec>
|
||||
<buildCommand>
|
||||
<name>org.eclipse.cdt.managedbuilder.core.genmakebuilder</name>
|
||||
<triggers>clean,full,incremental,</triggers>
|
||||
<arguments>
|
||||
</arguments>
|
||||
</buildCommand>
|
||||
<buildCommand>
|
||||
<name>org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder</name>
|
||||
<triggers>full,incremental,</triggers>
|
||||
<arguments>
|
||||
</arguments>
|
||||
</buildCommand>
|
||||
</buildSpec>
|
||||
<natures>
|
||||
<nature>org.eclipse.cdt.core.cnature</nature>
|
||||
<nature>org.eclipse.cdt.core.ccnature</nature>
|
||||
<nature>org.eclipse.cdt.managedbuilder.core.managedBuildNature</nature>
|
||||
<nature>org.eclipse.cdt.managedbuilder.core.ScannerConfigNature</nature>
|
||||
</natures>
|
||||
</projectDescription>
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
<extension point="org.eclipse.cdt.core.LanguageSettingsProvider">
|
||||
<provider copy-of="extension" id="org.eclipse.cdt.ui.UserLanguageSettingsProvider"/>
|
||||
<provider-reference id="org.eclipse.cdt.managedbuilder.core.MBSLanguageSettingsProvider" ref="shared-provider"/>
|
||||
<provider class="org.eclipse.cdt.managedbuilder.language.settings.providers.GCCBuiltinSpecsDetector" console="false" env-hash="-2055719358" id="org.eclipse.cdt.managedbuilder.core.GCCBuiltinSpecsDetector" keep-relative-paths="false" name="CDT GCC Built-in Compiler Settings" parameter="${COMMAND} -E -P -v -dD "${INPUTS}" -std=c++11">
|
||||
<provider class="org.eclipse.cdt.managedbuilder.language.settings.providers.GCCBuiltinSpecsDetector" console="false" env-hash="1219188953996516293" id="org.eclipse.cdt.managedbuilder.core.GCCBuiltinSpecsDetector" keep-relative-paths="false" name="CDT GCC Built-in Compiler Settings" parameter="${COMMAND} -E -P -v -dD "${INPUTS}" -std=c++11">
|
||||
<language-scope id="org.eclipse.cdt.core.gcc"/>
|
||||
<language-scope id="org.eclipse.cdt.core.g++"/>
|
||||
</provider>
|
||||
|
||||
1
dram/resources/configs/memconfigs/.gitignore
vendored
Normal file
1
dram/resources/configs/memconfigs/.gitignore
vendored
Normal file
@@ -0,0 +1 @@
|
||||
memconfig.xml
|
||||
11
dram/resources/configs/memconfigs/fifo.xml
Normal file
11
dram/resources/configs/memconfigs/fifo.xml
Normal file
@@ -0,0 +1,11 @@
|
||||
<memspec>
|
||||
<memconfig>
|
||||
<parameter id="bankwiseLogic" type="bool" value="0" />
|
||||
<parameter id="openPagePolicy" type="bool" value="1" />
|
||||
<parameter id="adaptiveOpenPagePolicy" type="bool" value="0" />
|
||||
<parameter id="refreshAwareScheduling" type="bool" value="0" />
|
||||
<parameter id="maxNrOfTransactionsInDram" type="uint" value="50" />
|
||||
<parameter id="scheduler" type="string" value="FIFO" />
|
||||
<parameter id="capsize" type="uint" value="5" />
|
||||
</memconfig>
|
||||
</memspec>
|
||||
11
dram/resources/configs/memconfigs/fr_fcfs.xml
Normal file
11
dram/resources/configs/memconfigs/fr_fcfs.xml
Normal file
@@ -0,0 +1,11 @@
|
||||
<memspec>
|
||||
<memconfig>
|
||||
<parameter id="bankwiseLogic" type="bool" value="0" />
|
||||
<parameter id="openPagePolicy" type="bool" value="1" />
|
||||
<parameter id="adaptiveOpenPagePolicy" type="bool" value="0" />
|
||||
<parameter id="refreshAwareScheduling" type="bool" value="1" />
|
||||
<parameter id="maxNrOfTransactionsInDram" type="uint" value="50" />
|
||||
<parameter id="scheduler" type="string" value="FR_FCFS" />
|
||||
<parameter id="capsize" type="uint" value="5" />
|
||||
</memconfig>
|
||||
</memspec>
|
||||
11
dram/resources/configs/memconfigs/fr_fcfs_unaware.xml
Normal file
11
dram/resources/configs/memconfigs/fr_fcfs_unaware.xml
Normal file
@@ -0,0 +1,11 @@
|
||||
<memspec>
|
||||
<memconfig>
|
||||
<parameter id="bankwiseLogic" type="bool" value="0" />
|
||||
<parameter id="openPagePolicy" type="bool" value="1" />
|
||||
<parameter id="adaptiveOpenPagePolicy" type="bool" value="0" />
|
||||
<parameter id="refreshAwareScheduling" type="bool" value="0" />
|
||||
<parameter id="maxNrOfTransactionsInDram" type="uint" value="50" />
|
||||
<parameter id="scheduler" type="string" value="FR_FCFS" />
|
||||
<parameter id="capsize" type="uint" value="5" />
|
||||
</memconfig>
|
||||
</memspec>
|
||||
11
dram/resources/configs/memconfigs/par_bs.xml
Normal file
11
dram/resources/configs/memconfigs/par_bs.xml
Normal file
@@ -0,0 +1,11 @@
|
||||
<memspec>
|
||||
<memconfig>
|
||||
<parameter id="bankwiseLogic" type="bool" value="0" />
|
||||
<parameter id="openPagePolicy" type="bool" value="1" />
|
||||
<parameter id="adaptiveOpenPagePolicy" type="bool" value="0" />
|
||||
<parameter id="refreshAwareScheduling" type="bool" value="1" />
|
||||
<parameter id="maxNrOfTransactionsInDram" type="uint" value="50" />
|
||||
<parameter id="scheduler" type="string" value="PAR_BS" />
|
||||
<parameter id="capsize" type="uint" value="5" />
|
||||
</memconfig>
|
||||
</memspec>
|
||||
11
dram/resources/configs/memconfigs/par_bs_unaware.xml
Normal file
11
dram/resources/configs/memconfigs/par_bs_unaware.xml
Normal file
@@ -0,0 +1,11 @@
|
||||
<memspec>
|
||||
<memconfig>
|
||||
<parameter id="bankwiseLogic" type="bool" value="0" />
|
||||
<parameter id="openPagePolicy" type="bool" value="1" />
|
||||
<parameter id="adaptiveOpenPagePolicy" type="bool" value="0" />
|
||||
<parameter id="refreshAwareScheduling" type="bool" value="0" />
|
||||
<parameter id="maxNrOfTransactionsInDram" type="uint" value="50" />
|
||||
<parameter id="scheduler" type="string" value="PAR_BS" />
|
||||
<parameter id="capsize" type="uint" value="5" />
|
||||
</memconfig>
|
||||
</memspec>
|
||||
@@ -28,7 +28,7 @@
|
||||
<!--<parameter id="XPDLL" type="uint" value="2" />-->
|
||||
<parameter id="XS" type="uint" value="2" /><!--tRFC+2clk-->
|
||||
<!--<parameter id="XSDLL" type="uint" value="20" />-->
|
||||
<parameter id="REFI" type="uint" value="300" />
|
||||
<parameter id="REFI" type="uint" value="1300" />
|
||||
<!--<parameter id="CL" type="uint" value="3" />-->
|
||||
<parameter id="TAW" type="uint" value="10" />
|
||||
<parameter id="RRD" type="uint" value="2" />
|
||||
|
||||
@@ -17,9 +17,11 @@ CREATE TABLE GeneralInfo(
|
||||
NumberOfTransactions INTEGER,
|
||||
TraceEnd INTEGER,
|
||||
NumberOfBanks INTEGER,
|
||||
Description TEXT,
|
||||
clk INTEGER,
|
||||
UnitOfTime TEXT
|
||||
UnitOfTime TEXT,
|
||||
Memconfig TEXT,
|
||||
Memspec TEXT,
|
||||
Traces TEXt
|
||||
);
|
||||
|
||||
|
||||
@@ -47,6 +49,7 @@ CREATE TABLE Transactions(
|
||||
TThread INTEGER,
|
||||
TChannel INTEGER,
|
||||
TBank INTEGER,
|
||||
TBankgroup INTEGER,
|
||||
TRow INTEGER,
|
||||
TColumn INTEGER,
|
||||
Command TEXT,
|
||||
|
||||
@@ -35,7 +35,7 @@ def getTraceLength(connection):
|
||||
@metric
|
||||
def average_response_latency_in_ns(connection):
|
||||
cursor = connection.cursor()
|
||||
cursor.execute("""SELECT avg(ranges.end-ranges.begin)/1000 FROM transactions INNER JOIN ranges
|
||||
cursor.execute("""SELECT avg(transactions.DataStrobeEnd-ranges.begin)/1000 FROM transactions INNER JOIN ranges
|
||||
ON transactions.range = ranges.ID where TThread != 0""")
|
||||
|
||||
result = cursor.fetchone()
|
||||
@@ -44,7 +44,7 @@ def average_response_latency_in_ns(connection):
|
||||
@threadMetric
|
||||
def average_response_latency_in_ns(connection, thread):
|
||||
cursor = connection.cursor()
|
||||
query = """SELECT avg(ranges.end-ranges.begin)/1000 FROM transactions INNER JOIN ranges
|
||||
query = """SELECT avg(transactions.DataStrobeEnd-ranges.begin)/1000 FROM transactions INNER JOIN ranges
|
||||
ON transactions.range = ranges.ID where TThread = :Thread """
|
||||
|
||||
cursor.execute(query, {"Thread": thread})
|
||||
|
||||
@@ -23,7 +23,7 @@ void DebugManager::printDebugMessage(string sender, string message)
|
||||
cout << " at " << sc_time_stamp() << "\t in " << sender << "\t: " << message << endl;
|
||||
|
||||
if (writeToFile)
|
||||
debugFile << " at " << sc_time_stamp().to_default_time_units() << " in " << sender << "\t: " << message << "\n";
|
||||
debugFile << " at " << sc_time_stamp() << " in " << sender << "\t: " << message << "\n";
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -41,8 +41,6 @@ void TlmRecorder::recordPhase(tlm::tlm_generic_payload& trans, tlm::tlm_phase ph
|
||||
if (currentTransactionsInSystem.count(&trans) == 0)
|
||||
introduceNewTransactionToSystem(time, trans);
|
||||
|
||||
unsigned int id = currentTransactionsInSystem[&trans];
|
||||
|
||||
string phaseName = phaseNameToString(phase);
|
||||
string phaseBeginPrefix = "BEGIN_";
|
||||
string phaseEndPrefix = "END_";
|
||||
@@ -73,7 +71,7 @@ void TlmRecorder::recordDebugMessage(std::string message, sc_time time)
|
||||
|
||||
void TlmRecorder::createTables(string pathToURI)
|
||||
{
|
||||
string initial = getFileContents(pathToURI);
|
||||
string initial = loadTextFileContents(pathToURI);
|
||||
executeSqlCommand(initial);
|
||||
}
|
||||
|
||||
@@ -89,7 +87,7 @@ void TlmRecorder::setUpTransactionTerminatingPhases()
|
||||
void TlmRecorder::prepareSqlStatements()
|
||||
{
|
||||
insertTransactionString =
|
||||
"INSERT INTO Transactions VALUES (:id,:rangeID,:address,:burstlength,:thread,:channel,:bank,:row,:column,:command,:dataStrobeBegin,:dataStrobeEnd)";
|
||||
"INSERT INTO Transactions VALUES (:id,:rangeID,:address,:burstlength,:thread,:channel,:bank,:bankgroup,:row,:column,:command,:dataStrobeBegin,:dataStrobeEnd)";
|
||||
insertRangeString = "INSERT INTO Ranges VALUES (:id,:begin,:end)";
|
||||
updateRangeString = "UPDATE Ranges SET End = :end WHERE ID = :id";
|
||||
updateDataStrobeString = "UPDATE Transactions SET DataStrobeBegin = :begin, DataStrobeEnd = :end WHERE ID = :id";
|
||||
@@ -99,7 +97,8 @@ void TlmRecorder::prepareSqlStatements()
|
||||
updatePhaseString =
|
||||
"UPDATE Phases SET PhaseEnd = :end WHERE Transact = :trans AND PhaseName = :name";
|
||||
insertGeneralInfoString =
|
||||
"INSERT INTO GeneralInfo (NumberOfTransactions,TraceEnd,NumberOfBanks,description,clk,UnitOfTime) Values (:numberOfTransactions,:end,:numberOfBanks,:description,:clk,:unitOfTime)";
|
||||
"INSERT INTO GeneralInfo (NumberOfTransactions,TraceEnd,NumberOfBanks,clk,UnitOfTime,Memconfig,Memspec,Traces) Values "
|
||||
"(:numberOfTransactions,:end,:numberOfBanks,:clk,:unitOfTime,:memconfig,:memspec,:traces)";
|
||||
insertDebugMessageString = "INSERT INTO DebugMessages (Time,Message) Values (:time,:message)";
|
||||
|
||||
sqlite3_prepare(db, insertTransactionString.c_str(), -1, &insertTransactionStatement, 0);
|
||||
@@ -134,9 +133,11 @@ void TlmRecorder::insertGeneralInfo()
|
||||
sqlite3_bind_int64(insertGeneralInfoStatement, 2, recordingEndTime.value());
|
||||
sqlite3_bind_int(insertGeneralInfoStatement, 3,
|
||||
core::Configuration::getInstance().NumberOfBanks);
|
||||
sqlite3_bind_text(insertGeneralInfoStatement, 4, "", 0, NULL);
|
||||
sqlite3_bind_int(insertGeneralInfoStatement, 5, core::Configuration::getInstance().Timings.clk.value());
|
||||
sqlite3_bind_text(insertGeneralInfoStatement, 6, "PS", 2, NULL);
|
||||
sqlite3_bind_int(insertGeneralInfoStatement, 4, core::Configuration::getInstance().Timings.clk.value());
|
||||
sqlite3_bind_text(insertGeneralInfoStatement, 5, "PS", 2, NULL);
|
||||
sqlite3_bind_text(insertGeneralInfoStatement, 6, memconfig.c_str(), memconfig.length(), NULL);
|
||||
sqlite3_bind_text(insertGeneralInfoStatement, 7, memspec.c_str(), memspec.length(), NULL);
|
||||
sqlite3_bind_text(insertGeneralInfoStatement, 8, traces.c_str(), traces.length(), NULL);
|
||||
executeSqlStatement(insertGeneralInfoStatement);
|
||||
}
|
||||
void TlmRecorder::insertTransactionInDB(unsigned int id, tlm::tlm_generic_payload& trans)
|
||||
@@ -145,17 +146,17 @@ void TlmRecorder::insertTransactionInDB(unsigned int id, tlm::tlm_generic_payloa
|
||||
sqlite3_bind_int(insertTransactionStatement, 2, id);
|
||||
sqlite3_bind_int(insertTransactionStatement, 3, trans.get_address());
|
||||
sqlite3_bind_int(insertTransactionStatement, 4, trans.get_streaming_width());
|
||||
sqlite3_bind_text(insertTransactionStatement, 10,
|
||||
trans.get_command() == tlm::TLM_READ_COMMAND ? "R" : "W", 1, 0);
|
||||
|
||||
|
||||
const DramExtension& extension = DramExtension::getExtension(trans);
|
||||
sqlite3_bind_int(insertTransactionStatement, 5, extension.getThread().ID());
|
||||
sqlite3_bind_int(insertTransactionStatement, 6, extension.getChannel().ID());
|
||||
sqlite3_bind_int(insertTransactionStatement, 7, extension.getBank().ID());
|
||||
sqlite3_bind_int(insertTransactionStatement, 8, extension.getRow().ID());
|
||||
sqlite3_bind_int(insertTransactionStatement, 9, extension.getColumn().ID());
|
||||
sqlite3_bind_int(insertTransactionStatement, 10, 0);
|
||||
sqlite3_bind_int(insertTransactionStatement, 8, extension.getBankGroup().ID());
|
||||
sqlite3_bind_int(insertTransactionStatement, 9, extension.getRow().ID());
|
||||
sqlite3_bind_int(insertTransactionStatement, 10, extension.getColumn().ID());
|
||||
sqlite3_bind_int(insertTransactionStatement, 11, 0);
|
||||
sqlite3_bind_int(insertTransactionStatement, 12, 0);
|
||||
|
||||
executeSqlStatement(insertTransactionStatement);
|
||||
}
|
||||
@@ -244,25 +245,7 @@ void TlmRecorder::executeSqlCommand(string command)
|
||||
|
||||
printDebugMessage("Database created successfully");
|
||||
}
|
||||
string TlmRecorder::getFileContents(string filename)
|
||||
{
|
||||
ifstream in(filename.c_str(), ios::in | ios::binary);
|
||||
if (in)
|
||||
{
|
||||
string contents;
|
||||
in.seekg(0, ios::end);
|
||||
contents.resize(in.tellg());
|
||||
in.seekg(0, ios::beg);
|
||||
in.read(&contents[0], contents.size());
|
||||
in.close();
|
||||
return (contents);
|
||||
}
|
||||
else
|
||||
{
|
||||
reportFatal("Error in TraceRecorder", "Could not load sql script from " + filename);
|
||||
return "";
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void TlmRecorder::printDebugMessage(std::string message)
|
||||
{
|
||||
|
||||
@@ -30,12 +30,14 @@ public:
|
||||
void recordDebugMessage(std::string message, sc_time time);
|
||||
void updateDataStrobe(const sc_time& begin, const sc_time& end, tlm::tlm_generic_payload& trans);
|
||||
void closeConnection();
|
||||
|
||||
void recordMemconfig(string memconfig){this->memconfig = memconfig;}
|
||||
void recordMemspec(string memspec){this->memspec = memspec;}
|
||||
void recordTracenames(string traces){this->traces = traces;}
|
||||
private:
|
||||
std::string memconfig,memspec,traces;
|
||||
TlmRecorder();
|
||||
~TlmRecorder();
|
||||
|
||||
std::string getFileContents(std::string filename);
|
||||
|
||||
void executeSqlCommand(std::string command);
|
||||
void executeSqlStatement(sqlite3_stmt* statement);
|
||||
@@ -59,6 +61,7 @@ private:
|
||||
map<tlm::tlm_generic_payload*, unsigned int> currentTransactionsInSystem;
|
||||
unsigned int transactionIDCounter;
|
||||
sc_time recordingEndTime;
|
||||
|
||||
std::vector<tlm::tlm_phase> transactionTerminatingPhases;
|
||||
sqlite3 *db;
|
||||
sqlite3_stmt *insertTransactionStatement, *insertRangeStatement, *updateRangeStatement,
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
#include "Utils.h"
|
||||
#include <string>
|
||||
#include <tlm.h>
|
||||
#include <fstream>
|
||||
|
||||
using namespace std;
|
||||
using namespace tinyxml2;
|
||||
@@ -10,7 +11,6 @@ void reportFatal(std::string sender, std::string message)
|
||||
SC_REPORT_FATAL(sender.c_str(), message.c_str());
|
||||
}
|
||||
|
||||
|
||||
std::string phaseNameToString(tlm::tlm_phase phase)
|
||||
{
|
||||
std::ostringstream oss;
|
||||
@@ -19,7 +19,8 @@ std::string phaseNameToString(tlm::tlm_phase phase)
|
||||
return str;
|
||||
}
|
||||
|
||||
unsigned int queryUIntParameter(XMLElement* node, string name) {
|
||||
unsigned int queryUIntParameter(XMLElement* node, string name)
|
||||
{
|
||||
int result;
|
||||
XMLElement* element;
|
||||
for (element = node->FirstChildElement("parameter"); element != NULL;
|
||||
@@ -34,7 +35,7 @@ unsigned int queryUIntParameter(XMLElement* node, string name) {
|
||||
}
|
||||
}
|
||||
|
||||
reportFatal("Query XML","Parameter '" + name +"' does not exist.");
|
||||
reportFatal("Query XML", "Parameter '" + name + "' does not exist.");
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -52,7 +53,8 @@ bool parameterExists(tinyxml2::XMLElement* node, std::string name)
|
||||
return false;
|
||||
}
|
||||
|
||||
double queryDoubleParameter(XMLElement* node, string name) {
|
||||
double queryDoubleParameter(XMLElement* node, string name)
|
||||
{
|
||||
double result;
|
||||
XMLElement* element;
|
||||
for (element = node->FirstChildElement("parameter"); element != NULL;
|
||||
@@ -67,11 +69,12 @@ double queryDoubleParameter(XMLElement* node, string name) {
|
||||
}
|
||||
}
|
||||
|
||||
reportFatal("Query XML","Parameter '" + name +"' does not exist.");
|
||||
reportFatal("Query XML", "Parameter '" + name + "' does not exist.");
|
||||
return 0;
|
||||
}
|
||||
|
||||
bool queryBoolParameter(XMLElement* node, string name) {
|
||||
bool queryBoolParameter(XMLElement* node, string name)
|
||||
{
|
||||
bool result;
|
||||
XMLElement* element;
|
||||
for (element = node->FirstChildElement("parameter"); element != NULL;
|
||||
@@ -86,11 +89,12 @@ bool queryBoolParameter(XMLElement* node, string name) {
|
||||
}
|
||||
}
|
||||
|
||||
reportFatal("Query XML","Parameter '" + name +"' does not exist.");
|
||||
reportFatal("Query XML", "Parameter '" + name + "' does not exist.");
|
||||
return 0;
|
||||
}
|
||||
|
||||
string queryStringParameter(XMLElement* node, string name) {
|
||||
string queryStringParameter(XMLElement* node, string name)
|
||||
{
|
||||
XMLElement* element;
|
||||
for (element = node->FirstChildElement("parameter"); element != NULL;
|
||||
element = element->NextSiblingElement("parameter"))
|
||||
@@ -101,7 +105,7 @@ string queryStringParameter(XMLElement* node, string name) {
|
||||
}
|
||||
}
|
||||
|
||||
reportFatal("Query XML","Parameter '" + name +"' does not exist.");
|
||||
reportFatal("Query XML", "Parameter '" + name + "' does not exist.");
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -109,8 +113,29 @@ void loadXML(string uri, XMLDocument& doc)
|
||||
{
|
||||
XMLError error = doc.LoadFile(uri.c_str());
|
||||
|
||||
if (error) {
|
||||
if (error)
|
||||
{
|
||||
reportFatal("Configuration", "Error loading xml from: " + uri);
|
||||
}
|
||||
}
|
||||
|
||||
string loadTextFileContents(string filename)
|
||||
{
|
||||
|
||||
ifstream in(filename.c_str(), ios::in | ios::binary);
|
||||
if (in)
|
||||
{
|
||||
string contents;
|
||||
in.seekg(0, ios::end);
|
||||
contents.resize(in.tellg());
|
||||
in.seekg(0, ios::beg);
|
||||
in.read(&contents[0], contents.size());
|
||||
in.close();
|
||||
return (contents);
|
||||
}
|
||||
else
|
||||
{
|
||||
reportFatal("Error loading file", "Could not load textfile from " + filename);
|
||||
return "";
|
||||
}
|
||||
}
|
||||
|
||||
@@ -41,6 +41,7 @@ bool isIn(const T& value, const std::vector<T>& collection)
|
||||
void reportFatal(std::string sender, std::string message);
|
||||
std::string phaseNameToString(tlm::tlm_phase phase);
|
||||
|
||||
std::string loadTextFileContents(std::string filename);
|
||||
void loadXML(std::string uri, tinyxml2::XMLDocument& doc);
|
||||
|
||||
bool parameterExists(tinyxml2::XMLElement* node, std::string name);
|
||||
|
||||
@@ -29,6 +29,12 @@ bool operator !=(const Thread& lhs, const Thread& rhs)
|
||||
return !(lhs == rhs);
|
||||
}
|
||||
|
||||
bool operator <(const Thread& lhs, const Thread& rhs)
|
||||
{
|
||||
return lhs.ID() < rhs.ID();
|
||||
}
|
||||
|
||||
|
||||
bool operator ==(const Channel& lhs, const Channel& rhs)
|
||||
{
|
||||
return lhs.ID() == rhs.ID();
|
||||
@@ -88,3 +94,4 @@ bool operator !=(const Column& lhs, const Column& rhs)
|
||||
{
|
||||
return !(lhs == rhs);
|
||||
}
|
||||
|
||||
|
||||
@@ -115,6 +115,7 @@ private:
|
||||
|
||||
bool operator==(const Thread &lhs, const Thread &rhs);
|
||||
bool operator!=(const Thread &lhs, const Thread &rhs);
|
||||
bool operator<(const Thread &lhs, const Thread &rhs);
|
||||
|
||||
bool operator==(const Channel &lhs, const Channel &rhs);
|
||||
bool operator!=(const Channel &lhs, const Channel &rhs);
|
||||
|
||||
@@ -67,7 +67,7 @@ BankGroup getBankGroup(Bank bank)
|
||||
|
||||
for (unsigned int bank = 0; bank < Configuration::getInstance().NumberOfBanks; bank++)
|
||||
{
|
||||
unsigned int group = bank / Configuration::getInstance().NumberOfBankGroups;
|
||||
unsigned int group = bank % Configuration::getInstance().NumberOfBankGroups;
|
||||
bankgroups.insert(std::pair<Bank, BankGroup>(Bank(bank), BankGroup(group)));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -29,7 +29,8 @@ gp* Fifo::getTransactionForBank(Bank bank)
|
||||
|
||||
void Fifo::popTransactionForBank(Bank bank, gp* payload)
|
||||
{
|
||||
sc_assert(hasTransactionForBank(bank));
|
||||
sc_assert(DramExtension::getExtension(payload).getBank() == bank);
|
||||
|
||||
buffer[bank].pop_front();
|
||||
}
|
||||
|
||||
|
||||
@@ -8,8 +8,8 @@ using namespace core;
|
||||
|
||||
namespace scheduler {
|
||||
|
||||
FR_FCFS::FR_FCFS(core::ControllerCore& controller, bool refreshAware, bool adaptiveOpenPage) :
|
||||
controllerBankstates(controller.state.bankStates), refreshAware(refreshAware), adaptiveOpenPage(
|
||||
FR_FCFS::FR_FCFS(const core::BankStates& bankstates, bool useExternalStates, bool adaptiveOpenPage) :
|
||||
externalBankstates(bankstates), useExternalStates(useExternalStates), adaptiveOpenPage(
|
||||
adaptiveOpenPage)
|
||||
{
|
||||
}
|
||||
@@ -23,16 +23,34 @@ bool FR_FCFS::hasTransactionForBank(Bank bank)
|
||||
return !buffer[bank].empty();
|
||||
}
|
||||
|
||||
|
||||
bool FR_FCFS::isEmpty()
|
||||
{
|
||||
for(unsigned int i = 0; i < Configuration::getInstance().NumberOfBanks;++i)
|
||||
{
|
||||
if(!buffer[Bank(i)].empty())
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
void FR_FCFS::schedule(gp* payload)
|
||||
{
|
||||
buffer[DramExtension::getExtension(payload).getBank()].emplace_back(payload);
|
||||
}
|
||||
|
||||
|
||||
void FR_FCFS::schedule(std::vector<gp*> payloads)
|
||||
{
|
||||
for(gp* payload: payloads)
|
||||
schedule(payload);
|
||||
}
|
||||
|
||||
gp* FR_FCFS::getTransactionForBank(Bank bank)
|
||||
{
|
||||
sc_assert(hasTransactionForBank(bank));
|
||||
|
||||
Row openRowOnBank = (refreshAware) ? controllerBankstates.getRowInRowBuffer(bank) : internalBankstates.getRowInRowBuffer(bank);
|
||||
Row openRowOnBank = (useExternalStates) ? externalBankstates.getRowInRowBuffer(bank) : internalBankstates.getRowInRowBuffer(bank);
|
||||
auto rowHits = findRowHits(bank, openRowOnBank);
|
||||
gp* result = rowHits.empty() ? buffer[bank].front() : rowHits.front();
|
||||
|
||||
@@ -65,6 +83,15 @@ gp* FR_FCFS::getTransactionForBank(Bank bank)
|
||||
}
|
||||
}
|
||||
|
||||
gp* FR_FCFS::popOldest(Bank bank)
|
||||
{
|
||||
assert(hasTransactionForBank(bank));
|
||||
|
||||
gp* result = buffer[bank].front();
|
||||
buffer[bank].pop_front();
|
||||
return result;
|
||||
}
|
||||
|
||||
std::vector<gp*> FR_FCFS::findRowHits(Bank bank, Row row)
|
||||
{
|
||||
vector<gp*> found;
|
||||
@@ -78,11 +105,11 @@ std::vector<gp*> FR_FCFS::findRowHits(Bank bank, Row row)
|
||||
|
||||
void FR_FCFS::popTransactionForBank(Bank bank, gp* payload)
|
||||
{
|
||||
sc_assert(
|
||||
hasTransactionForBank(bank) && bank == DramExtension::getExtension(payload).getBank());
|
||||
sc_assert(DramExtension::getExtension(payload).getBank() == bank);
|
||||
|
||||
buffer[bank].remove(payload);
|
||||
|
||||
if (!refreshAware)
|
||||
if (!useExternalStates)
|
||||
{
|
||||
internalBankstates.openRowInRowBuffer(bank, DramExtension::getExtension(payload).getRow());
|
||||
}
|
||||
|
||||
@@ -5,13 +5,14 @@
|
||||
#include "../core/ControllerCore.h"
|
||||
#include <list>
|
||||
#include <map>
|
||||
#include <vector>
|
||||
|
||||
namespace scheduler {
|
||||
|
||||
class FR_FCFS : public Scheduler
|
||||
{
|
||||
public:
|
||||
FR_FCFS(core::ControllerCore& controller,bool refreshAware, bool adaptiveOpenPage);
|
||||
FR_FCFS(const core::BankStates& bankstates, bool refreshAware, bool adaptiveOpenPage);
|
||||
virtual ~FR_FCFS();
|
||||
|
||||
virtual bool hasTransactionForBank(Bank bank) override;
|
||||
@@ -19,12 +20,17 @@ public:
|
||||
virtual gp* getTransactionForBank(Bank bank) override;
|
||||
virtual void popTransactionForBank(Bank bank, gp* payload) override;
|
||||
|
||||
//used by PAR_BS
|
||||
void schedule (std::vector<gp*> payloads);
|
||||
gp* popOldest(Bank bank);
|
||||
bool isEmpty();
|
||||
|
||||
private:
|
||||
std::vector<gp*> findRowHits(Bank bank, Row row);
|
||||
std::map<Bank,std::list<gp*>> buffer;
|
||||
const core::BankStates& controllerBankstates;
|
||||
const core::BankStates& externalBankstates;
|
||||
core::BankStates internalBankstates;
|
||||
bool refreshAware;
|
||||
bool useExternalStates;
|
||||
bool adaptiveOpenPage;
|
||||
};
|
||||
|
||||
|
||||
113
dram/src/scheduler/PARBS.cpp
Normal file
113
dram/src/scheduler/PARBS.cpp
Normal file
@@ -0,0 +1,113 @@
|
||||
/*
|
||||
* PARBS.cpp
|
||||
*
|
||||
* Created on: Apr 9, 2014
|
||||
* Author: robert
|
||||
*/
|
||||
|
||||
#include "PARBS.h"
|
||||
#include "../core/configuration/Configuration.h"
|
||||
#include "../common/dramExtension.h"
|
||||
#include "map"
|
||||
#include "ThreadLoad.h"
|
||||
#include <algorithm>
|
||||
|
||||
namespace scheduler {
|
||||
|
||||
using namespace std;
|
||||
using namespace core;
|
||||
|
||||
PAR_BS::PAR_BS(const core::BankStates& bankstates, bool useExternalBankstates, unsigned int capsize) :
|
||||
externalBankstates(bankstates), useExternalBankstates(useExternalBankstates), capsize(capsize)
|
||||
{
|
||||
if (useExternalBankstates)
|
||||
{
|
||||
batch = new FR_FCFS(externalBankstates, true, false);
|
||||
buffer = new FR_FCFS(externalBankstates, true, false);
|
||||
}
|
||||
else
|
||||
{
|
||||
batch = new FR_FCFS(internalBankstates, true, false);
|
||||
buffer = new FR_FCFS(internalBankstates, true, false);
|
||||
}
|
||||
}
|
||||
|
||||
PAR_BS::~PAR_BS()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
bool PAR_BS::hasTransactionForBank(Bank bank)
|
||||
{
|
||||
return batch->hasTransactionForBank(bank) || buffer->hasTransactionForBank(bank);
|
||||
}
|
||||
|
||||
void PAR_BS::schedule(gp* payload)
|
||||
{
|
||||
buffer->schedule(payload);
|
||||
}
|
||||
|
||||
gp* PAR_BS::getTransactionForBank(Bank bank)
|
||||
{
|
||||
assert(hasTransactionForBank(bank));
|
||||
|
||||
if (batch->isEmpty())
|
||||
{
|
||||
formBatch();
|
||||
sc_assert(!batch->isEmpty());
|
||||
}
|
||||
|
||||
//prioritize batch first
|
||||
if (batch->hasTransactionForBank(bank))
|
||||
{
|
||||
return batch->getTransactionForBank(bank);
|
||||
}
|
||||
else
|
||||
{
|
||||
return buffer->getTransactionForBank(bank);
|
||||
}
|
||||
}
|
||||
|
||||
void PAR_BS::popTransactionForBank(Bank bank, gp* payload)
|
||||
{
|
||||
sc_assert(DramExtension::getExtension(payload).getBank() == bank);
|
||||
buffer->popTransactionForBank(bank, payload);
|
||||
batch->popTransactionForBank(bank, payload);
|
||||
|
||||
if (!useExternalBankstates)
|
||||
{
|
||||
internalBankstates.openRowInRowBuffer(bank, DramExtension::getExtension(payload).getRow());
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void PAR_BS::formBatch()
|
||||
{
|
||||
map<Thread, ThreadLoad> loads;
|
||||
|
||||
for (unsigned int b = 0; b < Configuration::getInstance().NumberOfBanks; ++b)
|
||||
{
|
||||
Bank bank(b);
|
||||
for (unsigned int i = 0; i < capsize && buffer->hasTransactionForBank(bank); i++)
|
||||
{
|
||||
gp* payload = buffer->popOldest(bank);
|
||||
loads[DramExtension::getExtension(payload).getThread()].addTransaction(payload);
|
||||
}
|
||||
}
|
||||
|
||||
vector<ThreadLoad*> sortedLoads;
|
||||
for (auto& threadLoadPair : loads)
|
||||
{
|
||||
sortedLoads.push_back(&threadLoadPair.second);
|
||||
}
|
||||
|
||||
sort(sortedLoads.begin(), sortedLoads.end(), LoadPointerComparer());
|
||||
|
||||
for (auto& load : sortedLoads)
|
||||
{
|
||||
batch->schedule(load->getTransactions());
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
} /* namespace core */
|
||||
38
dram/src/scheduler/PARBS.h
Normal file
38
dram/src/scheduler/PARBS.h
Normal file
@@ -0,0 +1,38 @@
|
||||
/*
|
||||
* PARBS.h
|
||||
*
|
||||
* Created on: Apr 9, 2014
|
||||
* Author: robert
|
||||
*/
|
||||
|
||||
#ifndef PARBS_H_
|
||||
#define PARBS_H_
|
||||
#include "Scheduler.h"
|
||||
#include "../core/ControllerCore.h"
|
||||
#include "Fr_Fcfs.h"
|
||||
|
||||
namespace scheduler {
|
||||
|
||||
class PAR_BS : public Scheduler
|
||||
{
|
||||
public:
|
||||
PAR_BS(const core::BankStates& bankstates, bool useExternalBankstates, unsigned int capsize);
|
||||
virtual ~PAR_BS();
|
||||
virtual bool hasTransactionForBank(Bank bank) override;
|
||||
virtual void schedule(gp* payload) override;
|
||||
virtual gp* getTransactionForBank(Bank bank) override;
|
||||
virtual void popTransactionForBank(Bank bank, gp* payload) override;
|
||||
|
||||
private:
|
||||
void formBatch();
|
||||
bool useExternalBankstates;
|
||||
const core::BankStates& externalBankstates;
|
||||
core::BankStates internalBankstates;
|
||||
FR_FCFS *batch;
|
||||
FR_FCFS *buffer;
|
||||
unsigned int capsize;
|
||||
};
|
||||
|
||||
} /* scheduler core */
|
||||
|
||||
#endif /* PARBS_H_ */
|
||||
71
dram/src/scheduler/ThreadLoad.cpp
Normal file
71
dram/src/scheduler/ThreadLoad.cpp
Normal file
@@ -0,0 +1,71 @@
|
||||
/*
|
||||
* ThreadLoad.cpp
|
||||
*
|
||||
* Created on: Apr 9, 2014
|
||||
* Author: robert
|
||||
*/
|
||||
|
||||
#include "ThreadLoad.h"
|
||||
|
||||
namespace scheduler {
|
||||
|
||||
using namespace std;
|
||||
|
||||
ThreadLoad::ThreadLoad()
|
||||
{
|
||||
// TODO Auto-generated constructor stub
|
||||
|
||||
}
|
||||
|
||||
ThreadLoad::~ThreadLoad()
|
||||
{
|
||||
// TODO Auto-generated destructor stub
|
||||
}
|
||||
|
||||
unsigned int ThreadLoad::getMaxBankLoad() const
|
||||
{
|
||||
unsigned int maxLoad = 0;
|
||||
for (auto& bankVectorPair : load)
|
||||
{
|
||||
if (bankVectorPair.second.size() > maxLoad)
|
||||
maxLoad = bankVectorPair.second.size();
|
||||
}
|
||||
return maxLoad;
|
||||
}
|
||||
|
||||
unsigned int ThreadLoad::getTotalLoad() const
|
||||
{
|
||||
unsigned int totalLoad = 0;
|
||||
for (auto& bankVectorPair : load)
|
||||
{
|
||||
totalLoad += bankVectorPair.second.size();
|
||||
}
|
||||
return totalLoad;
|
||||
}
|
||||
|
||||
void ThreadLoad::addTransaction(gp* payload)
|
||||
{
|
||||
load[DramExtension::getExtension(payload).getBank()].push_back(payload);
|
||||
}
|
||||
|
||||
bool operator<(const ThreadLoad& lhs, const ThreadLoad& rhs)
|
||||
{
|
||||
if (lhs.getMaxBankLoad() < rhs.getMaxBankLoad())
|
||||
return true;
|
||||
else if (lhs.getMaxBankLoad() == rhs.getMaxBankLoad())
|
||||
return lhs.getTotalLoad() < rhs.getTotalLoad();
|
||||
else
|
||||
return false;
|
||||
}
|
||||
|
||||
vector<gp*> ThreadLoad::getTransactions()
|
||||
{
|
||||
vector<gp*> result;
|
||||
for (auto& bankVectorPair : load)
|
||||
{
|
||||
result.insert(result.end(), bankVectorPair.second.begin(), bankVectorPair.second.end());
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
} /* namespace scheduler */
|
||||
44
dram/src/scheduler/ThreadLoad.h
Normal file
44
dram/src/scheduler/ThreadLoad.h
Normal file
@@ -0,0 +1,44 @@
|
||||
/*
|
||||
* ThreadLoad.h
|
||||
*
|
||||
* Created on: Apr 9, 2014
|
||||
* Author: robert
|
||||
*/
|
||||
|
||||
#ifndef THREADLOAD_H_
|
||||
#define THREADLOAD_H_
|
||||
#include <map>
|
||||
#include <tlm.h>
|
||||
#include "../common/dramExtension.h"
|
||||
|
||||
namespace scheduler {
|
||||
|
||||
typedef tlm::tlm_generic_payload gp;
|
||||
|
||||
class ThreadLoad
|
||||
{
|
||||
public:
|
||||
ThreadLoad();
|
||||
virtual ~ThreadLoad();
|
||||
|
||||
unsigned int getMaxBankLoad() const;
|
||||
unsigned int getTotalLoad() const;
|
||||
|
||||
void addTransaction(gp* payload);
|
||||
std::vector<gp*> getTransactions();
|
||||
|
||||
private:
|
||||
std::map<Bank,std::vector<gp*>> load;
|
||||
};
|
||||
|
||||
bool operator< (const ThreadLoad &lhs, const ThreadLoad &rhs);
|
||||
|
||||
struct LoadPointerComparer {
|
||||
bool operator()(const ThreadLoad* l, const ThreadLoad* r) {
|
||||
return *l < *r;
|
||||
}
|
||||
};
|
||||
|
||||
} /* namespace scheduler */
|
||||
|
||||
#endif /* THREADLOAD_H_ */
|
||||
@@ -26,6 +26,7 @@
|
||||
#include "../scheduler/Scheduler.h"
|
||||
#include "../scheduler/Fifo.h"
|
||||
#include "../scheduler/Fr_Fcfs.h"
|
||||
#include "../scheduler/PARBS.h"
|
||||
|
||||
using namespace std;
|
||||
using namespace tlm;
|
||||
@@ -61,10 +62,24 @@ public:
|
||||
void buildScheduler()
|
||||
{
|
||||
string selectedScheduler = Configuration::getInstance().Scheduler;
|
||||
|
||||
if (selectedScheduler == "FR_FCFS")
|
||||
scheduler = new FR_FCFS(*controller,
|
||||
{
|
||||
if(Configuration::getInstance().RefreshAwareScheduling)
|
||||
cout << "Building refresh aware scheduler" << std::endl;
|
||||
else
|
||||
cout << "Building refresh un-aware scheduler" << std::endl;
|
||||
|
||||
scheduler = new FR_FCFS(controller->state.bankStates,
|
||||
Configuration::getInstance().RefreshAwareScheduling,
|
||||
Configuration::getInstance().AdaptiveOpenPagePolicy);
|
||||
}
|
||||
else if (selectedScheduler == "PAR_BS")
|
||||
{
|
||||
scheduler = new PAR_BS(controller->state.bankStates,
|
||||
Configuration::getInstance().RefreshAwareScheduling,
|
||||
Configuration::getInstance().Capsize);
|
||||
}
|
||||
else if (selectedScheduler == "FIFO")
|
||||
scheduler = new Fifo();
|
||||
else
|
||||
@@ -90,7 +105,7 @@ public:
|
||||
{
|
||||
case Command::Read:
|
||||
rec.recordPhase(payload, BEGIN_RD, command.getStart());
|
||||
dataStrobe = command.getIntervalOnDataStrobe();
|
||||
dataStrobe = command.getIntervalOnDataStrobe();
|
||||
rec.updateDataStrobe(dataStrobe.start, dataStrobe.end, payload);
|
||||
rec.recordPhase(payload, END_RD, command.getEnd());
|
||||
|
||||
@@ -99,7 +114,7 @@ public:
|
||||
break;
|
||||
case Command::ReadA:
|
||||
rec.recordPhase(payload, BEGIN_RDA, command.getStart());
|
||||
dataStrobe = command.getIntervalOnDataStrobe();
|
||||
dataStrobe = command.getIntervalOnDataStrobe();
|
||||
rec.updateDataStrobe(dataStrobe.start, dataStrobe.end, payload);
|
||||
rec.recordPhase(payload, END_RDA, command.getEnd());
|
||||
|
||||
@@ -108,7 +123,7 @@ public:
|
||||
break;
|
||||
case Command::Write:
|
||||
rec.recordPhase(payload, BEGIN_WR, command.getStart());
|
||||
dataStrobe = command.getIntervalOnDataStrobe();
|
||||
dataStrobe = command.getIntervalOnDataStrobe();
|
||||
rec.updateDataStrobe(dataStrobe.start, dataStrobe.end, payload);
|
||||
rec.recordPhase(payload, END_WR, command.getEnd());
|
||||
|
||||
@@ -117,7 +132,7 @@ public:
|
||||
break;
|
||||
case Command::WriteA:
|
||||
rec.recordPhase(payload, BEGIN_WRA, command.getStart());
|
||||
dataStrobe = command.getIntervalOnDataStrobe();
|
||||
dataStrobe = command.getIntervalOnDataStrobe();
|
||||
rec.updateDataStrobe(dataStrobe.start, dataStrobe.end, payload);
|
||||
rec.recordPhase(payload, END_WRA, command.getEnd());
|
||||
|
||||
|
||||
@@ -39,7 +39,7 @@ Simulation::Simulation(sc_module_name name, string pathToResources, string trace
|
||||
for (auto& d : devices)
|
||||
{
|
||||
if (d.burstLength == 0)
|
||||
d.burstLength = 8;
|
||||
d.burstLength = Configuration::getInstance().BurstLength;
|
||||
}
|
||||
|
||||
player1 = new TracePlayer<>("player1", pathToResources + string("traces/") + devices[0].trace,
|
||||
|
||||
@@ -29,7 +29,7 @@ struct DramSetup
|
||||
struct Device
|
||||
{
|
||||
Device():trace("empty.stl"), burstLength(0){}
|
||||
Device(std::string trace, unsigned int burstLength = 0) : trace(trace), burstLength(burstLength)
|
||||
Device(std::string trace, unsigned int burstLength = 4) : trace(trace), burstLength(burstLength)
|
||||
{
|
||||
}
|
||||
std::string trace;
|
||||
|
||||
@@ -73,6 +73,7 @@ bool batchSetups(pair<string, string> tracePair, vector<DramSetup> setups)
|
||||
int sc_main(int argc, char **argv)
|
||||
{
|
||||
sc_set_time_resolution(1, SC_PS);
|
||||
|
||||
|
||||
resources = pathOfFile(argv[0]) + string("/../resources/");
|
||||
|
||||
|
||||
Reference in New Issue
Block a user