TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI
VIỆN ĐIỆN TỬ - VIỄN THÔNG
BÁO CÁO BÀI TẬP LỚN KIẾN TRÚC MÁY TÍNH
THIẾT KẾ MIPS PIPELINE
GIẢNG VIÊN HƯỚNG DẪN: TS. NGUYỄN ĐỨC MINH
NHÓM SINH VIÊN
Đặng Văn Quân ĐT2 - K54 20092109
Lê Minh Thao ĐT5 - K54 20092399
Nguyễn Văn Hưng ĐT11 - K54 20091384
Nguyễn Văn Huấn ĐT2 - K54 20092165
Nguyễn Thị Mai Trang ĐT4 - K54 20092812
HÀ NỘI 11/2012
MỤC LỤC
TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI 1
MỤC LỤC 2
Tài liệu tham khảo …………………………………………………………………. 49Phần 1: Giới thiệu ý tưởng và
xác định chỉ tiêu kỹ thuật của kiến trúc MIPS Pepiline 3
1.1Phân tích nhu cầu và đặc điểm nổi bật trong kiến trúc MIPS Pipeline 3
1.1.1.Giới thiệu chung về kiến trúc MIPS- nhu cầu cần thiết cho sự ra đời của kiến trúc MIPS pipeline 3
1.1.2.Đặc điểm nổi bật-nguyên tắc thiết kế trong kiến trúc MIPS pipeline 3
1.1.3.Lên ý tưởng cho đề tài 4
1.2Các sản phẩm đã có trên thị trường (Các công trình bài báo nghiên cứu đã có và có liên quan) 4
1.2.1.R2000 4
1.2.2.R3000 4
1.2.3.R4000 4
1.2.4.R8000( 1994) 4
1.2.5.R10000 (1995) 4
1.2.6.Các sản phẩm hiện tại trên thị trường 4
1.3Các chỉ tiêu kỹ thuật của sản phẩm 5
1.3.1.Chức năng sản phẩm 6
1.3.2.Chỉ tiêu kỹ thuật của sản phẩm. 6
1.3.3.Thông số đầu vào,ra 6
1.3.4.Các yêu cầu phi chức năng 9
Phần 2.Phân tích chức năng và lập kế hoạch 10
2.1Phân chia chức năng 10
2.1.1.Chức năng khối Instruction Memory 10
2.1.2.Chức năng khối Register File 10
2.1.3.Chức năng khối ALU và ALU control 11
2.1.4.Chức năng khối Control Unit 12
2.1.5.Chức năng khối Data Memory 18
2.1.6.Kỹ thuật pipeline và xử lý xung đột 18
2.1.7.Các khối chức năng khác 20
2.2Lập kế hoạch 20
Phần 3.Lựa chọn phương án kỹ thuật 21
3.1Sơ đồ khối của sản phẩm 21
3.2Kiến trúc thiết kế 22
Phần 4.Thiết kế mạch 24
4.1Bộ đếm chương trình PC 24
4.2Bộ nhớ lệnh 24
4.3Register File 24
4.4Bộ nhớ dữ liệu 26
4.5Xây dựng Datapath cho lệnh loại R 26
4.6Khối điều khiển(CU) 29
4.7Khối xử lý xung đột (Hazard Unit). 30
4.7.1.Khối chuyển tiếp dữ liệu 30
4.7.2.Điều khiển thanh ghi Pipeline 30
Phần 5.Kết quả tổng hợp và mô phỏng 33
5.1Kết quả tổng hợp từ Quartus 33
5.2Kết quả mô phỏng sử dụng Modelsim 33
Kết quả mô phỏng trên Modelsim 35
Tài liệu tham khảo ………………………………………………………………….
49Phần 1: Giới thiệu ý tưởng và xác định chỉ tiêu kỹ thuật
của kiến trúc MIPS Pepiline
Phân tích nhu cầu và đặc điểm nổi bật trong kiến trúc MIPS Pipeline
Giới thiệu chung về kiến trúc MIPS- nhu cầu cần thiết cho sự ra đời của kiến trúc MIPS
pipeline
MIPS :
Microprocessor without Interlocked Pipeline Stage
là một kiến trúc vi xử lý
được phát triển bởi hãng
MIPS Technologies
và là kiến trúc chiếm đến 1/3 số lượng
chip sản xuất trên nền kiến trúc RISC.
Bộ xử lí MIPS đầu tiên được nghiên cứu vào năm 1981 với mục đích cơ bản là nhằm
tăng đột xuất hiệu năng thông qua sử dụng một đường ống lệnh ( pileline
instructions). Thiết kế theo pipeline làm giảm đáng kể thời gian rảnh rỗi của CPU
khi thực hiện liên tiếp các câu lệnh.
Khó khăn trong quá trình tìm hiểu thiết kế: theo phương pháp đường ống lệnh nó
yêu cầu một khóa đồng bộ (interlocks) được cài đặt để chắc chắn rằng các câu lệnh
chiếm nhiều chu kì đồng hồ để thực hiện sẽ dừng đường ống lại để nạp nhiều dữ
liệu hơn. Những khóa đồng bộ này cần một thời gian lớn để cài đặt và được cho là
rào cản chính trong việc tăng tốc độ xử lí trong tương lai.
Yêu cầu đặt ra trong quá trình thiết kế: yêu cầu tất cả các câu lệnh phải được hoàn
thành trong 1 chu kì xung nhịp nhờ thế lạo bỏ được sự cần thiết của khóa đồng bộ.
Thiết kế này đã loại bỏ được một số câu lệnh hữu dụng, đáng kể nhất là các lệnh
nhân, chia yêu cầu nhiều bước nhưng nó cho thấy hiệu suất tổng thể của hệ thống
tăng lên rõ rệt vì các vi xử lý có thể chạy ở xung nhịp lớn hơn rất nhiều.
Lịch sử phát triển sau đó:
Thiết kế đầu tiên ra đời vào năm 1985: R2000 sau đó phát triển tiếp R3000
vào năm 1998. Những CPU 32bit này tồn tại trong suốt những năm 1980 và
được sử dụng chủ yếu trong các dòng máy chủ SGI.
Năm 1991 MIPS cho ra đời bộ vi xử lý 64 bit đầu tiên R4000
Đặc điểm nổi bật-nguyên tắc thiết kế trong kiến trúc MIPS pipeline
Tính đơn giản quan trọng hơn tính quy tắc (Simplicity favors regularity)
Chỉ thị kích thước cố định (32bit)
Ít định dạng chỉ thị (3 loại định dạng)
Mã lệnh ở vị trí cố định (6 bit đầu)
Nhỏ hơn thì nhanh hơn
Số chỉ thị giới hạn
Số thanh ghi giới hạn
Số chế độ địa chỉ giói hạn
Tăng tốc trong các trường hợp thông dụng
Các toán hạng số học lấy từ thanh ghi ( máy tính dựa trên cơ chế load-store)
Các chỉ thị có thể chứa toán hạng trực tiếp
Thiết kế đòi hỏi sự thỏa hiệp
Ba loại chỉ thị định dạng
Nguyên tắc hoạt động của Pipeline
Chia nhỏ các lệnh thành các giai đoạn đường ống
Bắt đầu lệnh tiếp theo trước khi lệnh hiện tại kết thúc.
Lên ý tưởng cho đề tài
Mục đích là thiết kế một chip MIPS pipeline bằng ngôn ngữ mô tả Verilog HDL.
Lý do chọ đề tài: nhận thấy được sự cần thiết và phát triển ngày càng nhanh của hệ
thống xử lý đặt ra ngày càng cao trong quá trình thiết kế được tối ưu nhất, nhanh
nhất, Verilog HDL là một ngôn ngữ mô tả phần cứng linh hoạt, dễ làm và dễ mô
phỏng.
Các sản phẩm đã có trên thị trường (Các công trình bài báo nghiên cứu đã có và có liên
quan)
Sau khi MIPS cho ra đời bộ vi xử lý 64 bit đầu tiên R4000 vào năm 1991, MIPS đã
gặp khó khăn về tài chính trong khi tung sản phẩm này ra thị trường. Thiết kế này rất quan
trọng đối với SGI-một trong những khách hàng của MIPS lúc bấy giờ, vì thế SGI đã mua
lại công ty vào năm 1992 để bảo vệ thiết kế không bị mất đi. Từ đó MIPS trở thành một
công ty con của SGI và được biết đến bởi tên MIPS Technologies.
Các dòng vi xử lý thương mại MIPS đã được sản xuất:
R2000
Xuất hiện trên thị trường vào năm 1985, được bổ sung thêm nhiều câu lệnh mới, có
thể được khởi tạo ở chế độ big-endian hay little-endian, có 32 thanh ghi 32 bit, nhưng
không có thanh ghi mã điều kiện. R2000 cũng hỗ trợ tới 4 bộ xử lý, một trong số đó đảm
nhiệm việc xử lý các ngoại lệ và bẫy trong khi ba chiếc còn lại sử dụng cho các mục đích
khác. Điều này được hỗ trợ trong R2010 FTU - bộ xử lý có 32 thanh ghi 32 bit có thể được
sử dụng như là 16 thanh ghi 64 bit cho kết quả chính xác gấp đôi.
R3000
Theo sau R2000 vào năm 1998, nó bổ sung thêm 32kB Cache (và sớm được tăng
lên 64kB) cho các lệnh và dữ liệu, kèm theo đó là cơ chế cache coherency hỗ trợ cho nhiều
bộ xử lý. R3000 cũng bao gồm MMU - một tính năng phổ biến của CPUs kỷ nguyên này.
R3000 trở thành thiết kế MIPS đầu tiên thành công trong lĩnh vực thương mại. R3000A
được sử dụng cực kỳ thành công trong các máy Sony PlayStation, chạy với tốc độ 40 MHz,
truyền thông tin ở tốc độ 32 câu lệnh trong 1 giây. R3000 cũng đi kèm với R3100 FTU
trong cùng một chip đơn. Các hãng khác cũng tham gia sản xuất như Pacemips với R3400,
IDT với R3500. R3900 của Toshiba là chíp đầu tiên dạng SoC (System on a Chip) được
sử dụng trong các máy tính cá nhân cầm tay sử dụng hệ điều hành Windows CE.
R4000
Được đưa ra vào năm 1991, mở rộng tập lệnh MIPS để hỗ trợ đầy đủ kiến trúc 64
bit, chuyển FTU vào main để tạo ra một hệ thống chip đơn lẻ (Single-chip system), xử lý
với tốc độ lên tới 100Mhz, tuy nhiên để đạt được tốc độ này bộ nhớ đệm phải bị giảm
xuống còn 8kB và cần 3 chu kỳ để truy cập. Tần số xử lý cao đạt được nhờ việclưu trữ
thông qua công nghệ đường ống sâu (deep pipelining – hay còn gọi là super-pipelining tại
thời điểm đó). 1993 R4400 xuất hiện với 16kB cache, bộ xử lý 64 bit lớn và 1 bộ điều khiển
cache mở rộng lên tới 1MB (cahe level 2). Ngoài ra còn các họ
R4200, R4300, VR4300,
R4300i, R4600 “Orion”, R4700 “Orion”, R5650, R5000, R5000FTU, RM7000,
RM9000
Các bộ xử lý này được sử dụng rất rộng rãi : Các máy Nitendo 64, Cisco routers,
WebTV set-top Box (Hiện nay là Micrisoft TV)…
R8000( 1994)
Là thiết kế MIPS siêu vô hướng (superscala) đầu tiên, cho phép xử lý 2 ALU và 2
phép tính nhớ mỗi chu kỳ. Thiết kế này mở rộng tới 6 chip, hỗ trợ 4MB cache mở rộng.
R10000 (1995)
Là một thiết kế chip đơn lẻ, chạy ở tốc độ cao hơn R8000, có 32kB cache chính cho
các câu lệnh và dữ liệu. Các thiết kế tiếp theo của R1000 là R12000 và R14000 với hỗ trợ
DDR SRAM trong cache và tốc độ lên tới 200 MHz. Ngoài ra còn các thiết kế R16000,
R16000A, R6000.
Hình 1.1: Thiết kế R10000 (1995)
Các sản phẩm hiện tại trên thị trường
MIPS32® 4K® Family
Họ vi xử lý MIPS32® 4K® được thiết kế cho các ứng dụng SoC. Đây là những ứng
dụng yêu cầu các bộ xử lý dễ sử dụng và có hiệu quả sử dụng năng lượng cao. Các
lõi MIPS32® 4K® có khả năng cấu hình và tổng hợp đã được sử dụng trong hàng
trăm hệ thống SoC.
Tính năng:
Thực hiện kỹ thuật đường ống 5 giai đoạn
Đường dữ liệu và địa chỉ 32 bit
Thực hiện kiến trúc tập lệnh tương thích như MIPS32
Có thể thực hiện lệnh ở một trong hai chế độ: đơn xung nhịp hoặc đa xung
nhịp
Cho phép người dùng định nghĩa và thêm các lệnh trong quá trình thiết kế
Tần số hoạt động tối thiểu: 0MHz
Có chế độ hoạt động ở mode tiết kiệm năng lượng
Có các bộ chia clock được điều khiển bằng phần mềm
Giá trên thị trường: $150USD
MIPS32® M4K™ Core
MIPS32® M4K™ Core có hiệu năng cao, có nhiều tính năng cho các ứng dụng thời
gian thực, các ứng dụng hệ thống nhúng như là vi điều khiển, các hệ thống điều
khiển công nghiệp, mạng không dây, ô tô và các thiết bị lưu trữ.
Với rất nhiều tính năng có thể cấu hình và tùy chọn bởi người dùng cho phép người
thiết kế tối ưu được hiệu năng của bộ xử lý , giảm kích thước và năng lượng tiêu
thụ.
Tính năng:
Thực hiện kỹ thuật đường ống 5 giai đoạn, có khả năng hoạt động trên
400MHz
Gồm 32 thanh ghi đa năng
Tương thích hoàn toàn với MIPS32
Thực hiện kiến trúc tập lệnh của MIPS32
Có thể hoạt động ở 2 chế độ: đơn xung nhịp hoặc đa xung nhịp
Có bộ chia clock được điều khiển bằng phần mềm
Các chỉ tiêu kỹ thuật của sản phẩm
Như ta đã biết, các bộ xử lí sẽ chỉ xử lí được tập các lệnh thuộc về kiến trúc bộ lệnh
của nó (tức là các lệnh đã được định sẵn trong bộ xử lí đó). Vì thế các hệ thống nhúng và
một số loại siêu máy tính thuộc về kiến trúc bộ lệnh MIPS thì chỉ có thể thực hiện các
chương trình thuộc kiến trúc bộ lệnh này (tức là chỉ thực thi được các chương trình viết
bằng bộ lệnh MIPS). Đó là lí do chúng ta cần nghiên cứu về MIPS.
Đến năm 1995 thì MIPS10000 ra đời đã mang lại thành công lớn cho sự phát triển
về công nghệ MIPS.Trong khuôn khổ của đề tài này, chúng ta hi vọng đạt được một cái
nhìn tổng quát nhất về kiến trúc MIPS để từ đó phát triển hơn. Nên sản phẩm tạo ra chỉ
mang những chức năng cơ bản nhất của MIPS.
Chức năng sản phẩm
Mục đích của bản thiết kế, nhằm tạo ra một bộ xử lý MIPS, nhằm tăng đột xuất hiệu
năng thông qua sử dụng đường ống lệnh (pipeline instructions). Thiết kế pipeline làm giảm
đáng kể thời gian rảnh rỗi của CPU khi thực hiện liên tiếp các câu lệnh. Bộ xử lý này chỉ
có khả năngthực hiện được một số lệnh cơ bản.
Kiến trúc tập lệnh này hộ trợ thực hiện:
Các phép toán số học: cộng, trừ, nhân…
Truy cập bộ nhớ với 2 chỉ thị: lw, sw.
Lưu trữ, đọc và ghi byte dữ liệu
Lệnh dịch, logic số học, nhảy (có điều kiện và không có điều kiện).
Chỉ tiêu kỹ thuật của sản phẩm.
Tần số clock 200MHz
Hiệu năng:
Tiêu thụ năng lượng:
Kích thước core:
Sau khi thiết kế xong bộ xử lý MIPS, để kiểm tra xem nó có đạt các chức năng đã
đặt ra, chúng ta tiến hành chạy mô phỏng bằng phần mềm của Altera (Quartus,
Moldemsim) với các thông số đầu vào ra cụ thể như sau:
Thông số đầu vào,ra
Thông số
Ý nghĩa
Input
clk
Tín hiệu đồng hồ hệ thống
reset
Tín hiệu reset không đồng bộ
instruction
Mã lệnh
readData
Dữ liệu vào
Output
writeData
Dữ liệu ra
aluOut
Dữ liệu ra của khối ALU
selectWidth
Chọn số bit của dữ liệu đọc và ghi
PC
Địa chỉ lệnh tiếp theo
memWrite
Tín hiệu Write Enable
memRead
Tín hiệu Read Enable
Sơ đồ cấu trúc bản thiết kế
Sơ đồ chung
Hình 1.2: Sơ đồ tổng quát MIPS pipeline
Phân tích các thành phần cấu tạo.
Khác với chip Single-cycle khi các lệnh đều được thực hiện xong trong một chu kì máy,
chip pipeline chia một câu lệnh ra thành 5 bước (steps):
Nạp lệnh và cập nhập giá trị PC (Instruction Fetch – IF)
Đọc thanh ghi và giải mã lệnh ( Intruction Decode – ID)
Thực hiện lệnhR, tính địa chỉ bộ nhớ(Execution – EX)
Đọc hoặc ghi dữ liệu trên bộ nhớ dữ liệu (Memory access –MEM)
Ghi kết quả vào tệp thanh ghi (Write back – WB)
Câu lệnh sau không cần đợi câu lệnh trước hoàn tất mới bắt đầu thực hiện mà mỗi step
sẽ được thực hiện liên tiếp, do đó cải thiện đáng kể về tốc độ thực hiện các chương trình
Các bước thực hiện một câu lệnh:
Đọc lệnh từ bộ nhớ ( Instruction Fetch – IF)
Sử dụng địa chỉ lưu trong thanh ghi PC để giải mã ra mã máy của câu lệnh
tiếp theo và lưu vào thanh ghi trung gian IF/ID.
Giá trị PC được cộng thêm 4 và lưu vào thanh ghi trung gian IF/ID
Giải mã lệnh và đọc các thanh ghi (Intruction Decode – ID)
Sử dụng mã máy của câu lệnh lưu trong thanh ghi IF/ID làm đầu vào cho
khối Regfile
Khối Control sử dụng phần opcode của mã máy của câu lệnh để giải mã thành
các tín hiệu điều khiển, ngoài tín hiệu SignEx được sử dụng cho khối mở rộng,
các tín hiệu khác được lưu vào thanh ghi trung gian ID/EX
Đọc các thanh ghi Rs, Rt từ bộ thanh ghi và lưu vào thanh ghi trung gian
ID/EX
Khối mở rộng sử dụng tín hiệu SignEx từ khối Control để mở rộng dấu hay
mở rộng zero của 16 bit thấp của mã máy thành 32 bit và lưu vào thanh ghi
ID/EX
Địa chỉ các thanh ghi Rs, Rt, Rd được lưu vào thanh ghi ID/EX
Tính toán kết quả của câu lệnh hoặc địa chỉ (Execution – EX)
Khối ALU sử dụng các đầu vào đã được lưu trong thanh ghi ID/EX để tính
toán và lưu kết quả vào thanh ghi trung gian EX/MEM
Một bộ mux được dùng để lựa chọn thanh ghi đích từ 2 thanh ghi Rt, Rd và
lưu địa chỉ vào thanh ghi EX/MEM
Địa chỉ mới của PC sau câu lệnh BNE cũng được tính toán trong khối này.
Một số bộ mux được dùng để lựa chọn giá trị mới cho PC từ các câu lệnh rẽ
nhánh BNE, J, JR.
Các tín hiệu điều khiển MemWrite, MemtoReg và RegWrite được lưu tiếp
vào thanh ghi EX/MEM
Đọc hoặc ghi dữ liệu trên bộ nhớ dữ liệu ( Memory access – MEM)
Sử dụng kết quả tính toán từ khối ALU và tín hiệu điều khiển MemWrite từ
thanh ghi EX/MEM để thực hiện đọc hoặc ghi vào bộ nhớ dữ liệu. Kết quả đọc
ghi vào thanh ghi trung gian MEM/WB.
Các giá trị đầu ra của ALU, địa chỉ thanh ghi đích cùng với 2 tín hiệu điều
khiển MemtoReg và RegWrite được ghi lại vào thanh ghi MEM/WB
Ghi kết quả vào thanh ghi ( Write back – WB)
Sử dụng tín hiệu MemtoReg từ thanh ghi MEM/WB để lựa chọn dữ liệu cần
ghi vào thanh ghi.
Sử dụng địa chỉ thanh ghi đích và tín hiệu cho phép ghi RegWrite để thực
hiện công việc ghi dữ liệu vào bộ thanh ghi.
Thiết kế các thanh ghi pipeline
Hình 1.3: ????
Ta sử dụng các thanh ghi pipeline làm trung gian lưu kết quả thực hiện của mỗi khối
trong mỗi chu kỳ để làm đầu vào cho các khối sau trong chu kì tiếp theo.
Có 4 thanh ghi pipelined nằm giữa các khối:
Thanh ghi IF/ID: dùng để lưu các giá trị PC+4 và mã máy của câu lệnh
Thanh ghi ID/EX: dùng để lưu các giá trị PC+4, địa chỉ của lệnh Jump, 2 giá
trị đọc ra từ bộ thanh ghi. Giá trị mở rộng 32bits từ 16bits. Địa chỉ các thanh ghi
Rs,Rt,Rd. Các tín hiệu điều khiển từ khối Control: ALUOp, ALUSrc, RegDst,
Branch, Jump, MemWrite, MemRead, RegWrite, MemtoReg.
Thanh ghi EX/MEM: Dùng để lưu các giá trị: Kết quả tính toán của khối
ALU, giá trị dùng để ghi vào bộ nhớ file các thanh ghi, địa chỉ của thanh ghi
đích. Các tín hiệu điều khiển: MemWrite, RegWrite, MemtoReg.
Thanh ghi MEM/WB: Để lưu các giá trị : Giá trị được đọc ra từ bộ nhớ dữ
liệu, kết quả của khối ALU, địa chỉ thanh ghi đích.
Các tín hiệu điều khiển được xác định trong giai đoạn giải mã và được lưu trong các
thanh ghi trạng tháigiữa các giai đoạn pipeline.
Thanh ghi trạng thái, phần mở rộng của
thanh ghi ID/EX. Đầu vào lấy tín hiệu
điều khiển từ khối Control Unit, đầu ra
đưa vào thanh ghi trạng thái trong phần
mở rộng của thanh ghi EX/MEM
Thanh ghi trạng thái, phần mở rộng của
thanh ghi EX/MEM
Thanh ghi trạng thái phần mở rộng của
thanh ghi MEM/WB. Với tín hiệu đầu
ra RegWriteW làm tín hiệu điều khiển
cho khối Register File và MemtoRegW
làm tín hiệu điều khiển cho bộ MUX
lấy tín hiệu WriteBack
Các yêu cầu phi chức năng
Bộ xử lý MIPS sau khi được thiết kế không chỉ đạt những chức năng kĩ thuật mà cần
đạt yêu cầu phi chức năng như sau:
Dễ sử dụng trong việc mô phỏng
Đáp ứng được các câu lệnh cơ bản
Dễ dàng nâng cấp và sửa lỗi khi cần thiết.
Giá thành hợp lý
MIPS hoạt động ổn định và có độ tin cậy cao
Năng lượng tiêu thụ thấp
Tuy nhiên trong khuôn khổ của bài tập lớn này, chúng em chỉ dừng lại ở việc nghiên
cứu và mô tả kiến trúc của bộ xử lý MIPS, không đặt vấn đề giá thành làm một tiêu chí
đánh giá.
Phân tích chức năng và lập kế hoạch
Phân chia chức năng
Trong quá trình thiết kế, MIPS được chia thành các khối, cụ thể chức năng và phân chia
các khối như sau:
Hình 2 Sơ đồ các khối chức năng của MIPS
Chức năng khối Instruction Memory
Dùng để lưu trữ lệnh dưới dạng mã máy (nhị phân).
Kích thước mỗi lệnh khi dịch ra mã máy là 32 bits, tốn 32 bits để lưu trữ.
Đầu vào bộ nhớ lệnh là địa chỉ lệnh cần lấy, đầu ra là mã máy của câu lệnh tương
ứng lấy được.
Hình 2.2: Khối Instruction Memory
Khối bộ nhớ lệnh Instruction Mem chỉ có
một cổng đọc , khối này nhận một đầu vào
địa chỉ 32 bit A và đầu ra là dữ liệu RD 32
bit (dữ liệu ở đây là lệnh của chương trình).
Khối MUX 2-1, thực hiện chức năng chon
tín hiệu đầu vào cho bộ đếm chương trình
PC
Khối tăng PC, để đếm địa chỉ trong quá
trình nạp lệnh
Đầu vào của bộ nhớ lệnh chính là đầu ra
của bộ đếm chương trình Program Counter
PC. Bộ đếm chương trình là một thanh ghi
32 bit, đầu ra của khối này PCF trỏ tới lệnh
hiện tại. Đầu vào PC’ là địa chỉ của lệnh
tiếp theo cần thực thi.
Khối Data Mem có một cổng đọc hoặc ghi. Nếu tín hiệu cho phép ghi WE=1 thì dữ
liệu WD sẽ được viết vào bộ nhớ dữ liệu tại địa chỉ tương ứng A tại sườn lên của
xung clock. Nếu WE =0 dữ liệu sẽ được đọc ra RD.
Chức năng khối Register File
Hình 2.3: Register File
Tệp thanh ghi fie gồm 32 thanh ghi, mỗi thanh ghi 32 bit. Khối này có 2 cổng đọc
và 1 cổng ghi. Hai cổng đọc nhận các đầu vào địa chỉ 5 bit (ứng với 32 thanh ghi)
A1, A2. Đầu ra là dữ liệu RD1, RD2 tương ứng với các đầu vào địa chỉ A1, A2.
Cổng ghi nhận đầu vào địa chỉ A3 (5 bit ) và đầu vào của dữ liệu cần ghi 32 bit
WD3.
Ngoài ra còn có các tín hiệu clock và đầu vào cho phép ghi Write Enable WE. Nếu
tín hiệu WE ở mức cao 1, dữ liệu WD3 sẽ được ghi vào trong thanh ghi file tương
ứng tại sườn lên của xung clock.
Chức năng khối ALU và ALU control
Hình 2.4: ALU
Khối ALU có 2 đầu vào là các toán hạng SrcA và SrcB 32 bit, một đầu ra
ALUResult 32 bit. Ngoài ra ALU còn có một đầu vào điều khiển ALUControl 4 bit
để xác định các phép toán cần thực hiện.
ALUControl
ALU Operation
0000
AND
0001
OR
0010
ADD
0011
XOR
0100
NOR
0101
Not use
0110
SUB
0111
SLT
1000
SLL
1001
SRL
1010
SRA
1011…1111
Not use
Hình 2.5: Datapath khi thực hiện lệnh loại R
ALU nhận dữ liệu từ các đầu ra của thanh ghi file hoặc ngay trong mã lệnh.
Chức năng khối Control Unit
Hình 2.6: Control Unit
Khối điều khiển CU tính toán các tín hiệu điều khiển dựa trên các trường opcode
Instr[31-26] và funct Instr[5-0] của lệnh.
Hầu hết các tín hiệu điều khiển nằm ở trường opcode, tuy nhiên các lệnh loại R phải
sử dụng thêm trường funct để xác định các phép toán ALU.
Như trên hình vẽ, khối Control Unit tính toán hầu hết các tín hiệu điều khiển
như:MemtoRegD,MemWriteD,BranchD,ALUSrcD,RegDstD,RegWriteD,MemRe
adD, ALUSelectShilfD, ALUControlD. Tất cả các tín hiệu điều khiển này được đưa
vào thanh ghi trạng thái.
Khối ALU Decoder sử dụng trường Funct[5-0] và 2 bit Op để tính toán
ALUControl.
Mã hóa ALUOp:
ALUO
p
Ý nghĩa
000
Add
001
Subtract
010
Look at func field
011
And
100
Or
101
Xor
110
Not use
111
Set less than
Bảng sự thật của khối ALUDecoder:
ALUO
p
Funct
ALUControl
Jr
ALUSelectShift
000
X
0010 (add)
0
0
001
X
0110 (subtract)
0
0
011
X
0000 (and)
0
0
100
X
0001 (or)
0
0
101
X
0011 (xor)
0
0
110
X
X
0
0
111
X
0111 (slt)
0
0
010
100000
0010 (add)
0
0
010
100010
0110 (subtract)
0
0
010
100100
0000 (and)
0
0
010
100101
0001 (or)
0
0
010
100110
0011 (xor)
0
0
010
100111
0100 (nor)
0
0
010
101010
0111 (slt)
0
0
010
000000
1000 (sll)
0
1
010
000010
1001 (srl)
0
1
010
000011
1010 (sra)
0
1
010
001000
0010 (jr)
1
0
Bảng 2.1: Bảng sự thật khối ALUDecoder
Instr
R-type
lw
lb
lh
sw
sb
sh
beq
Opcode
00000
0
10001
1
10000
0
100001
10101
1
10100
0
10100
1
000100
RegDst
1
0
0
0
x
x
x
x
ALUOp
010
000
000
000
000
000
000
xxx
ALUSrc
0
1
1
1
1
1
1
x
Bne
0
0
0
0
0
0
0
0
Beq
0
0
0
0
0
0
0
1
MemRead
0
1
1
1
0
0
0
X
MemWrit
e
0
0
0
0
1
1
1
0
RegWrite
1
1
1
1
0
0
0
0
Mem2Reg
0
1
1
1
x
x
x
x
Jump
0
0
0
0
0
0
0
0
S
xx
10
00
01
10
00
01
xx
Bảng 2.2: Bảng sự thật khối MainDecoder
Instr
bne
addi
andi
ori
xori
slti
j
jal
Opcode
00010
1
00100
0
00110
0
001101
00111
0
00101
0
00001
0
000011
RegDst
x
0
0
0
0
0
x
x
ALUOp
xxx
000
011
100
101
111
xxx
xxx
ALUSrc
x
1
1
1
1
1
x
x
Bne
1
0
0
0
0
0
0
0
Beq
0
0
0
0
0
0
0
0
MemRead
x
0
0
0
0
0
0
0
MemWrit
e
0
0
0
0
0
0
0
0
RegWrite
0
1
1
1
1
1
0
0
Mem2Reg
x
0
0
0
0
0
x
x
Jump
0
0
0
0
0
0
1
1
S
xx
xx
xx
xx
xx
xx
xx
xx
Bảng 2.3: Bảng giải sự thật MainDecoder (tiếp)
Chức năng khối Data Memory
Hình 2.7: Data Memory
Kỹ thuật pipeline và xử lý xung đột
Hình 2.8: Khối Hazard unit
Xung đột cấu trúc
Nguyên nhân xảy ra xung đột
Do các lệnh được thực hiện đồng thời, tại cùng 1 chu kì, hai lệnh khác nhau có thể
cùng truy cập đến 1 tài nguyên dẫn đến xung đột. Trong kiến trúc von Neumann,
lệnh và dữ liệu cùng nằm trên 1 bộ nhớ, khi có hai yêu cầu đọc dữ liệu và đọc lệnh
sẽ dẫn đến xung đột.
Xử lý xung đột.
Thêm tài nguyên phần cứng. Với kiến trúc Havard lệnh và dữ liệu được chia thành
hai bộ nhớ và bus khác nhau, do vậy sẽ không xảy ra xung đột cấu trúc.
Xung đột dữ liệu
(RAW: read after write)
Nguyên nhân
Khi toán hạng của lệnh sau phụ thuộc vào lệnh trước chưa được hoàn thành sẽ gây
ra việc đọc sai dữ liệu, và gọi là xung đột dữ liệu
Xét đoạn lệnh sau:
Hình 2.9: Xung đột điều khiển
Lệnh add sẽ công nội dung của thanh ghi $s2 và $s3 vào thanh ghi $s0, kết quả được
hoàn thành và lưu vào thanh ghi ở chu kì 5, nhưng tại chu kì 3, lệnh and đã dung
nội dung $s0 làm toán hạng, do vậy kết quả sẽ không như mong muốn. Tương tự
đối với lệnh or.
Giải quyết xung đột:
Có 2 cách để giải quết loại xung đột này là chờ dữ liệu tính xong rồi thực hiện lệnh
kế tiếp, hoặc chuyển dữ liệu sau khi được tính toán ở giai đoạn MEM hoặc WB về
giai đoạn EX.
Phương pháp chờ: phần cứng sẽ phát hiện sự phụ thuộc dữ liệu và dừng những lệnh
nào có dữ liệu phụ thuộc vào lệnh trước đó cho tới khi dữ liệu được sẵn sàng.
Hình2.10: phương pháp dừng chương trình
Phương pháp chuyển tiếp dữ liệu: các lệnh thường được tính toán ở giai đoạn EX
rồi chuyển đến các giai đoạn MEM và WB, do vậy ta có thể chuyển dữ liệu trờ về
giai đoạn EX cho các lệnh phụ thuộc dữ liệu phía sau.
Hình 2.11: Chuyển tiếp dữ liệu
Giải quết xung đột cho lệnh lw
Lệnh lw chỉ tính toán địa chỉ ở giai đoạn đoạn EX, dữ liệu thực sự chỉ có được ở
giai đoạn MEM, do vậy chúng ta không thể chuyển tiếp từ giai đoạn MEM. Yêu
cầu dừng chương trình cần được thực hiện.
Hình 2.12: Dừng chương trình
Xung đột điều khiển
a. Nguyên nhân
Khi thực hiện các lệnh điều khiển chương trình như bne, beq,jr,j… điều kiện nhảy
được tính toán ở giai đoạn EX, nếu điều kiện đúng chương trình sẽ nhảy tới địa chỉ cho
trước, không may thay, các lệnh kế tiếp đã được nạp vào các giai đoạn IF, ID và chương
trình sẽ làm việc không như mong muốn.
b. Giải quyết xung đột
Giải quyết xung đột bằng phương pháp chờ.
VD: xét đoạn chương trình
beq $t1, $t2, 40
and $t0, $s0, $s1
or $t1, $s4, $s0
sub $t2, $s0, $s5
Lệnh beq được tính toán và quết định nhảy ở giai đoạn EX,các lệnh
and,or,sub
sẽ
phải chờ cho tới khi lệnh beq tính toán xong điều kiện, nếu điều kiện nhảy không
đúng thì chúng mới được nạp vào đường ống. Việc chờ tính toán điều khiển làm
mất 3chu kì, do vậy sẽ làm tăng CPI.
Giải quết xung đột bằng cách tính toán điều kiện nhảy sớm