VHDL ile tasarım yapmanın önemli adımlarından biri de, yaptığımız tasarımın doğru çalışıp çalışmadığını öğrenmek için yapmamız gereken benzetim (simülsayon) adımıdır. Bu adım bize tasarımımızda bulunan olası sorunları ortaya çıkarma fırsatı sunmaktadır. Bu sayede tasarımımızı fiziksel ortamda sınamak yerine sanal bir ortamda sınayıp doğru çalıştığına emin olduktan sonra sentezleme adımına geçebiliriz. Yapılan tasarıma bağlı olmakla birlikte sentezleme işlemi saatler sürebilmektedir. Kimse saatler süren bir sentezleme işleminden sonra yaptığı tasarımın hatalı olduğunu görmek istemez çünkü harcanan tüm emek ve saatler süren sentezleme işlemi boşa gitmiştir. Bu nedenlerden dolayı yaptığımız tasarımları mutlaka benzetim ortamında denemeliyiz.
Vivado çalışma ortamı bize gayet kullanışlı bir benzetim ortamı sunmaktadır. Yazdığımız kodu kolayca bu ortama geçirip, çalıştığına emin olduktan sonra sentezleme işlemine geçeriz. Bu anlatımda aşağıda kodu verilen basit bir 4 bitlik sayıcı tasarlanmış ve benzetimi yapılmıştır. Verilen örnek VHDL kodunda bulunan kavramlar bu aşamada bir şey ifade etmeyebilir fakat kitabın ilerleyen bölümlerinde bu kavramlar hakkında gerekli açıklamalar yapılmıştır.
library ieee; use ieee.std_logic_1164.all; use ieee.numeric_std.all; entity top_level is port( iCLK : in std_logic; iRST : in std_logic; oCNT : out std_logic_vector(3 downto 0) ); end top_level; architecture Behavioral of top_level is begin process(clk, rst) variable counter : std_logic_vector(3 downto 0) := "0000"; begin if(iRST = '1') then null; elsif(iCLK'event and iCLK = '1') then count := count + 1; oCNT <= count; end if; end process; end Behavioral;
Verilen kodu Vivado ortamında oluşturduğumuz projeye ekleyerek ilk aşamayı geçebiliriz. Kodu yazdıktan sonra ekranda oluşacak görüntü Şekil 1’de verilmiştir.

Şekil 1 Kod’a ait ekran görüntüsü
Benzetim işlemine başlamak için ekranın sol tarafında var olan başlıklardan Simulation başlığı altındaki Run Simulation yazısına tıkladığınızda açılan menüden Run Behavioral Simulation seçeneğini seçeriz. İlgili seçime ait ekran görüntüsü Şekil 2’de verilmiştir.

Şekil 2 Benzetim ortamının başlatılması.
Bu aşamadan sonra yazdığımız kod hızlıca benzetim ortamında aktarılmış olur. Eğer yazdığınız VHDL kodunda bir hata olursa bu aşama hata ile sonlanır ve benzetim ortamı açılmayarak, hata mesajı gösterilir. Eğer yazılan VHDL kodunda bir sorun yoksa Şekil 3’de verilen çalışma ortamı açılacaktır.

Şekil 3 Benzetim ortamının genel görüntüsü.
Açılan pencere temelde iki kısımdan oluşmaktadır. Ekranın sağ tarafındaki siyah bölgede tasarımımızda var olan sinyallerin, giriş ve çıkışların o anki değerleri görülmektedir. Bizim yazdığımız kodda başlangıç değerleri ayarlanmadığı için giriş ve çıkış portlarına ait değerler U değerini göstermektedir. Burada U ifadesi, belirtilen sinyalin değerinin bilinmediğini (unknown) ifade etmektedir.
Ekranın sol yarısında ise tasarımımızda var olan sinyallere ait ismi, türü değeri gibi genel bilgiler görüntülenmektedir. Benzetim işlemini başlatabilmek için bu aşamada bir takım ayarlamaların yapılması gerekmektedir.
İlk olarak tasarımımızda bulunan girişlerden hangisinin, tasarımımızı tetikleyen saat işareti olduğunun belirtilmesi gerekmektedir. Bizim örnek tasarımımız bir saat işaretine ihtiyaç duyduğu için bu adım zorunlu bir adımdır. Eğer tasarımınızda bu tarz bir giriş yoksa bu adım es geçilebilir. Örnek çalışmamızdaki saat işareti girişi iCLK olarak isimlendirilmiştir. iCLK işaretine sağ tuşla tıkladığınızda açılan menüden Force Clock seçeneği seçilmelidir. Seçime ait ekran görüntüsü Şekil 4’de verilmiştir.

Şekil 4 Saat işareti belirleme ekranı.
Karşımıza gelen pencereden saat işaretine ait değerlerin belirlenmesi işlemi yapılacaktır. Bu ekranda saat işaretimizin yükselen kenardaki değerini, düşen kenardaki değerini, varsa saat işaretinin başlama gecikmesini, eğer belli bir süreden sonra saat işaretinin devre dışı kalması isteniyorsa bunun için gereken süre değerini, saat işaretinin yüzde cinsinden dalga doluluk oranını (ideal durum %50’dir) ve son olarak da saat işaretinin periyot değerini belirliyoruz.
Şekil 5’de örnek bir ayarlama görüntüsü verilmiştir. Örnek ekranda periyod değeri 100ns olarak verilmiş olup, frekans olarak 10MHz’e tekabül etmektedir. Bu hesaba ilişkin bağıntı aşağıdaki formülde belirtilmiştir.

Şekil 5 Saat darbesi özelliklerinin belirlenmesi
Bu aşamadan sonra sıra diğer giriş işaretimiz olan iRST sinyalinin değerini ayarlamaya geldi. Verilen örnek kod parçası incelendiğinde iRST girişinin değeri ‘1’ olduğunda devreyi sıfırlamakta (reset durumu) ve çıkışa “0000” değerini atamaktadır. Bu işaretin değerini belirlemek için üzerine sağ tuşla tıkladığımızda açılan menüden Force Constant seçeneğini seçmemiz gerekmektedir. Bu işleme ait ekran görüntüsü Şekil 6’da verilmiştir.

Şekil 6 Sinyale değer atanması
Bu seçenek seçildiğinde açılan pencereden belirtilen sinyale sabit bir değer ataması yapılabilir. Bizim örneğimizde iRST sinyali 1 bitlik bir lojik sinyal olduğu için yapılabilecek atama değerleri 1 ve 0 olmaktadır. Eğer belirtilen sinyal bundan farklı bir türde, örneğin std_logic_vector tipinde olsaydı alabileceği değer aralığı daha fazla olurdu. Belirtilen değer atama işlemine ait ekran görüntüsü Şekil 7’de gösterilmektedir.

Şekil 7 Sinyale sabit değer atanması.
Şekil 7’de verilen ekrandan belirtilen sinyale ait üç değeri ayarlayabilmekteyiz. Bu değerler sırası ile ; sinyalin alabileceği değer (örneğimizde 0), başlangıç gecikmesi varsa bunun değeri ve son olarak atanan değerin belirli bir süre sonra devre dışı kalması isteniyorsa bunun için gerekli süre değeridir. Bu değerleri belirttikten sonraki adım ise benzetimin çalıştırılması olacaktır.
Benzetim işlemini başlatmak için program penceresinin üst kısmında bulunan işaretlerden Şekil 8’de verilmiş olan görüntüde kırmızı çerçeve içine alınmış olan işarete tıklanması yeterlidir. Bu sayede tasarladığımız yapı tıkladığımız işaretin yanındaki kutuda belirtilen süre kadar çalıştırılacaktır. Bizim örneğimizde bu süre 10 us (mikro saniye) olarak verilmiştir.

Şekil 8 Benzetimin 10us süreyle çalıştırılması
Şekil 8’de verilen görüntüde kırmızı çerçevenin solunda kalan işaretse benzetimin herhangi bir süre kısıtlaması olmadan çalışmasını sağlamaktadır. Eğer amacınız belli aralıklarla olan değişimleri gözlemlemek değilse, doğrudan tasarımın ürettiği çıkışı görmek istiyorsanız bu seçenek kullanışlı olacaktır.
Benzetim çalıştırıldıktan sonra ekranın sol kısmında olan son değişimler görüntülenmektedir. Çalıştırılan süre boyunca sinyallerde olan tüm değişimleri görüntülemek için siyah ekranın hemen sol yanında bulunan sembollerden büyüteç sembolleri arasında son sırada bulunan sembol seçilmelidir. Şekil 9’da verilen görüntüde en alttaki büyüteç sembolü bahsettiğimiz semboldür.

Şekil 9 Benzetim ekranının tamamının görüntülenmesi
Eğer tüm adımlar sorunsuz bir şekilde tamamlanırsa benzetim sonucunda elde edilen ekran Şekil 10’da verilen şekilde görüntülenecektir.

Şekil 10 Benzetim çıktısı ekran görüntüsü