$display("Hello world")
可以在螢幕上顯示 Hello world 字串,在半加器的測試檔中作以下修改:
initial begin
$display("Half Adder test begin!!"); // 加入此行
$dumpvars;
$dumpfile("testha.dmp");
#0 a=0;
b=0;
$display($time, "=>a=%b,b=%b,sumX=%b,coutX=%b",a,b,sumX,coutX); // 加入此行
然後執行模擬,我們可以得到以下螢幕輸出:
Half Adder test begin!!
0=>a=0,b=0,sumX=x,coutX=x
從以上輸出我們可以得到當 a=0, b=0 的時候,sumX 跟 coutX 的值為 x (未知)。為什麼會有這個輸出結果 ?
原因:所有的電路都有延遲,當訊號在第 0 秒輸入時,不可能輸出就跟著改變。因此,我們可以再修改程式碼如下:
#0 a=0;
b=0;
$display($time, "=>a=%b,b=%b,sumX=%b,coutX=%b",a,b,sumX,coutX);
#1
$display($time, "=>a=%b,b=%b,sumX=%b,coutX=%b",a,b,sumX,coutX);
其輸出為:
Half Adder test begin!!
0=>a=0,b=0,sumX=x,coutX=x
1=>a=0,b=0,sumX=0,coutX=0
我們可以觀察上面的第二行,發現在第 1 個時間單位時,sumX=0, coutX=0。這表示經過一個時間單位的延遲之後,電路已完成運算並在輸出端看到結果。
現在有個問題,萬一我們每個訊號的改變都希望能從螢幕上看到數值,該如何作 ?
1. 每一個訊號改變都加上 $display ==> 累死人,我們最好不要作這種蠢事
2. 使用 $monitor ==> 比較聰明的作法
因此我們可以將測試檔改成:
initial begin
$display("Half Adder test begin!!"); // 加入此行
$monitor($time, "=>a=%b,b=%b,sumX=%b,coutX=%b",a,b,sumX,coutX); // 加入此行
$dumpvars;
$dumpfile("testha.dmp");
#0 a=0;
b=0;
其輸出為:
Half Adder test begin!!
0=>a=0,b=0,sumX=0,coutX=0
10=>a=0,b=1,sumX=1,coutX=0
20=>a=1,b=0,sumX=1,coutX=0
30=>a=1,b=1,sumX=0,coutX=1
我們可以看到只要加一行 $monitor 之後,系統即會根據輸出/入的變化而自動列印其數值,不必每一行都加 $display。
沒有留言:
張貼留言