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

خطرهای داده زمی رخ می‌دهد که یک دستورالعمل، برنامه‌ریزی شده کورکوره، سعی می‌کند از داده‌ها قبل از در دسترس بودن داده‌ها در فایل ثبات استفاده کند.
در خط لوله کلاسیک RISC، خطرهای داده به یکی از دو روش اجتناب می‌شود:
راه حل A. دور زدن
دور زدن نیز به عنو حمل و نقل عملوند شناخته می‌شود.
فرض کنید CPU در حال اجرای قطعه کد زیر است:
SUB r3,r4 -> r10     ; Writes r3 - r4 to r10
AND r10,r3 -> r11    ; Writes r10 & r3 to r11
مراحل واکشی دستورالعمل و رمزگشایی دستور دوم را یک چرخه پس از اول ارسال می‌کند. همطور که در این نمودار نش داده شده است، آنها از خط لوله عبور می‌کنند:
در یک خط لوله ساده، بدون در نظر گرفتن خطر، خطر داده به صورت زیر پیشرفت می‌کند:
در چرخه ۳، دستورالعمل SUB مقدار جدید را برای r10 محاسبه می‌کند. در هم چرخه، عملیات AND رمزگشایی می‌شود و مقدار r10 از فایل رجیستر واکشی می‌شود. با این حال، دستورالعمل SUB هنوز نتیجه خود را روی r10 است. بازنویسی این مورد معمولاً در چرخه ۵ (جعبه سبز) رخ می‌دهد؛ بنابراین، مقداری که از فایل رجیستر خوده شده و به ALU (در مرحله اجرای عملیات AND ، کادر قرمز رنگ) ارسال شده است، نادرست است.
درعوض، باید داده‌هایی را که توسط SUB محاسبه شده‌د، قبل از اینکه به‌طور معمول بازنویسی شوند، به مرحله Execute (یعنی به دایره قرمز در نمودار) عملیات AND برگردیم. راه حل این مشکل یک جفت مالتی پلکسر بای پس است. این مالتی پلکسرها در تهای مرحله رمزگشایی قرار دارند و خروجی‌های فلاپ شده آنها ورودی‌های ALU هستند. هر مالتی پلکسر بین:
یک پورت خودن فایل ثبات (یعنی خروجی مرحله رمزگشایی، مند خط لوله ساده): فلش red
خط لوله ثبت فعلی ALU (برای دور زدن یک مرحله): فلش blue
خط لوله ثبت فعلی مرحله دسترسی (که یا یک مقدار بارگذاری شده یا یک نتیجه ALU ارسال شده است، این امر دور زدن دو مرحله را فراهم می‌کند): فلش purple. توجه داشته باشید که این امر مستلزم آن است که داده‌ها در یک چرخه در زم به عقب منتقل شوند. اگر این اتفاق بیفتد، یک حباب باید وارد شود تا عملیات 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، اگرچه گرقیمت بود، اما برای بهبود نرخ ضربه کش دستورالعمل‌ها، در طرح‌های بعدی قرار گرفت، که در آن زم این مخفف دیگر معنی نداشت.