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

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章