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

Menguasai Ruang Lingkup Referensi Hierarkis Verilog: Hindari Tabrakan Nama dalam Modul dan Blok

Sebagian besar bahasa pemrograman memiliki fitur karakteristik yang disebut scope yang menentukan visibilitas bagian kode tertentu pada variabel dan metode. Ruang lingkup mendefinisikan namespace untuk menghindari tabrakan antara nama objek yang berbeda dalam namespace yang sama.

Verilog mendefinisikan ruang lingkup baru untuk modul, fungsi, tugas, blok bernama dan blok generate.

module tb;
  reg signal; // Another variable cannot be declared with
              // an already existing name in the same scope
  reg signal; // However, the name 'signal' can be reused inside
              // a task because it belongs to a different scope.
  task display();
    reg signal = 1;
    $display("signal = %0b", signal);
  endtask
endmodule

Sebuah pengenal, seperti nama sinyal, dapat digunakan untuk mendeklarasikan hanya satu jenis item dalam ruang lingkup tertentu. Ini berarti bahwa dua variabel dengan tipe data yang berbeda atau sama tidak dapat memiliki nama yang sama, atau tugas dan variabel dengan nama yang sama, atau bahkan jaringan dan instance gerbang dengan nama yang sama dalam ruang lingkup yang sama.

Setiap pengenal dalam Verilog memiliki nama jalur hierarkis unik, di mana setiap instance modul, tugas, fungsi atau blok bernama begin end atau fork join mendefinisikan level atau ruang lingkup baru.

Contoh Referensi Hierarkis

module tb;
  // Create two instances of different modules
  A uA();
  B uB();
  // Create a named block that declares a signal and
  // prints the value at 10ns from simulation start
  initial begin : TB_INITIAL
    reg signal;
    #10 $display("signal=%0d", signal);
  end
  // We'll try to access other scopes using hierarchical
  // references from this initial block
  initial begin
    TB_INITIAL.signal = 0;
    uA.display();
    uB.B_INITIAL.B_INITIAL_BLOCK1.b_signal_1 = 1;
    uB.B_INITIAL.B_INITIAL_BLOCK2.b_signal_2 = 0;
  end
endmodule
module A;
  task display();
    $display("Hello, this is A");
  endtask
endmodule
module B;
  initial begin : B_INITIAL
    #50;
    begin : B_INITIAL_BLOCK1
      reg b_signal_1;
      #10 $display("signal_1=%0d", b_signal_1);
    end
    #50;
    begin : B_INITIAL_BLOCK2
      reg b_signal_2;
      #10 $display("signal_2=%0d", b_signal_2);
    end
  end
endmodule

Log Simulasi

xcelium> run
Hello, this is A
TB signal=0
signal_1=1
signal_2=0
xmsim: *W,RNQUIE: Simulation is complete.

Referensi Nama ke Atas

Modul level bawah dapat merujuk item dalam modul di atasnya dalam hierarki. Misalnya, sinyal dalam blok TB_INITIAL akan terlihat dari tugas display di A.

module A;
  task display();
    $display("Hello, this is A");
    // Upward referencing, TB_INITIAL is visible in this module
    #5 TB_INITIAL.signal = 1;
  endtask
endmodule

Perhatikan bahwa sinyal TB sekarang 1 daripada 0, karena perubahan referensi ke atas yang dilakukan oleh modul A pada sinyal.

Log Simulasi

xcelium> run
Hello, this is A
TB signal=1
signal_1=1
signal_2=0
xmsim: *W,RNQUIE: Simulation is complete.

Berikut adalah contoh lain dengan beberapa modul bersarang dan node daun dapat langsung mengakses anggota dari node di atasnya melalui referensi hierarkis ke atas.

module tb;
  A a();
  function display();
    $display("Hello, this is TB");
  endfunction
endmodule
module A;
  B b();
  function display();
    $display("Hello, this is A");
  endfunction
endmodule
module B;
  C c();
  function display();
    $display("Hello, this is B");
  endfunction
endmodule
module C;
  D d();
  function display();
    $display("Hello, this is C");
  endfunction
endmodule
module D;
  initial begin
    a.display(); // or A.display()
    b.display(); // or B.display()
    c.display(); // or C.display()
    a.b.c.display();
  end
endmodule

Log Simulasi

xcelium> run
Hello, this is A
Hello, this is B
Hello, this is C
Hello, this is C
xmsim: *W,RNQUIE: Simulation is complete.

Saat kompiler menemukan b.display(),

  1. Ia mencari dalam cakupan saat ini dalam modul D untuk melihat apakah b didefinisikan. Jika tidak ada, maka ia mencari nama dalam cakupan yang melingkupi dan bergerak ke atas hingga ruang lingkup modul tercapai. Jika nama masih tidak ditemukan, ia melanjutkan ke langkah berikutnya.
  2. Ia mencari dalam cakupan terluar modul induk dan jika tidak ditemukan, ia terus bergerak ke atas hierarki.

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 Tugas Tampilan Verilog: Debugging dan Pencatatan yang Efisien