خط لوله کلاسیک

در تاریخ سخت‌افزار رایانه ، برخی از واحدهای پردازش مرکزی رایه (RISC CPU) مجموعه دستورالعمل‌های اولیه کاهش‌یافته از راه‌حل هایی با ساختاری مشابه استفاده می‌کردند که اکنون خط لوله RISC کلاسیک نامیده می‌شود. این CPUها عبارتند از: MIPS ، SPARC ، Motorola 88000 و در national CPU DLX  که برای آموزش اختراع شد .

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

واکشی دستورالعمل 
عملیات ها در حافظه هستند که خودن آن ها یک چرخه طول می کشد. این حافظه را می تو به SRAM یا یک کش عملیات در نظر گرفت. اصطلاح "تاخیر" اغلب در علوم کامپیوتر استفاده می شود و به معنای زمانی است که یک عملیات شروع می شود تا زمانی که آن عملیات کامل شود. بنابراین، عملیات واکشی دارای تأخیر یک سیکل ساعت است (در صورت استفاده از SRAM تک چرخه یا اگر دستورالعمل در حافظه ی کش بود). بنابراین، در مرحله واکشی دستورالعمل ، یک دستورالعمل 32 بیتی از حافظه دستورالعمل واکشی می شود.

شمارنده برنامه یا PC یک رجیستر است که آدرسی را که به حافظه دستورالعمل ارائه می شود نگه می دارد. آدرس در شروع یک چرخه به حافظه دستورالعمل ارائه می شود. سپس در طول چرخه، دستورالعمل از حافظه دستورالعمل خوده می شود و در هم زم، محاسبه ای برای تعیین شمارنده برنامه بعدی جام می شود.شمارنده برنامه با افزایش چهار شمارنده برنامه و با تخاب اینکه آیا آن را به عنو شمارنده برنامه در نظر بگیرید یا نتیجه محاسبه شاخه / پرش را به عنو شمارنده برنامه محاسبه کنید. توجه داشته باشید که در RISC کلاسیک، تمام دستورالعمل ها طول یکسی دارند. (این چیزی است که RISC را از CISC  جدا می کند). در طرح‌های اصلی RISC، دازه یک دستورالعمل 4 بایت است، بنابراین همیشه 4 را به آدرس دستورالعمل اضافه کنید، اما از PC + 4 برای یک شاخه، پرش، یا استثنا استفاده نکنید ( به شاخه‌های تاخیری در زیر مراجعه کنید. ). (توجه داشته باشید که برخی از ماشین‌های مدرن از الگوریتم‌های پیچیده‌تری ( پیش‌بینی شاخه و پیش‌بینی هدف شاخه ) برای حدس زدن آدرس دستورالعمل بعدی استفاده می‌کنند. )

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

تمام دستورالعمل های MIPS، SPARC و DLX حداکثر دارای دو ثبات ورودی هستند. در مرحله رمزگشایی، دیس های این دو رجیستر در داخل دستورالعمل مشخص می شوند و ایندکس ها به عنو آدرس به حافظه رجیستر ارائه می شوند. بنابراین دو ثبات نامگذاری شده از فایل ثبت خوده می شوند. در طرح MIPS، فایل رجیستر دارای 32 ورودی بود.

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

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

مرحله رمزگشایی با فشار سخت افزاری بسیار زیادی به پای می رسد: MIPS امک شعاب در صورت مساوی بودن دو ثبات را دارد، بنابراین یک درخت AND با عرض 32 بیت به صورت متوالی پس از خودن فایل ثبت اجرا می شود و یک مسیر حیاتی بسیار طولی را از طریق آن ایجاد می کند. مرحله (که به معنی چرخه کمتر در ثیه است). همچنین، محاسبه ها هدف شاخه به طور کلی به یک Add 16 بیتی و یک افزایش دهنده 14 بیتی نیاز دارد. حل شعاب در مرحله رمزگشایی این امک را فراهم می کند که فقط خطای پیش بینی اشتباه شاخه تک چرخه داشته باشیم. از آنجایی که شاخه ها اغلب گرفته می شدند (و در نتیجه اشتباه پیش بینی می شدند)، پایین نگه داشتن این خطا بسیار مهم بود.

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

ALU مسئول جام عملیات بولی (و، یا، نه، nand، نه، xor، xnor) و همچنین برای جام جمع و تفریق اعداد صحیح است. علاوه بر آن، ALU معمولاً بیت‌های وضعیتی را ارائه می‌کند، مند اینکه آیا نتیجه 0 بوده یا نه، یا سرریزی رخ داده است.

Bit Shifter وظیفه تقال و چرخش را بر عهده دارد.

دستورالعمل های مربوط به این ماشین های ساده RISC را می تو با توجه به عملکرد عملیات به سه کلاس تاخیر تقسیم کرد:

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

دسترسی به حافظه 
اگر نیاز به دسترسی به حافظه داده باشد، در این مرحله جام می شود.

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

برای ذخیره‌سازی مستقیم داده‌های نگاشت شده و برچسب‌گذاری شده مجازی، ساده‌ترین سازم‌های ذخیره‌سازی اطلاعات متعدد ، از دو SRAM استفاده می‌شود که یکی داده‌ها را ذخیره می‌کند و دیگری برچسب‌ها را ذخیره می‌کند.

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

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

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

خطرهای داده 
خطرهای داده زمی رخ می دهد که یک دستورالعمل، برنامه ریزی شده کورکوره، سعی می کند از داده ها قبل از در دسترس بودن داده ها در فایل ثبات استفاده کند.

در خط لوله کلاسیک RISC، خطرهای داده به یکی از دو روش اجتناب می شود:

راه حل A. دور زدن

دور زدن نیز به عنو حمل و نقل عملوند شناخته می شود.

فرض کنید CPU در حال اجرای قطعه کد زیر است:SUB r3,r4 -> r10     ; Writes r3 - r4 to r10
AND r10,r3 -> r11    ; Writes r10 & r3 to r11مراحل واکشی دستورالعمل و رمزگشایی دستور دوم را یک چرخه پس از اول ارسال می کند. همطور که در این نمودار نش داده شده است، آنها از خط لوله عبور می کنند:

در یک خط لوله ساده ، بدون در نظر گرفتن خطر، خطر داده به صورت زیر پیشرفت می کند:

در چرخه 3، دستورالعمل SUB مقدار جدید را برای r10 محاسبه می کند. در هم چرخه، عملیات AND رمزگشایی می شود و مقدار r10 از فایل رجیستر واکشی می شود. با این حال، دستورالعمل SUB هنوز نتیجه خود را روی r10 است. بازنویسی این مورد معمولاً در چرخه 5 (جعبه سبز) رخ می دهد. بنابراین، مقداری که از فایل رجیستر خوده شده و به ALU (در مرحله اجرای عملیات AND ، کادر قرمز رنگ) ارسال شده است، نادرست است.

درعوض، باید داده‌هایی را که توسط SUB محاسبه شده‌د، قبل از اینکه به طور معمول بازنویسی شوند، به مرحله Execute (یعنی به دایره قرمز در نمودار) عملیات AND برگردیم. راه حل این مشکل یک جفت مالتی پلکسر بای پس است. این مالتی پلکسرها در تهای مرحله رمزگشایی قرار دارند و خروجی های فلاپ شده آنها ورودی های ALU هستند. هر مالتی پلکسر بین:

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

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

توجه داشته باشید که داده ها فقط می توند در زم به جلو منتقل شوند - اگر هنوز پردازش نشده باشد، نمی تو داده ها را به مرحله قبلی دور زد. در مورد بالا، داده ها به جلو منتقل می شوند (تا زمی که AND برای ثبت در ALU آماده شود، SUB قبلاً آن را محاسبه کرده است).

راه حل B. قفل کردن خط لوله

با این حال، دستورالعمل های زیر را در نظر بگیرید:LD  adr    -> r10
AND r10,r3 -> r11داده های خوده شده از آدرس adr تا زمی که مرحله دسترسی به حافظه دستور LD جام نشود، در حافظه پنه داده وجود ندارد. در این زم، دستورالعمل AND در حال حاضر از طریق ALU است. برای حل این مشکل نیاز است که داده ها از حافظه در زم به عقب به ورودی ALU ارسال شوند. ممکن نیست. راه حل این است که دستور AND را یک چرخه به تاخیر بیندازید. خطر داده در مرحله رمزگشایی شناسایی می‌شود و مراحل واکشی و رمزگشایی متوقف می‌شوند - از فلاپ کردن ورودی‌هایش جلوگیری می‌شود و بنابراین برای یک چرخه در هم حالت باقی می‌مند. مراحل اجرا، دسترسی و بازنویسی در پایین‌دست، یک دستورالعمل بدون عملیات اضافی (NOP) را مشاهده می‌کند که بین دستورالعمل‌های LD و AND درج شده است.

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

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

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

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

 تکرار تفکیک شعاب از مدارهای کمی عبور می کند: خودن کش دستورالعمل، خودن فایل ثبت، محاسبه شرایط شعاب (که شامل یک مقایسه 32 بیتی در CPU های MIPS است)، و مالتی پلکسر آدرس دستورالعمل بعدی.
 از آنجایی که اهداف شاخه و پرش به موازات رجیستر خوده شده محاسبه می شوند، ISA های RISC معمولاً دستورالعمل هایی ندارند که به آدرس register+offset منشعب می شوند. پرش به ثبت نام پشتیبی می شود.
 در هر شاخه ای که گرفته می شود، دستورالعمل بلافاصله پس از شاخه همیشه از کش دستورالعمل واکشی می شود. اگر این دستورالعمل نادیده گرفته شود، یک جریمه IPC برای هر شاخه گرفته شده یک چرخه وجود دارد که به دازه کافی بزرگ است.

چهار طرح برای حل این مشکل کارایی با شاخه ها وجود دارد:

 Predict Not Taken: همیشه دستور بعد از شاخه را از کش دستورالعمل واکشی کنید، اما فقط در صورتی آن را اجرا کنید که شاخه گرفته نشده باشد. اگر شعاب گرفته نشود، خط لوله پر می مد. اگر شعاب گرفته شود، دستورالعمل فلاش می شود (به گونه ای علامت گذاری می شود که گویی یک NOP است)، و فرصت یک چرخه برای اتمام یک دستورالعمل از بین می رود.
 Branch Likely: همیشه دستورالعمل را بعد از شاخه از کش دستورالعمل واکشی کنید، اما فقط در صورتی آن را اجرا کنید که شاخه گرفته شده باشد. کامپایلر همیشه می‌تود شکاف تاخیر شاخه‌ای را در چنین شاخه‌ای پر کند، و از آنجایی که شعبه‌ها اغلب گرفته می‌شوند، چنین شاخه‌هایی جریمه IPC کمتری نسبت به نوع قبلی دارند.
 شکاف تاخیر شعبه : همیشه دستورالعمل را بعد از شاخه از کش دستورالعمل واکشی کنید و همیشه آن را اجرا کنید، حتی اگر شاخه گرفته شده باشد. به جای دریافت جریمه IPC برای بخشی از شاخه هایی که گرفته شده (شاید 60٪) یا گرفته نشده است (شاید 40٪)، شکاف های تاخیر شعبه برای شاخه هایی که کامپایلر نمی تود شکاف تاخیر شعاب را برنامه ریزی کند، جریمه IPC می گیرد. طراح SPARC، MIPS و MC88K یک شکاف تاخیر شعاب را در ISA خود طراحی کردند.
 پیش‌بینی شاخه : به موازات واکشی هر دستورالعمل، حدس بزنید که آیا دستورالعمل یک شاخه است یا پرش، و اگر چنین است، هدف را حدس بزنید. در چرخه پس از شاخه یا پرش، دستورالعمل را در هدف حدس زده شده بیاورید. هنگامی که حدس اشتباه است، هدف نادرست واکشی شده را شستشو دهید.

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

شاخه های تاخیری مورد تقاد قرار گرفته است  به عنو یک تخاب کوتاه مدت ضعیف در طراحی ISA:

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

استثناها 
فرض کنید یک RISC 32 بیتی یک دستورالعمل ADD را پردازش می کند که دو عدد بزرگ را اضافه می کند و نتیجه در 32 بیت قرار نمی گیرد.

ساده ترین راه حل، که توسط اکثر معماری ها ارائه شده است، حسابی بسته بندی است. اعداد بزرگتر از حداکثر مقدار ممکن رمزگذاری شده، مهم‌ترین بیت‌های آن‌ها را تا زمی که جا بیفتند، بریده می‌شوند. در سیستم اعداد صحیح معمولی 3000000000+3000000000=6000000000. با حساب 32 بیتی بدون علامت، 3000000000+3000000000=1705032704 (6000000000 mod 2^32). این ممکن است خیلی مفید به نظر نرسد. بزرگترین مزیت محاسبه حسابی این است که هر عملیات یک نتیجه کاملاً مشخص دارد.

اما برنامه نویس، به خصوص اگر به زبی برنامه نویسی کند که از اعداد صحیح بزرگ پشتیبی می کند (مثلاً Lisp یا Scheme )، ممکن است نیازی به پیچیدن محاسبات نداشته باشد. برخی از معماری ها (مثلا MIPS)، عملیات افزودن ویژه ای را تعریف می کند که به جای بسته بندی نتیجه، به مک های ویژه در سرریز منشعب می شود. نرم افزار در محل مورد نظر مسئول رفع مشکل است. این شاخه خاص استثنا نامیده می شود. استثناها با شاخه های معمولی تفاوت دارند زیرا آدرس هدف توسط خود دستورالعمل مشخص نشده است و تصمیم شعبه به نتیجه دستورالعمل بستگی دارد.

رایج ترین نوع استثنای قابل مشاهده نرم افزار در یکی از ماشین های کلاسیک RISC، خطای TLB است.

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

برای آس کردن (و سریع) نرم افزار برای رفع مشکل و راه دازی مجدد برنامه، CPU باید یک استثنای دقیق داشته باشد. استثنای دقیق به این معنی است که تمام دستورها تا دستور استثنا اجرا شده د و دستورالعمل استثنا و همه چیزهای بعد از آن اجرا نشده باشد.

برای گرفتن استثنائات دقیق، CPU باید تغییرها را در حالت قابل مشاهده نرم افزار در ترتیب برنامه جام دهد. این commit منظم به طور طبیعی در خط لوله کلاسیک RISC اتفاق می افتد. اکثر دستورالعمل ها نتایج خود را در فایل ثبت در مرحله نوشتن باز می نویسند و بنابراین این نوشتن ها به طور خودکار به ترتیب برنامه اتفاق می افتد. دستورالعمل‌های ذخیره شده، اما نتایج خود را در مرحله دسترسی در صف داده‌های ذخیره شده می‌نویسند. اگر دستور ذخیره یک استثنا داشته باشد، ورودی Store Data Queue باطل می شود تا بعداً در حافظه کش داده SRAM نوشته نشود.

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

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

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

همچنین ببینید 
قون آهن عملکرد پردازنده

منابع