
Veri yolu (İngilizce: datapath), bir işlemcide buyruğun yürütülmesi sırasında verinin üzerinden geçtiği birimlerin bütünüdür. Yazmaç öbeği, aritmetik mantık birimi, çoklayıcılar, toplayıcılar ve bunları birbirine bağlayan hatlar veri yolunu oluşturur.
Bir işlemci iki ana parçadan kurulur. Veri yolu, işlemcinin hangi işlemleri yapabileceğini belirleyen donanımdır; denetim birimi ise bu donanımın her saat çevriminde ne yapacağını söyleyen denetim sinyallerini üretir. İşlemci tasarımı bu ikisinin birlikte kurulmasıdır: önce buyruk kümesinin gerektirdiği birimler ve aralarındaki bağlantılar belirlenir, sonra bu birimleri buyruğa göre yönlendiren denetim tasarlanır.
Bir veri yolu tasarımının temel seçimi, bir buyruğun kaç saat çevriminde tamamlanacağıdır. Tek vuruşluk tasarımda her buyruk tek çevrimde başlayıp biter; çok vuruşluk tasarımda buyruk adımlara bölünür ve her adım bir çevrim alır; boru hattılı tasarımda ise birden çok buyruk aynı anda ayrı aşamalarda ilerler.
Bileşenler

Bir veri yolunda hangi birimlerin bulunacağı buyruk kümesinin gerektirdiği işlemlere göre belirlenir. Yaygın bir RISC buyruk kümesi için gereken birimler şunlardır:
- Program sayacı: yürütülecek buyruğun adresini tutar.
- Buyruk belleği: program sayacının gösterdiği adresteki buyruğu verir.
- Yazmaç öbeği: işlemcinin genel amaçlı yazmaçlarını barındırır. Çoğu tasarımda aynı çevrimde iki yazmaç okunup bir yazmaca yazılabilecek biçimde, iki okuma ve bir yazma kapısıyla kurulur.
- Aritmetik mantık birimi (AMB): toplama, çıkarma, mantıksal işlemler ve karşılaştırmaları yapar. Adres hesabı da çoğunlukla bu birimde yapılır.
- İşaret genişletme birimi: buyruğun içindeki kısa anlık değeri yazmaç genişliğine, işaretini koruyarak uzatır.
- Veri belleği: yükleme ve saklama buyruklarının eriştiği bellektir.
- Çoklayıcılar: bir birimin girişine birden çok kaynaktan hangisinin geleceğini seçer. Bir veri yolundaki çoklayıcı sayısı, buyruk kümesindeki değişkenliğin doğrudan ölçüsüdür.
- Toplayıcılar: program sayacını ilerletmek ve dallanma hedefini hesaplamak için kullanılır.
Bu birimler işlevlerine göre ikiye ayrılır. Toplayıcı, çoklayıcı ve AMB gibi birleşimsel birimlerin çıkışı yalnızca o anki girişlerine bağlıdır; yazmaç ve bellek gibi ardışıl birimler ise durum tutar ve saat sinyaliyle güncellenir. Bir veri yolunun çevrim zamanını belirleyen, ardışıl birimler arasındaki en uzun birleşimsel gecikmedir.
Tek vuruşluk veri yolu

Tek vuruşluk veri yolunda her buyruk tek bir saat çevriminde başlar ve biter, dolayısıyla buyruk başına çevrim sayısı birdir. Program sayacı buyruğun adresini verir, buyruk bellekten getirilir, kodu çözülür, yazmaçlar okunur, gereken işlem yapılır ve sonuç saklanır; bütün bunlar aynı çevrimin içinde gerçekleşir.
Bu tasarımın iki belirgin kısıtı vardır. Birincisi, saat çevriminin en uzun buyruğun gerektirdiği süreye ayarlanması zorunludur; kısa süren buyruklar da aynı çevrimi harcadığı için, buyruk kümesinde süresi çok değişken buyruklar bulunması başarımı düşürür. İkincisi, her birim bir çevrimde en çok bir kez kullanılabildiği için birimler paylaşılamaz. Aynı çevrimde hem buyruk hem veri okunması gerektiğinden bellek ikiye ayrılmak, program sayacını ilerletmek AMB'yi meşgul etmemesi için ayrı bir toplayıcı konmak zorundadır. Bu nedenle tek vuruşluk tasarım, süresi birbirine yakın basit buyruklardan oluşan kümelerde işe yararken, kayan noktalı işlemler gibi uzun süren buyruklar içeren kümelerde kullanılmaz.
Sabit çevrimin bedeli
Tek vuruşluk tasarımda saat çevrimi en uzun buyruğa göre ayarlanır. Bu kısıtın ne kadara mal olduğu, buyruk türlerinin gerçekte ne kadar sürdüğüne bakılarak ölçülebilir. Aşağıdaki çizelge, bir buyruğun geçtiği birimlerdeki gecikmeler için örnek değerleri gösterir.
| Buyruk türü | Buyruk belleği | Yazmaç okuma | AMB işlemi | Veri belleği | Yazmaç yazma | Toplam |
|---|---|---|---|---|---|---|
| R türü | 200 | 50 | 100 | – | 50 | 400 ps |
| Yükleme | 200 | 50 | 100 | 200 | 50 | 600 ps |
| Saklama | 200 | 50 | 100 | 200 | – | 550 ps |
| Dallanma | 200 | 50 | 100 | – | – | 350 ps |
| Atlama | 200 | – | – | – | – | 200 ps |

Çevrim en uzun buyruğa göre ayarlanacağından her buyruk 600 pikosaniye sürer. Buyrukların programdaki dağılımı yükleme %25, saklama %10, R türü %45, dallanma %15 ve atlama %5 alınırsa, buyrukların gerçekte gerektirdiği ortalama süre şu olur:
- 600 × 0,25 + 550 × 0,10 + 400 × 0,45 + 350 × 0,15 + 200 × 0,05 = 447,5 ps
Sabit çevrim, buyruk başına bunun 600 ÷ 447,5 = 1,34 katını harcar. Aradaki fark, kısa buyrukların en yavaş buyruğu beklemesiyle boşa giden süredir.
Bu oran, saat çevriminin her buyruk için ayrı ayarlanabildiği varsayımına dayanır ve bu nedenle kazanılabilecek sürenin üst sınırını verir; gerçek bir saat sabit sıklıkta çalışır.
Çok vuruşluk veri yolu

Çok vuruşluk veri yolunun amacı, tek vuruşluk tasarımda her buyruğun en yavaş buyruğu beklemesinden doğan kaybı gidermektir. Buyruk adımlara bölünür ve her adım bir saat çevriminde yapılır; çevrim artık en yavaş buyruğa değil en yavaş adıma göre ayarlandığından belirgin biçimde kısalır. Buna karşılık her buyruk birden çok çevrim sürer ve yalnızca gereksinim duyduğu kadar çevrim kullanır: bir yükleme buyruğu beş, bir dallanma üç çevrim gibi. Böylece hızlı buyruklar yavaş buyrukları beklemekten kurtulur.
Bir çevrimin sonunda üretilen değerin sonraki çevrimde kullanılabilmesi için, aşamalar arasına yazmaçlar konur: getirilen buyruğu tutan buyruk yazmacı, okunan iki kaynak yazmacının değerlerini tutan iki yazmaç, AMB'nin ürettiği değeri tutan bir yazmaç ve bellekten okunan veriyi tutan bir yazmaç. Bunlar programcıya görünmez; yalnızca çevrimler arasında değer taşımaya yararlar.

Aynı birimin ayrı çevrimlerde yeniden kullanılabilmesi ikinci bir kazanç sağlar. Buyruk ve veri erişimi ayrı çevrimlerde yapıldığından tek bir bellek ikisine de yeter; program sayacının ilerletilmesi, dallanma hedefinin hesaplanması ve buyruğun kendi işlemi ayrı çevrimlere düştüğünden tek bir AMB üçüne birden yeter. Böylece bellek ve AMB gibi alanca büyük birimler çoğaltılmamış olur.
Kazancın ne kadar olacağı adımların ne kadar dengeli bölündüğüne bağlıdır. Bellek erişimi yazmaç okumadan çok daha uzun sürer ve çevrim en yavaş adıma göre ayarlandığından, kısa adımlarda da tam çevrim harcanır; adımlar dengesiz bölünmüşse kazanç azalır, hatta tersine dönebilir. Buna karşılık çarpma, bölme ya da kayan noktalı işlemler gibi uzun süren buyruklar içeren kümelerde kazanç büyür, çünkü tek vuruşluk tasarımda bu buyruklar bütün çevrimi tek başına belirlerdi.
Bedeli denetimin karmaşıklaşmasıdır. Buyruğun hangi adımda olduğunun izlenmesi gerektiğinden denetim birimi birleşimsel bir devre olmaktan çıkar ve durum tutan bir yapıya dönüşür.
Denetim birimiyle ilişkisi

Denetim birimi veri yolunun bir parçası değil, işlemcinin ikinci ana birimidir. Veri yolu bir buyruğun gerektirdiği işlemleri yapabilecek donanımı barındırır, ancak hangi işlemin ne zaman yapılacağını kendisi bilmez; bunu denetim biriminin ürettiği sinyallerden öğrenir. Akış iki yönlüdür: denetim birimi veri yoluna sinyal gönderir, veri yolu da karşılaştırma sonucu gibi durum bilgisini denetim birimine geri bildirir.
Gönderilen sinyaller yürütülen buyruğa ve çok vuruşluk tasarımlarda buyruğun hangi adımda olduğuna bağlıdır.
Denetim çoğunlukla iki katmanda kurulur. Ana denetim birimi, buyruğun işlem kodundan yola çıkarak çoklayıcı seçimleri, bellek okuma ve yazma, yazmaca yazma gibi sinyallerin çoğunu üretir. AMB denetimi ise ana denetim biriminin verdiği kaba bilgi ile buyruğun işlev alanını birleştirip AMB'nin yapacağı işlemi belirler. Bu ayrım, buyruk kümesine yeni bir aritmetik işlem eklendiğinde yalnızca küçük bir birimin değişmesini sağlar.
Tek vuruşluk bir veri yolunda denetim, buyruğun işlem kodundan sinyallere giden bir doğruluk çizelgesiyle tanımlanabilir; adım kavramı bulunmadığı için birleşimsel bir devre yeterlidir. Çok vuruşluk bir veri yolunda ise hangi adımda olunduğunun tutulması gerekir, bu yüzden denetim bir sonlu durum makinesi olarak kurulur.
Sonlu durum makinesi iki yolla gerçeklenebilir. Donanım tabanlı denetimde durumlar ve geçişler doğrudan kapılarla kurulur; hızlıdır, ancak buyruk sayısı arttıkça karmaşıklaşır ve buyruk kümesi her değiştiğinde yeniden tasarlanması gerekir. Mikroprogramlamada ise her buyruk, denetim belleğinde satırlar hâlinde tutulan daha küçük adımlara karşılık gelir ve donanım bu satırları sırayla okur; tasarımı ve değiştirilmesi kolaydır, buna karşılık bellek erişimi bir gecikme ekler.
Karmaşık buyruk kümelerinde veri yolu
IA-32 gibi CISC buyruk kümelerinde buyruklar, tek bir bellek erişimiyle bitmeyen ve birden çok aritmetik işlem içeren adımlara sahiptir; bir buyruğun tamamlanması onlarca çevrim alabilir. Böyle bir kümenin tek vuruşluk bir veri yoluyla gerçeklenmesi, çevrim zamanının en uzun buyruğa göre ayarlanması gerektiğinden anlamsızdır.
Çok vuruşluk veri yolu bu kümeler için iki nedenle uygundur. Buyruklar farklı sayıda çevrim alabildiği için basit buyruklar karmaşık olanların bedelini ödemez, ve veri yolu birimleri aynı buyruğun ayrı adımlarında yeniden kullanılabildiği için karmaşık adresleme kipleri fazladan donanım gerektirmez. Mikroprogramlama ile birleştiğinde, karmaşık bir buyruk kümesinin denetimi yönetilebilir büyüklükte kalır.
Çağdaş x86 işlemcileri bu iki yaklaşımı birlikte kullanır: sık kullanılan basit buyruklar donanım tabanlı denetimle doğrudan çözülür, seyrek kullanılan karmaşık buyruklar ise mikrokoda yönlendirilir.
Kaynakça
- ^ a b c d e f g h i j k l m n o p q r s t Patterson, David A.; Hennessy, John L. (2020). Computer Organization and Design RISC-V Edition: The Hardware Software Interface (2 bas.). Morgan Kaufmann. ISBN 978-0-12-820331-6.
- ^ a b c d e f g Mano, M. Morris; Kime, Charles R. (2015). Logic and Computer Design Fundamentals (5 bas.). Pearson. ISBN 978-0-13-376063-7.
- ^ Hennessy, John L.; Patterson, David A. (2019). Computer Architecture: A Quantitative Approach (6 bas.). Morgan Kaufmann. ISBN 978-0-12-811905-1.
