西西軟件園多重安全檢測(cè)下載網(wǎng)站、值得信賴的軟件下載站!
軟件
軟件
文章
搜索

首頁(yè)編程開(kāi)發(fā)其它知識(shí) → verilog HDL的系統(tǒng)任務(wù)及testbench寫(xiě)法

verilog HDL的系統(tǒng)任務(wù)及testbench寫(xiě)法

相關(guān)軟件相關(guān)文章發(fā)表評(píng)論 來(lái)源:本站整理時(shí)間:2010/7/14 15:34:33字體大。A-A+

作者:佚名點(diǎn)擊:1231次評(píng)論:0次標(biāo)簽: 模塊

  • 類型:遠(yuǎn)程監(jiān)控大。671KB語(yǔ)言:中文 評(píng)分:2.7
  • 標(biāo)簽:
立即下載

通用的HDL包括VHDL和verilog HDL
HDL既可以用來(lái)design也可以用來(lái)test/confirm
用HDL寫(xiě)出來(lái)的測(cè)試文件稱為test bench
被測(cè)試的模塊成為device under test,簡(jiǎn)稱DUT,既可以是behavioral級(jí)描述也可以是RTL級(jí)或gate級(jí)描述
verilog simulator是verilog語(yǔ)言的仿真器,waveform viewer是波形觀測(cè)器
test bench中應(yīng)該例化DUT,對(duì)應(yīng)端口名稱可以不同
testbench中使用兩種信號(hào)類型: wire reg,test中用法與design時(shí)一樣
wire類型不能在always或initial塊中使用
reg類型只能在always或initial塊中使用
initial和always是順序控制模塊,但它們之間是在仿真開(kāi)始時(shí)并行執(zhí)行的
initial和always塊中可以插入begin end或fork join來(lái)安排執(zhí)行順序
tesbench開(kāi)始需要給所有信號(hào)設(shè)置初值,一般是一個(gè)initial塊
默認(rèn)的wire類型是Z 默認(rèn)的reg類型是X
`timescale設(shè)置了時(shí)間步長(zhǎng)和時(shí)間精度
測(cè)試文件中兩項(xiàng)重要的元素是clocks和resets
$display和$monitor格式相同,但?不同
task只能在initial或者always中被調(diào)用,用于將重復(fù)出現(xiàn)的操作打包出來(lái)單獨(dú)存放
后仿真時(shí)需要庫(kù)和SDF文件

所有系統(tǒng)任務(wù)都以$開(kāi)頭,都只能在initial或always模塊里(在initial塊中只執(zhí)行一次,在always里滿足條件將不斷執(zhí)行)

顯示、探測(cè)、監(jiān)控任務(wù)
%h%H %d%D %b%B %O %o %C%c %S%s %T%t %M%m
以上都以表達(dá)式的最大可能值所占用的位數(shù)來(lái)顯示表達(dá)式當(dāng)前值
%0h%0H %0d%0D %0b%0B %0O %0o
以上都以表達(dá)式的當(dāng)前值最小占用的位數(shù)來(lái)顯示表達(dá)式當(dāng)前值
輸出時(shí),如果所有位均為不定值,則輸出結(jié)果為小寫(xiě)的x;所有位均為高阻則輸出結(jié)果為小寫(xiě)的z
輸出時(shí),如果部分位為高阻值,則輸出結(jié)果為大寫(xiě)的X;部分位為高阻則輸出結(jié)果為大寫(xiě)的Z

$display $displayb $displayo $displayh
格式: $display("simulation time is %t",$time);
$write $writeb $writeo $writeh
格式: $write("simulation time is %t",$time);
$display $write這兩個(gè)任務(wù)的作用基本相同,唯一的區(qū)別就是$display任務(wù)執(zhí)行完以后自動(dòng)添加一個(gè)換行符n,而$write不自動(dòng)添加
$display("a=%d");和$write("a=%dn");作用相同
用于在滿足某個(gè)條件(如時(shí)鐘邊沿來(lái)時(shí))是輸出仿真數(shù)據(jù)
$strobe $strobeb $strobeh $strobeo
格式: $strobe("the flip-flop value is %b at time %t",q,$time);
用于在指定的時(shí)刻之后輸出顯示仿真數(shù)據(jù)
$strobe和$display不同之處在于 $display是遇到該時(shí)刻時(shí)執(zhí)行,$strobe是當(dāng)前時(shí)刻結(jié)束(下一時(shí)刻開(kāi)始)時(shí)執(zhí)行

以上任務(wù)通常都在always塊中執(zhí)行
$monitor $monitorb $monitorh $monitoro
格式: $monitor("at %t, d=%d,clk=%d",$time,d,clk);
連續(xù)監(jiān)控指定的參數(shù),只要參數(shù)表中的參數(shù)值發(fā)生變化,就在當(dāng)前仿真時(shí)刻結(jié)束時(shí)顯示
$monitoron開(kāi)啟所有的$monitor任務(wù) $monitoroff關(guān)閉所有的$monitor任務(wù)
在多模塊測(cè)試時(shí)$monitoron 和$monitoroff用于使能和關(guān)閉本模塊的監(jiān)視功能
$display $write $strobe 多用于always模塊,$monitor用于initial模塊
always(a or b or c)$display("....");效果與 initial $monitor("...");一樣

文件的打開(kāi)與關(guān)閉:
$fopen打開(kāi)一個(gè)文件(以整數(shù)文件指針?lè)绞? 格式:integer file_pointer=$fopen(file_name)
$fclose關(guān)閉一個(gè)文件(以整數(shù)文件指針?lè)绞? 格式: $fclose(file_pointer)

將信息輸出到文件:
顯示任務(wù) 寫(xiě)入任務(wù) 探測(cè)任務(wù) 監(jiān)控任務(wù)都有用于向文件輸出信息的相應(yīng)命令,即
$fdisplay $fdisplayb $fdisplayh $fdisplayo
$fwrite $fwriteb $fwriteh $fwriteo
$fstrobe $fstrobeb $fstrobeh $fstrobeo

$fmonitor $fmonitorb $fmonitorh $fmonitoro
與相應(yīng)的無(wú)文件輸出命令相比,只是多了打開(kāi)文件、寫(xiě)入文件、關(guān)閉文件三個(gè)步驟

從文件中讀數(shù)據(jù):
$readmemb 讀取二進(jìn)制文件
$readmemh 讀取十六進(jìn)制文件
格式:
$readmemb("<數(shù)據(jù)文件名>",<存儲(chǔ)器名>);
$readmemb("<數(shù)據(jù)文件名>",<存儲(chǔ)器名>,<起始地址>);
$readmemb("<數(shù)據(jù)文件名>",<存儲(chǔ)器名>,<起始地址>,<結(jié)束地址>);


仿真控制任務(wù):
$stop
格式: 在initial中 #500 $stop
$finish
格式: 在initial中 #500 $finish
$stop暫停仿真后返回軟件操作主窗口,將控制權(quán)交給user
$finish終止仿真后關(guān)閉軟件操作主窗口

時(shí)間顯示格式:
$time 返回64位整型時(shí)間
$stime 返回32位整型時(shí)間
$realtime 返回實(shí)型時(shí)間
$time 任何時(shí)間以`timescale定義的時(shí)間單位為單位
$realtime 任何時(shí)間以`timescale定義的時(shí)間單位+時(shí)間精度為單位

隨機(jī)函數(shù):
$random(seed)
seed必須是reg或者integer寄存器類型,返回的隨機(jī)數(shù)是32位有符號(hào)數(shù)
$random%60 產(chǎn)生的是-59~59之間的隨機(jī)數(shù)
{$random}%60產(chǎn)生的是0~59之間的隨機(jī)數(shù)
可以讓出現(xiàn)時(shí)間隨機(jī) 也可以讓某些位隨機(jī)出現(xiàn)1或0

層次命令: 模塊標(biāo)示符 任務(wù)標(biāo)示符 函數(shù)標(biāo)示符 程序塊標(biāo)識(shí)符,通過(guò)層次命令可以訪問(wèn)到任何變量
其他模塊中共享task和function的方法: 1.使用層次路徑名 2.使用頭文件.h來(lái)包含需要共享的funtion和task

VCD文件(value change dump文件)是常用的波形記錄文件,與波形的作用等同,是一個(gè)ASCII文件
$dumpon $dumpoff 在一個(gè)initial塊中控制dump的開(kāi)始和結(jié)束
$dumpvars $dumpfile 分別在initial中指定VCD文件名(*.dump)和變量
dump系統(tǒng)任務(wù)基本都在initial模塊中使用

測(cè)試模塊的構(gòu)成部分:
測(cè)試模塊命名: modulename_tb
輸入輸出信號(hào)(與veilog電路描述文件中的端口屬性相反)
initial或always塊來(lái)產(chǎn)生激勵(lì)信號(hào)
initial或always塊中加入系統(tǒng)任務(wù)
模塊實(shí)例化
測(cè)試中常用的波形有兩類:
initial塊及塊內(nèi)延遲來(lái)產(chǎn)生特定序列
always塊及內(nèi)內(nèi)延遲來(lái)產(chǎn)生周期性序列
常用always塊來(lái)描述時(shí)鐘,always產(chǎn)生時(shí)鐘的兩種方法;

常用一個(gè)initial設(shè)置初值;

常用一個(gè)initial來(lái)設(shè)置仿真的啟?刂疲
initial中用forever(無(wú)數(shù)次)和repeat(有限次)產(chǎn)生循環(huán)信號(hào)
技巧:(用assign及延遲可以產(chǎn)生相移時(shí)鐘、模塊調(diào)用方法可以產(chǎn)生多種規(guī)格的時(shí)鐘、讀入.vec文件中數(shù)據(jù)以及比較的寫(xiě)法)


quartus的語(yǔ)法診錯(cuò)能力比modesim強(qiáng), modesim的輸入語(yǔ)法顯示比quartus好

`include命令:
一個(gè)`include命令只能指定一個(gè)被包含模塊
意義是在包含文件里復(fù)制被包含模塊的代碼
易于將一個(gè)模塊做成特定功能的塊,然后結(jié)構(gòu)化組織起來(lái)
使用時(shí)由高層include低層模塊,所有模塊文件放在同一個(gè)文件夾內(nèi)

    相關(guān)評(píng)論

    閱讀本文后您有什么感想? 已有人給出評(píng)價(jià)!

    • 8 喜歡喜歡
    • 3 頂
    • 1 難過(guò)難過(guò)
    • 5 囧
    • 3 圍觀圍觀
    • 2 無(wú)聊無(wú)聊

    熱門評(píng)論

    最新評(píng)論

    發(fā)表評(píng)論 查看所有評(píng)論(0)

    昵稱:
    表情: 高興 可 汗 我不要 害羞 好 下下下 送花 屎 親親
    字?jǐn)?shù): 0/500 (您的評(píng)論需要經(jīng)過(guò)審核才能顯示)