Bagaimana pernyataan Verilog “selalu” diimplementasikan dalam perangkat keras?


8

alwaysPernyataan Verilog , yaitu

always @(/* condition */)
    /* block of code */

mengeksekusi block of codekapan pun conditionpuas. Bagaimana alwaysblok seperti itu diterapkan pada perangkat keras?


Saya pikir itu sangat bergantung pada apa yang block of codeadalah ..
m.Alin

1
Dan apakah kondisinya posedge xatau hanyax
Justin

@ Justin: Mari kita asumsikan tidak ada posedge.
Randomblue

Jawaban:


16

Pertama, perhatikan bahwa tidak semua desain Verilog dapat disintesis. Biasanya, hanya subset konstruksi yang sangat spesifik yang dapat digunakan dalam desain yang harus direalisasikan dalam perangkat keras.

Satu batasan penting yang muncul adalah bahwa setiap regvariabel hanya dapat ditugaskan dalam paling banyak satu alwayspernyataan. Dengan kata lain, regs memiliki afinitas terhadap alwaysbalok.

Jenis alwaysblok berikut umumnya dapat digunakan.

always @(*) begin
    // combinational
end

always @(posedge clk) begin
    // sequential
end

Dalam kasus sebelumnya, yang *menunjukkan bahwa blok harus dieksekusi setiap kali sinyal yang digunakan dalam blok berubah atau, ekuivalen, bahwa blok harus dieksekusi terus menerus. Oleh karena itu, regs yang memiliki afinitas terhadap alwaysblok kombinasional diimplementasikan sebagai sinyal yang dihitung dari sinyal lain menggunakan logika kombinasional, yaitu gerbang.

Register yang memiliki afinitas dengan alwaysblok dari tipe yang terakhir, di sisi lain, adalah output dari D flip-flop yang di-clock pada tepi naik clk(edge ​​jatuh jika negedgedigunakan). Input ke sandal jepit, sekali lagi, dihitung dengan logika kombinasional dari sinyal lain.

Pertimbangkan contoh berikut yang agak dibuat-buat.

reg out, out_n;
always @(*) begin
    out_n = !out;
end
always @(posedge clk) begin
    out <= !out;
end

Di sini, out_ndikaitkan dengan alwaysblok pertama , outdengan yang kedua. out_nakan diimplementasikan dengan satu gerbang BUKAN tunggal yang akan out_ndigerakkan dan diusir out(perhatikan bahwa itu adalah logika kombinasional murni). Di sisi lain, outakan digerakkan oleh flip-flop yang berasal dari clk. Input ke flip-flop lagi akan dihitung oleh gerbang NOT dari out(yang digerakkan oleh flip-flop tersebut). Optimalisasi synthesizer akan menggabungkan dua gerbang NOT dan menggunakan satu gerbang NOT dan satu flip-flop.

Bergantung pada perangkat keras yang Anda miliki, jenis konstruksi lainnya dapat digunakan. Misalnya, jika sandal jepit memiliki pengaturan ulang asinkron, konstruk berikut juga dapat disintesis.

always @(posedge clk or posedge rst) begin
    if (rst)
        // reset
    else
        // sequential
end

Terima kasih. Mengenai itu *, saya pikir itu menunjukkan bahwa blok harus dieksekusi setiap kali ada sinyal dalam blok yang berubah (berlawanan dengan desain ).
Randomblue

@Rombomblue, Anda benar, saya akan memperbaiki jawabannya. Perhatikan, bagaimanapun, bahwa keduanya setara dalam perilaku.
avakar

Benar; cukup adil!
Randomblue

2

Sebuah alwaysblok yang umum digunakan untuk menggambarkan sebuah flip-flop, kait, atau multiplexer. Kode akan diimplementasikan dengan flip-flop, latch, atau multiplexer.

Dalam FPGA flip-flop dan kait umumnya hanya dua konfigurasi yang berbeda dari perangkat register tujuan umum. Multiplexer akan dibangun dari satu atau beberapa elemen logika tujuan umum (LUT).

Secara umum, ada dua cara untuk mendesain dengan Verilog:

  1. Visualisasikan logika yang Anda inginkan dalam hal gerbang dan register, lalu cari tahu cara menggambarkannya di Verilog. Buku panduan sintesis dari vendor FPGA atau vendor alat sintesis memberikan pelat ketel untuk struktur paling umum yang mungkin ingin Anda gunakan.

  2. Cukup tulis Verilog dan jangan khawatir tentang seperti apa perangkat keras yang mendasarinya. Namun, bahkan jika Anda melakukan ini, Anda masih harus tahu apa itu dan apa yang tidak dapat disintesis. Jadi sekali lagi, Anda akan melihat ke boilerplate yang disediakan oleh vendor alat Anda dan menyesuaikannya dengan aplikasi Anda.

EDIT

Jawaban Avakar adalah jawaban yang jauh lebih baik untuk pertanyaan Anda, tetapi ini mendorong beberapa diskusi menarik tentang perbedaan antara Xilinx dan Altera jadi saya tidak akan menghapusnya.


"flip-flop dan kait umumnya hanya dua konfigurasi yang berbeda" Apakah mereka? Saya berharap kait diimplementasikan dengan LUT (dengan hati-hati jika LUT tidak bebas kesalahan).
avakar

@avakar, saya tahu bahwa di semua Xilinx FPGAs (atau setidaknya semua yang baru-baru ini jauh) kait menggunakan perangkat keras yang sama seperti flip-flop, berbeda hanya dengan satu bit dalam bitstream konfigurasi. Saya tidak yakin dengan merek lain.
Kevin Cathcart

Hmm. Beberapa desain Altera yang lebih lama memiliki jalur umpan balik yang memungkinkan LUT digunakan untuk mengimplementasikan kait. Sepertinya perutean utama mungkin diperlukan untuk mengimplementasikan kait sama sekali pada desain yang lebih baru. Ini tidak mengherankan, karena dalam desain RTL modern, kait yang sebenarnya (bukan sandal jepit) jarang diinginkan.
Kevin Cathcart

@avakar, saya lebih akrab dengan Xilinx, di mana perangkat register dapat dikonfigurasi sebagai flip-flop atau kait. Jika itu tidak mungkin di Altera atau vendor lain, itu akan membuat saran umum "jangan mendesain dengan kait" bahkan lebih kuat.
The Photon

@KevinCathcart dan Photon: Saya mengerti, saya tidak terbiasa dengan Xilinx, hanya dengan seri Altera Cyclone, yang tidak memiliki sirkuit kait khusus.
avakar

0

Seperti yang telah dikatakan, tidak semua blok dapat disintesis. Ada juga beberapa blok yang akan diterima alat sintesis tetapi yang akan menghasilkan hasil yang berbeda dari yang akan dihasilkan oleh simulator.

Pertama dari daftar sensitivitas. Aturan biasanya adalah harus mengandung konstruksi deteksi tepi saja (dan biasanya ada pilihan kombinasi yang mungkin terbatas) atau harus mengandung (mungkin melalui penggunaan * atau selalu_comb systemverilog) setiap sinyal yang digunakan sebagai input ke blok. Kami menyebut yang pertama sebagai blok kombinatorial dan yang terakhir sekuensial atau blok. Biasanya jika Anda hanya memasukkan subset input dalam alat sintesis blok kombinatorial hanya akan mengabaikan Anda dan bertindak seolah-olah daftar lengkap telah ditentukan (membuat simulasi / sintesis ketidakcocokan)

Tugas pemblokiran kedua vs noblocking. Dalam blok kombinatorial perbedaannya tidak terlalu penting, tetapi dalam blok sekuensial itu sangat berarti.

Dalam blok sekuensial, tugas nonblocking memodelkan register secara langsung ketika memblokir variabel model tugas (yang mungkin atau mungkin tidak menyiratkan register tergantung pada urutan pengaturan dan pembacaan). Sebagai aturan, "reg" yang ditetapkan menggunakan pemblokiran assigments dalam blok sekuensial hanya boleh dibaca di blok yang sama dan pemblokiran dan nonblocking assingment tidak boleh dicampur pada "reg" yang sama.

Mencampur tugas pemblokiran dan nonblocking ke item yang sama cenderung menyebabkan kegagalan sintesis. Membuat penilaian pemblokiran dalam satu blok dan membacanya di blok lain kemungkinan akan menyebabkan ketidaksesuaian simulasi / sintesis (dan bahkan mungkin ketidakcocokan antara berbagai simulasi berjalan).

Sekarang kita memiliki aturan dasar dari cara kita dapat mempertimbangkan bagaimana kompiler mengubah kode menjadi logika.

Langkah pertama adalah membuka gulungan semua loop. Ini berarti bahwa loop harus memiliki jumlah iterasi maksimum yang dapat ditentukan pada waktu sintesis atau Anda akan mendapatkan kegagalan sintesis.

Kemudian alat dapat menganalisis aliran kontrol dari blok dan mengubahnya menjadi aliran data. Setiap variabel menjadi satu atau lebih sinyal. Setiap pernyataan jika atau konstruksi serupa menjadi satu atau lebih multiplekser yang memilih set hasil mana yang akan benar-benar digunakan.

Alat tersebut kemungkinan akan mencoba dan menerapkan beberapa optmisations.

Dalam kuartus Anda dapat melihat hasil dari proses ini setelah membangun proyek Anda dengan masuk ke "tools-> netlist viewers-> rtl viewer".

Setelah menghasilkan representasi struktural ini dalam hal elemen logika abstrak, alat kemudian akan melanjutkan untuk memetakan elemen-elemen abstrak ke sumber daya yang sebenarnya dimiliki chip.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.