Monday, September 16, 2019

[Design][Thiết kế CPU 32 bit] [Bài 1] Các khái niệm cơ bản trong thiết kế CPU RISC-V 32 bit

Tác giả: TrongTran
Ngày: 16/09/2019

Tài liệu tham khảo: www-inst.eecs.berkeley.edu/~cs61c/fa18/img/riscvcard.pdf và tài liệu học tập từ trường đại học Bách Khoa TP.HCM (Bộ môn Điện-Điện tử).

Đây là chuỗi bài hướng dẫn thiết kế 1 CPU RISC-V 32 bit.

Mình nói 1 chút về xu hướng phát triển của RISC-V nhé. Xu hướng trước đây đó là CPU càng thực hiện được nhiều câu lệnh thì càng tốt. Nghĩa là các nhà thiết kế luôn hướng đến việc thiết kế sao cho CPU có thể thực hiện nhiều câu lệnh nhất có thể.

Ví dụ: Kiến trúc VAX đã có thể hỗ trợ nhân đa thức.

Tuy nhiên, Về sau người ta nhận thấy rằng để thiết kế một CPU có thể chạy nhiều câu lệnh làm cho area tăng đáng kể và năng lượng tiêu tốn cũng cao, thời gian xử lí dài. Từ đó một xu hướng mới xuất hiện đó là CPU thực hiện càng ít câu lệnh càng tốt nhưng phải đảm bảo đầy đủ chức năng của nó.
Trong bài này, chúng ta sẽ tìm hiểu một số khái niệm cơ bản trước khi đi vào thiết kế CPU RISC-V 32 bit chi tiết.

1. Mã máy

Máy tính không thể nào hiểu được các câu lệnh bậc cao mà bạn vẫn hay viết hằng ngày. Những câu lệnh đó mang các từ gợi nhớ và đa dạng (Tuỳ loại ngôn ngữ mà có các tập lệnh khác nhau). Nó giúp cho lập trình viên dễ dàng ghi nhớ, tránh sai sót và nhầm lẫn trong quá trình code.  Để chạy được các câu lệnh đó ta phải sử dụng 1 trình biên dịch để chuyển từ đoạn code viết bằng ngôn ngữ bậc cao sang mã máy. 
Mã máy là đoạn mã chỉ bao gồm các bit 0 hoặc 1 mang các ý nghĩa nhất định tuỳ vào cách định nghĩa của CPU.
Ví dụ :
CPU 16 bit sẽ có mã của câu lệnh “add” khác với CPU 32 bit.
Ưu điểm của ngôn ngữ bậc cao so với mã máy.
Hãy tưởng tượng bạn chỉ code với mã máy và làm việc với các chỉ số 0/1 thì công việc sẽ trở nên khó khăn hơn, khó quan sát, dễ nhầm lẫn và tốn nhiều thời gian để học.
Ngôn ngữ bậc cao giúp bạn dễ nhớ, học và làm việc nhanh hơn.

Dưới đây là mô hình cấu trúc của ngôn ngữ

Ngôn ngữ bậc cao

temp = v[k];
v[k] = v[k+1];
v[k+1] = temp;

Ngôn ngữ assembly

lw x3, 0(x10);
lw x4, 4(x10);
sw x4, 0(x10);
sw x3, 4(x10)

Mã máy

1000 1101 1110 0010 0000 0000 0000 0000
1000 1110 0001 0000 0000 0000 0000 0100
1010 1110 0001 0010 0000 0000 0000 0000
1010 1101 1110 0010 0000 0000 0000 0100

2. Thanh ghi.

Ta có thể nhìn nhận như sau:
CPU 16 bit: Sẽ có 16 thanh ghi (Từ R0 -> R15).
CPU 32 bit: Sẽ có 32 thanh ghi để xử lí (từ R0 -> R31).
CPU 64 bit: Sẽ có 64 thanh ghi (Từ R0 -> R63).
Trong đó sẽ có một vài thanh ghi mang các giá trị đặc biệt không đổi. Nghĩa là dù ta có WRITE bất kì giá trị nào vào đi nữa thì giá trị thanh ghi đó vẫn không thay đổi giá trị.
Chẳng hạn, trong bài này, Mình thiết kế CPU 32 bit có thanh ghi R0 luôn mang giá trị 0.

Ngoài ra, sẽ có các vùng thanh ghi thực hiện các nhiệm vụ đặc biệt chẳng hạn như vùng chứa các biến tạm trong tính toán, vùng chứa flag ..v…v.

3. Đơn vị

Như các bạn đã biết có rất nhiều cách định nghĩa 1 word:
1 word = 16 bit.
1 word = 32 bit.
1 word = 64 bit.
….
Trong bài này do chúng ta thiết kế CPU 32 bit nên mình sẽ quy định luôn
1 word = 4 byte = 32 bit.
1 half word = 2 byte = 16 bit.

4. Cách tính địa chỉ read/write.

Trong memory mỗi một đơn vị địa chỉ sẽ chứa tối đa 8 bit data = 1 byte data.

Nghĩa là nếu bạn muốn đọc dữ liệu 1 byte data từ memory và đọc 2 vùng data trên memory liên tục nhau thì bạn cộng địa chỉ lên 1 đơn vị.
Địa chỉ 01: Data AA (AA: mã hex 8 bit data).
Địa chỉ 02: Data BB (BB: mã hex 8 bit data).

Trong trường hợp ta không READ/WRITE 1 lần 8 bit data mà READ/WRITE 1 lần 32 bit thì nên cộng địa chỉ với 4.

5. Big endian và little endian

Big Endian
Least Significant bit (Bit có trọng số thấp nhất trong chuỗi dữ liệu) luôn được lưu ở ô nhớ có địa chỉ lớn nhất còn Most Significant Bit (Bit có trọng số cao nhất trong chuỗi dữ liệu) được lưu ở ô nhớ có địa chỉ nhỏ nhất trong vùng lưu trữ của biến.

Little Endian
Ngược lại với các nền tảng sử dụng big endian, ở các nền tảng sử dụng little endian, LSB luôn được lưu ở ô nhớ có địa chỉ nhỏ nhất còn MSB được lưu ở ô nhớ có địa chỉ lớn nhất trong vùng lưu trữ của biến.


Bài tiếp theo chúng ta sẽ tìm hiểu về tập lệnh assembly trong thiết kế CPU RISC-V 32 bit.

No comments:

Post a Comment

Cách tính BW và latency trong 1 hệ thống SoC sử dụng chuẩn giao tiếp AXI protocol

Tác giả:  TrongTran Ngày:  31/12/2019 Nếu bạn nào đang làm về verification cho system performance (ST) thì bài này sẽ bổ ích cho bạn. Ngày ...