معماری هاروارد بهبود یافته نوعی از معماری هاروارد است که بر خلاف معماری خالص هاروارد، امکان دسترسی به محتویات حافظه را به عنوان داده فراهم میکند. اکثر کامپیوترهایی که به عنوان معماری هاروارد ثبت شدهاند، در واقع دارای معماری هاروارد بهبودیافته هستند.
معماری اصلی کامپیوتری هاروارد، Harvard Mark I، از سیستمهای حافظه کاملاً مجزا برای ذخیره دستورالعملها و دادهها استفاده میکند. CPU دستورالعمل بعدی را دریافت و دادهها را بهطور همزمان و مستقل بارگیری یا ذخیره میکند. این امر برخلاف کامپیوتر معماری فون نویمان است که در آن دستورالعملها و دادهها در یک سیستم حافظه ذخیره میشوند و بدون پیچیدگی حافظه نهان CPU باید به آنها دسترسی داشت.
جداسازی فیزیکی دستورالعملها و حافظهٔ دادهها در بعضی مواقع به عنوان ویژگی متمایز رایانههای معماری مدرن هاروارد شناخته میشود. به کار بردن فناوریهای حافظه مختلف برای دستورالعملها (مثلاً حافظه فلش) و دادهها (معمولاً حافظه خواندن/نوشتن) در ماشینهای فون نویمان با استفاده میکروکنترلرها (سیستمهای کامپیوتری یکپارچه شده روی یک تراشه) رواج یافتهاست. تمایز آن با ماشین هاروارد این است که دستورالعمل و حافظهٔ داده فضاهای آدرس متفاوتی را اشغال میکنند. برخلاف ماشین فون نیومن، یک آدرس حافظه بهطور منحصر به فرد مکان ذخیرهسازی را شناسایی نمیکند و همچنین باید فضای حافظه (دستورالعمل یا داده) را که آدرس به آن تعلق دارد، بداند.
رایانهای با معماری فون نویمان نسبت به ماشینهای هاروارد خالص دارای مزیتهایی مثل دسترسی به کدها و برخورد کردن با آنها مانند دادهها و بالعکس است. به عنوان مثال، اجازه میدهد تا دادهها از دیسک گردان به حافظه خوانده شوند و سپس به عنوان کد اجرا شوند، یا سیستمهای نرمافزاری خودبهینه شونده با استفاده از فناوریهایی مانند کامپایل به موقع برای نوشتن کد ماشین در حافظهٔ خود و سپس اجرای آن مثالهایی از این قبیل هستند. مثال دیگر کد خود اصلاحکننده است که به برنامه اجازه میدهد خودش را اصلاح کند.
یکی از معایب این روش مربوط به حفاظت از فضای اجرایی است که خطرات ناشی از بدافزار و نقص نرمافزار را افزایش میدهد. علاوه بر این، در این سیستمها، مستندسازی جریان کد بسیار دشوار است و همچنین میتواند اشکالزدایی را بسیار دشوارتر کند.
بر این اساس، برخی از ماشینهای هاروارد خالص محصولات تخصصی هستند. اکثر کامپیوترهای جدید معماری هاروارد بهبودیافته را پیادهسازی میکنند. این اصلاحات، راههای مختلفی برای از بین بردن جدایی دقیق بین کد و دادهاست، در حالی که همچنان از دادههای همزمان با کارایی بالاتر و دسترسی دستورالعملهای معماری هاروارد پشتیبانی میکنند.
متداولترین اصلاح، سلسله مراتب حافظه را با حافظه پنهان CPU جداگانه برای دستورالعملها و دادهها در سطوح پایینتر سلسله مراتب ایجاد میکند. یک فضای آدرس برای دستورالعملها و دادهها وجود دارد که مدل فون نویمان را ارائه میکند، اما CPU دستورالعملها را از کش دستورالعمل واکشی میکند و دادهها را از کش دادهها واکشی میکند.[۱] اکثر برنامه نویسان هرگز نیازی به این واقعیت ندارند که هسته پردازنده معماری هاروارد (اصلاح شده) را پیادهسازی میکند، اگرچه از مزایای سرعت آن سود میبرند. فقط برنامه نویسانی که دستورالعملها را تولید و در حافظه ذخیره میکنند، باید از مسائلی مانند انسجام حافظه نهان آگاه باشند؛ اگر حافظه یک نسخهٔ کششدهٔ دستورالعمل را در کش دستورالعمل اصلاح یا باطل نکند.
تغییر دیگر ماهیت «فضای آدرس جداگانه» یک ماشین هاروارد را حفظ میکند، اما عملیات ماشین ویژهای را برای دسترسی به محتویات حافظه دستورالعمل به عنوان داده فراهم میکند. از آنجایی که دادهها مستقیماً به عنوان دستورالعمل قابل اجرا نیستند، چنین ماشینهایی همیشه به عنوان معماری «تغییریافته» هاروارد دیده نمیشوند:
چند پردازندهٔ معماری هاروارد، مانند MAXQ، میتوانند دستورالعملهای واکشیشده از هر بخش حافظه را اجرا کنند؛ برخلاف پردازندهٔ اصلی هاروارد، که فقط میتواند دستورالعملهای واکشیشده از بخش حافظهٔ برنامه را اجرا کند. چنین پردازندههایی، مانند دیگر پردازندههای معماری هاروارد – و برخلاف معماری خالص فون نویمان – میتوانند یک دستورالعمل و یک مقدار داده را، اگر در بخشهای حافظه مجزا باشند بهطور همزمان بخوانند، زیرا پردازنده (حداقل) دو بخش حافظهٔ جداگانه یا مستقل دارد. یک تفاوت محسوس بین برنامهنویس معماری هاروارد اصلاحشده و معماری خالص فون نیومن هنگام اجرای یک دستورالعمل از یک بخش حافظه به همان بخش حافظه نمیتوان بهطور همزمان به عنوان داده دسترسی داشت.[۳][۴]
سه ویژگی ممکن است برای تشخیص ماشینهای هاروارد اصلاحشده از ماشینهای هاروارد و فون نویمان خالص استفاده شود:
حافظههای دستورالعمل و حافظههای داده فضاهای آدرس متفاوتی را اشغال میکنند.
برای ماشینهای هاروارد خالص، یک آدرس «صفر» در فضای دستورالعمل وجود دارد که به یک مکان ذخیره دستورالعمل اشاره دارد و یک آدرس جداگانه «صفر» در فضای داده که به یک مکان ذخیرهٔ دادهٔ مشخص اشاره دارد. در مقابل، فون نویمان و ماشینهای هاروارد اصلاحشده با حافظهٔ پنهان، دستورالعملها و دادهها را در یک فضای آدرس واحد ذخیره میکنند، بنابراین آدرس «صفر» تنها به یک مکان اشاره دارد و اینکه آیا با نحوه نگارش برنامه، الگوی باینری در آن مکان به عنوان یک دستورالعمل تفسیر میشود یا داده تعریف میشود. با این حال، درست مانند ماشینهای هاروارد خالص، ماشینهای هاروارد بهبود یافته با حافظه دستورالعملها بهعنوان داده دارای فضاهای آدرس جداگانهای هستند، بنابراین آدرسهای جداگانهای «صفر» برای فضای آموزشی و دادهها دارند، بنا بر این، این نوع ماشینهای هاروارد اصلاحشده را از هاروارد خالص متمایز نمیکند.
این نکته مربوط به ماشینهای هاروارد خالص یا بهبودیافته است و دلیل همزیستی آنها با معماری انعطافپذیرتر و عمومیتر فون نویمان، مسیرهای حافظه جداگانه به CPU امکان واکشی دستورالعملها و دسترسی به دادهها را بهطور همزمان فراهم میکند و توان عملیاتی را بهبود میبخشد. ماشینهای هاروارد خالص دارای مسیرهای جداگانه با فضاهای آدرس جداگانه هستند. ماشینهای هاروارد اصلاحشده با حافظهٔ پنهان دارای چنین مسیرهای دسترسی جداگانهای برای حافظههای پنهان CPU یا دیگر حافظههای متصل به هم هستند، اما یک مسیر دسترسی یکپارچه بقیه سلسله مراتب حافظه را پوشش میدهد. یک پردازندهٔ فون نویمان فقط آن مسیر دسترسی یکپارچه را دارد. از دیدگاه یک برنامهنویس، یک پردازنده هاروارد اصلاح شده که در آن حافظههای دستوری و دادهها یک فضای آدرس را به اشتراک میگذارند، تا زمانی که انسجام حافظهٔ پنهان به یک مشکل تبدیل شود، مانند کدهای خود اصلاح شده و بارگذاری برنامه معمولاً به عنوان یک ماشین فون نویمان در نظر گرفته میشود. این میتواند گیجکننده باشد؛ اما چنین مسائلی معمولاً فقط برای برنامه نویسان سیستم و یکپارچه سازان قابل مشاهده است. دیگر ماشینهای هاروارد بهبود یافته از این نظر مانند ماشینهای هاروارد خالص هستند.
ماشین اصلی هاروارد، Mark I، دستورالعملها را روی یک نوار کاغذ پانچشده و دادهها را در شمارندههای الکترومکانیکی ذخیره میکرد. این کار به دلیل محدودیتهای فناوری موجود در آن زمان بود. امروزه یک ماشین هاروارد مانند میکروکنترلر PIC ممکن است از حافظه فلش ۱۲ بیتی برای دستورالعملها و ۸ بیتی SRAM گسترده برای دادهها استفاده کند. در مقابل، یک میکروکنترلر فون نویمان مانند یک ARM7TDMI، یا یک هستهٔ اصلاح شده هاروارد ARM9، لزوماً دسترسی یکنواخت به حافظهٔ فلش و SRAM (در آن موارد ۸ بیت بایت) فراهم میکند.
خارج از برنامههایی که به DSP یا میکروکنترلر بدون کش نیاز است، اکثر پردازندههای مدرن یک حافظه پنهان CPU دارند که دستورالعملها و دادهها را تقسیمبندی میکند.
همچنین پردازندههایی وجود دارند که با دقیقترین تعریف، ماشینهای هاروارد هستند (این برنامه و حافظه داده فضای آدرس متفاوتی را اشغال میکنند)؛ و فقط به معنای ضعیفی که عملیات خواندن یا نوشتن حافظه برنامه به عنوان داده وجود دارد، اصلاح شدهاند. برای مثال، دستورالعملهای LPM (بارگذاری حافظه برنامه) و SPM (حافظه برنامه ذخیره) در Atmel AVR چنین اصلاحی را اجرا میکنند. راه حلهای مشابهی در میکروکنترلرهای دیگر مانند PIC و Z8Encore و خانوادههای بسیاری از پردازندههای سیگنال دیجیتال مانند هستههای TI C55x و غیره یافت میشود. از آنجایی که اجرای دستورالعملها هنوز به فضای آدرس برنامه محدود میشوند، این پردازندهها بسیار متفاوت با ماشینهای فون نویمان هستند.
داشتن فضای آدرس جداگانه مشکلاتی را در زبانهای سطح بالا که مستقیماً از این جدولها دادههای فقط خواندنی که ممکن است در فضای آدرسی متفاوت از دادههای قابل نوشتن معمولی باشند پشتیبانی نمیکند ایجاد میکند (بنابراین باید با استفاده از دستورالعملهای مختلف خوانده شوند). زبان برنامهنویسی C میتواند چندین فضای آدرس را از طریق پسوندهای غیر استاندارد [الف] یا از طریق پسوندهای استاندارد شده برای پشتیبانی از پردازندههای تعبیهشده پشتیبانی کند.