今回は、シミュレータ部のソースコードOVPsim_single_arm_Cortex-A9UP.cです。
まずは、デバッグ有効にするかどうかの処理。デバッグするときは、ポート番号を指定する。
if(enableDebug) {
icmInit(icmAttrs,"rsp", portNum);
} else {
icmInit(icmAttrs, 0 , 0);
}
プロセッサのインスタンスを定義する部分です。// create a processor instance icmProcessorP processor = icmNewProcessor( "cpu0", // CPU name "arm", // CPU type 0, // CPU cpuId 0, // CPU model flags 32, // address bits armModel, // model file "modelAttrs", // morpher attributes SIM_ATTRS, // attributes icmAttr, // user-defined attributes armSemihost, // semi-hosting file "modelAttrs" // semi-hosting attributes );
第 1引数:CPUの名称、プログラム内ではユニーク
第 2引数:CPUのタイプ、モデル内で定義されたアーキテクチャ名
第 3引数:CPU ID、0から始まるID、プログラム内ではユニーク
第 4引数:CPUモデルに対するフラグ、各モデルに対応したフラグを指定できる
第 5引数:アドレス幅
第 6引数:モデルファイル
第 2引数:CPUのタイプ、モデル内で定義されたアーキテクチャ名
第 3引数:CPU ID、0から始まるID、プログラム内ではユニーク
第 4引数:CPUモデルに対するフラグ、各モデルに対応したフラグを指定できる
第 5引数:アドレス幅
第 6引数:モデルファイル
ARMモデルを使うときは、下記のコードをお呪いだと思って使えばいいと思う。
const char *armModel = icmGetVlnvString(NULL,
"arm.ovpworld.org",
"processor",
"arm",
"1.0",
"model");
第 7引数:モデルのアトリビュート // enable relaxed scheduling for maximum performance
#define SIM_ATTRS (ICM_ATTR_RELAXED_SCHED)
第 8引数:ユーザ定義のアトリビュート icmAttrListP icmAttr = icmNewAttrList();
icmAddStringAttr(icmAttr, "endian", "little");
icmAddStringAttr(icmAttr, "compatibility", "nopSVC");
icmAddStringAttr(icmAttr, "variant", variant);
icmAddStringAttr(icmAttr, "UAL", "1");
第 9引数:semi-hostingのファイル名第10引数:semi-hostingのアトリビュート
ARMモデルを使うときは、下記のコードをお呪いだと思って使えばいいと思う。
const char *armSemihost = icmGetVlnvString(NULL,
"arm.ovpworld.org",
"semihosting",
"armNewlib",
"1.0",
"model");
CPUでデバッグをするときは、次のようなコードでデバッガと接続する。
デバッグするCPUモデル(proc)に対して、デバッグを有効にする(icmDebugThisProcess関数)
プログラムは外部ROMではなく、プロセッサの内部ROMにストアされる。
デバッグするCPUモデル(proc)に対して、デバッグを有効にする(icmDebugThisProcess関数)
char coreName[32] = "cpu0"; // set to core name to debug
if(enableDebug) {
icmProcessorP proc = icmFindProcessorByName(coreName);
if(proc) {
// If there's a processor of this name, set this for debug
// This is required for debug using a standard GDB via RSP.
// It's not required for Imperas MPD
icmDebugThisProcessor(proc);
// Reduce the timeslice to minimize multicore scheduling effects
icmSetSimulationTimeSlice(0.00001);
}
}
CPU内部のメモリにアプリケーション(ELFファイル)をロードする。プログラムは外部ROMではなく、プロセッサの内部ROMにストアされる。
// load the application executable file into processor memory space if(!icmLoadProcessorMemory(processor, application, False, False, True)) { return -1; }
CPUを起動(icmSimulatePlatfom)し、正常終了か強制終了(CTRL-C)(icmGetStopReason)を待ち、
CPUを終了される(icmTerminate)。
CPUを終了される(icmTerminate)。
// simulate the platform
icmProcessorP final = icmSimulatePlatform();
// was simulation interrupted or did it complete
if(final && (icmGetStopReason(final)==ICM_SR_INTERRUPT)) {
icmPrintf("*** simulation interrupted\n");
}
icmTerminate();
と、いたって簡単なコードになっています。
検証、Verification、OVP