Mengapa kait disimpulkan buruk?

22

Kompiler saya mengeluh tentang kait yang disimpulkan dalam loop kombinatorial saya ( always @(*), dalam Verilog). Saya juga diberitahu bahwa kait yang disimpulkan sebaiknya dihindari.

Apa sebenarnya yang salah dengan kait yang disimpulkan? Mereka tentu membuat loop kombinatorial lebih mudah untuk ditulis.

Randomblue
sumber
Akan lebih baik untuk memasukkan contoh HDL dari apa yang Anda lakukan
shuckc
Saya perhatikan pertanyaan ini telah dikutip beberapa kali baru-baru ini. Bagi siapa pun yang bukan pakar yang datang dengan cara ini, perhatikan bahwa semua jawaban, terlepas dari jawaban Oli Glaser, adalah kombinasi dari yang salah dan / atau tidak membantu.
EML
Ini lebih sedikit bahwa kait yang disimpulkan harus dihindari dan lebih banyak kait transparan pada umumnya harus dihindari kecuali jika Anda tahu persis apa yang Anda lakukan (perhatikan bahwa quartus agak menyesatkan memberikan "kait yang disimpulkan" dalam beberapa situasi yang tidak melibatkan kait transparan dan sangat aman).
Peter Green

Jawaban:

20

"Kait" berbeda dari "Flip-Flop" di mana FF hanya mengubah outputnya sebagai respons terhadap tepi jam. Sebuah kait dapat mengubah outputnya sebagai respons terhadap sesuatu selain jam. Sebagai contoh, SR-Latch memiliki set dan input reset dan jika salah satu dari mereka aktif maka output dapat berubah. Dimana sebagai SR-FF hanya merespon satu set atau reset ketika ada juga tepi jam.

Dalam FPGA, Anda ingin logika Anda sepenuhnya sinkron. Berarti bahwa semua elemen penyimpanan (seperti FF) semuanya di-clock dari satu sumber clock tunggal. Apa pun yang tidak sinkron dengan jam itu perlu diperlakukan dengan sangat hati-hati jika tidak, kesalahan waktu akan terjadi.

Sebuah kait pada dasarnya adalah elemen penyimpanan yang tidak sinkron. Ia tidak memiliki input jam, dan karenanya tidak dapat disinkronkan dengan jam apa pun. Saya harus mencatat bahwa ada FF dengan reset dan reset input asynchronous, dan ini harus diperlakukan dengan perawatan yang sama seperti kait normal.

Mengalami semua masalah waktu yang dapat disebabkan oleh kait adalah jauh melampaui apa yang dapat dibahas di sini, tetapi izinkan saya memberi Anda satu contoh:

Katakanlah Anda memiliki SR-Latch, dan Anda ingin mengaturnya setiap kali penghitung 8-bit mencapai nilai tertentu. Saya tidak yakin kode Verilog akan seperti apa, tetapi dalam VHDL kodenya adalah: set <= '1' saat hitung = "11010010" else '0'; Sinyal set tersebut masuk ke input yang ditetapkan pada SR-Latch kami.

Logika yang dihasilkan adalah murni kombinatorial; campuran dan-gerbang, atau-gerbang, dan inverter (Atau LUT). Tetapi jalur sinyal melalui logika kombinatorial tidak selalu sempurna dan sinyal "set" dapat memiliki gangguan di dalamnya. Jalur sinyal melalui kelompok gerbang tertentu bisa memakan waktu lebih lama dari kelompok lain, menyebabkan output yang disetel aktif sejenak sebelum output menetap ke keadaan akhir.

Kesalahan output ini dapat menyebabkan SR-Latch kami diatur, meskipun tidak seharusnya. Jika kita beralih dari SR-Latch ke SR-FF, clock dari jam yang sama dengan penghitungnya, maka SR-FF akan menunggu satu siklus clock penuh sebelum mengubah keadaan. Intinya ia akan menunggu sinyal yang disetel menetap sebelum melihatnya.

Jika jalur melalui logika kombinatorial untuk sinyal yang disetel hanya dialihkan secara berbeda (menyebabkan penundaan yang berbeda), maka perilaku kesalahan juga akan berubah. Logikanya mungkin bekerja dengan baik, tetapi kemudian karena Anda mengubah sesuatu yang sama sekali tidak berhubungan, logika ini dirutekan secara berbeda sehingga bug muncul. Suhu dan tegangan juga akan mengubah timing sinyal, dan dengan demikian dapat mengubah perilaku kesalahan.

Ketidakpastian dalam waktu ini adalah mengapa Anda harus menghindari kait dalam logika Anda. FF jauh lebih aman untuk digunakan. Inilah sebabnya mengapa kompiler Anda memperingatkan Anda tentang kait, karena mudah untuk keliru membuat kait dan Anda mungkin tidak menginginkannya di sana.

Tentu saja, kadang-kadang kait diperlukan. Anda hanya perlu menggunakannya sangat jarang, hanya ketika benar-benar diperlukan, dan kemudian Anda harus merancang logika dengan benar sehingga tidak ada gangguan yang mungkin terjadi.


sumber
Saya akan berharap bahwa jika seseorang secara eksplisit menentukan kait di Verilog atau bahasa lain, dan jika seseorang merancang rangkaian sehingga akan bekerja dengan benar dengan kombinasi penundaan kombinatorial yang memberi makan kait (artinya bahwa apa pun yang menghasilkan sinyal yang akan digabungkan untuk kait, akan melakukannya sedemikian rupa sehingga bahkan dengan kombinasi kasus terburuk dari jalur logika penundaan nol dan jalur logika penundaan maksimum, persyaratan waktu untuk kait masih akan terpenuhi), synthesizer harus menghasilkan sirkuit kerja di mana kait itu sendiri memiliki penundaan non-negatif. Namun, jika ...
supercat
... seseorang menggunakan logika kombinatorial dan umpan balik tanpa menentukan node yang harus memiliki penundaan non-negatif, apa saja bisa terjadi. Saya menghargai bahwa logika sinkron lebih mudah dirancang daripada async, tetapi banyak perangkat perlu mematikan jam ketika mereka tidur sehingga menghemat daya, tanpa benar-benar mati. Mungkin menarik untuk memiliki perangkat yang benar-benar sinkron, tetapi telah dikaitkan dengan setiap pin beberapa output logika untuk "jalankan jika pin tinggi" dan "jalankan jika pin rendah", bersama dengan kemampuan untuk menghasilkan jam jika setiap pin yang diindikasikan diperlukan.
supercat
Kemampuan seperti itu akan mengurangi banyak kebutuhan untuk logika async, karena input yang tiba ketika perangkat sedang tidur dapat memperkuat osilator internal dan sirkuit cukup lama untuk input diproses dan diakui. Fitur seperti itu akan jauh lebih fleksibel daripada memiliki satu pin "wake-up", tetapi desain single-wakeup tampak biasa. Apakah pendekatan multi-bangun seperti yang saya jelaskan mengonsumsi silikon berlebih? Saya akan berpikir persyaratan silikon akan sangat kecil dibandingkan dengan yang lainnya on-chip.
supercat
13

Apa yang membuat kait disimpulkan?
Untuk logika kombinatorial, output rangkaian adalah fungsi input saja dan tidak boleh mengandung memori atau keadaan internal (kait).

Di Verilog, sebuah variabel akan menyimpan nilai sebelumnya jika tidak diberi nilai dalam blok selalu . Kait harus dibuat untuk menyimpan nilai sekarang ini.

Pernyataan if-else yang tidak lengkap akan menghasilkan kait. Sebuah jika-lain pernyataan dianggap "tidak lengkap" jika keadaan keluaran tidak didefinisikan untuk semua kondisi masukan yang mungkin. Hal yang sama berlaku untuk pernyataan kasus yang tidak lengkap , atau pernyataan kasus yang tidak memiliki item : default .

Mengapa kait disimpulkan buruk?
Kait yang disimpulkan dapat berfungsi sebagai 'tanda peringatan' bahwa desain logika mungkin tidak dilaksanakan sebagaimana dimaksud. Pernyataan penting jika-lain atau kasus mungkin hilang dari desain.

Kait dapat menyebabkan masalah waktu dan kondisi lomba. Mereka dapat menyebabkan umpan balik kombinatorial - routing output kembali ke input - yang dapat diprediksi.

Untuk menghindari membuat kait yang disimpulkan:

  • Sertakan semua cabang dari jika atau kasus pernyataan
  • Tetapkan nilai untuk setiap sinyal output di setiap cabang
  • Gunakan tugas standar pada awal prosedur, sehingga setiap sinyal akan ditetapkan.

Beberapa bagian diparafrasekan dari "FPGA Prototyping oleh Verilog Examples" oleh P. Chu

dext0rb
sumber
2
"FPGA Prototyping oleh Verilog Examples" adalah buku yang bagus untuk mempelajari Verilog praktis untuk Sintesis. Ini memiliki beberapa contoh desain yang bagus mulai dari hal-hal kombinatorial dasar hingga sekuensial dasar, yang mengarah ke desain yang bermanfaat seperti UART, VGA, prosesor soft core (Picoblaze) dan bahkan game Pong. Ini juga mencakup testbench dasar dan simulasi. @Rombomblue, Anda harus mengambil salinannya jika belum memilikinya. Saya percaya dia juga melakukan versi VHDL juga.
Oli Glaser
8

Kait sangat rumit untuk digunakan dalam FPGA atau CPLD, sehingga banyak orang yang benar-benar menghindarinya. Salah satu alasannya adalah bahwa banyak FPGA tidak memiliki kait bawaan, sehingga dibuat dari gerbang logika - ini dapat menyebabkan masalah pengaturan waktu yang tidak tepat.
Anda juga tidak memiliki kendali atas penundaan waktu dan kondisi balapan saat menggunakan kait (kecuali ada elemen asli)

Saya akan menyarankan agar tidak menggunakan kait kecuali Anda benar-benar tidak dapat melakukannya tanpa mereka (misalnya meminjam waktu untuk memenuhi frekuensi clock max yang diperlukan) dan menggunakan teknik pengkodean untuk membuat kait secara tidak sengaja lebih kecil kemungkinannya terjadi.

Oli Glaser
sumber
6

Desain logika berurutan yang dibangun dengan menggunakan logika kombinatorial dan umpan balik umumnya membuat asumsi yang tampaknya masuk akal ketika menggunakan gerbang fisik: bahwa output gerbang tidak akan berubah sebagai respons terhadap perubahan input, sampai beberapa saat setelah input benar-benar berubah. Ada beberapa kesempatan di mana asumsi itu mungkin tidak berlaku ketika menggunakan gerbang nyata (misalnya jika gerbang NOR cepat dan inverter cepat keduanya digerakkan oleh sinyal yang naik perlahan dari VSS ke VDD, dan jika inverter beralih pada 1,2 volt sedangkan NOR gerbang tidak beralih sampai 1,7 volt, gerbang NOR mungkin melihat output dari inverter turun sebelum ia melihat bahwa sinyal yang perlahan naik sudah tinggi) tetapi masalah seperti itu biasanya dapat diatasi dengan menambahkan buffer setiap kali perubahan lambat sinyal dialihkan ke lebih dari satu tujuan. Sayangnya,

Masalahnya adalah bahwa kecuali jika secara eksplisit menginstruksikan sebaliknya, kompiler FPGA dapat secara sewenang-wenang mengganti sirkuit kombinatorial dengan sirkuit yang sama sekali berbeda yang memiliki perilaku steady-state yang sama, tetapi mungkin memiliki waktu yang sama sekali berbeda. Sebagai contoh, misalkan fungsi kombinatorial kompleks F mengambil enam input U hingga Z. F diumpankan langsung ke sirkuit P, dan (F NAND Z) diumpankan ke sirkuit Q. Kompilator mungkin menyadari bahwa nilai yang diumpankan ke Q hanya akan bergantung pada F ketika Z tinggi, dan dapat menghitung fungsi F 'yang seperti F kecuali bahwa Z dianggap tinggi; Q kemudian dapat diberi makan dengan (F 'NAND Z) daripada (F NAND Z). Sangat mungkin bahwa realisasi P yang paling efisien akan memiliki lima penundaan gerbang, tetapi realisasi Q yang paling efisien hanya akan memiliki dua. Demikian,

Jika sebuah sirkuit memiliki loop umpan balik kombinatorial, kompiler FPGA harus menambahkan node sinyal fisik yang, secara fisik, akan memiliki penundaan positif (loop umpan balik nol-keterlambatan tidak dapat ada di dunia nyata), tetapi tidak ada jaminan bahwa simpul seperti itu akan ditambahkan di tempat-tempat yang diperlukan untuk membuat rangkaian berperilaku seperti yang diinginkan. Bahkan tidak ada jaminan bahwa sedikit perubahan pada desain tidak akan menyebabkan kompiler berubah dari penempatan sewenang-wenang yang bekerja di dunia nyata, ke penempatan sewenang-wenang yang berbeda yang kebetulan gagal.

supercat
sumber
0

Detail tentang cara menangkap kait dalam desain dijelaskan secara singkat di tautan ini.

https://www.doulos.com/knowhow/fpga/latches/

pengguna3303020
sumber
1
Selamat datang di EE.SE! Anda dapat meningkatkan jawaban Anda dengan memasukkan beberapa detail yang relevan dari tautan. Ini memastikan bahwa jawaban Anda berkualitas tinggi walaupun halaman aslinya hilang.
David