با نحوه ی طراحی و ساخت پردازنده ها در سی و دومین شماره ی هفته نامه ی دنیای موبایل و کامپیوتر و در صفحه ی آموزش آشنا شوید

با سلام و احترام به همراهان وبسايت ويژه ی نابينايان شرکت دانش بنیان پکتوس. در سی و دومین شماره ی هفته نامه ی دنیای موبایل و کامپیوتر و در صفحه ی آموزش، شما را با نحوه ی طراحی و ساخت پردازنده ها آشنا خواهیم کرد.

پردازنده ها چگونه طراحی و ساخته می شوند؟

در اولین بخش به بررسی اصول کار پردازنده ها، روش اجرای دستورالعمل ها در آن و شناخت اجزای مختلف هر تراشه می پردازیم و سپس با فرایند طراحی پردازنده آشنا خواهیم شد.

به نقل از زومیت، همه ی ما می دانیم که پردازنده یا CPU در حکم مغز یک کامپیوتر است، اما این عبارت واقعاً به چه معنی است؟ چه چیزی درون یک تراشه و در میان میلیاردها ترانزیستور اتفاق می افتد تا یک کامپیوتر به کار بیفتد و دستورالعمل های پیچیده را اجرا کند؟ در این مقاله قصد داریم به واکاوی یک CPU بپردازیم و هر آنچه از درون و بیرون باعث به کار افتادن یک پردازنده می شود را شرح دهیم. در این مقالات سعی خواهیم کرد مباحثی نظیر معماری کامپیوتر، اجزای سازنده ی تراشه، روشِ طراحی مدارهای پردازنده، مفهوم VLSI یا تجمیع در ابعاد بسیار بزرگ، ساخت فیزیکی تراشه و فناوری های مربوطه و خط مشی آینده ی اجرای محاسبات در کامپیوترها را پوشش دهیم.

چرخه ی اجرای دستورالعمل در یک پردازنده

بحث خود را با روش کار یک پردازنده و کارهایی که این قطعه ی سخت افزاری قادر به انجام آن است، شروع می کنیم و خواهیم دید که چگونه بلوک های ساختاری در یک طراحی عملیاتی گرد هم می آیند. این بلوک های ساختاری شامل هسته های پردازنده، سلسله مراتب حافظه، پیش بینی گر انشعاب (Branch Prediction) و دیگر اجزا است.

ساده ترین توضیح پیرامون روش کار یک پردازنده، همان توضیح آشنایی است که به گوش همه ی ما رسیده است. پردازنده از یک سری دستورالعمل برای انجام پاره ای از اعمال روی مجموعه ای از ورودی ها پیروی می کند و نتایج خروجی  را بازمی گرداند. این عملیات  ممکن است شامل خواندن یک مقدار از حافظه، افزودن آن به مقداری دیگر و در نهایت بازگرداندن نتیجه به محل یا آدرس متفاوتی در حافظه باشد. محاسبه ممکن است پیچیده تر نیز باشد؛ مثلا به کامپیوتر بگوییم اگر حاصل  محاسبه ی قبلی بیشتر از مقدار صفر شد، دو عدد را بر یکدیگر تقسیم کن.

معماری مجموعه دستورالعمل یا ISA مفهومی در ارتباط با برنامه نویسی است و زبان های سطح بالا را به دستورالعمل های قابل درک برای پردازنده تبدیل می کند

برای اینکه برنامه ای نظیر یک سیستم عامل یا یک بازی در کامپیوتر اجرا شود، آن برنامه که به صورت مجموعه ای از دستورالعمل ها در حافظه قرار دارد، برای اجرا در اختیار پردازنده قرار می گیرد. این دستورالعمل ها از حافظه بارگیری شده و در ساده ترین حالت ممکن، یکی پس از دیگری اجرا می شود تا روند اجرای برنامه پایان یابد. توسعه دهندگان نرم افزار برنامه های خود را با زبان های برنامه نویسی سطح بالایی نظیر C++ یا پایتون می نویسند که برای پردازنده به صورت خام قابل درک نیست. همان طور که می دانید، پردازنده ها فقط زبان صفرها و یک ها را متوجه می شوند، پس باید راهی پیدا کنیم که دستورالعمل ها یا کدهای هر برنامه و نرم افزار به چنین فرمتی تبدیل شوند.

کدهای برنامه  به مجموعه ای از دستورالعمل های سطح پایین با نام زبان اسمبلی ترجمه (کامپایل) و تبدیل می شوند که بخشی از معماری مجموعه دستورالعمل ( ISA) یا به اختصار معماری پردازنده است. این همان مجموعه دستورالعمل هایی است که پردازنده برای درک و اجرای آن ساخته شده است. اصلی ترین معماری های مجموعه دستورالعمل یا به اختصار ISAها شامل x86، آرم، MIPS، معماری PowerPC و RISC-V می شود. زبان های برنامه نویسی مختلف نحوه ی نگارش و قرارگیری کلمات و عبارات و کدهای متفاوتی دارند که به آن سینتکس گفته می شود؛ همان طور که زبان های سطح بالایی مثل C++ و پایتون سینتکس متفاوتی دارد، ISA هم سینتکس جداگانه ای دارند.

 مراحل تبدیل کدهای سطح بالای یک برنامه به زبان ماشین

معماری های مجموعه دستورالعمل به دو شاخه ی اصلی قابل تجزیه است؛ طول ثابت و طول متغیر. معماری RISC-V از دستورالعمل هایی با طول ثابت استفاده می کند؛ یعنی هر دستورالعمل تعداد بیت معین از پیش تعریف شده ای دارد که نوع آن دستورالعمل را تعریف می کند. در مقابل معماری x86 از دستورالعمل هایی با طول متغیر استفاده می کند. در معماری x86، امکان رمزنویسی (Encoding) دستورالعمل ها با روش های متفاوت و تعداد بیت های مختلف برای بخش های مختلف وجود دارد. به دلیل وجود چنین پیچیدگی، رمزگشایی (Decoding) دستورالعمل در پردازنده های x86 معمولاً با پیچیده ترین جزء در کل طراحی اجرایی می شود.

دستورالعمل های طول ثابت به دلیل ساختار متداول خود امکان رمزگشایی به مراتب ساده تری دارند، اما تعداد کل دستورالعمل هایی را که یک ISA قادر به پشتیبانی از آن است، محدود می کند. در حالی که نسخه های متداول معماری RISC-V فقط چیزی در حدود ۱۰۰ دستورالعمل دارند و منبع باز هستند، معماری x86 یک دارایی فکری متعلق به اینتل است و و عدد دقیقی از تعداد دستورالعمل های این معماری در دسترس نیست. این باور وجود دارد که این معماری از چند هزار دستورالعمل پشتیبانی می کند؛ اما تعداد دقیق آن ها اعلام نشده است. باوجود تفاوت هایی که در میان معماری های مجموعه دستورالعمل وجود دارد، اصول زیربنایی تمامی آن ها ضرورتاً یکسان است.

اکنون مروری بر نحوه ی اجرای یک برنامه یا مجموعه ی کدهای نوشته شده ی آن توسط یک کامپیوتر خواهیم داشت. اجرای یک دستورالعمل در حقیقت شامل چند بخش اساسی است که در مراحل مختلف کار یک پردازنده به بخش های کوچکتری تجزیه می شوند. در ادامه این بخش های کلی با زبانی ساده تبیین خواهد شد.

اولین مرحله واکشی دستورالعمل (Fetch) از حافظه به پردازنده برای آغاز اجرا است. در مرحله ی دوم، دستورالعمل رمزگشایی (Decode) می شود تا پردازنده تشخیص دهد با چه نوع دستورالعملی سر و کار دارد. انواع زیادی از دستورالعمل ها شامل دستورالعمل های حسابی، دستورهای انشعاب و دستورالعمل های حافظه ممکن است برای اجرا در اختیار پردازنده قرار گیرد. به محض آنکه پردازنده دانست با چه نوع دستورالعملی سروکار دارد، عملوند های (Operand) مرتبط با دستورالعمل از حافظه یا ثبات های داخلی در CPU جمع آوری می شود. برای توضیح بیشتر، اگر بخواهیم طبق دستورالعمل، عدد A و عدد B را با یکدیگر جمع کنیم، تا زمانی که مقادیر دقیق عملوند های A و B مشخص نباشد، انجام عمل جمع ناممکن است. پس از آنکه پردازنده عملوندها را برای جایگذاری در دستورالعمل فراخواند، وارد مرحله ی اجرای دستورالعمل می شود که در آن عملیاتی روی مقادیر ورودی انجام می شود. این عملیات می تواند جمع اعداد ورودی، انجام یک عملیات دستکاری منطقی روی اعداد یا عبور دادن اعداد بدون اصلاح آن ها باشد. پس از محاسبه ی نتیجه ممکن است نیاز به دسترسی به حافظه برای ذخیره ی مقدار نتیجه باشد یا ممکن است پردازنده نتیجه را فقط در یکی از ثبات های داخلی خود نگه دارد. پس از ذخیره سازی نتیجه، پردازنده وضعیت المان های مختلف را به روزرسانی می کند و آماده ی اجرای دستورالعمل بعدی می شود.

بیشتر پردازنده های مدرن ۶۴ بیتی هستند؛ یعنی مقادیر داده ها را با پهنای باند ۶۴ بیتی از آدرس های حافظه و ثبات ها فرا می خوانند و مورد پردازش قرار می دهند و نتایج پردازش را به آدرس های حافظه باز می گردانند. بنابراین یک معماری پردازنده ۶۴ بیتی در مقایسه با یک مدل ۳۲ بیتی امکان فراخوانی و پردازش دو برابر داده را در آن واحد دارد.

توضیحاتی که در مورد نحوه ی عملکرد یک پردازنده ارائه شد، بسیار خلاصه و ساده سازی شده بود. بیشتر پردازنده های مدرن مراحل معدود یادشده را برای افزایش بازدهی به دست کم ۲۰ مرحله ی خردتر تقسیم می کنند. به عبارت دیگر، هر چند یک پردازنده در هر چرخه ی کاری یا سیکل کلاک اجرای چندین دستورالعمل را شروع می کند، ادامه می دهد و به سر انجام می رساند؛ اما برای اجرای هر دستورالعمل از آغاز تا اتمام، ممکن است ۲۰ سیکل کلاک یا حتی بیشتر لازم باشد. به چنین مدلی در اصطلاح یک پایپ لاین اطلاق می شود. پر شدن یک خط لوله با سیال در جریان مدتی به طول می انجامد، اما پس از آن یک خروجی پایدار و ثابت از آن سیال به دست می آید. در پایپ لاین پردازنده، به جای سیال دستورالعمل ها به جریان می افتند.

چرخه ی کامل اجرای یک دستورالعمل فرایندی پیچیده و محاسبه شده است، اما این به معنای اجرای هم زمان تمامی دستورالعمل ها نیست. برای مثال عمل جمع با سرعت بسیار زیاد اجرا می شود؛ اما عملیات هایی مثل تقسیم یا بارگذاری از حافظه ممکن است صدها سیکل کلاک به طول بینجامد. به جای معطل کردن کل ساختار پردازنده برای اتمام یک دستورالعمل کند اجرا، بیشتر پردازنده های مدرن به نحوی بدون پیروی از نظم و ترتیب خاص کار می کنند. به عبارت دیگر پردازنده تعیین می کند که اجرای چه دستورالعملی در زمانی معین بیشترین سودمندی را دارد و در عین حال سایر دستورالعمل هایی را که هنوز آماده اجرا نیست، بافر می کند. اگر دستورالعمل جاری هنوز آماده ی اجرا نباشد، پردازنده در خطوط کد به جلو پرش می کند و به دنبال بخشی از دستورالعمل که آماده ی اجرا است می گردد.

دستورالعمل ها به مانند سیالی در پایپ لاین پردازنده به جریان می افتد و در هر مرحله از پایپ لاین، پردازش دستورالعمل های متعددی در جریان است

برخی از پردازنده های مدرن امروزی، علاوه بر اجرای نامنظم دستورالعمل ها، روشی با نام معماری سوپراسکالر را به کار می بندند. با این روش در هر زمان معین، پردازنده در حال اجرای دستورالعمل های بسیاری در یک مرحله ی خاص از پایپ لاین (مثل مرحله ی واکشی، رمزگشایی، اجرا و ذخیره سازی) است. در عین حال ممکن است پردازنده منتظر صدها دستورالعمل دیگر برای آغاز اجرا باشد.

در هر مرحله از پایپ لاین کدهای متفاوتی در حال پردازش بوده و در عین حال ممکن است دستورالعمل های زیادی در بافر منتظر ورود به پایپ لاین باشند.

در اینجا بهتر است با مفهوم IPC که تأثیر به سزایی در سطح عملکرد یک پردازنده دارد، آشنا شویم. IPC مخفف عبارت Instruction per Clock است که مفهوم آن میانگین تعداد دستورالعمل های اجراپذیر در هسته های پردازنده در هر سیکل کلاک است. محاسبه ی IPC در یک ماشین کار نسبتا پیچیده ای است. برای انجام این کار مجموعه ای به خصوص از کدها برای اجرا به ماشین داده می شود و تعداد دستورالعمل های سطح ماشین برای تکمیل اجرای آن کدها محاسبه می شود. در گام بعد، با استفاده از زمان سنج های سطح بالا تعداد سیکل های کلاک موردنیاز برای کامل کردن آن تعداد دستورالعمل روی سخت افزار واقعی اندازه گیری می شود. با تقسیم تعداد دستورالعمل ها بر تعداد سیکل های کلاک اندازه گیری شده، رقم IPC ماشین مورد نظر محاسبه می شود. با ضرب IPC اندازه گیری شده در سرعت کلاک (بر حسب هرتز) و تعداد هسته های پردازنده، تعداد دستورالعمل اجراشدنی در هر ثانیه یا تعداد عملیات های ممیز شناوری محاسبه می شود که در هر ثانیه به وسیله ی پردازنده ی مدنظر اجراشدنی است. در نهایت، تعداد دستورالعمل های اجراشدنی به وسیله ی پردازنده در هر ثانیه که با واحد گیگافلاپس یا میلیارد عمل اعشاری در ثانیه بیان می شود، معیاری از سطح عملکرد پردازنده ی مدنظر است.

تعداد دستورالعمل های اجراپذیر در هر سیکل کلاک برای پردازنده عدد ثابتی نیست و بستگی به نحوه ی تعامل و برهمکنش نرم افزار و برنامه ی در حال اجرا با بخش سخت افزاری سیستم دارد. با وجود این، طراحان تراشه سعی می کنند، با تکیه بر روش هایی مانند استفاده از چندین واحد محاسبه گر منطقی (ALU) در هر هسته و پایپ لاین های دستورالعمل کوتاه تر، عدد IPC را در مقایسه با مقدار متوسط آن افزایش دهند.

مجموعه دستورالعمل ها (Instruction Set) نیز بر عدد IPC پردازنده تأثیرگذار است. هرچه مجموعه دستورالعمل ها ساده تر باشد، IPC پردازنده افزایش می یابد و هرچه با دستورالعمل های پیچیده تری رو به رو باشیم، بالتبع IPC کاهش پیدا می کند. بنابراین، IPC پردازنده برای اجرای محاسبات ممیز شناور با دقت واحد (FP32) در مقایسه با اجرای محاسبات با دقت مضاعف (FP64) عدد بزرگ تری است. آنچه میزان کارایی پردازنده را مشخص می کند، ترکیبی از IPC و سرعت کلاک و تعداد هسته ها است. با این حال، سازندگان پردازنده عموما عدد IPC را در مشخصات رسمی آن ذکر نمی کنند.

برای آنکه پردازنده به طور هم زمان قادر به اجرای دستورالعمل های زیادی باشد، ممکن است کپی های زیادی از هر مرحله پایپ لاین ایجاد کند. اگر پردازنده بداند که دو دستورالعمل به طور هم زمان آماده ی اجرا است و وابستگی بین آن ها وجود ندارد و نیازی به اتمام یکی و آغاز دیگری نیست، هر دو دستورالعمل را در یک زمان به اجرا در می آورد. یکی از راه های پیاده سازی این راهکار، پردازش چندرشته ای هم زمان (Simultaneous Multithreading ) یا SMT است. پردازنده های اینتل و AMD در حال حاضر از شیوه ی SMT دو خطی استفاده می کنند. در این پردازنده ها هر هسته ی فیزیکی به دو هسته مجازی تقسیم بندی شده و هر هسته ی به دست آمده یک ترد یا رشته نام گذاری می شود. بدین ترتیب هر هسته امکان اجرای دو جریان یا دو رشته دستورالعمل را به طور هم زمان خواهد داشت. IBM در حال توسعه ی پردازنده هایی با قابلیت اجرای SMT هشت خطی است.

مولتی تردینگ یا پردازش هم زمان چند رشته در هر هسته، باعث کاهش چشمگیر زمان اجرای دستورالعمل می شود

برای اجرای حساب شده ی چنین فرایندی، یک پردازنده علاوه بر هسته های اصلی از اجزای اضافی زیادی برخوردار است. صدها ماژول مجزا در یک پردازنده وجود دارد که هر یک هدف خاصی را برآورده می کنند. در این مقاله به جهت پرهیز از اطاله ی کلام تنها به بررسی دو قسمت اصلی حافظه کش و پیش بینی گر انشعاب بسنده خواهیم کرد. اجزای دیگری نظیر بافرهای بازآرایی، Register Alias Table و ایستگاه های رزرواسیون وجود دارد که در این مقاله از توضیح آن ها صرف نظر می شود.

مفهوم حافظه ی کش ممکن است کمی گیج کننده باشد، چرا که آن ها درست مثل رمِ سیستم یا درایو SSD داده ها را در خود ذخیره می کنند؛ اما آنچه باعث تمایز حافظه ی کش از قطعات مشابه خود می شود، سرعت بسیار بالاتر و تأخیر کمتر در دسترسی به داده ها است. هر چند حافظه ی رم سیستم بسیار سریع است، سرعت آن برای همگام شدن با فرآیندهای اجرای دستورالعمل پردازنده همچنان بسیار نارسا است. تأمین داده های مورد نیاز پردازنده از سوی حافظه ی رم ممکن است صدها سیکل کلاک به طول بینجامد و امکان تغذیه ی به هنگام پردازنده ای که تنها در یک سیکل کلاک چندین دستورالعمل را اجرا می کند، با چنین سرعتی وجود ندارد. حالا اگر داده ها هنوز روی حافظه ی رم قرار نگرفته باشد، دسترسی به داده های مورد نیاز در حافظه SSD ده ها هزار سیکل کلاک به طول می انجامد. بدون وجود حافظه های به مراتب سریع تر کش، پردازنده از کار باز خواهد ماند.

سلسله مراتب و میزان تأخیر در دسترسی پردازنده به اجزای مختلف حافظه در سیستم

پردازنده ها به طور معمول ۳ سطح از حافظه ی کش را در خود دارند که بخشی از ساختاری با نام سلسله مراتب حافظه را شکل می دهد. کش سطح ۱ (L1) کوچک ترین و سریع ترین حافظه ی کش موجود در تراشه است، کش سطح ۲ (L2) از این نظر وضعیت متعادلی دارد و سومین سطح از حافظه ی کش (L3) کندترین و بیشترین بخشِ حافظه ی کش را به خود اختصاص می دهد. در سلسله مراتب حافظه ی یک پردازنده، ثبات های کوچک یک مرحله بالاتر از حافظه ی کش قرار دارد که در خلال محاسبه یک مقدار داده ی واحد (۱ بیت) را به خود می گیرد. این ثبات ها سریع ترین تجهیزات ذخیره سازی در یک سیستم کامپیوتری هستند که سرعت آن ها چندین برابر اجزای دیگر است. زمانی که کامپایلر برنامه سطح بالا را به زبان اسمبلی ترجمه می کند، بهترین راه به کارگیری این ثبات ها را نیز تعیین می کند.

زمانی که پردازنده داده ها را از حافظه فرامی خواند، ابتدا بررسی می کند آیا داده های مورد نظر در حال حاضر در کش سطح ۱ قرار گرفته یا خیر. اگر داده های مورد نظر در این کش قرار گرفته باشد، به سرعت و ظرف یکی دو سیکل کلاک در اختیار پردازنده قرار می گیرند. اگر داده ها در کش L1 قرار نگرفته باشند، پردازنده همین روال را در مورد کش سطح ۲ و سپس کش سطح ۳ پیگیری می کند. قطعات حافظه ی کش به نحوی پیاده سازی می شود که محتوای آن برای هسته کاملاً شفاف باشد. هسته تنها داده ها را در آدرس مشخصی از حافظه درخواست می کند و هر سطحی از حافظه ی کش که در سلسله مراتب، داده های مورد نظر را در خود ذخیره داشته باشد به سرعت پاسخ پردازنده را خواهد داد. با حرکت به سمت مراحل بعدی در سلسله مراتب حافظه، اندازه و میزان تأخیر حافظه عموماً تا چندین برابر افزایش می یابد. در آخر اگر پردازنده نتواند داده ها را در یکی از سطوح کش بیابد، به ناچار و با واسطه ی جزیی از پردازنده با نام کنترلر حافظه، به حافظه اصلی (رم) مراجعه خواهد کرد.

در یک پردازنده ی معمولی، هر هسته از دو جزء حافظه کش سطح یک برخوردار است؛ یکی از آن ها برای ذخیره  ی داده و دیگری برای ذخیره ی دستورالعمل ها استفاده می شود. ظرفیت کش سطح یک در مجموع حدود ۱۰۰ کیلوبایت است و اندازه ی آن بسته به نوع تراشه، نسل و فناوری ساخت متغیر است. معمولاً هر هسته با یک کش سطح ۲ اختصاصی همراه می شود؛ گرچه گاه این قطعه از حافظه کش بین دو هسته به اشتراک گذارده می شود. ظرفیت کش سطح دو معمولاً از چند صد کیلو بایت تجاوز نمی کند. در نهایت کش سطح ۳ بین تمام هسته ها به اشتراک گذارده می شود و ظرفیتی معادل چند ده مگابایت دارد.

وقتی یک پردازنده در حال اجرای یک قطعه کد است، دستورالعمل ها و مقادیر داده ای که به آن نیاز است، در حافظه ی کش ذخیره سازی شده یا به اصطلاح کش می شود. با این شیوه سرعت اجرا به طور چشمگیری افزایش می یابد؛ چرا که پردازنده برای دستیابی به داده های مورد نیاز خود نیازی به تعامل دائمی با حافظه ی اصلی ندارد. در مورد نحوه ی قرارگیری حافظه ی اصلی و SSD در زیر لایه های بعدی سلسله مراتب حافظه، در ادامه بیشتر صحبت خواهیم کرد.

گذشته از حافظه ی کش، یکی از بلوک های ساختاری کلیدی هر پردازنده ی مدرن بخشی است که پیش بینی گر انشعاب خوانده می شود. دستورالعمل های انشعاب شبیه به گزاره ی «اگر» برای یک پردازنده است. اگر شرایطی برقرار باشد (If True)، یک مجموعه از دستورالعمل ها اجرا می شود و اگر آن شرایط برقرار نباشد (If False)، مجموعه دستورالعمل دیگری به اجرا گذارده می شود. برای مثال دو مقدار عددی با یکدیگر مقایسه می شود و اگر آن دو مقدار برابر باشد، عملیات معینی اجرا می شود. حال اگر این دو مقدار نابرابر باشد، بایستی عملیات دیگری اجرا شود. چنین دستورالعمل های انشعابی به شدت در پایپ لاین رایج بوده و ممکن است حداکثر ۲۰ درصد تمامی دستورالعمل ها را دربرگیرد.

این دستورالعمل های انشعاب در ظاهر ممکن است چندان مسئله ی مهمی به نظر نرسد، اما در عمل چالشی بر سر راه عملکرد درست یک پردازنده است. از آنجایی که پردازنده در هر مقطع زمانی ممکن است در حال اجرای ۱۰ یا ۲۰ دستورالعمل به طور هم زمان باشد، دانستن اینکه چه دستورالعمل هایی باید به اجرا درآید، حائز اهمیت است. پنج سیکل کلاک برای شناسایی یک دستورالعمل انشعاب لازم است و ده سیکل کلاک دیگر باید طی شود تا مشخص گردد، آیا شرایط مورد نظر انشعاب برقرار هست یا نیست. در این بازه ی زمانی، پردازنده ممکن است پردازش ده ها دستورالعمل اضافی را بدون آنکه حتی بداند دستورالعمل های درستی (از نظر سازگاری با انشعاب) برای اجرا انتخاب شده اند، آغاز کند.

برای غلبه بر این مشکل، تمامی پردازنده های رده بالا از تکنیکی با نام Speculation استفاده می کنند. با این شیوه پردازنده با برخورداری از واحدی به نام پیش بینی گر انشعاب دستورالعمل های انشعاب را تعقیب می کند و حدس می زند که آیا انشعاب معین اختیار خواهد شد یا خیر. اگر این پیش بینی درست از آب در بیاید، پردازنده از قبل، اجرای دستورالعمل های پس آیند سازگاری را آغاز می کند و عملکرد تسریع می شود و بهبود می یابد. اما اگر پیش بینی نادرست باشد، پردازنده روند اجرا را متوقف می کند، تمامی دستورالعمل های نادرستی که اجرای آن ها آغاز شده حذف می شود و مراحل اجرا از آخرین نقطه ی درست، از سر گرفته می شود.

پیش بینی گرهای انشعاب به نوعی پایه ای ترین اشکال یادگیری ماشین هستند؛ چرا که پیش بینی گر رفتار انشعاب ها را با جریان یافتن دستورالعمل ها در آن پیش بینی می کند. اگر پیش بینی گر به دفعات زیاد پیش بینی غلط انجام دهد، به زودی رویکرد درست را خواهد آموخت. دهه ها تحقیق در مورد فنون پیش بینی انشعاب سبب شده است که در پردازنده های مدرن امروزی، در بیش از ۹۰ درصد موارد پیش بینی های درستی انجام شود. تکنیک Speculation پردازنده را قادر به اجرای دستورالعمل هایی می کند که به جای قرار گرفتن در صفوف شلوغ داده، از قبل آماده ی پردازش است؛ در عین حال پردازنده را در معرض آسیب های امنیتی نیز قرار می دهد. حفره ی امنیتی مشهور Spectre حملات خود را از راه پیش بینی گر انشعاب و با نفوذی مبتنی  بر Speculation تحمیل می کند. بنابراین برخی از جنبه های این تکنیک باید بازبینی و بازطراحی شود تا از نفوذ دستورالعمل های غیر ایمن در پایپ لاین و نشتی اطلاعات حافظه جلوگیری به عمل آید؛ حتی اگر تأثیر کوچکی بر سطح عملکرد بگذارد.

معماری های مورد استفاده در پردازنده های مدرن، راهی دراز و پر فراز و نشیب در خلال دهه های گذشته پیموده است. ابداعات و طراحی های هوشمندانه منجر به بهبود عملکرد و به کارگیری بهتر اجزای ناپیدای سخت افزاری می شود. تراشه سازان در مورد جزئیات فناوری های به کار رفته در روند ساخت پردازنده بسیار رمزآلود عمل می کنند و دانستن آنچه که دقیقاً درون یک پردازنده و در خلال اجرای دستورالعمل ها اتفاق می افتد، ناممکن است. با وجود این اصول کار پردازنده های کامپیوتر و استانداردهایی که در روند اجرای محاسبات در پردازنده ها رعایت می شود، نسبتا مشخص است. ممکن است اینتل دست به اقدامی مخفیانه برای بهبود عملکرد حافظه ی کش خود بزند یا AMD از یک واحد پیش بینی گر انشعاب پیشرفته با کارایی بهتر استفاده کند، اما در مجموع هر دو دست به اقدامات مشابهی می زنند.

آشنایی با عناصر سازنده و اجزای یک پردازنده

اکنون که با روش کار پردازنده ها آشنا شدیم، وقت آن است که وارد لایه های عمیق تر پردازنده شویم و با اجزا و بخش های داخلی آن آشنایی بیشتری پیدا کنیم. همان طور که احتمالا می دانید، پردازنده ها و دیگر مدارات دیجیتالی مجتمع از اجزایی با نام ترانزیستور ساخته شده اند. ساده ترین راه برای داشتن درکی از یک ترانزیستور تصور سوئیچی با سه پایه یا پین است. گیت منطقی وسیله ای الکترونیکی مرکب از یک یا چند ترانزیستور است که عملیات منطقی را روی داده های باینری (مرکب از ۰ و ۱) انجام می دهد. زمانی که گیت باز باشد، امکان عبور جریان الکتریسیته از درون ترانزیستور وجود دارد و با بسته شدن گیت، جریانی عبور نخواهد کرد. ترانزیستور درست به مانند کلید برق روی دیوار عمل می کند، اما بسیار کوچک تر و بسیار سریع تر است و توانایی کنترل جریان را نیز دارد.

در پردازنده های مدرن دو نوع ترانزیستور اصلی به کار می رود: نوع pMOS و نوع nMOS که به اختصار به آن انواع p و n نیز گفته می شود. ترانزیستور nMOS با شارژ شدن گیت یا تنظیم حالت High، امکان عبور جریان را فراهم می کند و ترانزیستور pMOS جریان را در صورتی عبور می دهد که گیت دشارژ شده یا روی حالت low تنظیم شود. با ترکیب این دو نوع ترانزیستور به طوری که یکی مکمل دیگری باشد، امکان ساخت گیت های منطقی CMOS وجود دارد. در این قسمت از مقاله قصد نداریم وارد جزئیات فنی و ظریف نحوه ی کار ترانزیستور ها شویم.

گیت منطقی یک وسیله ی ساده است که ورودی را دریافت کرده، عملیاتی را روی آن اجرا می کند و نتیجه را به عنوان خروجی به دست می دهد. برای مثال یک گیت AND خروجی خود را اگر و تنها اگر همه ورودی های گیت روشن باشد، روشن خواهد کرد. یک گیت NOT یا وارونگر (Inverter) خروجی خود را در صورتی روشن می کند که ورودی خاموش باشد. با ترکیب این دو گیت، یک گیت NAND یا NOT-AND تشکیل می شود که اگر و تنها اگر هیچ یک از ورودی ها روشن نباشند، خروجی خود را روشن می کند؛ البته گیت های دیگری نظیر  XOR ،NOR ،OR و XNOR نیز در مدارهای منطقی یافت می شود. در ادامه خواهیم دید که چگونه دو نوع گیت اساسی منطقی وارونگر و NAND با استفاده از ترانزیستور ها طراحی می شود.

گیت های منطقی NAND و وارونگر ترکیبی از سیگنال های ورودی، خروجی، ترانزیستورها و البته اتصال زمین است

در گیت وارونگر، یک ترانزیستور نوع pMOS در بالای گیت قرار می گیرد که به خطوط حامل توان متصل است و یک ترانزیستور nMOS در پایین گیت نقش اتصال زمین را بازی می کند. ترانزیستور های pMOS را روی نقشه مدار با دایره ی کوچکی که به گیت خود متصل است، نشان داده شده و ترانزیستورهای nMOS تنها به شکل یک پاره خط کوچک عمودی بیان می شود. از آن رو که ترانزیستورهای pMOS با خاموش بودن ورودی، جریان را عبور می دهند و ترانزیستورهای nMOS در صورت شارژ ورودی اقدام به هدایت جریان می کنند، می توان دریافت که سیگنال در Out (خروجی) گیت همواره مخالف سیگنال در In (ورودی) است.

در گیت NAND چهار ترانزیستور مختلف وجود دارد و امکان تغذیه با دو ورودی فراهم است. مادامی که دست کم یکی از ورودی ها خاموش باشد، خروجی گیت روشن است. اتصال ترانزیستور ها در قالب شبکه های ساده نظیر گیت های یادشده، همان فرآیندی است که برای طراحی گیت های منطقی بسیار پیچیده و مدارات تعبیه شده در یک پردازنده، مورد استفاده ی مهندسان تراشه ساز قرار می گیرد.

با بلوک های ساختاری به سادگی گیت های منطقی، داشتن درکی از نحوه ی ترکیب و تبدیل آن ها به یک تراشه محاسبه گر پیشرفته شاید سخت به نظر برسد. فرایند طراحی چنین تراشه هایی در برگیرنده ی ترکیب گیت های متعدد برای ساخت مداری کوچک است که توانایی انجام یک عمل محاسباتی ساده را دارد. پس از آن تعداد زیادی از این مدار های کوچک ترکیب می شود تا ساختاری برای انجام یک عمل پیچیده تر به دست آید. فرایند ترکیب اجزای جداگانه ی ساده تر نظیر انواع گیت های منطقی و ترکیب آن ها برای دستیابی به یک طراحی عملیاتی و در نهایت مدار مجتمعی که قادر به اجرای محاسبات پیچیده با سرعت بسیار بالایی باشد، دقیقا همان شیوه ای است که امروزه در ساخت پردازنده های مدرن کاربرد دارد. یک تراشه ی امروزی ساختاری مرکب از مدارهای منطقی بی شمار است که میلیاردها ترانزیستور را در خود جای می دهد.

در اینجا یک مثال ساده باعث درک بهتری از بحث می شود. می خواهیم روش کار مدار جمع کننده ی یک بیتی را مرور کنیم. این مدار ۳ مقدار ورودی را دریافت می کند که شامل مقدار A، مقدار B و سیگنال Carry-In است و دو خروجی شامل مقدار Sum و سیگنال Carry-Out به دست می دهد. در طراحی مبنا از ۵ گیت منطقی استفاده می شود. این گیت ها با یکدیگر لینک می شوند تا جمع کننده ای با هر اندازه ی دلخواه بسازند. در طراحی های مدرن پردازنده، اگرچه این فرایند با بهینه سازی برخی از مدارهای منطقی و سیگنال های حامل داده، پیشرفت های زیادی به خود دیده؛ اما اصول کار همچنان یکسان است.

خروجی Sum در صورتی روشن می شود که یکی از مقادیر A یا B و نه هر دو روشن باشد یا سیگنال Carry-In وجود داشته و مقادیر A و B هر دو روشن یا هر دو خاموش باشد. سیگنال Carry-Out کمی پیچیده تر است. این سیگنال وقتی فعال می شود که A و B هر دو در یک زمان روشن شود یا سیگنال Carry-In موجود باشد و یکی از دو مقدار A یا B روشن باشد. برای اتصال چند جمع کننده ی یک بیتی برای ساخت یک جمع کننده با پهنای بیشتر، فقط باید سیگنال Carry-Out بیت قبلی را به سیگنال Carry-In بیت جاری متصل کرد. هرچه مدارها پیچیده تر باشد، ازدحام گیت های کوچک منطقی بیشتر می شود؛ اما آنچه گفته شد، ساده ترین راه برای جمع بستن دو عدد است. در پردازنده های مدرن از مدارهای جمع کننده ی پیچیده تری استفاده می شود و بررسی چنین مدارهایی از حوصله ی این مقاله خارج است. پردازنده ها علاوه بر مدارهای جمع کننده، دربرگیرنده ی واحدهایی برای انجام عمل تقسیم، ضرب و نسخه های اعشاری تمامی این اعمال حسابی است.

ترکیب رشته ای از گیت ها مشابه آنچه گفته شد، برای انجام پاره ای از عملیات ها روی مقادیر ورودی با نام منطق ترکیبی شناخته می شود. با این حال، این نوع منطق تنها شیوه ی شناخته شده در دنیای کامپیوترها نیست. اگر نتوان داده ها را ذخیره کرده یا وضعیت هر پارامتری را ردیابی کرد، استفاده از این شیوه چندان راه گشا نخواهد بود. برای اینکه امکان ذخیره سازی داده ها وجود داشته باشد، از منطق ترتیبی استفاده می شود. منطق ترتیبی با اتصال دقیق وارونگر ها و سایر گیت های منطقی به نحوی انجام می پذیرد که خروجی های هر گیت بازخوردی به ورودی آن ها ارائه دهد. از این حلقه های بازخورد برای ذخیره کردن یک بیت داده استفاده می شود و با نام رم استاتیک یا SRAM شناخته می شوند. عبارت رم استاتیک در مقابل رم دینامیک در حافظه های DRAM قرار می گیرد؛ چرا که در نوع استاتیک، داده های در حال ذخیره همواره به طور مستقیم به ولتاژ مثبت یا زمین متصل هستند.

روش استاندارد برای پیاده سازی یک بیت واحد SRAM استفاده از ۶ ترانزیستور است. سیگنال بالایی WL که مخفف عبارت Word Line است، آدرس بوده و زمانی که اعمال شود، داده ی ذخیره شده در این سلول یک بیتی به Bit Line که با حرف BL مشخص شده، ارسال می شود. خروجی BLB یا Bit Line Bar درست مقدار وارون شده ی Bit Line است. دو نوع ترانزیستور را در این مدار می توان شناسایی کرد و دریافت که ترانزیستورهای M3 و M1 و در سوی دیگر M4 و M2 تشکیل یک گیت وارونگر را داده اند.

SRAM همان عنصری است که از آن برای ساخت حافظه های کشِ فوق سریع و ثبات های درون پردازنده استفاده می شود. این عنصر اگرچه بسیار پایدار است، اما برای نگه داری یک بیت داده نیاز به ۶ تا ۸ ترانزیستور دارد؛ بنابراین ساخت چنین مداری از دیدگاه هزینه، پیچیدگی و فضای موجود در تراشه در مقایسه با DRAM بسیار گران تمام می شود. حافظه های رم دینامیک، در نقطه ی مقابل، به جای استفاده از گیت های منطقی و ترانزیستورها برای ذخیره ی داده، از خازن های بسیار ریز استفاده می کنند؛ این حافظه ها را دینامیک می نامیم چرا که خازن مستقیم به جریان برق یا زمین متصل نیست و امکان تغییر ولتاژ آن به صورت دینامیک وجود دارد. در این حافظه ها تنها یک ترانزیستور واحد وجود دارد که از آن برای دسترسی به داده ی ذخیره شده در خازن استفاده می شود.

از آنجایی که حافظه ی DRAM به ازای هر بیت داده تنها به یک ترانزیستور واحد نیاز دارد و طراحی آن بسیار مقیاس پذیر است، امکان ساخت حافظه های بسیار چگال و ارزان قیمت از این نوع وجود دارد. یکی از اشکالات رم دینامیک این است که ظرفیت شارژ خازن آنقدر کم است که به طور دائم باید از نو شارژ شود. به همین دلیل است که وقتی کامپیوتر خود را خاموش می کنید، تمامی خازن ها تخلیه می شود و هر آنچه در این حافظه بارگذاری شده، از دست می رود. ترکیبی از مدارهای کوچک شکل فوق در سطر و ستون های پرشمار ساختار حافظه ی DRAM سیستم را شکل می دهد.

شرکت هایی مثل اینتل، AMD و انویدیا طرحی دقیق از نحوه ی کار پردازنده های خود ارائه نمی کنند، بنابراین نمایش دیاگرامی کامل از مدار های منطقی یک پردازنده ی مدرن ناممکن است؛ با وجود این، مثالی که از یک مدار جمع کننده ی ساده زده شد، می تواند تصور مناسبی از نحوه ی کار یک پردازنده و چگونگی تجزیه ی آن به گیت های منطقی، عناصر ذخیره سازی و در نهایت ترانزیستورها  ایجاد کند.

اکنون که با روش کار و طرز ساخت بعضی از اجزای اساسی پردازنده ها آشنا شدیم، باید دریابیم که چگونه همه ی اجزا به یکدیگر متصل و با یکدیگر همگام می شوند. همه اجزای کلیدی یک پردازنده به عاملی با نام سیگنال کلاک متصل می شوند. این سیگنال در بازه های از پیش تعریف شده با نام فرکانس، بین دو حد بالا و پایین نوسان می کند. سیگنال کلاک توسط قطعه ای با نام مولد سیگنال (Signal Generator) که یک نوسان ساز الکترونیکی است، تولید می شود. نوسان ساز متشکل از برد مدارات پیزو الکتریک از جنس کوارتز یا سرامیک است. این مولد، سیگنالی با زمانبندی دقیق برای همگام سازی عملکرد مدارهای منطقی مختلف درون تراشه تولید می کند. مولد سیگنال سینوسی را در ورودی دریافت کرده و طی مراحلی آن را تبدیل به یک موج مربعی ساده ی متقارن یا موج پیچیده تری می کند و تحویل تراشه می دهد.

اجزای منطقی پردازنده همگام با اوج و فرود سیگنال دریافتی، مقادیر را تبدیل و جایگزین (سوییچ) کرده و محاسبات را اجرا می کنند. با همگام کردن تمامی اجزا با یکدیگر می توان اطمینان یافت که داده ها همواره با زمان بندی مناسبی تحویل و دریافت می شود، به طوری که هیچ خللی در کار پردازنده پدید نمی آید.

خوانندگان این مقاله ممکن است با مفهوم اورکلاکینگ آشنا باشند که در آن کلاک پردازنده به طور دستی یا از طریق متدهای نرم افزاری افزایش می یابد تا سطح عملکرد تراشه بهبود یابد. این بهبود سطح عملکرد ناشی از تسریع فرایند سوئیچ ترانزیستور ها و مدار های منطقی با سرعتی بیشتر از آن چیزی است که در طراحی پیش بینی شده است. از آنجایی که در هر ثانیه سیکل های کلاک بیشتری پیموده می شود، کار بیشتری قابل انجام است و پردازنده کارایی بالاتری دارد؛ هرچند این افزایش سطح عملکرد نقطه ی بیشینه ای دارد. فرکانس یا سرعت کلاک پردازنده های مدرن عددی بین ۳ تا ۴/۵ گیگاهرتز است و در طول یک دهه گذشته این رقم تغییر چندانی به خود ندیده است. درست همچون یک زنجیر فلزی که استحکام آن برابر با استحکام ضعیف ترین حلقه است، حداکثر سرعت کلاک عملیاتی یک پردازنده را کندترین بخش آن مشخص می کند. هر جزء واحد پردازنده با پایان یافتن یک سیکل کلاک بایستی عملیات مقرر را به اتمام رسانده باشد. اگر در این بازه ی زمانی بخشی از پردازنده قادر به تکمیل عملیات در حال اجرا نباشد، فرکانس کلاک برای آن پردازنده بیشتر از ظرفیت آن بوده و تراشه در این شرایط از کار بازخواهد ایستاد. طراحان این کندترین بخش تراشه را مسیر بحرانی (Critical Path) می نامند و این بخش تعیین کننده ی حداکثر فرکانس یک پردازنده است. تجاوز از یک فرکانس معین سبب می شود، ترانزیستور ها با سرعت کافی سوئیچ نشوند و اختلال در روند کار یا تولید خروجی های نادرست آغاز شود.

فرایند سوئیچ ترانزیستورها را می توان با افزایش ولتاژ تغذیه پردازنده تا حد معینی افزایش داد و افزایش بیش از حد ولتاژ خود ممکن است عامل ایجاد اختلال باشد. از سویی، افزایش بیش از حد ولتاژ خطر سوختن پردازنده را در پی دارد. با افزایش هر یک از دو عامل فرکانس یا ولتاژِ یک پردازنده گرمای بیشتری تولید می شود و توان مصرفی افزایش می یابد. علت این است که توان پردازنده مستقیماً متناسب با فرکانس (سرعت کلاک) و مجذور ولتاژ تغذیه است. برای تعیین توان مصرفی یک پردازنده، معمولاً هر ترانزیستور را به مثابه ی یک خازن کوچک تصور می کنیم که هنگام تغییر مقادیر، باید شارژ یا دشارژ شود.

تحویل توان پایدار به پردازنده گاه آنقدر مهم است که نیمی از پین های فیزیکی روی تراشه، تنها برای تأمین توان مصرفی مورد استفاده قرار می گیرد یا نقش اتصال زمین را ایفا می کند. بعضی تراشه ها ممکن است حین بارگذاری کامل بیش از ۱۵۰ آمپر جریان بکشند و هر میلی آمپر از این جریان باید با دقت و ظرافت زیادی مدیریت شود. در بیان حساسیت حجم توان مصرفی تراشه همین بس که هر پردازنده در واحد سطح میزان گرمایی بیشتر از یک راکتور هسته ای تولید می کند.

سیگنال کلاک در پردازنده های مدرن رقمی در حدود ۳۰ تا ۴۰ درصد مجموع توان مصرفی تراشه را به خود اختصاص می دهد؛ چرا که این تولید و حفظ و بهره برداری از این سیگنال بسیار پیچیده است و باید بخش های مختلف زیادی را به کار اندازد. برای صرفه جویی در مصرف انرژی، در طراحی هایی با بهره وری بالا اجزایی از تراشه که در حال استفاده نیست، خاموش می شود. این کار با خاموش کردن سیگنال کلاسیک در ورودی آن جزء (Signal Gating) یا قطع دسترسی به توان (Power Gating) عملیاتی می شود.

سیگنال کلاک چالش دیگری در طراحی پردازنده نیز به بار می آورد. با افزایش مداوم فرکانس کلاک پردازنده ها، موانع ناشی از قوانین فیزیک بیشتر می شود. اگر می توانستیم سیگنال کلاک را به یک سر تراشه متصل کنیم، در آن واحد سیگنال از سمت دیگر خارج می شد و فرصتی برای همگام سازی اجزا پدید نمی آمد. برای همگام سازی تمام اجزای تراشه، سیگنال کلاک با استفاده از ساختاری به نام H-Tree در سراسر تراشه توزیع می شود. این ساختار تضمین می کند که تمامی نقاط انتهایی، فاصله ی یکسانی از مرکز داشته باشند.

شاید طراحی تک به تک ترانزیستورها، سیگنال کلاک و اتصال توان در یک تراشه کاری بسیار پیچیده و ملال آور به نظر برسد و در حقیقت هم همینطور است. شرکت هایی مثل اینتل، کوالکام و AMD هزاران مهندس طراح تراشه دارند، اما حتی برای آن ها هم طراحی تمامی جنبه های عملی یک تراشه ناممکن است. این شرکت ها برای طراحی پردازنده های خود با آن گستردگی عظیم، از ابزارهای مختلف پیچیده ای استفاده می کنند تا طراحی ها و شماتیک های مدار مورد نظر را برای آن ها خلق کنند. این ابزارها شرح سطح بالایی از آنچه که هر یک از اجزای تراشه باید انجام دهد دریافت می کنند و در نهایت بهینه ترین پیکربندی سخت افزاری را برای برآورده کردن الزامات و سطح عملکرد مورد نظر به دست می دهند. تراشه سازان به سمت تکنیک جدیدی به نام High Level Synthesis گرایش یافته اند. این تکنیک به توسعه دهندگان اجازه خواهد داد تا سطح عملکرد مورد نظر خود را در قالب کدهایی بیان کنند و سپس کامپیوترها نحوه ی دستیابی بهینه به سخت افزار مورد نظر را می سنجند و در اختیار مهندسان قرار می دهند.

تراشه سازان تلاش می کنند عیوب تراشه را در مرحله  بررسی و اعتبارسنجی طراحی ها، پیش از رسیدن به خط تولید برطرف کنند؛ اگر عیوب به تراشه  فیزیکی منتقل شود، دیگر قابل رفع نیستند

درست همان طور که برنامه نویسان برنامه های کامپیوتری را از طریق کد ها تعریف می کنند، طراحان هم می توانند سخت افزار را از طریق کد تعریف و شناسایی کنند. زبان های برنامه نویسی به مانند Verilog و VHDL توسعه یافته است که به طراحان سخت افزار اجازه می دهد، سطوح عملکرد مدارهای منطقی در حال ساخت را به زبانی قابل فهم برای ماشین بیان کنند. در مرحله ی بعد شبیه سازی، بررسی و اعتبارسنجی این طراحی ها انجام می پذیرد و اگر همه چیز مورد تأیید باشد، امکان سنتز و هم گذاری ترانزیستورهای خاص برای ساختن مدارات مورد نظر فراهم می شود. روند بررسی و اعتبارسنجی شاید به اندازه ی طراحی یک هسته یا قطعه ی کش جدید درخور توجه به نظر نرسد، اما به لحاظ منطقی از اهمیت بیشتری برخوردار است. به ازای هر مهندس طراحی که یک شرکت استخدام می کند، ممکن است پنج مهندس بررسی گر یا حتی بیشتر از آن استخدام شود.

بررسی و اعتبارسنجی یک طراحی جدید معمولاً زمان و هزینه ی بیشتری در مقایسه با ساخت تراشه ی فیزیکی واقعی می برد. شرکت ها زمان و پول زیادی را صرف بررسی و اعتبارسنجی طراحی ها می کنند؛ چرا که به مجرد آنکه تراشه ای به مرحله تولید رسید، دیگر فرصتی برای رفع عیوب احتمالی آن وجود ندارد. ایراد های نرم افزاری با انتشار وصله ها قابل رفع است، اما برای رفع ایراد های سخت افزاری غالباً راهکاری وجود ندارد. برای مثال اینتل در واحد تقسیم اعشاری برخی از پردازنده های پنتیوم خود باگی دارد که تا به امروز دو میلیارد دلار هزینه روی دست شان گذاشته است.

از دیدگاهی فراتر، تصور ساخت یک تراشه ی بسیار پیچیده با میلیاردها ترانزیستور و آنچه که همه آن ها در کنار هم انجام می دهند، بسیار سخت جلوه می کند. با وجود این اگر براساس دانسته هایی که از این مقاله به دست آوردیم،  هر پردازنده را مجموعه ای از اجزای ساده تر تصور کنیم که هر یک وظیفه ای با پیچیدگی کمتر را انجام می دهد، حل مسئله آسان تر می شود. ترانزیستورها گیت های منطقی را می سازند، ترکیبی از گیت های منطقی باعث تشکیل واحدهای عملیاتی می شود که هر یک وظیفه ی خاصی را اجرا می کنند و در نهایت این واحدهای عملیاتی به یکدیگر می پیوندند تا معماری های دستورالعملی را که در این مقاله در مورد آن ها صحبت کردیم، پیاده سازی کنند.

در قسمت دوم مقاله در مورد روش های ساخت فیزیکی تراشه های پردازنده و فناوری های ساخت آن ها صحبت خواهیم کرد و با خط مشی های کنونی و آینده ی توسعه ی معماری های کامپیوتری آشنا خواهیم شد.

در قسمت دوم این مقاله مروری بر روش های ساخت صنعتی پردازنده ها و فناوری های مختلف ساخت خواهیم داشت و شیوه های رایج طراحی تراشه ها را واکاوی خواهیم کرد.

در قسمت اول مقاله چرخه ی اجرای دستورالعمل در یک پردازنده، مفهوم معماری پردازنده، نحوه ی به جریان افتادن دستورالعمل ها در پایپ لاین، اجزا و عناصر سازنده ی یک پردازنده و نحوه ترکیب و تعامل آن ها در یک طراحی برای اجرای محاسبات پیچیده را بررسی کردیم. در این قسمت خواهیم دید که چگونه این طراحی های شماتیک و مبتنی بر معماری به صورت فیزیکی پیاده سازی شده و تبدیل به تراشه های دنیای واقعی می شوند.

در قسمت پیشین دریافتیم که پردازنده ها و تمام مدارهای منطقی دیجیتال دیگر همگی از اجزای بسیار کوچکی با نام ترانزیستور ساخته می شوند. ترانزیستور سوئیچی با کنترل الکترونیکی است که با اعمال ولتاژ به گیت یا قطع ولتاژ می توان آن را خاموش و روشن کرد و بدین ترتیب حالات صفر و یک منطقی را به زبان ماشین بیان کرد. همان طور که گفته شد، دو نوع ترانزیستور اصلی در مدار های منطقی یافت می شود: ۱) ترانزیستور nMOS که با شارژ گیت اجازه عبور جریان را می دهد؛ ۲) ترانزیستور pMOS که جریان را در صورت دشارژ گیت از خود عبور می دهد. ساختار زیربنایی یک پردازنده که ترانزیستورها در آن تعبیه شده یا شکل می گیرند، از جنس سیلیکون است. سیلیکون عنصری شیمیایی با نماد Si و عدد اتمی ۱۴ است. سیلیکون به عنوان یک نیمه هادی شناخته می شود؛ چرا که نه به طور کامل جریان را از خود عبور میدهد و نه عایق جریان است و لذا رفتاری بینابینی دارد. سیلیکونی که در صنایع ساخت تراشه به کار می رود، خلوصی برابر با «نه-نه» یا ۹۹/۹۹۹۹۹۹۹  ٪ دارد و تقریباً به صورت بلورهای واحد (تک کریستال) عاری از عیب است.

سیلیکونِ تک کریستال با چنین خلوصی معمولاً از طریق فرایند چکرالسکی تولید می شود؛ فرآیندی که در کارخانجات ساخت نیمه هادی ها یا کارخانه های ریخته گری سیلیکون برای تولید ویفر های سیلیکونی به کار می رود. در این شیوه ساختار بلورین به نحوی رشد داده می شود که تک بلورهای بی عیب و نقصی از عنصر سیلیکون به دست آید. سیلیکون خالص یک نیمه هادی ذاتی است که برخلاف فلزات، حفره های الکترونی و الکترون های آزادشده از اتم ها طی گرمادهی را انتقال می دهد. بنابراین رسانایی الکتریکی سیلیکون با افزایش دما بیشتر می شود. در هر حال سیلیکون خالص رسانایی بسیار کم یا مقاومت بسیار بالایی در برابر عبور الکترون ها دارد، به طوری که استفاده از آن به عنوان یک جزء مداری ناشدنی است. در عمل زیرلایه ی سیلیکون را با مقادیر جزئی و کنترل شده ای از عناصر معین ناهمگن می کنند که به این عمل دوپینگ اطلاق می شود. دوپینگ باعث ایجاد مناطقی با تراکم الکترون یا حفره های الکترونی می شود و رسانایی سیلیکون به طور چشمگیری افزایش می  یابد. از سویی پاسخ الکتریکی این عنصر با کنترل تعداد حامل های جریان فعال و شارژ مثبت و منفی این حامل ها تنظیم می شود. هدف اصلی در اینجا، ایجاد تغییر در نحوه ی رفتار الکترون ها است، به طوری که بتوان آن ها را کنترل کرد. همان طور که دو نوع ترانزیستور در ساختار سیلیکون می توان ایجاد کرد، دو روش دوپینگ متناظر اصلی نیز وجود دارد.

اگر مقدار دقیق و کنترل شده ای از عناصر الکترون دهنده نظیر آرسنیک، آنتیموان یا فسفر را وارد ساختار سیلیکون کنیم، امکان ایجاد نواحی نوع n وجود دارد. از آن رو که نواحی سیلیکون آلوده به این عناصر اکنون مقادیر مازادی از الکترون دارد، این نواحی به نوعی شارژ منفی (negative) خواهد شد. نام گذاری نوع n و حرف n در ترانزیستور های nMOS از اینجا ناشی می شود. از دیگر سو با افزودن مقادیری از عناصر گیرنده ی الکترون نظیر بور، ایندیوم و گالیوم به سیلیکون، نواحی نوع p ایجاد می شود که شارژ مثبت (Positive) خواهد شد و حرف p در نام نوع p و ترانزیستورهای pMOS از همین  رو است. برای افزودن این ناخالصی ها به ساختار سیلیکون، از فرایند های خاصی با نام کاشت یون و نفوذ (Diffusion) استفاده می شود که توضیح آن ها خارج از حوصله ی این مقاله است.

اکنون که امکان کنترل رسانایی الکتریکی نواحی خاصی از سیلیکون و تغییر بار الکتریکی آن ها وجود دارد، می توان خواص نواحی مختلف را برای ساخت ترانزیستور ها با یکدیگر ترکیب کرد. ترانزیستور هایی که در ساخت مدارهای مجتمع و پردازنده های کامپیوتری مورد استفاده قرار می گیرد، با نام MOSFET شناخته می شوند که مخفف عبارت Metal-Oxide-Semiconductor Field Effect Transistor است.

در ساخت مدارهای مجتمع و تراشه های کامپیوتری از ترانزیستورهای MOSFET استفاده می شود

هر ترانزیستور ماسفت (MOSFET) شامل ۴ کانکشن گیت (Gate)، منبع (Source)، دِرِین (Drain) و بدنه (Body) است که در آن گیت و بدنه با یک لایه ی اکسید عایق از یکدیگر جدا شده اند و منبع و دِرین از طریق یک کانال شارش الکترون با یکدیگر در ارتباط هستند. گیت از جنس پلی سیلیکون ساخته شده و رسانایی بالایی دارد. این بخش از ترانزیستور به منزله ی سوئیچی برای روشن و خاموش کردن ترانزیستور عمل می کند و ولتاژ متصل به آن میزان رسانایی دستگاه یا به عبارتی پهنای کانال انتقال الکترونی را تعیین می کند. در واقع ترانزیستور ماسفت برای آنکه کار کند، نیاز به برقراری ولتاژ در گیت دارد. جریان الکترونی در حال کنترل بین کانکشن های منبع و دِرین ترانزیستور جریان می یابد. در ترانزیستور نوع n (یا n-Channel MOSFET) معمولاً جریان وارد دِرین شده و از منبع خارج می شود؛ اما در یک ترانزیستور نوع p (یا p-Channel MOSFET) جریان وارد منبع شده و از دِرین خارج می شود.

جزئیات فنی نحوه ی کار ترانزیستور ها و روش تعامل نواحی مختلف کاری است که در مدارج عالی دانشگاهی به آن پرداخته می شود و ما در این مقاله فقط مبانی کار را بررسی خواهیم کرد. یک قیاس خوب برای بیان طرز کار ترانزیستور درنظرگرفتن یک پل متحرک در مسیر یک رودخانه است. الکترون ها به مثابه ی ماشین هایی در ترانزیستور هستند که مایل اند از یک سمت رودخانه به سمت دیگر جریان یابند که این دو سمت را می توان Source و Drain ترانزیستور دانست. در یک دستگاه nMOS برای نمونه، اگر گیت تحت ولتاژ نباشد و شارژ نشود، می توان تصور کرد که دهانه های پل متحرک مثال ما بالا رفته است و امکان انتقال الکترون ها از طریق کانال وجود ندارد. وقتی دهانه های پل متحرک خود را پایین بیاوریم و گیت را به ولتاژ متصل کنیم، معبر رودخانه باز می شود و الکترون ها امکان حرکت آزادانه ازطریق کانال منفی (نوع n) ترانزیستور را می یابند. این همان اتفاقی است که واقعاً در یک ترانزیستور می افتد. با اتصال گیت به ولتاژ و شارژشدن آن، کانالی میان منبع و درین ترانزیستور ایجاد می شود که امکان شارشِ جریانی از الکترون ها یا حفره های الکترونی را می دهد.

بنابراین برای ساخت یک تراشه ی واقعی باید بتوان به روشی، مناطقی با میزان رسانایی متفاوت با ایجاد تراکم الکترون (n) یا حفره های الکترونی (p) درست کرد. برای آنکه امکان کنترل دقیق محل قرارگیری نواحی p و n فراهم شود، تراشه سازانی مثل اینتل و TSMC از فرایندی با نام فوتولیتوگرافی استفاده می کنند. فوتولیتوگرافی فرایند چندمرحله ای به شدت پیچیده ای است و شرکت های بزرگ مثل اینتل و TSMC میلیاردها دلار برای بهبود و ارتقای این فرایند هزینه می کنند تا ترانزیستور هایی ظریف تر، سریع تر و با بهره وری انرژی بیشتر تولید کنند. چاپگر بسیار دقیقی را تصور کنید که بتواند الگوهای پیچیده ی مدارهای منطقی را با دقت باورنکردنی در اعماق سیلیکون حک کند.

فرایند ساخت ترانزیستورها در یک تراشه با یک ویفر سیلیکونی خالص گرد آغاز می شود. پیش از این در مورد میزان خلوص سیلیکون مورد نیاز برای ساخت MOSFETها صحبت کردیم. این ویفر در کوره ای حرارت داده می شود تا لایه ی نازکی از سیلیکون دی اکسید (SiO2) رویه ی ویفر را بپوشاند. در مرحله ی بعد یک لایه پلیمری فوتورزیست حساس به نور روی سطح سیلیکون دی اکسید کشیده می شود. با تاباندن نوری با طول موج های معین بر لایه ی فتورزیست و با روشی به نام ماسک نوری، امکان حذف گزینشی لایه ی فتورزیست در نواحی معین برای نفوذ دادن عناصر ناخالصی فراهم می شود. این همان مرحله ی لیتوگرافی است و روش انجام آن شبیه به کار چاپگری است که پودر یا جوهر را در نقاط مشخصی از کاغذ می پاشد؛ هرچند این بار ترسیم ترانزیستورها در ابعادی بسیار کوچکتر صورت می پذیرد.

در مرحله ی بعد ویفر سیلیکون با اسید هیدروفلوریک حکاکی (Etch) می شود تا مقطع سیلیکون دی اکسید را در محلی که لایه ی فوتورزیست پاک شده، حل کند. سپس لایه ی فتورزیست به طور کامل حذف می شود. اکنون عناصر دوپینگ به درون ویفر نفوذ داده می شوند و این عناصر با مقادیر کنترل شده تنها در مناطقی نفوذ می کنند که پیش تر شکاف هایی در لایه ی اکسید ایجاد شده است.

فرایند ماسک نوری، تصویر کردن و دوپینگ بارها و بارها تکرار می شود و هر سطح مشخصه ای در یک نیمه هادی به آرامی ساخته می شود. سر انجام پس از تشکیل سطح سیلیکون مبنا، کانکشن های فلزی از بالا برای برقراری ارتباط میان ترانزیستور ها ساخته می شود که در مورد این کانکشن ها و لایه های فلزی در ادامه ی مقاله بیشتر توضیح خواهیم داد.

مسلم است که تراشه سازان از این فرایند برای ایجاد یک ترانزیستور در هر مرتبه تابش استفاده نمی کنند. پس از طراحی یک تراشه ی جدید، شرکت های تراشه ساز ماسک هایی را برای هر مرحله از فرایند تولید تدارک می بینند. این ماسک ها هر یک حاوی محل تصویر میلیاردها ترانزیستور در یک تراشه تنها در یک مرحله تابش است. تراشه های متعددی در کنار یکدیگر روی بستر واحد ویفر تحت تابش قرار گرفته و در یک مرحله تولید می شوند.

به محض تکمیل فرایند فوتولیتوگرافی ویفر، تراشه های مجزا برش خورده و پکیج شده و در نهایت پکیج های پردازنده آماده ی عرضه به بازار می شود. بسته به اندازه ی Die پردازنده، هر ویفر ممکن است در برگیرنده ی صدها تراشه باشد. عموما هرچه تراشه های تولید شده قدرتمندتر باشند، سطح مقطع Die بزرگتری دارند و سازنده تعداد تراشه های کمتری را از یک ویفر استخراج می کند.

تصور اینکه بتوان تراشه هایی حجیم که هم بسیار قدرتمند بوده و هم حاوی صدها هسته باشد، تولید کرد؛ اگرچه آسان است، ولی در عمل چنین کاری ممکن نیست. در حال حاضر بزرگ ترین عاملی که مانع از ساختن تراشه های بزرگ و بزرگتر می شود، عیوب و نواقص ساختاری است که در خلال فرایندهای ساخت در سیلیکون ایجاد می شود. طرح های مدرن در برگیرنده ی میلیاردها ترانزیستور است و اگر تنها بخشی از یک ترانزیستور تخریب شود، ممکن است کل تراشه غیر قابل مصرف گردد. با بزرگتر شدن اندازه ی پردازنده ها، احتمال ایجاد ساختارهای معیوب در سیلیکون نیز بیشتر می شود.

بهره ی واقعی که شرکت ها از فرآیندهای ساخت سیلیکون برمی گیرند، معمولاً در صندوقچه ی اسرار تراشه سازان باقی می ماند، اما بهره ی ۷۰ تا ۹۰ درصد در این مورد تخمین خوبی به نظر می رسد. فرا مهندسی تراشه ها با منابع بیشتر، عملی رایج در میان تراشه سازان است، چرا که آن ها می دانند بخشی از اجزا ممکن است در تراشه ی نهایی به درستی کار نکند. برای مثال اینتل ممکن است تراشه ای هشت هسته ای را طراحی کند، اما محصول نهایی را در قالب تراشه ای شش هسته ای به فروش برساند، چرا که آن ها احتمال می دهند یکی دو هسته طی فرآیندهای ساخت از میان رفته باشد. تراشه هایی که در انتها، میزان عیوب آن ها آشکارا کمتر از دیگر تراشه ها است، جداسازی شده و با قیمت های بالاتری به فروش می رسند؛ این فرایند دستچین کردن یا Bining نام دارد.

یکی از مهم ترین مفاهیم در بازاریابی آمیخته با ساخت تراشه عبارتِ «اندازه ی مشخصه» یا Feature Size است. برای مثال اینتل در حال کار روی فرایند ساخت ۱۰ نانومتری است و AMD توسعه فناوری ۷ نانومتری خود را در دست اقدام دارد و شرکت تایوانی TSMC کار روی فرایند ۵ نانومتری را کلید زده است. اما معنی این اعداد و ارقام چیست؟ آیا کوچکتر بودن این اعداد نشان از فناوری ساخت پیشرفته تری دارد؟ از چشم اندازی تاریخی، اندازه مشخصه ی بیانگر حداقل فاصله میان دِرِین و منبع یک ترانزیستور است. با پیشرفت تکنولوژی ترانزیستور ها فشرده تر و ظریف تر شدند و امکان گنجاندن تعداد بسیار بیشتری از آن ها در یک تراشه فراهم شد. هرچه ترانزیستور ها کوچکتر شدند، به سرعت های سوییچ بالاتری نیز دست یافتند. امروزه رقم چند میلیارد ترانزیستور در پردازنده های پیشرفته ی بازار سخت افزار، شگفتی آور نیست.

باید دانست که برخی از شرکت ها ممکن است بُعد و اندازه ی دیگری را سوای فاصله ی استاندارد یا دشده، مبنای نام گذاری فناوری ساخت خاص خود کرده باشند و برای همین فناوری های ساخت شرکت های مختلف، به راحتی بر یکدیگر انطباق پذیر نیست. ممکن است دو فرایند ناهم اندازه از دو شرکت مختلف، مثلاً فناوری ۱۰ نانومتری اینتل و ۷ نانومتری AMD، در پایان سبب تولید ترانزیستور هایی با اندازه و ابعاد یکسان شود. از دیگر سو همه ی ترانزیستورها در یک فرایند ساخت معین هم اندازه نیستند. طراحان ممکن است براساس داد و ستد های مهندسی، برخی از ترانزیستور ها را با ابعادی بزرگتر از دیگران بسازند. در یک فرایند طراحی معین، یک ترانزیستور کوچکتر سریع تر نیز خواهد بود، چرا که شارژ و دشارژ گیت آن زمان کمتری می برد. با این حال، ترانزیستور های کوچکتر تنها تعداد بسیار کمی از خروجی ها را به دست می دهند. چنانچه بخش معینی از مدار منطقی، نظیر یک پین خروجی برای انجام کاری در نظر گرفته شود که نیازمند اعمال توان بالایی است، ترانزیستورهای آن قسمت را باید بزرگتر ساخت. ترانزیستور های خروجی ممکن است بارها بزرگتر از ترانزیستورهای مدارهای منطقی داخلی، پیش بینی شده و ساخته شوند.

شبکه ی پیچیده ای از لایه های فلزی متعدد با تقاطع های بسیار امکان برقراری ارتباط میان تمامی ترانزیستورها را فراهم می کنند

طراحی و ساخت ترانزیستور ها تنها نیمی از مسیر ساخت یک تراشه را می پیماید. سیم ها یا اتصالات فلزی باید اجزای مختلف را بر طبق شماتیک به یکدیگر متصل کند. این اتصالات با استفاده از جایگذاری لایه های فلزی روی ترانزیستورها در تراشه گنجانده می شود. بزرگراه چندطبقه ای را تصور کنید که ارتباط میان طبقات با شیب های ورودی و خروجی برقرار شده، راه های مختلف به صورت متقاطع از درون یکدیگر عبور می کنند. این دقیقا همان اتفاقی است که درون یک تراشه و در ابعادی بسیار کوچکتر می افتد. فرایند های مختلف تعداد لایه های اتصال درونی متفاوتی را روی ترانزیستورها ایجاد می کند. هرچه ترانزیستور ها کوچکتر شوند، با ایجاد لایه های فلزی بیشتر سعی می شود راه برای عبور تمامی سیگنال ها گشوده باشد. گزارش ها حاکی از آن است که فناوری ساخت ۵ نانومتری پیش روی TSMC دربرگیرنده ۱۵ لایه ی فلزی است. یک بزرگراه عمودی ۱۵ طبقه را تصور کنید که جاده های آن با یکدیگر در ارتباط است و تمام تقاطع های ناهمسطح را در چنین شبکه ای در نظر بگیرید؛ در این صورت تصوری تقریبی از شبکه ی اتصالات فلزی در یک تراشه برای برقراری ارتباط میان اجزای سازنده ی آن به دست خواهید آورد.

این ساختار شبکه ای متشکل از ۷ لایه ی فلزی را نشان می دهد. هر یک از لایه ها مسطح است و هرچه بالاتر رویم، لایه ها ضخیم تر می شوند تا از میزان مقاومت بکاهند. مابین لایه ها استوانه های فلزی کوچکی با نام Via تعبیه می شود که کاربرد آن جهش از لایه ای به لایه ی دیگر است. هر لایه ی فلزی معمولاً نسبت به لایه ی زیرین مسیر متفاوتی را دنبال می کند تا از ایجاد ظرفیت های خازنی ناخواسته تا حد امکان پرهیز شود. این امکان وجود دارد که لایه های فلزی فرد برای ایجاد اتصالات افقی به کار رود و از لایه های فلزی زوج برای ساخت اتصالات عمودی استفاده شود.

رشته های فلزی برای ایجاد ارتباط میان ترانزیستورها در چندین لایه طراحی و ساخته می شوند، استوانه  های کوچک عمودی Viaهایی هستند که کاربردشان جهش از لایه ای به لایه ی دیگر است

همان گونه که می توان تصور کرد، پیاده سازی تمامی این معابر سیگنال و لایه های فلزی آن هم با سرعتی سرسام آور بسیار دشوار است. برای غلبه بر این مشکل، برنامه های کامپیوتری خاصی طراحی شده است تا به طور خودکار ترانزیستور ها را در اعماق تراشه جایگذاری و مسیریابی کند. بسته به پیچیدگی یک طراحی، برنامه ها حتی می توانند توابعی را که با کدهای سطح بالای C نوشته شده، در قالب مکان های فیزیکی جز به جز رشته های اتصال و ترانزیستورها ترجمه و اعمال کنند. معمولاً تراشه سازان به کامپیوترها اجازه می دهند عمده طراحی را به صورت خودکار درون تراشه تصویر کنند. سپس عامل انسانی طراحی پیاده سازی شده را به دقت زیر نظر گرفته، بخش های بحرانی را به صورت دستی تنظیم و بهینه سازی می کند.

تراشه سازان برای ساخت یک تراشه ی جدید، کار طراحی را با سلول های استانداردی آغاز می کنند که شرکت های ریخته گر نیمه هادی در اختیار آن ها می گذارند. برای مثال، اینتل و TSMC طرح اجزای زیربنایی نظیر گیت های منطقی یا سلول های حافظه را در اختیار طراحان می گذارند. طراحان این سلول های استاندارد را با یکدیگر ترکیب می کنند تا در انتها طرحی کامل از تراشه ای که قرار است ساخته شود، به دست آید. در مرحله ی بعد آن ها طرح خود را به کارخانه ی ریخته گر می فرستد، جایی که در آن سیلیکون خام تبدیل به تراشه های عملیاتی می شود. این طرح در برگیرنده ی جانمایی ترانزیستورها و لایه های اتصال فلزی است. این جانمایی ها در ماسک های نوری که در مورد آن صحبت کردیم، تصویر شده و از این ماسک ها در فرایند فوتولیتوگرافی استفاده می شود.

با ترکیب چندین گیت منطقی از این نوع، یک واحد حسابی یک بیتی مبنا به دست می آید. این طراحی امکان جمع، تفریق و اعمال منطقی را روی ۲ ورودی یک بیتی دارد. سیم های آبی  کمرنگ  هاشورخورده به حالت عمودی، بخش هایی از لایه ی فلزی ۳ هستند. مربع های بزرگتر در دو انتهای این سیم ها، Viaهایی است که دو لایه را به یکدیگر متصل می کند.

در آخرین مرحله، با قراردادن بسیاری از این سلول ها و در حدود ۲۰۰۰ ترانزیستور در کنار یکدیگر، به ساختار یک پردازنده ی چهاربیتی مبنا می رسیم که با ۸ بایت رم روی چهار لایه ی فلزی همراه شده است. با نگاهی به پیچیدگی ساختار پردازنده ای به این سادگی، شاید بتوان تصوری از دشواری طراحی یک پردازنده ی ۶۴ بیتی با چند مگابایت حافظه ی کش، هسته های متعدد و بیش از ۲۰ مرحله پایپ لاین داشت. با این فرض که پردازنده های امروزی ۵ تا ۱۰ میلیارد ترانزیستور و ده ها لایه ی فلزی را در خود جای داده اند.

با همه ی آنچه گفته شد، شاید اکنون بینش بهتری از پیچیدگی پردازنده ی جدید خود و علت مبالغ نسبتاً بالایی که برای این قطعه ی فناورانه می پردازید، به دست آورده باشید. همچنین علت وقفه های طولانی مدت شرکت هایی نظیر اینتل و AMD در معرفی و عرضه ی محصولاتی جدیدتر و قدرتمندتر را بهتر درک خواهید کرد. ۳ تا ۵ سال زمان می برد تا یک تراشه از میز طراحی روانه ی قفسه های فروشگاه ها شود. به عبارتی پردازنده های توانای امروزی حاصل سال ها پیشبرد گام به گام فناوری و تجربه اندوزی است و لذا ما نمی توانیم مدت زیادی یک تراشه را حتی با فناوری ساخت پیشتاز امروزی خود، همچنان در بالاترین جایگاه ها تصور کنیم.

خط مشی های فعلی و آینده  در معماری پردازنده ها

با وجود پیشرفت های ادامه دار و ارتقای تدریجی هر نسل از پردازنده های جدید یک تراشه ساز، پردازنده ها برای مدت های طولانی هیچ پیشرفت صنعتی چشمگیری به خود ندیده اند. تبدیل تیوب های وکیوم به ترانزیستورها یک پیشرفت بزرگ بود؛ به همین شکل حرکت از اجزای جداگانه به سوی مدارهای مجتمع گامی بلند به شمار می رفت. اما از آن زمان، حرکت های و پیشرفت های مشابهی با این ابعاد دیگر در دنیای پردازنده ها دیده نشده است. درست است که ترانزیستورها کوچکتر شده اند، سرعت تراشه های کامپیوتری بیشتر شده و سطح عملکرد صدها برابر افزایش یافته، اما در عین حال شاهد کندی ها و عقب گردهایی آشکار در روند ساخت تراشه ها نیز هستیم.

براساس قانون مور تعداد ترانزیستورهای پردازنده های کامپیوتری هر ۱۸ ماه یک بار دو برابر می شوند

از آنجایی که شرکت های تراشه ساز اطلاعات چندانی از پژوهش های فعلی و جزئیات فناوری های کنونی خود ارائه نمی دهند، داشتن درکی دقیق از آنچه درون یک پردازنده می گذرد، دشوار است. اما می توان با نگاهی به روند مطالعات کنونی در این صنعت، به درکی از چشم انداز و دورنمای ساخت تراشه ها در دنیای کامپیوتر دست یافت.

یکی از گزاره های مشهور صنعت ساخت پردازنده قانون مور است. این قانون می گوید، تعداد ترانزیستورهای گنجانده شده در پردازنده ها، تقریباً هر ۱۸ ماه یک بار دو برابر می شود. اگرچه این قانون برای مدت های طولانی پابرجا بود، اما اکنون مدتی است که با فرود و فراز هایی رو به رو شده است. با هرچه کوچکتر شدن ترانزیستورها، به مرز و محدوده هایی نزدیک می شویم که قوانین فیزیک دیگر امکان گذر از آن را فراهم نمی کند. بدون یک فناوری جدید تکان دهنده در صنعت ساخت تراشه، باید به فکر راه های جدیدی برای تسریع عملکرد پردازنده ها در مسیر آینده باشیم.

روند پیشروی نسل به نسل تراشه ها در خلال ۱۲۰ سال گذشته،۷ نقطه آخر در این نمودار مربوط به پردازنده های گرافیکی انویدیا است

یکی از راهکارهایی که شرکت های تراشه ساز برای تداوم روند پیشرفت های خود و بهبود سطح عملکرد برگزیده اند، افزایش شمار هسته های یک پردازنده به جای ارتقای فرکانس است. به همین دلیل به جای آنکه شاهد تراشه های دو هسته ای با فرکانس ده گیگاهرتز باشیم، تراشه های ۸ یا ۱۰ هسته ای با فرکانس های بسیار کمتر را در بازار می بینیم. در یک کلام می توان گفت، پردازنده های امروزی به جز در بخش افزایش تعداد هسته ها، جای پیشرفت چندانی ندارند.

رویکرد نسبتاً جدید دیگری که در دنیای پردازنده ها دیده می شود، استفاده از چیپلت های متعدد روی یک لایه ی اینترپوزر است. چیپلت بلوک مجزایی از مدارهای مجتمع است که بخشی از یک تراشه  ی چند چیپلتی را می سازد. تراشه سازانی مانند AMD در پردازنده های رایزن به جای ساخت تراشه هایی با مقطع پهناور و شامل هسته های متعدد، منابع ترانزیستور موجود در یک تراشه را میان چندین چیپلت توزیع می کنند. پیش از این دانستیم که ساخت تراشه  ای گسترده با هسته های متعدد احتمال ایجاد عیوب ساختاری و ناکارآمد شدن یک تراشه را زیاد می کند. برخی از این چیپلت ها محاسباتی هستند که دربرگیرنده ی هسته ها و تردها و سطوح مختلف حافظه ی کش هستند. این چیپلت های محاسباتی معمولا با چگالی ترانزیستور بالاتر و فناوری ساخت پیشرفته تری تولید می شوند. AMD چیپلت های محاسباتی نسل سوم رایزن را با فناوری ساخت ۷ نانومتری می سازد. در این میان چیپلتی نیز برای قرارگیری منابع ارتباطی پردازنده با دنیای بیرون نظیر کنترلرها، کانال های ورودی/خروجی و مسیرهای ارتباطی PCIe به طور مجزا ساخته  می شود. این چیپلت معمولاً با فناوری ساخت ارزان تر و بزرگتری (مثلاً ۱۴ نانومتری) ساخته می شوند. ساخت پردازنده های چند چیپلتی راهکار تراشه سازان برای غلبه بر محدودیت هایی است که تبعیت از قانون مور تحمیل می کند. در پردازنده های رایزن ارتباط میان چیپلت های محاسباتی و چیپلت ورودی/خروجی از طریق لینک های Infinity Fabrics برقرار می شود. لایه ی اینترپوزر اگرچه چگالی کمتری نسبت به چیپلت ها دارد، اما بستر مناسبی برای صدها مسیر و معبر اتصال و برهمکنش میان اجزای پردازنده است. شرکت هایی مانند AMD با فناوری پردازنده های چندچیپلتی و اینتل با فناوری تجمیع تراشه ی سه بعدی Foveros می کوشند تا با روش هایی ابتکاری همچنان در مرزهای قانون مور حرکت کنند.

یکی از بخش هایی که چشم انداز خوبی در آینده برای آن متصور است، پردازش کوانتومی است. پردازش کوانتومی یک فناوری نوپا است و کارشناسان متبحر زیادی هنوز برای گسترش مرزهای آن در جهان تربیت نشده است. برخلاف افسانه هایی که در مورد این فناوری مطرح است، پردازش کوانتومی چیزی نیست که شما را قادر به رندر صحنه های یک بازی با سرعت ۱۰۰۰ فریم بر ثانیه کند. در حال حاضر مزیت اصلی کامپیوترهای کوانتومی، امکان اجرای الگوریتم های پیچیده تری است که در گذشته ناممکن بوده است.

در یک کامپیوتر معمولی، روشن و خاموش بودن یک ترانزیستور، معادل یکی از دو داده ی اساسی ۰ و ۱ است. اما در یک کامپیوتر کوانتومی با مفهوم Superposition رو به رو هستیم، به این معنا که یک بیت هم زمان می تواند مقدار صفر و یک را اختیار کند. با این ویژگی جدید، دانشمندان علوم کامپیوتر می توانند روش های محاسبه جدیدی را توسعه دهند و مسائلی را حل کنند که در حال حاضر قابلیت های محاسباتی کافی برای حل آن نداریم. به عبارت دیگر، کامپیوترهای کوانتومی حتی ممکن است چندان سریع تر از کامپیوترهای امروزی نباشند؛  اما این کامپیوترها در برگیرنده ی مدل های محاسباتی جدیدی هستند که امکان حل انواع مختلفی از مسائل را فراهم می کنند.

این فناوری هنوز تا رسیدن به خانه ها و فراگیرشدن راه درازی در پیش دارد؛ بنابراین ما در این مقاله بیشتر به دنبال شناخت روندهایی هستیم که پردازنده های دنیای واقعی را در مسیر آینده بهبود می بخشد. اگرچه امروزه ده ها پرونده ی تحقیقاتی فعال در این زمینه گشوده شده است؛ اما ما در این مقاله به بررسی بخشی از این روند های پژوهشی خواهیم پرداخت که بیشترین تأثیر ها را از خود برجای می نهد.

روند در حال رشدی که ما تا به امروز تأثیر زیادی از آن پذیرفته ایم، مفهومی با نام پردازش نامتجانس است. با این روش، چندین المان محاسباتی مختلف در یک سیستم واحد گرد هم آمده، روند پردازش را بهبود می بخشد. بسیاری از ما با داشتن یک پردازنده گرافیکی (GPU) مجتمع در سیستم خود از مزایای پردازش نامتجانس بهره مند شده ایم. CPU قطعه ای با قابلیت سفارشی سازی بالا است و می تواند گستره وسیعی از محاسبات را با سرعت منطقی اجرا کند. از سوی دیگر GPU به طور اختصاصی برای اجرای محاسبات گرافیکی نظیر ضرب ماتریسی توسعه یافته است. این قطعه ی سخت افزاری در انجام این کار بسیار توانا است و چنین محاسباتی را بار ها سریع تر از CPU انجام می دهد. با برداشتن بار اجرای محاسبات گرافیکی از دوش CPU و گذاردن آن به عهده ی GPU، روند اجرای بارهای کاری تسریع می شود. برای برنامه نویسان ارتقای نرم افزار با بهینه سازی الگوریتم ها ساده است، اما بهبود کار قطعات سخت افزاری کاری بسیار پیچیده تر است.

پردازنده های گرافیکی تنها حوزه ای نیست که در آن از شتاب دهنده ها برای پردازش دستورالعمل های خاص استفاده می شود. بیشتر گوشی های هوشمند امروزی دربرگیرنده ی ده ها شتاب دهنده ی سخت افزاری هستند که اجرای وظایف انحصاری و ویژه را تسریع می کنند. این سبک پردازش را دریای شتاب دهنده ها می نامند و مثال هایی از آن شامل پردازنده های رمزنگاری، پردازنده های تصویر، شتاب دهنده های یادگیری ماشین، دیکودرها و انکودرهای ویدئو، پردازنده های بیومتریک و موارد دیگر است.

با تخصصی شدن بیش از پیش بار های کاری، طراحان سخت افزار شتاب دهنده های بیشتر و بیشتری را در تراشه های خود می گنجانند. تأمین کنندگان سرویس های پردازش ابری نظیر AWS شروع به تأمین کارت های FPGA برای توسعه دهندگان کرده اند تا بارهای کاری مطلوب آن ها را در فضای ابری سریع تر به پیش ببرند. در حالی که المان های پردازش رایج نظیر CPU و GPU معماری داخلی ثابتی دارند، FPGA دارای معماری دستورالعمل منعطفی است. این قطعه ی سخت افزاری قابل برنامه ریزی را می توان به نحوی پیکربندی کرد که منطبق بر نیازهای پردازشی کاربران باشد.

اگر کاربر خواستار قابلیت تشخیص تصاویر باشد، امکان پیاده سازی الگوریتم های متناظر در این قطعه سخت افزاری وجود دارد. اگر کاربری بخواهد طرز کار یک قطعه سخت افزاری جدید را پیش از ساخت شبیه سازی کرده و بیازماید، امکان اجرای این آزمایش با FPGA وجود دارد. FPGA سطح عملکرد و بهره وری توانی بیشتری در مقایسه با پردازنده های گرافیکی ارائه می دهد، اما در این زمینه به پای مدارهای مجتمع اپلیکیشن محور یا ASICها نمی رسد. شرکت هایی نظیر گوگل و انویدیا  ASICهای یادگیری ماشین اختصاصی خود را برای تسریع روند تشخیص و تحلیل تصاویر توسعه داده اند.

با نگاهی به تصاویر Die برخی از پردازنده های نسبتاً جدید، می توان دریافت که بیشتر سطح مقطع یک پردازنده را بخش های دیگری به جز هسته ها اشغال کرده است. میزان فزاینده ای از این مقطع با شتاب دهنده های مختلف پر شده است. با این کار بسیاری از بارهای کاری ویژه با سرعت بیشتری عملیاتی شده و به علاوه تا حد زیادی در توان مصرفی صرفه جویی خواهد شد.

از گذشته تا به حال، تراشه های مخصوصی برای پردازش محتوای ویدئویی به کمک پردازنده ها آمده است. اما این روش به هیچ عنوان بازدهی کافی ندارد؛ چرا که هر بار سیگنال متناظری باید از تراشه اصلی خارج شده و از طریق سیم های فیزیکی روانه ی تراشه دیگری شود و نتیجه پردازش دوباره به پردازنده بازگردد. با چنین فرآیندی میزان مصرف انرژی به ازای هر بیت داده به شدت افزایش می یابد. اگر المان پردازش مورد نظر درون تراشه ی پردازنده ی اصلی گنجانده شده باشد، برای ایجاد ارتباط با این المان در یک تراشه ی واحد، ۳ تا ۴ برابر بهره وری توانی بهتری در مقایسه با روش قبلی خواهیم داشت. با یکپارچه سازی چنین شتاب دهنده هایی در پردازنده ی اصلی، شاهد رشد فزاینده ی تراشه هایی با مصرف توان بسیار ناچیز در سال های اخیر بوده ایم.

اما مشکل دیگری وجود دارد و این است که شتاب دهنده ها خود بخش های کامل و بی عیب و نقصی نیستند. هرچه تعداد بیشتری از آن ها را به طراحی خود اضافه کنیم، از انعطاف پذیری تراشه ها کاسته شده و به بهای دستیابی به حداکثر کارایی در بارهای کاری ویژه، سطح عملکرد کلی تراشه افت می کند. در چنین حالتی، تمامی تراشه تبدیل به گردایه ای از شتاب دهنده ها می شود و دیگر با یک پردازنده ی سودمند رو به رو نیستیم. داد و ستد های مهندسی بین سطح عملکرد در حالات ویژه و سطح عملکرد عمومی یک تراشه همواره باید به خوبی تنظیم و تعدیل شود. به این عدم تطابق میان سخت افزار تعمیم یافته و بارهای کاری ویژه، شکاف ویژه کاری (Specialization Gap) اطلاق می شود.

اگرچه عده ای تصور می کنند ما به بالاترین سطوح امواج یادگیری ماشین و پردازنده های گرافیکی دست یافته ایم، می توان همچنان انتظار داشت که سهم بیشتری از محاسبات برای اجرا به شتاب دهنده های ویژه کار محول شود. با رشد روز افزون محاسبات ابری و هوش مصنوعی، به نظر می رسد که پردازنده های گرافیکی تاکنون بهترین راه حل برای نیل به ظرفیت های عظیم محاسبات داده ی مورد نیاز است.

حوزه ی دیگری که طراحان در پی استخراج سطح عملکرد بالاتری از آن هستند، حوزه ی حافظه است. از گذشته تا به حال سرعت خواندن و نوشتن حافظه بزرگ ترین گلوگاه برای پردازنده ها بوده است. اگرچه حافظه های بزرگ و سریع کش راهگشا هستند، اما همچنان خواندن اطلاعات از رم یا درایو SSD ده ها هزار سیکل کلاک به طول می انجامد. به همین دلیل، مهندسان غالباً فرایند دسترسی به حافظه را کاری پر هزینه تر نسبت به انجام محاسبات واقعی در پردازنده ها می دانند. اگر پردازنده به دنبال جمع دو مقدار عددی با یکدیگر باشد، ابتدا باید آدرس هایی از حافظه را که اعداد در آن ذخیره شده اند، محاسبه کرده و دریابد در کدام سطح از سلسله مراتب حافظه این داده ها قرار گرفته اند، داده های موجود در ثبات ها را بخواند، محاسبه ی مورد نظر را اجرا کند، آدرس مقصد را محاسبه کرده و پاسخ عملیات را در هر جایی که به آن نیاز است، بنویسد. این فرایند چندمرحله ای برای دستورالعمل هایی که اجرای آن ها یک تا دو سیکل طول می کشد، بسیار ناکارآمد است.

ایده ی نوآورانه ای که حجم زیادی از پژوهش ها را به خود اختصاص داده، تکنیکی با نام انجام محاسبه در مجاورت حافظه (Near Memory Computing) است. در این روش به جای واکشی بیت های محدود داده از حافظه و رساندن آن به پردازنده برای انجام محاسبه، واحد های پردازش کوچکی مستقیماً درون کنترلرهای حافظه ی رم یا SSD تعبیه می شود. انجام محاسبات سبک تر در محلی نزدیک به حافظه، پتانسیل صرفه جویی زیادی در انرژی و زمان ایجاد می کند؛ چرا که نیازی به انتقال هرباره و همیشگی داده ها نیست. از آنجایی که کنترلر درست در کنار تراشه های حافظه قرار دارد، واحد های پردازش یادشده دسترسی مستقیم به داده های مورد نیاز خود دارند. اگرچه این ایده هنوز به مرحله ی بلوغ و پختگی نرسیده است، نتایج حاصل از آن به نظر نویدبخش می رسد.

یکی از دشواری های محاسبه در مجاورت حافظه که باید بر آن غلبه شود، محدودیت هایی است که در فناوری ساخت وجود دارد. پیش از این گفتیم که فرایند ساخت سیلیکون کاری بسیار پیچیده با ده ها مرحله است. پردازنده ها از ابتدا به نحوی طراحی می شوند که دربرگیرنده ی المان های منطقی سریع یا شامل المان های ذخیره سازی فشرده باشند. اگر بخواهیم تراشه ی حافظه ای با فرایند ساخت پردازش محور تولید کنیم، با چالش چگالی ناکافی در تراشه رو به رو هستیم. حال اگر بخواهیم پردازنده ای با فرایند ساخت مختص ذخیره سازی تولید کنیم، نتیجه ی کار سطح عملکرد و تایمینگ بسیار ضعیف خواهد بود.

تکنیک تجمیع سه بعدی ترانزیستورها راهی برای ساخت تراشه های حافظه ی بسیار سریع با امکان انجام محاسبه در نزدیکی حافظه است

یک راه حل بالقوه برای غلبه بر این مشکل، تکنیکی با نام تجمیع سه بعدی است. پردازنده های رایج از یک لایه ترانزیستور بسیار گسترده برخوردار هستند، اما این طراحی محدودیت های خود را دارد. همان طور که نام این تکنیک ایجاب می کند، تجمیع سه بعدی عبارت است از انباشت چندین لایه ترانزیستور روی یکدیگر با هدف بهبود چگالی ترانزیستورها و کاهش تأخیر. در این شیوه از ستون هایی عمودی که طی فرآیندهای متفاوتی ساخته می شوند، برای ایجاد ارتباط میان لایه ها استفاده می شود. اگرچه این پیشنهاد دیر زمانی است که مطرح شده؛ در ابتدا صنعت بنا به مشکلات عمده ای که در راه اجرای آن وجود داشت، چندان از آن استقبال نکرد؛ اما به تازگی شاهد درخشش فناوری ذخیره سازی 3D NAND و بازگشایی پرونده های مطالعاتی در این زمینه هستیم.

علاوه بر تغییراتی که در فیزیک و معماری تراشه ها در سال های گذشته صورت پذیرفته، خط مشی دیگری که کل صنعت ساخت نیمه هادی را متاثر ساخته، مقوله ی امنیت است. تا همین اواخر هم بحث امنیت پردازنده ها چندان در کانون توجه قرار نداشت. تحکیم امنیتی، جوششی از این واقعیت است که در دنیای کامپیوترها باید امنیت بیشتری داشته باشیم. در دنیای پردازنده ها این واقعیت گریبان گیر شرکت های تراشه ساز، به ویژه اینتل شده است.

حفره های اسپکتر و ملت داون شاید معروف ترین مثال هایی باشد که به ما نشان می دهد، هر اقدامی برای افزایش سرعت کار پردازنده، بدون درنظرگرفتن منافذ امنیتی آن ممکن است عواقب ناخوشایندی داشته باشد. در حال حاضر پردازنده های مدرن تأکید بسیار بیشتری بر مبحث امنیت دارند و امنیت یکی از حلقه های اصلی طراحی تراشه ها است. افزایش میزان امنیت پردازنده ها ممکن است سطوح عملکرد را تا حدی متاثر سازد، اما با درنظرگرفتن آسیب هایی که حفره های امنیتی می تواند به بار آورد، بهتر است به همان اندازه ای که به کارایی یک تراشه اهمیت می دهیم، بر امنیت آن نیز متمرکز شویم.

خلاصه ای از آنچه در این دو مقاله خواندیم

در مجموع این دو مقاله سعی کردیم درکی مستحکم و پایدار از شیوه های طراحی و ساخت پردازنده ها در ذهن خوانندگان گرامی ایجاد کنیم. بحث را با شناخت روش اجرای دستورالعمل ها در یک پردازنده شروع کردیم و با معماری های مجموعه دستورالعمل آشنا شدیم. دیدیم که چگونه یک پردازنده قادر است در هر سیکل کلاک دستورالعمل های متعدد را در مراحل مختلف پایپ لاین به جریان اندازد. پس از آن با اصلی ترین مفاهیم پردازنده شامل ترانزیستورها، گیت های منطقی، سیگنال کلاک و واحدهای عملیاتی شامل هسته ها، تردها، حافظه ی کش و پیش بینی گر انشعاب آشنا شدیم و طرز کار هر یک را به ساده ترین شکل ممکن تبیین کردیم. سلسله مراتب حافظه و نحوه ی تعامل پردازنده با حافظه ی سیستم را توضیح دادیم و سپس به سراغ روش طراحی پردازنده ها رفتیم. در مرحله بعد با فرایندهای تبدیل طراحی ها به تراشه های فیزیکی و فوتولیتوگرافیِ قطعات سیلیکونی آشنا شدیم و سر انجام در مورد خط مشی حال و آینده ی پردازش و زمینه های مطالعاتی گسترده ی آن صحبت کردیم.

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد.

5 − دو =

لطفا پاسخ عبارت امنیتی را در کادر بنویسید. *