版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、verilog系統(tǒng)任務(wù)之讀寫文件1.$fopen打開文件用法1.$fopen("<文件名>");用法2.<文件句柄>=$fopen("<文件名>");注意:用$fopen打開文件會(huì)將原來的文件清空,若要讀數(shù)據(jù)就用$readmemb,$readmemh就可以了,這個(gè)語句不會(huì)清空原來文件中的數(shù)據(jù)。用$fopen的情況是為了取得句柄,即文件地址,也就是寫文件時(shí)用$fdisplay(desc,"display1");時(shí)才用。用法1自然無須多解釋,對(duì)于用法2,句柄就是任務(wù)$fopen返回的多通道描述符,默認(rèn)為
2、32位,最低位(第0位)默認(rèn)被設(shè)置1,默認(rèn)開放標(biāo)準(zhǔn)輸出通道,即transcript窗口。module disp;integer handle1,handle2,handle3;initialbeginhandle1=$fopen("file1.dat");handle2=$fopen("file2.dat");handle3=$fopen("file3.dat");$display("%h %h %h",handle1,handle2,handle3);endendmodule輸出handle1=32h0000_0
3、002handle2=32'h0000_0004handle3=32'h0000_0008即對(duì)每一次使用$fopen函數(shù)后都打開了一個(gè)新的通道,并且返回了一個(gè)設(shè)置為1的位相對(duì)應(yīng)。默認(rèn)應(yīng)該是0001,以上每調(diào)用分別設(shè)置為0010 ,0100,1000(只考慮最低四位)。這個(gè)句柄對(duì)我們非常有用,因?yàn)樵趯懳募r(shí)會(huì)用到。 2.寫文件我們用到系統(tǒng)任務(wù)$fdisplay,$fwrite.兩者用法相似,前者寫完就會(huì)自動(dòng)換行,后者不會(huì)換行。用法:$fdisplay(<文件描述符(句柄,用于確定是寫哪一個(gè)文件)>,p1,p2(寫入內(nèi)容));描述符是很有意思的(默認(rèn)為32位),如上我們
4、知道,文件句柄最多只能有一個(gè)1,但是描述符可以是有多個(gè)1,哪一個(gè)位上有1,就同時(shí)在這些位對(duì)應(yīng)的輸出文件上寫文件。因此可以同時(shí)寫多個(gè)文件。只考慮后四位情況:1,0001時(shí),只進(jìn)行在transcript對(duì)話框中的輸出,2,0101時(shí),即對(duì)file2文件寫又在transcript框輸出、3,1111時(shí),對(duì)全部文件寫,同時(shí)在transcript框輸出。由于每個(gè)句柄只有一個(gè)位置上是1,因此我們想在哪些文件中同時(shí)輸出我們就可以用以下語句來寫desc=handleI | handleK | handleM | handleN | 1(一般與1或,最低位置1再transcript框輸出。)一個(gè)例子如下:mod
5、ule disp;integer handle1,handle2,handle3;integer desc1,desc2,desc3;initialbeginhandle1=$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")
6、;$fmoniter(desc1,"display 1");$fstrobe(desc1,"display 1");desc2=handle2|handle1|1;$fdisplay(desc2,"display 2");desc3=handle3|1;$fdisplay(32'd15,"display 3");endendmodule$monitor系統(tǒng)任務(wù)提供了監(jiān)控和輸出參數(shù)列表中的表達(dá)式和變量值的功能,其參數(shù)列表中輸出控制格式字符串和輸出表列的規(guī)則和$display一樣,當(dāng)啟動(dòng)一個(gè)帶有一個(gè)或多個(gè)參數(shù)的
7、$monitor任務(wù)時(shí),每當(dāng)參數(shù)列表中的變量或表達(dá)式的值發(fā)生變化時(shí)整個(gè)參數(shù)列表中變量或表達(dá)式的值都將輸出顯示。如果同一時(shí)刻有兩個(gè)或多個(gè)表達(dá)式的值發(fā)生變化,只輸出一次。 參數(shù)可以是$time,用于標(biāo)明變化時(shí)刻。如$monitor ($time,"rxd=%b txd=%b",rxd,txd);這里的“,”用來表示空格參數(shù)在輸出時(shí)顯示為空格$monitor的打開和關(guān)閉分別用$monitoron和$monitoroff表示,用來控制任務(wù)的啟動(dòng)和停止,使得很容易控制任務(wù)何時(shí)發(fā)生,何時(shí)結(jié)束。$monitor用于initial塊中,只要不調(diào)用$monitoroff,該任務(wù)就可以不間斷的
8、對(duì)所設(shè)定信號(hào)進(jìn)行監(jiān)視。例子如下(對(duì)一個(gè)4位加法計(jì)數(shù)器counter信號(hào)進(jìn)行監(jiān)控):timescale 1ns/1nsmodule moni_test();reg3:0counter;reg clk;reg rst;initialbeginrst=0;#10 rst=1;$monitor ($time,"counter=%d",counter);$monitoron;endinitialbeginclk=0;forever #5 clk=clk;endalways(negedge rst or posedge clk)if(!rst)counter<=4'd0;
9、elsecounter<=counter+1;endmodule主要觀察transcript對(duì)話框,可見每經(jīng)過10ns,counter就會(huì)變化一次,此時(shí)參量時(shí)間也會(huì)輸出。注意1. 僅監(jiān)測(cè)$time是不會(huì)每次都輸出的,必須是除了時(shí)間之外的參量變化才可以做到參量變化就輸出2 .,符號(hào)輸出的是一個(gè)空格符,輸出結(jié)果中得到了驗(yàn)證。 轉(zhuǎn)載自: 系統(tǒng)函數(shù)fopen用于打開一個(gè)文件,并還回一個(gè)整數(shù)指針然后,fdisplay就可以使用這個(gè)文件指針在文件中寫入信息,寫完后,則可以使用fclose系統(tǒng)關(guān)閉這個(gè)文件例如:integer write_out_file;定義一個(gè)文件指針integer write_o
10、ut_file=$fopen("write_out_file.txt");$fdisplay(write_out_file,"%hnh",addr,data);fclose("write_out_file");以上語法是將addr,data分別顯示在%hnh中的個(gè)h的位置,并寫入write_out_file文件指針?biāo)赶虻膚rite_out_file.txt中從文件中讀取數(shù)據(jù),可以用 $readmemb $readmemh 從文件中讀入數(shù)據(jù),該文件格式是一定的reg:data:;$readmemh("file_nametxt
11、",data );就是將file_nametxt中的數(shù)據(jù)讀入到data數(shù)組中,然后就可以使用這些數(shù)據(jù)了 還有一種方式可以把指定的數(shù)據(jù)放入指定的存儲(chǔ)器地址單元內(nèi),就是在存放數(shù)據(jù)的文本文件內(nèi),給相應(yīng)的數(shù)據(jù)規(guī)定其內(nèi)存地址,形式如下:address_in_hexadecimal data2f20 兩個(gè)系統(tǒng)任務(wù)可以在仿真的任何時(shí)刻被執(zhí)行使用,其使用格式共有以下六種: 1) $readmemb("<數(shù)據(jù)文件名>",<存貯器名>); 2) $readmemb("<數(shù)據(jù)文件名>",<存貯器名>,<起始地址&
12、gt;); 3) $readmemb("<數(shù)據(jù)文件名>",<存貯器名>,<起始地址>,<結(jié)束地址>); 4) $readmemh("<數(shù)據(jù)文件名>",<存貯器名>); 5) $readmemh("<數(shù)據(jù)文件名>",<存貯器名>,<起始地址>); 6) $readmemh("<數(shù)據(jù)文件名>",<存貯器名>,<起始地址>,<結(jié)束地址>); 在這兩個(gè)系統(tǒng)任務(wù)中,被讀取
13、的數(shù)據(jù)文件的內(nèi)容只能包含:空白位置(空格,換行,制表格(tab)和form-feeds),注釋行(/形式的和形式的都允許),二進(jìn)制或十六進(jìn)制的數(shù)字。數(shù)字中不能包含位寬說明和格式說明,對(duì)于$readmemb系統(tǒng)任務(wù),每個(gè)數(shù)字必須是二進(jìn)制數(shù)字,對(duì)于$readmemh系統(tǒng)任務(wù),每個(gè)數(shù)字必須是十六進(jìn)制數(shù)字。數(shù)字中不定值x或X,高阻值z(mì)或Z,和下劃線(_)的使用方法及代表的意義與一般Verilog HDL程序中的用法及意義是一樣的。另外數(shù)字必須用空白位置或注釋行來分隔開。 在下面的討論中,地址一詞指對(duì)存貯器(memory)建模的數(shù)組的尋址指針。當(dāng)數(shù)據(jù)文件被讀取時(shí),每一個(gè)被讀取的數(shù)字都被存放到地址連續(xù)的存
14、貯器單元中去。存貯器單元的存放地址范圍由系統(tǒng)任務(wù)聲明語句中的起始地址和結(jié)束地址來說明,每個(gè)數(shù)據(jù)的存放地址在數(shù)據(jù)文件中進(jìn)行說明。當(dāng)?shù)刂烦霈F(xiàn)在數(shù)據(jù)文件中,其格式為字符“”后跟上十六進(jìn)制數(shù)。如: hh.h 對(duì)于這個(gè)十六進(jìn)制的地址數(shù)中,允許大寫和小寫的數(shù)字。在字符“”和數(shù)字之間不允許存在空白位置。可以在數(shù)據(jù)文件里出現(xiàn)多個(gè)地址。當(dāng)系統(tǒng)任務(wù)遇到一個(gè)地址說明時(shí),系統(tǒng)任務(wù)將該地址后的數(shù)據(jù)存放到存貯器中相應(yīng)的地址單元中去。 對(duì)于上面六種系統(tǒng)任務(wù)格式,需補(bǔ)充說明以下五點(diǎn): 1) 如果系統(tǒng)任務(wù)聲明語句中和數(shù)據(jù)文件里都沒有進(jìn)行地址說明,則缺省的存放起始地址為該存貯器定義語句中的起始地址。數(shù)據(jù)文件里的數(shù)據(jù)被連續(xù)存放到該
15、存貯器中,直到該存貯器單元存滿為止或數(shù)據(jù)文件里的數(shù)據(jù)存完。2) 如果系統(tǒng)任務(wù)中說明了存放的起始地址,沒有說明存放的結(jié)束地址,則數(shù)據(jù)從起始地址開始存放,存放到該存貯器定義語句中的結(jié)束地址為止。3) 如果在系統(tǒng)任務(wù)聲明語句中,起始地址和結(jié)束地址都進(jìn)行了說明,則數(shù)據(jù)文件里的數(shù)據(jù)按該起始地址開始存放到存貯器單元中,直到該結(jié)束地址,而不考慮該存貯器的定義語句中的起始地址和結(jié)束地址。4) 如果地址信息在系統(tǒng)任務(wù)和數(shù)據(jù)文件里都進(jìn)行了說明,那么數(shù)據(jù)文件里的地址必須在系統(tǒng)任務(wù)中地址參數(shù)聲明的范圍之內(nèi)。否則將提示錯(cuò)誤信息,并且裝載數(shù)據(jù)到存貯器中的操作被中斷。5) 如果數(shù)據(jù)文件里的數(shù)據(jù)個(gè)數(shù)和系統(tǒng)任務(wù)中起始地址及結(jié)束
16、地址暗示的數(shù)據(jù)個(gè)數(shù)不同的話,也要提示錯(cuò)誤信息。 下面舉例說明:先定義一個(gè)有256個(gè)地址的字節(jié)存貯器 mem: reg7:0 mem1:256; 下面給出的系統(tǒng)任務(wù)以各自不同的方式裝載數(shù)據(jù)到存貯器mem中。 initial $readmemh("mem.data",mem);initial $readmemh("mem.data",mem,16);initial $readmemh("mem.data",mem,128,1); 第一條語句在仿真時(shí)刻為0時(shí),將裝載數(shù)據(jù)到以地址是1的存貯器單元為起始存放單元的存貯器中去。第二條語句將裝載數(shù)據(jù)
17、到以單元地址是16的存貯器單元為起始存放單元的存貯器中去,一直到地址是256的單元為止。第三條語句將從地址是128的單元開始裝載數(shù)據(jù),一直到地址為1的單元。在第三種情況中,當(dāng)裝載完畢,系統(tǒng)要檢查在數(shù)據(jù)文件里是否有128個(gè)數(shù)據(jù),如果沒有,系統(tǒng)將提示錯(cuò)誤信息。 引用參考1.打開文件integer file_id;file_id = fopen("file_path/file_name");2.寫入文件/$fmonitor只要有變化就一直記錄$fmonitor(file_id, "%format_char", parameter);eg:$fmonitor(f
18、ile_id, "%m: %t in1=%d o1=%h", $time, in1, o1);/$fwrite需要觸發(fā)條件才記錄$fwrite(file_id, "%format_char", parameter);/$fdisplay需要觸發(fā)條件才記錄$fdisplay(file_id, "%format_char", parameter);$fstrobe();3.讀取文件integer file_id;file_id = $fread("file_path/file_name", "r")
19、;4.關(guān)閉文件$fclose(fjile_id);5.由文件設(shè)定存儲(chǔ)器初值$readmemh("file_name", memory_name"); /初始化數(shù)據(jù)為十六進(jìn)制$readmemb("file_name", memory_name"); /初始化數(shù)據(jù)為二進(jìn)制 轉(zhuǎn):提供了豐富的系統(tǒng)函數(shù),這為Testbench的編寫提供了方便。尤其是IEEE1364-2005,其系統(tǒng)級(jí)建模的能力更強(qiáng)。 以前我一般常用到的系統(tǒng)函數(shù)只有幾個(gè):$readmemb,$readmemh,$display,$fmonitor,$fwrite,$fopen,
20、$fclose等。通常需要對(duì)文件作預(yù)處理,才能用于Testbench讀取。今天又嘗試了幾個(gè)其他的文件輸入輸出函數(shù),不需要對(duì)文件進(jìn)行預(yù)處理,直接使用需要的文件,只對(duì)需要的部分進(jìn)行讀取。 $fseek,文件定位,可以從任意點(diǎn)對(duì)文件進(jìn)行操作; $fscanf,對(duì)文件一行進(jìn)行讀寫。 下面是一些常見的應(yīng)用: 1、讀寫文件timescale 1 ns/1 nsmodule FileIO_tb;integer fp_r, fp_w, cnt;reg 7:0 reg1, reg2, reg3;initial begin fp_r = $fopen("data_in.txt", "
21、r"); fp_w = $fopen("data_out.txt", "w"); while(!$feof(fp_r) begin cnt = $fscanf(fp_r, "%d %d %d", reg1, reg2, reg3); $display("%d %d %d", reg1, reg2, reg3); $fwrite(fp_w, "%d %d %dn", reg3, reg2, reg1); end $fclose(fp_r); $fclose(fp_w);endendmod
22、ule 2、integer file, char;reg eof;initial begin file = $fopenr("myfile.txt"); eof = 0; while (eof = 0) begin char = $fgetc(file); eof = $feof (file); $display ("%s", char); endend 3、文件處理定位define SEEK_SET 0define SEEK_CUR 1define SEEK_END 2integer file, offset, position, r;r = $fse
23、ek(file, 0, SEEK_SET);r = $fseek(file, 0, SEEK_CUR);r = $fseek(file, 0, SEEK_END);r = $fseek(file, position, SEEK_SET); 4、integer r, file, start, count;reg 15:0 mem0:10, r16;r = $fread(file, mem0, start, count);r = $fread(file, r16); 5、integer file, position;position = $ftell(file); 6、integer file,
24、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); 7、integer file, r;file = $fopenw("output.log");r = $fflush
25、(file); 8、/ This is a pattern file - read_pattern.pat/ time bin dec hex10: 001 1 120.0: 010 20 02050.02: 111 5 FFF62.345: 100 4 DEADBEEF75.789: XXX 2 ZzZzZzZztimescale 1ns / 10 psdefine EOF 32'hFFFF_FFFFdefine NULL 0define MAX_LINE_LENGTH 1000module read_pattern;integer file, c, r;reg 3:0 bin;re
26、g 31:0 dec, hex;real real_time;reg 8*MAX_LINE_LENGTH:0 line;initial begin : file_block $timeformat(-9, 3, "ns", 6); $display("time bin decimal hex"); file = $fopenr("read_pattern.pat"); if (file = NULL) / If error opening file disable file_block; / Just quit c = $fgetc(
27、file); while (c != EOF) begin if (c = "/") r = $fgets(line, MAX_LINE_LENGTH, file); else begin / Push the character back to the file then read the next time r = $ungetc(c, file); r = $fscanf(file," %f:n", real_time); / Wait until the absolute time in the file, then read stimulus
28、if ($realtime > real_time) $display("Error - absolute time in file is out of order - %t", real_time); else #(real_time - $realtime) r = $fscanf(file," %b %d %hn",bin,dec,hex); end / if c else c = $fgetc(file); end / while not EOF r = $fcloser(file); end / initial/ Display chan
29、ges to the signalsalways (bin or dec or hex) $display("%t %b %d %h", $realtime, bin, dec, hex);endmodule / read_pattern 9、自動(dòng)比較輸出結(jié)果define EOF 32'hFFFF_FFFFdefine NULL 0define MAX_LINE_LENGTH 1000module compare;integer file, r;reg a, b, expect, clock;wire out;reg MAX_LINE_LENGTH*8:1;parameter cycle = 20;initial begin : file_block $display("Time Stim Expect Output"); clock = 0; file = $fopenr
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五版KTV品牌形象設(shè)計(jì)與推廣合同5篇
- 2025年度高性能鋁礦石現(xiàn)貨交易合同4篇
- 宣城市重點(diǎn)中學(xué)2025屆中考生物考前最后一卷含解析
- 公司環(huán)境知識(shí)培訓(xùn)
- 2025年度柴油發(fā)電機(jī)設(shè)備采購(gòu)與環(huán)保驗(yàn)收服務(wù)協(xié)議4篇
- 二零二四年工程機(jī)械設(shè)備租賃合同(含保險(xiǎn))3篇
- 二零二五年度集裝箱式寵物醫(yī)院購(gòu)銷合同3篇
- 二零二五年度藝術(shù)品拍賣賒購(gòu)交易合同4篇
- 【8生(BS)期末】淮南市2024-2025學(xué)年八年級(jí)上學(xué)期期末生物試題
- 2025年度智慧社區(qū)場(chǎng)地租賃及社區(qū)服務(wù)合作協(xié)議4篇
- GB/T 12914-2008紙和紙板抗張強(qiáng)度的測(cè)定
- GB/T 1185-2006光學(xué)零件表面疵病
- ps6000自動(dòng)化系統(tǒng)用戶操作及問題處理培訓(xùn)
- 家庭教養(yǎng)方式問卷(含評(píng)分標(biāo)準(zhǔn))
- 城市軌道交通安全管理課件(完整版)
- 線纜包覆擠塑模設(shè)計(jì)和原理
- TSG ZF001-2006 安全閥安全技術(shù)監(jiān)察規(guī)程
- 部編版二年級(jí)語文下冊(cè)《蜘蛛開店》
- 鍋爐升降平臺(tái)管理
- 200m3╱h凈化水處理站設(shè)計(jì)方案
- 個(gè)體化健康教育記錄表格模板1
評(píng)論
0/150
提交評(píng)論