Verilog'da Davranışsal Modelleme ve Zamanlama

Verilog'daki davranış modelleri, simülasyonu kontrol eden ve veri türlerinin değişkenlerini işleyen yordamsal ifadeler içerir. Tüm bu ifadeler prosedürler içinde yer almaktadır. Prosedürlerin her biri, kendisiyle ilişkili bir aktivite akışına sahiptir.

Davranış modelinin simülasyonu sırasında, "her zaman" ve "ilk" ifadeleriyle tanımlanan tüm akışlar, "sıfır" simülasyon zamanında birlikte başlar. İlk ifadeler bir kez yürütülür ve always ifadeleri tekrar tekrar yürütülür. Bu modelde, kayıt değişkenleri a ve b, simülasyon zamanı "sıfır" da sırasıyla ikili 1 ve 0 olarak başlatılır. İlk ifade daha sonra tamamlanır ve bu simülasyon çalışması sırasında tekrar yürütülmez. Bu ilk ifade, deyimlerin bir başlangıç-bitiş bloğunu (sıralı blok olarak da adlandırılır) içerir. Bu başlangıç-bitiş tipi blokta, önce a, ardından b ile başlatılır.

Davranışsal Modelleme Örneği

module behave; 
reg [1:0]a,b; 

initial 
begin 
   a = ’b1; 
   b = ’b0; 
end 

always 
begin 
   #50 a = ~a; 
end 

always 
begin 
   #100 b = ~b; 
end 
End module

Prosedürel Ödevler

Prosedürel atamalar reg, tam sayı, zaman ve bellek değişkenlerini güncellemek içindir. Aşağıda açıklandığı gibi, prosedürel atama ile sürekli atama arasında önemli bir fark vardır -

Sürekli atamalar, net değişkenleri yönlendirir ve bir giriş işlenen değeri değiştirdiğinde değerlendirilir ve güncellenir.

Prosedürel atamalar, onları çevreleyen prosedürel akış yapılarının kontrolü altında kayıt değişkenlerinin değerini günceller.

Bir yordamsal atamanın sağ tarafı, bir değer olarak değerlendirilen herhangi bir ifade olabilir. Ancak, sağ taraftaki parça seçmelerinin sabit endeksleri olmalıdır. Sol taraf, atamayı sağ taraftan alan değişkeni gösterir. Bir prosedür atamasının sol tarafı aşağıdaki biçimlerden birini alabilir -

  • kayıt, tam sayı, gerçek veya zaman değişkeni - Bu veri türlerinden birinin ad referansına yapılan atama.

  • Bir kayıt, tamsayı, gerçek veya zaman değişkeninin bit seçimi - Diğer bitleri el değmeden bırakan tek bir bit ataması.

  • bir kayıt, tamsayı, gerçek veya zaman değişkeninin kısmi seçimi - Bitlerin geri kalanını el değmeden bırakan iki veya daha fazla bitişik bitten oluşan bir kısmi seçim. Kısmi seçim formu için yalnızca sabit ifadeler yasaldır.

  • bellek öğesi - Bir belleğin tek bir sözcüğü. Bit seçmelerinin ve parça seçmelerinin bellek öğesi referanslarında yasa dışı olduğuna dikkat edin.

  • Yukarıdakilerden herhangi birinin birleştirme - Sağ taraftaki ifadenin sonucunu etkili bir şekilde bölümlere ayıran ve bölüm parçalarını sırayla birleştirme işleminin çeşitli bölümlerine atayan önceki dört formdan herhangi birinin birleşmesi belirtilebilir.

Atamada Gecikme (sentez için değil)

Gecikmeli bir atamada, zaman birimleri ifade yürütülmeden önce geçer ve soldan atama yapılır. Görev içi gecikmede, sağ taraf hemen değerlendirilir ancak sonuç sol el atamasına yerleştirilmeden önce Δt'lik bir gecikme olur. Başka bir prosedür, Δt sırasında sağ taraftaki sinyali değiştirirse, bu çıkışı etkilemez. Gecikmeler, sentez araçları tarafından desteklenmez.

Sözdizimi

  • Procedural Assignmentdeğişken = ifade

  • Delayed assignment# Δt değişken = ifade;

  • Intra-assignment delaydeğişken = # Δt ifade;

Misal

reg [6:0] sum; reg h, ziltch; 
sum[7] = b[7] ^ c[7]; // execute now. 
ziltch = #15 ckz&h; /* ckz&a evaluated now; ziltch changed 
after 15 time units. */ 

#10 hat = b&c; /* 10 units after ziltch changes, b&c is
evaluated and hat changes. */

Atamaları Engelleme

Bir bloklama prosedürü atama ifadesi, sıralı bir blokta onu izleyen ifadelerin yürütülmesinden önce yürütülmelidir. Engelleme prosedürel atama ifadesi, paralel bir blokta onu takip eden ifadelerin yürütülmesini engellemez.

Sözdizimi

Bloke edici bir prosedür atamasının sözdizimi aşağıdaki gibidir -

<lvalue> = <timing_control> <expression>

Burada, lvalue bir prosedür atama ifadesi için geçerli bir veri türüdür, = atama operatörü ve zamanlama kontrolü isteğe bağlı atama içi gecikmedir. Zamanlama kontrol gecikmesi, bir gecikme kontrolü (örneğin, # 6) veya bir olay kontrolü (örneğin, @ (posedge clk)) olabilir. İfade, simülatörün sol tarafa atadığı sağ taraf değeridir. Prosedürel atamaları bloke ederek kullanılan = atama operatörü, prosedürel sürekli atamalar ve sürekli atamalar tarafından da kullanılır.

Misal

rega = 0; 
rega[3] = 1;            // a bit-select 
rega[3:5] = 7;          // a part-select 
mema[address] = 8’hff;  // assignment to a memory element 
{carry, acc} = rega + regb;  // a concatenation

Engellemesiz (RTL) Atamalar

Engellemeyen prosedür atama, prosedür akışını engellemeden atamaları planlamanıza olanak tanır. Birbirine bağlılık veya sıraya bakılmaksızın aynı zaman adımı içinde birkaç kayıt ataması yapmak istediğinizde, bloke edici olmayan prosedürel ifadeyi kullanabilirsiniz.

Sözdizimi

Bloke edici olmayan bir prosedür atamasının sözdizimi aşağıdaki gibidir -

<lvalue> <= <timing_control> <expression>

Lvalue bir prosedür atama ifadesi için geçerli bir veri türü olduğunda, <= engellemeyen atama operatörü ve zamanlama kontrolü isteğe bağlı atama içi zamanlama kontrolüdür. Zamanlama kontrol gecikmesi, bir gecikme kontrolü veya bir olay kontrolü olabilir (örneğin, @ (posedge clk)). İfade, simülatörün sol tarafa atadığı sağ taraf değeridir. Engellemesiz atama operatörü, simülatörün orequal'den az ilişkisel operatör için kullandığı operatörün aynısıdır. Simülatör, <= operatörünü bir ifadede kullandığınızda ilişkisel bir operatör olarak yorumlar ve <= operatörünü engelleyici olmayan bir prosedür atama yapısında kullandığınızda bir atama operatörü olarak yorumlar.

Simülatör, bloke edici olmayan prosedür atamalarını nasıl değerlendirir? Simülatör bloke edici olmayan bir prosedür atamayla karşılaştığında, simülatör, aşağıdaki gibi iki adımda bloke olmayan prosedür atamasını değerlendirir ve yürütür -

  • Simülatör, sağ tarafı değerlendirir ve yeni değer atamasını bir prosedürel zamanlama kontrolü tarafından belirlenen bir zamanda gerçekleşecek şekilde planlar. Simülatör, sağ tarafı değerlendirir ve yeni değer atamasını bir prosedürel zamanlama kontrolü tarafından belirlenen bir zamanda gerçekleşecek şekilde planlar.

  • Verilen gecikmenin sona erdiği veya uygun olayın meydana geldiği zaman adımının sonunda simülatör, değeri sol tarafa atayarak atamayı yürütür.

Misal

module evaluates2(out); 
output out; 
reg a, b, c; 
initial 

begin 
   a = 0; 
   b = 1; 
   c = 0; 
end 
always c = #5 ~c; 
always @(posedge c) 

begin 
   a <= b; 
   b <= a; 
end 
endmodule

Koşullar

Koşullu ifade (veya if-else ifadesi), bir ifadenin yürütülüp yürütülmediğine karar vermek için kullanılır.

Resmi olarak sözdizimi aşağıdaki gibidir -

<statement> 
::= if ( <expression> ) <statement_or_null> 
||= if ( <expression> ) <statement_or_null> 
   else <statement_or_null> 
<statement_or_null> 

::= <statement> 
||= ;

<İfade> değerlendirilir; doğruysa (yani sıfır olmayan bilinen bir değere sahipse), ilk ifade yürütülür. Yanlışsa (sıfır değerine sahipse veya değeri x veya z ise), ilk ifade çalışmaz. Başka bir ifade varsa ve <ifade> yanlışsa, else ifadesi yürütülür. If ifadesinin sayısal değerinin sıfır olduğu test edildiğinden, belirli kısayollar mümkündür.

Örneğin, aşağıdaki iki ifade aynı mantığı ifade eder -

if (expression) 
if (expression != 0)

İf-else'in diğer kısmı isteğe bağlı olduğundan, iç içe geçmiş bir if dizisinden başka bir şey çıkarıldığında kafa karışıklığı olabilir. Bu, başka bir şey yoksa, her zaman en yakın önceki ile başka birini ilişkilendirerek çözülür.

Misal

if (index > 0) 
if (rega > regb) 
   result = rega; 
   else // else applies to preceding if 
   result = regb; 

If that association is not what you want, use a begin-end block statement 
to force the proper association 

if (index > 0) 
begin 

if (rega > regb) 
result = rega; 
end 
   else 
   result = regb;

Yapım: if- else- if

Aşağıdaki yapı o kadar sık ​​gerçekleşir ki, kısa ve ayrı bir tartışmaya değer.

Example

if (<expression>) 
   <statement> 
   else if (<expression>) 
   <statement> 
   else if (<expression>) 
   <statement> 
   else  
   <statement>

Bu ifler dizisi (eğer-değilse-if yapısı olarak bilinir) çok yönlü bir karar yazmanın en genel yoludur. İfadeler sırayla değerlendirilir; herhangi bir ifade doğruysa, onunla ilişkili ifade çalıştırılır ve bu, tüm zinciri sonlandırır. Her ifade ya tek bir ifade ya da bir ifade bloğudur.

İf-else-if yapısının son else bölümü, 'yukarıdakilerin hiçbirini' veya diğer koşulların hiçbirinin karşılanmadığı varsayılan durumu ele alır. Bazen varsayılan için açık bir eylem yoktur; bu durumda, sondaki else atlanabilir veya imkansız bir koşulu yakalamak için hata kontrolü için kullanılabilir.

Case İfadesi

Case ifadesi, bir ifadenin diğer birkaç ifadeden biriyle eşleşip eşleşmediğini test eden ve buna göre dallara ayrılan özel bir çok yönlü karar ifadesidir. Case ifadesi, örneğin bir mikroişlemci talimatının kodunu çözmek için kullanışlıdır. Case ifadesi aşağıdaki sözdizimine sahiptir -

Example

<statement> 
::= case ( <expression> ) <case_item>+ endcase 
||= casez ( <expression> ) <case_item>+ endcase 
||= casex ( <expression> ) <case_item>+ endcase 
<case_item> 
::= <expression> <,<expression>>* : <statement_or_null> 
||= default : <statement_or_null> 
||= default <statement_or_null>

Vaka ifadeleri, verildikleri tam sırayla değerlendirilir ve karşılaştırılır. Doğrusal arama sırasında, vaka öğesi ifadelerinden biri parantez içindeki ifadeyle eşleşirse, o vaka öğesiyle ilişkili ifade yürütülür. Tüm karşılaştırmalar başarısız olursa ve varsayılan öğe verilirse, varsayılan öğe ifadesi yürütülür. Varsayılan ifade verilmezse ve tüm karşılaştırmalar başarısız olursa, vaka maddesi ifadelerinin hiçbiri yürütülmez.

Sözdiziminden ayrı olarak, case deyimi çok yönlü if-else-if yapılandırmasından iki önemli yoldan farklıdır -

  • İf-else-if yapısındaki koşullu ifadeler, case ifadesinde olduğu gibi, bir ifadeyi diğerleriyle karşılaştırmaktan daha geneldir.

  • Case ifadesi, bir ifadede x ve z değerleri olduğunda kesin bir sonuç sağlar.

Döngü İfadeleri

Dört tür döngü ifadesi vardır. Sıfır, bir veya daha fazla kez bir ifadenin yürütülmesini kontrol etmek için bir yol sağlarlar.

  • sonsuza kadar sürekli olarak bir ifade yürütür.

  • tekrar, bir ifadeyi sabit sayıda yürütür.

  • while, bir ifade yanlış olana kadar bir ifade yürütür. İfade yanlış olarak başlarsa, ifade hiç çalıştırılmaz.

  • aşağıdaki gibi üç aşamalı bir süreçle ilişkili ifadelerin yürütülmesini kontrol etmek için:

    • Normalde yürütülen döngülerin sayısını kontrol eden bir değişkeni başlatmak için kullanılan bir atamayı yürütür

    • Bir ifadeyi değerlendirir - sonuç sıfırsa, for döngüsü çıkar ve sıfır değilse, for döngüsü ilişkili ifadelerini çalıştırır ve ardından 3. adımı gerçekleştirir

    • Normalde loopcontrol değişkeninin değerini değiştirmek için kullanılan bir atamayı yürütür, ardından 2. adımı tekrarlar

Aşağıdakiler, döngü deyimleri için sözdizimi kurallarıdır -

Example

<statement> 
::= forever <statement> 
||=forever 
begin 
   <statement>+ 
end  

<Statement> 
::= repeat ( <expression> ) <statement> 
||=repeat ( <expression> ) 
begin
   <statement>+ 
end  

<statement> 
::= while ( <expression> ) <statement> 
||=while ( <expression> ) 
begin 
   <statement>+ 
end  
<statement> 
::= for ( <assignment> ; <expression> ; <assignment> ) 
<statement> 
||=for ( <assignment> ; <expression> ; <assignment> ) 
begin 
   <statement>+ 
end

Gecikme Kontrolleri

Gecikme Kontrolü

Bir yordamsal ifadenin yürütülmesi, aşağıdaki sözdizimi kullanılarak gecikme kontrollü olabilir -

<statement> 
::= <delay_control> <statement_or_null> 
<delay_control> 
::= # <NUMBER> 
||= # <identifier> 
||= # ( <mintypmax_expression> )

Aşağıdaki örnek, atamanın yürütülmesini 10 zaman birimi kadar geciktirir -

# 10 rega = regb;

Sonraki üç örnek, sayı işaretini (#) izleyen bir ifade sağlar. Atamanın yürütülmesi, ifadenin değeri tarafından belirtilen simülasyon süresi miktarına göre gecikir.

Olay Kontrolü

Bir yordamsal ifadenin yürütülmesi, aşağıdaki olay kontrol sözdizimi kullanılarak bir ağ veya kayıt üzerindeki bir değer değişikliği veya bildirilen bir olayın meydana gelmesi ile senkronize edilebilir:

Example

<statement> 
::= <event_control> <statement_or_null> 

<event_control> 
::= @ <identifier> 
||= @ ( <event_expression> ) 

<event_expression> 
::= <expression> 
||= posedge <SCALAR_EVENT_EXPRESSION> 
||= negedge <SCALAR_EVENT_EXPRESSION> 
||= <event_expression> <or <event_expression>>

* <SCALAR_EVENT_EXPRESSION>, tek bitlik bir değere çözümlenen bir ifadedir.

Ağlar ve kayıtlardaki değer değişiklikleri, bir ifadenin yürütülmesini tetikleyen olaylar olarak kullanılabilir. Bu, örtük bir olayı tespit etmek olarak bilinir. Verilog sözdizimi ayrıca, değişikliğin yönüne dayalı olarak, yani 1 değerine (poz) veya 0 değerine (negatif kenar) doğru olan değişikliği algılamanıza olanak tanır. Bilinmeyen ifade değerleri için pozlama ve ihmal davranışı aşağıdaki gibidir -

  • 1'den bilinmeyene ve bilinmeyenden 0'a geçişte bir olumsuzlama algılandı
  • 0'dan bilinmeyene ve bilinmeyenden 1'e geçişte bir poz algılandı

Prosedürler: Her Zaman ve İlk Bloklar

Verilog'daki tüm prosedürler, aşağıdaki dört Bloktan birinde belirtilmiştir. 1) İlk bloklar 2) Her zaman engeller 3) Görev 4) İşlev

İlk ve her zaman ifadeleri simülasyonun başlangıcında etkinleştirilir. İlk bloklar yalnızca bir kez yürütülür ve ifade bittiğinde etkinliği ölür. Buna karşılık, her zaman bloklar tekrar tekrar yürütülür. Etkinliği yalnızca simülasyon sonlandırıldığında ölür. Bir modülde tanımlanabilecek ilk ve her zaman blokların sayısında bir sınır yoktur. Görevler ve işlevler, diğer prosedürlerde bir veya daha fazla yerden etkinleştirilen prosedürlerdir.

İlk Bloklar

İlk ifadenin sözdizimi aşağıdaki gibidir -

<initial_statement> 
::= initial <statement>

Aşağıdaki örnek, simülasyonun başlangıcında değişkenlerin başlatılması için ilk ifadenin kullanımını göstermektedir.

Initial 
Begin 
   Areg = 0; // initialize a register 
   For (index = 0; index < size; index = index + 1) 
   Memory [index] = 0; //initialize a memory 
   Word 
End

İlk Blokların diğer bir tipik kullanımı, simüle edilen devrenin ana kısmına uyarıcı sağlamak için bir kez çalışan dalga biçimi açıklamalarının spesifikasyonudur.

Initial 
Begin 
   Inputs = ’b000000; 
   // initialize at time zero 
   #10 inputs = ’b011001; // first pattern 
   #10 inputs = ’b011011; // second pattern 
   #10 inputs = ’b011000; // third pattern 
   #10 inputs = ’b001000; // last pattern 
End

Her Zaman Engeller

"Her zaman" ifadesi, tüm simülasyon çalışması boyunca sürekli olarak tekrar eder. Always ifadesi için sözdizimi aşağıda verilmiştir.

<always_statement> 
::= always <statement>

Döngü niteliği nedeniyle 'her zaman' ifadesi, yalnızca bir tür zamanlama kontrolü ile birlikte kullanıldığında yararlıdır. Bir 'her zaman' ifadesi zamanın ilerlemesi için hiçbir yol sağlamıyorsa, 'her zaman' ifadesi bir simülasyon kilitlenme koşulu yaratır. Örneğin, aşağıdaki kod sonsuz bir sıfır gecikme döngüsü oluşturur -

Always areg = ~areg;

Yukarıdaki koda bir zamanlama kontrolü sağlamak, aşağıdaki örnekte olduğu gibi, potansiyel olarak yararlı bir açıklama oluşturur -

Always #half_period areg = ~areg;