Sentez sırasında mandallar nasıl önlenir


9

VHDL kullanarak bir kombinasyonel mantık bloğu tasarlamak istiyorum, ancak bazen sentezlenen sonuç istem dışı bir mandal içeriyor.

Sentezleyicinin mandalları çıkarmasını önlemek için hangi kodlama yönergelerine uymam gerekir?

Örnek: kodun küçük bir bölümünde if-else deyimlerini kullanmalı mıyım?


Biri sormaya çalıştığım şeyi alabilirse, lütfen beni bilgilendirin

Örneğinizden ne kastettiğinizden emin değildim. Lütfen yeniden düzenlemenin orijinal amacınızla eşleştiğinden emin olun.
W5VO

@fatai, daha önce yorum yaptım, meta.stackexchange.com adresinden hesabınızı silmenin belirli bir yöntemi var. İşaretlendiğim son soruya bağlandım. Sitedeki moderatörler hiç bu güce sahip değiller. Bu, dev ekibiyle iletişim kurmayı gerektirir.
Kortuk

Yanıtlar:


13

Mandalları önlemek için, tüm çıkışlarınızın kodun tüm olası dallarına atandığından emin olmanız gerekir.

Örneğin,

if a = '1' then
   b(0) <= '1';
else
   b(1 downto 0) <= "00";
end if;

ilk durumda b (1) değeri belirtilmediğinden, bir derleyici b (1) 'in önceki değerini orada tutmak istediğinize karar verdi. Bir mandal üretmeyecek şekilde yazmanın bir yolu:

if a = '1' then
   b <= prev_b;
   b(0) <= '1';
else
   b(1 downto 0) <= "00";
end if;

...

if rising_edge (clk)
    prev_b <= b;
end if;

Burada b'nin eski değerini korumasını ve ardından yeni değerle b (0) üzerine yazması gerektiğini açıkça belirtirsiniz.

Başka bir yol, @ TomiJ'nin cevabında olduğu gibi ba varsayılan değerini vermektir.

Bir mandal aldığınız kodu gönderirseniz, belirli bir nedeni bulmanıza yardımcı olabiliriz.


Yaklaşımınızın b <= bbir mandaldan kaçınacağını düşünmüyorum , çünkü yine de sinyalin durumunu korumayı gerektirir.
Tomi Junnila

Haklı olabilirsin; Saatli mantığa çok alışkınım. Ben düzenleyeceğim.
fbo

6

Birleşimsel mantık için süreçler kullanıyorsanız (ve sadece bu nedenle buna karşı öneriyorum), süreç boyunca her yolun, sürecin yönlendirdiği her sinyale bir şey atadığından emin olun. Çıkışların hiçbiri, işlemin "son kez" çalıştırıldığı çıkışlardan herhangi birine bağımlı olamaz.

Aksi takdirde, bir sonraki işlem programlandığında, son kez yeni bir değer elde etmeyen sinyalin değerini tutmak zorunda olduğu için bir mandal çıkarırsınız.

Tamamen kombinasyonel mantığı sürekli ödevler olarak tutmayı ve saatli mantık için süreçleri kullanmayı tercih ederim, sonra mandal almıyorum.


5

Mandallardan kaçınmak için dört kural:

  • Yazdığınız sinyallerden okumayın.
  • Doğru bir duyarlılık listesine sahip olun (okuduğunuz tüm sinyallerin duyarlılık listesinde olması gerekir)
  • Yazdığınız her sinyale tüm sinyallerin atandığından emin olun. (örneğin: if-else-ifadesinin her dalında)
  • Değişken kullanan işlemler için, her değişkeni okumadan önce varsayılan bir değer olarak başlatıldığından emin olun (başka bir değişken veya sinyalde).

Ayrıca, birkaç kombinasyon işleminiz varsa, bir döngü oluşturmadığınızdan emin olun.

Birkaç kodlama stili, bu kurallara bağlı kalmanıza yardımcı olabilir, örneğin @ TomiJ'nin cevabındaki stil. @Martin Thompson'ın belirttiği gibi, kombinasyonel mantığın bir arada olmasını önlemek daha iyi olabilir. Bunun yerine her şeyi saatli bir sürece koyun.


+1 Güzel kurallar kümesi. Kural # 2'nin (hassasiyet listesi hakkında) sentez ve simülasyonlar arasında tutarlı sonuçlar elde etmek için gerçekten önemli olduğunu, ancak mandalların çıkarımında gerçekten bir fark yaratmadığını kabul eder misiniz?
rick

@rick AFAIK, bir sentez aracının eksik hassasiyet listeleri ile ne yapacağının garantisi yoktur . VHDL Sentezi için IEEE standardı (1076.6-1999) şunları belirtir: "İşlem duyarlılığı listesi, işlem ifadesinde okunan tüm sinyalleri içermelidir. Hassas duyarlılık listeleri eksik olan işlemler desteklenmez." Bununla birlikte, bazı sentez araçlarının (belki de hepsi?) Eksik duyarlılık listelerini kabul ettiğini biliyorum , ancak duyarlılık listesini hep birlikte yok sayın . Daha katı IEEE standardı yerine bu davranışa güvenirseniz, ifadenizin doğru olacağını düşünüyorum.
Philippe

Teşekkürler, kulağa doğru geliyor, modelimi bu standarda uymuyor. Merakımı aldı çünkü şimdiye kadar gördüğüm tüm sentez araçları duyarlılık listesini görmezden geliyor, ancak bazılarının mandal çıkardığı söylentileri duydum.
rick

3

@Fbo ve @Martin Thompson tarafından işaret edildiği gibi, işlemin yönlendirdiği her sinyale işlemin her dalında bir değer atandığından emin olmanız gerekir ve bu değerin herhangi bir çıkışın önceki durumuna bağlı olmaması gerekir sürecin.

Bunu sağlamanın en kolay yolu, işlemin en başında her bir çıktıya bazı varsayılan değerler atamaktır, örneğin (fbo örneğini birlikte seçmek):

COMBO: process(a)
begin
    b <= (others => '0'); -- Assign default value to b
    if a = '1' then
        b(0) <= '1';
    else
        b(1 downto 0) <= "00";
    end if;
end process COMBO;

1
Bu sık kullandığım iyi bir yöntem. Bununla birlikte, bazen bir mandal uyarısı size bazı bitler atamayı unuttuğunuzu gösterebilir, oysa bu yöntem hatayı bulmayı zorlaştırabilir. Örneğin, geniş bir sinyalin tüm bitlerini ayrı ayrı ve yanlışlıkla yanlış saymış olsaydınız.
fbo

2
Sadece kombinatoryal bir süreçte. Saatli bir işlemde, tam olarak istediğiniz gibi olabilecek bir flipflop çıkarırsınız.
Martin Thompson
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.