Aslında İstediğin Waveform
$display metin yazdırır. Bu hızlı bir sanity check için iyidir, ama zamanlama sorunu olan bir counter veya takılı bir state machine'i debug ettiğin anda bir resim istersin: zamanla voltajlar olarak çizilen sinyaller, kaydırılabilir, yakınlaştırılabilir, herhangi bir geçişe bırakabileceğin bir imleçle.
Bu resim bir VCD dosyası'dır - orijinal Verilog spesifikasyonunda IEEE'nin standartlaştırdığı "value change dump", bir metin formatı. Her modern simülatör bir tane yazabilir; her modern waveform viewer bir tane okuyabilir. Birini üretme maliyeti testbench'inde iki satırdır.
İki Satır
Bir initial bloğunun içinde - genellikle stimulus'ını tutan aynı blokta - ekle:
$dumpfile("dump.vcd");
$dumpvars(0, test);
$dumpfileçıkış dosyasını adlandırır. Herhangi bir path ilet; bir dizini yoksa simülatörün çalışma dizinine düşer.$dumpvars(0, test)"testscope'undaki ve her alt scope'taki her sinyali, tekrarlayarak, sınırsız derinlikle kaydet" der.
Bütün kurulum bu. Simülasyonu çalıştır ve GTKWave'de veya browser editörünün Waveform sekmesinde açabileceğin bir dump.vcd'ye sahip olacaksın.
Tam Bir Örnek
Çalıştır. Waveform sekmesi artık üç sinyali - clk, reset, count - tüm simülasyon zamanı boyunca çizili olarak gösterir. Herhangi bir noktaya bir imleç bırakabilir ve o zamanda sinyal değerlerini okuyabilirsin. Tek bir saat döngüsünü incelemek için sürükle-yakınlaştır yapabilirsin.
$dumpvars'ın İlk Argümanı Ne Yapar
$dumpvars(depth, scope), scope'u ve içerdiği her alt instance'ı yürür, sinyalleri depth seviye derinliğine kadar kaydeder. Derinlik değerleri:
0- sınırsız.scope'taki ve iç içe alt modüldeki her sinyal kaydedilir.1- yalnızca doğrudanscope'ta tanımlanan sinyaller. Alt modüller kaydedilmez.2-scopeartı bir seviye alt modül.N-scopeartı N-1 seviye alt modül.
Pratikte hemen hemen her testbench $dumpvars(0, test) kullanır. Her şeyi yakalamak ucuzdur (VCD'ler yalnızca geçişleri saklar, sabit durumları değil) ve debug ortasında ihtiyacın olan sinyalin dump edilmediğini keşfetmek istemezsin.
Gerçekten büyük bir tasarımın varsa ve VCD çok büyükse, seçici dump yapabilirsin:
$dumpvars(0, dut.inner_module); // sadece ilginç alt modül
$dumpvars(0, dut.regs); // sadece register file
Scope'ları biriktirmek için $dumpvars'ı birden çok kez çağırabilirsin.
Belirli Sinyalleri Dump Etme
$dumpvars ayrıca bütün bir scope yerine belirli sinyallerin bir listesini de alabilir:
$dumpvars(0, test.clk, test.reset, dut.count);
Bu yalnızca o üç sinyali kaydeder. Tasarım çok büyük olduğunda ve yalnızca bir avuç sinyal umurundaysan kullanışlıdır. Küçük tasarımlar için her şeyi dump etmek daha basittir.
Simülasyon Ortasında Dump'ı Kontrol Etme
$dumpvars ile eşleşen iki task daha:
$dumpoff- dump'ı duraklat. Daha fazla değişiklik VCD'ye girmez.$dumpon- dump'ı devam ettir.
initial begin
$dumpfile("dump.vcd");
$dumpvars(0, test);
// ... ilginç bölge ...
#1000 $dumpoff;
// ... VCD'de istemediğimiz uzun sıkıcı bölge ...
#5000 $dumpon;
// ... başka bir ilginç bölge ...
end
5GB'lık bir VCD dosyası üretmeden uzun bir testin "bir milyon döngü çalışıyor" sıkıcı kısmını nasıl atlayacağın budur.
Sonucu Görüntüleme
İki ana yol:
Browser Editöründe
Bu sayfadaki editör VCD'leri inline render eder. Simülasyonu çalıştır; Waveform sekmesine geç; sinyaller solda hiyerarşileriyle ve sağda sürüklenebilir bir imleçle görünür. İmleci bırakmak için bir trace'in herhangi bir yerine tıkla; her sinyal adının yanında o zamandaki sinyal değerlerini küçük haplar olarak gösterir.
GTKWave'de
Simülasyonu yerel olarak çalıştırdıysan (iverilog -o sim test.v sonra vvp sim), ortaya çıkan VCD'yi şununla aç:
gtkwave dump.vcd
GTKWave dosyayı yükler, scope ağacını solda sunar ve sinyalleri sağdaki waveform alanına sürüklemeni bekler. Görüntü formatını değiştirmek için (binary, hex, decimal, analog) çok bitli bir sinyale sağ tıkla. Belirli zamanlara veya sinyal geçişlerine atlamak için alttaki arama kutusunu kullan.
Yaygın Kalıplar
Küçük Bir Testbench Yardımcısı
Çoğu testbench dosyası tam olarak bu blokla başlar. Her şeyi tek bir initial içinde birleştirerek kısa tutabilirsin:
initial begin
$dumpfile("dump.vcd");
$dumpvars(0, test);
// ... stimulus ...
$finish;
end
Koşullu Dump
Yalnızca başarısız testler için VCD çıktısı istediğin bir test ortamında:
initial begin
if (DUMP_VCD) begin
$dumpfile("dump.vcd");
$dumpvars(0, test);
end
// ... stimulus ...
end
DUMP_VCD, komut satırından ayarladığın veya test moduna bağlı olarak tanımladığın bir parameter olurdu. Regression suite'lerinde disk alanı tasarrufu sağlar.
Memory Dump'ları
Memory'ler (unpacked array'ler) varsayılan olarak $dumpvars tarafından dump edilmez - çok büyük olabilirler. İstiyorsan $dumpvars(0, dut.memory)'i açıkça kullan veya bazı simülatörlerde $dumpmem.
Yaygın Hatalar
Boş VCD dosyası. $dumpfile veya $dumpvars'ı unuttun veya simülasyon herhangi bir sinyal değişmeden $finish'i çağırdı. Kurulumdan sonra en az birkaç zaman birimi çalıştır.
Waveform'da eksik sinyaller. İlettiğin scope onları içermiyordu. $dumpvars(0, dut) yalnızca dut'un içindekileri kaydeder; testbench'in sinyalleri test seviyesinde sürüyorsa, bunlar görünmeyecektir. Her zaman testbench scope'undan dump et: $dumpvars(0, test).
VCD dosyası çok büyük. Hızla değişen geniş sinyallerle uzun bir simülasyon çok sayıda VCD satırı üretir. Üç düzeltme: daha dar bir scope dump et, sıkıcı kısımların etrafında $dumpoff/$dumpon kullan veya FST gibi daha kompakt bir formata geç (iverilog ve GTKWave her ikisi de -fst flag'leriyle destekler).
Sırada Ne Var
Bu bölümün son doc'u - Timescale and Delays - `timescale direktifini ve #delay'in gerçekten duvar saati zamanına nasıl eşlendiğini açıklar. Ondan sonra doc'ları baştan sona tamamlamış olacaksın.
Sıkça Sorulan Sorular
Verilog'da VCD dosyası nedir?
VCD, Value Change Dump'ın kısaltmasıdır - simülasyon sırasında her sinyal geçişini kaydetmek için kullanılan bir metin formatı. Simülatör, her sinyalin başlangıç değerini 0 zamanında yazar, sonra her değişikliği zaman damgasıyla birlikte. GTKWave gibi waveform viewer'lar dosyayı okur ve onu kaydırabileceğin ve yakınlaştırabileceğin grafik bir zamanlama diyagramı olarak render eder.
Verilog'da bir VCD dosyası nasıl üretilir?
Testbench'inde bir initial bloğunun içine iki system task ekle: $dumpfile("dump.vcd"); çıkış dosyasını adlandırır ve $dumpvars(0, top_module); top_module içindeki ve altındaki her sinyali kaydeder. Simülasyon bittikten sonra, herhangi bir waveform viewer'da açabileceğin bir dump.vcd dosyana sahip olacaksın.
Verilog'da $dumpvars(0, ...) ne anlama gelir?
$dumpvars(depth, instance), sinyalleri instance'tan başlayarak ve depth seviye derinliğine kadar tekrarlayarak kaydeder. $dumpvars(0, test), 'test scope'undaki ve her alt scope'taki tüm sinyaller, tekrarlayarak' demektir - derinlik 0 özeldir ve sınırsız anlamına gelir. $dumpvars(1, test) yalnızca doğrudan test içindeki sinyalleri kaydederdi, instantiate edilmiş herhangi bir alt modüldeki değil.
Verilog'da VCD dosyam neden boş?
Üç olası neden: $dumpfile/$dumpvars'ı hiç çağırmadın; simülasyon herhangi bir sinyal değişmeden $finish'e ulaştı (dump çağrısından sonra en az birkaç zaman birimi çalıştır); veya $dumpvars'a ilettiğin scope gerçek hiyerarşi ile eşleşmiyor. Minimum çalışan bir dizi $dumpfile("dump.vcd"); $dumpvars(0, test); #10; $finish;'tir.