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(),
- 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.
- Ia mencari dalam cakupan terluar modul induk dan jika tidak ditemukan, ia terus bergerak ke atas hierarki.