You are on page 1of 14

ĐẠI HỌC QUỐC GIA TP.

HỒ CHÍ MINH
TRƯỜNG ĐẠI HỌC BÁCH KHOA
KHOA ĐIỆN – ĐIỆN TỬ
---------------o0o---------------

BÁO CÁO BÀI TẬP LỚN


MÔN HỌC: CẤU TRÚC MÁY TÍNH

TIÊU ĐỀ BÀI TẬP LỚN:


THIẾT KẾ CPU CHẠY ĐƠN CHU KỲ VÀ
……………………..
LỚP L01 – NHÓM 6 – HK222
GVHD: Trần Hoàng Linh
Cao Xuân Hải

SVTH: Nguyễn Thành Hưng


Trương Quang Huy
Trần Văn Nam

TP. HỒ CHÍ MINH, NGÀY THÁNG NĂM 2023


THÀNH VIÊN NHÓM

Họ và tên MSSV Chức vụ


Trần Văn Nam 1914254 Nhóm trưởng
Nguyễn Thành Hưng 1913644 Thành viên
Trương Quang Huy 1913572 Thành viên

MỤC LỤ

I. Mục tiêu.................................................................................................................4
Question milestone2.................................................................................................4
II. Thiết kế đơn chu kỳ...........................................................................................7
1. Sơ đồ khối........................................................................................................7
2. Lập bảng phân tích lệnh...................................................................................7
3. Kết quả mô phỏng............................................................................................9
III. ……................................................................................................................... 10
1. Sơ đồ khối......................................................................................................10
2. Kết quả mô phỏng..........................................................................................10
DANH SÁCH HÌNH MINH HỌA

Hình 1. Sơ đồ khối CPU RV32 đơn chu kì....................................................................7


Hình 2. Bảng phân tích lệnh 1.......................................................................................8
Hình 3. Bảng phân tích lệnh 2.......................................................................................9
Hình 4. Chương trình thử nghiệm single cycle..............................................................9
Hình 5 Kết quả mô phỏng tổng dạng sóng single cycle.................................................9
Hình 6 Kết quả các thanh ghi so với mô phỏng.............................................................9
Hình 7 Sơ đồ khối.......................................................................................................10
I. Mục tiêu
- Xem lại sự hiểu biết về SystemVerilog
- Xem lại sự biết về hướng dẫn RV32I
- Thiết kế bộ xử lý RV32I đơn chu kỳ

Question milestone2
Trả lời:
- Chuyển đổi số nhị phân này thành biểu diễn thập lục phân của nó:
16'b0010001110110011
 Để chuyển đổi một số nhị phân thành số thập lục phân, ta chia số nhị phân thành
các đoạn 4 bit, bắt đầu từ bit bên phải nhất, và sau đó ánh xạ mỗi đoạn 4 bit thành một
chữ số thập lục phân tương ứng.
Với số nhị phân 16 bit này:
0010 0011 1011 0011
Chia thành 4 đoạn 4 bit:
0010 0011 1011 0011
Ánh xạ mỗi đoạn 4 bit thành một chữ số thập lục phân:
23B3
Vậy biểu diễn thập lục phân của số nhị phân 16'b0010001110110011 là 0x23B3.
- Chuyển đổi số thập lục phân này thành biểu diễn nhị phân của nó: 16'hEECA
 Biểu diễn nhị phân của số thập lục phân 16'hEECA là 1110111011001010, hoặc
16'b1110111011001010.

- Số thập lục phân bù hai của số thập phân này: 16'd3043


 số thập lục phân bù hai của số thập phân 16'd3043 là 0xFF1D.

- Số thập lục phân bù hai của số thập phân ÂM này: -16’d2022


 số thập lục phân bù hai của số thập phân âm -16'd2022 là 0xFFFA.

- Mở rộng thành số thập lục phân bù hai 16 bit: 8'h15


 số thập lục phân bù hai 16 bit tương ứng với số dương 8 bit 0x15 là 0xFFFB.

- Mở rộng thành số thập lục phân bù hai 16 bit: 8'hE9


 số thập lục phân bù hai 16 bit tương ứng với số âm 8 bit 0xE9 là 0xFFF9.

- Cộng và trừ
• Xác định: 16’h5A78 + 16’h11FE
• Xác định: 16’hEFB7 + 16’h6AA9
• Xác định: 16’h7713 – 16’h3BC1
• Giải thích khái niệm tràn và tràn.

Vậy, 16'h5A78 + 16'h11FE = 16'h6C76
16'hEFB7 + 16'h6AA9 = 16'h6611
16'h7713 - 16'h3BC1 = 16'h3B52
Tràn là khi kết quả của một phép tính vượt quá giá trị tối đa mà một biến có thể lưu
trữ. Ví dụ, nếu ta cộng hai số nguyên dương và kết quả vượt quá giá trị tối đa mà một
số nguyên có thể lưu trữ, thì ta nói đã xảy ra tràn.

- Tính logic
• Xác định: 16’h5A78 và 16’h11FE
• Xác định: 16’hEFB7 or 16’h6AA9
• Xác định: 16’h7713 xor 16’h3BC1

16'h5A78 & 16'h11FE = 16'h1078.
16'hEFB7 or 16'h6AA9 = 16'hEFFF.
16'h7713 xor 16'h3BC1 = 16'h4CD2.

- Dịch chuyển bit


• Xác định: 16’h5A78 < < 5
• Xác định: 16’hEFB7 > > 5
• Xác định: 16’hF713 > > > 5

Vậy 16'h5A78 << 5 = 16'h5E10.
16'hEFB7 >> 5 = 16'h01EF.
16'hF713 >>> 5 = 16'hFFB2.

- So sánh
• Cho hai số 16 bit, toán tử nào có thể được sử dụng để biết chúng là
giống hệt nhau?
• Cho hai số 16 bit, làm thế nào để xác định số nào nhỏ hơn số
khác?

• Để biết hai số 16 bit có giống hệt nhau hay không, ta có thể sử dụng toán tử so sánh
bằng (==). Nếu hai số bằng nhau, toán tử này trả về giá trị true, ngược lại trả về giá trị
false.
• Để xác định số nào nhỏ hơn số khác trong hai số 16 bit, ta có thể sử dụng toán tử so
sánh nhỏ hơn (<). Nếu số thứ nhất nhỏ hơn số thứ hai, toán tử này trả về giá trị true,
ngược lại trả về giá trị false. Ta cũng có thể sử dụng toán tử lớn hơn (>) để xác định
số nào lớn hơn số khác. Nếu số thứ nhất lớn hơn số thứ hai, toán tử này trả về giá trị
true, ngược lại trả về giá trị false.

Trả lời:
 Một unpacked array là một mảng trong đó mỗi phần tử chiếm một vị trí bộ nhớ riêng
biệt. Mặt khác, một packed array là một mảng trong đó nhiều phần tử được lưu trữ
trong một vị trí bộ nhớ.
Trong nhiều ngôn ngữ lập trình, bao gồm một số phiên bản của Fortran và C, các
mảng được giải nén theo mặc định. Điều này có nghĩa là mỗi phần tử trong mảng
được cấp phát địa chỉ riêng của nó trong bộ nhớ. Ví dụ: trong một mảng số nguyên đã
giải nén có ba phần tử (tức là int myArray[3]), phần tử đầu tiên có thể được lưu trữ tại
địa chỉ bộ nhớ 1000, phần tử thứ hai tại địa chỉ 1004 và phần tử thứ ba tại địa chỉ
1008.Mặt khác, các mảng đóng gói được sử dụng trong một số ngôn ngữ lập trình
(chẳng hạn như Verilog và VHDL) để lưu trữ nhiều phần tử của cùng một kiểu dữ liệu
trong một khối bộ nhớ liền kề. Điều này có thể tiết kiệm bộ nhớ và cũng làm cho một
số hoạt động hiệu quả hơn. Trong một mảng các số nguyên được đóng gói có ba phần
tử (tức là int [2:0] myArray), cả ba phần tử có thể được lưu trữ trong một vị trí bộ nhớ
duy nhất, với mỗi giá trị chiếm một số bit nhất định trong vị trí đó. Kiểu đóng gói này
thường được sử dụng trong thiết kế phần cứng, trong đó việc sử dụng bộ nhớ và hiệu
suất đều là những yếu tố quan trọng.
Tóm lại, sự khác biệt chính giữa các packed array và unpacked array là cách chúng
phân bổ bộ nhớ và sự đánh đổi giữa mức sử dụng bộ nhớ và hiệu suất mà chúng mang
lại.

 Để xác định số bit địa chỉ cần thiết cho một kích thước bộ nhớ nhất định, chúng ta
có thể sử dụng công thức: Number of address bits = log2(memory size in bytes)
Cho rằng chúng ta có bộ nhớ 8KB, trước tiên chúng ta có thể chuyển đổi bộ nhớ
này thành byte bằng cách nhân 8KB với 1024 (vì có 1024 byte trong một
kilobyte): 8KB = 8 * 1024 = 8192 bytes Bây giờ chúng ta có thể sử dụng công
thức để xác định số bit địa chỉ cần thiết: Number of address bits = log2(8192) = 13
Do đó, chúng tôi sẽ yêu cầu 13 bit địa chỉ cho bộ nhớ 8KB.

 -$writememh : Từ khóa này được sử dụng để ghi dữ liệu vào một mảng bộ nhớ từ
một tệp có định dạng thập lục phân. Dữ liệu từ tệp được ghi vào bộ nhớ bắt đầu từ
vị trí bộ nhớ đã chỉ định ở định dạng thập lục phân.
 $writememb : Từ khóa này được sử dụng để ghi dữ liệu vào một mảng bộ nhớ từ
một tệp có định dạng nhị phân. Dữ liệu từ tệp được ghi vào bộ nhớ bắt đầu từ vị trí
bộ nhớ đã chỉ định ở định dạng nhị phân.
 $readmemh : Từ khóa này được sử dụng để đọc dữ liệu từ một mảng bộ nhớ vào
một tệp có định dạng thập lục phân. Dữ liệu từ bộ nhớ được đọc, bắt đầu từ vị trí
bộ nhớ đã chỉ định, ở định dạng thập lục phân và được lưu trữ trong tệp.
 $readmemb : Từ khóa này được sử dụng để đọc dữ liệu từ một mảng bộ nhớ vào
một tệp có định dạng nhị phân. Dữ liệu từ bộ nhớ được đọc, bắt đầu từ vị trí bộ
nhớ đã chỉ định, ở định dạng nhị phân và được lưu trữ trong tệp.

II. Thiết kế đơn chu kỳ


1. Sơ đồ khối
CPU RV32I đơn chu kỳ được thiết kế theo sơ đồ khối sau:
Hình 1. Sơ đồ khối CPU RV32I đơn chu kì

 Yêu cầu bổ sung :


- LW: nạp giá trị 32 bit từ một địa chỉ đích trong bộ nhớ vào thanh ghi rd.
- LH: tải giá trị 16 bit từ một địa chỉ đích trong bộ nhớ, sau đó ký-mở rộng nó thành 32
bit trước khi lưu giá trị vào thanh ghi rd.
- LB: nạp giá trị 8 bit từ một địa chỉ đích trong bộ nhớ, sau đó ký-mở rộng nó thành 32
bit trước khi lưu giá trị vào thanh ghi rd.
Hướng dẫn tải không dấu:
- LHU: tải giá trị 16 bit từ một địa chỉ đích trong bộ nhớ, sau đó mở rộng nó thành 32 bit
trước khi lưu giá trị vào thanh ghi rd.
- LBU: tải giá trị 8 bit từ một địa chỉ đích trong bộ nhớ sau đó mở rộng bằng 0 thành 32
bit trước khi lưu giá trị vào thanh ghi rd.
- SW: lưu trữ giá trị 32 bit trong thanh ghi rs2 đến địa chỉ đích trong Bộ nhớ chính.
- SH: lưu giá trị 16 bit (từ bit có nghĩa nhỏ nhất) trong thanh ghi rs2 đến địa chỉ đích
trong Bộ nhớ chính.
- SB: lưu giá trị 8 bit (từ bit có nghĩa nhỏ nhất) trong thanh ghi rs2 đến địa chỉ đích trong
Bộ nhớ chính.
 Giải thích :
-Ở khối slu thêm tín hiệu sl_op có 4 bit từ output khối ctrl_unit để chọn 1 trong
các lệnh bổ sung (LB, LH, LBU, LHU, SB, SH).
- Sau khi chọn được lệnh thì làm việc với datamemory và dùng các phép tính toán
cơ bản để thực hiện theo đúng yêu cầu mỗi lệnh .

2. Lập bảng phân tích lệnh


Tiến hành lập bảng bao gồm các lệnh, đầu vào và ra như hình bên dưới
Hình 2. Bảng phân tích lệnh 1

Hình 3. Bảng phân tích lệnh 2

3. Kết quả mô phỏng


Hình 3 Kết quả mô phỏng tổng dạng sóng single cycle
Hình 4 Kết quả chạy testbench singlecycle.

You might also like