introduction to c programming
DESCRIPTION
Introduction to C Programming. Final Project: LC-3 CPU Control Unit Simulator. 題目簡介. Brief introduction to the project. LC-3 CPU Control Unit. 目標: 用軟體實作 LC-3 CPU 的行為 自 Binary file 讀取指令 依序 Fetch 、 Decode 指令 再來若該指令有需要 Evaluate address 、 Fetch operand 則 Evaluate address 、 Fetch operand - PowerPoint PPT PresentationTRANSCRIPT
Introduction to C Programming Final Project: LC-3 CPU Control Unit Simulator
題目簡介Brief introduction to the project
LC-3 CPU Control Unit
•目標:•用軟體實作 LC-3 CPU的行為•自 Binary file讀取指令•依序 Fetch、 Decode指令•再來若該指令有需要 Evaluate address、 Fetch operand則 Evaluate address、 Fetch operand
• Execute該指令•將結果 Store到 Register或Memory。
LC-3 CPU Control Unit• 會以輸入一個 Binary file的方式作為 input(讀取方式可參考 C語言 Ch8投影片讀取 Binary file之方式)
• 輸出結果是將每次指令單步執行( PC=PC+1)時,當下Register、Memory的值印出到檔案
• Memory大小是由題目指定的,可使用 Array來模擬Memory
• 關於 LC-3 CPU控制單元的行為請參考 LC-3 Ch4投影片• 關於 LC-3每種指令的行為請參考 LC-3 Ch5投影片• 我們實際上不會實作全部的指令,要實作哪些指令、有哪些詳細的規格、配分在投影片後面會詳述
需要模擬的指令The instructions which should be simulated
數學運算指令( 70%)• ADD• AND• NOT
Load/Store指令( 15%)• LOAD類
• LD• LDI• LDR• LEA
• STORE類• ST• STI• STR
分支類與軟體中斷指令( 15%)• Software Interrupt
• TRAP
• Return• RET
• Unconditional branch• JMP• JSR• JSRR
• Conditional branch• BR(n)(z)(p)
註: RET指令敘述
摘錄自” Introduction to Computer Systems”,Patt and Patel, 2nd Ed., p536
備註• 只有被列出來的指令需要模擬• 每個指令的行為請參考 LC-3投影片的 Ch5投影片,但是若 Spec上有修改部分指令的行為時,請依照 Spec的修改來實作
實作講解Hint of implementation
實作講解與範例• 在實作的時候,基本上是按照下面這個流程圖來實作
• Step 1:自我們提供的 input.bin當中,每 16-bit切出一道指令,將檔案中的指令全部收集
• Step 2:將剛才收集到的指令依序放入你用軟體模擬的記憶體當中,從 0x0030的位置開始依序放入
• Step 3 & 4:模擬 CPU行為、並把 PC每移動一次時, Register和Memory的值印到檔案中
自input.bin中讀入指令
全部讀完後寫入用軟體模擬的記憶體(Loader)
自0x0030開始逐步模擬CPU行為
(CPU模擬)
把全部結果輸出到
ouput.txt
如何自 Binary file讀取指令?• 真正編譯器編譯出的 Binary file除了程式碼外,還會帶有相當多其他的資訊,在這邊就不詳加討論。
• 我們所提供的 Binary file會是一個相當簡化的 Binary file,裡頭只有指令的部份,是以 0101的方式儲存,注意不是用純文字的方式儲存,所以你在讀取檔案的時候,必須要用Read Binary File的方式讀取。
• 若你要自 Binary file當中讀取指令,你要以每 16-bit為一個單位切出指令出來,然後把切出來的指令的值存起來,即可切出一道指令。
CPU Control Unit模擬• 在實作 CPU Control Unit的時候,基本上是按照下面這張
State Diagram來用軟體實作,前段是 Fetch與移動 PC的部份、再來 Decode,決定是屬於哪類指令,再來分別實作
圖片取自:” Introduction to Computer Systems”,Patt and Patel, 2nd Ed., 投影片 Ch4第22頁
如何看著 Ch5的指令敘述用軟體實作?•在下面的範例當中,我們假設同學已經完成前段自 Binary檔案 Load到Memory的部份、Decode OP code的部份,我們只會給大家看如何看著一個 Instruction的描述,來實作其行為。(但同學在實作的時候,前面自Binary檔案 Load到Memory的部份、 Decode OP code的部份仍然要自己實作)
範例: NOT指令
• 假設同學已經 Decode IR[15:12]的 OP code,知道這道指令是 NOT,由下面的圖可看出,他是要把 Source register裡面的值拿出來取 NOT,然後寫回 Destination register裡。
Note: Src and Dstcould be the same register.
圖片取自:” Introduction to Computer Systems”,Patt and Patel, 2nd Ed., 投影片 Ch5第 6頁
• 由於 NOT指令只需要 Fetch Operand、 Execute和 Store回 Register File,故我們在實作的時候只需要實作這些部分,你可以針對 NOT指令的模擬寫一個 emu_not如下:
• 其中的 fetch_not_operand、 exec_not、 store_not的內容在下幾頁投影片會解釋
• [註 ]: u16是我們範例程式中自行定義的: typedef unsigned short,其長度為 16-bit
• 首先,要先 fetch這道指令的 Operand,所以我們寫一個fetch_not_operand的函式,輸入參數為該道指令,回傳值為 operand, operand是一個 structure,裡面包含src1、 src2和 dst,在這個案例中,因為只有一個 source register,所以只填入 src1和 dst。
• 我們把原本 instruction中 instr[8:6]的值取出來作為 Source register的編號,把 instr[11:9]的值取出來作為 Destination register的編號
• 接下來,執行 NOT指令應該要做的事情,也就是把Source Register的值取出來,然後做「 NOT 」邏輯運算,然後回傳回去。
• 最後,把 NOT 邏輯運算出來的結果,寫到 Register File當中的 Destination Register。即完成此指令的行為模擬。
• [註 ] 我們有提供 NOT指令的範例程式碼片段,你可以直接擷取此部份的程式碼到你自己的程式中,也可以自己實作。但是不論如何,最後 Demo的時候你的程式必須也要能執行 NOT指令
題目規格Spec
Spec• 輸入檔案會是一個簡化後的可執行檔,以二進位儲存資料的一個檔案。
• 你必須先將指令 Load 進來放到用軟體模擬的Memory的0x0030的地方,將每道指令依序放置(第一道指令在0x0030、第二道在 0x0031 等等依序排放)
• 要執行的時候,自 0x0030的指令開始執行(初始PC=0x0030),除非遇到 Branch類指令,不然就是依序往下執行( PC=PC+1),遇到 Branch類指令則依照Branch類指令的行為決定執行順序
• TRAP指令所定址的 Vector Address是從 0x0070~0x007F
Spec• 在每執行一道指令後,把當時的結果輸出到檔案,格式請按照後面 Sample output file當中的格式輸出,輸出時請將執行完後當下的 PC、 R0~R7的值印出,Memory當中的值只要印出 0x0000~0x002F的部份即可。
• 在輸入檔案當中的指令全部被執行完畢後,結束程式
Spec• 你要用軟體模擬的Memory大小請以 0x0000~0x007F(請注意是 16 進位)為準,其中 0x0000到 0x002F是給保留給程式當做資料儲存用的, 0x0030到 0x006F是拿來存放程式碼的, 0x0070到 0x007F是拿來存放 Trap的 Vector內容的。在實作上,可用 Array來模擬Memory即可,不需要模擬更細部的記憶體硬體行為。
• 不需要考慮真正 LC-3當中 Supervisor mode和 Non-supervisor mode的差別。
• 不需要考慮真正 LC-3當中,對高位與低位Memory space的權限控制。
• 不需要考慮 Hardware Interrupt的部份。• 輸入檔案名稱為 input.bin、輸出檔案名稱為 output.txt,檔名直接寫定在程式碼當中即可。
Spec• 由於範例 input是以 binary的形式存在,所以不方便直接
顯示,我們下面的內容是寫出 input.bin其原始組合語言的方式來顯示,並且顯示出當輸入這個 input.bin時,你應該寫入到 output.txt的內容。範例 input.bin和範例 output.txt之後會在 iLMS上公布。
• 你的程式的輸出格式必須依照 Spec上所規定的格式輸出• 範例 input.bin的組合語言內容:
• NOT r1, r0• NOT r2, r0
Spec• 範例 output.txt輸出內容(第一頁):
Spec• 範例 output.txt輸出內容(第二頁):
加分題Bonus
Bonus-1: Live coding• 我們會在 Demo 現場新增新的 Instruction type,當場公布該新增的 Instruction之 Encode方式與指令邏輯行為,有要 Demo Bonus-1的人會需助教面前現場修改自己的程式碼,若在 10分鐘內可以順利讀取並且模擬新增的Instruction type的行為, 即可取得此 Bonus分數。若超過10分鐘還沒寫出來,則就無法取得此 Bonus分數。
• Live coding 環境可使用自己的筆電、遠端桌面或是工作站等熟悉的環境
• 要 Demo Bonus-1的人需要在填寫 Demo timetable的時候就告知助教說要 Demo Bonus。
Bonus-2: Disassembler 反組譯器• 此部份為事先完成的,不是 Live coding• 將輸入的 Binary file,輸出成對應的組合語言程式碼• 輸入檔案: Binary file• 輸出檔案: Assembly language file(純文字檔,內容是組
合語言)• 裡面遇到 Label的部份,在 Generate 組合語言檔案的時候,可自行取 Label 名稱,只要符合原始輸入的 Binary file的程式行為即可。
評分方式與繳交期限Grading policy & Deadline
Grading policy• 運算類指令: 70%• Load/Store類指令: 15%• Branch類與軟體中斷指令: 15%
• Bonus-1-Live coding: 10%• Bonus-2-Disassembler: 5%
Deadline
• 2013/01/24• Final Project不接受補交,若當天不能來Demo的人請先寄信過來提早 Demo。