Verilog語言中預先定義了一些任務和函數,用於完成一些特殊的功能,它們被稱爲系統任務和系統函數,這些函數大多數都是只能在Testbench仿真中使用的,使我們更方便的進行驗證。
`timescale 1ns/1ns //時間尺度預編譯指令 時間單位/時間精度
時間單位和時間精度由值1、10、和100以及單位s、ms、us、ns、ps和fs組成
時間單位:定義仿真過程所有與時間相關量的單位仿真中使用 “#數字”表示延時相應時間單位的時間,例#10表示延時10個單位的時間,即10ns。
時間精度:決定時間相關量的精度及仿真顯示的最小刻度。
`timescale 1ns/10ps //精度0.01,#10.11 表示延時10110ps
下面這種寫法就是錯誤的,因爲時間單位不能比時間精度小。
`timescale 100ps/1ns
主要的函數有如下這些,在支持Verilog語法的編輯器中都會顯示爲高亮關鍵字 。
//--------------------------------------------------
$display //打印信息,自動換行
$write //打印信息
$strobe //打印信息,自動換行,最後執行
$monitor //監測變量
$stop //暫停仿真
$finish //結束仿真
$time //時間函數
$random //隨機函數
$readmemb //讀文件函數
//--------------------------------------------------
下面我們單獨介紹它們的功能,並在ModelSim的Transcript界面中打印這些信息。
1、$display用於輸出、打印信息
使用格式爲:
$display("%b+%b=%d",a, b, c); //格式“%b+%b=%d” 格式控制,未指定時默認十進制
%h或%H //以十六進制的形式輸出
%d或%D //以十進制的形式輸出
%o或%O //以八進制的形式輸出
%b或%B //以二進制的形式輸出
//--------------------------------------------------
//a,b,c 輸出列表,需要輸出信息的變量
//每次打印信息後自動換行
01 `timescale 1ns/1ns
02
03 module tb_test();
04
05 reg [3:0] a;
06 reg [3:0] b;
07 reg [3:0] c;
08
09 initial begin
10 $display("Hello");
11 $display("xiangliangzi");
12 a = 4'd5;
13 b = 4'd6;
14 c = a + b;
15 #100;
16 $display("%b+%b=%d", a, b, c);
17 end
18
19 endmodule
//--------------------------------------------------
2、$write 用於輸出、打印信息
使用格式爲:
$write("%b+%b=%d\n",a, b, c); //“%b+%b=%d\n” 格式控制,未指定時默認十進制
%h或%H //以十六進制的形式輸出
%d或%D //以十進制的形式輸出
%o或%O //以八進制的形式輸出
%b或%B //以二進制的形式輸出
\n //換行
//--------------------------------------------------
//a,b,c爲輸出列表,需要輸出信息的變量
01 `timescale 1ns/1ns
02
03 module tb_test();
04
05 reg [3:0] a;
06 reg [3:0] b;
07 reg [3:0] c;
08
09 initial begin
10 $write("Hello ");
11 $write("xiangliangzi\n");
12 a = 4'd5;
13 b = 4'd6;
14 c = a + b;
15 #100;
16 $write("%b+%b=%d\n",a, b, c);
17 end
18
19 endmodule
//--------------------------------------------------
3、$strobe用於輸出、打印信息
使用格式爲:
$strobe("%b+%b=%d",a,b,c); //“%b+%b=%d” 格式控制,未指定時默認十進制
%h或%H //以十六進制的形式輸出
%d或%D //以十進制的形式輸出
%o或%O //以八進制的形式輸出
%b或%B //以二進制的形式輸出
//--------------------------------------------------
//a,b,c 輸出列表,需要輸出信息的變量
//打印信息後自動換行,觸發操作完成後執行
01 `timescale 1ns/1ns
02
03 module tb_test();
04
05 reg [3:0] a;
06 reg [3:0] b;
07 reg [3:0] c;
08
09 initial begin
10 $strobe("strobe:%b+%b=%d", a, b, c);
11 a = 4'd5;
12 $display("display:%b+%b=%d", a, b, c);
13 b = 4'd6;
14 c = a + b;
15 end
16
17 endmodule
//--------------------------------------------------
4、$monitor用於持續監測變量
使用格式爲:
$monitor("%b+%b=%d",a,b,c); //“%b+%b=%d” 格式控制,未指定時默認十進制
%h或%H //以十六進制的形式輸出
%d或%D //以十進制的形式輸出
%o或%O //以八進制的形式輸出
%b或%B //以二進制的形式輸出
//--------------------------------------------------
//a,b,c 輸出列表,需要輸出信息的變量
//被測變量變化觸發打印操作,自動換行
01 `timescale 1ns/1ns
02
03 module tb_test();
04
05 reg [3:0] a;
06 reg [3:0] b;
07 reg [3:0] c;
08
09 initial begin
10 a = 4'd5;
11 #100;
12 b = 4'd6;
13 #100;
14 c = a + b;
15 end
16
17 initial $monitor("%b+%b=%d", a, b, c);
18
19 endmodule
//--------------------------------------------------
5、$stop用於暫停仿真,
$finfish用於結束仿真
使用格式爲:
//--------------------------------------------------
01 `timescale 1ns/1ns
02
03 module tb_test();
04
05 initial begin
06 $display("Hello");
07 $display("xiangliangzi");
08 #100;
09 $display("Stop Simulation");
10 $stop; //暫停仿真
11 $display("Continue Simulation");
12 #100;
13 $display("Finish Simulation");
14 $finish; //結束仿真
15 end
16
17 endmodule
//--------------------------------------------------
6、$time爲時間函數,返回64位當前仿真時間;
$random用於產生隨機函數,返回隨機數
使用格式爲:
//--------------------------------------------------
01 `timescale 1ns/1ns
02
03 module tb_test();
04
05 reg [3:0] a;
06
07 always #10 a = $random;
08
09 initial $monitor("a=%d @time %d", a, $time);
10
11 endmodule
//--------------------------------------------------
7、$readmemh用於讀二進制文件函數 ,
$readmemh 用於讀十六進制文件函數
使用格式爲:
$readmemb("<數據文件名>", <寄存器變量名>);
$readmemh("<數據文件名>", <寄存器變量名>);
//--------------------------------------------------
01 `timescale 1ns/1ns
02
03 module tb_test();
04
05 integer i;
06
07 reg [7:0] a [23:0];
08
09 initial begin
10 $readmemb("xiangliangzi.txt", a);
11 for(i=0; i<=23; i=i+1) begin
12 #10;
13 $write("%s", a[i]);
14 end
15 end
16
17 endmodule
//--------------------------------------------------
讀取的”xiangliangzi.txt”文件爲:
//--------------------------------------------------
01010111 // W
01100101 // e
01101100 // l
01100011 // c
01101111 // o
01101101 // m
01100101 // e
00100000 //空格
01110100 // t
01101111 // o
00100000 //空格
01111000 // x
01101001 // i
01100001 // a
01101110 // n
01100111 // g
01101100 // l
01101001 // i
01100001 // a
01101110 // n
01100111 // g
01111010 // z
01101001 // i
00100001 // !
//--------------------------------------------------
歡迎加入FPGA技術學習交流羣,本羣致力於爲廣大FPGAer提供良好的學習交流環境,不定期提供各種本行業相關資料!QQ交流羣號:450843130