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

Verilog `ifdef Kompilasi Bersyarat

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.

Sintaks

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.

Contoh Desain dengan `ifdef

  
  
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

  

Testbench

  
  
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.

Verilog `ifdef `elsif Contoh

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.

Verilog `ifndef `elsif Contoh

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.

Contoh `ifdef Verilog Bersarang

`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

  1. Tutorial Verilog
  2. Rangkaian Verilog
  3. Tugas Verilog
  4. Pemblokiran &Non-Pemblokiran Verilog
  5. Fungsi Verilog
  6. Tugas Verilog
  7. Generator Jam Verilog
  8. Verilog Menampilkan Tugas
  9. Fungsi Matematika Verilog
  10. Format Waktu Verilog