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 باید یاد بگیریم.

Software Compiler / Program RISC-V ISA Instruction Set Registers Formats CPU Hardware

ممکن است دو 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 کند، عملیات لازم را انجام دهد و نتیجه را ذخیره کند.

Fetch دریافت دستور Decode تفسیر دستور Execute اجرای عملیات Write Back ثبت نتیجه این مراحل می‌توانند در یک CPU ساده یا یک Pipeline پیچیده‌تر پیاده‌سازی شوند.

رجیسترهای 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

رجیستر x0 همیشه مقدار صفر دارد. اگر بخواهیم مقداری داخل آن بنویسیم، مقدار ذخیره نمی‌شود. این ویژگی در طراحی دستورها و ساختن بعضی عملیات بسیار کاربردی است.

اولین دستور RISC-V؛ یک مثال ساده

فرض کنید دو مقدار در رجیسترهای x5 و x6 داریم و می‌خواهیم حاصل جمع آن‌ها را در x7 قرار دهیم.

add x7, x5, x6

معنای این دستور بسیار ساده است:

x7 ← x5 + x6

یعنی 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 I-Type S-Type B-Type U-Type J-Type

فرمت R-Type

برای عملیات Register-to-Register مانند جمع و تفریق استفاده می‌شود.

add x7, x5, x6

در اینجا دو Operand از رجیسترها می‌آیند و نتیجه نیز در یک رجیستر قرار می‌گیرد.

فرمت I-Type

برای دستورهایی که یک مقدار Immediate دارند و همچنین برخی دستورهای Load استفاده می‌شود.

addi x7, x5, 10
x7 ← x5 + 10

در این مثال، عدد 10 مستقیماً داخل خود دستور قرار گرفته است.

فرمت S-Type

یکی از کاربردهای مهم آن ذخیره کردن مقدار یک رجیستر در حافظه است.

sw x5, 0(x6)

یعنی مقدار موجود در x5 در آدرس حافظه‌ای که نسبت به مقدار x6 محاسبه می‌شود، ذخیره شود.

فرمت B-Type

برای دستورهای Branch و ایجاد شرط در جریان اجرای برنامه استفاده می‌شود.

beq x5, x6, label

اگر مقدار دو رجیستر برابر باشند، اجرای برنامه به محل مشخص‌شده توسط label منتقل می‌شود.

فرمت U-Type و J-Type

این فرمت‌ها نیز برای دستورهایی مانند ساخت Immediateهای بزرگ‌تر و پرش‌های خاص مورد استفاده قرار می‌گیرند.

RISC-V فقط یک نسخه ندارد!

یکی از نکات جذاب RISC-V ساختار Modular آن است. به جای اینکه یک ISA بسیار بزرگ و ثابت داشته باشیم، RISC-V از یک مجموعه پایه و Extensionهای مختلف تشکیل می‌شود.

برای مثال ممکن است با عبارت‌هایی مانند این مواجه شوید:

RV32I RV64I RV32IM RV64GC

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 را انجام دهیم.

lw x5, 0(x10) lw x6, 4(x10) add x7, x5, x6 sw x7, 8(x10)

منطق این برنامه:

  1. مقدار اول از حافظه به x5 می‌رود.
  2. مقدار دوم از حافظه به x6 می‌رود.
  3. ALU مقدارهای x5 و x6 را جمع می‌کند.
  4. نتیجه در x7 قرار می‌گیرد.
  5. نتیجه از x7 به حافظه منتقل می‌شود.
Memory داده‌ها Load Registers x5 / x6 / x7 Operands ALU ADD Store Load → Register → ALU → Register → Store

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
PC Program Counter Instruction Memory Fetch Decoder + Control Decode Register File + ALU Execute در یک طراحی واقعی، مسیر Data Path و Control Unit می‌توانند بسیار پیچیده‌تر شوند.

یک نمونه خیلی ساده 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 است. در یک پردازنده ساده ممکن است اجرای دستورها به مراحل مختلف تقسیم شود. یکی از مدل‌های آموزشی رایج شامل مراحل زیر است:

IF
Instruction Fetch
← ID
Instruction Decode
← EX
Execute
← MEM
Memory
← WB
Write Back

در چنین معماری‌ای چند دستور می‌توانند هم‌زمان در مراحل مختلف Pipeline باشند. البته با این کار مسائل جدیدی مانند Data Hazard، Control Hazard و Structural Hazard نیز به وجود می‌آیند.

🧩 ارتباط با Computer Architecture

اگر قبلاً درباره 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 برای دانشجویان و علاقه‌مندان به معماری کامپیوتر، این است که فاصله بین «یادگیری تئوری» و «ساخت سخت‌افزار واقعی» را کم می‌کند.

مثلاً می‌توانیم از یک دستور ساده شروع کنیم:

add x7, x5, x6

و بعد سؤال‌های سخت‌افزاری مختلفی مطرح کنیم:

  • این دستور چگونه Decode می‌شود؟
  • Opcode آن چیست؟
  • رجیسترهای rs1 و rs2 کجا قرار دارند؟
  • داده‌ها چگونه وارد ALU می‌شوند؟
  • ALU چگونه عملیات جمع را انجام می‌دهد؟
  • نتیجه چگونه وارد Register File می‌شود؟
  • PC چگونه تغییر می‌کند؟
  • اگر CPU Pipeline باشد، این دستور در هر Cycle چه وضعیتی دارد؟

در این نقطه، RISC-V دیگر فقط یک سری دستور Assembly نیست؛ بلکه تبدیل به یک پروژه واقعی برای یادگیری Datapath + Control + RTL + FPGA می‌شود.

مسیر یادگیری پیشنهادی

اگر می‌خواهید RISC-V را به شکل اصولی یاد بگیرید، بهتر است مستقیماً سراغ طراحی CPU پیچیده نروید. یک مسیر منطقی می‌تواند این باشد:

Digital Logic → Boolean Algebra → Combinational Circuits → Sequential Circuits
Registers → ALU → Datapath → Control Unit
ISA → RISC-V → Verilog / RTL → CPU روی FPGA

جمع‌بندی

RISC-V یک Instruction Set Architecture یا ISA است.

این معماری بر پایه ایده‌های RISC طراحی شده و ساختاری Modular دارد؛ یعنی یک مجموعه دستور پایه دارد و قابلیت‌های بیشتری می‌توانند از طریق Extensionها به آن اضافه شوند.

از دید سخت‌افزار، RISC-V یک فرصت بسیار خوب برای یادگیری واقعی CPU است؛ چون می‌توان از سطح Instruction و Assembly شروع کرد و در نهایت به Datapath، Control Unit، Pipeline، Verilog، RTL و FPGA رسید.

بنابراین اگر بخواهیم در یک جمله بگوییم:

RISC-V = یک ISA باز، ماژولار و قابل پیاده‌سازی در سخت‌افزارهای مختلف

مبحث بعدی چیست؟

حالا که فهمیدیم RISC-V چیست، قدم منطقی بعدی این است که ببینیم یک دستور RISC-V دقیقاً از چه بیت‌هایی تشکیل شده است.

در مبحث بعدی می‌توانیم سراغ RISC-V Instruction Format برویم و دقیقاً بررسی کنیم که در یک دستور R-Type، قسمت‌های opcode، rd، rs1، rs2، funct3 و funct7 کجا قرار دارند و CPU چگونه از روی این بیت‌ها متوجه می‌شود چه عملیاتی باید انجام دهد.

🤔 سؤال برای شما

اگر دستور زیر را داشته باشیم:

add x7, x5, x6

به نظر شما CPU از کجا می‌فهمد که باید مقدار دو رجیستر را با هم جمع کند؟ Opcode چه نقشی در این فرآیند دارد؟


دسته‌بندی: Computer Architecture، RISC-V، CPU، Digital Design، FPGA، Verilog، RTL

برچسب‌ها: #RISC_V #RISC_V_چیست #ComputerArchitecture #CPU #ISA #FPGA #Verilog #RTL #DigitalDesign #پردازنده #معماری_کامپیوتر

منابع و رفرنس‌ها