verilog系統(tǒng)函數(shù)解讀_第1頁(yè)
verilog系統(tǒng)函數(shù)解讀_第2頁(yè)
verilog系統(tǒng)函數(shù)解讀_第3頁(yè)
verilog系統(tǒng)函數(shù)解讀_第4頁(yè)
verilog系統(tǒng)函數(shù)解讀_第5頁(yè)
已閱讀5頁(yè),還剩22頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、Verilog中常用的系統(tǒng)函數(shù)(2011-12-06 14:54:39)轉(zhuǎn)載E3標(biāo)簽:分類:FPGA的研究雜談Verilog HDL常用的系統(tǒng)任務(wù)1. $display( 輸出格式控制列表 ,輸出列表);/顯示變量的值或變量的范圍,自動(dòng)加換行如:$display( “dout=%d dout ”,dout);2. $write();和上面的用法相同,但是不會(huì)自動(dòng)加換行3. $monitor(格式控制 ,輸出列表);/在多模塊調(diào)試的情況下,許多模塊中都調(diào)用了 $monitor,因?yàn)槿魏螘r(shí)刻只能有 一個(gè)$monitor起作用,因此需配合$monitoron與$monitoroff 使用,把需要監(jiān)

2、視的模塊用$monitoron打開,在監(jiān)視完畢后及時(shí)用$monitoroff關(guān)閉,以便把 $monitor讓給其他模塊使用。$monitor與$display的不同處還在于$monitor 往往在initial 塊中調(diào)用,只要不調(diào)用$monitoroff,$monitor 便不間斷地對(duì)所 設(shè)定的信號(hào)進(jìn)行監(jiān)視。4. $time系統(tǒng)函數(shù):返回64位的整數(shù)來(lái)表示當(dāng)前的仿真時(shí)刻;$realtime 系統(tǒng)函數(shù):返回一個(gè)實(shí)型數(shù)表示當(dāng)前仿真時(shí)刻。都以模塊的仿真時(shí)間尺度為基準(zhǔn)。5. $m on itor($realtime,"set=%b",set);/其中一個(gè)用法5. 系統(tǒng)任務(wù)$仙:sh

3、:退出仿真器,返回操作系統(tǒng)6. 系統(tǒng)任務(wù)$stop :暫停仿真器7. 系統(tǒng)任務(wù) $random:$random%!:或者$random%b8. 系統(tǒng)任務(wù) $readmeml:和$readmemh:用于從文件中讀取數(shù)據(jù)到寄存器中, 任何時(shí)候都可以被執(zhí)行 (數(shù)據(jù)方向: 文件 >> 寄存器);有以下用法:1)$readmemb("< 數(shù)據(jù)文件名 >",< 存貯器名 >);2)$readmemb("< 數(shù)據(jù)文件名 >",< 存貯器名 >,<起始地址 >);3)$readmemb("

4、< 數(shù)據(jù)文件名 >",<存貯器名 >,<起始地址>,<結(jié)束地址 >);4)$readmemh("< 數(shù)據(jù)文件名 >",< 存貯器名 >);5)$readmemh("< 數(shù)據(jù)文件名 >",< 存貯器名 >,<起始地址 >);6)$readmemh("< 數(shù)據(jù)文件名 >",<存貯器名 >,<起始地址>,<結(jié)束地址 >);其中文件中的地址表示方式 hhhh-hh, 但是寄存器中

5、的地址可直接用數(shù)表示。 這 里說的地址均是寄存器的地址。9. 顯示層次任務(wù): $display("Dispalying in %m");/ 可以顯示正在仿真的位置10. 選通顯示:$strobe(<輸出格式 >,<輸出列表>);/可以保證當(dāng)所有的賦值語(yǔ)句 完成之后才進(jìn)行顯示,同步機(jī)制。11. 值變轉(zhuǎn)儲(chǔ)任務(wù):將調(diào)試過程中感興趣的信號(hào)轉(zhuǎn)存到VCD文件中的任務(wù)。$dumpfile();選擇轉(zhuǎn)儲(chǔ)的VCD文件$dumpvars();選擇需要存儲(chǔ)的VCD變量范圍$dumpall;/建立一個(gè)監(jiān)測(cè)點(diǎn),轉(zhuǎn)儲(chǔ)當(dāng)前所有 VCD變量的現(xiàn)行值 $dumpon和$dumpoff

6、;/控制轉(zhuǎn)儲(chǔ)的開始和結(jié)束,可用時(shí)間延時(shí)控制轉(zhuǎn)儲(chǔ)過程激勵(lì)的設(shè)置相應(yīng)于被測(cè)試模塊的輸入激勵(lì)設(shè)置為reg型,輸出相應(yīng)設(shè)置為wire類型,雙向端口in out在測(cè)試中需要進(jìn)行處理。方法1:為雙向端口設(shè)置中間變量in out_reg作為該in out的輸出寄存,in out 口在testbe nch中要定義為wire型變量,然后用輸出使能控制傳輸方向。eg :in out 0:0 bi_dir_port;wire 0:0 bi_dir_port;reg 0:0 bi_dir_port_reg;reg bi_dir_port_oe;assig n bi_dir_port=bi_dir_port_oe?bi

7、_dir_port_reg:1'bz;用bi_dir_port_oe控制端口數(shù)據(jù)方向,并利用中間變量寄存器改變其值。等于兩個(gè)模塊之間用in out雙向口互連。往端口寫(就是往模塊里面輸入)方法2:使用force和release語(yǔ)句,這種方法不能準(zhǔn)確反映雙向端口的信號(hào)變化,但這種方法可以反映塊內(nèi)信號(hào)的變化。具體如示:module test。;wire data_ ino ut;reg data_reg;reg link;#xx; /延時(shí)force datanout=1'bx; / 強(qiáng)制作為輸入端口#xx;release data_inout; / 釋放輸入端口en dmodule

8、從文本文件中讀取和寫入向量1)讀取文本文件:用$readmemb系統(tǒng)任務(wù)從文本文件中讀取二進(jìn)制向量(可以包含輸入激勵(lì)和輸出期望值)。$readmemh 用于讀取十六進(jìn)制文件。例如:reg 7:0 mem1:256 / a 8-bit, 256-word定義存儲(chǔ)器 meminitial $readmemh ( "mem.data", mem ) / 將.dat 文件讀入寄存器 mem 中in itial $readmemh ( "mem.data", mem, 128, 1 ) /參數(shù)為寄存器加載數(shù)據(jù)的地址始終2) 輸出文本文件:打開輸出文件用 ?$fop

9、e n例如:integer out_file; / out_file是一個(gè)文件描述,需要定義為integer類型out_file = $fope n (” cpu.data " ); / cpu.data是需要打開的文件,也就是最終的輸出文本設(shè)計(jì)中的信號(hào)值可以通過$fmo nitor, $fdisplay,2. Verilog 和Ncverilog 命令使用庫(kù)文件或庫(kù)目錄ex), ncverilog -frun.f -v lib/lib.v -y lib2 +libext+.v /一般編譯文件在 run.f中,庫(kù)文件在lib.v中,lib2目錄中的.v文件系統(tǒng)自動(dòng)搜索使用庫(kù)文件或庫(kù)目

10、錄,只編譯需要的模塊而不必全部編譯3. Verilog Testbench 信號(hào)記錄的系統(tǒng)任務(wù) :1) . SHM數(shù)據(jù)庫(kù)可以記錄在設(shè)計(jì)仿真過程中信號(hào)的變化.它只在probes有效的時(shí)間內(nèi)記錄你 set probe on的信號(hào)的變化.ex). $shm_ope n("waves.shm"); /打開波形數(shù)據(jù)庫(kù)$shm_probe(top, "AS"); / set probe on "top",第二個(gè)參數(shù) :A - signals of the specific scropeS - Ports of the specified scop

11、e and below, excludi ng library cellsC - Ports of the specified scope and below, in clud ing library cellsAS - Sig nals of the specified scope and below, excludi ng library cellsAC - Sig nals of the specified scope and below, in clud ing library cells還有一個(gè) M ,表示當(dāng)前scope的memories,可以跟上面的結(jié)合使用,"AM&qu

12、ot; "AMS" "AMC"什么都不加表示當(dāng)前scope的ports;$shm_close /關(guān)閉數(shù)據(jù)庫(kù)2) . VCD數(shù)據(jù)庫(kù)也可以記錄在設(shè)計(jì)仿真過程中信號(hào)的變化.它只記錄你選擇的信號(hào)的變化.ex). $dumpfile("filename"); /打開數(shù)據(jù)庫(kù)$dumpvars(1, top.ul); /scope = top.ul, depth = 1第一個(gè)參數(shù)表示深度,為0時(shí)記錄所有深度;第二個(gè)參數(shù)表示scope,省略時(shí)表當(dāng)前的scope.$dumpvars; /depth = all scope = all$dumpvars(

13、0); /depth = all scope = curre nt$dumpvars(1, top.u1); /depth = 1 scope = top.u1$dumpoff /暫停記錄數(shù)據(jù)改變,信號(hào)變化不寫入庫(kù)文件中$dumpon /重新恢復(fù)記錄3) . Debussy fsdb 數(shù)據(jù)庫(kù)也可以記錄信號(hào)的變化,它的優(yōu)勢(shì)是可以跟debussy結(jié)合,方便調(diào)試.如果要在ncverilog仿真時(shí),記錄信號(hào),首先要設(shè)置debussy:a. sete nv LD_LIBRARY_PATH :$LD_LIBRARY_PATH(path for debpli.so file (/share/PLI/nc_x

14、l nc_loadpli1)b. while invoking ncverilog use the +ncloadpli1 option.n cverilog -f run.f +debug +n cloadpli1=debpli:deb_PLIPtrfsdb數(shù)據(jù)庫(kù)文件的記錄方法,是使用$fsdbDumpfile和$fsdbDumpvars系統(tǒng)函數(shù),使用方法參見 VCD注意:在用ncverilog的時(shí)候,為了正確地記錄波形,要使用參數(shù):"+access+W,否則沒有讀寫權(quán)限在記錄信號(hào)或者波形時(shí)需要指出被記錄信號(hào)的路徑,如:tb.module.u1.clk.關(guān)于信號(hào)記錄的系統(tǒng)任務(wù)的說明

15、:在testbench中使用信號(hào)記錄的系統(tǒng)任務(wù),就可以將自己需要的部分的結(jié)果以及波形文件記錄下來(lái)(可采用sigalscan工具查看),適用于對(duì)較大的系統(tǒng)進(jìn)行仿真,速度快,優(yōu)于全局仿真。使用簡(jiǎn)單,在testbench中添加:initial begin$shm_ope n("waves.shm");$shm_probe("要記錄信號(hào)的路徑:” AS)";#10000$shm_close; 即可。4. ncverilog 編譯的順序:ncverilog file1 file2 .有時(shí)候這些文件存在依存關(guān)系,如在file2中要用到在file1中定義的變量,這時(shí)候

16、就要注意其編譯的順序是從后到前,就先編譯file2然后才是file2.5. 信號(hào)的強(qiáng)制賦值 force首先,force語(yǔ)句只能在過程語(yǔ)句中出現(xiàn),即要在initial或者always中間.去除force用release語(yǔ)句.in itial begi n force sig1 = 1'b1; . ; release sig1; endforce可以對(duì)wire賦值,這時(shí)整個(gè)net都被賦值;也可以對(duì)reg賦值.6 加載測(cè)試向量時(shí),避免在時(shí)鐘的上下沿變化為了模擬真實(shí)器件的行為,加載測(cè)試向量時(shí),避免在時(shí)鐘的上下沿變化,而是在時(shí)鐘的上升沿延時(shí)一個(gè)時(shí)間單位后,加載的測(cè)試向量發(fā)生變化。如:assig

17、n #5 c=aAb(posedge elk) #(0.1*'cycle) A=1;*/testbeneh的波形輸出module top;in itialbegi n$dumpfile("./top.ved"); /存儲(chǔ)波形的文件名和路徑,一般是.ved格式.$dumpvars(1,top); /存儲(chǔ)top這一層的所有信號(hào)數(shù)據(jù)$dumpvars(2,top.u1); /存儲(chǔ)top.ul之下兩層的所有數(shù)據(jù)信號(hào)(包含top.ul這一層)$dumpvars(3,top.u2); /存儲(chǔ)top.u2之下三層的所有數(shù)據(jù)信號(hào)(包含top.u2這一層)$dumpvars(0,to

18、p.u3); /存儲(chǔ)top.u3之下所有層的所有數(shù)據(jù)信號(hào)enden dmodule產(chǎn)生隨機(jī)數(shù),seed是種子$ran dom(seed);ex: din <= $ran dom(20);仿真時(shí)間,為unsigned型的64位數(shù)據(jù)$time ex:time con diti on _happe n_time;con diti on _happe n_time = $time;$mo nitor($time,"data utput = %d", dout);參數(shù)parameter paral = 10,para2 = 20,para3 = 30;顯示任務(wù)$display(

19、);監(jiān)視任務(wù)$mon itor();延遲模型specify/describ pin -to-p in delayen dspecifyex:module nan d_or(Y,A,B,C);in put A,B,C;output Y;AND2 #0.2 (N,A,B);OR2 #0.1 (Y,C,N);specify(A*->Y) = 0.2;(B*->Y) = 0.3;(C*->Y) = 0.1;en dspecifyen dmodule時(shí)間刻度'timescale 單位時(shí)間/時(shí)間精確度文件I/O1打開文件in teger file_id;file_id = fop

20、e n("file_path/file_ name");2. 寫入文件/$fmonitor只要有變化就一直記錄$fmon itor(file_id, "%format_char", parameter);eg:$fmonitor(file_id, "%m: %t in 1=%d o1= %h", $time, in1, o1);/$fwrite需要觸發(fā)條件才記錄$fwrite(file_id, "%format_char", parameter);/$fdisplay需要觸發(fā)條件才記錄$fdisplay(file_

21、id, "%format_char", parameter);$fstrobe();3. 讀取文件in teger file_id;file_id = $fread("file_path/file_ name", T);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)制仿

22、真控制$fini sh(parameter); /parameter = 0,1,2$stop(parameter);讀入SDF文件$sdf_a nno tate("sdf_fi le_n ame", module_ in sta nee, "scale_factors");/module_instanee: sdf 文件所對(duì)應(yīng)的 instanee 名.seale_faetors:針對(duì)timming delay 中的最小延時(shí) min,典型延遲typ,最大延時(shí) max調(diào)整延遲參數(shù)generate語(yǔ)句,在Verilog-2001中定義.用于表達(dá)重復(fù)性動(dòng)作必須

23、事先聲明genvar類型變量作為gen erate循環(huán)的指標(biāo)eg:genvar i;gen erate for(i = 0; i < 4; i = i + 1)begi nassig n 二 din i二 i % 2;enden dge nerate資源共享always (A or B or C or D)sum = sel ? (A+B):(C+D);上面例子使用兩個(gè)加法器和一個(gè)MUX,面積大下面例子使用一個(gè)加法器和兩個(gè)MUX,面積小always (A or B or C or D)begi ntmpl = sei ? A:C;tmp2 = sei ? B:D;endalways (t

24、mp1 or tmp2)sum = tmp1 + tmp2;*模板:module testbench; / 定義一個(gè)沒有輸入輸出的 modulereg/將 DUT的輸入定義為reg類型 wire/將 DUT的輸出定義為 wire類型在這里例化DUTin itialbegi n/在這里添加激勵(lì)(可以有多個(gè)這樣的結(jié)構(gòu))endalways 通常在這里定義時(shí)鐘信號(hào)in itial在這里添加比較語(yǔ)句(可選)endin itial在這里添加輸出語(yǔ)句(在屏幕上顯示仿真結(jié)果)enden dmodule一下介紹一些書寫Testbench的技巧:1. 如果激勵(lì)中有一些重復(fù)的項(xiàng)目,可以考慮將這些語(yǔ)句編寫成一個(gè)tas

25、k,這樣會(huì)給書寫和仿真帶來(lái)很大方便。例如,一個(gè)存儲(chǔ)器的testbench的激勵(lì)可以包含 write, read等task。2. 如果DUT中包含雙向信號(hào)(inout),在編寫testbench時(shí)要注意。需要一個(gè)reg變量來(lái)表示其輸入,還需要一個(gè)wire變量表示其輸出。3. 如果initial塊語(yǔ)句過于復(fù)雜,可以考慮將其分為互補(bǔ)相干的幾個(gè)部分,用數(shù)個(gè)initial塊來(lái)描述。在仿真時(shí),這些initial塊會(huì)并發(fā)運(yùn)行。這樣方便閱讀和修改。4每個(gè)testbench都最好包含$stop語(yǔ)句,用以指明仿真何時(shí)結(jié)束。最后提供一個(gè)簡(jiǎn)單的示例俄自Xilinx文檔):DUT :module shift_reg (

26、clock, reset, load, sel, data, shiftreg);in put clock;in put reset;in put load;i叩 ut 1:0 sel;input 4:0 data;output 4:0 shiftreg;reg 4:0 shiftreg;always (posedge clock)begi nif (reset)shiftreg = 0;else if (load)shiftreg = data;elsecase (sei)2' bOO : shiftreg = shiftreg;2' bO1 : shiftreg = shi

27、ftreg << 1;2' b1O : shiftreg = shiftreg >> 1;default : shiftreg = shiftreg;endcaseenden dmoduleTestbench :module testbe nch; / declare testbe nch n amereg clock;reg load;reg reset; / declarati on of sig nalswire 4:0 shiftreg;reg 4:0 data;reg 1:0 sel;/in sta ntiati on of the shift_reg

28、 desig n belowshift_reg dut(.clock (clock),oad (load),.reset (reset),.shiftreg (shiftreg),.data (data),.sel (sel);/this process block sets up the free running clockin itial begi nclock = 0;forever #50 clock = clock;endinitial begin/ this process block specifies the stimulus.reset = 1;data = 5' b

29、00000;load = 0;sel = 2' b00;#200reset = 0;load = 1;#200data = 5' b00001;#100sel = 2' b01;load = 0;#200sel = 2' b10;#1000 $stop;endin itial begi n this process block pipes the ASCII results to the/term inal or text editor$timeformat(-9,1," ns",12);$display(" Time Clk Rs

30、t Ld SftRg Data Sel");$mo nitor("%t %b %b %b %b %b %b", $realtime,clock, reset, load, shiftreg, data, sei);enden dmoduleposted 2009-10-28 11:24神一樣驢子 閱讀(508)評(píng)論(1)編輯(轉(zhuǎn))verilog 中文件輸入/輸出任務(wù)全文地址:http:/hubeixu nbaore 系統(tǒng)函數(shù)$ fopen用于打開一個(gè)文件,并還回一個(gè)整數(shù)指針然后,$fdisplay就可以使用這個(gè)文件指針在文件中寫入信息,寫完后,則可以使用$ fcl

31、ose系統(tǒng)關(guān)閉這個(gè)文件例如:in teger write_out_file; /定義一個(gè)文件指針in teger write_out_file=$fope n("write_out_file.txt");$fdisplay(write_out_file,"%hn % h", addr , data);$ fclose("write_out_file");以上語(yǔ)法是將 addr , data分別顯示在" %hn % h"中的2個(gè) h的位置,并寫入write_out_file 文件指針?biāo)赶虻?write_out_fi

32、le.txt 中.從文件中讀取數(shù)據(jù),可以用$readmemb $readmemh 從文件中讀入數(shù)據(jù),該文件格式是一定的.reg 7:0 data 47:0;$readmemh ("file_name . txt",data );就是將file_name . txt中的數(shù)據(jù)讀入到 data數(shù)組中,然后就可以使用這些數(shù)據(jù)了.還有一種方式可以把指定的數(shù)據(jù)放入指定的存儲(chǔ)器地址單元內(nèi),就是在存放數(shù)據(jù)的文本文件內(nèi),給相應(yīng)的數(shù)據(jù)規(guī)定其內(nèi)存地址,形式如下:address_ inhexadecimaldata 2f20兩個(gè)系統(tǒng)任務(wù)可以在仿真的任何時(shí)刻被執(zhí)行使用,其使用格式共有以下六種:1)

33、$readmemb("<數(shù)據(jù)文件名 >",< 存貯器名>);2)$readmemb("<數(shù)據(jù)文件名>",<存貯器名 >,< 起始地址>);3)$readmemb("<數(shù)據(jù)文件名>",<存貯器名 >,< 起始地址>,<結(jié)束地址>);4)$readmemh("<數(shù)據(jù)文件名>",<存貯器名>);5)$readmemh("<數(shù)據(jù)文件名>",<存貯器名 &g

34、t;,< 起始地址>);6)$readmemh("<數(shù)據(jù)文件名>",<存貯器名 >,< 起始地址>,<結(jié)束地址>);在這兩個(gè)系統(tǒng)任務(wù)中,被讀取的數(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ì)或乙和下劃線(_)的使用方法 及代表的

35、意義與一般 Verilog HDL程序中的用法及意義是一樣的。另外數(shù)字必須用空白位置或注釋行來(lái)分隔開。在下面的討論中,地址一詞指對(duì)存貯器(memory)建模的數(shù)組的尋址指針。當(dāng)數(shù)據(jù)文件被讀取時(shí),每一個(gè)被讀取的數(shù)字都被存放到地址連續(xù)的存貯器單元中去。存貯器單元的存放地址范圍由系統(tǒng)任務(wù)聲明語(yǔ)句中的起始地址和結(jié)束地址來(lái)說明,每個(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ù)

36、存放到存貯器中相應(yīng)的地址單元中去。對(duì)于上面六種系統(tǒng)任務(wù)格式,需補(bǔ)充說明以下五點(diǎn):1)如果系統(tǒng)任務(wù)聲明語(yǔ)句中和數(shù)據(jù)文件里都沒有進(jìn)行地址說明,則缺省的存放起始地址為該存貯器定義語(yǔ)句中的起始地址。數(shù)據(jù)文件里的數(shù)據(jù)被連續(xù)存放到該存貯器中,直到該存貯器單元存滿為止或數(shù)據(jù)文件里的數(shù)據(jù)存完。2) 如果系統(tǒng)任務(wù)中說明了存放的起始地址,沒有說明存放的結(jié)束地址,則數(shù)據(jù)從起始地址開始存放,存放到該存貯器定義語(yǔ) 句中的結(jié)束地址為止。3) 如果在系統(tǒng)任務(wù)聲明語(yǔ)句中,起始地址和結(jié)束地址都進(jìn)行了說明,則數(shù)據(jù)文件里的數(shù)據(jù)按該起始地址開始存放到存貯器單 元中,直到該結(jié)束地址,而不考慮該存貯器的定義語(yǔ)句中的起始地址和結(jié)束地址。4

37、) 如果地址信息在系統(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é)束地址暗示的數(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

38、);initial $readmemh("mem.data",mem,128,1);第一條語(yǔ)句在仿真時(shí)刻為0時(shí),將裝載數(shù)據(jù)到以地址是1的存貯器單元為起始存放單元的存貯器中去。第二條語(yǔ)句將裝載數(shù)據(jù)到以單元地址是16的存貯器單元為起始存放單元的存貯器中去,一直到地址是256的單元為止。第三條語(yǔ)句將從地址是128的單元開始裝載數(shù)據(jù),一直到地址為1的單元。在第三種情況中,當(dāng)裝載完畢,系統(tǒng)要檢查在數(shù)據(jù)文件里是否有128個(gè)數(shù)據(jù),如果沒有,系統(tǒng)將提示錯(cuò)誤信息。"引用參考"1打開文件in teger file_id;file_id = fope n("file

39、_path/file_ name");2. 寫入文件$fmonitor只要有變化就一直記錄$fmon itor(file_id, "%format_char", parameter);eg:$fmonitor(file_id, "%m: %t in 1=%d o1= %h", $time, in1, o1);/$fwrite需要觸發(fā)條件才記錄$fwrite(file_id, "%format_char", parameter);$fdisplay需要觸發(fā)條件才記錄$fdisplay(file_id, "%forma

40、t_char", parameter);$fstrobe();3. 讀取文件in teger file_id;file_id = $fread("file_path/file_ name", T);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):h卄p:/,其系統(tǒng)級(jí)建模的能力

41、更強(qiáng)提供了豐富的系統(tǒng)函數(shù),這為Testbench的編寫提供了方便。尤其是 IEEE1364-2005以前我一般常用到的系統(tǒng)函數(shù)只有幾個(gè):$readmemb , $readmemh , $display , $fmonitor , $fwrite , $fopen , $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、讀寫文件'timescal

42、e 1 n s/1 nsmodule FilelO_tb;in teger fp_r, fp_w, ent;reg 7:0 regl, reg2, reg3;in itial begi nfp_r = $fope n("data_i n. txt", "r");fp_w = $fope n("data_out.txt", "w");while(!$feof(fp_r) beginent = $fseanf(fp_r, "%d %d %d", regl, reg2, reg3);$display(

43、"%d %d %d", regl, reg2, reg3);$fwrite(fp_w, "%d %d %dn", reg3, reg2, regl);end$felose(fp_r);$felose(fp_w);enden dmodule2、in teger file, char;reg eof;in itial begi nfile = $fope nr("myfile.txt");eof = 0;while (eof = 0) beg inchar = $fgetc(file);eof = $feof (file);$displa

44、y ("%s", char);endend3、文件處理定位'defi ne SEEK_SET 0'defi ne SEEK_CUR 1'defi ne SEEK_END 2integer file, offset, position, r;r = $fseek(file, 0,、SEEK_SET); /* Beginning */r = $fseek(file, 0,、SEEK_CUR); /* No effect */r = $fseek(file, 0,、SEEK_END); /* End of file */r = $fseek(file, p

45、osition, 'SEEK_SET); /* Previous loc */4、in teger r, file, start, count;reg 15:0 mem0:10, r16;r = $fread(file, mem0, start, coun t);r = $fread(file, r16);5、in teger file, positi on;position = $ftell(file);6、in teger file, r, a, b;reg 80*8:1 stri ng;file = $fope nw("output.log");r = $sf

46、ormat(stri ng, "Formatted %d %x", a, b);r = $sprintf(string, "Formatted %d %x", a, b);r = $fpri ntf(file, "Formatted %d %x", a, b);7、in teger file, r;file = $fope nw("outputog");r = $fflush(file);8、/ This is a patter n file - read_patter n.pat/ time bin dec he

47、x10: 001 1 120.0: 010 20 02050.02: 111 5 FFF62.345: 100 4 DEADBEEF75.789: XXX 2 ZzZzZzZz'timescale 1ns / 10 ps'defi ne EOF 32'hFFFF_FFFF'defi ne NULL 0'defi ne MAX_ LIN E_LENGTH 1000module read_patter n;in teger file, c, r;reg 3:0 bin;reg 31:0 dec, hex;real real_time;reg 8*'M

48、AX_LINE_LENGTH:0 li ne; /* Line of text read from file */in itialbegi n : file_block$timeformat(-9, 3, "ns", 6);$display("time bin decimal hex");file = $fope nr("read_patter n.pat");if (file = 'NULL) / If error ope ning filedisable file_block; / Just quitc = $fgetc(

49、file);while (c != 'EOF)begi n/* Check the first character for comme nt */if (c = "/")r = $fgets(li ne, 'MAX_LINE_LENGTH, file);elsebegin/ Push the character back to the file then read the next timer = $un getc(c, file);r = $fsca nf(file," %f:n", real_time);/ Wait until the absolute time in the file, then read stimulusif ($realtime > real_time)$display("Error - absolute time in file is out of o

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論