2009年4月23日 星期四

新手的simplescalar程式debug注意事項

以下列出過去數個月所遇到的各種狗屁倒灶的BUG起因,
作為以後寫程式的慘痛教訓:

  • 修改過的simplescalar可以編譯,但執行一半跑出segmentation error的可能原因
1.對於md_print_insn的錯誤引用,特別是給他錯誤的IR編碼和(或)PC值
2.(猜測)對於fprintf, myfprintf,函數的錯誤引用
  • simplescalar可以編譯,但執行一半跑出floating number error的可能原因:
(ctb_tail + ctb_size -1 ) % ctb_size同餘運算式中的被除數不可為負數!!
  • 所有的Circular que資料結構動作異常的可能原因:
(ctb_tail+1) % ctb_size <--- 注意是否把size誤植成num
  • simplescalar仰賴在ID級對fetch_pred_PC和regs.regs_PC作比對的結果來決定是否進入spec_mode,所以要小心保持fetchQ裡面每個指令所記錄的fetch_pred_PC和下一個指令的PC為連續的才不會造成CPU暴走
  • simplescalar-ARM的Fault種類:
enum md_fault_type {
md_fault_none = 0, /* no fault */
md_fault_access, /* storage access fault */
md_fault_alignment, /* storage alignment fault */
md_fault_overflow, /* signed arithmetic overflow fault */
md_fault_div0, /* division by zero fault */
md_fault_invalid, /* invalid arithmetic operation */
/* added to allow SQRT{S,T} in FIX exts */
md_fault_break, /* BREAK instruction fault */
md_fault_unimpl, /* unimplemented instruction fault */
md_fault_internal /* internal S/W fault */
};
  • simple-ARM將「控制指令」分2部份處理,在Dispatch級當中的fetch_redirect判別部份處理包括MOV在內對PC寫入產生的跳躍動作;另外在稍後的spec_mode別部份處理BR/BRL這2種典型的控制指令。
fetch_redirect會直接重設Fetch級,導向正確的NextPC,而spec_mode則是啟動spec標籤,讓writeback級去觸發recover事件重設整個pipeline才導向正確的NextPC

沒有留言:

張貼留言