پردازنده کامپیوتر متشکل از میلیاردها ترانزیستور است که به دقت هماهنگ شدهاند تا عملیات محاسبه دادهها در بالاترین سرعت ممکن و با حداکثر دقت انجام شود. تصور نحوه طراحی قطعاتی با صدها ماژول و میلیاردها ترانزیستور کار بسیار دشواری است اما در این مطلب با تفکیک آن به بخشهای کوچکتر درک طراحی آنها سادهتر شده است.
اجزای کلیدی پردازنده
پردازندهها از صدها ماژول مختلف تشکیل شدهاند که با هماهنگی کم نظیری با هم کار میکند. از میان این صدها بخش چندین جز کلیدیتر از بقیه هستند که شامل موارد زیر میشود:
واحد کنترل: دستورات را دریافت، دکود و اجرا میکند
واحد محاسبه و منطق (ALU): عملیاتهای محاسبه و منطق را اجرا میکند. محاسبات و تصمیمات در همین بخش اجرا و اخذ میشوند. ALU همچنین به عنوان گیت بین حافظه اصلی و واحد ذخیره سازی ثانویه عمل میکند.
رجیسترها: رجیسترها مقادیر کوچکی از حافظههای فوق سریع درون پردازنده هستند و از آنها برای ذخیرهسازی واحدهای کوچک مورد نیاز طی پردازش استفاده میشود. آدرس دستور بعدی در صف اجرا، دستور فعلی که در حال دکود شدن است و نتایج محاسبات مثالهایی از این دادهها هستند. پردازندههای مختلف دارای تعداد رجیستر متفاوتی هستند اما برخی از رایجترینها عبارتند از: شمارنده برنامه، رجیستر آدرس حافظه (MAR)، رجیستر داده حافظه (MDR)، رجیستر دستورات جاری (CIR) و انباشتگر (ACC).
کش: کشها هم مثل رم و SSD وظیفه ذخیره داده را بر عهده دارند اما سرعت آنها به مراتب بالاتر بوده و تاخیر بسیار کمتری دارند. پردازندهها معمولا دارای ۳ سطح کش L2، L1 و L3 هستند که از آن با عنوان سلسله مراتب حافظه یاد میشود.
باسها: باس یک رابط داخلی بسیار سریع است که از آن برای ارسال داده و سیگنالهای کنترل بین پردازنده و دیگر اجزا استفاده میشود. ۳ نوع اصلی باس شامل باس آدرس برای حمل آدرس حافظه از پردازنده به دیگر اجزا، باس داده برای حمل داده بین پردازنده و دیگر اجزا و باس کنترل برای حمل سیگنالها از پردازنده به قطعات دیگر میشود.
کلاک: پردازنده شامل کلاکی است که مسئولیت هماهنگ سازی تمامی اجزا را برعهده دارد و اینکار را از طریق ارسال منظم پالسهای الکتریکی انجام میدهد. در ادامه بیشتر درباره کلاک توضیح خواهیم داد.
ترانزیستورها
اکنون که با بخشهای اصلی پردازنده آشنا شدیم نوبت به بررسی دقیقتر ساز و کار طراحی آن میرسد. همانطور که میدانید پردازندهها و بسیاری از دیگر ابزارهای فناوری از ترانزیستور ساخته میشوند. سادهترین راه برای تصور یک ترانزیستور سوییچ قابل کنترلی است که از ۳ پین تشکیل شده است. زمانی که گیت باز است، الکتریسیته از درون ترانزیستور جریان پیدا میکند و زمانی که گیت بسته است جریانی برقرار نمیشود. ترانزیستور دقیقا مثل کلیدی که لامپ را روشن و خاموش میکند عمل میکند اما در ابعادی به مراتب کوچکتر و بسیار سریعتر قادر به کنترل جریان برق است.
دو نوع اصلی ترانزیستور شامل Pmos و nMOS است. pMOS زمانی اجازه عبور جریان را میدهد که گیت روی حالت low یا دشارژ قرار دارد و همانطور که حدس میزنید Pmos در صورت شارژ شدن گیت یا قرار داشتن آن روی حالت high اجازه اینکار را میدهد. با ترکیب این دو نوع ترانزیستور به گونهای که یکی مکمل دیگری باشد، میتوان گیتهای منطقی CMOS ساخت.
گیتهای منطقی
گیت منطقی دستگاههای ساده است که ورودی را دریافت کرده، عملیاتهایی را روی آنها انجام داده و به عنوان خروجی تحویل میدهد. برای مثال گیت AND تنها در صورتی خروجی را روشن میکند که هر دو ورودی شارژ باشند اما گیت NOT یا وارونگر در صورتی که یکی از ورودیها روشن باشد اینکار را میکند. از ترکیب این دو گیت NAND حاصل میشود که تنها اگر هر دو ورودی خاموش باشند، خروجی را روشن خواهد کرد. این تنها ۳ نمونه از گیت است و از انواع دیگر میتوان به OR، NOR، XOR و XNOR اشاره کرد.
در شکل زیر نحوه طراحی دو گیت پایهای NOT و NAND از ترانزیستورها را میبینید. در گیت وارونگر یک ترانزیستور pMOS به خط توان وصل است و یک ترانزیستور nMOS هم در پایین به زمین وصل شده. روی نقشه ترانزیستور pMOST با دایره کوچکی که به گیت وصل است ترسیم شده. از آنجا که pMOS در صورت خاموش بودن ورودی جریان مییابد و nMOS خلاف آن عمل میکند، معلوم است که سیگنال خروجی همیشه خلاف سیگنال ورودی خواهد بود.
برای طراحی گیت NAND به چهار ترانزیستور نیاز داریم تا خروجی در صورت شارژ یکی از ورودیها روشن شود. در ساخت گیتهای منطقی پیشرفته و دیگر مدارهای درون پردازندهها به همین ترتیب گیتهای ساده را به ترکیب میکنند. ترکیب مجموعهای از گیتها بدین شکل برای اجرای عملیاتها روی ورودی به عنوان «منطق ترکیبی» شناخته میشود اما ترکیب این گیتها تا زمانی که روشی برای ذخیره دادهها یا رهگیری وضعیت پارامترها وجود نداشته باشد، بی فایده است. بدین منظور به منطق ترتیبی نیاز داریم که توانایی ذخیره دادهها را به ما میدهد.
منطق ترتیبی برای ذخیره سازی داده
منطق ترتیبی با اتصال دقیق وارونگر و دیگر گیتهای منطقی به گونهای ساخته میشود که خروجی گیت فیدبکی به ورودی آنها میدهد. این حلقه فیدبک برای ذخیره یک بیت داده به کار میرود که با عنوان رم استاتیک یا SRAM شناخته میشود. دلیل این نامگذاری این است که برخلاف رمهای داینامیک یا DRAM داده حین ذخیره سازی به صورت مستقیم به ولتاژ مثبت یا زمین متصل شده است.
در شکل زیر روش استاندارد ساخت یک بیت واحد از SRAM با ۶ ترانزیستور نشان داده شده است. سیگنال بالایی که با WL مشخص شده آدرس است و در صورت اعمال داده ذخیره شده در این سلول به BL ارسال میشود. خروجی BLB همان مقدار وارون شده BL است.
در ساخت حافظه کش و رجیسترها معمولا از SRAM استفاده میشود چرا که بسیار با ثبات است اما مشکل اینجاست که برای ذخیره هر بیت داده به ۶ تا ۸ ترانزیستور نیاز داریم. این مساله باعث شده ساخت SRAM نسبت به DRAM بسیار پیچیده و پر هزینه باشد. از سوی دیگر رم داینامیک یا RAM دادهها را به جای گیتهای منطقی در خازنی کوچک ذخیره میکند و در آن برای دسترسی به دادههای ذخیره شده تنها از یک ترانزیستور استفاده میشود.
با توجه به استفاده از یک ترانزیستور به ازای هر بیت داده ذخیره شده در DRAM، ساخت آن ارزان است اما یکی از معایب این است که خازن باید همیشه به رفرش شود و به همین خاطر است که در صورت خاموش کردن سیستم، دادههای ذخیره شده در RAM پاک میشوند.
کمپانیهایی مثل انویدیا و AMD و اینتل مثل جانشان از شماتیک کارکرد پردازنده محافظت میکنند و به همین خاطر ترسیم دیاگرام کاملی از پردازندههای مدرن ناممکن است اما همانطور که گفتیم میتوان آنها را به گیتهای منطقی، عناصر ذخیرهسازی و سپس ترانزیستورها تقسیم کرد.
کلاک
تمامی اجزای کلیدی پردازندهها به سیگنال کلاک متصل هستند که در بازه از پیش تعریف شدهای به نام فرکانس به صورت متناوب بالا و پایین میرود. منطق درون پردازنده معمولا مقادیر را تغییر میدهد و محاسبات را زمانی که کلاک از کم به زیاد میرود، انجام میدهد. هدف از اینکار هماهنگ سازی تمام اجزا با هم است تا دریافت دادهها در زمان درست تضمین شده و از هر اختلالی در پردازنده جلوگیری کرد.
احتمالا عبارت اورکلاک یا افزایش کلاک پردازنده به گوش شما هم خورده است. هدف از اینکار افزایش کارایی سیستم است و از طریق افزایش سیکلهای کاری به ازای هر ثانیه صورت میگیرد. پردازندههای مدرن با فرکانسی بین ۳ تا ۴.۳ گیگاهرتز کار میکنند که طی دهه گذشته هم تغییر چندانی به خود ندیده است. همانطور که قدرت یک زنجیر را ضعیفترین حلقه آن مشخص میکند، سرعت پردازنده هم بر اساس عملکرد کندترین بخش آن تعیین میشود. تمامی اجزای پردازنده در پایان هر سیکل باید کارشان را تمام کرده باشند چرا که در غیر این صورت پردازنده از کار باز میایستد. طراحان به همین خاطر کندترین عضو را «مسیر بحرانی» مینامند که حداکثر فرکانس قابل دستیابی پردازنده را مشخص میکند. فراتر از این عدد ترانزیستورها با سرعت لازم قادر به سوییچ نیستند و در نتیجه دچار اختلال شده یا خروجی نادرست ارائه میکنند.
با افزایش ولتاژ تغذیه ورودی پردازنده میتوان سرعت سوییچ ترانزیستور را افزایش داد اما این کار تنها تا نقطه خاصی قابل اجراست. اگر ولتاژ از حد خاصی فراتر رود ریسک سوختن پردازنده وجود دارد. زمانی که فرکانس یا ولتاژ پردازنده افزایش مییابد، توان مصرفی آن بیشتر شده و حرارت بیشتری هم تولید میکند. علت هم این است که قدرت پردازنده با فرکانس و مجذور ولتاژ متناسب است. برای تعیین توان مصرفی پردازنده معمولا هر ترانزیستور به عنوان یک خازن کوچک در نظر گرفته میشود که با هر بار تغییر مقدار باید شارژ یا دشارژ شود.
تحویل توان چنان اهمیتی دارد که گاه نیمی از پینهای فیزیکی روی چپ تنها نقش تامین کننده توان یا اتصال زمین را بر عهده دارند. برخی چیپها در حداکثر لود بار بیش از ۱۵۰ آمپر توان میکشند که باید به دقت مدیریت شود. برای درک بهتر اهمیت مدیریت این توان باید بدانید که پردازنده به ازای هر واحد سطح حرارتی بیش از یک راکتور اتمی تولید میکند.
در پردازندههای جدید کلاک حدود ۳۰ تا ۴۰ درصد کل توان مصرفی را به خود اختصاص میدهد چرا که بسیار پیچیده است و باید بخشهای بسیار زیادی را به کار اندازد. در پردازندههای کم مصرف برای ذخیره انرژی بخشهایی از پردازنده که فعال نیستند خاموش میشوند. اینکار را میتوان با خاموش کردن سیگنال ورودی آن بخش (Clock Gating) یا از طریق قطع توان (Power Gating) انجام داد.
کلاک یک چالش دیگر هم در طراحی پردازندهها ایجاد میکند چرا که با افزایش فرکانس، قوانین فیزیکی بر سر طراحان قرار میگیرد. با تمام سرعتی که نور دارد، برای برخی پردازندههای مدرن کند محسوب میشود. اگر کلاک به یک سمت چیپ متصل شود، تا زمانی که به طرف دیگر برسد تا حد قابل توجهی از سینک خارج شده است. طراحان برای غلبه بر این مشکل با ساختاری به نام H-Tree کلاک را توزیع میکنند. این ساختار تضمین میکند که همه نقاط انتهایی یا اند پوینتها، فاصلهی یکسانی از مرکز داشته باشند.
طراحی پردازنده با کد
بی شک طراحی هر ترانزیستور، سیگنال کلاک و اتصال پاور در چیپ دشوار است و حتی با وجود هزاران مهندس در شرکتهای اینتل، انویدیا و AMD طراحی دستی تمام جنبههای یک تراشه ناممکن است. این شرکتها برای طراحی پردازنده و ترسیم شماتیک مجموعهای از ابزارها را به کار میگیرند که توصیفی سطح بالا از آنچه که تراشه باید انجام دهد را دریافت کرده و پیکربندی بهینهای از سخت افزار را بدان منظور تحویل میدهند.
این اواخر مهندسان به تکنیک High Level Synthesis روی آوردهاند که به آنها اجازه میدهد با توصیف عملکرد مورد نظر در قابل کد، پیکربندی سختافزاری بهینه را دریافت کنند. در این روش با استفاده از زبانهایی مثل Verilog و VHDL عملکرد مدار را توضیح میدهند و پس از انجام شبیهسازیهای اولیه صحت طراحی سنجیده میشود. در صورتی که همه چیز درست باشد نحوه کنار هم قرار گرفتن ترانزیستورها مشخص می شود.
شاید روند بررسی و تایید طراحی اولیه به اندازه طراحی یک کش یا هسته جدید مهم به نظر نرسد اما آنقدر حیاتی است که به ازای هر مهندس طراح در شرکتهای تولید کننده، چهار یا پنج مهندس در بخش بررسی استخدام میشوند چرا که پس از آغاز تولید نمیتوان مشکلات آنرا برطرف کرد. به همین خاطر روند تایید نهایی به مراتب پر هزینهتر و طولانیتر از ساخت خود چیپست است. اگر این روند به درستی انجام نشود مشکلاتی مثل وجود باگ در بخش ممیز شناور پردازندههای پنتیوم اینتل رخ میدهد که آن زمان حدود ۲ میلیارد دلار امروز روی دست آنها خرج گذاشت.
جمع بندی
همانطور که دیدید ترانزیستورها گیتهای منطقی را میسازند و از ترکیب این گیتها با هم واحدهای عملیاتی برای وظایف خاص شکل میگیرد. با متصل کردن این واحدها به هم نیز معماری محاسباتی ایجاد میشود. تصور اینکه یک پردازنده چگونه میلیاردها ترانزیستور را در خود جای داده که با هم کار میکنند در نگاه اول بسیار مشکل است اما زمانی که تراشه را به قسمتهای کوچکتر تقسیم کنیم، درک آن کمی آسانتر میشود.