Manufaktur industri
Industri Internet of Things | bahan industri | Pemeliharaan dan Perbaikan Peralatan | Pemrograman industri |
home  MfgRobots >> Manufaktur industri >  >> Industrial programming >> Verilog

Dasar Modul Verilog: Struktur & Sintaks

Sebuah module adalah blok kode Verilog yang mengimplementasikan fungsionalitas tertentu. Modul dapat disematkan dalam modul lain dan modul tingkat atas dapat berkomunikasi dengan modul tingkat bawahnya menggunakan port input dan output mereka.

Sintaks

Sebuah module harus diapit dalam kata kunci module dan endmodule. Nama modul harus diberikan segera setelah kata kunci module dan daftar port opsional dapat dideklarasikan juga. Perhatikan bahwa port yang dideklarasikan dalam daftar deklarasi port tidak dapat dideklarasikan ulang dalam tubuh modul.

  module <name> ([port_list]); // Isi modul endmodule // Modul dapat memiliki portlist kosong module name; // Isi modul endmodule  

Semua deklarasi variabel, pernyataan dataflow, fungsi atau tugas dan instance modul bawahnya jika ada, harus didefinisikan dalam kata kunci module dan endmodule. Terdapat beberapa modul dengan nama berbeda dalam file yang sama dan dapat didefinisikan dalam urutan apa pun.

Contoh

Modul dff mewakili D flip flop yang memiliki tiga port input d, clk, rstn dan satu port output q. Isi modul menggambarkan bagaimana D flip flop harus berperilaku untuk berbagai kombinasi input. Di sini, input d selalu ditugaskan ke output q pada tepi positif jam jika rstn tinggi karena itu adalah reset aktif rendah.

  // Modul bernama "dff" memiliki 3 input dan 1 port output module dff ( input d, input clk, input rstn, output reg q); // Isi modul always @ (posedge clk) begin if (!rstn) q <= 0; else q <= d; end endmodule  

Skema Hardware

Modul ini akan dikonversi menjadi sirkuit digital berikut selama sintesis.

Perhatikan bahwa Anda tidak dapat menulis kode apa pun di luar modul !

Tujuan dari suatu modul apa?

Sebuah modul mewakili unit desain yang mengimplementasikan karakteristik perilaku tertentu dan akan dikonversi menjadi sirkuit digital selama sintesis. Kombinasi input apa pun dapat diberikan ke modul dan ia akan memberikan output yang sesuai. Ini memungkinkan modul yang sama module untuk digunakan kembali untuk membentuk modul yang lebih besar yang mengimplementasikan hardware yang lebih kompleks.

Misalnya, DFF yang ditunjukkan di atas dapat diantre untuk membentuk register geser.

  module shift_reg ( input d, input clk, input rstn, output q); wire [2:0] q_net; dff u0 (.d(d), .clk(clk), .rstn(rstn), .q(q_net[0])); dff u1 (.d(q_net[0]), .clk(clk), .rstn(rstn), .q(q_net[1])); dff u2 (.d(q_net[1]), .clk(clk), .rstn(rstn), .q(q_net[2])); dff u3 (.d(q_net[2]), .clk(clk), .rstn(rstn), .q(q)); endmodule  

Skema Hardware

Perhatikan bahwa instance dff dihubungkan bersama dengan kabel seperti yang dijelaskan oleh modul RTL Verilog.

Alih-alih membangun dari blok yang lebih kecil untuk membentuk blok desain yang lebih besar, yang sebaliknya juga dapat dilakukan. Pertimbangkan pembagian mesin GPU sederhana menjadi komponen yang lebih kecil sehingga masing-masing dapat direpresentasikan sebagai modul yang mengimplementasikan fitur tertentu. Mesin GPU yang ditunjukkan di bawah ini dapat dibagi menjadi lima sub-blok berbeda di mana masing-masing melakukan fungsionalitas tertentu. Unit antarmuka bus mendapatkan data dari luar ke dalam desain, yang kemudian diproses oleh unit lain untuk mengekstrak instruksi. Unit lain di bawah garis memproses data yang disediakan oleh unit sebelumnya.

Setiap sub-blok dapat direpresentasikan sebagai module dengan seperangkat sinyal input dan output untuk komunikasi dengan modul lain dan setiap sub-blok dapat dibagi lagi menjadi blok yang lebih halus sesuai kebutuhan.

Apa itu modul tingkat atas?

Sebuah modul top-level adalah modul yang berisi semua modul lain. Sebuah modul tingkat atas tidak diinstanisasi dalam modul apa pun.

Misalnya, modul desain biasanya diinstanisasi dalam modul testbench tingkat atas sehingga simulasi dapat dijalankan dengan memberikan stimulus input. Namun, testbench tidak diinstanisasi dalam modul apa pun karena itu adalah blok yang mengenkapsulasi segala sesuatu dan oleh karena itu adalah modul tingkat atas.

Design Top Level

Kode desain yang ditunjukkan di bawah ini memiliki modul tingkat atas bernama design. Ini karena ia berisi semua sub-modul yang diperlukan untuk membuat desain lengkap. Submodul dapat memiliki sub-modul yang lebih bersarang seperti mod3 di dalam mod1 dan mod4 di dalam mod2. Bagaimanapun, semuanya ini disertakan dalam modul tingkat atas ketika mod1 dan mod2 diinstanisasi. Jadi ini membuat design lengkap dan adalah modul tingkat atas untuk desain.

  //--------------------------------- // Kode desain //--------------------------------- module mod3 ( [port_list] ); reg c; // Kode desain endmodule module mod4 ( [port_list] ); wire a; // Kode desain endmodule module mod1 ( [port_list] ); // Modul ini bernama "mod1" berisi dua instance wire y; mod3 mod_inst1 ( ... ); // Instance pertama adalah modul bernama "mod3" dengan nama "mod_inst1" mod3 mod_inst2 ( ... ); // Instance kedua juga adalah modul "mod3" dengan nama "mod_inst2" endmodule module mod2 ( [port_list] ); // Modul ini bernama "mod2" berisi dua instance mod4 mod_inst1 ( ... ); // Instance pertama adalah modul bernama "mod4" dengan nama "mod_inst1" mod4 mod_inst2 ( ... ); // Instance kedua juga adalah modul "mod4" dengan nama "mod_inst2" endmodule // Modul tingkat atas module design ( [port_list]); // Dari perspektif desain, ini adalah modul tingkat atas wire _net; mod1 mod_inst1 ( ... ); // karena ia berisi semua modul dan sub-modul lainnya mod2 mod_inst2 ( ... ); endmodule  

Testbench Top Level

Modul testbench berisi stimulus untuk memeriksa fungsionalitas desain dan terutama digunakan untuk verifikasi fungsional menggunakan alat simulasi. Oleh karena itu, desain diinstanisasi dan disebut d0 di dalam modul testbench. Dari perspektif simulator, testbench adalah modul tingkat atas.

  //----------------------------------------------------------- // Kode testbench // Dari perspektif simulasi, ini adalah modul tingkat atas // karena 'design' diinstanisasi dalam modul ini //----------------------------------------------------------- module testbench; design d0 ( [port_list_connections] ); // Sisa kode testbench endmodule  

Nama Hierarkis

Sebuah struktur hierarkis terbentuk ketika modul dapat diinstanisasi satu sama lain, dan oleh karena itu modul tingkat atas disebut root. Karena setiap inisiasi modul bawah dalam modul yang diberikan diharuskan memiliki nama pengidentifikasi yang berbeda, tidak akan terdapat ambigu dalam mengakses sinyal. Nama hierarkis dibangun oleh daftar pengidentifikasi ini yang dipisahkan oleh titik . untuk setiap tingkat hierarki. Setiap sinyal dapat diakses dalam modul apa pun menggunakan jalur hierarki ke sinyal tersebut.

  // Ambil contoh yang ditunjukkan di atas dalam modul tingkat atas design.mod_inst1 // Akses ke instance modul mod_inst1 design.mod_inst1.y // Akses sinyal "y" di dalam mod_inst1 design.mod_inst2.mod_inst2.a // Akses sinyal "a" dalam modul4 module testbench.d0._net; // Sinyal tingkat atas _net dalam modul design diakses dari testbench  

Verilog

  1. Menguasai Verilog: Tutorial Lengkap untuk Desain Sirkuit Digital
  2. Menguasai Konkatenasi Verilog: Panduan Praktis
  3. Dasar-dasar Verilog: Ringkasan Ringkas
  4. Memahami Penugasan Verilog: Jenis, Sintaks, dan Praktik Terbaik
  5. Perbedaan Kunci Penugasan Blokir dan Non-Blokir Verilog
  6. Menguasai Fungsi Verilog untuk Desain RTL yang Efisien
  7. Memahami Tugas Verilog: Fungsi vs Tugas, Sintaks, dan Penggunaan
  8. Menguasai Ruang Lingkup Referensi Hierarkis Verilog: Hindari Tabrakan Nama dalam Modul dan Blok
  9. Generator Jam Verilog: Panduan Desain dan Implementasi
  10. Menguasai Fungsi Matematika Verilog untuk Desain Perangkat Keras yang Efisien