#9: if/else karşılaştırmalarında doğrudan karşılaştırma olmalıdır, hesaplama olmamalıdır
Genel olarak hem tasarımınızın okunabilirliğini arttırmak hem de tasarımınızın sentez aşamalarını kolaylaştırmak adına if/else bloklarının şartları içerisinde hesaplamalar veya atamalar yapılmamalıdır. Her ne kadar sentezleme aracı size olumsuz bir geri bildirimde bulunmasa ve sonuçta ortaya çıkacak netlist aynı olsa da, bunu yapmak hem tasarımınızın okunabilirliğini azaltmakta, hem de ileride değişiklikler yaptıkça sizin mantıksal hata yapma ihtimalinizi arttırmaktadır.
Örneğin:
... if yazmac1_r-yazmac2_r>5 begin yazmac3_r <= 8'h00; end else begin yazmac3_r <= 8'hFF; end ...
ifadesi yerine çok basitçe:
... assign hesaplanan_w=yazmac1_r-yazmac2_r; ... if hesaplanan_w>5 begin yazmac3_r <= 8'h00; end else begin yazmac3_r <= 8'hFF; end ...
yazılarak birçok mantıksal sorun önceden engellenebilir. Ayrıca elektronik tasarım açısından da daha açık bir şekilde elektronik devre tanımlaması yapılmış olur.
#10: if/else karşılaştırmalarında 1’e veya başka bir sayıya eşitlik doğrudan yazılmalı, C programlama tipi gizli karşılaştırmalar yapılmamalıdır
Genel olarak programlama dilleriyle karşılaştırmalar yapılırken “while(1)”, “if(deneme)”, vb.. gibi ifadeler kullanılarak minimum karakter ile maksimum verim sağlanmaya çalışılmaktadır. Her ne kadar standart yazılımlar geliştirilirken tavsiye edilmeyen bir yöntem olsa da, elektronik devre tasarımı yaparken daha da az tavsiye edilen bir yöntemdir. Örneğin:
... if yazmac1_r begin yazmac3_r <= 8'h00; end else begin yazmac3_r <= 8'hFF; end ...
ifadesi ile yazmac1_r‘nin 1 değerine sahip olduğu durumda yazmac3_r‘nin 8’h00 değerine sahip olması gerektiği belirtilse de, bu ifadenin tam anlamıyla anlaşılabilmesi için yazmac1_r‘nin ne olduğuna, bit genişliğine, vb.. birçok parametreye bakma ihtiyacı ortaya çıkmaktadır. Onun yerine:
... if yazmac1_r==3'b001 begin yazmac3_r <= 8'h00; end else begin yazmac3_r <= 8'hFF; end ...
yazılarak herkes için daha net bir tasarım tarifi ortaya konabilmektedir.
#11: Tasarım yapılırken mümkün mertebe senkron / saate dayalı tasarım yapılmalıdır
Her ne kadar Verilog HDL ile asenkron tasarım yapma imkanı verilse bile, özellikle FPGA ile çalışıyor ve ASIC/VLSI tasarımı yapmıyorsanız asenkron devrelerden genel olarak kaçınmanız en mantıklı seçeneklerden biri olacaktır. Zorunlu kalınan noktalar da elbette olacaktır.
Bunun için aşağıdaki noktalara dikkat edilmelidir:
- Reset genel olarak her blokta kullanılmalı ve yazmaçların ilklendirmeleri yapılmalıdır.
- Kullanılan resetleme yöntemi senkron resetleme olmalıdır.
- Saat darbelerinin mümkün mertebe saat darbe üretecinden çıkmış halleri (PLL,vb..) kullanılmalıdır.
- Sayaçlara bağlı, yazmaçlanmış yada benzeri mantıksal saat darbeleri tercih edilmemelidir.
- Mümkün mertebe senkron yazmaçlar kullanılmalı, mandal devreler tercih edilmemelidir.
- Asenkron sinyaller, mümkün olduğunca erken senkronizasyona uğratılmalıdır.
#12: Sentezlenemeyen Verilog HDL özelliklerini kullanmayınız
Her ne kadar kolaylık sağlasa, testbenchlerle tasarım yaparken bir sorun yaşatmasa da, genel olarak sentezlenmesi mümkün olmayan Verilog HDL özelliklerinin alışkanlık olarak kullanılmaması orta ve uzun vadede daha verimli tasarım yapma alışkanlıklarını kazandıracaktır.
Şu örneği inceleyelim:
... `define GECIKME 10 always @(posedge in_clock) begin data_r <= #`GECIKME in_data; end assign out_data = data_r; ...
Belirli bir gecikme ile in_data‘nın data_r a aktarılmasını istediğimizi ifade ediyoruz. Simülasyonda oldukça düzgün ve istediğiniz gibi çalışacaktır. Fakat bunun sentezlemek o kadar da kolay değil ve tamamen sentez aracına bağlıdır.
Böyle bir “imkan” Verilog HDL’de sunulduğu için bu özelliği kullanıyorsanız ama “zorunlu” değilseniz standart bir Verilog HDL ifadesi ile alternatif tasarım her zaman daha mantıklı olacaktır. Yukarıdaki örnekteki kod dışında daha birçok Verilog HDL özelliği sentezlenebilir değildir.
Umarım öneriler işinize yarar, iyi tasarımlar.
Bir cevap yazın
Yorum yapabilmek için giriş yapmalısınız.