RISC-V چیست؟
آشنایی از صفر با یکی از مهمترین معماریهای Instruction Set در دنیای پردازندهها
از CPU و FPGA گرفته تا سیستمهای Embedded و طراحی پردازنده اختصاصی؛ RISC-V یکی از مفاهیمی است که هر کسی که به Computer Architecture و طراحی سختافزار علاقه دارد، دیر یا زود با آن روبهرو میشود.
مقدمه؛ اصلاً RISC-V یعنی چه؟
اگر با معماری کامپیوتر آشنا باشید، احتمالاً نامهایی مثل ARM، x86 و RISC-V را شنیدهاید. اما یک سؤال مهم وجود دارد: RISC-V دقیقاً چیست؟ یک پردازنده است؟ یک شرکت است؟ یک زبان برنامهنویسی است؟ یا یک معماری؟
پاسخ کوتاه این است: RISC-V یک Instruction Set Architecture یا ISA است.
یعنی RISC-V مجموعهای از قوانین و دستورالعملهایی را تعریف میکند که مشخص میکنند یک پردازنده چه دستورهایی را میتواند اجرا کند، رجیسترهای آن چگونه هستند، دستورها چه فرمتی دارند و نرمافزار چگونه با پردازنده صحبت میکند.
RISC-V خودش یک CPU مشخص نیست؛ بلکه یک ISA است. بنابراین شرکتها و طراحان مختلف میتوانند پردازندههای متفاوتی بسازند که همگی از ISA مربوط به RISC-V استفاده کنند.
RISC یعنی چه؟
عبارت RISC مخفف Reduced Instruction Set Computer است.
ایده اصلی معماریهای RISC این است که مجموعه دستورها تا حد امکان ساده، منظم و قابل پیادهسازی مؤثر در سختافزار باشد.
در مقابل، معماریهای CISC یا Complex Instruction Set Computer معمولاً دستورهای پیچیدهتر و متنوعتری دارند. معروفترین نمونه CISC در کامپیوترهای شخصی، معماری x86 است.
| ویژگی | RISC | CISC |
|---|---|---|
| ایده اصلی | دستورهای ساده و منظم | دستورهای پیچیدهتر |
| پیادهسازی سختافزاری | معمولاً سادهتر | معمولاً پیچیدهتر |
| نمونههای معروف | RISC-V، ARM | x86 |
| هدف تاریخی | سادگی و اجرای مؤثر | ارائه قابلیت بیشتر در سطح دستور |
البته نباید تصور کنیم که RISC یعنی «پردازنده ضعیف» یا CISC یعنی «پردازنده قوی». این تقسیمبندی بیشتر درباره طراحی Instruction Set و نحوه بیان عملیات برای پردازنده است.
ISA دقیقاً چیست؟
برای فهم RISC-V باید مفهوم ISA را خوب یاد بگیریم.
ISA مخفف Instruction Set Architecture است و میتوان آن را «معماری مجموعه دستورها» ترجمه کرد.
ISA در واقع قراردادی بین نرمافزار و سختافزار است. نرمافزار میگوید: «من این دستور را میخواهم اجرا کنم.» و سختافزار باید طبق تعریف ISA آن دستور را اجرا کند.
ISA را میتوان مثل زبان مشترک بین برنامه و CPU در نظر گرفت. اگر دو CPU از یک ISA پشتیبانی کنند، نرمافزار کامپایلشده برای آن ISA میتواند در صورت سازگاری سایر اجزای سیستم، روی هر دو اجرا شود؛ حتی اگر طراحی داخلی خود CPUها کاملاً متفاوت باشد.
پس RISC-V خودش CPU نیست؟
دقیقاً. این یکی از مهمترین نکاتی است که در شروع کار با RISC-V باید یاد بگیریم.
ممکن است دو CPU کاملاً متفاوت داشته باشیم که هر دو RISC-V باشند. یکی ممکن است برای یک سیستم Embedded کوچک طراحی شده باشد و دیگری یک پردازنده بسیار پیچیده با Pipeline و Cacheهای متعدد باشد.
چرا RISC-V مهم شده است؟
یکی از مهمترین ویژگیهای RISC-V این است که ISA آن به صورت Open Standard توسعه داده شده است.
این موضوع باعث شده طراحان سختافزار بتوانند بر اساس این ISA پردازندههای خودشان را طراحی و پیادهسازی کنند، بدون اینکه مجبور باشند یک ISA اختصاصی را از ابتدا طراحی کنند.
این ویژگی برای حوزههایی مانند موارد زیر اهمیت زیادی دارد:
- پردازندههای Embedded
- میکروکنترلرها
- سیستمهای IoT
- پردازندههای اختصاصی
- شتابدهندههای سختافزاری
- FPGA
- طراحی تراشه و SoC
- تحقیق و آموزش Computer Architecture
فرض کنید میخواهیم برای یک پروژه FPGA یک CPU ساده طراحی کنیم. به جای اینکه Instruction Set کاملاً جدیدی اختراع کنیم، میتوانیم یک پردازنده ساده سازگار با RISC-V طراحی کنیم. در این حالت ساختار دستورها و رجیسترها از قبل مشخص شدهاند و میتوانیم تمرکز خود را روی طراحی سختافزار CPU بگذاریم.
ساختار کلی یک پردازنده RISC-V
برای درک بهتر موضوع، فرض کنیم یک CPU ساده RISC-V داریم. پردازنده باید بتواند دستور را از حافظه دریافت کند، آن را Decode کند، عملیات لازم را انجام دهد و نتیجه را ذخیره کند.
رجیسترهای RISC-V
در RISC-V یک مجموعه رجیستر عمومی وجود دارد که معمولاً با نامهای x0 تا x31 شناخته میشوند. یعنی در حالت پایه، ۳۲ رجیستر عمومی داریم.
| رجیستر | نام رایج ABI | کاربرد کلی |
|---|---|---|
x0 |
zero |
همیشه مقدار صفر |
x1 |
ra |
Return Address |
x2 |
sp |
Stack Pointer |
x5-x7 |
t0-t2 |
Temporary |
x10-x17 |
a0-a7 |
Argument / Return Value |
x8-x9 |
s0-s1 |
Saved Registers |
رجیستر x0 همیشه مقدار صفر دارد.
اگر بخواهیم مقداری داخل آن بنویسیم، مقدار ذخیره نمیشود.
این ویژگی در طراحی دستورها و ساختن بعضی عملیات بسیار کاربردی است.
اولین دستور RISC-V؛ یک مثال ساده
فرض کنید دو مقدار در رجیسترهای x5 و x6 داریم
و میخواهیم حاصل جمع آنها را در x7 قرار دهیم.
معنای این دستور بسیار ساده است:
یعنی CPU مقدار موجود در x5 و x6 را با هم جمع کرده
و نتیجه را داخل x7 قرار میدهد.
اگر:
x5 = 10
x6 = 7
پس بعد از اجرای دستور:
add x7, x5, x6
خواهیم داشت:
x7 = 10 + 7 = 17
چرا دستورهای RISC-V ساده طراحی شدهاند؟
یکی از اهداف طراحی RISC این است که دستورها ساختار نسبتاً منظم و قابل پیشبینی داشته باشند. این موضوع میتواند طراحی واحدهایی مانند Instruction Decoder، Control Unit و Pipeline را سادهتر کند.
برای مثال در یک CPU سختافزاری، دستور باید ابتدا از بیتهای خام به بخشهایی مانند Opcode، رجیسترهای مبدأ و مقصد و Immediate تقسیم شود.
اگر ساختار دستورها منظم باشد، سختافزار Decode میتواند سادهتر طراحی شود.
فرمتهای اصلی دستور در RISC-V
دستورهای RISC-V در قالبهای مشخصی قرار میگیرند. از فرمتهای مهم میتوان به موارد زیر اشاره کرد:
فرمت R-Type
برای عملیات Register-to-Register مانند جمع و تفریق استفاده میشود.
در اینجا دو Operand از رجیسترها میآیند و نتیجه نیز در یک رجیستر قرار میگیرد.
فرمت I-Type
برای دستورهایی که یک مقدار Immediate دارند و همچنین برخی دستورهای Load استفاده میشود.
در این مثال، عدد 10 مستقیماً داخل خود دستور قرار گرفته است.
فرمت S-Type
یکی از کاربردهای مهم آن ذخیره کردن مقدار یک رجیستر در حافظه است.
یعنی مقدار موجود در x5 در آدرس حافظهای که نسبت به مقدار
x6 محاسبه میشود، ذخیره شود.
فرمت B-Type
برای دستورهای Branch و ایجاد شرط در جریان اجرای برنامه استفاده میشود.
اگر مقدار دو رجیستر برابر باشند، اجرای برنامه به محل مشخصشده توسط
label منتقل میشود.
فرمت U-Type و J-Type
این فرمتها نیز برای دستورهایی مانند ساخت Immediateهای بزرگتر و پرشهای خاص مورد استفاده قرار میگیرند.
RISC-V فقط یک نسخه ندارد!
یکی از نکات جذاب RISC-V ساختار Modular آن است. به جای اینکه یک ISA بسیار بزرگ و ثابت داشته باشیم، RISC-V از یک مجموعه پایه و Extensionهای مختلف تشکیل میشود.
برای مثال ممکن است با عبارتهایی مانند این مواجه شوید:
RV32I یعنی چه؟
بیایید عبارت RV32I را باز کنیم:
| بخش | معنی |
|---|---|
RV |
RISC-V |
32 |
معماری با XLEN برابر ۳۲ بیت |
I |
Base Integer Instruction Set |
بنابراین RV32I یک RISC-V با طول داده/رجیستر اصلی ۳۲ بیت و مجموعه پایه Integer است.
Extensionهای مهم RISC-V
| Extension | کاربرد |
|---|---|
I |
دستورهای پایه Integer |
M |
ضرب و تقسیم Integer |
A |
Atomic Instructions |
F |
محاسبات Floating-Point با دقت Single |
D |
محاسبات Floating-Point با دقت Double |
C |
دستورهای فشرده ۱۶ بیتی |
پسوندها به ما میگویند CPU موردنظر از چه قابلیتهایی پشتیبانی میکند.
برای مثال، یک پردازنده با مجموعه RV32IM
علاوه بر دستورهای پایه، دستورهای مربوط به ضرب و تقسیم Integer را نیز دارد.
ارتباط RISC-V با Memory
در RISC-V نیز مانند بسیاری از معماریهای RISC، عملیات روی حافظه از عملیات Register-to-Register جدا هستند.
مثلاً برای جمع دو مقدار موجود در حافظه، معمولاً ابتدا باید آنها را با دستورهای Load وارد رجیستر کنیم، سپس عملیات ALU را انجام دهیم.
منطق این برنامه:
- مقدار اول از حافظه به
x5میرود. - مقدار دوم از حافظه به
x6میرود. - ALU مقدارهای
x5وx6را جمع میکند. - نتیجه در
x7قرار میگیرد. - نتیجه از
x7به حافظه منتقل میشود.
RISC-V چه ارتباطی با Verilog و FPGA دارد؟
اینجا RISC-V برای کسی که به طراحی سختافزار و FPGA علاقه دارد، بسیار جذاب میشود.
چون RISC-V یک ISA است، ما میتوانیم یک CPU سازگار با RISC-V را با زبانهایی مانند Verilog یا SystemVerilog در سطح RTL طراحی کنیم.
یک CPU ساده میتواند شامل بخشهای زیر باشد:
- Program Counter یا PC
- Instruction Memory
- Instruction Decoder
- Register File
- ALU
- Control Unit
- Data Memory Interface
- Multiplexerها
- Pipeline Registerها در صورت Pipeline بودن CPU
یک نمونه خیلی ساده RTL
برای مثال، یک ALU بسیار ساده را میتوان به شکل زیر در Verilog تصور کرد:
module alu (
input logic [31:0] a,
input logic [31:0] b,
input logic [2:0] op,
output logic [31:0] result
);
always_comb begin
case (op)
3'b000: result = a + b;
3'b001: result = a - b;
3'b010: result = a & b;
3'b011: result = a | b;
default: result = 32'b0;
endcase
end
endmodule
این کد به تنهایی یک CPU RISC-V نیست؛ بلکه فقط نمونهای از یکی از اجزای احتمالی آن یعنی ALU است. در یک CPU واقعی باید Decode، Register File، PC، Memory Interface و Control Logic نیز طراحی شوند.
RISC-V و Pipeline
یکی از مباحث مهم بعدی در طراحی CPU، Pipeline است. در یک پردازنده ساده ممکن است اجرای دستورها به مراحل مختلف تقسیم شود. یکی از مدلهای آموزشی رایج شامل مراحل زیر است:
Instruction Fetch ← ID
Instruction Decode ← EX
Execute ← MEM
Memory ← WB
Write Back
در چنین معماریای چند دستور میتوانند همزمان در مراحل مختلف Pipeline باشند. البته با این کار مسائل جدیدی مانند Data Hazard، Control Hazard و Structural Hazard نیز به وجود میآیند.
اگر قبلاً درباره Datapath، Control Unit، ALU، Register File و Pipeline مطالعه کرده باشید، RISC-V یک مثال واقعی و بسیار مناسب برای کنار هم قرار دادن این مفاهیم است.
RISC-V چه تفاوتی با ARM دارد؟
هر دو در خانواده معماریهای RISC قرار میگیرند، اما یک تفاوت مهم در مدل توسعه و استفاده آنها وجود دارد.
| موضوع | RISC-V | ARM |
|---|---|---|
| نوع | ISA | ISA و خانواده معماری |
| مدل اصلی | Open Standard | تحت مالکیت Arm |
| قابلیت توسعه | Modular و دارای Extensionها | دارای مجموعههای معماری مشخص |
| کاربرد | Embedded، IoT، CPU، FPGA، SoC و... | موبایل، Embedded، SoC و... |
| طراحی CPU اختصاصی | برای پژوهش و طراحی سفارشی بسیار مناسب | معمولاً بر اساس مجوزهای مربوط به Arm |
این جدول یک مقایسه مفهومی است؛ جزئیات مجوزها، مدلهای تجاری و نسخههای مختلف معماری هر دو اکوسیستم میتواند متفاوت باشد.
اشتباهات رایج درباره RISC-V
❌ اشتباه اول: RISC-V یک پردازنده است
خیر. RISC-V یک ISA است. پردازندهای که این ISA را پیادهسازی کند، میتواند یک CPU RISC-V باشد.
❌ اشتباه دوم: هر CPU RISC-V دقیقاً یکسان است
خیر. CPUها میتوانند Extensionهای مختلف، Cache، Pipeline، تعداد واحدهای اجرایی و طراحی داخلی متفاوت داشته باشند. آنچه بین آنها مشترک است، بخشهای سازگار با ISA است.
❌ اشتباه سوم: RISC یعنی دستورهای کم و پردازنده ضعیف
کلمه Reduced در اینجا بیشتر به فلسفه طراحی مجموعه دستورها اشاره دارد، نه اینکه CPU الزاماً قدرت پردازشی کمی داشته باشد.
❌ اشتباه چهارم: RISC-V فقط برای FPGA است
RISC-V میتواند روی FPGA پیادهسازی شود، اما کاربرد آن به FPGA محدود نیست. از میکروکنترلرهای کوچک تا SoCهای پیچیده، میتوان از پردازندههای مبتنی بر RISC-V استفاده کرد.
چرا RISC-V برای یادگیری Computer Architecture عالی است؟
یکی از جذابترین ویژگیهای RISC-V برای دانشجویان و علاقهمندان به معماری کامپیوتر، این است که فاصله بین «یادگیری تئوری» و «ساخت سختافزار واقعی» را کم میکند.
مثلاً میتوانیم از یک دستور ساده شروع کنیم:
و بعد سؤالهای سختافزاری مختلفی مطرح کنیم:
- این دستور چگونه Decode میشود؟
- Opcode آن چیست؟
- رجیسترهای
rs1وrs2کجا قرار دارند؟ - دادهها چگونه وارد ALU میشوند؟
- ALU چگونه عملیات جمع را انجام میدهد؟
- نتیجه چگونه وارد Register File میشود؟
- PC چگونه تغییر میکند؟
- اگر CPU Pipeline باشد، این دستور در هر Cycle چه وضعیتی دارد؟
در این نقطه، RISC-V دیگر فقط یک سری دستور Assembly نیست؛ بلکه تبدیل به یک پروژه واقعی برای یادگیری Datapath + Control + RTL + FPGA میشود.
مسیر یادگیری پیشنهادی
اگر میخواهید RISC-V را به شکل اصولی یاد بگیرید، بهتر است مستقیماً سراغ طراحی CPU پیچیده نروید. یک مسیر منطقی میتواند این باشد:
جمعبندی
RISC-V یک Instruction Set Architecture یا ISA است.
این معماری بر پایه ایدههای RISC طراحی شده و ساختاری Modular دارد؛ یعنی یک مجموعه دستور پایه دارد و قابلیتهای بیشتری میتوانند از طریق Extensionها به آن اضافه شوند.
از دید سختافزار، RISC-V یک فرصت بسیار خوب برای یادگیری واقعی CPU است؛ چون میتوان از سطح Instruction و Assembly شروع کرد و در نهایت به Datapath، Control Unit، Pipeline، Verilog، RTL و FPGA رسید.
بنابراین اگر بخواهیم در یک جمله بگوییم:
مبحث بعدی چیست؟
حالا که فهمیدیم RISC-V چیست، قدم منطقی بعدی این است که ببینیم یک دستور RISC-V دقیقاً از چه بیتهایی تشکیل شده است.
در مبحث بعدی میتوانیم سراغ RISC-V Instruction Format برویم و دقیقاً بررسی کنیم که در یک دستور R-Type، قسمتهای opcode، rd، rs1، rs2، funct3 و funct7 کجا قرار دارند و CPU چگونه از روی این بیتها متوجه میشود چه عملیاتی باید انجام دهد.
اگر دستور زیر را داشته باشیم:
به نظر شما CPU از کجا میفهمد که باید مقدار دو رجیستر را با هم جمع کند؟ Opcode چه نقشی در این فرآیند دارد؟
دستهبندی: Computer Architecture، RISC-V، CPU، Digital Design، FPGA، Verilog، RTL
برچسبها: #RISC_V #RISC_V_چیست #ComputerArchitecture #CPU #ISA #FPGA #Verilog #RTL #DigitalDesign #پردازنده #معماری_کامپیوتر
منابع و رفرنسها
- RISC-V International — Specifications
- RISC-V Unprivileged ISA Specification — Introduction
- What is RISC-V and why is it important? — RISC-V International
- An Introduction to RISC-V — Understanding RISC's Open ISA
- RISC-V ISA Quick Reference — Cornell University
- RISC-V Calling Convention — MIT 6.1810
- CVA6 RISC-V CPU — OpenHW Group (GitHub)
- RISC-V RV32I Instructions Format — Maven Silicon