TRƯỜNG ĐẠI HỌC BÁCH KHOA
ĐẠI HỌC QUỐC GIA TP HỒ CHÍ MINH
ĐỒ ÁN 1
THIẾT KẾ CPU SINGLE CYCLE THEO CHUẨN RISC V
HỌC KỲ: 222 NĂM HỌC: 2023
LỚP: L23
GIẢNG VIÊN HƯỚNG DẪN: PGS.TS Hồng Trang
Sinh viên thực hiện
Mã số sinh viên
Tơ Bạch Long
2011559
Thành phố Hồ Chí Minh – 2023
MỤC LỤC
Trang
PHẦN MỞ ĐẦU ................................................................................................ 3
PHẦN NỘI DUNG ............................................................................................ 4
CHƯƠNG 1: TỔNG QUAN............................................................................. 4
1.1.
Lý do lựa chọn thiết kế ....................................................................... 4
1.1.1
CPU đóng vai trị quan trọng ........................................................ 4
1.1.2 Nhu cầu kỹ thuật đòi hỏi CPU ngày càng khắc khe .......................... 4
1.1.3
1.2.
Mơ hình RISC V ........................................................................... 5
Mục tiêu, chức năng thiết kế ............................................................ 5
1.2.1 Mục tiêu ............................................................................................. 5
1.2.2 Chức năng .......................................................................................... 5
1.3.
Mơ hình của thiết kế........................................................................... 5
1.3.1 Thanh ghi PC...................................................................................... 6
1.3.2 Inst- memory ...................................................................................... 7
1.3.3 Imm.gen ............................................................................................. 7
1.3.4 Thanh ghi 32 bit ................................................................................. 8
1.3.5 Branch ................................................................................................ 9
1.3.6 ALU .................................................................................................... 9
1.3.7 Dmem ............................................................................................... 10
1.3.8 WB ................................................................................................... 11
1.3.9 Controltop ........................................................................................ 12
1.3.10 Cấu trúc lệnh RISC V .................................................................... 13
CHƯƠNG 2: MƠ PHỎNG............................................................................. 15
2.1. Mơ phỏng các lệnh nhóm R.................................................................. 15
2.1.1. Lựa chọn và tính tốn kết quả......................................................... 15
2.1.2. Kết quả mơ phỏng và so sánh ........................................................ 16
2.2. Mơ phỏng các lệnh nhóm I ................................................................... 40
2.2.1. Tính tốn kết quả............................................................................. 40
2.2.2. Kết quả mơ phỏng và so sánh ......................................................... 41
1
2.3 Mơ phỏng các lệnh nhóm S .................................................................. 70
2.3.1 Lựa chọn và tính tốn kết quả .......................................................... 70
2.3.2 Kết quả mô phỏng và so sánh .......................................................... 70
2.4 Mô phỏng các lệnh nhóm B................................................................... 74
2.5 Mơ phỏng các lệnh nhóm U .................................................................. 78
2.5.1 Lựa chọn và tính tốn kết quả......................................................... 78
2.5.2 Kết quả mô phỏng và so sánh .......................................................... 78
2.6 Mô phỏng các lệnh JAL ......................................................................... 81
2.6.1 Lựa chọn và tính tốn kết quả .......................................................... 81
2.6.2 Kết quả mơ phỏng và so sánh .......................................................... 81
Chương 3. KẾT LUẬN ................................................................................... 83
3.1 Kết luận, nhận xét tổng thể.................................................................... 83
3.2 Hướng phát triển .................................................................................... 83
DANH MỤC TÀI LIỆU THAM KHẢO ....................................................... 84
2
PHẦN MỞ ĐẦU
Lời đầu tiên, xin chân thành gửi lời cảm ơn đến PGS.TS Hoàng Trang và
anh Đỗ Quang Thịnh, những người dìu dắt tác giả thực hiện Đồ Án này. Trong
q trình hồn thành đề tài với rất nhiều khó khăn và thử thách, nhưng rất may
mắn là vẫn cịn đó sự chỉ bảo tận tình, những hướng dẫn quý báu của thầy Trang
và anh Thịnh. Nhờ đó mà tác giả có thể hồn thiện Đồ Án này.
Ở thời điểm hiện tại, người ta dễ dàng nhận thấy tầm quan trọng của các
thiết bị điện tử, đặc biệt là các thiêt bị thơng minh có chip xử lý bên trong. Cụ
thể, những thiết bị như laptop, máy tính để bàn, máy tính cầm tay, máy tính
bảng, điện thoại,.. là những thiết bị không thể thiếu trong cuộc sống hiện tại.
Nếu như con người cần có bộ não để điều khiển các hoạt động thì đối với các
thiết bị kể trên, Central Processing Unit (CPU) đóng vai trị như bộ não của nó.
Như vậy, tầm quan trọng của CPU là không thể phủ nhận trong các thiết bị điện
tử kỹ thuật số nói riêng và trong cuộc sống nói chung. Cùng với đó, nhu cầu hiện
tại địi hỏi CPU phải đáp ứng được các nhu cầu khắc khe về công suất, tốc độ,..
Trước những yêu cầu đặt ra như trên, tác giả lựa chọn đề tài liên quan đến
thiết kế CPU. Đề tài thiết kế CPU không phải là quá mới, đã có nhiều đề tài liên
quan trước đó. Tuy nhiên, tác giả vẫn lựa chọn thực hiện đề tài này nhằm mục
đích tìm hiểu tổng quan và học hỏi. Từ những kiến thức học được thông qua Đồ
Án này, tác giả hy vọng và dự định phát triển các đề tài liên quan mới hơn và
đóng góp nhiều hơn cho lĩnh vực vi mạch cũng như thiết kế CPU.
Tóm lại, vì những lý do kể trên, tác giả chọn đề tài thiết kế CPU single
cycle theo chuẩn RISC V để thực hiện hoàn thành Đồ Án 1.
TÁC GIẢ
3
PHẦN NỘI DUNG
CHƯƠNG 1: TỔNG QUAN
1.1.Lý do lựa chọn thiết kế
Trăn trở lựa chọn các đề tài thực hiện đồ án, sau cùng, tác giả lựa chọn đề
tài thiết kế CPU (Central Processing Unit) theo tập lệnh RISC V dựa vào các lý
do như sau:
1.1.1 CPU đóng vai trị quan trọng
Central Processing Unit (CPU) hay còn gọi bộ xử lý trung tâm, là vi mạch
điện tử có khả năng tính tốn và lưu trữ các thơng tin. Một CPU được cấu thành
từ nhiều thành phần, chẳng hạn như các khối thanh ghi (Register), bộ nhớ
(Instruction Memory, Data Memory),.. và nhiều thành phần khác sẽ được trình
bày rõ ràng hơn ở phần sau.
CPU giống như bộ não của các thiết bị điện tử thơng minh như máy tính,
điện thoại, các thiết bị trong ô tô, … trong khi các thiết bị này là các thành phần
không thể thiếu trong cuộc sống hiện nay. Hiệu suất của các thiết bị kể trên phụ
thuộc vào các hoạt động mà CPU là thiết bị điều khiển. Như vậy, CPU đóng vai
trị vơ cùng quan trọng.
1.1.2 Nhu cầu kỹ thuật đòi hỏi CPU ngày càng khắc khe
Cùng với sự phát triển như vũ bão của các ngành thuộc lĩnh vực phần
mềm, máy tính như AI, BigData, … đòi hỏi CPU phải đáp ứng được các nhu
cầu như hiệu suất cao, công suất thấp, tốc độ nhanh, khả năng tính tốn với các
dữ liệu lớn,… Do đó, thực tế đã đặt ra nhiệm vụ cho ngành thiết kế vi mạch là
phải làm thế nào để đáp ứng các nhu cầu kể trên.
4
1.1.3 Mơ hình RISC V
Kiến trúc tập lệnh RISC V được công bố công khai vào năm 2014, được
phát triển tại Đại học California (Barkeley) bởi Yunsup Lee, Krste Asanovic,
David A. Patterson và Andrew Waterman.
Kiến trúc tập lệnh RISC V là kiến trúc tập lệnh mã nguồn mở. Do đó, bất
kỳ ai cũng có thể xây dựng một chip cho riêng mình. Hơn thế nữa, RISC V cịn
được giảng dạy trong các trường học, nhờ vậy nó dễ tiếp cận và quen thuộc với
sinh viên. Có 2 tập lệnh RISC V bao gổm RV32I (32 bit) và RV64I (64 bit).
Trong phạm vi đề tài này, tác giả lựa chọn thực hiện thiết kế CPU với kiến trúc
tập lệnh RISC V 32.
1.2.
Mục tiêu, chức năng thiết kế
1.2.1 Mục tiêu
Thông qua đề tài, tác giả mong muốn được học tập, tìm hiểu một cách
sâu sắc về thiết kế RTL cho vi mạch và đặc biệt trong đó là hiểu, mơ tả được
cách thức hoạt động của CPU hồn chỉnh thơng qua verilog code.
Mục tiêu của thiết kế là kế hoàn chỉnh một CPU single cycle, chạy được
các lệnh dựa trên kiến trúc tập lệnh RISC V 32.
1.2.2 Chức năng
Sau khi hoàn thành đề tài, CPU thiết kế có khả năng lấy lệnh, giải mã
lệnh, thực hiện tính tốn, đọc và ghi dữ liệu dựa vào các lệnh trong tập lệnh
RISC V 32 như đã nói ở phần trước đó
1.3.
Mơ hình của thiết kế
Một CPU hồn chỉnh bao gồm các được mơ tả như hình bên dưới.
5
Hình 1.1: Sơ đồ kết nối các khối trong CPU
Trong đó, các khối thực hiện các cơng việc khác nhau từ lưu địa chỉ PC,
lưu chương trình, tính tốn, giải mã, lưu dữ liệu, … Những vấn đề trên sẽ được
tác giả đề cập kỹ hơn ở phần tiếp theo, khi mô tả từng khối.
1.3.1 Thanh ghi PC
Thanh ghi PC (program counter) là thanh ghi chứa địa chỉ lệnh tiếp theo
trong chương trình đang thực hiện. Sau khi thực hiện xong một lệnh, thanh ghi
PC tăng lên 4 (trừ các lệnh rẽ nhánh và nhảy).
Hình 1.2: Mơ hình thanh ghi PC
Và vì là thanh ghi chứa địa chỉ của lệnh tiếp theo nên ngõ ra thanh ghi
được nối với ngõ vào của bộ nhớ chương trình (instruction memory). Thanh ghi
6
PC có ngõ vào Reset. Khi Reset bật lên, thanh ghi xuất ra địa chỉ 32h00000000.
CPU thực hiện lại chương trình bắt đầu từ ơ nhớ đầu tiên trong bộ nhớ chương
trình.
1.3.2 Inst- memory
Bộ nhớ chương trình instruction memory là bộ nhớ chứa các lệnh thực thi
chương trình. Trong phạm vi đề tài này, tác giả thực hiện bộ nhớ chương trình
có thanh ghi 8 bit. Như vậy, mỗi lệnh trong RISC V32 sẽ được lưu vào 4 thanh
ghi.
Hình 1.3: Mơ hình bộ nhớ chương trình instruction memory
Ngõ ra ra bộ nhớ chương trình là mã lệnh 32 bit. Các khối phía sau được
thiết kế chủ yếu với mục đích giải mã và thực thi lệnh này.
1.3.3 Imm.gen
Khối Imm.gen được thiết kế ra nhằm mục đích bóc phần Imm trong tập
lệnh. Theo tập lệnh ở các lệnh loại I, S, B, U, J có thành phần lệnh Imm (tập lệnh
được trình bày ở mục 1.3.10). Việc tách và giải mã phần này để việc tính tốn ở
các khối sau dễ dàng hơn.
7
Hình 1.3: Mơ hình Imm_gén
Khối Immgen lấy ngõ vào là phần lệnh instruction ở lệnh bộ nhớ chương
trình, xử lý thơng tin trên theo tín hiệu control và xuất ra ALU để thực hiện tính
tốn
1.3.4 Thanh ghi 32 bit
Thanh ghi (Register) là một trong những phần quan trọng nhất của CPU.
Do thiết kế theo tập lệnh RISC V 32, Thanh ghi được thiết kế là 32 thanh ghi,
mỗi thanh ghi 32 bit.
Hình 1.4: Mơ hình thanh ghi
8
Thanh ghi có các ngõ vào AddrA, AddrB là các ngõ vào nhằm xác định
địa chỉ thanh ghi cần được lấy ra tính tốn. Khi nhận được các địa chỉ trên, thanh
ghi xuất ra dữ liệu DataA, DataB tương ứng.
Song song với đó, thanh ghi có các ngõ vào Reg_write, AddrD và DataD.
Ba ngõ vào này lần lượt xác định trạng thái cho phép hoặc không cho phép ghi,
địa chỉ thanh ghi sẽ được ghi vào và dữ liệu ghi vào.
Ngồi ra, khối này cịn có reset, tất cả dữ liệu lưu trong thanh ghi được trả
về 0 khi reset bật lên.
1.3.5 Branch
Khối Branch là khối được thiết kế phục vụ cho các lệnh rẽ nhánh. Khi
thực hiện các lệnh rẽ nhánh. Khối Controltop sẽ gửi tín hiệu BrUn đến khối
ALU , khi đó Branch so sánh hai ngõ vào là bằng nhau, nhỏ hơn hay lớn hơn rồi
báo kết quả lại cho Controltop thông qua BrLt và BrEq. Từ kết quả trên, khói
Controltop thực hiện hồn tất lệnh rẽ nhánh.
Hình 1.5: Mơ hình khối rẽ nhánh Branch
1.3.6 ALU
Bộ phận đảm nhiệm chức năng tính tốn trong CPU là ALU. Với tập lệnh
RISC V 32, ALU thực hiện được các phép toán cộng, trừ, and, or, xor, dịch trái,
9
dịch phải. Như vậy để thiết kế khối ALU, cần thiết kế các khối nhỏ như adder
(cộng), subber (trừ), xor, or, and, shift. Sau đó là bộ chọn kênh Mux chọn ngõ
ra thơng qua tín hiệu Alucontrol (tín hiệu được controltop giải mã từ lệnh
instruction).
Hình 1.6: Mơ hình khói ALU
Ngõ vào của ALU là dữ liệu lấy từ thanh ghi A, B hoặc ngõ ra của
Imm.gen được xuất ra trước đó.
1.3.7 Dmem
Bộ nhớ dữ liệu (Data_memory) là phần lưu trữ dữ liệu tính tốn trước đó
của ALU.
10
Hình 1.7: Mơ hình khối bộ nhớ dư liệu data_memory
Trong đề tài này, bộ nhớ dữ liệu được thiết kế với thanh ghi 8 bit. Ngõ
vào/ra Bộ nhớ dữ liệu bao gồm addr (địa chỉ cần được ghi vào), w_data (dữ liệu
cần ghi vào), r_data (dữ liệu cần đọc), mem_read/mem_write (tính hiệu cho phép
đọc/ ghi) và select( tín hiệu lựa chọn). Với select có 2 bit quy định 3 trạng thai
ghi đọc của bộ nhớ là trạng thái load/store byte, half hay word. Ngồi ra, Bộ nhớ
dữ liệu cũng có tín hiệu reset, khi reset bằng 1 bộ nhớ chứa các bit 0.
1.3.8 WB
WB thực chất là mux 4 ngõ ra. Đây là khối được thiết kế nhằm phân luồng
các lệnh. Controltop thực hiện việc phân luồng thơng qua tín hiệu wbsel điều
khiển khối này.
11
Hình 1.8: Mơ hình khỏi wb
1.3.9 Controltop
Controltop là một trong những khối quan trọng nhất của CPU. Khối này
giải mã lệnh và đóng vài trị điều khiển tất cả các khối cịn lại.
Hình 1.8: Mơ hình khối control top
Controltop nhận lệnh instruction từ bộ nhớ chương trình. Sau đó, thực
hiện bóc opcode, phân loại lệnh và tiến hành giải mã lệnh. Khi đã giải mã các
lệnh, khối này xuất ra các tín hiệu điều khiển đến các khối khác để thực hiện
chương trình theo đúng lệnh đã được giải mã. Cụ thể:
PCsel là lệnh chọn PC là PC trước đó cộng 4 hay PC cộng Imm (do tác
động của lệnh rẽ nhánh).
Instruction là mã lệnh của lệnh cần được thực hiện, gồm 32 bit và nhận từ
bộ nhớ chương trình (Instruction memory).
12
Imm_sel là tính hiệu điều khiển Imm_gen, tín hiệu này cho biết Imm_gen
cần phải xuất ra out_imm cho phù hợp với lệnh đang thực thi.
Reg_write là tín hiệu cho phép ghi vào thanh ghi. Các lệnh cần ghi vào
thanh ghi thì control top phải bật reg_write lên.
Nhóm BrUn, BrLt, BrEq là các ngõ vào/ra của khối Branch. Trong đó,
BrUn cho biết lệnh đang cần đến khối Branch còn BrLt, BrEq cho biết kết quả
sau khi Branch so sánh hai dữ liệu DataA và DataB.
Alu_sel là tính hiệu điều khiển ALU. Nhờ nó mà ALU biết thực hiện tính
tốn phép tính nào như cộng, trừ, or, xor,…
Nhóm mem_read, mem_write, select là các tín hiệu kết nối với bộ nhớ dữ
liệu. Trong đó, mem_read, mem_write lần lượt là các tín hiệu cho phép đọc, ghi.
Select là tín hiệu cho bộ nhớ biết lệnh đọc, ghi đó là lệnh đọc/ghi 8, 16 hay 32
bit.
Cuối cùng là wb_sel, tính hiệu này điều khiển khối wb. Chọn các ngõ vào
dữ liệu để ghi vào dataD.
1.3.10 Cấu trúc lệnh RISC V
Để CPU hoạt động, cần phải xây dựng trên một cấu trúc tập lệnh nào đó.
Như đã nói, trong đề tài này tác giả thực hiện thiết kế CPU theo kiến trúc tập
lệnh RISC V 32I. Trong cấu trúc lệnh này, các lệnh được chia thành các nhóm
lệnh loại R (tính tốn hai thanh ghi), loại I (tính tốn thanh ghi với một số cụ thể
và đọc dữ liệu từ bộ nhớ), loại S (ghi dữ liệu vào bộ nhớ), loại B ( nhóm lệnh rẽ
nhánh), loại U (lệnh lui và auipc) và lệnh JAL (nhảy đến địa chỉ được chỉ định).
Các lệnh, cấu trúc lệnh, opcode được mô tả cụ thể trong bảng sau:
13
Bảng 1.1 Cấu trục tập lệnh RISC V 32
14
CHƯƠNG 2: MƠ PHỎNG
Để thực hiện mơ phỏng riêng lẻ, tác giả ghi các lệnh và bộ nhớ chương
trình và các dữ liệu cho trước vào thanh ghi Register. Các thanh ghi được chọn
ở đây là r3 và r4.
2.1. Mô phỏng các lệnh nhóm R
2.1.1. Lựa chọn và tính tốn kết quả
Ghi vào các thanh ghi r3, r4 giá trị lần lượt như sau:
reg_file [3] = 32'h05060707; //// DFT
reg_file [4] = 32'h15; //// DFT
Để tiện so sánh các kết quả, ta chọn thanh ghi chứ kết quả là thanh ghi r6
cho tất cả các lệnh cần thực hiện mô phỏng ở lệnh ở nhóm R.
Như vậy, khi thực hiện tính toán, kết quả trả về của các lệnh ADD, SUB,
OR, XOR, AND, SLL, SRL, SRA, SLT, SLTU giữa hai thanh ghi này sẽ cho
kết quả như bảng sau:
Tên lệnh
Mô tả
Kết quả tính tốn lý thuyết
ADD
r6 = r3 + r4
32’b 00000101 00000110 00000111 00011100
SUB
r6 = r3 – r4
32’b 00000101 00000110 00000110 11110010
XOR
r6 = r3 ^ r4
32’b 00000101 00000110 00000111 00010010
OR
r6 = r3 | r4
32’b 00000101 00000110 00000111 00010111
AND
r6 = r3 & r4
32’b 00000000 00000000 00000000 00000101
SLL
r6 = r3 << r4
32’b 11100000 11100000 00000000 00000000
SRL
r6 = r3 >> r4
32’b 00000000 00000000 00000000 00101000
SRA
r6 = r3 >> r4 (extend)
32’b 00000000 00000000 00000000 00101000
SLT
r6 = (r3 < r4)?1:0
32’b 00000000 00000000 00000000 00000000
15
SLTU
r6 = (r3 < r4)?1:0 (ex)
32’b 00000000 00000000 00000000 00000000
Bảng 2.1: Bảng mơ tả tính tốn lý thuyết các lệnh nhóm R
Riêng đối với các lệnh SRA và SLT, SLTU để đảm bảo chính xác ta cần
xét thêm các trường hợp khác.
Ở lệnh SRA có mở rộng bit msb vì thế ta thay giá trị r3 từ 32'h05060707
thành 32'hF5060707 . Khi này nếu kết quả tính tốn đúng sẽ lưu vào:
r6 = 32’b11111111 11111111 11111111 10101000
Ở lệnh SLT và SLT cần thay r3 sao cho r3 nhỏ hơn r4. Khi đó, kết quả
mong đợi là r6 = 32’d1.
2.1.2. Kết quả mô phỏng và so sánh
* Kết quả mô phỏng lệnh ADD.
Để thực hiện mô phỏng lệnh add r6 = r3+ r4 , ta đưa vào bộ nhớ chương
trình (instruction memory) mã lệnh 32 bit như sau:
Sau khi thực hiện hiện mơ phỏng. Dạng sóng các kết nối trong CPU
được thể hiện qua hình sau:
16
Hình 2.1 Dạng sóng mơ phỏng lệnh add
Các đường dữ liệu dataA, dataB, dataD như sau:
Hình 2.2: Dữ liệu dataA, dataB, data B khi thực hiện lệnh add
Dưới đây là thanh ghi Register sau khi thực hiện lệnh add:
17
Hình 2.3: Thanh ghi sau khi thực hiện lệnh add
Như vậy, kết quả tính tốn đúng với lý thuyết.
* Kết quả mô phỏng lệnh SUB
Để thực hiện lệnh sub r6 = r3-r4, ta đưa vào bộ nhớ chương trình
(instruction memory) mã lệnh 32 bit như sau:
Sau khi thực hiện hiện mơ phỏng. Dạng sóng các kết nối trong CPU
được thể hiện qua hình sau:
18
Hình 2.4 Dạng sóng mơ phỏng lệnh sub
Các đường dữ liệu dataA, dataB, dataD như sau:
Hình 2.5: Dữ liệu dataA, dataB, dataD khi thực hiện lệnh sub
Dưới đây là thanh ghi Register sau khi thực hiện lệnh sub:
19
Hình 2.6: Thanh ghi khi thực thi lệnh sub
Như vậy, kết quả tính tốn đúng với lý thuyết.
* Kết quả mô phỏng lệnh XOR
Để thực hiện lệnh xor r6 = r3^r4, ta đưa vào bộ nhớ chương trình
(instruction memory) mã lệnh 32 bit như sau:
Sau khi thực hiện hiện mô phỏng. Dạng sóng các kết nối trong CPU
được thể hiện qua hình sau:
20
Hình 2.7 Dạng sóng mơ phỏng lệnh xor
Các đường dữ liệu dataA, dataB, dataD như sau:
Hình 2.8 Dữ liệu dataA, dataB, dataD khi thực thi lệnh xor
Dưới đây là thanh ghi Register sau khi thực hiện lệnh:
21
Hình 2.9: Thanh ghi khi thực hiện lệnh xor
Như vậy, kết quả tính tốn đúng với lý thuyết.
* Kết quả mô phỏng lệnh OR
Để thực hiện lệnh or r6 = r3|r4, ta đưa vào bộ nhớ chương trình
(instruction memory) mã lệnh 32 bit như sau:
Sau khi thực hiện hiện mô phỏng. Dạng sóng các kết nối trong CPU
được thể hiện qua hình sau:
22
Hình 2.10 Dạng sóng khi thực hiện lệnh or
Các đường dữ liệu dataA, dataB, dataD như sau:
Hình 2.11 Dữ liệu dataA, dataB, dataC khi thực thi lệnh or
Dưới đây là thanh ghi Register sau khi thực hiện lệnh:
23
Hình 2.12 Thanh ghi khi thực hiện lệnh or
Như vậy, kết quả tính tốn đúng với lý thuyết.
* Kết quả mô phỏng lệnh AND
Để thực hiện lệnh and r6 = r3&r4, ta đưa vào bộ nhớ chương trình
(instruction memory) mã lệnh 32 bit như sau:
Sau khi thực hiện hiện mô phỏng. Dạng sóng các kết nối trong CPU
được thể hiện qua hình sau:
24