Saya sedang membaca halaman ini http://www.asic-world.com/verilog/verilog_one_day3.html ketika saya menemukan yang berikut:
Kami biasanya harus mengatur ulang sandal jepit, sehingga setiap kali jam melakukan transisi dari 0 ke 1 (posedge), kami memeriksa apakah pengaturan ulang dinyatakan (pengaturan ulang sinkron), kemudian kami melanjutkan dengan logika normal. Jika kita melihat lebih dekat kita melihat bahwa dalam kasus logika kombinasional kita memiliki "=" untuk penugasan, dan untuk blok sekuensial kita memiliki operator "<=". Ya, "=" sedang memblokir tugas dan "<=" adalah tugas yang bukan blokir. "=" mengeksekusi kode secara berurutan di dalam sebuah awal / akhir, sedangkan nonblocking "<=" dijalankan secara paralel.
Saya cukup yakin bahwa tugas nonblocking adalah berurutan sementara tugas pemblokiran paralel. Setelah semua, Anda dapat membuat tugas pemblokiran dengan menetapkan pernyataan di luar selalu blok, dan mereka semua berjalan secara paralel. Apakah ini kesalahan, atau apakah perilaku berbeda di dalam blok selalu? Dan, jika perilaku berbeda di dalam blok selalu, bisakah tugas nonblocking dibuat di luar blok selalu?
assign
pernyataan muncul di luar selalu blok dan umumnya digunakan untuk menggambarkan logika kombinatorial (tidak terkunci) (sementara selalu memblokir, dengan beberapa pengecualian, menggambarkan logika berurutan). AFAIK,assign
pernyataan selalu mengeksekusi "secara paralel" setiap kali LHS mereka memiliki perubahan nilai.Menetapkan pernyataan tidak "memblokir" atau "tidak menghalangi", mereka "berkelanjutan". Output dari statement assign selalu sama dengan fungsi yang ditentukan dari inputnya. Tugas "pemblokiran" dan "nonblocking" hanya ada dalam blok selalu.
Tugas pemblokiran segera mempengaruhi setelah diproses. Tugas nonblocking terjadi pada akhir pemrosesan "time delta" saat ini.
selalu blok dapat digunakan untuk memodelkan logika kombinatorial atau sekuensial (systemverilog memiliki always_comb dan always_ff untuk membuat ini eksplisit). Ketika memodelkan logika kombinatorial biasanya lebih efisien untuk digunakan = tetapi biasanya tidak terlalu masalah.
Saat memodelkan logika berurutan (mis. Selalu @ (posedge clk)) Anda biasanya menggunakan asumsi nonblocking. Ini memungkinkan Anda untuk menentukan "keadaan setelah ujung jam" dalam hal "keadaan sebelum ujung jam".
Kadang-kadang berguna untuk menggunakan tugas pemblokiran dalam urutan selalu blok sebagai "variabel". Jika Anda melakukan ini, maka ada dua aturan utama yang perlu diingat.
Melanggar aturan ini kemungkinan akan mengakibatkan kegagalan sintesis dan / atau perbedaan perilaku antara simulasi dan sintesis.
sumber
Istilah Blocking assignment membingungkan orang karena kata blocking sepertinya menyarankan logika sekuensial waktu. Tetapi dalam logika yang disintesis itu tidak berarti ini , karena semuanya beroperasi secara paralel .
Mungkin istilah yang kurang membingungkan adalah penugasan langsung , yang masih akan membedakan hasil antara logika kombinasional dari input ke elemen memori yang tidak transparan (misalnya register jam), yang dapat menunda penugasan .
Dari sudut pandang legalistik, semuanya berjalan dengan sangat baik. Anda dapat, pada kenyataannya, mempertimbangkan
=
untuk menjadi operasi pemblokiran (urutan waktu) bahkan dalamalways_comb
urutan. Namun, perbedaan antara urutan waktu dan paralel sama sekali tidak membuat perbedaan dalam kasus ini karenaalways_comb
blok didefinisikan untuk mengulangi sampai urutan instruksi menyatu pada keadaan stabil - yang persis apa yang akan dilakukan oleh sirkuit perangkat keras (jika memenuhi waktu Persyaratan).Subset yang disintesis dari Verilog (dan terutama SystemVerilog) sangat sederhana dan mudah digunakan - setelah Anda mengetahui idiom yang diperlukan. Anda hanya harus melewati penggunaan cerdas dari terminologi yang terkait dengan apa yang disebut elemen perilaku dalam bahasa.
sumber
initial
pernyataan di dalamprogram
blok, menggunakan penugasan (urutan waktu) secara eksklusif. Ini berguna untuk desain testbench , tetapi umumnya tidak untuk spesifikasi RTL.