Verilog學習筆記基本語法篇(十一)········ 常用系統函數

1)系統任務:$monitor

 
格式:
$monitor(p1,p2,p3...pn);
$monitor;
$monitoron;
$monitoroff;
任務$monitor提供了監控輸出列表中的表達式或變量值的功能。其參數列表中輸出格式控制字符串和輸出列表的規則和$display一樣。當啓動一個帶有一個或多個參數的$monitor時,仿真器則建立一個處理機制,使得每當參數列表中變量或者表達式的值發生變化是,整個參數列表中變量或者表達式的值都將輸出顯示。如果同一時刻,兩個或多個參數的值發生變化,則該時刻只輸出一次。在$monitor中,參數可以是$time系統函數。這樣參數列表中變量或表達式的值同時發生變化的時刻可以通過表明同一時刻的多行顯示出來。
如: $monitor($time,,"tex=%b rex=%b",tex,rex);     //注意這裏的,,代表空參數,空參數在輸出時顯示爲空格。
$monitor和$display的不同之處在於$monitor往往直接用在initial語句塊中,只要不調用$monitoroff,$monitor便不斷的對所設定的信號進行監視。$monitor不能在always塊中調用。
再多模塊的調試情況下,每一個模塊都會默認調用$monitor語句,但是仿真器只能執行一個$monitor語句,因此程序會報錯,這是需要$monitoron和$monitoroff語句,這樣可以使得各個模塊分開調用$monitor函數。
 
2)時間度量系統函數$time
 
在Verilog HDL中有兩類型的時間系統函數,$time和$realtime。用這兩個系統用函數可以的大當前的仿真時間。
$time可以返回一個64位的整數來表示當前仿真時刻值,該時刻是以模塊的仿真時間尺度位基準的。
$realtime返回的時間數字是一個實型數。該數也是以時間尺度爲基準的。
 
`timescale 10ns/1ns
module test;
  reg set;
  parameter p=1.6;
  initial
    begin
     $monitor($time,,"set=",set);
     #p  set=0;
     #p  set=1;
    end
endmodule
輸出結果爲:
 0 set=x
 2 set=0
 3 set=3
在這個例子中,模塊test想在時間爲16ns是設置寄存器set的值爲0,在32ns時設置寄存器的set爲1。但是由$time疾苦的set變化時刻卻和預想的不一樣,這是由下面兩個原因引起的。
1)$time顯示時刻受時間尺度的影響。這裏時間尺度爲10ns,故16ns和32ns是對應輸出的數字爲1.6和3.2。
2)$time總是輸出整數,所以在將經過尺度比例變換的數字輸出時,要先進行取整,1.6和3.2分別取整爲1和3.2.
3)如果將上述例子中的$time替換成$realtime,那麼輸出的數字將變爲1.6和3.2.
 
3)系統任務$readmemb $readmemh
在Verilog中有兩個系統任務$readmemb和$readmemh,並用來從文件中讀取數據到存儲器中。這兩個系統任務可以在仿真的任何時刻都被執行使用。
(1)$readmemb("<數據文件名>",<存儲器名>);
(2)$readmemb("<數據文件名>",<存儲器名>,<起始地址>);
(3)$readmemb("<數據文件名>",<存儲器名>,<起始地址>,<結束地址>);
(4)$readmemh("<數據文件名>",<存儲器名>);
(5)$readmemh("<數據文件名>",<存儲器名>,<起始地址>);
(6)$readmemh("<數據文件名>",<存儲器名>,<起始地址>,<結束地址>);
在這兩個系統函數中,被讀取的數據文件的內容只能包括:空白字符(空格換行和製表格) 註釋行(//和/**/) 二進制和十六進制數字。當地址出現在數據文件中時,其格式爲@FF...F。
複製代碼
1 module test;
2   reg [0:7]memory[0:7];   //聲明8個8位的存儲單元
3    integer i;
4    initial
5      $readmemb("init.dat",memory);
6      for(i=0;i<8;i=i+1)
7        $display("memory[%d]=%b",i,memory[i]);
8    end
9 endmodule
複製代碼
 如果文件中的內容爲:
@002
11111111 00000000
01010101 10101010
@006
1111xxxx 00001111
則測試結果爲:
memory[0]=xxxxxxxx
memory[1]=xxxxxxxx
memory[2]=11111111
memory[3]=00000000
memory[4]=01010101
memory[5]=10101010
memory[6]=1111xxxx
memory[7]=00001111
在上面6種系統任務格式,需補充說明一下幾點:
(1)如果系統任務和數據文件都沒有說明地址。則從默認的存儲器地址開始寫入數據,直至數據寫完或者存儲器存滿。
(2)如果系統任務說明了起始地址,沒有說明結束地址,則數據從起始地址開始存放,直至存儲器的結束地址爲止。
(3)如果系統任務說明了起始地址和結束地址。那麼久按章任務說明中的地址進行存儲,不考慮存儲器的默認起始地址。
(4)如果系統任務和數據文件都說明了地址。那麼數據文件中的地址說明必須包含在任務地址說明語句中,否則將出現錯誤信息,並且停止存儲。
(5)如果數據文件中的數據個數和系統任務中起始地址和結束地址暗示的數據個數不同,也會報錯。
 
4)系統任務$finish $stop
 
格式:
$finish;
$finish(n);
系統任務$finish的作用是退出仿真器,返回主操作系統,也就是結束仿真過程。$finish可以帶承諾書,根據參數的值輸出不同的特徵信息。如果不帶參數,默認其值爲1;
0 不輸出任何信息。
1 輸出當前的仿真時間和位置;
2 輸出當前的仿真時間、位置和仿真過程中所用memory和CPU的時間統計。
 
格式:
$stop;
$stop(n);
$stop任務的作用是將EDA工具設置爲暫停模式,在仿真環境下給出一個交互式的命令,將控制權交給用戶。參數值越大,輸出信息越多。
 
5)系統任務$random
 
這個系統函數提供了一個產生隨機數的手段。當函數被調用時返回一個32位的隨機數。這是一個帶符號的整型數。
$random的一般用法是:$random%b,其中b>0.他給出了一個範圍在(-b+1):(b-1)中的隨機數。下面給出例子:
reg [23:0]rand;
rand=$random%60;            //生成-59~59之間的隨機數
rand={$random}%60;        //生成0~59之間的隨機數
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章