verilog檔案系統函式呼叫
1 $open
Integermulti_channel_descriptor= $fopen ( "file_name" );
返回檔案的多通道描述符,只允許寫資料,最多能開啟31個檔案,最高位保留。
注意:用$fopen開啟檔案會將原來的檔案清空,若要讀資料就用$readmemb,$readmemh就可以了,這個語句不會清空原來檔案中的資料。integerfd = $fopen ( " file_name",type);
返回檔案描述符
type列舉:
"r" or "rb" |
以只讀的方式開啟 清除檔案內容並以只寫的方式開啟 |
開啟失敗可呼叫$ferror
2 $close
關閉檔案,同時隱式終結$fmonitor、$fstrobe等任務
3 檔案寫入指令
file_output_task_name (multi_channel_descriptor , list_of_arguments ) ;
file_output_task_name ( fd , list_of_arguments ) ;
file_output_task_name ::=
$fdisplay | $fdisplayb | $fdisplayh | $fdisplayo
| $fwrite | $fwriteb | $fwriteh | $fwriteo
| $fstrobe | $fstrobeb | $fstrobeh | $fstrobeo
| $fmonitor | $fmonitorb | $fmonitorh | $fmonitoro
//$fmonitor只要有變化就一直記錄
$fmonitor(file_id,"%format_char", parameter);
$fmonitor(file_id, "%m:%t in1=%d o1=%h", $time, in1, o1);
//$fwrite需要觸發條件才記錄,不自動換行
$fwrite(file_id,"%format_char", parameter);
//$fdisplay需要觸發條件才記錄
$fdisplay(file_id,"%format_char", parameter);
$fstrobe();當該時刻的所有事件處理完後,在這個時間步的結尾寫入。推薦使用。
4 文字格式化
$sformat ( output_reg, format, list_of_arguments );
example
integer file, r, a, b;
reg [80*8:1] string;
file = $fopenw("output.log");
r = $sformat(string, "Formatted %d %x", a, b);
r = $sprintf(string, "Formatted %d %x", a, b);
r = $fprintf(file, "Formatted %d %x", a, b);
5 從檔案中讀取資料
c = $fgetc ( fd )
從檔案中讀取一個byte,若發聲錯誤或讀完,返回eof(-1),寬度位8位
code = $ungetc ( c, fd );
將由c指定的字元插入到由檔案描述符fd指定的緩衝區中。字元c應為
由該檔案描述符的下一個$ fgetc呼叫返回。檔案本身不變。
integer code = $fgets ( str,fd );
從由fd指定的檔案中讀取字元到str,直到str被填滿,或換行符被讀取並傳輸到str,或遇到檔案結束條件。如果str的長度不是byte的倍數,則部分最高位將捨棄不用保證填滿整數個位元組。
integer code = $fscanf ( fd,format, args );
按照固定格式從fd制定的檔案中讀取資料,args為讀取的位置
integer code = $sscanf ( str,format, args );
$sscanf reads from the reg str
integer code = $fread( myreg,fd);
integer code = $fread( mem, fd);
integer code = $fread( mem, fd, start);
integer code = $fread( mem, fd, start, count);
integer code = $fread( mem, fd, , count);
讀取二進位制流,將資料從fd讀向myreg或mem,不可讀x,z.start是指mem的位置,
For start = 12 and the memory up[10:20],the first data would be loaded at up[12]. For the memory down[20:10],the first location loaded would be down[12], then down[13]。
預設情況下myreg將mem填滿或自身讀完截至。
檔案中的資料逐位元組讀取。使用一個8位寬的儲存器載入一個位元組,而使用每個儲存器字2個位元組寬載入9位寬的儲存器。資料是以大尾數方式從檔案中讀取;第一個位元組讀取用於填充最重要的位置儲存元件。如果記憶體寬度不能被8(8,16,24,32)整除,則由於截斷並不是檔案中的所有資料都載入到記憶體中。
6 定位
integerpos = $ftell ( fd );
返回fd當前位元組與fd檔案開頭的偏移至pos,可以用於後續的$fseek使用,以將檔案重新定位到此點。
code= $fseek ( fd, offset, operation );
code = $rewind ( fd );
operation:
0:設定位置到偏移地址
1:設定位置到當前位置加偏移量
2:設定位置到檔案結束位置$fseek(fd,0,0)
When a file is opened forappend (that is, when type is "a", or "a+"), it isimpossible to overwrite information already in the file.
7 檔案沖洗
$fflush ( mcd );
$fflush ( fd );
$fflush ( );
將所有緩衝區的資料寫入制定的mcd或fd,若引數預設,衝寫所有開啟的檔案
8 載入檔案到儲存區
$readmemb ( " file_name ", memory_name [ , start_addr [ , finish_addr ] ] ) ;
| $readmemh ( " file_name " , memory_name [ , start_addr [ , finish_addr] ] ) ;