Verilog語言中的系統任務和系統函數

 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
在這裏插入圖片描述

相關文章
相關標籤/搜索