Câu nào sau đây đúng về độ dài lệnh của máy RISC

Bài viết này giới thiệu kiến trúc bộ xử lý RISC-V [được phát âm là năm rủi ro ] thú vị, tương đối mới và tập lệnh của nó. RISC-V là một đặc tả mã nguồn mở hoàn toàn cho một bộ xử lý tập lệnh rút gọn. Một thông số kỹ thuật tập lệnh hoàn chỉnh ở chế độ người dùng [không đặc quyền] đã được phát hành và một số triển khai phần cứng rẻ tiền của kiến ​​trúc này hiện có sẵn.

Công việc đang được tiến hành để phát triển các thông số kỹ thuật cho một số phần mở rộng tập lệnh để hỗ trợ tính toán mục đích chung, tính toán hiệu suất cao và các ứng dụng nhúng yêu cầu kích thước mã tối thiểu. Các bộ xử lý có sẵn trên thị trường triển khai nhiều phần mở rộng phát triển này.

Kiến trúc và tính năng của RISC-V

Kiến trúc 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 ở Berkeley bởi Yunsup Lee, Krste Asanović, David A. Patterson và Andrew Waterman. Nỗ lực này tiếp nối bốn dự án thiết kế kiến ​​trúc RISC lớn trước đây tại UC Berkeley, dẫn đến cái tên RISC-V, trong đó V đại diện cho số năm La Mã.

Dự án RISC-V bắt đầu như một bản sạch với các mục tiêu chính sau:

  • Thiết kế kiến ​​trúc tập lệnh RISC [ISA] phù hợp để sử dụng trong nhiều ứng dụng, trải rộng từ các thiết bị nhúng công suất vi mô đến các bộ đa xử lý máy chủ đám mây hiệu suất cao.
  • Cung cấp ISA mà bất kỳ ai cũng có thể sử dụng miễn phí cho bất kỳ ứng dụng nào. Điều này trái ngược với ISA của hầu hết tất cả các bộ vi xử lý có sẵn trên thị trường khác, vốn là tài sản trí tuệ được bảo vệ cẩn thận của công ty thiết kế chúng.
  • Kết hợp các bài học kinh nghiệm từ nhiều thập kỷ trước về thiết kế bộ xử lý, tránh những sai lầm và các tính năng không tối ưu mà các kiến ​​trúc khác phải giữ lại trong các thế hệ mới hơn để duy trì khả năng tương thích với các thế hệ trước, đôi khi là cổ xưa.
  • Cung cấp ISA cơ sở nhỏ nhưng đầy đủ phù hợp để sử dụng trong các thiết bị nhúng. ISA cơ sở là tập hợp các khả năng tối thiểu mà bất kỳ bộ xử lý RISC-V nào phải thực hiện. RISC-V cơ sở là một kiến ​​trúc bộ xử lý 32-bit với 31 thanh ghi có mục đích chung. Tất cả các hướng dẫn đều dài 32 bit. ISA cơ sở hỗ trợ phép cộng và trừ số nguyên, nhưng không bao gồm phép nhân và phép chia số nguyên. Điều này là để tránh buộc các triển khai bộ xử lý tối thiểu phải bao gồm phần cứng nhân và chia khá đắt tiền cho các ứng dụng không yêu cầu các hoạt động đó.
  • Cung cấp các phần mở rộng ISA tùy chọn để hỗ trợ toán học dấu phẩy động, các phép toán trong bộ nhớ nguyên tử 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 đặc quyền, tương tự như các kiến ​​trúc đặc quyền x86, x64 và ARM.
  • Hỗ trợ tập lệnh nén, triển khai các phiên bản 16-bit của nhiều lệnh 32-bit. Trong các bộ xử lý triển khai phần mở rộng này, các lệnh 16 bit có thể được xen kẽ tự do với các lệnh 32 bit.
  • Cung cấp các phần mở rộng ISA tùy chọn để hỗ trợ kích thước từ bộ xử lý 64 bit và thậm chí 128 bit bằng cách sử dụng bộ nhớ ảo được phân trang trên bộ xử lý đơn và đa lõi cũng như trong các cấu hình đa xử lý.

Bộ xử lý RISC-V hiện có sẵn với giá cả cạnh tranh và, với sự tinh tế của thiết kế ISA và những ưu điểm của tính chất miễn phí sử dụng, chúng ta có thể mong đợi việc sử dụng bộ xử lý RISC-V sẽ phát triển nhanh chóng trong những năm tới. Có sẵn các bản phân phối RISC-V Linux, bao gồm tất cả các công cụ phát triển phần mềm cần thiết để xây dựng và chạy các ứng dụng trên máy tính và thiết bị thông minh dựa trên RISC-V.

Bộ thanh ghi ISA cơ sở RISC-V này được trình bày trong hình sau.

Bộ thanh ghi ISA cơ sở RISC-V

Các thanh ghi có chiều rộng 32 bit. Các thanh ghi mục đích chung x1 thông qua x31 có sẵn để sử dụng mà không có bất kỳ hạn chế nào hoặc các chức năng đặc biệt được phần cứng bộ xử lý chỉ định. Thanh ghi x0 được làm cứng để trả về 0 khi nó được đọc và sẽ loại bỏ bất kỳ giá trị nào được ghi vào nó. Chúng ta sẽ thấy một số công dụng thú vị của đăng ký x0ngay sau đây.

Mỗi thanh ghi có một hoặc hai tên thay thế như trong hình. Những tên này tương ứng với việc sử dụng các thanh ghi trong giao diện nhị phân ứng dụng RISC-V tiêu chuẩn [ABI] . Bởi vì các thanh ghi x1- x31có thể hoán đổi cho nhau về mặt chức năng, ABI cần thiết phải chỉ định thanh ghi nào sẽ đóng vai trò là con trỏ ngăn xếp, thanh ghi nào nên chứa các đối số cho các hàm, các thanh ghi này phải chứa các giá trị trả về, v.v. Ý nghĩa của các ký hiệu đăng ký là:

  • ra: Địa chỉ trả về của hàm.
  • sp: Con trỏ ngăn xếp.
  • gp: Con trỏ dữ liệu toàn cục.
  • tp: Con trỏ dữ liệu cục bộ-luồng.
  • t0- t6: Lưu trữ tạm thời.
  • fp: Con trỏ khung cho dữ liệu ngăn xếp hàm-cục bộ [cách sử dụng này là tùy chọn].
  • s0- s11: Các thanh ghi đã lưu [nếu con trỏ khung không được sử dụng, x8sẽ trở thành s0].
  • a0- a7: Các đối số được truyền cho các hàm. Bất kỳ đối số bổ sung nào được chuyển vào ngăn xếp. Giá trị trả về của hàm được chuyển vào a0và a1.

Thanh pcghi chứa bộ đếm chương trình 32-bit, giữ địa chỉ của lệnh hiện tại.

Bạn có thể ngạc nhiên khi biết rằng không có thanh ghi cờ bộ xử lý nào trong RISC-V ISA. Một số hoạt động sửa đổi cờ trong các kiến ​​trúc bộ xử lý khác thay vào đó lưu trữ kết quả của chúng trong thanh ghi RISC-V. Ví dụ, lệnh so sánh RISC-V sltcó dấu [ ] và không dấu [ sltu] trừ hai toán hạng và đặt một thanh ghi đích thành 0 hoặc 1 tùy thuộc vào dấu của kết quả. Một lệnh rẽ nhánh có điều kiện tiếp theo sử dụng giá trị trong thanh ghi đó để xác định đường dẫn mã nào sẽ sử dụng.

Một số cờ được tìm thấy trong các bộ xử lý khác phải được tính toán trong RISC-V. Ví dụ, không có cờ thực hiện. Để xác định xem một phép cộng có dẫn đến một lỗi hay không, cần phải thực hiện phép so sánh giữa tổng và một trong các toán hạng của lệnh cộng. Nếu tổng lớn hơn hoặc bằng addend [có thể sử dụng cả addend để so sánh], thì không xảy ra hiện tượng mang; nếu không, việc bổ sung tạo ra một thực phẩm.

Hầu hết các lệnh tính toán ISA cơ sở sử dụng định dạng ba toán hạng, trong đó toán hạng đầu tiên là thanh ghi đích, toán hạng thứ hai là thanh ghi nguồn và toán hạng thứ ba là thanh ghi nguồn thứ hai hoặc một giá trị tức thì. Đây là một ví dụ hướng dẫn ba toán hạng:

add x1, x2, x3

Hướng dẫn này thêm thanh ghi x2vào x3và lưu trữ kết quả trong thanh ghi x1.

Để tránh giới thiệu các hướng dẫn không hoàn toàn cần thiết, nhiều hướng dẫn đảm nhận các nhiệm vụ bổ sung được thực hiện bởi các hướng dẫn chuyên dụng trong các kiến ​​trúc bộ xử lý khác. Ví dụ, RISC-V không có lệnh mà chỉ đơn giản là di chuyển thanh ghi này sang thanh ghi khác. Thay vào đó, lệnh bổ sung RISC-V thêm một thanh ghi nguồn và giá trị tức thời bằng 0 và lưu trữ kết quả trong một thanh ghi đích, tạo ra cùng một kết quả. Do đó , lệnh chuyển thanh ghi x2sang x1là add x1, x2, 0, gán giá trị [ x2+ 0] cho x1.

Hợp ngữ RISC-V cung cấp một số lệnh giả sử dụng thuật ngữ có thể quen thuộc hơn với các lập trình viên hợp ngữ. Trình hợp ngữ dịch lệnh giả mv x1, x2thành một nghĩa đen add x1, x2, 0. Chúng tôi sẽ thảo luận về các hướng dẫn giả chi tiết hơn ở phần sau.

Bộ hướng dẫn cơ sở RISC-V

Tập lệnh RISC-V cơ bản chỉ bao gồm 47 lệnh. Tám là hướng dẫn hệ thống thực hiện các cuộc gọi hệ thống và truy cập bộ đếm hiệu suất. 39 lệnh còn lại thuộc các loại hướng dẫn tính toán, hướng dẫn luồng điều khiển và hướng dẫn truy cập bộ nhớ. Chúng ta sẽ lần lượt xem xét từng danh mục này.

Hướng dẫn tính toán

Tất cả các hướng dẫn tính toán ngoại trừ luivà auipcsử dụng dạng toán hạng ba. Toán hạng đầu tiên là thanh ghi đích, toán hạng thứ hai là thanh ghi nguồn, và toán hạng thứ ba là thanh ghi nguồn thứ hai hoặc một giá trị tức thì. Hướng dẫn ghi nhớ sử dụng một giá trị tức thì [ngoại trừ auipc] kết thúc bằng chữ cái i.

  • add, addi, sub: Thực hiện cộng và trừ. Giá trị tức thời trong addilệnh là giá trị có dấu 12 bit. Lệnh sub trừ toán hạng nguồn thứ hai với toán hạng đầu tiên. Không có subihướng dẫn vì addi có thể thêm giá trị âm ngay lập tức.
  • sll, slli, srl, srli, sra, srai: Thực hiện logic trái và thay đổi đúng [ sll và srl], và thay đổi số học đúng [ sra]. Dịch chuyển logic chèn các bit 0 vào các vị trí trống. Dịch chuyển bên phải số học sao chép bit dấu hiệu vào các vị trí trống. Số vị trí bit cần dịch chuyển được lấy từ 5 bit thấp nhất của thanh ghi nguồn thứ hai hoặc từ giá trị tức thời 5 bit.
  • and, andi, or, ori, xor, xori: Thực hiện các hoạt động Bitwise lượng trên hai toán hạng nguồn. Toán hạng ngay lập tức là 12 bit.
  • slt, slti, sltu, sltui: Các bộ nếu ít hơn hướng dẫn thiết lập các thanh ghi đích đến 1 nếu nguồn đầu tiên toán hạng là ít hơn so với nguồn thứ hai toán hạng: Sự so sánh này là về bổ sung hai của [ slt] hoặc unsigned [ sltu] toán hạng. Các giá trị toán hạng tức thời là 12 bit.
  • lui: Nạp ngay phía trên. Lệnh này tải các bit 12-31 của thanh ghi đích với giá trị tức thời 20 bit. Đặt một thanh ghi thành giá trị tức thời 32 bit tùy ý yêu cầu hai hướng dẫn: Đầu tiên, lui đặt các bit 12-31 thành 20 bit trên của giá trị. Sau đó, addi thêm vào 12 bit thấp hơn để tạo thành kết quả 32 bit hoàn chỉnh. lui có hai toán hạng: thanh ghi đích và giá trị tức thời.
  • auipc: Thêm ngay phía trên vào PC. Lệnh này thêm giá trị tức thời 20 bit vào 20 bit phía trên của bộ đếm chương trình. Hướng dẫn này cho phép định địa chỉ tương đối PC trong RISC-V. Để tạo một địa chỉ tương đối PC 32-bit hoàn chỉnh, hãy auipc tạo một kết quả từng phần, sau đó một addilệnh sẽ thêm vào 12 bit thấp hơn.

Hướng dẫn luồng kiểm soát

Các lệnh rẽ nhánh có điều kiện thực hiện so sánh giữa hai thanh ghi và dựa trên kết quả, có thể chuyển quyền điều khiển trong phạm vi của độ lệch địa chỉ 12 bit đã ký từ PC hiện tại. Có sẵn hai lệnh nhảy vô điều kiện, một trong số đó [ jalr] cung cấp quyền truy cập vào toàn bộ dải địa chỉ 32 bit.

  • beq, bne, blt, bltu, bge, bgeu: Chi nhánh nếu bằng nhau [ beq], không bằng [ bne], ít hơn [ blt], ít hơn unsigned [ bltu], lớn hơn hoặc bằng [ bge], hoặc cao hơn hoặc tương đương, unsigned [ bgeu]. Các lệnh này thực hiện phép so sánh được chỉ định giữa hai thanh ghi và nếu điều kiện được thỏa mãn, chuyển quyền điều khiển đến bù địa chỉ được cung cấp trong giá trị tức thời có dấu 12 bit.
  • jal: Nhảy và liên kết. Chuyển quyền điều khiển đến địa chỉ tương đối của PC được cung cấp ở giá trị tức thời có chữ ký 20-bit và lưu trữ địa chỉ của lệnh tiếp theo [địa chỉ trả về] trong thanh ghi đích.
  • jalr: Nhảy và liên kết, đăng ký. Tính địa chỉ đích là tổng của thanh ghi nguồn và giá trị tức thời 12 bit có dấu, sau đó nhảy đến địa chỉ đó và lưu trữ địa chỉ của lệnh tiếp theo trong thanh ghi đích. Khi được đặt trước auipclệnh, jalrlệnh có thể thực hiện một bước nhảy tương đối PC ở bất kỳ đâu trong không gian địa chỉ 32 bit.

Hướng dẫn truy cập bộ nhớ

Các hướng dẫn truy cập bộ nhớ truyền dữ liệu giữa một thanh ghi và một vị trí bộ nhớ. Toán hạng đầu tiên là thanh ghi được tải hoặc lưu trữ. Thứ hai là một thanh ghi chứa địa chỉ bộ nhớ. Giá trị tức thời 12 bit đã ký được thêm vào địa chỉ trong thanh ghi để tạo ra địa chỉ cuối cùng cho tải hoặc lưu trữ.

Hướng dẫn tải thực hiện phần mở rộng dấu cho các giá trị có dấu hoặc phần mở rộng bằng 0 cho các giá trị chưa được ký. Phép toán mở rộng dấu hoặc số không điền vào tất cả 32 bit trong thanh ghi đích khi một giá trị dữ liệu nhỏ hơn [một byte hoặc nửa từ] được tải. Tải không có dấu được chỉ định bằng một chữ u ở cuối trong ghi nhớ.

  • lb, lbu, lh, lhu, lw: Load một byte 8-bit [ lb], một nữa vòng trái đất 16-bit [ lh] hoặc 32-bit word [ lw] vào thanh ghi đích. Đối với tải byte và nửa từ khóa, lệnh sẽ ký mở rộng [ lbvà lh] hoặc mở rộng bằng không [ lbu và lhu] để điền vào thanh ghi đích 32 bit. Ví dụ, lệnh lw x1, 16[x2]tải từ tại địa chỉ [ x2+ 16] vào thanh ghi x1.
  • sb, sh, sw: Lưu trữ một byte [ sb], nữa vòng trái đất [ sh] hoặc từ [ sw] đến một vị trí bộ nhớ phù hợp với kích thước của giá trị dữ liệu.
  • fence: Thực thi thứ tự truy cập bộ nhớ trong ngữ cảnh đa luồng. Hướng dẫn này đảm bảo một cái nhìn nhất quán về dữ liệu được lưu trong bộ nhớ cache trên các luồng. fencenhận hai toán hạng: toán hạng đầu tiên chỉ định loại truy cập bộ nhớ phải hoàn thành trước lệnh hàng rào. Thứ hai chỉ định các loại truy cập bộ nhớ được kiểm soát sau hàng rào. Các kiểu hoạt động được sắp xếp theo lệnh này là đọc và ghi bộ nhớ [ rvà w] và đầu vào và đầu ra thiết bị I / O [ ivà o]. Ví dụ, hướng dẫnfence rw, rw sẽ đảm bảo rằng tất cả các lần tải và lưu trữ liên quan đến địa chỉ bộ nhớ xảy ra trước lệnh hàng rào sẽ hoàn thành trước khi bất kỳ lần tải hoặc lưu trữ bộ nhớ tiếp theo diễn ra. Hướng dẫn này đảm bảo rằng mọi giá trị có trong bộ nhớ đệm của bộ xử lý được đồng bộ hóa đúng cách với bộ nhớ hoặc thiết bị I / O.
  • fence.i: Lệnh này đảm bảo rằng bất kỳ lưu trữ nào vào bộ nhớ lệnh đã hoàn thành trước khi fence.ilệnh hoàn thành. Hướng dẫn này chủ yếu hữu ích trong bối cảnh mã tự sửa đổi.

Hướng dẫn hệ thống

Trong số tám lệnh hệ thống, một lệnh gọi hệ thống, một lệnh khởi tạo điểm ngắt trình gỡ lỗi, và sáu lệnh còn lại đọc và ghi các thanh ghi trạng thái và điều khiển hệ thống [CSR]. Hướng dẫn thao tác CSR đọc giá trị hiện tại của CSR đã chọn vào một thanh ghi, sau đó cập nhật CSR bằng cách ghi giá trị mới, xóa các bit đã chọn hoặc đặt các bit đã chọn. Giá trị nguồn cho sửa đổi CSR được cung cấp trong một thanh ghi hoặc dưới dạng giá trị 5 bit ngay lập tức. CSR được xác định bằng địa chỉ 12 bit. Mỗi lệnh CSR thực hiện việc đọc và ghi CSR như một hoạt động nguyên tử.

  • ecall: Gọi một cuộc gọi hệ thống. Các thanh ghi được sử dụng để truyền các tham số vào và quay lại từ cuộc gọi được xác định bởi ABI, không phải bởi phần cứng của bộ xử lý.
  • break: Khởi tạo điểm ngắt của trình gỡ lỗi.
  • csrrw, csrrwi, csrrc, csrrci, csrrs, csrrsi: Đọc CSR cụ thể vào một thanh ghi đích và thể viết một nguồn operand giá trị cho thanh ghi [ csrrw], xóa bất kỳ 1 bit trong nguồn operand vào sổ đăng ký [ csrrc], hoặc đặt bất kỳ 1 bit trong toán hạng nguồn trong sổ đăng ký [ csrrs]. Các lệnh này có ba toán hạng: Đầu tiên là thanh ghi đích nhận giá trị đọc từ CSR, thứ hai là địa chỉ CSR và thứ ba là thanh ghi nguồn hoặc giá trị tức thì 5 bit [ ihậu tố].

Sáu CSR được định nghĩa trong kiến ​​trúc RISC-V cơ sở, tất cả đều ở chế độ chỉ đọc. Để thực hiện bất kỳ lệnh truy cập CSR nào ở chế độ chỉ đọc, thanh ghi x0phải được cung cấp dưới dạng toán hạng thứ ba. Các thanh ghi này xác định ba bộ đếm hiệu suất 64-bit:

  • cycle, cycleh: 32 bit dưới [ cycle] và trên [ cycleh] 32 bit trong tổng số 64 bit của chu kỳ đồng hồ hệ thống đã trôi qua kể từ thời điểm tham chiếu, thường là khởi động hệ thống. Tần số của đồng hồ hệ thống có thể thay đổi nếu điện áp động và chia tỷ lệ tần số [DVFS] đang hoạt động.
  • time, timeh: Đây là 32 bit dưới [ time] và trên [ timeh] 32 bit trong số 64 bit của chu kỳ đồng hồ thời gian thực đã trôi qua kể từ thời điểm tham chiếu, thường là khởi động hệ thống.
  • instret, instreth: 32 bit dưới [ instret] và trên [ instreth] 32 bit của số lệnh bộ xử lý 64 bit đã ngừng hoạt động.

Hai nửa 32 bit của mỗi bộ đếm hiệu suất không thể được đọc trong một hoạt động nguyên tử. Để tránh đọc sai, nên sử dụng quy trình sau để đọc từng bộ đếm 64 bit một cách đáng tin cậy:

  1. Đọc 32 bit trên của bộ đếm vào một thanh ghi.
  2. Đọc 32 bit thấp hơn của bộ đếm vào một thanh ghi khác.
  3. Đọc 32 bit trên vào một thanh ghi khác.
  4. So sánh lần đọc thứ nhất và thứ hai của 32 bit bộ đếm trên. Nếu chúng khác nhau, hãy quay lại bước 1.

Thủ tục này sẽ đọc một giá trị đếm hợp lệ mặc dù bộ đếm tiếp tục chạy giữa các lần đọc. Nói chung, việc thực hiện trình tự này phải yêu cầu nhiều nhất một bước lùi trong bước 4.

Hướng dẫn giả

Kiến trúc RISC-V có một tập lệnh thực sự bị cắt giảm, thiếu một số loại lệnh có trong các tập lệnh của các kiến ​​trúc bộ xử lý khác. Các chức năng của nhiều hướng dẫn quen thuộc hơn đó có thể được thực hiện với các lệnh RISC-V, mặc dù có lẽ không phải theo cách trực quan ngay lập tức.

Trình hợp dịch RISC-V hỗ trợ một số lệnh giả, mỗi lệnh này chuyển thành một hoặc nhiều lệnh RISC-V cung cấp một loại chức năng mà người ta có thể mong đợi trong tập lệnh bộ xử lý có mục đích chung. Bảng sau đây trình bày một số hướng dẫn giả RISC-V hữu ích nhất:

Chỉ dẫn giả
[Các] lệnh RISC-V
Chức năng

nop 

addi x0, x0, 0 

Không hoạt động

mv rd,rs 

addi rd, rs, 0 

Sao chép rs vàord

not rd, rs 

ori rd, rs, -1 

rd = NOT rs

neg rd, rs 

sub rd, x0, rs 

rd = -rs

j offset 

jal x0, offset 

Nhảy vô điều kiện

jal offset 

jal x1, offset 

Lệnh gọi hàm gần [độ lệch 20 bit]

call offset 

auipc x1, offset[31:12] + offset[11]

jalr x1, offset[11:0][x1] 

Lệnh gọi hàm xa [độ lệch 32 bit]

ret 

jalr x0, 0[x1] 

Trở lại từ chức năng

beqz rs, offset 

beq rs, x0, offset 

Nhánh nếu bằng 0

bgez rs, offset 

bge rx, x0, offset 

Nhánh nếu lớn hơn hoặc bằng 0

bltz rs, offset 

blt rs, x0, offset 

Nhánh nếu nhỏ hơn 0

bgt rs, rt, offset 

blt rt, rs, offset 

Nhánh nếu lớn hơn

ble rs, rt, offset 

bge rt, rs, offset 

Nhánh nếu nhỏ hơn hoặc bằng

fence 

fence iorw, iorw 

Hàng rào tất cả bộ nhớ và truy cập I / O

csrr rd, csr 

csrrw rd, csr, x0 

Đọc CSR

li rd, immed 

addi rd, x0, immed 

Tải ngay lập tức 12 bit

li rd, immed 

lui rd, immed[31:12] + immed[11]

addi rd, x0, immed[11:0] 

Tải 32-bit ngay lập tức

la rd, symbol 

auipc rd, delta[31:12] + delta[11]

addi rd, rd, delta[11:0] 

Tải địa chỉ của biểu tượng, trong đó delta =[symbol-pc] 

lw rd, symbol 

auipc rd, delta[31:12] + delta[11]

lw rd, rd, delta[11:0][rd] 

Nạp từ tại biểu tượng, trong đó delta=[symbol-pc]

sw rd, symbol, rt 

auipc rt, delta[31:12] + delta[11]

sw rd, rd, delta[11:0][rt] 

Lưu trữ từ tại biểu tượng, trong đó delta=[symbol-pc]

Hướng dẫn giả RISC-V

Trong các danh sách lệnh này, rd là thanh ghi đích, rs là thanh ghi nguồn, csr là thanh ghi điều khiển và trạng thái, symbol là địa chỉ dữ liệu tuyệt đối, và offset là địa chỉ lệnh tương đối với PC.

Các lệnh kết hợp 20 bit phía trên của một địa chỉ hoặc giá trị tức thời với giá trị tức thời chứa 12 bit phía dưới phải thực hiện một bước để đảo ngược ảnh hưởng của phần mở rộng dấu hiệu của bit 11 của giá trị 12 bit thấp hơn trong lệnh thứ hai của mỗi chuỗi . Điều này là cần thiết vì giá trị tức thời trong addilệnh luôn được coi là có chữ ký. Bit quan trọng nhất của giá trị tức thời 12 bit sẽ được mở rộng dấu hiệu qua bit 31 trước khi được thêm vào 20 bit trên.

Ví dụ sau đây minh họa vấn đề và giải pháp. Giả sử chúng ta muốn tải giá trị 0xFFFFFFFF vào một thanh ghi bằng cách sử dụng luivà addithêm phần trên và phần dưới một cách ngây thơ:

lui x1, 0xFFFFF # x1 now equals 0xFFFFF000 addi x1, x1, 0xFFF


Dấu addi lệnh mở rộng 0xFFF thành 0xFFFFFFFF trước khi thêm nó vào 0xFFFFF000. Kết quả của phép cộng sau đó là 0xFFFFEFFF, đây không phải là những gì chúng ta muốn. Thêm bit 11 trong số 12 bit thấp hơn vào 20 bit trên sẽ khắc phục điều này:

lui x1, 0xFFFFF+1 # Add bit 11; x1 now equals 0x00000000 addi x1, x1, 0xFFF


Kết quả bây giờ là 0xFFFFFFFF, giá trị chính xác. Quy trình này sẽ hoạt động đối với bất kỳ giá trị số nào khác. Nếu bit 11 là 0, không có gì sẽ được thêm vào 20 bit trên.

Các cấp độ đặc quyền

Kiến trúc RISC-V xác định ba mức đặc quyền mà tại đó một luồng có thể chạy:

  • Mức đặc quyền của người dùng [U]
  • Cấp đặc quyền của người giám sát [S]
  • Mức đặc quyền của Máy [M]

Tất cả các triển khai RISC-V phải hỗ trợ chế độ M, mức đặc quyền nhất, có khả năng truy cập tất cả các tính năng của hệ thống. Chế độ M được nhập khi thiết lập lại hệ thống. Mã trong một hệ thống nhúng đơn giản có thể chạy hoàn toàn ở chế độ M.

Trong trường hợp sử dụng phức tạp hơn một chút, quy trình khởi động an toàn có thể chạy ở cấp đặc quyền M, tải và khởi động ứng dụng chạy ở chế độ U. Cách tiếp cận này thích hợp cho một giải pháp nhúng an toàn.

Ngoài mức M bắt buộc, một bộ xử lý RISC-V có thể thực hiện một trong hai hoặc cả hai mức đặc quyền S và U. Hệ thống chạy hệ điều hành có mục đích chung sử dụng chế độ S và chế độ U giống như chế độ hạt nhân và chế độ người dùng của các kiến ​​trúc bộ xử lý thông thường khác. Các ứng dụng chế độ RISC-V U yêu cầu các dịch vụ hệ thống với lệnh ecall[lệnh gọi môi trường], tạo ra một ngoại lệ được xử lý ở mức S. Kiến trúc đặc quyền của RISC-V hỗ trợ trực tiếp các hệ điều hành hiện đại như Linux.

Các bộ sưu tập CSR riêng biệt được xác định để cho phép cấu hình, kiểm soát và giám sát hệ thống ở mỗi cấp trong số ba cấp đặc quyền. Tùy thuộc vào mức đặc quyền của luồng đang chạy và mức CSR, luồng có thể có quyền đọc-ghi, chỉ đọc hoặc không có quyền truy cập vào CSR. Các chủ đề ở cấp đặc quyền cao hơn có thể truy cập CSR ở cấp đặc quyền thấp hơn.

Mức đặc quyền RISC-V S hỗ trợ bộ nhớ ảo được phân trang với không gian địa chỉ 32 bit được chia thành các trang 4KB. Địa chỉ ảo 32 bit được tách thành số trang ảo 20 bit và độ lệch trang 12 bit. Hai cấu hình bộ nhớ ảo bổ sung được xác định cho môi trường RISC-V 64-bit. Một là không gian địa chỉ 39-bit, hỗ trợ 512GB bộ nhớ ảo. Đối với các ứng dụng yêu cầu nhiều địa chỉ ảo hơn, không gian địa chỉ 48 bit có sẵn, hỗ trợ 256TB bộ nhớ ảo. Mặc dù cấu hình 48-bit cung cấp nhiều bộ nhớ hơn so với phiên bản 39-bit, nó cũng yêu cầu bộ nhớ bổ sung cho các bảng trang và tiêu tốn nhiều thời gian xử lý hơn trong quá trình duyệt các bảng đó.

Các hướng dẫn sau hỗ trợ các mức thực thi đặc quyền:

  • mret, sret, uret - Những hướng dẫn trở về từ xử lý ngoại lệ khởi xướng bởi một ecallhướng dẫn. Mỗi lệnh này có thể được thực thi ở mức đặc quyền được chỉ ra bằng chữ cái đầu tiên của lệnh hoặc cao hơn. Việc thực thi một trong các hướng dẫn này tham chiếu đến mức đặc quyền thấp hơn mức của luồng hiện tại sẽ trả về từ ngoại lệ được khởi tạo ở mức thấp hơn.
  • wfi- Chờ ngắt. Lệnh này yêu cầu luồng hiện tại dừng lại cho đến khi có một ngắt để bảo dưỡng. Đặc tả RISC-V chỉ yêu cầu lệnh này đóng vai trò như một gợi ý, do đó, một triển khai cụ thể có thể xử lý một wfilệnh dưới dạng no-op thay vì thực sự làm ngưng trệ chuỗi. Bởi vì bộ xử lý có thể xử lý wfinhư một lệnh cấm , mã theo sau một wfilệnh phải kiểm tra rõ ràng sự hiện diện của các ngắt đang chờ xử lý cần xử lý. Trình tự này thường xảy ra bên trong một vòng lặp.
  • sfence.vma- Chuyển dữ liệu bảng trang bộ nhớ ảo từ bộ nhớ đệm sang bộ nhớ. Phần đầu strong ghi nhớ hướng dẫn cho biết hướng dẫn này được nhắm mục tiêu để sử dụng ở cấp đặc quyền của người giám sát.

Chúng tôi sẽ không đề cập đến chủ đề ở đây, nhưng RISC-V cũng xác định các hướng dẫn và CSR hỗ trợ ảo hóa và hypervisor quản lý môi trường ảo.

Phần mở rộng RISC-V

Tập lệnh được mô tả trong phần này được đặt tên là RV32I, viết tắt của tập lệnh số nguyên 32-bit RISC-V. Mặc dù RV32I ISA cung cấp một tập lệnh đầy đủ và hữu ích cho nhiều mục đích, nhưng nó thiếu một số chức năng và tính năng có sẵn trong các bộ vi xử lý khác như x86 và ARM.

Các phần mở rộng RISC-V cung cấp một cơ chế để thêm các khả năng vào tập lệnh cơ sở theo cách gia tăng và tương thích. Người triển khai bộ xử lý RISC-V có thể bao gồm các phần mở rộng một cách chọn lọc trong thiết kế bộ xử lý để tối ưu hóa sự cân bằng giữa kích thước chip, khả năng hệ thống và hiệu suất.

Phần mở rộng M

Phần mở rộng RISC-V M bổ sung chức năng nhân và chia số nguyên vào tập lệnh RV32I cơ sở. Các hướng dẫn sau có sẵn trong tiện ích mở rộng này:

  • mul: Nhân hai thanh ghi 32 bit và lưu trữ 32 bit thấp hơn của kết quả trong thanh ghi đích.
  • mulh. mulhu, mulhsu: Nhân hai thanh ghi 32 bit và lưu trữ 32 bit trên của kết quả trong thanh ghi đích. Xử lý các bội số là cả hai dấu [ mulh], cả hai lần không dấu [ mulhu] hoặc rs1 có dấu lần không dấu rs2 [ mulhsu]. rs1 là thanh ghi nguồn đầu tiên trong lệnh và rs2 là thanh ghi thứ hai.
  • div, divu : Thực hiện phép chia hai thanh ghi 32 bit, làm tròn kết quả về phía 0, trên các toán hạng divcó dấu [ divu] hoặc không dấu [ ].
  • rem, remu: Trả về phần còn lại tương ứng với kết quả của một div hoặc divu lệnh trên các toán hạng.

Phép chia cho số không không tạo ra một ngoại lệ. Để phát hiện phép chia cho 0, mã phải kiểm tra số chia và nhánh tới một trình xử lý thích hợp nếu nó bằng 0.

Một phần mở rộng

Phần mở rộng RISC-V A cung cấp các hoạt động đọc-sửa-ghi nguyên tử để hỗ trợ xử lý đa luồng trong bộ nhớ dùng chung.

Các lệnh đặt trước tải nguyên tử [ lr.w] và lệnh lưu trữ có điều kiện [ sc.w] làm việc cùng nhau để thực hiện một bộ nhớ được đọc theo sau là ghi vào cùng một vị trí như một dãy nguyên tử. Lệnh dành riêng cho tải sẽ đặt một chỗ trên địa chỉ bộ nhớ trong quá trình tải. Nếu một chuỗi khác ghi vào cùng một vị trí trong khi đặt chỗ đang có hiệu lực, đặt chỗ sẽ bị hủy.

Khi lệnh lưu trữ có điều kiện thực thi, nó trả về một giá trị cho biết liệu nó có hoàn thành thành công hoạt động nguyên tử hay không. Nếu việc đặt trước vẫn hợp lệ [nói cách khác, không có ghi can thiệp nào xảy ra đối với địa chỉ đích], lệnh lưu trữ có điều kiện ghi thanh ghi vào bộ nhớ và trả về 0, cho biết thành công. Nếu yêu cầu đặt trước bị hủy, lệnh điều kiện cửa hàng không thay đổi vị trí bộ nhớ và trả về giá trị khác 0 cho biết hoạt động cửa hàng không thành công. Các hướng dẫn sau đây triển khai các hoạt động dành riêng cho tải và lưu trữ có điều kiện:

  • lr.w: Nạp một đăng ký từ một vị trí bộ nhớ và đặt chỗ trên địa chỉ.
  • sc.w: Lưu trữ một thanh ghi vào một vị trí bộ nhớ có điều kiện. Đặt thanh ghi đích thành 0 nếu thao tác thành công và vị trí bộ nhớ đã được ghi, hoặc đặt thanh ghi đích thành giá trị khác 0 nếu đặt chỗ bị hủy. Nếu việc đặt chỗ đã bị hủy, vị trí bộ nhớ sẽ không được sửa đổi theo hướng dẫn này.

Lệnh hoạt động bộ nhớ nguyên tử [AMO] tải nguyên tử một từ từ vị trí bộ nhớ vào thanh ghi đích, thực hiện phép toán nhị phân giữa giá trị đọc và rs2và lưu trữ kết quả trở lại địa chỉ bộ nhớ. Các hướng dẫn sau đây triển khai các hoạt động AMO:

  • amoswap.w: Hoán đổi nguyên tử rs2 vào rs1 vị trí bộ nhớ.
  • amoadd.w: Thêm nguyên tử rs2vào rs1vị trí bộ nhớ.
  • amoand.w,   amoor.w,   amoxor.w: Nguyên tử thực hiện AND, OR, XOR hoặc với rs2 vào rs1 vị trí bộ nhớ.
  • amomin.w,   amominu.w,   amomax.w,   amomaxu.w: Nguyên tử thực hiện tối thiểu hoặc lựa chọn tối đa ký kết hoặc unsigned [hướng dẫn với các uhậu tố] giá trị với rs2vào rs1vị trí bộ nhớ.

C Mở rộng

Phần mở rộng RISC-V C thực hiện các lệnh nén với mục tiêu giảm thiểu dung lượng bộ nhớ được sử dụng bởi việc lưu trữ lệnh và giảm lưu lượng bus cần thiết để tìm nạp các lệnh.

Tất cả các lệnh RV32I đã thảo luận trước đây đều có độ dài 32 bit. Phần mở rộng C cung cấp các biểu diễn 16 bit thay thế của nhiều lệnh RV32I được sử dụng thường xuyên nhất. Mỗi lệnh nén tương đương với một lệnh có độ dài đầy đủ. Không cần chuyển đổi chế độ, nghĩa là các chương trình có thể tự do trộn lẫn các lệnh RV32I 32-bit và các lệnh 16-bit nén. Trên thực tế, các lập trình viên hợp ngữ thậm chí không cần thực hiện các bước để chỉ định liệu một lệnh có nên được tạo ở dạng nén hay không. Trình hợp dịch và trình liên kết có khả năng phát ra các lệnh nén một cách rõ ràng nếu có thể để giảm thiểu kích thước mã mà không bị phạt về hiệu suất thực thi.

Khi làm việc với bộ xử lý và bộ công cụ phát triển phần mềm hỗ trợ phần mở rộng RISC-V C, lợi ích của các lệnh nén sẽ có sẵn ngay lập tức cho các nhà phát triển làm việc bằng hợp ngữ cũng như những người làm việc với các ngôn ngữ cấp cao hơn.

Phần mở rộng F và D

Phần mở rộng RISC-V F và D cung cấp hỗ trợ phần cứng cho số học dấu phẩy động chính xác đơn [F] và chính xác kép [D] phù hợp với IEEE 754. Phần mở rộng F bổ sung thêm 32 thanh ghi dấu phẩy động có tên f0- f31 và một điều khiển và thanh ghi trạng thái được đặt tên fcsrcho kiến ​​trúc. Các thanh ghi này đều là 32 bit. Phần mở rộng bao gồm một tập hợp các lệnh dấu phẩy động tuân thủ các yêu cầu trong tiêu chuẩn độ chính xác đơn IEEE 754-2008.

Hầu hết các lệnh dấu phẩy động hoạt động trên thanh ghi dấu phẩy động. Các lệnh truyền dữ liệu được cung cấp để tải các thanh ghi dấu phẩy động từ bộ nhớ, lưu trữ các thanh ghi dấu phẩy động vào bộ nhớ và di chuyển dữ liệu giữa các thanh ghi dấu phẩy động và thanh ghi số nguyên.

Phần mở rộng D mở rộng f0- f31thành 64 bit. Trong cấu hình này, mỗi fthanh ghi có thể giữ một giá trị 32-bit hoặc một giá trị 64-bit. Các lệnh dấu phẩy động có độ chính xác kép được thêm vào, tuân theo tiêu chuẩn độ chính xác kép IEEE 754-2008. Phần mở rộng D yêu cầu phần mở rộng F phải có mặt.

Tiện ích mở rộng khác

Một số phần mở rộng bổ sung cho kiến ​​trúc RISC-V đã được xác định, đang được phát triển hoặc ít nhất đang được xem xét để phát triển trong tương lai:

  • Kiến trúc RV32E : Đây thực sự không phải là một phần mở rộng, mà nó là một kiến ​​trúc được sửa đổi nhằm mục đích giảm các yêu cầu phần cứng của bộ xử lý xuống dưới các yêu cầu của tập lệnh RV32I cho các hệ thống nhúng nhỏ. Sự khác biệt duy nhất giữa RV32I và RV32E là giảm số lượng thanh ghi số nguyên xuống còn 15. Thay đổi này dự kiến ​​sẽ giảm kích thước khu vực khuôn bộ xử lý và mức tiêu thụ điện năng khoảng 25% so với một bộ xử lý RV23I tương đương khác. x0vẫn là một thanh ghi số không chuyên dụng. Giảm một nửa số lượng thanh ghi giải phóng một bit trong mỗi mã định nghĩa thanh ghi trong một lệnh. Các bit này được đảm bảo sẽ không sử dụng trong các bản sửa đổi trong tương lai và do đó có sẵn để sử dụng trong các phần mở rộng hướng dẫn tùy chỉnh.
  • Phần mở rộng Q : Phần mở rộng Q hỗ trợ toán học dấu phẩy động 128-bit độ chính xác bốn như được định nghĩa trong IEEE 754-2008.
  • Phần mở rộng L : Phần mở rộng L hỗ trợ số học dấu phẩy động thập phân như được định nghĩa trong IEEE 754-2008.
  • Phần mở rộng B : Phần mở rộng B hỗ trợ các thao tác trên bit như chèn, trích xuất và kiểm tra các bit riêng lẻ.
  • Phần mở rộng J : Phần mở rộng J hỗ trợ các ngôn ngữ được dịch động như Java và JavaScript.
  • Phần mở rộng T : Phần mở rộng T hỗ trợ các giao dịch bộ nhớ bao gồm các hoạt động nguyên tử trên nhiều địa chỉ.
  • Phần mở rộng P : Phần mở rộng P cung cấp các hướng dẫn SIMD đóng gói cho các hoạt động dấu phẩy động trong các hệ thống RISC-V nhỏ.
  • Phần mở rộng V : Phần mở rộng V hỗ trợ các phép toán dữ liệu song song hoặc vectơ. Phần mở rộng V không chỉ định độ dài của vectơ dữ liệu; quyết định đó được để cho những người triển khai thiết kế bộ xử lý RISC-V. Việc triển khai điển hình của phần mở rộng V có thể hỗ trợ vectơ dữ liệu 512-bit, mặc dù hiện có các triển khai với độ dài vectơ lên ​​đến 4.096-bit.
  • Phần mở rộng N : Phần mở rộng N cung cấp hỗ trợ để xử lý các ngắt và ngoại lệ ở mức đặc quyền U.
  • Phần mở rộng Zicsr : Phần mở rộng Zicsr thực hiện các hoạt động đọc-sửa đổi-ghi nguyên tử trên CSR của hệ thống. Các hướng dẫn này được mô tả trong phần Hướng dẫn hệ thống .
  • Phần mở rộng Zifencei : Phần mở rộng Zifencei xác định fence.ihướng dẫn, được mô tả trong phần Hướng dẫn truy cập bộ nhớ .

Phần tiếp theo trình bày việc mở rộng RISC-V ISA cơ sở lên 64 bit.

RISC-V 64-bit

Phần giới thiệu RISC-V cho đến thời điểm này đã thảo luận về kiến ​​trúc và tập lệnh RV32I 32-bit, với các phần mở rộng. Tập lệnh RV64I mở rộng RV32I thành kiến ​​trúc 64-bit. Như trong RV32I, các lệnh có chiều rộng 32-bit. Trên thực tế, tập lệnh RV64I gần như hoàn toàn giống với RV32I ngoại trừ một số khác biệt đáng kể:

  • Tất cả các thanh ghi số nguyên được mở rộng thành 64 bit.
  • Địa chỉ được mở rộng thành 64 bit.
  • Số lượng dịch chuyển bit trong các mã quang lệnh tăng kích thước từ 5 đến 6 bit.
  • Một số hướng dẫn mới được định nghĩa để hoạt động trên các giá trị 32-bit theo cách tương đương với RV32I. Các hướng dẫn này là cần thiết vì hầu hết các lệnh trong RV64I hoạt động trên các giá trị 64-bit và có nhiều tình huống cần phải hoạt động hiệu quả trên các giá trị 32-bit. Các hướng dẫn hướng từ này có hậu tố ghi nhớ opcode là w. Các wlệnh -suffix tạo ra kết quả 32 bit có dấu. Các giá trị 32-bit này được mở rộng dấu [ngay cả khi chúng là các giá trị không dấu] để lấp đầy thanh ghi đích 64-bit. Nói cách khác, bit 31 của mỗi kết quả được sao chép thành các bit 32-63.

Các hướng dẫn mới sau được định nghĩa trong RV64I:

  • addw, addiw, subw, sllw, slliw, srlw, srliw, sraw, sraiw: Những hướng dẫn thực hiện tương đương với hướng dẫn RV32I với mnemonic cùng, trừ đi các whậu tố. Chúng hoạt động với toán hạng 32 bit và tạo ra kết quả 32 bit. Kết quả là dấu mở rộng thành 64 bit.
  • ld, sd: Tải và lưu trữ một từ đôi 64 bit. Đây là các phiên bản 64-bit của lwvà swhướng dẫn trong tập lệnh RV32I.

Các lệnh RV32I còn lại thực hiện các chức năng tương tự trong RV64I, ngoại trừ địa chỉ và thanh ghi có độ dài 64 bit. Các mã quang giống nhau, cả trong mã nguồn lắp ráp và mã máy nhị phân, đều được sử dụng trong cả hai tập lệnh.

Trong phần tiếp theo, chúng ta sẽ xem xét một số cấu hình RISC-V 32-bit và 64-bit tiêu chuẩn được bán trên thị trường. Mỗi trong số này bao gồm một ISA cơ sở cộng với các phần mở rộng đã chọn.

Cấu hình RISC-V tiêu chuẩn

Các tập lệnh RV32I và RV64I cung cấp một tập hợp các khả năng cơ bản hữu ích chủ yếu trong các thiết kế hệ thống nhúng nhỏ hơn. Các hệ thống nhằm hỗ trợ đa luồng, nhiều mức đặc quyền và hệ điều hành có mục đích chung yêu cầu một số phần mở rộng RISC-V để hoạt động chính xác và hiệu quả.

Cấu hình RISC-V tối thiểu được khuyến nghị để thiết lập mục tiêu phát triển ứng dụng bao gồm kiến ​​trúc tập lệnh RV32I hoặc RV64I cơ sở được tăng cường với các phần mở rộng I, M, A, F, D, Zicsr và Zifencei. Chữ viết tắt của sự kết hợp các tính năng này là G, như trong RV32G hoặc RV64G. Nhiều cấu hình G hỗ trợ thêm phần mở rộng hướng dẫn nén, với tên RV32GC và RV64GC.

Trong các ứng dụng nhúng, cấu hình phổ biến là RV32IMAC, cung cấp tập lệnh cơ sở cộng với chức năng nhân / chia, các phép toán nguyên tử và hỗ trợ lệnh nén. Các tài liệu tiếp thị cho bộ xử lý RISC-V thường sử dụng các mô tả viết tắt này về khả năng của bộ xử lý.

Phần sau đây trình bày một ví dụ nhỏ về hợp ngữ RISC-V.

Ngôn ngữ hợp ngữ RISC-V

Ví dụ về hợp ngữ RISC-V này là một ứng dụng hoàn chỉnh chạy trên bộ xử lý RISC-V:

.section .text .global main main: # Reserve stack space and save the return address addi sp, sp, -16 sd ra, 0[sp] # Print the message using the C library puts function 1: auipc a0, %pcrel_hi[msg] addi a0, a0, %pcrel_lo[1b] jal ra, puts # Restore the return address and sp, and return to caller ld ra, 0[sp] addi sp, sp, 16 jalr zero, ra, 0 .section .rodata msg: .asciz "Hello, Computer Architect!\n"


Chương trình này in văn bản sau trong cửa sổ bảng điều khiển và sau đó thoát ra.

Hello, Computer Architect! 

Đây là một số điểm quan tâm trong mã lắp ráp:

  • Các lệnh %pcrel_hivà %pcrel_lochọn 20 bit cao [ %pcrel_hi] hoặc 12 bit thấp [ %pcrel_lo] của địa chỉ tương đối PC của nhãn được cung cấp như một đối số. Sự kết hợp của auipcvà addihướng dẫn đặt địa chỉ của chuỗi thông báo vào a0.
  • 1:là một nhãn địa phương. Khi tham chiếu đến nhãn cục bộ, chữ cái bđược nối để tham chiếu đến nhãn trước đó trong mã [ngược] hoặc fđược nối để tham chiếu nhãn sau này trong mã [chuyển tiếp]. Các chỉ thị %pcrel_hivà %pcrel_lođược ghép nối với nhau: 1:Nhãn cục bộ phân giải 12 bit thấp hơn của offset thành msg:địa chỉ.

Tóm lược

Bài viết này đã giới thiệu về kiến ​​trúc bộ xử lý RISC-V và tập lệnh của nó. Dự án RISC-V đã xác định đặc điểm kỹ thuật tập hợp lệnh chế độ người dùng hoàn chỉnh và một số phần mở rộng để hỗ trợ tính toán mục đích chung, tính toán hiệu suất cao và các ứng dụng nhúng yêu cầu kích thước mã tối thiểu. Bộ xử lý RISC-V được cung cấp thương mại và các sản phẩm mã nguồn mở có sẵn để triển khai các bản khởi tạo RISC-V trong các thiết bị FPGA.

Bài viết này được chuyển thể từ cuốn sách mới của tôi, Kiến trúc và Tổ chức Máy tính Hiện đại , được xuất bản bởi Nhà xuất bản Packt . Cuốn sách bao gồm các bài tập chương giúp bạn bắt đầu phát triển RISC-V bằng cách sử dụng các công cụ có sẵn miễn phí. Các bài tập này cùng với các bài giải ví dụ có sẵn tại kho sách GitHub .

Video liên quan

Chủ Đề