集成電路設(shè)計(jì)課件:9 testbench編寫_第1頁
集成電路設(shè)計(jì)課件:9 testbench編寫_第2頁
集成電路設(shè)計(jì)課件:9 testbench編寫_第3頁
集成電路設(shè)計(jì)課件:9 testbench編寫_第4頁
集成電路設(shè)計(jì)課件:9 testbench編寫_第5頁
已閱讀5頁,還剩46頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、testbench編寫系統(tǒng)任務(wù)和函數(shù)Testbenchverilog對(duì)驗(yàn)證的支持在數(shù)字電路的設(shè)計(jì)過程中,仿真與驗(yàn)證是一個(gè)重要的環(huán)節(jié),它能檢查所設(shè)計(jì)的電路是否符合要求。Verilog提供系統(tǒng)任務(wù)和函數(shù)支持仿真與驗(yàn)證。 在Verilog HDL語言中每個(gè)系統(tǒng)函數(shù)和任務(wù)前面都用一個(gè)標(biāo)識(shí)符$來加以確認(rèn)。這些系統(tǒng)函數(shù)和任務(wù)提供了非常強(qiáng)大的功能。1.仿真時(shí)間訪問仿真時(shí)間$time,$realtime,和$stime函數(shù)返回當(dāng)前仿真時(shí)間。這些函數(shù)的返回值使用調(diào)用模塊中timescale定義的時(shí)間單位$time返回一個(gè)64位整數(shù)時(shí)間值。$stime返回一個(gè)32位整數(shù)時(shí)間值。$realtime返回一個(gè)實(shí)數(shù)時(shí)間值

2、。 $stime函數(shù)返回一個(gè)32位整數(shù)時(shí)間值。對(duì)大于232的時(shí)間,返回模232的值。使用它可以節(jié)省顯示及打印空間。 timescale 10ns / 100psmodule top; reg in1; not m1( o1, in1); initial begin $timeformat(-9, 2, ns, 10); in1 = 0; #8 in1 = 1; #10 $display(%t %b %b, $realtime, in1, o1); #10 $finish; endendmodule在這個(gè)例子中,顯示的時(shí)間為:180.00 nsunit:0到-15之間的整數(shù),表示時(shí)間度量(s,

3、fs),10-nprecision:要顯示的十進(jìn)制小數(shù)位數(shù)。suffix:在時(shí)間值后顯示的字符串min_width:顯示前三項(xiàng)的最小寬度 若使用多個(gè)timescale,以最小的時(shí)間精度顯示時(shí)間值??捎孟到y(tǒng)任務(wù)$timeformat結(jié)合格式符%t全局控制時(shí)間顯示方式。$timeformat系統(tǒng)任務(wù)的語法為: $timeformat(,);輸出格式化時(shí)間信息timescale 1 ns / 10 psmodule top; reg in1; not #9.53 n1 (o1, in1); initial begin $display(time realtime stime t in1 t o1 )

4、; $timeformat(-9, 2, ns, 10); $monitor(%d %t %d t %b t %b, $time, $realtime, $stime, in1, o1); in1 = 0; #10 in1 = 1; #10 $finish; endendmoduletime realtime stime in1 o1 0 0.00ns 0 0 x10 9.53ns 10 0 110 10.00ns 10 1 120 19.53ns 20 1 0輸出格式化時(shí)間信息對(duì)#延遲,Verilog將延遲值舍入最近(四舍五入)時(shí)間精度值。例如,上面的例子修改為:timescale 1ns/

5、 100psnot #9.42 n1 (o1, in1);結(jié)果為:time realtime stime in1 o1 0 0.00ns 0 0 x 9 9.40ns 9 0 110 10.00ns 10 1 119 19.40ns 19 1 0timescale 1ns/ 100psnot #9.49 n1 (o1, in1);結(jié)果為:time realtime stime in1 o1 0 0.00ns 0 0 x 9 9.50ns 9 0 110 10.00ns 10 1 119 19.50ns 19 1 02. 顯示信號(hào)值 $display$display輸出參數(shù)列表中信號(hào)的當(dāng)前值。

6、語法:$display(“ format_specifiers”, )$display輸出時(shí)自動(dòng)換行。 $display ($ time, “%b t %h t %d t %o”, sig1, sig2, sig3, sig4); $display ($ time, “%b t”, sig1, “%h t”, sig2, “% d t”, sig3, “%o”, sig4);$display支持二進(jìn)制、八進(jìn)制、十進(jìn)制和十六進(jìn)制。缺省基數(shù)為十進(jìn)制。 $display (sig1, sig2, sig3, sig4); $displayb (sig1, sig2, sig3, sig4); $di

7、splayo (sig1, sig2, sig3, sig4); $displayh (sig1, sig2, sig3, sig4); %h %o %d %b %c %s %v %m %t hex octal decimal binary ASCII string strength module time t n %0d tab 換行 反斜杠 雙引號(hào) 上述的ASCII表示 無前導(dǎo)0的十進(jìn)制數(shù)格式符轉(zhuǎn)義符module disp;reg31:0 rval;pulldown (pd);initialbeginrval=101;$display(rval=%h hex %d decimal, rva

8、l, rval);$display(rval=%o otal %b binary, rval, rval);$display(rval has %c ascii character value,rval);$display(pd strength value is %v,pd);$display(current scope is %m);$display(%s is ascii value for 101,101);$display(simulation time is %t,$time);endendmodulerval=00000065 hex 101 decimalrval=000000

9、00145 octal 000000000000000000 00000001100101 binaryrval has e ascii character valuepd strength value is StXcurrent scope is dispe is ascii value for 101simulation time is 0顯示信號(hào)值$write和$strobe$write與$display相同,不同的是不會(huì)自動(dòng)換行。 $write($time, “%b t %h t %d t %o t”, sig1, sig2, sig3, sig4); $strobe與$display

10、相同,不同的是在仿真時(shí)間前進(jìn)之前的信號(hào)值。而$display和$write立即顯示信號(hào)值。也就是說$strobe顯示穩(wěn)定狀態(tài)信號(hào)值,而$display和$write可以顯示信號(hào)的中間狀態(tài)值。 $strobe($time, “%b t %h t %d t %o t”, sig1, sig2, sig3, sig4);$write和$strobe都支持多種數(shù)基,缺省為十進(jìn)制。$writeb$strobeb $writeo$strobeo $writeh$strobeh下面是模塊textio仿真的輸出:$writeb輸出: 0 xxxxxxxx x 注意data是32位數(shù)據(jù),由8位十六進(jìn)制數(shù)表示。時(shí)

11、間以沒有前導(dǎo)零的十進(jìn)制形式輸出。 缺省情況下,值以十進(jìn)制顯示,忽略前導(dǎo)零,與%0d格式符相同??梢栽谝粋€(gè)格式化符前插入一個(gè)0使Verilog忽略開頭的零。 $displayh: 00000000000000f 00000010 1 注意當(dāng)前時(shí)間,一個(gè)64位量,需要16個(gè)十六進(jìn)制的數(shù)。$display: 10 20$strobe: 10 30module textio; reg flag; reg 31: 0 data; initial begin $writeb(%d, $time, ,%h t, data, , flag, n); #15 flag = 1; data = 16; $disp

12、layh($time, ,data, , flag); end initial begin #10 data = 20; $strobe($time, , data); $display($time, , data); data = 30; endendmodule3.監(jiān)視信號(hào)值$monitor$monitor持續(xù)監(jiān)視參數(shù)列表中的變量。在一個(gè)時(shí)間片中,參數(shù)表中任何信號(hào)發(fā)生變化,$monitor將在仿真時(shí)間前進(jìn)前顯示參數(shù)表的信號(hào)值。后面的$monitor將覆蓋前面的$monitor??梢杂孟到y(tǒng)任務(wù)$monitoron和$monitoroff控制持續(xù)監(jiān)視。$monitor支持多種基數(shù)。缺省為十進(jìn)制

13、。 $monitor ($ time, “%b t %h t %d t %o”, sig1, sig2, sig3, sig4);$monitor是唯一的不斷輸出信號(hào)值的系統(tǒng)任務(wù)。其它系統(tǒng)任務(wù)在返回值之后就結(jié)束。$monitor和$strobe一樣,顯示參數(shù)列表中信號(hào)的穩(wěn)定狀態(tài)值,也就是在仿真時(shí)間前進(jìn)之前顯示信號(hào)。在一個(gè)時(shí)間步中,參數(shù)列表中信號(hào)值的任何變化將觸發(fā)$monitor 。但$time,$stime,$realtime不能觸發(fā)。任何后續(xù)的$monitor覆蓋前面調(diào)用的$monitor。只有新的$monitor的參數(shù)列表中的信號(hào)被監(jiān)視,而前面的$monitor的參數(shù)則不被監(jiān)視??梢杂?m

14、onitoron和$monitoroff系統(tǒng)任務(wù)控制持續(xù)監(jiān)視,使用戶可以在仿真時(shí)只監(jiān)視特定時(shí)間段的信號(hào)。$monitor參數(shù)列表的形式與$display相同。$monitor支持多種基數(shù)。缺省為十進(jìn)制。$monitorb$monitoro$monitorh4.文件輸出$fopen打開一個(gè)文件并返回一個(gè)多通道描述符(MCD)。MCD是與文件唯一對(duì)應(yīng)的32位無符號(hào)整數(shù)。如果文件不能打開并進(jìn)行寫操作,MCD將等于0。如果文件成功打開,MCD中的一位將被置位。以$f開始的顯示系統(tǒng)任務(wù)將輸出寫入與MCD相對(duì)應(yīng)的文件中。 . . .integer MCD1; MCD1 = $fopen(); $fdisp

15、lay( MCD1, P1, P2, ., Pn); $fwrite( MCD1, P1, P2, ., Pn); $fstrobe( MCD1, P1, P2, ., Pn); $fmonitor( MCD1, P1, P2, ., Pn); $fclose( MCD1);. . .$fopen打開參數(shù)中指定的文件并返回一個(gè)32位無符號(hào) 整數(shù)MCD,MCD是與文件一一對(duì)應(yīng)的多通道描述符。如果文件不能打開并進(jìn)行寫操作,它返回0。$fclose關(guān)閉MCD指定的通道。輸出信息到log文件和標(biāo)準(zhǔn)輸出的四個(gè)格式化顯示任務(wù)($display, $write, $monitor, $strobe)都有相對(duì)

16、應(yīng)的任務(wù)用于向指定文件輸出。這些對(duì)應(yīng)的任務(wù)($fdisplay,$fwrite,$fmonitor,$fstrobe)的參數(shù)形式與對(duì)應(yīng)的任務(wù)相同,只有一個(gè)例外:第一個(gè)參數(shù)必須是一個(gè)指定向何哪個(gè)文件輸出的MCD。MCD可以是一個(gè)表達(dá)式,但其值必須是一個(gè)32位的無符號(hào)整數(shù)。這個(gè)值決定了該任務(wù)向哪個(gè)打開的文件寫入。MCD可以看作由32個(gè)標(biāo)志構(gòu)成的組,每個(gè)標(biāo)志代表一個(gè)單一的輸出通道。. . .integer messages, broadcast, cpu_chann, alu_chann;initialbegin cpu_chann = $fopen( cpu.dat); if(! cpu_chan

17、n) $finish; alu_chann = $fopen( alu.dat); if(! alu_chann) $finish;/ channel to both cpu. dat and alu. dat messages = cpu_chann | alu_chann;/ channel to both files, standard out, and verilog. log broadcast = 1 | messages;endalways ( posedge clock) / print the following to alu. dat $fdisplay( alu_chan

18、n, acc= %h f=%h a=%h b=%h, acc, f, a, b);/* at every reset print a message to alu. dat, cpu. dat, standard output and the verilog. log file */always ( negedge reset) $fdisplay( broadcast, system reset at time %d, $time);. . .必須聲明為integer通道0(編號(hào)為1)為標(biāo)準(zhǔn)輸出及verilog.log5.文件輸入Verilog中有兩個(gè)系統(tǒng)任務(wù)可以將數(shù)據(jù)文件讀入寄存器組。一個(gè)

19、讀取二進(jìn)制數(shù)據(jù),另一個(gè)讀取十六進(jìn)制數(shù)據(jù):$readmemb $readmemb (file_name, ); $readmemb (file_name, , ); $readmemb (file_name, , , );$readmemh $readmemh ( file_name, ); $readmemh ( file_name, , ); $readmemh ( file_name, , , );系統(tǒng)任務(wù)$readmemb和$readmemh從一個(gè)文本文件讀取數(shù)據(jù)并寫入存儲(chǔ)器。如果數(shù)據(jù)為二進(jìn)制,使用$readmemb;如果數(shù)據(jù)為十六進(jìn)制,使用$readmemh。filename指定要調(diào)入

20、的文件。mem_name指定存儲(chǔ)器名。start和finish決定存儲(chǔ)器將被裝載的地址。Start為開始地址,finish為結(jié)束地址。如果不指定開始和結(jié)束地址,$readmem按從低端開始讀入數(shù)據(jù),與說明順序無關(guān)。$readmemb和$readmemh的文件格式 :$readmemb(mem_file. txt, mema);0000_00000110_0001 0011_0010/ 地址3255沒有定義100 / hex1111_1100/地址2571022沒有定義3FF1110_0010文本文件:mem_file.txt00000000001100001100110010231111110

21、02561110001010230 7聲明的存儲(chǔ)器組reg 0:7 mema0:1023module readmem;reg 0:7 mema 0:1023initial$readmemb(“mem_file.txt”, mema);endmodule$readmemb和$readmemh的文件格式 :$readmemb(mem_file. txt, mema);可以指定二進(jìn)制(b)或十六進(jìn)制(h)數(shù)用下劃線(_)提高可讀性??梢园瑔涡谢蚨嘈凶⑨???梢杂每崭窈蛽Q行區(qū)分存儲(chǔ)器字??梢越o后面的值設(shè)定一個(gè)特定的地址,格式為: (hex_address)十六進(jìn)制地址的大小寫不敏感。在和數(shù)字之間不允許

22、有空格。 Verilog Test Bench使用簡介學(xué)習(xí)內(nèi)容:用一個(gè)復(fù)雜的test bench復(fù)習(xí)設(shè)計(jì)的組織與仿真建立test bench通常使用的編碼風(fēng)格及方法test bench組織簡單的test bench向要驗(yàn)證的設(shè)計(jì)提供向量,人工驗(yàn)證輸出。復(fù)雜的test bench是自檢測的,其結(jié)果自動(dòng)驗(yàn)證。 stimulus要驗(yàn)證的設(shè)計(jì)簡單的test bench復(fù)雜的test bench激勵(lì)驗(yàn)證結(jié)果要驗(yàn)證的設(shè)計(jì)DUT(Device under test)1.并行塊forkjoin塊在測試文件中很常用。他們的并行特性使用戶可以說明絕對(duì)時(shí)間,并且可以并行的執(zhí)行復(fù)雜的過程結(jié)構(gòu),如循環(huán)或任務(wù)。modul

23、e inline_ tb; reg 7: 0 data_ bus; / instance of DUT initial fork data_bus = 8b00; #10 data_bus = 8h45; #20 repeat (10) #10 data_bus = data_bus + 1; #25 repeat (5) #20 data_bus = data_bus 1; #140 data_bus = 8h0f; joinendmodule上面的兩個(gè)repeat循環(huán)從不同時(shí)間開始,并行執(zhí)行。象這樣的特殊的激勵(lì)集在單個(gè)的beginend塊中將很難實(shí)現(xiàn)。 Time | data_ bus 0

24、 | 8b0000_000010 | 8b0100_010130 | 8b0100_011040 | 8b0100_011145 | 8b1000_111050 | 8b1000_111160 | 8b1001_000065 | 8b0010_000070 | 8b0010_000180 | 8b0010_001085 | 8b0100_010090 | 8b0100_0101100 | 8b0100_0110105 | 8b1000_1100110 | 8b1000_1101120 | 8b1000_1110125 | 8b0001_1100140 | 8b0000_11112.包含文件包含

25、文件用于讀入代碼的重復(fù)部分或公共數(shù)據(jù)。 module clk_gen (clk);output clk; reg clk;include common.txtinitial begin while ($ time sim_end) begin clk = initial_clock; #(period/2) clk = !initial_clock; #(period/2); end $finish;endendmodule在上面的例子中,公共參數(shù)在一個(gè)獨(dú)立的文件中定義。此文件在不同的仿真中可被不同的測試文件調(diào)用。 / common. txt/ clock and simulator cons

26、tantsparameter initial_clock = 1;parameter period = 15;parameter max_cyc = 100;parameter sim_end = period * max_cyc3. 施加激勵(lì)產(chǎn)生激勵(lì)并加到設(shè)計(jì)有很多 種方法。一些常用的方法有:從一個(gè)initial塊中施加線激勵(lì)從一個(gè)循環(huán)或always塊施加激勵(lì)從一個(gè)向量或整數(shù)數(shù)組施加激勵(lì)記錄一個(gè)仿真過程,然后在另一個(gè)仿真中回放施加激勵(lì)a. 線性激勵(lì)線性激勵(lì)有以下特性:只有變量的值改變時(shí)才列出易于定義復(fù)雜的時(shí)序關(guān)系對(duì)一個(gè)復(fù)雜的測試,測試基準(zhǔn)(test bench)可能非常大module inl

27、ine_ tb; reg 7: 0 data_ bus, addr; wire 7: 0 results; DUT u1 (results, data_ bus, addr); initial fork data_bus = 8h00; addr = 8h3f; #10 data_ bus = 8h45; #15 addr = 8hf0; #40 data_ bus = 8h0f; #60 $finish; joinendmoduleb.循環(huán)激勵(lì)從循環(huán)產(chǎn)生激勵(lì)有以下特性:在每一次循環(huán),修改同一組激勵(lì)變量時(shí)序關(guān)系規(guī)則代碼緊湊 module loop_tb; reg clk; reg 7:0 st

28、imulus; wire 7:0 results; integer i; DUT u1 (results, stimulus); always begin / clock generation clk = 1; #5 clk = 0; #5 end initial begin for (i = 0; i 1; i = i - 1) / 循環(huán) #50 stimulus = stim_arrayi ; #30 $finish; endendmoduled.矢量采樣在仿真過程中可以對(duì)激勵(lì)和響應(yīng)矢量進(jìn)行采樣,作為其它仿真的激勵(lì)和期望結(jié)果。module capture_tb; parameter per

29、iod = 20 reg 7:0 in_vec, out_vec; integer RESULTS, STIMULUS; DUT u1 (out_ vec, in_ vec); initial begin STIMULUS = $fopen(stimulus. txt) ; RESULTS = $fopen(results. txt) ; fork if (STIMULUS != 0 ) forever #( period/2) $fstrobeb (STIMULUS, %b, in_vec); if (RESULTS != 0 ) #( period/2) forever #( period

30、/2) $fstrobeb (RESULTS, %b, out_vec); join endendmodulee.矢量回放保存在文件中的矢量反過來可以作為激勵(lì)module read_file_tb; parameter num_vecs = 256; reg 7:0 data_bus; reg 7:0 stim num_vecs-1:0; integer i; DUT u1 (results, data_bus) initial begin / Vectors are loaded $readmemb (vec. txt, stim); for (i =0; i num_vecs ; i =

31、i + 1) #50 data_bus = stimi; endendmodule/ 激勵(lì)文件vec.txt001110000011100100111010001111000011000000101000000110000111100010111000.使用矢量文件輸入/輸出的優(yōu)點(diǎn):激勵(lì)修改簡單設(shè)計(jì)反復(fù)驗(yàn)證時(shí)直接使用工具比較矢量文件。4.錯(cuò)誤及警告報(bào)告使用文本或文件輸出類的系統(tǒng)任務(wù)報(bào)告錯(cuò)誤及警告always ( posedge par_err) $display ( error-bus parity errors detected);always ( posedge cor_err) $dis

32、play(warning-correctable error detected);一個(gè)更為復(fù)雜的test bench可以:不但能報(bào)告錯(cuò)誤,而能進(jìn)行一些動(dòng)作,如取消一個(gè)激勵(lì)塊并跳轉(zhuǎn)到下一個(gè)激勵(lì)。在內(nèi)部保持錯(cuò)誤跟蹤,并在每次測試結(jié)束時(shí)產(chǎn)生一個(gè)錯(cuò)誤報(bào)告。5.強(qiáng)制激勵(lì)在過程塊中,可以用兩種持續(xù)賦值語句驅(qū)動(dòng)一個(gè)值或表達(dá)式到一個(gè)信號(hào)。過程持續(xù)賦值通常不可綜合,所以它們通常用于測試基準(zhǔn)描述。對(duì)每一種持續(xù)賦值,都有對(duì)應(yīng)的命令停止信號(hào)賦值。不允許在賦值語句內(nèi)部出現(xiàn)時(shí)序控制。對(duì)一個(gè)寄存器使用assign和deassign,將覆蓋所有其他在該信號(hào)上的賦值。這個(gè)寄存器可以是RTL設(shè)計(jì)中的一個(gè)節(jié)點(diǎn)或測試基準(zhǔn)中在多個(gè)地方

33、賦值的信號(hào)等。 initial begin #10 assign top.dut.fsm1.state_reg = init_state ; #20 deassign top.dut.fsm1.state_reg ; end在register和net上(例如一個(gè)門級(jí)掃描寄存器的輸出)使用force和release,將覆蓋該信號(hào)上的所有其他驅(qū)動(dòng)。 initial begin #10 force top. dut. counter. scan_ reg. q = 0 ; #20 release top. dut. counter. scan_ reg. q ; end可以強(qiáng)制(force)并釋放一

34、個(gè)信號(hào)的指定位、部分位或連接,但位的指定不能是一個(gè)變量(例如out_veci)不能對(duì)register的一位或部分位使用assign和deassign對(duì)同一個(gè)信號(hào),force覆蓋assign。后面的assign或force語句覆蓋以前相同類型的語句。如果對(duì)一個(gè)信號(hào)先assign然后force,它將保持force值。在對(duì)其進(jìn)行release后,信號(hào)為assign值。如果在一個(gè)信號(hào)上force多個(gè)值,然后release該信號(hào),則不出現(xiàn)任何force值。 在上面兩個(gè)例子中,在 net或register上所賦的常數(shù)值,覆蓋所有在時(shí)刻10和時(shí)刻20之間可能發(fā)生在該信號(hào)上的其他任何賦值或驅(qū)動(dòng)。如果所賦值是一

35、個(gè)表達(dá)式,則該表達(dá)式將被持續(xù)計(jì)算。6.建立時(shí)鐘例1:雖然有時(shí)候在設(shè)計(jì)中給出時(shí)鐘,但通常時(shí)鐘是測試基準(zhǔn)中建立。下面介紹如何產(chǎn)生不同的時(shí)鐘波形。同時(shí)給出用門級(jí)和行為級(jí)描述方法下面是一個(gè)簡單對(duì)稱時(shí)鐘的例子: reg ck;always begin #( period/2) ck = 0; #( period/2) ck = 1;endreg go; wire ck;nand #( period/2) u1 (ck, ck, go);initial begin go = 0; #( period/2) go = 1;end注意:在一些仿真器中,時(shí)鐘與設(shè)計(jì)使用相同的抽象級(jí)描述時(shí),仿真性能會(huì)好一些。 產(chǎn)生

36、的波形(假定period為20)例2:有啟動(dòng)延時(shí)的對(duì)稱時(shí)鐘的例子:reg ck;initial begin ck = 0; #( period) forever #( period/2) ck = !ck;endreg go; wire ck;nand #( period/2) u1 (ck, ck, go);initialbegin go = 0; #(period) go = 1;end注意:在行為描述中,在時(shí)間0將CK初始化為0;而在結(jié)構(gòu)描述中,直到period/2才影響CK值。當(dāng)go信號(hào)在時(shí)間0初始化時(shí),CK值到period/2才變化??梢允褂锰厥饷頵orce和release立即影響

37、CK值。產(chǎn)生的波形(假定period為20)例3:有不規(guī)則啟動(dòng)延時(shí)的不對(duì)稱時(shí)鐘的例子:注意:在行為描述中,CK值立刻被影響;而在結(jié)構(gòu)描述中,在傳播延時(shí)后才輸出正確波形。產(chǎn)生的波形(假定period為20)reg ck;initial begin #(period + 1) ck = 1; #(period/2 1) forever begin #(period/4) ck = 0; #(3*period/4) ck = 1; endendreg go; wire ck;nand #(3*period/4, period/4) u1(ck, ck, go);initial begin #(per

38、iod/4 + 1) go = 0; #(5*period/4 1) go = 1;endTestbench實(shí)例四位加法器數(shù)據(jù)流描述module adder4(cout,sum,ina,inb,cin);output3:0 sum;output cout;input 3:0 ina,inb;input cin;assign cout,sum=ina+inb+cin;endmodule四位加法器testbenchtimescale 1ns/1ns/include adder4.vmodule adder4_tb; reg 3:0 a,b; reg cin; wire 3:0 sum; wire

39、cout; integer i,j; adder4 adder(sum,cout,a,b,cin); always #5 cin=cin; initial begin a=0;b=0;cin=0; for (i=1;i16;i=i+1) begin #10 a=i; end endinitial begin for (j=1;j16;j=j+2) #10 b=j; end initial begin $monitor($time,%d + %d + %b=%b,%d,a,b,cin,cout,sum); #160 $finish; endendmodule 四位計(jì)數(shù)器描述module coun

40、t4(out,reset,clk);output3:0 out;input reset,clk;reg3:0 out;always (posedge clk)beginif (reset) out=0; /同步復(fù)位else out=out+1; /計(jì)數(shù)endendmodule四位計(jì)數(shù)器testbenchtimescale 1ns/1nsinclude count4.vmodule coun4_tb;reg clk,reset; /測試輸入信號(hào)為reg wire3:0 out; /測試輸出信號(hào)為wireparameter DELY=100;count4 mycount(out,reset,clk

41、); /調(diào)用測試對(duì)象always #(DELY/2) clk = clk; /產(chǎn)生時(shí)鐘initialbegin /激勵(lì)信號(hào)clk =0; reset=0;#DELY reset=1;#DELY reset=0;#(DELY*20) $finish;end/結(jié)果顯示格式initial $monitor($time,clk=%d reset=%d out=%d, clk, reset,out);endmodule6.3 存儲(chǔ)器建模學(xué)習(xí)內(nèi)容:如何描述存儲(chǔ)器如何描述雙向端口存儲(chǔ)器件建模描述存儲(chǔ)器必須做兩件事:說明一個(gè)適當(dāng)容量的存儲(chǔ)器。提供內(nèi)容訪問的級(jí)別,例如:只讀讀和寫寫同時(shí)讀多個(gè)讀操作,同時(shí)進(jìn)行單個(gè)

42、寫操作同時(shí)有多個(gè)讀和多個(gè)寫操作,有保證一致性的方法簡單ROM描述 下面的ROM描述中使用二維寄存器組定義了一個(gè)存儲(chǔ)器mem。ROM的數(shù)據(jù)單獨(dú)保存在文件my_rom_data中,如右邊所示。通常用這種方法使ROM數(shù)據(jù)獨(dú)立于ROM描述。timescale 1ns/10psmodule myrom (read_data, addr, read_en_); input read_en_; input 3:0 addr; output 3:0 read_data; reg 3:0 read_data; reg 3:0 mem 0:15; initial $readmemb (my_rom_data, m

43、em); always ( addr or read_en_) if (! read_en_) read_data = memaddr;endmodulemy_rom_data0000010111000011110100100011111110001001100000011101101000011101簡單的RAM描述 RAM描述比ROM略微復(fù)雜,因?yàn)楸仨毤扔凶x功能又有寫功能,而讀寫通常使用同一數(shù)據(jù)總線。這要求使用新的處理雙向數(shù)據(jù)線的建模技術(shù)。在下面的例子中,若讀端口未使能,則模型不驅(qū)動(dòng)數(shù)據(jù)總線;此時(shí)若數(shù)據(jù)總線沒有寫數(shù)據(jù)驅(qū)動(dòng),則總線為高阻態(tài)Z。這避免了RAM寫入時(shí)的沖突。timescale 1

44、ns /1nsmodule mymem (data, addr, read, write); inout 3:0 data; input 3:0 addr; input read, write; reg 3:0 memory 0:15; / 16*4/ 讀 assign data = read ? memoryaddr : 4bz;/ 寫 always ( posedge write) memoryaddr = data;endmodule 這個(gè)描述可綜合,但許多工具僅僅產(chǎn)生一個(gè)寄存器堆,因此與一個(gè)真正的存儲(chǔ)器相比耗費(fèi)更多的面積。參數(shù)化存儲(chǔ)器描述 在下面的例子中,給出如何定義一個(gè)字長和地址均參

45、數(shù)化的只讀存儲(chǔ)器件。module scalable_ROM (mem_word, address); parameter addr_bits = 8; / 地址總線寬度 parameter wordsize = 8; / 字寬 parameter words = (1 addr_bits); / mem容量 output wordsize:1 mem_word; / 存儲(chǔ)器字 input addr_bits:1 address; / 地址總線 reg wordsize:1 mem 0 : words-1; / mem聲明/ 輸出存儲(chǔ)器的一個(gè)字 wire wordsize:1 mem_word = memaddress;endmodule 例中存儲(chǔ)器字范圍從0而不是1開始,因?yàn)?/p>

溫馨提示

  • 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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論