Introduction to Programming

Report
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 Dst
could 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和Nonsupervisor 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。

similar documents