2008-09-03 23 views
3

Veriog'da 4'e 1 işlev uygulamalıyım. Giriş 4 bit, 0-15 arasında bir sayıdır. Çıkış, tek bir bit, 0 veya 1'dir. Her giriş farklı bir çıkış verir ve girişlerden çıkışlara eşleme bilinir, ancak girişler ve çıkışlar kendileri değildir. Vcs'in kodu başarıyla optimize etmesini ve olabildiğince kısa/temiz olmasını istiyorum. Bugüne kadar benim çözüm:Verilog'da 4'e 1 işlevinin verimli sentezi

wire [3:0] a; 
wire b; 
wire [15:0] c; 

assign c = 16'b0100110010111010; //for example but could be any constant 
assign b = c[a]; 

c ilan etmek olması çirkin ve vcs orada K-haritası tanıyacağı eğer bilmiyorum. Bu, konjonktif normal formda bir vaka beyanı veya ödev olarak işe yarayacak mı?

cevap

5

Neler var? Bir vaka bildirimi de eşit derecede iyi çalışırdı. Bu sadece ne kadar anlamlı olmak istediğin meselesi.

Seçtiğiniz kodlamanın herhangi bir özel anlamı yoksa (örneğin bir bellek adres seçici) çözüm, indeksleme, iyi çalışır. Seçici kodlamalar, tasarımcıya bazı özel anlamsal anlamlar getiriyorsa (ve bunlardan çok fazla değildir), daha sonra bir vaka ifadesi ve enumlar ile devam edin. Sentez bilge, hangisini kullandığınız önemli değil. İyi bir sentez aracı aynı sonucu üretecektir.

2

Tercihim - sorununuzu anlamlandırıyorsa - enumlardan yararlanan bir durum ifadesi veya `tanımlar. Kod incelemesi, bakımı ve doğrulamasını daha kolay hale getirmek için herhangi bir şey.

3

Kesinlikle Dallas'a katılıyorum. Bir durum ifadesi kullanın - amacınızı daha net hale getirir. Sentez aracı onu bir arama tablosu olarak (paralelse) oluşturacak ve mümkün olan her şeyi optimize edecektir.

Ayrıca, RTL kodunuzu kısa tutmak konusunda çok fazla endişelenmem. Önce açıklık için ateş ederim. Sentez araçları, düşündüğünüzden daha akıllıdır ...

2

Böyle şeyler için, RTL netliği geniş bir kenar boşluğuna sahiptir. SystemVerilog, bloğun kombinasyonel mantık, mandal veya floplar halinde sentezlenmesi gerektiğinde bunu açıklığa kavuşturmak için özel her zaman blok direktifleri vardır (ve sentez aracınız, bununla çelişen RTL yazdıysanız bir hata atmalıdır (örn. Her zaman bloğun duyarlılık listesi. Ayrıca, kodlamanın kendisinin pimlere doğru yayılmadığı sürece, aletin, en fazla donanım etkin kodlamayla (toplam tasarımınızın alanını en aza indiren) ne tür kodlamaların yerini alacağını da unutmayın. Üst düzey modulünüzün

Bu öneri, genel olarak da geçerlidir.Kodunuzun insanlar tarafından anlaşılmasını kolaylaştırın ve muhtemelen sentez aracının daha anlaşılır olmasını sağlayacaktır, bu da daha etkili bir şekilde getirilmesini sağlar. tam anlamıyla algoritma araştırmalarının binlerce RTL'nizi taşımak.

Ayrıca isterseniz üçlü operatörlerini kullanarak kod olabilir, ama böyle bir şey tercih ediyorum:

always_comb //or "always @*" if you don't have an SV-enabled tool flow 
begin 
    case(a) 
    begin 
    4'b0000: b = 1'b0; 
    4'b0001: b = 1'b1; 
    ... 
    4'b1111: b = 1'b0; 
    //If you don't specify a "default" clause, your synthesis tool 
    //Should scream at you if you didn't specify all cases, 
    //Which is a good thing (tm) 
    endcase //a 
end //always 
1

Anlaşılan berbat bir sentez araç kullanıyorum. :-) Her iki versiyonu da (sadece kablo gecikmeleri için fan çıkışlarına dayanan bir model kullanarak modül) sentezledim ve sorgunun indeksleme versiyonu, vaka ifadelerinden daha iyi zamanlama ve alan sonuçları verdi. Synopsys DC Z-2007.03-SP'yi Kullanma.