使用Verilog HDL與Modelsim模擬器,以ALU Design 為基礎,
設計一個Pipelined MIPS-Lite CPU,
內含16道指令(add, sub, and, or, sll, slt, lw, sw, beq, bne, j, multu, mfhi, mflo, nop)。
此為團隊作品,分工上程式碼全部由本人撰寫,組員負責報告撰寫及繪製架構圖。
Windows10
ModelSim PE Student Edition 10.4a
修改data_mem.txt及instr_mem.txt內容
data_mem.txt為設置資料內容
instr_mem.txt則為指定執行之指令內容
使用ModelSim創建project
對tb_Pipelined.v進行模擬
(1) ALU
以32個1-bit ALU組成32-bits ALU,
具有32-bits AND、OR、ADD、SUB、SLT的功能,
惟多一個ctl的控制訊號輸入,此訊號為alu_ctl的output ALUOperation,
共三位元,最低兩個位元當作ALU_1bit的sel,最高位元為binvert的輸入。
(2) Shifter
以160個二對一多工器(Barrel shifter)實現32位元之移位,
用於sll指令,包含於alu模組中。
(3) Multiplier 實現32位元乘法,需透過alu_ctl控制訊號操作。
使用always block偵測時脈變化,由alu_ctl的MUL訊號控制做乘法或輸出,
若訊號為1’b1,開始做乘法運算,32 cycles後將結果輸出。
(4) alu_ctl
根據ALUOp及Funct訊號決定ALUOperation以配送至ALU。
ALUOp為00時表強制加法,01為強制減法,
若為10則靠Funct判斷ALU的操作(ALUOperation)。
(5) Control_pipelined
根據6 bits的opcode產生對應的控制訊號:
RegDst ALUSrc MemtoReg RegWrite MemRead MemWrite Branch Jump ALUOp
R_FORMAT 1 0 0 1 1 0 0 0 10
LW 0 1 1 1 1 0 0 0 00
SW x 1 x 0 0 1 0 0 00
BEQ x 0 x 0 0 0 1 0 01
J x 0 x 0 0 0 1 1 01
(6) Add32
實現32位元加法,此模組用於PC及branch的位址加法。
(7) branch
根據Branch及Zero訊號給定PCSrc的值,PCSrc為是否執行branch的依據。
(8) Memory
依據MemRead及MemWrite控制Memory的寫入或讀取,
若( MemRead, MemWrite ) = ( 0, 1 ),執行寫入的功能,將wd寫入至mem[ addr ]。
若( MemRead, MemWrite ) = ( 1, 0 ),執行讀取的功能,表需寫回Register File,將mem[ addr ]傳給rd。
(9) mips_pipelined
整合所有module以及處理訊號傳送。
(10) mux2
二對一多工器,根據訊號擇一輸出,主要用在選擇PC要fetch下一道指令
的位址、ALU的operand2輸入、欲寫回的暫存器以及內容。
(11) Mux3
三對一多工器,用於選擇EX階的運算結果(Hi/Lo/alu)。
(12) Reg_file
儲存暫存器內容,以及負責暫存器資料之寫入與讀取。
(13) Reg32
32位元暫存器,在此當作PC使用。
(14) Sign_extend
將16位元的立即值做有號數擴充成32位元。
(15) IF_ID
IF階與ID階間的暫存器,在clk為posedge時更新其儲存資料。存放IF階欲傳送至ID階之資料。
(16) ID_EX
ID階與EX階間的暫存器,在clk為posedge時更新其儲存資料。存放IF階欲傳送至ID階之資料。
(17) EX_MEM
EX階與MEM階間的暫存器,在clk為posedge時更新其儲存資料。存放IF階欲傳送至ID階之資料。
(18) MEM_WB
MEM階與WB階間的暫存器,在clk為posedge時更新其儲存資料。存放IF階欲傳送至ID階之資料。
(19) tb_pipelined
依序將instruction memory、data memory以及register file設定初始值。
接著以迴圈的方式讀input檔,並判斷目前訊號為何者,
輸出該模組實作之相對應答案。同時控制時脈與決定延遲時間,才能順利輸出正確結果。
<1> sw $zero, $s2, 24
<2> lw $s1, $t7, 0
<3> addiu $s2, $s0, 3
<4> sll $s3, $s0, 2
<5> and $s1, $s0, $s1
<6> slt $t0, $s3, $s4
<7> add $s2, $s0, $s2
<8> sub $s2, $s0, $s2
<9> or $s2, $s0, $s2
<10> beq $t7, $s2, 3
<11> bne $t7, $s2, 3
上方為11道指令於terminal輸出的結果,能觀察出指令之暫存器數值與輸出結果相符合。
下方為11道指令顯示之waveform圖形。