.verilog系統任務讀寫檔案$fopen和$fdisplay的使用
阿新 • • 發佈:2019-02-05
1.$fopen開啟檔案
用法1.$fopen("<檔名>");
用法2.<檔案控制代碼>=$fopen("<檔名>");
注意:用$fopen開啟檔案會將原來的檔案清空,若要讀資料就用$readmemb,$readmemh就可以了,這個語句不會清空原來檔案中的資料。
用$fopen的情況是為了取得控制代碼,即檔案地址,也就是寫檔案時用$fdisplay(desc,"display1");時才用。
用法1自然無須多解釋,對於用法2,控制代碼就是任務$fopen返回的多通道描述符,預設為32位,最低位(第0位)預設被設定1,預設開放標準輸出通道,即transcript視窗。
module disp;
integer handle1,handle2,handle3; initial
begin
handle1=$fopen("file1.dat");
handle2=$fopen("file2.dat");
handle3=$fopen("file3.dat"); $display("%h %h %h",handle1,handle2,handle3); end endmodule 輸出 handle1=32‘h0000_0002 handle2=32'h0000_0004 handle3=32'h0000_0008 即對每一次使用$fopen函式後都打開了一個新的通道,並且返回了一個設定為1的位相對應。預設應該是0001,以上每呼叫分別設定為0010 ,0100,1000(只考慮最低四位)。 這個控制代碼對我們非常有用,因為在寫檔案時會用到。 2.寫檔案我們用到系統任務$fdisplay,$fwrite. 兩者用法相似,前者寫完就會自動換行,後者不會換行。 用法:$fdisplay(<檔案描述符(控制代碼,用於確定是寫哪一個檔案)>,p1,p2(寫入內容)); 描述符是很有意思的(預設為32位),如上我們知道,檔案控制代碼最多隻能有一個1,但是描述符可以是有多個1,哪一個位上有1,就同時在這些位對應的輸出檔案上寫檔案。因此可以同時寫多個檔案。 只考慮後四位情況: 1,0001時,只進行在transcript對話方塊中的輸出, 2,0101時,即對file2檔案寫又在transcript框輸出、 3,1111時,對全部檔案寫,同時在transcript框輸出。 由於每個控制代碼只有一個位置上是1,因此我們想在哪些檔案中同時輸出我們就可以用以下語句來寫 desc=handleI | handleK | handleM | handleN | 1(一般與1或,最低位置1再transcript框輸出。) 一個例子如下: module disp;
integer handle1,handle2,handle3;
integer desc1,desc2,desc3;
initial
begin
handle1=$fopen("file1.dat");
handle2=$fopen("file2.dat");
handle3=$fopen("file3.dat");
$display("%h %h %h",handle1,handle2,handle3);
desc1=handle1|1;
$fwrite(desc1,"display 1");
$fmoniter(desc1,"display 1");
$fstrobe(desc1,"display 1");
desc2=handle2|handle1|1;
$fdisplay(desc2,"display 2");
desc3=handle3|1;
$fdisplay(32'd15,"display 3");
end
endmodule
integer handle1,handle2,handle3; initial
begin
handle1=$fopen("file1.dat");
handle2=$fopen("file2.dat");
handle3=$fopen("file3.dat"); $display("%h %h %h",handle1,handle2,handle3); end endmodule 輸出 handle1=32‘h0000_0002 handle2=32'h0000_0004 handle3=32'h0000_0008 即對每一次使用$fopen函式後都打開了一個新的通道,並且返回了一個設定為1的位相對應。預設應該是0001,以上每呼叫分別設定為0010 ,0100,1000(只考慮最低四位)。 這個控制代碼對我們非常有用,因為在寫檔案時會用到。 2.寫檔案我們用到系統任務$fdisplay,$fwrite. 兩者用法相似,前者寫完就會自動換行,後者不會換行。 用法:$fdisplay(<檔案描述符(控制代碼,用於確定是寫哪一個檔案)>,p1,p2(寫入內容)); 描述符是很有意思的(預設為32位),如上我們知道,檔案控制代碼最多隻能有一個1,但是描述符可以是有多個1,哪一個位上有1,就同時在這些位對應的輸出檔案上寫檔案。因此可以同時寫多個檔案。 只考慮後四位情況: 1,0001時,只進行在transcript對話方塊中的輸出, 2,0101時,即對file2檔案寫又在transcript框輸出、 3,1111時,對全部檔案寫,同時在transcript框輸出。 由於每個控制代碼只有一個位置上是1,因此我們想在哪些檔案中同時輸出我們就可以用以下語句來寫 desc=handleI | handleK | handleM | handleN | 1(一般與1或,最低位置1再transcript框輸出。) 一個例子如下: module disp;
integer handle1,handle2,handle3;
integer desc1,desc2,desc3;
initial
begin
handle1=$fopen("file1.dat");
handle2=$fopen("file2.dat");
handle3=$fopen("file3.dat");
$display("%h %h %h",handle1,handle2,handle3);
desc1=handle1|1;
$fwrite(desc1,"display 1");
$fmoniter(desc1,"display 1");
$fstrobe(desc1,"display 1");
desc2=handle2|handle1|1;
$fdisplay(desc2,"display 2");
desc3=handle3|1;
$fdisplay(32'd15,"display 3");
end
endmodule