Thiết kế alu và control theo kiến trúc mips 32 bit
Trang 1ĐẠI HỌC QUỐC GIA TP.HỒ CHÍ MINH TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN
Trang 2Thành phố Hồ Chí Minh – Năm 2015
Trang 3M ỤC LỤC
Mục lục 2
1 Yêu cầu thiết kế 3
2 Tổng quan về mips 3
2.1 Giới thiệu 3
2.2 Kiến trúc tập lệnh MIPs 3
2.3 Các định dạng lệnh cơ bản trong MIPs 4
3 Thiết kế 5
3.1 Phân loại các lệnh cơ bản trong kiến trúc MIPs 5
3.1.1 Các lệnh nạp ghi 5
3.1.2 Các lệnh số học và logic 5
3.1.3 Các lệnh nhảy và rẽ nhánh 6
3.2 Các thành phần của MIPs 6
3.2.1 Program Counter 6
3.2.2 Instruction Memory 7
3.2.3 Register File 9
3.2.4 ALU (Arthmetic- Logic Unit) 10
3.2.5 Data Memory 17
3.2.6 Control Unit 18
3.2.7 Các thành phần khác 19
3.3 Datapath của MIPS CPU 22
3.3.1 Datapath của các lệnh toán học và logic : 22
3.3.2 Datapath của các lệnh nạp, ghi : 24
3.3.3 Datapath của lệnh nhảy : 25
3.3.4 Datapath của MIPs 26
3.4 CPU MIPs Single Cycle 27
4 Mô phỏng 31
4.1 Tập lệnh mô phỏng 31
4.2 Mã máy 32
4.3 Testbench 32
4.4 Kết quả mô phỏng 33
Trang 45 Tài liệu tham khảo 36
Thiết kế một bộ Sigle Cycle MIPs 32bit thực hiện các chức năng:
Thực hiện các phép toán Arithmetic: ADD, SUB, ADDI, SUBI,…
Thực hiện các phép tính logic: AND, OR, NOR, XOR, SLT, ANDI, ORI, XORI,…
Các dự án về RICs đầu tiên bắt đầu từ IBM, Stanford và UC Berkeley vào cuối những năm
70, đầu những năm 80 của thế kỷ trước Hiện nay, các bộ vi xử lý phổ biết là ARM, SuperH, MIPs, SPARC, PIC, PowerPC…
MIPs – Microprocessor without Interlocked Pipeline Stages, là một kiến trúc xử lý kiểu RICs được phát triển bởi MIPS technologies Các bộ vi xử lý MIPs được phát triển như một phầncủa chương trình nghiên cứu VLSI của trường đại học Stanford đầu những năm 80 Nhóm nghiên cứu Stanford đã phát triển một bộ xử lý giảm bớt sự tác động của trình biên dịch ở cấp độphần cứng, trái ngược với sự tăng lên của phần cứng với phần mềm, nó là một bước tiến dài trong quá trình thiết kế phần cứng
Năm 1984, Hennessy rời trường Stanford rời trường Stanford và xây dựng hệ thống máy tính MIPs sau khi nhận ra nhu cầu thương mại tương lai của thiết kế này Phiên bản MIPs R2000 đầu tiên ra đời vào năm 1985 và sau đó là phiên bản MIPs R3000 năm 1988
Kiến trúc MIPs là kiến trúc thanh ghi Tất cả các phép toán số học, logic đều chỉ xoay quanh thanh ghi (hoặc ta có thể xem như một hằng số được lưu trữ như thành phần của lệnh) Kiến trúc MIPs cũng bao gồm các câu lệnh đơn dùng đề đọc dữ liệu từ bộ nhớ vào thanh ghi và ghi dữ liệu từ thanh ghi vào bộ nhớ Vì vậy, kiến trúc MIPs còn được gọi là kiến trúc nạp/lưu do chỉ có những câu lệnh nạp, lưu mới có thể truy cập vào bộ nhớ còn tất cả các câu lệnh khác chỉ
có thể truy cập tới thanh ghi
2.2 KIẾN TRÚC TẬP LỆNH MIPS
Kiến trúc tập lệnh MIPs định nghĩa một tập các câu lệnh 32bit và 64bit để đảm bảo tương thích với mọi bộ xử lý áp dụng kiến trúc MIPs
Trang 5Kiến trúc tập lệnh MIPs (ISA) được phát triển từ kiến trúc tập lệnh MIPsI đến kiến trúc MIPsV Vào cuối những năm 1990, kiến trúc MIPs được thiết kế xung quanh hai kiên trúc cơ bản sau:
MIPs32 cho kiến trúc 32 bit: kiến trúc này dựa vào tập lệnh MIPsII cùng với một vài lệnhđược thêm vào từ tập lệnh MIPsIII, MIPsIV và MIPsV
MIPs64 cho kiến trúc 64 bit: kiến trúc này chủ yếu dựa vào tập lệnh của kiến trúc MIPsVTập lệnh MIPs bao gồm tổng cộng 111 câu lệnh ở hệ 32bit
Máy tính làm việc bằng cách lấy lệnh từ bộ nhớ, giải mã và tính toán chúng Lệnh và các giá trị sẽ được tính toán và mã hóa thành mã nhị phân Máy tính chỉ làm việc với các gia trị nhị phân
Để thực hiện xây dựng một kiến trúc máy tính sử dụng kiến trúc MIPs thì các thành phần
cơ bản phải bao gồm:
Program Counter (PC): Con trỏ chương trình
Instruction Memory: Bộ nhớ lệnh
Data Memory: Bộ nhớ
Register File: Tập thanh ghi
ALU: Bộ tính toán số học và logic
Control Unit: Khối điều khiển
Tất cả các thành phần ngoại trừ Control Unit đều được kết nối với nhau bằng bus Bus là tập hợp đường dẫn điện tử với sự khác nhau về thiết lập giá trị nhị phân được vận chuyển trên đường dẫn đó Hầu hết các bus trong kiến trúc MIPs đều có bề rộng 32bit
2.3 CÁC ĐỊNH DẠNG LỆNH CƠ BẢN TRONG MIPS
Có 3 loại lệnh trong MIPs là:
Register (R-type)
Immediate (I-type)
Jump (J-type)
Trang 6Các lệnh sử dụng các trường sau:
opcode 6bit Xác định mã lệnh
rs 5bit Xác định thanh ghi nguồn
rt 5bit Xác định thanh ghi tạm (nguồn/đích) hoặc
dùng để chỉ ra các hàm trong phạm vi REGIMM của opcode
rd 5bit Xác định thanh ghi đích
Immediate 5bit Dùng cho các toán hạng logic, phép toán có
dấu, nạp/nhớ các byte độ lệch dữ liệu và các dấu hiệu rẽ nhánh
Instr_index 26bit Chỉ số dịch trái 2bit để cung cấp 28 bit thấp
của địa chỉ đích trong lệnh Jump
Bao gồm các lệnh: LW, SW,…
3.1.2 Các lệnh số học và logic
Thực hiện các phép tính số học, logic, dịch chuyển trên các giá trị của các thanh ghi.Các lệnh này bao gồm lệnh có định dạng Register (R-type) và định dạng kiểu Immediate (I-type)
Các lệnh R-type: Add, Sub, SLT, And, Or, Xor, Nor,
Các lệnh I-type: AddI, SubI, AndI, OrI, XorI,…
Trang 73.1.3 Các lệnh nhảy và rẽ nhánh
Các lệnh nhảy và rẽ nhánh (Jump and Branch Instructions) là các lệnh thay đổi dòng kiểm soát của một chương trình Lệnh nhảy luôn được làm đến một trang, dạng địa chỉ tuyệt đối bởi một biên dịch địa chỉ 26-bit, với các bit cao của con trỏ chương trình (kiểu J-type) hoặc địa chỉ thanh ghi (dạng R-type) Các lệnh rẽ nhánh có bù 16-bit liên quan đến con trỏ chương trình (dạng I-type)
Sau một chu kỳ, Program Counter sẽ được tăng lên để có được địa chỉ của lệnh cần thực hiện tiếp theo Trong trường hợp các lệnh thông thường, địa chỉ lưu trong Program Counter sẽ được cộng thêm 4, còn đối với các lệnh nhảy và rẽ nhánh, địa chỉ lưu trong Program Counter sẽ được thay đổi tương ứng với địa chỉ lấy được từ lệnh
Cấu tạo cơ bản của Program Counter là một thanh ghi 32bit Ta có thể xây dựng một Program Counter với 32 D-FlipFlop
module D_FF(q, d, reset, clk, en);
output q;
input d, reset, clk, en;
reg q;
wire clock;
`And and_clk (clock, clk, en);
always@(posedge clock or posedge reset)
Trang 8module Instruction_Memory(Inst_out, Addr_in);
Trang 9temp[31:24] = Inst_Mem [(Addr_in)]; temp[23:16] = Inst_Mem [(Addr_in+1)];
temp[15:8] = Inst_Mem [(Addr_in+2)]; temp[7:0] = Inst_Mem [(Addr_in+3)];
end
endmodule
Trang 103.2.3 Register File
MIPS hỗ trợ 32 thanh ghi đánh số từ $0 - $31, mỗi thanh ghi có kích thước là 32 bit Trong
đó, 8 thanh ghi thường được sử dụng để thực hiện các phép tính được đánh số $16 - $23
$0 $zero Hằng số 0
$1 $at Assembler Temporary
$2 -> $3 $v0 » $v1 Giá trị trả về của hàm hoặc biểu thức
$4 -> $7 $a0 » $a3 Các tham số của hàm
$8 -> $15 $t0 » $t7 Thanh ghi tạm (không giữ giá trị trong quá trình gọi
module Register_File(Read_Data1, Read_Data2, Write_Data, Write_Addr, Reg_Write, clk, Read_Addr1, Read_Addr2);
input [4:0] Read_Addr1; Read_Addr2;
input [4:0] Write_Addr;
input [31:0] Write_Data;
input Reg_Write;
Trang 11input clk;
output [31:0] Read_Data1, Read_Data2;
// Register File: 32 Register, moi Register 32 bit
Regs_File[i] = 0;
end end
//Read
assign Read_Data1 = Regs_File[Read_Addr1];
assign Read_Data2 = Regs_File[Read_Addr2];
endmodule
3.2.4 ALU (Arthmetic- Logic Unit)
Bộ số học và logic là nơi thực hiện các phép toán số học và logic trong kiến trúc MIPs Đốivới các lệnh thuộc nhóm lệnh toán học và logic, khối ALU được sử dụng để thực hiện các phép tính Các lệnh nạp, ghi sử dụng khối để tính toán địa chỉ bộ nhớ Lệnh BNE sử dụng khối này để
so sánh Lệnh J,JR không sử dụng khối này
Cấu tạo MIPs ALU gồm:
Hai ngõ vào 32bit: BusA, BusB
Một ngõ ra 32bit: Output
Trang 12 Các cờ ngõ ra: zero, overflow, carryout, negative
Cờ zero: được set khi kết quả bằng 0
Cờ overflow: được set khi xảy ra tràn khi thực hiện các phép cộng trừ các số có dấu
Cờ carryout: được set khi có nhớ từ MSB
Cờ negative: được set khi kết quả âm
Sau khi tối thiểu hóa, ta được phương trình trạng thái:
Sum = A xor B xor Cin
`Xor xor_0 (temp1,A,B);
`And and_0 (temp2,A,B);
`And and_1 (temp3,temp1,Cin);
`Xor Sum_Result (Sum,temp1,Cin);
`Or Cout_Result (Cout,temp2,temp3);
endmodule
Trang 13Bộ cộng 32 bit được thiết kế bằng cách sử dụng 32 bộ 1bit:
Add_1bit bit0 (Sum[0] ,C_out[0] ,A[0] ,B[0] ,Cin);
Add_1bit bit1 (Sum[1] ,C_out[1] ,A[1] ,B[1] ,C_out[0]); Add_1bit bit2 (Sum[2] ,C_out[2] ,A[2] ,B[2] ,C_out[1]);
…
Add_1bit bit31(Sum[31],Cout ,A[31],B[31],C_out[30]);
//Overflow = Cout[31] xor Cout[30]
B_select = B xor Select
Trang 14`Xor Xor0(Xor_32[0], A[0], B[0]);
`Xor Xor1(Xor_32[1], A[1], B[1]);
`Xor Xor2(Xor_32[2], A[2], B[2]);
module Logic(Logic_result, A,B,Select);
output reg [31:0] Logic_result;
Trang 15output reg [31:0]ALU_result;
output Zero, Overflow, Cout, Negative;
end else begin
SLT_result = $signed(A) < $signed(B); end
//chon ket qua alu // - s -
if (Funct[5:2] == 4'b1000) begin
ALU_result = Add_Sub_result;
Trang 16end else if (Funct[5:2] == 4'b1001) begin
`Nor32 zero_result(zero, ALU_result, 'b00000000000000000000000000000000);
assign Zero = zero;
assign Negative = ALU_result[31];
assign Cout = C_out;
assign Overflow = Of;
endmodule
3.2.4.4 ALU Control
Bộ ALU Control kết hợp tín hiệu điều khiển của Control Unit và 6bit Function từ mã lệnh,
để tạo tín hiệu điều khiển cho bộ ALU
Bảng tín hiệu điều khiển ALU
module ALU_Ctrl(ALU_Funct,Opcode, funct_in);
output reg [5:0]ALU_Funct;
input [5:0]Opcode;
input [5:0]funct_in;
Trang 17// Constants
localparam ALU_DONT_CARE = 6'b000000; localparam R_TYPE = 6'd0;
Trang 18begin
ALU_Funct = FANDI;
end ORI:
begin
ALU_Funct = FORI;
end XORI:
begin
ALU_Funct = FXORI;
end endcase end
end
endmodule
3.2.5 Data Memory
Là nơi lưu trữ dữ liệu
Nhận kết quả của ALU làm địa chỉ tại ngõ vào
Khi tín hiệu MemWrite=1 thì dữ liệu mới sẽ được ghi vào
Khi tín hiệu MemRead=1 thì khối này đọc dữ liệu, trong quá trình đọc dữ liệu khối này
“phản ứng” theo combination logic
module Data_Memory(Read_Data, Addr, Write_Data,
Write_En, Read_En, clk);
output [31:0]Read_Data;
input [31:0]Addr, Write_Data;
input Write_En, Read_En;
input clk;
reg [31:0]Data_Mem[1023:0];
Trang 19Các tín hiệu điều khiển:
RegDst: chọn thanh ghi đích cho Register File
RegDst = 0 đối với lệnh loại I, rt là thanh ghi đích
RegDst = 0 đối với lệnh loại R, rd là thanh ghi đích
Jump: Cho phép thực hiện lệnh nhảy Jump
Branch: Cho phép thực hiện lệnh rẽ nhánh BNE
MemRead: Cho phép đọc dữ liệu từ bộ nhớ
MemWrite: Cho phép ghi dữ liệu vào bộ nhớ
ALUSrc: Chọn ngõ vào thứ 2 cho bộ ALU
ALUSrc = 0: ngõ vào là giá trị của thanh ghi rt
ALUSrc = 1: ngõ vào là giá trị Immediate đã được mở rộng thành 32bit
RegWrite: Cho phép ghi dữ liệu vào thanh ghi đích
MemtoReg: Chọn giá trị để ghi vào Register File
MemtoReg = 0: ghi dữ liệu từ kết quả ALU vào Register File
MemtoReg = 1: ghi dữ liệu từ bộ nhớ vào Register File
SignZero: xác định phương thức mở rộng bit
Trang 20ALU Src
Reg Write
Mem
to Reg
SignZero
ALU opcode
Kết hợp giá trị của tín hiệu điều khiển ALU opcode từ Control Unit và 6 bit Function giải
mã từ lệnh để tạo ra tín hiệu JR_ctrl điều khiển thực hiện lệnh Jump Register
Địa chỉ lệnh Jump Register chính là dữ liệu lưu trong thanh ghi Rs
module JR_control(JR_ctr, Funct, ALU_Opcode);
case(temp) 12'b000000001000: JR_ctr = 1'b1;
Trang 21default: JR_ctr = 1'b0; endcase
end
endmodule
Trang 223.2.7.2 Extender
Dùng để mở rộng 16bit Immediate
Dữ liệu vào 16 bit sẽ được mở rộng thành 32 bit Tùy thuộc vào tín hiệu điều khiển SignZero từ Control Unit mà dữ liệu vào sẽ được mở rộng với các giá trị 0 hoặc với bit thứ 16 của dữ liệu vào
Trang 233.3 DATAPATH CỦA MIPS CPU
Tổng quát việc thực thi lệnh bao gồm các bước sau:
PC thành PC+4 để chỉ đến lệnh tiếp theo Tiếp theo câu lệnh sẽ được đưa đến khối Control Unit
và Register File để giải mã câu lệnh, xác định thanh ghi nào cần sử dụng, mục đích của câu lệnh
là thực hiện nhiệm vụ gì
Các bước tiếp theo của quá trình thực thi lệnh phụ thuộc vào các cấu trúc của từng lệnh Chúng ta sẽ xem xét các khuôn dạng lệnh để thiết kế các datapath cho từng lệnh sao cho phù hợp
3.3.1 Datapath của các lệnh toán học và logic :
ADD, SUB, AND, OR, XOR, NOR, SLT :
Các lệnh này thuộc khuôn dạng lệnh R-type :
Các toán hạng của các phép toán là các giá trị chứa trong các thanh ghi có địa chỉ nằm trong trường rs,rt Trường op và func cho biết chính xác chúng ta phải thực hiện phép toán nào Kết quả tính toán được sẽ được lưu vào thanh ghi trong Register File có địa chỉ nằm trong trườngrd
Trang 24 ADDI, ANDI, ORI, XORI :
Lệnh này thuộc dạng I- type :
Lệnh này thực hiện phép toán XOR giữa một giá trị được chứa trong thanh ghi( thanh ghi này có địa chỉ chứa trong trường rs ) với một giá trị hằng Giá trị hằng này chứa trong câu lệnh là16bit nhưng nó sẽ được mở rộng thành giá trị 32 bit Kết quả của phép toán sẽ được lưu vào thanh ghi trong Register File, thanh ghi này có địa chỉ nằm trong trường rt
Trang 253.3.2 Datapath của các lệnh nạp, ghi :
Các lệnh LW và SW thuộc khuôn dạng lệnh I-type Trong khuôn dạng lệnh I-type trường
address 16bit tương ứng với offset và trường rs tương ứng với base register trong câu lện LW,
SW Đối với lệnh LW thì trường rt là địa chỉ đến và đối với lệnh SW thì trường này là nguồn
LW :
Các offset 16 bit sẽ được mở rộng dấu thành 32 bit Khối ALU được sử dụng để tính tổng giữa offset đã được mở rộng với giá trị chứ trong thanh ghi mà base register chỉ đến Kết quả của phép tính này được xem là địa chỉ của vị trí nhớ trong Data memory Giá trị của ô nhớ này sẽ được ghi lại vào trong Register File, vào thanh ghi có địa chỉ nằm trong trường rt
SW :
Các offset 16 bit sẽ được mở rộng dấu thành 32 bit Khối ALU được sử dụng để tính tổng giữa offset đã được mở rộng với giá trị chứ trong thanh ghi mà base register chỉ đến Kết quả của phép tính này được xem là địa chỉ của vị trí nhớ trong Data memory Giá trị trong thanh ghi có địa chi nằm trong trường rs sẽ được ghi vào vị trí nhớ này
Trang 263.3.3 Datapath của lệnh nhảy :
BNE:
Lệnh này thuộc khuôn dạng lệnh I-type Giá trị của thanh ghi có địa chỉ nằm trong trương rs,rt sẽ được so sánh với nhau Nếu hai giá trị này không bằng nhau thi nhảy đến địa chỉ có giá trị address (32 bit)+ PC+4 Trường address 16 bit sẽ được mở rộng thành 32 bit
PC= PC+4 + Sign_ext (Imm16)<<2;
J:
Lệnh này thuộc khuôn lệnh J-type :
op (6 bit ) target (26 bit) PC={PC[31:28], target, 00}
Trang 27 JR:
Lệnh này có khuôn lệnhnhư sau :
op (6 bit ) rs (5 bit ) 0 (15 bit ) 8PC= Reg{rs}
3.3.4 Datapath của MIPs
Sau khi thiết kế datapath cho từng lệnh riêng, ta ghép chúng lại để có được datapath của MIPS CPU như sau :
Trang 283.4 CPU MIPS SINGLE CYCLE
Kết nối các khối đã thiết kế theo datapath của MIPs đã xác định
module SingleCycleMips(input clk, reset);
/*********
*Khai Báo*
*********/
//Khoi Program Counter
wire [31:0]PC_in, PC_out; //Dia chi ngo vao & rawire [31:0]PC_4, //Dia chi lenh tiep theo
PC_BNE, //Dia chi neu thuc hien lenh Branch Not Equal
PC_Jump, //Dia chi neu thuc hien lenh Jump
PC_Jr, //Dia chi neu thuc hien lenh Jump Register
assign Funct = Instruction[5:0];
assign Imm16 = Instruction[15:0];
//Khoi Control Unit
wire Reg_Dst, ALU_Src, MemtoReg, Reg_Write, Mem_Read, Mem_Write, Branch, Jump, SignZero;
Trang 29wire [31:0]Extend_out;
//Khoi Register File
wire [31:0]Reg_Read_Data1, Reg_Read_Data2;
wire [31:0]Reg_Write_Data;
wire [4:0] Reg_Write_Addr;
//Khoi Data Memory
wire [31:0]Mem_Read_Data, Mem_Addr, Mem_Write_Data;