Pemodelan Perilaku & Waktu di Verilog

Model perilaku di Verilog berisi pernyataan prosedural, yang mengontrol simulasi dan memanipulasi variabel dari tipe data. Semua pernyataan ini terkandung dalam prosedur. Setiap prosedur memiliki aliran aktivitas yang terkait dengannya.

Selama simulasi model perilaku, semua aliran yang ditentukan oleh pernyataan 'selalu' dan 'awal' dimulai bersamaan pada waktu simulasi 'nol'. Pernyataan awal dijalankan satu kali, dan pernyataan selalu dieksekusi secara berulang. Dalam model ini, variabel register a dan b diinisialisasi ke biner 1 dan 0 masing-masing pada waktu simulasi 'nol'. Pernyataan awal kemudian diselesaikan dan tidak dijalankan lagi selama simulasi dijalankan. Pernyataan awal ini berisi blok start-end (juga disebut blok sekuensial) pernyataan. Dalam blok tipe awal-akhir ini, a diinisialisasi terlebih dahulu diikuti oleh b.

Contoh Pemodelan Perilaku

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

Penugasan Prosedural

Tugas prosedural adalah untuk memperbarui variabel reg, integer, waktu, dan memori. Ada perbedaan yang signifikan antara penugasan prosedural dan penugasan berkelanjutan seperti yang dijelaskan di bawah ini -

Penugasan berkelanjutan mendorong variabel bersih dan dievaluasi serta diperbarui setiap kali operan input mengubah nilai.

Tugas prosedural memperbarui nilai variabel register di bawah kendali konstruksi aliran prosedural yang mengelilinginya.

Sisi kanan dari penugasan prosedural dapat berupa ekspresi apa pun yang mengevaluasi suatu nilai. Namun, pemilihan bagian di sisi kanan harus memiliki indeks konstan. Sisi kiri menunjukkan variabel yang menerima tugas dari sisi kanan. Sisi kiri penugasan prosedural dapat mengambil salah satu dari bentuk berikut -

  • register, integer, real, atau time variable - Penugasan ke referensi nama dari salah satu tipe data ini.

  • bit-pilih dari register, integer, real, atau variabel waktu - Sebuah tugas ke satu bit yang meninggalkan bit lainnya tidak tersentuh.

  • part-select dari register, integer, real, atau time variable - Part-select dari dua atau lebih bit yang bersebelahan yang membiarkan sisa bit tidak tersentuh. Untuk formulir pilih-bagian, hanya ekspresi konstan yang legal.

  • elemen memori - Satu kata dari memori. Perhatikan bahwa bit-pilih dan pilih-bagian adalah ilegal pada referensi elemen memori.

  • penggabungan salah satu dari yang di atas - Rangkaian dari empat bentuk sebelumnya dapat ditentukan, yang secara efektif mempartisi hasil ekspresi sisi kanan dan menetapkan bagian partisi, secara berurutan, ke berbagai bagian penggabungan.

Delay in Assignment (bukan untuk sintesis)

Dalam penugasan tertunda Δt unit waktu berlalu sebelum pernyataan dieksekusi dan penugasan kiri dibuat. Dengan penundaan intra-penugasan, sisi kanan segera dievaluasi tetapi ada penundaan Δt sebelum hasilnya ditempatkan di penugasan sebelah kiri. Jika prosedur lain mengubah sinyal sisi kanan selama Δt, itu tidak mempengaruhi output. Penundaan tidak didukung oleh alat sintesis.

Sintaksis

  • Procedural Assignmentvariabel = ekspresi

  • Delayed assignment# Δt variabel = ekspresi;

  • Intra-assignment delayvariabel = ekspresi # Δt;

Contoh

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. */

Memblokir Tugas

Pernyataan tugas prosedural pemblokiran harus dijalankan sebelum eksekusi pernyataan yang mengikutinya dalam blok berurutan. Pernyataan penetapan prosedural pemblokiran tidak mencegah pelaksanaan pernyataan yang mengikutinya dalam blok paralel.

Sintaksis

Sintaks untuk penetapan prosedural pemblokiran adalah sebagai berikut -

<lvalue> = <timing_control> <expression>

Di mana, lvalue adalah tipe data yang valid untuk pernyataan penugasan prosedural, = adalah operator penugasan, dan kontrol waktu adalah penundaan intra-penugasan opsional. Penundaan kontrol waktu dapat berupa kontrol penundaan (misalnya, # 6) atau kontrol peristiwa (misalnya, @ (posedge clk)). Ekspresi adalah nilai sisi kanan yang ditetapkan simulator ke sisi kiri. Operator = penugasan yang digunakan dengan memblokir penugasan prosedural juga digunakan oleh penugasan berkelanjutan prosedural dan penugasan berkelanjutan.

Contoh

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

Tugas Nonblocking (RTL)

Tugas prosedural non-pemblokiran memungkinkan Anda untuk menjadwalkan tugas tanpa memblokir aliran prosedural. Anda dapat menggunakan pernyataan prosedural non-pemblokiran kapan pun Anda ingin membuat beberapa tugas register dalam langkah waktu yang sama tanpa memperhatikan urutan atau ketergantungan satu sama lain.

Sintaksis

Sintaks untuk penetapan prosedural non-pemblokiran adalah sebagai berikut -

<lvalue> <= <timing_control> <expression>

Di mana lvalue adalah tipe data yang valid untuk pernyataan penugasan prosedural, <= adalah operator penugasan non-pemblokiran, dan kontrol waktu adalah pengontrol waktu intra-penugasan opsional. Penundaan kontrol waktu dapat berupa kontrol penundaan atau kontrol peristiwa (misalnya, @ (posedge clk)). Ekspresi adalah nilai sisi kanan yang ditetapkan simulator ke sisi kiri. Operator penetapan non-pemblokiran adalah operator yang sama yang digunakan simulator untuk operator relasional yang kurang dari orequal. Simulator menafsirkan operator <= menjadi operator relasional saat Anda menggunakannya dalam ekspresi, dan menafsirkan operator <= menjadi operator penugasan saat Anda menggunakannya dalam konstruksi penetapan prosedural non-pemblokiran.

Bagaimana simulator mengevaluasi tugas prosedural non-pemblokiran Ketika simulator menemukan tugas prosedural non-pemblokiran, simulator mengevaluasi dan menjalankan tugas prosedural non-pemblokiran dalam dua langkah sebagai berikut -

  • Simulator mengevaluasi sisi kanan dan menjadwalkan penugasan nilai baru untuk dilakukan pada waktu yang ditentukan oleh kontrol waktu prosedural. Simulator mengevaluasi sisi kanan dan menjadwalkan penugasan nilai baru untuk dilakukan pada waktu yang ditentukan oleh kontrol waktu prosedural.

  • Di akhir langkah waktu, di mana penundaan yang diberikan telah kedaluwarsa atau peristiwa yang sesuai telah terjadi, simulator menjalankan tugas dengan menetapkan nilai ke sisi kiri.

Contoh

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

Kondisi

Pernyataan bersyarat (atau pernyataan if-else) digunakan untuk membuat keputusan, apakah pernyataan dieksekusi atau tidak.

Secara formal, sintaksnya adalah sebagai berikut -

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

::= <statement> 
||= ;

<expression> dievaluasi; jika benar (yaitu, memiliki nilai yang bukan nol yang diketahui), pernyataan pertama dijalankan. Jika salah (memiliki nilai nol atau nilainya x atau z), pernyataan pertama tidak dijalankan. Jika ada pernyataan lain dan <ekspresi> salah, pernyataan lain dijalankan. Karena, nilai numerik dari ekspresi if diuji menjadi nol, pintasan tertentu dimungkinkan.

Misalnya, dua pernyataan berikut mengungkapkan logika yang sama -

if (expression) 
if (expression != 0)

Karena, bagian lain dari if-else adalah opsional, dapat terjadi kebingungan saat else dihilangkan dari urutan if bersarang. Ini diselesaikan dengan selalu mengaitkan else dengan yang terdekat sebelumnya jika itu kekurangan yang lain.

Contoh

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;

Konstruksi dari: if- else- if

Konstruksi berikut terjadi begitu sering sehingga perlu pembahasan terpisah singkat.

Example

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

Urutan if ini (dikenal sebagai konstruk if-else-if) adalah cara paling umum untuk menulis keputusan multi-arah. Ekspresi dievaluasi secara berurutan; jika ada ekspresi yang benar, pernyataan yang terkait dengannya dijalankan, dan ini mengakhiri seluruh rantai. Setiap pernyataan bisa berupa satu pernyataan atau satu blok pernyataan.

Bagian lain yang terakhir dari konstruksi if-else-if menangani kasus 'none of the above' atau default di mana tidak ada kondisi lain yang terpenuhi. Terkadang tidak ada tindakan eksplisit untuk default; dalam hal ini, trailing else dapat dihilangkan atau dapat digunakan untuk pengecekan error untuk menangkap kondisi yang tidak mungkin.

Pernyataan Kasus

Pernyataan kasus adalah pernyataan keputusan multi-arah khusus yang menguji apakah ekspresi cocok dengan salah satu dari sejumlah ekspresi lain, dan bercabang sesuai. Pernyataan kasus berguna untuk menjelaskan, misalnya, decoding dari instruksi mikroprosesor. Pernyataan kasus memiliki sintaks berikut -

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>

Ekspresi kasus dievaluasi dan dibandingkan dalam urutan yang tepat seperti yang diberikan. Selama pencarian linier, jika salah satu ekspresi item kasus cocok dengan ekspresi dalam tanda kurung, maka pernyataan yang terkait dengan item kasus tersebut dijalankan. Jika semua perbandingan gagal, dan item default diberikan, maka pernyataan item default dijalankan. Jika pernyataan default tidak diberikan, dan semua perbandingan gagal, maka tidak ada pernyataan item kasus yang dijalankan.

Terlepas dari sintaks, pernyataan case berbeda dari konstruksi multi-cara if-else-if dalam dua cara penting -

  • Ekspresi kondisional dalam konstruksi if-else-if lebih umum daripada membandingkan satu ekspresi dengan beberapa ekspresi lainnya, seperti dalam pernyataan case.

  • Pernyataan case memberikan hasil yang pasti ketika ada nilai x dan z dalam ekspresi.

Pernyataan Perulangan

Ada empat jenis pernyataan perulangan. Mereka menyediakan sarana untuk mengontrol eksekusi pernyataan nol, satu kali, atau lebih.

  • selamanya terus menjalankan pernyataan.

  • repeat mengeksekusi pernyataan beberapa kali.

  • sementara mengeksekusi pernyataan sampai ekspresi menjadi salah. Jika ekspresi diawali salah, pernyataan tersebut tidak dieksekusi sama sekali.

  • untuk kontrol eksekusi pernyataan terkait dengan proses tiga langkah, sebagai berikut -

    • Menjalankan tugas yang biasanya digunakan untuk menginisialisasi variabel yang mengontrol jumlah loop yang dijalankan

    • Mengevaluasi ekspresi — jika hasilnya nol, loop for keluar, dan jika bukan nol, loop for mengeksekusi pernyataan terkait dan kemudian melakukan langkah 3

    • Jalankan tugas yang biasanya digunakan untuk mengubah nilai variabel loopcontrol, lalu ulangi langkah 2

Berikut ini adalah aturan sintaks untuk pernyataan perulangan -

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

Kontrol Penundaan

Kontrol Penundaan

Eksekusi pernyataan prosedural dapat dikendalikan dengan penundaan dengan menggunakan sintaks berikut -

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

Contoh berikut menunda pelaksanaan tugas sebanyak 10 unit waktu -

# 10 rega = regb;

Tiga contoh berikutnya memberikan ekspresi mengikuti tanda angka (#). Pelaksanaan penundaan tugas dengan jumlah waktu simulasi yang ditentukan oleh nilai ekspresi.

Kontrol Acara

Pelaksanaan pernyataan prosedural dapat disinkronkan dengan perubahan nilai pada net atau register, atau terjadinya peristiwa yang dideklarasikan, dengan menggunakan sintaks kontrol peristiwa berikut -

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> adalah ekspresi yang menetapkan nilai satu bit.

Perubahan nilai pada net dan register dapat digunakan sebagai event untuk memicu eksekusi sebuah pernyataan. Ini dikenal sebagai mendeteksi kejadian implisit. Sintaks Verilog juga memungkinkan Anda mendeteksi perubahan berdasarkan arah perubahan — yaitu, menuju nilai 1 (posedge) atau menuju nilai 0 (negedge). Perilaku posedge dan negedge untuk nilai ekspresi yang tidak diketahui adalah sebagai berikut -

  • sebuah negedge terdeteksi pada transisi dari 1 ke tidak diketahui dan dari tidak diketahui ke 0
  • sebuah posedge terdeteksi pada transisi dari 0 ke tidak diketahui dan dari tidak diketahui ke 1

Prosedur: Selalu dan Pemblokiran Awal

Semua prosedur di Verilog ditentukan dalam salah satu dari empat Blok berikut. 1) Blok awal 2) Selalu blok 3) Tugas 4) Fungsi

Pernyataan awal dan selalu diaktifkan pada awal simulasi. Blok awal hanya dijalankan satu kali dan aktivitasnya mati saat pernyataan selesai. Sebaliknya, blok selalu dieksekusi berulang kali. Aktivitasnya hanya mati jika simulasi dihentikan. Tidak ada batasan jumlah blok awal dan selalu yang dapat ditentukan dalam modul. Tugas dan fungsi adalah prosedur yang diaktifkan dari satu atau beberapa tempat di prosedur lain.

Blok Awal

Sintaks untuk pernyataan awal adalah sebagai berikut -

<initial_statement> 
::= initial <statement>

Contoh berikut menggambarkan penggunaan pernyataan awal untuk inisialisasi variabel pada awal simulasi.

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

Penggunaan khas lain dari Blok awal adalah spesifikasi deskripsi bentuk gelombang yang dijalankan sekali untuk memberikan stimulus ke bagian utama rangkaian yang disimulasikan.

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

Selalu Memblokir

Pernyataan 'selalu' diulang terus menerus selama simulasi dijalankan. Sintaks untuk pernyataan selalu diberikan di bawah ini

<always_statement> 
::= always <statement>

Pernyataan 'selalu', karena sifat perulangannya, hanya berguna bila digunakan bersama dengan beberapa bentuk kontrol waktu. Jika pernyataan 'selalu' tidak memberikan waktu untuk maju, pernyataan 'selalu' menciptakan kondisi kebuntuan simulasi. Kode berikut, misalnya, membuat loop zero-delay tak terbatas -

Always areg = ~areg;

Memberikan kontrol waktu ke kode di atas membuat deskripsi yang berpotensi berguna — seperti dalam contoh berikut -

Always #half_period areg = ~areg;