🧭 Verilog Derleyici Direktifleri & Makrolar#
Verilog’daki derleyici direktifleri ters kesme karakteriyle başlar `
ve sentez donanımını değil, derleyiciyi/simülatörü yönlendirir.
Koşullu derleme, makro tanımlama, dosya dahil etme ve simülasyon kontrolü için önemlidir.
📌 Yaygın Derleyici Direktifleri#
Direktif | Açıklama | Örnek |
---|---|---|
`define | Sabit veya makro tanımlar | `define WIDTH 8 |
`ifdef / `ifndef | Koşullu derleme | `ifdef DEBUG ... |
`include | Başka bir dosyayı dahil eder | `include "defs.v" |
`timescale | Zaman birimi ve çözünürlük ayarı | `timescale 1ns / 1ps |
`undef | Makro tanımını siler | `undef WIDTH |
`else / `elsif | ifdef ile birlikte alternatif yol sağlar | — |
`default_nettype | Otomatik wire tanımlarını kontrol eder | `default_nettype none |
`resetall | Tüm direktifleri varsayılana döndürür | — |
🧠 Makro Örneği#
`define
ile sabitler veya yeniden kullanılabilir kod parçaları tanımlanabilir:
`define WIDTH 8
module adder (
input [`WIDTH-1:0] a, b,
output [`WIDTH-1:0] y
);
assign y = a + b;
endmodule
Makrolar derlemeden önce ön işlemci tarafından yerleştirilir — C dilindeki
#define
gibidir.
🔀 Koşullu Derleme#
Hata ayıklama veya platforma özel özellikleri etkinleştirmek için kullanılır:
`define DEBUG
module test;
initial begin
`ifdef DEBUG
$display("Debug modu aktif");
`endif
end
endmodule
🔄 Dosya Dahil Etme#
Kodu birden fazla dosyaya bölmek için:
`include "parameters.vh"
En iyi uygulama: Dahil edilen dosyalar için
.vh
veya.svh
uzantılarını kullanın.
🚫 Otomatik Net Tanımlamaları Devre Dışı Bırakma#
Varsayılan olarak, tanımsız sinyaller wire
kabul edilir. Bu sessiz hatalara neden olabilir. Şöyle engellenir:
`default_nettype none
✅ Inline Kod Bloğu (Makro Gibi):#
`define PRINT_SIGNAL(signal) \
$display("Signal %s = %b", `"signal`", signal)
initial begin
`PRINT_SIGNAL(my_reg); // expands to: $display("Signal my_reg = %b", my_reg);
end
Dikkat: Makro parametreleri parantez içine alınmalı ve satır sonlarına
\
konmalı.
🔐 Include Guard Örneği#
📁 safe_defs.vh
`ifndef __SAFE_DEFS_VH__
`define __SAFE_DEFS_VH__
`define WIDTH 32
`define RESET_VAL 0
`endif
✅ En İyi Uygulamalar#
- Her dosyanın en üstüne
`default_nettype none
ekleyin - Makro kodlarını daima
ifdef
/endif
blokları içinde kullanın - Çok karmaşık makrolardan kaçının — hata ayıklaması zordur
include
direktifini yalnızca sabitler, parametreler veya küçük yardımcı kodlar için kullanın
`timescale 1ns / 1ps
`default_nettype none
`define WIDTH 8
`define RESET_VAL 0
`define PRINT_SIGNAL(sig) \
$display("Signal %s = %b", `"sig`", sig)
module tb_directives;
reg [`WIDTH-1:0] my_reg = 8'hA5;
initial begin
`ifdef DEBUG
$display("Debugging Enabled");
`endif
`PRINT_SIGNAL(my_reg);
#10 $finish;
end
endmodule
`undef WIDTH
`resetall