alpha_cpu_builder.cc

来自「linux下基于c++的处理器仿真平台。具有处理器流水线」· CC 代码 · 共 397 行

CC
397
字号
/* * Copyright (c) 2004, 2005 * The Regents of The University of Michigan * All Rights Reserved * * This code is part of the M5 simulator, developed by Nathan Binkert, * Erik Hallnor, Steve Raasch, and Steve Reinhardt, with contributions * from Ron Dreslinski, Dave Greene, Lisa Hsu, Kevin Lim, Ali Saidi,  * and Andrew Schultz. * * Permission is granted to use, copy, create derivative works and * redistribute this software and such derivative works for any * purpose, so long as the copyright notice above, this grant of * permission, and the disclaimer below appear in all copies made; and * so long as the name of The University of Michigan is not used in * any advertising or publicity pertaining to the use or distribution * of this software without specific, written prior authorization. * * THIS SOFTWARE IS PROVIDED AS IS, WITHOUT REPRESENTATION FROM THE * UNIVERSITY OF MICHIGAN AS TO ITS FITNESS FOR ANY PURPOSE, AND * WITHOUT WARRANTY BY THE UNIVERSITY OF MICHIGAN OF ANY KIND, EITHER * EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE. THE REGENTS OF THE UNIVERSITY OF MICHIGAN SHALL NOT BE * LIABLE FOR ANY DAMAGES, INCLUDING DIRECT, SPECIAL, INDIRECT, * INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WITH RESPECT TO ANY CLAIM * ARISING OUT OF OR IN CONNECTION WITH THE USE OF THE SOFTWARE, EVEN * IF IT HAS BEEN OR IS HEREAFTER ADVISED OF THE POSSIBILITY OF SUCH * DAMAGES. */#include "base/inifile.hh"#include "base/loader/symtab.hh"#include "base/misc.hh"#include "cpu/base.hh"#include "cpu/exec_context.hh"#include "cpu/exetrace.hh"#include "cpu/o3/alpha_cpu.hh"#include "cpu/o3/alpha_impl.hh"#include "mem/base_mem.hh"#include "mem/cache/base_cache.hh"#include "mem/mem_interface.hh"#include "sim/builder.hh"#include "sim/debug.hh"#include "sim/host.hh"#include "sim/process.hh"#include "sim/sim_events.hh"#include "sim/sim_object.hh"#include "sim/stats.hh"#if FULL_SYSTEM#include "base/remote_gdb.hh"#include "mem/functional/memory_control.hh"#include "mem/functional/physical.hh"#include "sim/system.hh"#include "targetarch/alpha_memory.hh"#include "targetarch/vtophys.hh"#else // !FULL_SYSTEM#include "mem/functional/functional.hh"#endif // FULL_SYSTEMclass DerivAlphaFullCPU : public AlphaFullCPU<AlphaSimpleImpl>{  public:    DerivAlphaFullCPU(AlphaSimpleParams p)        : AlphaFullCPU<AlphaSimpleImpl>(p)    { }};BEGIN_DECLARE_SIM_OBJECT_PARAMS(DerivAlphaFullCPU)    Param<int> clock;    Param<int> numThreads;#if FULL_SYSTEMSimObjectParam<System *> system;Param<int> cpu_id;SimObjectParam<AlphaITB *> itb;SimObjectParam<AlphaDTB *> dtb;#elseSimObjectVectorParam<Process *> workload;#endif // FULL_SYSTEMSimObjectParam<FunctionalMemory *> mem;Param<Counter> max_insts_any_thread;Param<Counter> max_insts_all_threads;Param<Counter> max_loads_any_thread;Param<Counter> max_loads_all_threads;SimObjectParam<BaseCache *> icache;SimObjectParam<BaseCache *> dcache;Param<unsigned> decodeToFetchDelay;Param<unsigned> renameToFetchDelay;Param<unsigned> iewToFetchDelay;Param<unsigned> commitToFetchDelay;Param<unsigned> fetchWidth;Param<unsigned> renameToDecodeDelay;Param<unsigned> iewToDecodeDelay;Param<unsigned> commitToDecodeDelay;Param<unsigned> fetchToDecodeDelay;Param<unsigned> decodeWidth;Param<unsigned> iewToRenameDelay;Param<unsigned> commitToRenameDelay;Param<unsigned> decodeToRenameDelay;Param<unsigned> renameWidth;Param<unsigned> commitToIEWDelay;Param<unsigned> renameToIEWDelay;Param<unsigned> issueToExecuteDelay;Param<unsigned> issueWidth;Param<unsigned> executeWidth;Param<unsigned> executeIntWidth;Param<unsigned> executeFloatWidth;Param<unsigned> executeBranchWidth;Param<unsigned> executeMemoryWidth;Param<unsigned> iewToCommitDelay;Param<unsigned> renameToROBDelay;Param<unsigned> commitWidth;Param<unsigned> squashWidth;#if 0Param<unsigned> localPredictorSize;Param<unsigned> localPredictorCtrBits;#endifParam<unsigned> local_predictor_size;Param<unsigned> local_ctr_bits;Param<unsigned> local_history_table_size;Param<unsigned> local_history_bits;Param<unsigned> global_predictor_size;Param<unsigned> global_ctr_bits;Param<unsigned> global_history_bits;Param<unsigned> choice_predictor_size;Param<unsigned> choice_ctr_bits;Param<unsigned> BTBEntries;Param<unsigned> BTBTagSize;Param<unsigned> RASSize;Param<unsigned> LQEntries;Param<unsigned> SQEntries;Param<unsigned> LFSTSize;Param<unsigned> SSITSize;Param<unsigned> numPhysIntRegs;Param<unsigned> numPhysFloatRegs;Param<unsigned> numIQEntries;Param<unsigned> numROBEntries;Param<unsigned> instShiftAmt;Param<bool> defer_registration;Param<bool> function_trace;Param<Tick> function_trace_start;END_DECLARE_SIM_OBJECT_PARAMS(DerivAlphaFullCPU)BEGIN_INIT_SIM_OBJECT_PARAMS(DerivAlphaFullCPU)    INIT_PARAM(clock, "clock speed"),    INIT_PARAM(numThreads, "number of HW thread contexts"),        #if FULL_SYSTEM    INIT_PARAM(system, "System object"),    INIT_PARAM(cpu_id, "processor ID"),    INIT_PARAM(itb, "Instruction translation buffer"),    INIT_PARAM(dtb, "Data translation buffer"),#else    INIT_PARAM(workload, "Processes to run"),#endif // FULL_SYSTEM    INIT_PARAM_DFLT(mem, "Memory", NULL),        INIT_PARAM_DFLT(max_insts_any_thread,                    "Terminate when any thread reaches this inst count",                    0),    INIT_PARAM_DFLT(max_insts_all_threads,                    "Terminate when all threads have reached"                    "this inst count",                     0),    INIT_PARAM_DFLT(max_loads_any_thread,                    "Terminate when any thread reaches this load count",                    0),    INIT_PARAM_DFLT(max_loads_all_threads,                    "Terminate when all threads have reached this load"                    "count",                    0),        INIT_PARAM_DFLT(icache, "L1 instruction cache", NULL),    INIT_PARAM_DFLT(dcache, "L1 data cache", NULL),    INIT_PARAM(decodeToFetchDelay, "Decode to fetch delay"),    INIT_PARAM(renameToFetchDelay, "Rename to fetch delay"),    INIT_PARAM(iewToFetchDelay, "Issue/Execute/Writeback to fetch"               "delay"),    INIT_PARAM(commitToFetchDelay, "Commit to fetch delay"),    INIT_PARAM(fetchWidth, "Fetch width"),        INIT_PARAM(renameToDecodeDelay, "Rename to decode delay"),    INIT_PARAM(iewToDecodeDelay, "Issue/Execute/Writeback to decode"               "delay"),    INIT_PARAM(commitToDecodeDelay, "Commit to decode delay"),    INIT_PARAM(fetchToDecodeDelay, "Fetch to decode delay"),    INIT_PARAM(decodeWidth, "Decode width"),        INIT_PARAM(iewToRenameDelay, "Issue/Execute/Writeback to rename"               "delay"),    INIT_PARAM(commitToRenameDelay, "Commit to rename delay"),    INIT_PARAM(decodeToRenameDelay, "Decode to rename delay"),    INIT_PARAM(renameWidth, "Rename width"),        INIT_PARAM(commitToIEWDelay, "Commit to "               "Issue/Execute/Writeback delay"),    INIT_PARAM(renameToIEWDelay, "Rename to "               "Issue/Execute/Writeback delay"),    INIT_PARAM(issueToExecuteDelay, "Issue to execute delay (internal"               "to the IEW stage)"),    INIT_PARAM(issueWidth, "Issue width"),    INIT_PARAM(executeWidth, "Execute width"),    INIT_PARAM(executeIntWidth, "Integer execute width"),    INIT_PARAM(executeFloatWidth, "Floating point execute width"),    INIT_PARAM(executeBranchWidth, "Branch execute width"),    INIT_PARAM(executeMemoryWidth, "Memory execute width"),        INIT_PARAM(iewToCommitDelay, "Issue/Execute/Writeback to commit "               "delay"),    INIT_PARAM(renameToROBDelay, "Rename to reorder buffer delay"),    INIT_PARAM(commitWidth, "Commit width"),    INIT_PARAM(squashWidth, "Squash width"),    #if 0    INIT_PARAM(localPredictorSize, "Size of the local predictor in entries. "               "Must be a power of 2."),    INIT_PARAM(localPredictorCtrBits, "Number of bits per counter for bpred"),#endif    INIT_PARAM(local_predictor_size, "Size of local predictor"),    INIT_PARAM(local_ctr_bits, "Bits per counter"),    INIT_PARAM(local_history_table_size, "Size of local history table"),    INIT_PARAM(local_history_bits, "Bits for the local history"),    INIT_PARAM(global_predictor_size, "Size of global predictor"),    INIT_PARAM(global_ctr_bits, "Bits per counter"),    INIT_PARAM(global_history_bits, "Bits of history"),    INIT_PARAM(choice_predictor_size, "Size of choice predictor"),    INIT_PARAM(choice_ctr_bits, "Bits of choice counters"),    INIT_PARAM(BTBEntries, "Number of BTB entries"),    INIT_PARAM(BTBTagSize, "Size of the BTB tags, in bits"),    INIT_PARAM(RASSize, "RAS size"),    INIT_PARAM(LQEntries, "Number of load queue entries"),    INIT_PARAM(SQEntries, "Number of store queue entries"),    INIT_PARAM(LFSTSize, "Last fetched store table size"),    INIT_PARAM(SSITSize, "Store set ID table size"),    INIT_PARAM(numPhysIntRegs, "Number of physical integer registers"),    INIT_PARAM(numPhysFloatRegs, "Number of physical floating point "               "registers"),    INIT_PARAM(numIQEntries, "Number of instruction queue entries"),    INIT_PARAM(numROBEntries, "Number of reorder buffer entries"),    INIT_PARAM(instShiftAmt, "Number of bits to shift instructions by"),    INIT_PARAM(defer_registration, "defer system registration (for sampling)"),    INIT_PARAM(function_trace, "Enable function trace"),    INIT_PARAM(function_trace_start, "Cycle to start function trace")    END_INIT_SIM_OBJECT_PARAMS(DerivAlphaFullCPU)CREATE_SIM_OBJECT(DerivAlphaFullCPU){    DerivAlphaFullCPU *cpu;#if FULL_SYSTEM    // Full-system only supports a single thread for the moment.    int actual_num_threads = 1;#else    // In non-full-system mode, we infer the number of threads from    // the workload if it's not explicitly specified.    int actual_num_threads =	numThreads.isValid() ? numThreads : workload.size();    if (workload.size() == 0) {	fatal("Must specify at least one workload!");    }             #endif    AlphaSimpleParams params;    params.clock = clock;    params.name = getInstanceName();    params.numberOfThreads = actual_num_threads;    #if FULL_SYSTEM    params.system = system;    params.cpu_id = cpu_id;    params.itb = itb;     params.dtb = dtb;#else    params.workload = workload;#endif // FULL_SYSTEM        params.mem = mem;        params.max_insts_any_thread = max_insts_any_thread;    params.max_insts_all_threads = max_insts_all_threads;    params.max_loads_any_thread = max_loads_any_thread;    params.max_loads_all_threads = max_loads_all_threads;        //    // Caches    //    params.icacheInterface = icache ? icache->getInterface() : NULL;    params.dcacheInterface = dcache ? dcache->getInterface() : NULL;        params.decodeToFetchDelay = decodeToFetchDelay;    params.renameToFetchDelay = renameToFetchDelay;    params.iewToFetchDelay = iewToFetchDelay;    params.commitToFetchDelay = commitToFetchDelay;    params.fetchWidth = fetchWidth;        params.renameToDecodeDelay = renameToDecodeDelay;    params.iewToDecodeDelay = iewToDecodeDelay;    params.commitToDecodeDelay = commitToDecodeDelay;    params.fetchToDecodeDelay = fetchToDecodeDelay;    params.decodeWidth = decodeWidth;        params.iewToRenameDelay = iewToRenameDelay;    params.commitToRenameDelay = commitToRenameDelay;    params.decodeToRenameDelay = decodeToRenameDelay;    params.renameWidth = renameWidth;        params.commitToIEWDelay = commitToIEWDelay;    params.renameToIEWDelay = renameToIEWDelay;    params.issueToExecuteDelay = issueToExecuteDelay;    params.issueWidth = issueWidth;    params.executeWidth = executeWidth;    params.executeIntWidth = executeIntWidth;    params.executeFloatWidth = executeFloatWidth;    params.executeBranchWidth = executeBranchWidth;    params.executeMemoryWidth = executeMemoryWidth;        params.iewToCommitDelay = iewToCommitDelay;    params.renameToROBDelay = renameToROBDelay;    params.commitWidth = commitWidth;    params.squashWidth = squashWidth;#if 0        params.localPredictorSize = localPredictorSize;    params.localPredictorCtrBits = localPredictorCtrBits;#endif    params.local_predictor_size = local_predictor_size;    params.local_ctr_bits = local_ctr_bits;    params.local_history_table_size = local_history_table_size;    params.local_history_bits = local_history_bits;    params.global_predictor_size = global_predictor_size;    params.global_ctr_bits = global_ctr_bits;    params.global_history_bits = global_history_bits;    params.choice_predictor_size = choice_predictor_size;    params.choice_ctr_bits = choice_ctr_bits;    params.BTBEntries = BTBEntries;    params.BTBTagSize = BTBTagSize;    params.RASSize = RASSize;    params.LQEntries = LQEntries;    params.SQEntries = SQEntries;    params.SSITSize = SSITSize;    params.LFSTSize = LFSTSize;        params.numPhysIntRegs = numPhysIntRegs;    params.numPhysFloatRegs = numPhysFloatRegs;    params.numIQEntries = numIQEntries;    params.numROBEntries = numROBEntries;    params.instShiftAmt = 2;    params.defReg = defer_registration;    params.functionTrace = function_trace;    params.functionTraceStart = function_trace_start;    cpu = new DerivAlphaFullCPU(params);    return cpu;}REGISTER_SIM_OBJECT("DerivAlphaFullCPU", DerivAlphaFullCPU)

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?