#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.