1. 程式人生 > >verilog檔案系統函式呼叫

verilog檔案系統函式呼叫

1 $open

Integermulti_channel_descriptor= $fopen ( "file_name" );

返回檔案的多通道描述符,只允許寫資料,最多能開啟31個檔案,最高位保留。

注意:用$fopen開啟檔案會將原來的檔案清空,若要讀資料就用$readmemb,$readmemh就可以了,這個語句不會清空原來檔案中的資料。integerfd = $fopen ( " file_name",type);

返回檔案描述符

type列舉:

"r" or "rb"
"w" or "wb"
"a" or "ab"
"r+", "r+b", or "rb+"
"w+", "w+b", or "wb+"
"a+", "a+b", or "ab+"

以只讀的方式開啟

清除檔案內容並以只寫的方式開啟
在檔案末尾寫資料
以可讀寫的方式開啟檔案
讀寫開啟或建立一個檔案,允許讀寫
讀寫開啟或建立一個文字檔案,允許讀,或在末尾追加資訊

開啟失敗可呼叫$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] ] ) ;