Kiến trúc RISCV, được công bố năm 2014, được các nhân viên tại Đại học Berkeley là Yunsup Lee, Krste Asanovic, David A. Patterson và Andrew Waterman phát triển và nghiên cứu. Mục tiêu ban đầu của dự án RISCV: Thiết kế kiến trúc tập lệnh RISC (ISA) phù hợp để sử dụng trong nhiều ứ dụng, trải rộng từ thiết bị nhúng đến các bộ đa xử lý máy chủ đám mây hi suất cao. ISA dễ sử dụng cho bất kỳ ứng dụng nào, điều này khác với hầu hết các bộ xử lý có sẵn trên thị trường khác. Khả năng tương thích với các hệ trước, tối ưu các chức năng đã có. Cung cấp ISA cơ sở nhỏ, phù hợp để sử dụng trong các thiết bị nhúng. ISA sở là tập các khả năng tối thiểu mà bất kỳ bộ xử lý RISCV nào phải thực hiệ Nó là một kiến trúc của bộ xử lý 32 bits với 31 thanh ghi có mục đích chun ISA cơ sở hỗ trợ phép cộng và phép trừ số nguyên, nhưng không bao gồm ph nhân và phép chia số nguyên. Điều này giảm chi phí phần cứng cho những t vụ không cần thiết. Cung cấp các phần mở rộng ISA tùy chọn để hỗ trợ phép toán học dấu ph động, các phép toán trong bộ nhớ cũng như phép nhân và chia. Cung cấp các phần mở rộng ISA bổ sung để hỗ trợ các chế độ thực thi đ quyền, giống với kiến trúc x86, x64, ARM.
CƠ SỞ LÝ THUYẾT
Giới thiệu RISC-V
Kiến trúc RISC-V, được giới thiệu vào năm 2014, là sản phẩm nghiên cứu và phát triển của nhóm nhân viên tại Đại học Berkeley, bao gồm các chuyên gia Yunsup Lee, Krste Asanovic, David A Patterson và Andrew Waterman.
Mục tiêu ban đầu của dự án RISC-V:
Thiết kế kiến trúc tập lệnh RISC (ISA) rất linh hoạt và phù hợp cho nhiều ứng dụng khác nhau, từ thiết bị nhúng cho đến các hệ thống đa xử lý máy chủ đám mây có hiệu suất cao.
ISA dễ sử dụng cho bất kỳ ứng dụng nào, điều này khác với hầu hết các bộ vi xử lý có sẵn trên thị trường khác
Khả năng tương thích với các hệ trước, tối ưu các chức năng đã có
ISA cơ sở nhỏ được cung cấp để sử dụng trong các thiết bị nhúng, bao gồm các khả năng tối thiểu mà bất kỳ bộ xử lý RISC-V nào cũng cần phải thực hiện.
Kiến trúc bộ xử lý 32 bit này có 31 thanh ghi chung, với ISA cơ bản hỗ trợ phép cộng và trừ số nguyên, nhưng không bao gồm phép nhân và chia Điều này giúp giảm chi phí phần cứng cho các tác vụ không cần thiết.
Cung cấp các phần mở rộng ISA tùy chọn nhằm hỗ trợ các phép toán học dấu phẩy động, các phép toán trong bộ nhớ, cũng như thực hiện phép nhân và chia một cách hiệu quả.
Cung cấp các phần mở rộng ISA bổ sung để hỗ trợ các chế độ thực thi đặc quyền, giống với kiến trúc x86, x64, ARM
Hỗ trợ tập lệnh nén, triển khai phiên bản 16 bits của nhiều lệnh 32 bits, các lệnh
16 bits có thể được xen kẽ với các lệnh 32 bits
Phần mở rộng ISA tùy chọn có thể hỗ trợ kích thước bộ 64 bits và có thể lên đến 128 bits bằng cách xử dụng bộ nhớ ảo.
Các bước thực hiện
Hình 1.1 Từ ngôn ngữ bậc cao đến cấu trúc cổng logic
Quá trình biên dịch một câu lệnh từ ngôn ngữ bậc cao đến cấu trúc của các cổng logic được mô tả qua các bước cụ thể: đầu tiên, ngôn ngữ bậc cao sẽ được chuyển đổi sang Assembly, tiếp theo là dịch sang mã máy Sau khi có mã máy, quá trình tiếp tục chuyển hóa thành mô tả cấu trúc phần cứng, và cuối cùng là mô tả mạch logic.
Datapath
Hình 1.2 Các giai đoạn để thực hiện 1 chu kỳ lệnh
Hình 1.2 mô tả 1 chu kỳ lệnh mà bộ RISC-V thực hiện, nó gồm 5 giai đoạn
Giai đoạn IF: Giai đoạn nạp lệnh
Giai đoạn ID: Giai đoạn giải mã lệnh
Giai đoạn EX: Giai đoạn thực thi lệnh
Giai đoạn MEM: Giai đoạn truy cập bộ nhớ
Giai đoạn WR: Giai đoạn ghi dữ liệu vào tệp thanh ghi
1.3.1 Xây dựng đường dữ liệu
Hình 1.3 Các thành phần của CPU
Hình 1.3 mô tả cấu trúc của CPU gồm có các phần chính sau: bộ nhớ dữ liệu (data memory), thanh ghi (registers), instruction memory, bộ đếm (PC)
Khối tính toán logic ALU
Khối IF là thành phần đầu tiên trong chu kỳ lệnh, chịu trách nhiệm lưu trữ các lệnh của chương trình dưới dạng mã máy Mỗi lệnh được chuyển đổi sang mã máy có kích thước 32 bits, với đầu vào là địa chỉ của lệnh cần lấy và đầu ra là mã máy tương ứng của lệnh đó.
Hình 1.4 Cấu tạo của khối IF
Khối IF bao gồm bộ nhớ lệnh Instruction Memory, với một cổng đọc nhận địa chỉ lệnh 32 bits đầu vào và xuất ra 32 bits mã máy Đầu vào của khối này được cung cấp từ đầu ra của bộ đếm chương trình PC.
Bộ đếm chương trình (PC) là một thanh ghi 32 bits, hoạt động đồng bộ với xung Clock, có nhiệm vụ đếm địa chỉ khi nạp lệnh Đầu ra của PC chỉ đến lệnh hiện tại, trong khi đầu vào nhận địa chỉ của câu lệnh tiếp theo Khi có tín hiệu thực hiện lệnh mới, PC sẽ tự động cộng thêm 4.
Khối cộng Add gồm 2 đầu vào, một là địa chỉ ở thời điểm hiện tại, đầu còn lại là hằng số 4 Khối này có nhiệm vụ tăng PC lên 4
Quá trình thực hiện lệnh loại R bao gồm việc đọc dữ liệu của hai toán hạng từ thanh ghi, sau đó thực hiện phép toán với hai giá trị đã đọc và ghi kết quả vào thanh ghi đích trong khối Register File.
Tệp thanh ghi là thành phần chính trong đường dữ liệu, bao gồm 32 thanh ghi trong kiến trúc RISC-V, mỗi thanh ghi có kích thước 32 bits Mỗi thanh ghi trong tệp này có khả năng đọc và ghi dữ liệu, đóng vai trò quan trọng trong quá trình xử lý thông tin.
Hình 1 5 Khối tệp thanh ghi
Tệp thanh ghi (Register File) được cấu tạo với hai đầu vào: một để chỉ định số thanh ghi cần ghi và một để cung cấp dữ liệu vào thanh ghi Nó luôn xuất ra nội dung của bất kỳ thanh ghi nào thông qua đầu vào của thanh ghi đọc Quá trình ghi được điều khiển bởi tín hiệu điều khiển ghi, cần phải đồng bộ với hệ thống Đối với bộ xử lý RISC-V, tệp thanh ghi yêu cầu 4 đầu vào (3 đầu chỉ định thanh ghi 5 bits và 1 đầu 32 bits đưa dữ liệu vào) và 2 đầu ra mang dữ liệu 32 bits.
Tệp thanh ghi chia làm 2 loại ứng với 2 chức năng đọc và ghi
Hình 1.6 Tệp thanh ghi đọc Đầu vào:
Gồm 2 tín hiệu đọc 1 và 2 được đưa vào khối MUX bằng 2 thanh ghi read number
1 và read number 2 có chiều dài 5 bits để lựa chọn thanh ghi cần đọc Đầu ra:
Gồm 2 thanh ghi read data 1 và read data 2 có chiều dài 32 bits mang dữ liệu đọc
Hình 1.7 Tệp thanh ghi ghi
Hình 1.7 minh họa cấu trúc của tệp thanh ghi, bao gồm tín hiệu ghi write dài 1 bit để điều khiển quá trình đọc dữ liệu, số thanh ghi dài 5 bits dùng để chọn thanh ghi, và dữ liệu ghi dài 32 bits để lưu trữ thông tin vào tệp thanh ghi Các thanh ghi trong tệp được trình bày chi tiết trong bảng 1.7 dưới đây.
Bảng 1 Bảng mô tả chức năng các thanh ghi
Khối tính toán logic ALU
Hình 1.8 Mô tả khối ALU
Khối ALU, như mô tả trong Hình 1.8, bao gồm hai đầu vào A và B với chiều dài 32 bits, một đầu ra result cũng 32 bits, và một tín hiệu điều khiển OpSelect dài 4 bits để lựa chọn các toán tử cần thực thi.
Lệnh loại I gồm 2 loại nhỏ là load và store, việc thực hiện lệnh này trải qua 3 giai đoạn sau:
* Lấy dữ liệu đọc từ tệp thanh ghi
* Tính toán giá trị địa chỉ để lưu giá trị đang có
Đọc dữ liệu từ bộ nhớ và ghi giá trị vào địa chỉ thanh ghi thông qua lệnh load, hoặc ngược lại, đọc dữ liệu từ thanh ghi hiện tại và ghi giá trị vào địa chỉ bộ nhớ bằng lệnh store.
1.3.3.1 Khối bộ nhớ dữ liệu
Hình 1.9 minh họa khối bộ nhớ dữ liệu, nơi đầu vào bao gồm địa chỉ và dữ liệu cần ghi, trong khi đầu ra là dữ liệu được đọc từ bộ nhớ Khối này có tín hiệu đọc và ghi được điều khiển riêng biệt, khác với tệp thanh ghi đã đề cập trước đó, và yêu cầu một tín hiệu cho phép đọc.
Hình 1.10 mô tả khối immediate, khối này có đầu vào 16 bits, đầu ra là 32 bits
Hình 1.11 Sơ đồ đường dữ liệu của lệnh loại B
Lệnh loại B trong kiến trúc máy tính được mô tả qua hình 1.11, bao gồm 3 toán hạng và 2 thanh ghi để so sánh dữ liệu Đường dữ liệu sử dụng 12 bits offset để xác định địa chỉ nhảy của bộ đếm chương trình (PC), tính toán theo công thức (PC + immediate) Nếu điều kiện so sánh được thỏa mãn, chương trình sẽ nhảy đến địa chỉ mới; ngược lại, nó sẽ tiếp tục thực hiện lệnh kế tiếp tại (PC + 4).
1.3.5 Kết hợp các loại lệnh trong datapath
Quy định thực hiện lệnh trong một chu kỳ
Mỗi phần tử của đường dữ liệu chỉ có thể thực hiện một chức năng tại một thời điểm
Cần phân tách bộ nhớ riêng biệt
Sử dụng bộ ghép kênh trong đó các nguồn dữ liệu thay thế sử dụng cho các hướng dẫn khác nhau
Hình 1.12 Đường dữ liệu loại R với lệnh ld và sd
Hình 1.12 mô tả đường dữ liệu loại R với câu lệnh ld và sd
Hình 1.13 Sơ đồ lệnh loại R kết hợp với lệnh loại B
Hình 1.13 mô tả sự kết hợp giữa lệnh loại R và lệnh loại B
1.3.6 Thực hiện một chương trình trên bộ xử lý RISC-V
Khối ALU control điều khiển khối ALU dựa trên các trường funct7, funct3 và điều khiển 2 bits ALUOp
ALUOp = 00 với lệnh ld, sd
ALUOp = 10 với lệnh R-type Đầu ra của khối ALU control là 1 tín hiệu 4 bits lực chọn hoạt động của khối ALU
Hoạt động của các lệnh trong bộ xử lý RISC-V dựa trên bốn phép toán cơ bản là AND, OR, ADD và SUBTRACT Các phép toán này là nền tảng cho việc thực hiện các thao tác trong kiến trúc RISC-V.
Bảng 2 Bảng truth table cho khối ALU 4 bits
Bảng 3 Bảng cấu trúc mã lệnh của 4 loại lệnh
Trường opcode gồm 7 bits (từ 0 đến 6)
Thanh ghi nguồn rs1 ở bị trí 15 đến 19 đối với lệnh loại R
Thanh ghi nguồn rs2 ở vị trí 20 đến 24 đối với lệnh loại R
Mã lệnh có thể có 12 bits offset
Thanh ghi đích rd ở vị trí 7 đến 11 đối với lệnh loại R
Hình 1.14 Datapath của lệnh từ bộ nhớ đến tập thanh ghiui
Khối điều khiển Control Unit tính toán tín hiệu điều khiển trên đường Opcode[6:0] tương ứng vói Branch, Memread, MemtoReg, ALOUp, MemWrite, ALUSrc, RegWrite
Tín hiệu ALUOp có 2 bits còn lại đều có 1 bit
Bảng 4 Bảng mô tả chức năng các đường dữ liệu trong ALU Control Unit
RegWrite None Dữ liệu được phép ghi ở đầu vào Writedata của tệp thanh ghi
ALUSrc Toán hạng thứ 2 của khối
ALU là đầu ra của tệp thanh ghi (Read data 2)
Toán hạng thứ 2 của khối ALU là dấu mở rộng, 12 bit của mã lệnh
PCSrc Giá trị của bộ đếm PC được cập nhật bởi đầu ra kết của của bộ cộng PC + 4
Giá trị của bộ đếm PC được điều chỉnh dựa trên đầu ra của bộ cộng tính, phản ánh địa chỉ mà PC đạt được khi các điều kiện rẽ nhánh được thỏa mãn.
MemRead None Tín hiệu cho phép đầu ra của bộ nhớ được đọc dữ liệu
MemWrite None Tín hiệu cho phép đầu vào của bộ nhớ được ghi dữ liệu
RegWrite Giá trị đầu ra của ALU được ghi trở lại vào tệp thanh ghi
Giá trị đầu ra của Bộ nhớ được ghi trở lại vào tệp thanh ghi
Hình 1.15 Sơ đồ toàn bộ đường dữ liệu Control Unit
Hình 1.15 mô tả toàn bộ đường đi của control unit
Hình 1.16 Cấu tạo lệnh I chi tiết
12 bits của mã lệnh (inst[30:10]) sao chép đến 12 bits thấp nhất của immediate (imm[31:12])
Lấp đầy 20 bits còn lại (imm[31:12]) của mã immediate bằng giá trị của bit thứ 32 (inst[31]) của mã lệnh
Hình 1.17 Cấu tạo khối Immediate generation unit
Hình 1.18 Cấu tạo khối Branch Comparator
BrUn = 1, nếu kết quả âm, = 0 nếu dương
Quá trình thực thi lệnh trong 1chu kỳ của bộ xử lý RISC-V được chia thành 5 giai đoạn được mô tả lại như sau
Giai đoạn IF (Instruction Fetch Stage) bắt đầu quá trình thực hiện lệnh thông qua bộ đếm chương trình (PC), cung cấp địa chỉ lệnh cần thực thi Bộ Mux2-1 trong khối PC thực hiện việc lựa chọn hoạt động của bộ đếm chương trình dựa vào tín hiệu PCSel Khi PCSel được bật, đầu vào của PC là địa chỉ được tính toán từ khối ALU sau khi thực hiện lệnh Nếu PCSel = 0, đầu vào PC sẽ là địa chỉ lệnh kế tiếp (PC + 4) do bộ cộng Adder cung cấp Khối bộ nhớ lệnh IMEM nhận đầu vào là địa chỉ lệnh 32 bit từ PC và xuất ra mã máy 32 bit của lệnh.
In the Instruction Decode Stage (ID), the Register File receives the instruction code Inst[31:0] from the instruction memory (IMEM) through the 5-bit address signals AddrA, AddrB, and AddrD, which are used to select the registers for reading and writing.
AddrA thường là tín hiệu của thanh ghi nguồn 1 nhận mã lệnh Inst[19:15]
AddrB là tín hiệu của thanh ghi nguồn 2 nhận mã lệnh Inst[24:20]
AddrD là tín hiệu của thanh ghi đích nhận mã lệnh Inst[11:7]
Datapath cho các định dạng lệnh
Bảng 5 Bảng cấu trúc lệnh loại R
Triển khai (ví dụ add)
Hình 1.20 Ánh xạ cú pháp với ví dụ lệnh R
Lệnh add thực hiện theo 2 bước:
Reg[rd] = Reg[rs1] + Reg[rs2]
Hình 1.21 Datapath cho lệnh Add
Hỉnh 1.21 mô tả đường dữ liệu khi câu lệnh add được gọi đến
Lệnh bắt đầu bằng việc sử dụng bộ đếm chương trình (PC) để cung cấp địa chỉ lệnh cho bộ nhớ lệnh Sau khi lệnh được thực hiện, PC sẽ tăng thêm 4 để xác định địa chỉ lệnh tiếp theo.
Sau khi lệnh được tìm nạp, các toán hạng thanh ghi rs1 và rs2 cùng với thanh ghi đích rd sẽ được giải mã thông qua các trường của lệnh với địa chỉ tương ứng là Addr A và Addr B.
Addr D ứng với các thanh ghi data A, data B, data D trong tệp thanh ghi
Sau khi 2 toán hạng thanh ghi được tìm nạp sẽ đi vào khối ALU để thực hiện phép cộng logic số học
Kết quả đầu ra của ALU là giá trị thanh ghi rd, được ghi vào thanh ghi Data D tại địa chỉ Addr D Tín hiệu điều khiển RegWrite = 1 cho phép thực hiện quá trình ghi dữ liệu này.
Sau khi thực thi xong PC sẽ cập nhật lên 4 để nhảy đến câu lệnh tiếp theo
Ví dụ: Lệnh tính toán số học/logic với giá trị trực tiếp
Hình 1.22 Ánh xạ cú pháp với ví dụ lệnh I
Hình 1.23 Datapath cho lệnh Addi
Hình 1.23 mô tả đường dữ liệu của câu lệnh addi khi được gọi
Lệnh bắt đầu bằng cách sử dụng bộ đếm chương trình (PC) để cung cấp địa chỉ lệnh cho bộ nhớ lệnh, sau đó PC sẽ tăng lên 4 để xác định địa chỉ của lệnh tiếp theo.
Sau khi lệnh được tìm nạp, hai thanh ghi x1 và thanh ghi đích x15 sẽ được giải mã thông qua các trường của lệnh, với địa chỉ lần lượt là Addr A và Addr D, tương ứng với các thanh ghi data A và data D trong tệp thanh ghi.
Giá trị imm -50 đưa vào khối Imm Gen (ImmSel =1)
ALU thực hiện phép cộng với đầu vào là giá trị thanh ghi Data A (x1) và giá trị imm -50 trong khối Imm Gen
Các tín hiệu điều khiển: Bsel=1( rs2=0/Imm=1) vì đây là cộng giá trị trực tiếp, giá trị này nằm trong khối Imm Gen, rs2 trống
ALUSel=1 (cộng với giá trị âm)
Kết quả đầu ra ghi vào thanh ghi data D Tín hiệu điều khiển RegWrite =1 cho phép thực hiện việc ghi dữ liệu này
Sau khi thực thi xong PC sẽ cập nhật lên 4 để nhảy đến câu lệnh tiếp theo
Hình 1.24 Ánh xạ cú pháp với ví dụ lệnh loại S
Hình 1.25 Datapath cho lệnh sw
Lệnh bắt đầu bằng cách sử dụng bộ đếm chương trình (PC) để cung cấp địa chỉ lệnh cho bộ nhớ lệnh Sau khi thực hiện lệnh, PC sẽ tự động tăng lên 4 để xác định địa chỉ lệnh tiếp theo.
Sau khi lệnh được truy xuất, các thanh ghi cơ sở x2 và thanh ghi toán hạng x14 sẽ được giải mã thông qua các trường của lệnh, với địa chỉ lần lượt là Addr A và Addr B, tương ứng với dữ liệu trong các thanh ghi data A và data B.
Gía trị imm +8 đưa vào khối Imm Gen (ImmSel =S)
ALU thực hiện tính địa chỉ của Data Memmory với đầu vào là giá trị thanh ghi cơ sở Data A (x2) và giá trị imm+8 trong khối Imm Gen
Các tín hiệu điều khiển: Bsel=1( rs2=0/Imm=1)
ALUSel= Add thực hiện cộng địa chỉ x2+8
Kết quả đầu ra của ALU được ghi vào bộ nhớ Dmem tại địa chỉ addr tương ứng với thanh ghi DataR Khi tín hiệu MemRw được thiết lập ở chế độ Write, dữ liệu từ thanh ghi x14 (Data B) sẽ được ghi vào bộ nhớ.
Sau khi thực thi xong PC sẽ cập nhật lên 4 để nhảy đến câu lệnh tiếp theo
Có 6 lệnh rẽ nhánh là beq, bne, blt, bge, bltu, bgeu
Hình 1.26 Cấu trúc 1 câu lệnh loại B tổng quát
Hình 1.27 Datapath của lệnh BEQ
Lệnh bắt đầu bằng cách sử dụng bộ đếm chương trình (PC) để cung cấp địa chỉ lệnh cho bộ nhớ lệnh Nếu không có rẽ nhánh, PC sẽ tăng thêm 4 để xác định địa chỉ lệnh tiếp theo Trong trường hợp có rẽ nhánh, PC sẽ cộng thêm phần bù imm của nhãn so với lệnh hiện tại.
Sau khi lệnh được tìm nạp, hai thanh ghi toán hạng rs1 và rs2 sẽ được giải mã thông qua các trường của lệnh, với địa chỉ lần lượt là Addr A và Addr B, tương ứng với thanh ghi dữ liệu.
A, data B trong tệp thanh ghi
Gía trị imm đưa vào khối Imm Gen (ImmSel =B)
Bộ so sánh Branch Comp thực hiện so sánh giá trị lưu trữ trong 2 thanh ghi A,
B (MemRW=read cho phép đọc dữ liệu từ bộ nhớ phục vụ cho việc so sánh)
ALU thực hiện phép cộng địa chỉ bằng cách sử dụng giá trị PC hiện tại và giá trị imm từ khối Imm Gen, nhằm xác định địa chỉ lệnh tiếp theo Điều này quyết định xem lệnh có phải là lệnh rẽ nhánh hay không.
Hình 1.28 Cấu trúc 1 câu lệnh loại J tông quát
Lệnh loại J thực hiện theo 2 bước:
Lưu PC + 4 vào thanh ghi rd
Đặt PC = PC + offset (PC – Relative jump)
Hình 1.29 Datapath cho lệnh jal
Lệnh bắt đầu bằng việc sử dụng bộ đếm chương trình (PC) để cung cấp địa chỉ lệnh cho bộ nhớ lệnh Địa chỉ trả về được lưu trữ là PC+4, và sau đó, phần bù imm của nhãn sẽ được cộng vào địa chỉ này để thực hiện nhảy đến nhãn mong muốn Để cho phép ghi, tín hiệu RegWEn được thiết lập thành 1.
PC+4 vào thanh ghi rd)
Sau khi lệnh được tìm nạp, giá trị imm đưa vào khối Imm Gen (ImmSel =J)
ALU thực hiện phép cộng địa chỉ bằng cách sử dụng giá trị hiện tại của PC và giá trị imm từ khối Imm Gen, nhằm xác định địa chỉ lệnh nhãn mà cần nhảy đến Khi Bsel=1, đầu vào là imm, và ALUSel thực hiện phép cộng để tính toán địa chỉ này.
Hình 1.30 Cấu trúc 1 câu lệnh loại U tổng quát
Lệnh bắt đầu bằng cách sử dụng bộ đếm chương trình (PC) để cung cấp địa chỉ lệnh cho bộ nhớ lệnh Sau khi thực hiện lệnh, PC sẽ tăng lên 4 để xác định địa chỉ lệnh tiếp theo.
Sau khi lệnh được truy xuất, thanh ghi đích rd sẽ được giải mã thông qua các trường của lệnh, với địa chỉ Addr D tương ứng với thanh ghi data D trong tệp thanh ghi.
Giá trị imm đưa vào khối Imm Gen (ImmSel =U)
Khối ALU để thực hiện phép cộng logic số học
THỰC HÀNH
Tổng quan phần mềm RIPES
Ripes là phần mềm mô phỏng bộ xử lý cho kiến trúc tập lệnh RISC-V Phần mềm bao gồm các chức năng chính liên quan đến datapath như:
Tab biên tập bao gồm hai phần: bên trái cho phép người dùng viết và biên dịch các chương trình hợp ngữ C, trong khi bên phải hiển thị các câu lệnh assembly của cấu trúc lệnh RISC-V.
Tab bộ xử lý là nơi cung cấp cái nhìn tổng quan về chế độ hoạt động của bộ xử lý được chọn, bao gồm đơn xung nhịp, đường ống và các thông tin quan trọng liên quan đến quá trình thực thi.
1 Registers : chứa tất cả các thanh ghi, giá trị của từng thanh ghi đó trong bộ xử lý 2- Intruction memory : Chế độ xem chương trình hiện tại được tải trong mô phỏng 3- Statistics : Các thống kê về số chu kì, số intruction,…
4- Output : Hiển thị đầu ra của các lệnh như ecall trong assembly hoặc printf trong C
The processor view: Các mô hình bộ xử lý trong Ripes mô phỏng các trạng thái của datapath thông qua hình ảnh trực quan
Selecting Processor Model: Cung cấp khả năng ảnh hưởng khác nhau đến việc thực thi trương trình Ripes cung cấp 5 chương trình như sau:
Mô phỏng
Trong phần này em xin trình bày thực hiện 1 chương trình C mô phỏng datapath của bộ xử lý đơn xung nhịp
Trong đoạn mã C dưới đây, chúng ta thực hiện một chương trình đơn giản để cộng hai mảng, mỗi mảng gồm hai phần tử Kết quả của phép cộng sẽ được lưu trữ trong một mảng khác.
Sau khi khi chạy chuyển sang code Assembly
Sau khi biên dịch, chúng ta tập tập trung vào các label_start, main, exit
Khi bắt đầu chạy thì lệnh sẽ được thực hiện ở label_start
Hình 2.7 Label_start in Assembly Code
Hình 2.7 minh họa lable_start trong mã assembly, tại thời điểm này, chương trình sẽ khởi tạo các lệnh khởi động cho bộ xử lý, sau đó các lệnh này sẽ được thực thi trong hàm main.
Sau bước khởi tạo, chương trình sẽ nhảy đến hàm main thông qua lệnh jal x1 112
Hình 2.8 Label in Assembly Code Ở bước này, chương trình tiến hành cộng 2 mảng với nhau thông qua các dữ liệu đã khởi tạo trước đó
Hình 2.9 Datapath lệnh add khi mô phỏng
Hình trên minh họa quá trình cộng hai phần tử đầu tiên của hai mảng Giá trị đầu tiên của mảng a được lưu trữ trong thanh ghi x14 với giá trị 15, trong khi giá trị đầu tiên của mảng b được lưu trong thanh ghi x15 với giá trị 2 Chương trình sẽ thực hiện phép cộng add x14 x14 x15 để tính tổng hai phần tử, và kết quả sẽ được lưu lại trong thanh ghi x14.
Kết quả cuối cùng thu được:
Hình 2.10 Thống kê chương trình
Hình 2.10 mô tả thống kê của chương trình sau khi thực hiện chạy, chương trình C như trên đã thực hiện 305 cycles, 305 instruction