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