Perbedaan antara pemblokiran dan pemblokiran tugas Verilog

15

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?

Void Star
sumber

Jawaban:

21

cukup yakin bahwa tugas nonblocking adalah berurutan sementara tugas pemblokiran paralel.

Tugas pemblokiran mengeksekusi "secara seri" karena tugas pemblokiran memblokir eksekusi pernyataan berikutnya sampai selesai. Oleh karena itu hasil dari pernyataan berikutnya mungkin tergantung pada yang pertama diselesaikan.

Penugasan non-pemblokiran dijalankan secara paralel karena ini menjelaskan penugasan yang semuanya terjadi pada waktu yang sama. Hasil dari pernyataan pada baris ke-2 tidak akan tergantung pada hasil dari pernyataan pada baris ke-1. Sebaliknya, baris ke-2 akan mengeksekusi seolah-olah baris ke-1 belum terjadi.

Foton
sumber
Jadi bagaimana dengan menetapkan pernyataan? Apakah mereka hanya satu kelas saja?
Void Star
4
Ya, assignpernyataan muncul di luar selalu blok dan umumnya digunakan untuk menggambarkan logika kombinatorial (tidak terkunci) (sementara selalu memblokir, dengan beberapa pengecualian, menggambarkan logika berurutan). AFAIK, assignpernyataan selalu mengeksekusi "secara paralel" setiap kali LHS mereka memiliki perubahan nilai.
The Photon
Oke ... Saya mulai mendapat kesan bahwa Verilog bukan bahasa yang dirancang dengan elegan. Ini akan menjadi seperti belajar C dulu.
Void Star
1
Verilog dirancang untuk "menggambarkan" perangkat keras yang sudah ada. Menggunakannya sebagai bahasa untuk mendesain (mensintesis) perangkat keras adalah peretasan.
The Photon
4
jika Verilog "seperti belajar C" adalah masalah, lihat VHDL. Beberapa orang memiliki preferensi yang cukup kuat untuk satu atau yang lain. Bagi sebagian orang, VHDL terlalu bertele-tele. Bagi saya, lebih baik dipikirkan. (Semantik tugas sinyal / variabel jauh lebih jelas daripada memblokir / bukan misalnya). stackoverflow.com/questions/13954193/… dan sigasi.com/content/vhdls-crown-jewel Anda dapat memilih atau membencinya. Tapi itu patut dilihat.
Brian Drummond
6

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.

  1. Jangan mengakses reg yang diatur dengan tugas pemblokiran di dalam blok selalu berurutan dari luar blok selalu ditugaskan di dalamnya.
  2. Jangan mencampur tugas pemblokiran dan nonblok ke reg yang sama.

Melanggar aturan ini kemungkinan akan mengakibatkan kegagalan sintesis dan / atau perbedaan perilaku antara simulasi dan sintesis.

Peter Green
sumber
"" Jangan mengakses reg yang ditetapkan dengan tugas pemblokiran di dalam blok selalu berurutan dari luar blok selalu ditugaskan. "" Bisakah Anda jelaskan itu?
user125575
Blok selalu berurutan yang berbeda tidak memiliki urutan yang ditentukan. Jadi, membaca "reg" yang ditetapkan dengan penilaian pemblokiran dalam satu blok selalu dari yang lain selalu akan menyebabkan perilaku yang tidak terduga.
Peter Green
Dan bahkan jika tampaknya berfungsi dalam simulasi, alat sintesis harus melihat itu dan berkata "tidak". Saya menggunakan reg lokal untuk vars menengah, dan memastikan bahwa mereka selalu ditugaskan pada setiap jam sebelum dibaca, sehingga tidak ada 'penyimpanan' tersirat.
greggo
IIRC setidaknya dalam kuartus hanya dianggap sebagai peringatan, bukan kesalahan.
Peter Green
5

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 dalam always_comburutan. Namun, perbedaan antara urutan waktu dan paralel sama sekali tidak membuat perbedaan dalam kasus ini karena always_combblok 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.

bangsawan
sumber
Dalam gaya pengkodean perilaku ( dibandingkan dengan RTL ), perbedaan antara pemblokiran dan non-pemblokiran mungkin relevan. Dalam beberapa kasus, alat sintesis mungkin dapat menyimpulkan RTL yang secara fungsional setara dari desain komponen perilaku.
nobar
Tentu saja mode prosedural SystemVerilog, berlaku terutama untuk initialpernyataan di dalam programblok, menggunakan penugasan (urutan waktu) secara eksklusif. Ini berguna untuk desain testbench , tetapi umumnya tidak untuk spesifikasi RTL.
nobar