Verilog
Verilog mendukung beberapa arahan kompiler yang pada dasarnya mengarahkan kompiler untuk memperlakukan kode dengan cara tertentu. Misalnya, sebagian kode dapat mewakili implementasi fitur tertentu dan harus ada cara untuk tidak menyertakan kode dalam desain jika fitur tersebut tidak digunakan.
Ini bisa diselesaikan dengan kondisional kompilasi di mana desainer dapat membungkus kode dalam arahan kompiler yang memberi tahu kompiler untuk menyertakan atau mengecualikan kode untuk kompilasi ketika flag bernama yang diberikan ditetapkan.
Kompilasi bersyarat dapat dicapai dengan Verilog `ifdef
dan `ifndef
kata kunci. Kata kunci ini dapat muncul di mana saja dalam desain dan dapat bersarang satu di dalam yang lain.
Kata kunci `ifdef
hanya memberitahu kompiler untuk memasukkan potongan kode sampai `else
berikutnya atau `endif
jika makro yang disebut FLAG didefinisikan menggunakan `define
arahan.
// Style #1: Only single `ifdef
`ifdef <FLAG>
// Statements
`endif
// Style #2: `ifdef with `else part
`ifdef <FLAG>
// Statements
`else
// Statements
`endif
// Style #3: `ifdef with additional ifdefs
`ifdef <FLAG1>
// Statements
`elsif <FLAG2>
// Statements
`elsif <FLAG3>
// Statements
`else
// Statements
`endif
Kata kunci `ifndef
cukup memberitahu kompiler untuk memasukkan potongan kode sampai `else
berikutnya atau `endif
jika makro yang diberikan bernama BENDERA tidak didefinisikan menggunakan `define
arahan.
module my_design (input clk, d,
`ifdef INCLUDE_RSTN
input rstn,
`endif
output reg q);
always @ (posedge clk) begin
`ifdef INCLUDE_RSTN
if (!rstn) begin
q <= 0;
end else
`endif
begin
q <= d;
end
end
endmodule
module tb;
reg clk, d, rstn;
wire q;
reg [3:0] delay;
my_design u0 ( .clk(clk), .d(d),
`ifdef INCLUDE_RSTN
.rstn(rstn),
`endif
.q(q));
always #10 clk = ~clk;
initial begin
integer i;
{d, rstn, clk} <= 0;
#20 rstn <= 1;
for (i = 0 ; i < 20; i=i+1) begin
delay = $random;
#(delay) d <= $random;
end
#20 $finish;
end
endmodule
Perhatikan bahwa secara default, rstn tidak akan disertakan selama kompilasi desain dan karenanya tidak akan muncul di daftar port. Namun jika makro yang disebut INCLUDE_RSTN didefinisikan dalam file Verilog yang merupakan bagian dari daftar kompilasi file atau diteruskan melalui baris perintah ke kompiler, rstn akan disertakan dalam kompilasi dan desain akan memilikinya.
Bereksperimenlah dengan menambahkan dan menghapus +define+INCLUDE_RSTN dari 'Opsi Kompilasi &Jalankan' di panel kiri untuk mengetahui perbedaannya.
Contoh berikut memiliki dua pernyataan tampilan di dalam `ifdef
yang terpisah cakupan yang tidak memiliki default `else
bagian untuk itu. Jadi ini berarti bahwa secara default tidak ada yang akan ditampilkan. Jika makro baik MAKRO ditentukan, pesan tampilan yang sesuai disertakan dan akan ditampilkan selama simulasi
module tb;
initial begin
`ifdef MACRO1
$display ("This is MACRO1");
`elsif MACRO2
$display ("This is MACRO2");
`endif
end
endmodule
Log Simulasi # With no macros defined ncsim> run ncsim: *W,RNQUIE: Simulation is complete. # With +define+MACRO1 ncsim> run This is MACRO1 ncsim: *W,RNQUIE: Simulation is complete. # With +define+MACRO2 ncsim> run This is MACRO2 ncsim: *W,RNQUIE: Simulation is complete.
Kode yang sama dapat ditulis dengan `ifndef
dan hasilnya justru sebaliknya.
module tb;
initial begin
`ifndef MACRO1
$display ("This is MACRO1");
`elsif MACRO2
$display ("This is MACRO2");
`endif
end
endmodule
Log Simulasi # With no macros defined ncsim> run This is MACRO1 ncsim: *W,RNQUIE: Simulation is complete. # With +define+MACRO1 ncsim> run ncsim: *W,RNQUIE: Simulation is complete. # With +define+MACRO2 ncsim> run This is MACRO1 ncsim: *W,RNQUIE: Simulation is complete. # With +define+MACRO1 +define+MACRO2 ncsim> run This is MACRO2 ncsim: *W,RNQUIE: Simulation is complete.
`ifdef
dan ragamnya dapat disarangkan satu di dalam yang lain untuk menciptakan cara yang rumit untuk memasukkan dan mengecualikan kode dengan makro yang ditentukan.
module tb;
initial begin
`ifdef FLAG
$display ("FLAG is defined");
`ifdef NEST1_A
$display ("FLAG and NEST1_A are defined");
`ifdef NEST2
$display ("FLAG, NEST1_A and NEST2 are defined");
`endif
`elsif NEST1_B
$display ("FLAG and NEST1_B are defined");
`ifndef WHITE
$display ("FLAG and NEST1_B are defined, but WHITE is not");
`else
$display ("FLAG, NEST1_B and WHITE are defined");
`endif
`else
$display ("Only FLAG is defined");
`endif
`else
$display ("FLAG is not defined");
`endif
end
endmodule
Log Simulasi # Without defining any macro ncsim> run FLAG is not defined ncsim: *W,RNQUIE: Simulation is complete. # With +define+FLAG +define+NEST1_B ncsim> run FLAG is defined FLAG and NEST1_B are defined FLAG and NEST1_B are defined, but WHITE is not ncsim: *W,RNQUIE: Simulation is complete. # With +define+FLAG +define+NEST1_B +define+WHITE ncsim> run FLAG is defined FLAG and NEST1_B are defined FLAG, NEST1_B and WHITE are defined ncsim: *W,RNQUIE: Simulation is complete. # With +define+FLAG ncsim> run FLAG is defined Only FLAG is defined ncsim: *W,RNQUIE: Simulation is complete. # With +define+WHITE ncsim> run FLAG is not defined ncsim: *W,RNQUIE: Simulation is complete. # With +define+NEST1_A ncsim> run FLAG is not defined ncsim: *W,RNQUIE: Simulation is complete.
Perhatikan bahwa selama makro induk tidak ditentukan, definisi makro bersarang lainnya di dalamnya tidak akan dikompilasi. Misalnya, definisi makro NEST1_A atau WHITE tanpa FLAG tidak membuat kompiler mengambil kode bersarang.
Verilog
Sebuah for loop adalah loop yang paling banyak digunakan dalam perangkat lunak, tetapi terutama digunakan untuk mereplikasi logika perangkat keras di Verilog. Ide di balik for loop adalah untuk mengulangi satu set pernyataan yang diberikan dalam loop selama kondisi yang diberikan benar. Ini sangat m
case pernyataan memeriksa apakah ekspresi yang diberikan cocok dengan salah satu ekspresi lain dalam daftar dan bercabang sesuai. Biasanya digunakan untuk mengimplementasikan multiplexer. Konstruksi if-else mungkin tidak cocok jika ada banyak kondisi yang harus diperiksa dan akan disintesis menjadi
Parameter adalah konstruksi Verilog yang memungkinkan modul untuk digunakan kembali dengan spesifikasi yang berbeda. Misalnya, penambah 4-bit dapat diparameterisasi untuk menerima nilai jumlah bit dan nilai parameter baru dapat diteruskan selama pembuatan modul. Jadi, penambah N-bit bisa menjadi pen
Verilog adalah bahasa deskripsi perangkat keras dan tidak ada persyaratan bagi desainer untuk mensimulasikan desain RTL mereka agar dapat mengubahnya menjadi gerbang logika. Jadi apa yang perlu disimulasikan? Simulasi adalah teknik menerapkan stimulus input yang berbeda ke desain pada waktu yang