北航夏宇聞verilog講稿-語法_第1頁
北航夏宇聞verilog講稿-語法_第2頁
北航夏宇聞verilog講稿-語法_第3頁
北航夏宇聞verilog講稿-語法_第4頁
北航夏宇聞verilog講稿-語法_第5頁
已閱讀5頁,還剩185頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

北航夏宇聞verilog講稿--語法第一頁,共190頁。第一部分課程簡介目的:簡單介紹VerilogHDL語言和仿真工具介紹講課計劃介紹如何不斷地學習新的有關知識第二頁,共190頁。講座中關于VerilogHDL的主要內容講課內容主要包括:Verilog的應用Verilog語言的組成部件結構級的建模與仿真行為級的建模與仿真延遲參數的表示Verilog的測試平臺:怎樣產生激勵信號和控制信號輸出響應的產生、記錄和驗證任務和函數用戶定義的元器件(primitives)可綜合風格的Verilog建模第三頁,共190頁。講座中關于Verilog仿真工具的主要內容講課內容主要包括:如何對所做的設計進行編譯和仿真如何使用元器件庫如何用Verilog-XL命令行界面調試代碼如何用圖形用戶界面(GUI)延遲的計算和標記仿真性能建模循環多次仿真第四頁,共190頁。目的:了解用HDL語言設計數字邏輯的優點了解Verilog主要應用領域了解Verilog的發展歷史了解電路系統的不同層次的Verilog抽象第二部分:Verilog的應用第五頁,共190頁。VerilogHDL是一種用于數字邏輯電路設計的語言:-用VerilogHDL描述的電路設計就是該電路的VerilogHDL模型。-VerilogHDL既是一種行為描述的語言也是一種結構描述的語言。這也就是說,既可以用電路的功能描述也可以用元器件和它們之間的連接來建立所設計電路的VerilogHDL模型。Verilog模型可以是實際電路的不同級別的抽象。這些抽象的級別和它們對應的模型類型共有以下五種:

Verilog的應用第六頁,共190頁。Verilog的應用系統級(system):用高級語言結構實現設計模塊的外部性能的模

算法級(algorithmic):用高級語言結構實現設計算法的模型。

RTL級(RegisterTransferLevel):描述數據在寄存器之間流動和如何處理這些數據的模型。門級(gate-level):描述邏輯門以及邏輯門之間的連接的模型。開關級(switch-level):描述器件中三極管和儲存節點以及它們之間連接的模型。第七頁,共190頁。Verilog的應用一個復雜電路的完整VerilogHDL模型是由若個VerilogHDL模塊構成的,每一個模塊又可以由若干個子模塊構成。

利用VerilogHDL語言結構所提供的這種功能就可以構造一個模塊間的清晰層次結構來描述極其復雜的大型設計。VerilogHDL行為描述語言作為一種結構化和過程性的語言,其語法結構非常適合于算法級和RTL級的模型設計。這種行為描述語言具有以下八項功能:第八頁,共190頁。Verilog的應用可描述順序執行或并行執行的程序結構。用延遲表達式或事件表達式來明確地控制過程的啟動時間。通過命名的事件來觸發其它過程里的激活行為或停止行為。提供了條件、if-else、case、循環程序結構。提供了可帶參數且非零延續時間的任務(task)程序結構。提供了可定義新的操作符的函數結構(function)。第九頁,共190頁。Verilog的應用提供了用于建立表達式的算術運算符、邏輯運算符、位運算符。VerilogHDL語言作為一種結構化的語言也非常適合于門級和開關級的模型設計。VerilogHDL的構造性語句可以精確地建立信號的模型。這是因為在VerilogHDL中,提供了延遲和輸出強度的原語來建立精確程度很高的信號模型。信號值可以有不同的的強度,可以通過設定寬范圍的模糊值來降低不確定條件的影響。第十頁,共190頁。Verilog的應用

VerilogHDL作為一種高級的硬件描述編程語言,有著類似C語言的風格。其中有許多語句如:if語句、case語句等和C語言中的對應語句十分相似。如果讀者已經掌握C語言編程的基礎,那么學習VerilogHDL并不困難,我們只要對VerilogHDL某些語句的特殊方面著重理解,并加強上機練習就能很好地掌握它,利用它的強大功能來設計復雜的數字邏輯電路。下面我們將對VerilogHDL中的基本語法逐一加以介紹。第十一頁,共190頁。模塊的抽象技術指標:用文字表示用算法表示用高級行為的Verilog模塊表示RTL/功能級:用可綜合的Verilog模塊表示門級/結構級:用實例引用的Verilog模塊表示版圖布局/物理級:用幾何形狀來表示

行為綜合邏輯綜合綜合前仿真綜合后仿真布局布線第十二頁,共190頁。第三部分.簡單的VerilogHDL模塊目的:通過簡單的例子了解Verilog模塊的基本構成了解Verilog模塊的層次結構和行為模塊了解Verilog模塊的測試第十三頁,共190頁。簡單的VerilogHDL模塊下面先介紹幾個簡單的VerilogHDL程序,然后從中分析VerilogHDL程序的特性。例[2.1.1]:

moduleadder(count,sum,a,b,cin);input[2:0]a,b;inputcin;outputcount;output[2:0]sum;assign{count,sum}=a+b+cin;endmodule

這個例子描述了一個三位的加法器。從例子中可以看出整個VerilogHDL程序是嵌套在module和endmodule聲明語句里的。第十四頁,共190頁。簡單的VerilogHDL模塊例[2.1.2]:modulecompare(equal,a,b);outputequal;//聲明輸出信號equalinput[1:0]a,b;//聲明輸入信號a,bassignequal=(a==b)?1:0;

/*如果兩個輸入信號相等,輸出為1。否則為0*/endmodule這個程序描述了一個比較器.在這個程序中,/*........*/和//.........表示注釋部分,注釋只是為了方便程序員理解程序,對編譯是不起作用的。第十五頁,共190頁。簡單的VerilogHDL模塊例[2.1.3]:moduletrist2(out,in,enable);outputout;inputin,enable;bufif1mybuf(out,in,enable);endmodule這個程序描述了一個三態驅動器。程序通過調用一個實例元件bufif1來實現其功能。第十六頁,共190頁。簡單的VerilogHDL模塊例[2.1.4]:

moduletrist1(out,in,enable);outputout;inputin,enable;mytritri_inst(out,in,enable);endmodulemodulemytri(out,in,enable);outputout;inputin,enable;assignout=enable?In:'bz;endmodule第十七頁,共190頁。簡單的VerilogHDL模塊上述程序例子通過另一種方法描述了一個三態門。在這個例子中存在著兩個模塊:模塊trist1調用模塊mytri的實例元件tri_inst。模塊trist1是上層模塊。模塊mytri則被稱為子模塊。通過這種結構性模塊構造可構成特大型模塊。第十八頁,共190頁。簡單的VerilogHDL模塊通過上面的例子可以看到:VerilogHDL程序是由模塊構成的。模塊是可以進行層次嵌套的。正因為如此,才可以將大型的數字電路設計分割成不同的小模塊來實現特定的功能,最后通過頂層模塊調用子模塊來實現整體功能。每個模塊要進行端口定義,并說明輸入輸出口,然后對模塊的功能進行行為邏輯描述。VerilogHDL程序的書寫格式自由,一行可以寫幾個語句,一個語句也可以分寫多行。除了endmodule語句外,每個語句和數據定義的最后必須有分號可以用/*.....*/和//...對VerilogHDL程序的任何部分作注釋。一個好的,有使用價值的源程序都應當加上必要的注釋,以增強程序的可讀性和可維護性。第十九頁,共190頁。模塊的結構Verilog的基本設計單元是“模塊”(block)。一個模塊是由兩部分組成的:一)描述接口;二)描述邏輯功能,即定義輸入是如何影響輸出的。下面舉例說明:第二十頁,共190頁。模塊的結構從上面的例子可以看出:-Verilog模塊結構完全嵌在module和endmodule聲明語句之間;-每個Verilog程序包括四個主要部分:端口定義、I/O說明、內部信號聲明、功能定義。第二十一頁,共190頁。模塊的測試如何檢查上述例子其功能是否正確?需要有測試激勵信號輸入到被測模塊需要記錄被測模塊的輸出信號需要把用功能和行為描述的Verilog模塊轉換為門級電路互連的電路結構(綜合)。需要對已經轉換為門級電路結構的邏輯進行測試(門級電路仿真)。需要對布局布線后的電路結構進行測試。(布局布線后仿真)。第二十二頁,共190頁。模塊的測試

被測模塊激勵和控制信號輸出響應和驗證第二十三頁,共190頁。模塊的測試測試模塊常見的形式:modulet;reg…;//被測模塊輸入/輸出變量類型定義wire…;//被測模塊輸入/輸出變量類型定義initialbegin…;…;…;end……//產生測試信號always#delaybegin…;end……//產生測試信號Testedmdm(.in1(ina),.in2(inb),.out1(outa),.out2(outb));//被測模塊的實例引用initialbegin….;….;….end//記錄輸出和響應endmodule第二十四頁,共190頁。模塊的測試測試模塊中常用的過程塊:initialalways所有的過程塊都在0時刻同時啟動;它們是并行的,在模塊中不分前后。initial塊只執行一次。always塊只要符合觸發條件可以循環執行。第二十五頁,共190頁。模塊的測試如何描述激勵信號:modulet;rega,b,sel;wireout;//引用多路器實例

mux2_m(out,a,b,sel);//加入激勵信號initialbegina=0;b=1;sel=0;#10b=0;#10b=1;sel=1;#10a=1;#10$stop;end第二十六頁,共190頁。模塊的測試如何觀察被測模塊的響應:

在initial塊中,用系統任務$time和$monitor$time返回當前的仿真時刻$monitor只要在其變量列表中有某一個或某幾個變量值發生變化,便在仿真單位時間結束時顯示其變量列表中所有變量的值。例:

initialbegin$monitor($time,,“out=%ba=%bsel=%b”,out,a,b,sel);end第二十七頁,共190頁。模塊的測試如何把被測模塊的輸出變化記錄到數據庫文件中?(文件格式為VCD,大多數的波形顯示工具都能讀取該格式)可用以下七個系統任務:$dumpfile(“”);//打開記錄數據變化的數據文件$dumpvars();//選擇需要記錄的變量$dumpflush;//把記錄在數據文件中的資料轉送到硬盤保存$dumpoff;//停止記錄數據變化$dumpon;//重新開始記錄數據變化$dumplimit(<>);//規定數據文件的大?。ㄗ止潱?dumpall;//記錄所有指定信號的變化值到數據文件中第二十八頁,共190頁。模塊的測試如何把被測模塊的響應變化記錄到數據庫文件中?舉例說明:$dumpvars;//記錄各層次模塊中所有信號的變化$dumpvars(1,top);//只記錄模塊top中所有信號的變化$dumpvars(2,top.u1);//記錄top模塊中實例u1和它以下一層子模塊所有信號的變化$dumpvars(0,top.u2,top.u1.u13.q);//記錄top模塊中實例u2和它本層所有信號的變化,還有top.u1.u13.q信號的變化。$dumpvars(3,top.u2,top.u1);//記錄top模塊中u2和u1所有信號的變化(包括其兩層以下子模塊的信號變化)。第二十九頁,共190頁。模塊的測試如何把被測模塊的響應變化記錄到數據庫文件中?舉例說明:下面的Verilog代碼段可以代替測試文件中的系統任務$monitor

initialbegin$dumpfile(“vlog.dump”);$dumpvars(0,top);end第三十頁,共190頁。語法詳細講解

第四部分.

Verilog語法要點目標:理解Verilog語言的一些重要規定.學會認識一些有關的重要語言符號.掌握Verilog中如何規定時間單位第三十一頁,共190頁。語法詳細講解

Verilog與C的主要不同點

Verilog有許多語法規則與C語言一致。但與C語言有根本的區別:-并行性-塊的含義:initial塊和always塊兩種賦值語句:阻塞賦值“=”非阻塞賦值“〈=”第三十二頁,共190頁。語法詳細講解

空格和注釋

Verilog是一種格式很自由的語言??崭裨谖谋局衅鹨粋€分離符的作用,別的沒有其他用處。單行注釋符用//*********與C語言一致多行注釋符用/*-------------------------*/與C語言一致第三十三頁,共190頁。語法詳細講解

整數和實常數

Verilog語言中常數可以是整數或實數:整數可以標明位數也可以不標明位數,表示方法:《位數》‘《基數》《值》其中《位數》表明該數用二進制的幾位來表示《基數》可以是二(b)、八(O)、十(d)或十六(h)進制《數值》可以是所選基數的任何合法的值包括不定值x位和高阻值z。如:64‘hff018’b1101_0001‘h83a實常數可以用十進制表示也可以用科學浮點數表示,如:32e-4(表示0.0032)4.1E3(表示4100)第三十四頁,共190頁。語法詳細講解

字符串

Verilog語言中,字符串常常用于表示命令內需要顯示的信息。用“”括起來的一行字符串,換新一行用“\n”字符,與C語言一致。在字符串中可以用C語言中的各種格式控制符,如\t,\”,\\…在字符串中可以用C語言中的各種數值型式控制符(有些不同),如:%b(二進制),%o(八進制),%d(十進制),%h(十六進制),%t(時間類型),%s(字符串類型)…第三十五頁,共190頁。語法詳細講解

標識符所謂標識別符就是用戶為程序描述中的Verilog對象所起的名字。標識符必須以英語字母(a-z,A-Z)起頭,或者用下橫線符(_)起頭。其中可以包含數字、$符和下橫線符。標識符最長可以達到1023個字符。模塊名、端口名和實例名都是標識符。Verilog語言是大小寫敏感的,因此sel和SEL是兩個不同的標識符。第三十六頁,共190頁。語法詳細講解

合法和非法標識符合法的:shift_reg_a

busa_index

bus263

非法的:34net//不能用數字開頭a*b_net//不能含有非字母符號*n@263//不能含有非字母符號@Verilog是大小寫敏感的。所有的Verilog關鍵詞都是小寫的。第三十七頁,共190頁。語法詳細講解

特別的標識符特別標識符是用“\”符開始,以空格符結束的標識符。它可以包含任何可打印的ASCII字符。但“\”符和空格并不算是標識符的一部分。特別標識符往往是由RTL級源代碼或電路圖類型的設計輸入經過綜合器自動綜合生成的網表結構型Verilog語句中的標識符。舉例說明:\~#@sel,\bus+index,\{A,B},Top.\31,//在層次模塊中的標識名第三十八頁,共190頁。語法詳細講解

系統任務和函數

$<標識符>‘$’符號表示Verilog的系統任務和函數常用的系統任務和函數有下面幾種:$time//找到當前的仿真時間$display,$monitor//顯示和監視信號值的變化$stop//暫停仿真$finish//結束仿真-------------------------------------------------------例:initial$monitor($time,,”a=%b,b=%b”,a,b);//每當a或b值變化時該系統任務都顯示當前的仿真時刻并分別用二進制和十六進制顯示信號a和b的值第三十九頁,共190頁。語法詳細講解

特殊符號“#”特殊符號“#”常用來表示延遲:在過程賦值語句時表示延遲。例:initialbegin#10rst=1;#50rst=0;end在門級實例引用時表示延遲。例:not#1not1(nsel,sel);and#2and2(a1,a,nsel);在模塊實例引用時表示參數傳遞

介紹參數類型變量時再講。。。。第四十頁,共190頁。語法詳細講解

編譯引導語句編譯引導語句用主鍵盤左上角小寫鍵“`”起頭用于指導仿真編譯器在編譯時采取一些特殊處理編譯引導語句一直保持有效,直到被取消或重寫`resetall編譯引導語句把所有設置的編譯引導恢復到缺省狀態常用的編譯引導有:`define`include`timescale`uselib`resetall……..第四十一頁,共190頁。語法詳細講解

編譯引導語句使用`define編譯引導能提供簡單的文本替代功能

`define<宏名><宏文本>在編譯時會用宏文本來替代源代碼中的宏名。合理地使用`define可以提高程序的可讀性舉例說明:`defineon1’b1`defineoff1’b0`defineand_delay#3在程序中可以用有含義的文字來表示沒有意思的數碼提高了程序的可讀性,在程序中可以用`on,`off,`and_delay分別表示1,0,和#3。第四十二頁,共190頁。語法詳細講解

編譯引導語句使用`include編譯引導,在編譯時能把其指定的整個文件包括進來一起處理舉例說明:`include“global.v”`include“parts/counter.v”`include“../../library/mux.v”合理地使用`include

可以使程序簡潔、清晰、條理清楚、易于查錯。第四十三頁,共190頁。語法詳細講解

編譯引導語句

`timescale用于說明程序中的時間單位和仿真精度舉例說明:

`timescale1ns/100ps`timescale語句必須放在模塊邊界前面舉例說明:

`timescale1ns/100psmoduleMUX2_1(out,a,b,sel);……not#1not1(nsel,sel);and#2and1(a1,a,nsel);……endmodule盡可能地使精度與時間單位接近,只要滿足設計的實際需要就行。舉例說明:在上例中所有的時間單位都是1ns的整數倍第四十四頁,共190頁。語法詳細講解

編譯引導語句仿真步長即仿真單位(STU)是所有參加仿真模塊中由`timescale指定的精度中最高(即時間最短)的那個決定的:(STU=100fs)舉例:

`timescale1ns/10psmoduleM1(….);not#1.23not1(nsel,sel);//1.23ns中共有12300個STU(100fs)endmodule`timescale100ns/1nsmoduleM2(….);not#1.23not1(nsel,sel);//123ns中共有1230000個STU(100fs)endmodule`timescale1ps/100fsmoduleM3(….);not#1.23not1(nsel,sel);//1.23ps中共有12個STU(100fs)endmodule第四十五頁,共190頁。語法詳細講解

編譯引導語句時間單位:

fs(呼秒)femptoseconds:1.0E-15秒ps(皮秒)picoseconds:1.0E-12秒ns(納秒)nonoseconds:1.0E-9秒us(微秒)microseconds:1.0E-6秒ms(毫秒)milliseconds:1.0E-3秒s(秒)seconds:1.0秒第四十六頁,共190頁。語法詳細講解

編譯引導語句

`uselib編譯引導語句:

用于定義仿真器到哪里去找庫元件如果該引導語句啟動的話,它就一直有效直到遇到另外一個`uselib的定義或`resetall語句

比其他配置庫搜索路徑的命令選項作用大

如果仿真器在`uselib定義的地點找不到器件庫,它不會轉向由編譯命令行-v和-y選項指定的器件庫去找。第四十七頁,共190頁。語法詳細講解

編譯引導語句使用`uselib的語法:

`uselib

器件庫1的地點器件庫2的地點。。。上面的器件庫地點可用以下兩種方法表示:1)file=庫文件名的路徑2)dir=庫目錄名的路徑libext=.文件擴展例如:`uselibdir=/lib/FAST_lib/`uselibdir=/lib/TTL_lib/libext=.vfile=/libs/TTL_U/udp.lib第四十八頁,共190頁。語法詳細講解

第五部分

Verilog的數據類型和邏輯值目的:掌握Verilog不同邏輯值的含義學習Verilog不同的數據類型理解如何使用和在什么場合下使用不同的數據類型學習聲明數據類型的語法第四十九頁,共190頁。語法詳細講解

Verilog的四種邏輯值0、低、偽、邏輯低、地、VSS、負插入01XZ0bufbufbufbufif11、高、真、邏輯高、電源、VDD、正插入X、不確定:邏輯沖突無法確定其邏輯值HiZ、高阻抗、三態、無驅動源第五十頁,共190頁。語法詳細講解

主要的數據類型Verilog有三種主要的數據類型:

Nets

表示器件之間的物理連接,稱為網絡連接類型Register

表示抽象的儲存單元,稱為寄存器/變量類型Parameter

表示運行時的常數,稱為參數類型第五十一頁,共190頁。語法詳細講解

主要的數據類型Nets(網絡連線):由模塊或門驅動的連線。驅動端信號的改變會立刻傳遞到輸出的連線上。例如:右圖上,selb的改變,會自動地立刻影響或門的輸出。netsabslselbselanslout第五十二頁,共190頁。語法詳細講解

主要的數據類型連接(Nets)類型變量的種類:在為不同工藝的基本元件建立庫模型的時候,常常需要用不同的連接類型來與之對應,使其行為與實際器件一致。常見的有以下幾種。

類型功能wire,tri

對應于標準的互連線(缺省)

supply1,supply2

對應于電源線或接地線

wor,trior

對應于有多個驅動源的線或邏輯連接wand,triand

對應于有多個驅動源的線與邏輯連接trireg

對應于有電容存在能暫時存儲電平的連接tri1,tri0

對應于需要上拉或下拉的連接如果不明確地說明連接是何種類型,應該是指wire類型。第五十三頁,共190頁。語法詳細講解

主要的數據類型

寄存器(register)類型變量

register型變量能保持其值,直到它被賦于新的值。register型變量常用于行為建模,產生測試的激勵信號。常用行為語句結構來給寄存器類型的變量賦值。abslselbselansloutreg_areg_selreg_b第五十四頁,共190頁。語法詳細講解

主要的數據類型

寄存器(register)類型變量的數據類型

寄存器類型變量共有四種數據類型:類型功能.

reg無符號整數變量,可以選擇不同的位寬。integer有符號整數變量,32位寬,算術運算可產生2的補碼。real有符號的浮點數,雙精度。time無符號整數變量,64位寬(Verilog-XL仿真工具用64位的正數來記錄仿真時刻)第五十五頁,共190頁。語法詳細講解

主要的數據類型

如何選擇正確的數據類型?輸入口(input)可以由寄存器或網絡連接驅動,但它本身只能驅動網絡連接。輸出口(output)可以由寄存器或網絡連接驅動,但它本身只能驅動網絡連接。輸入/輸出口(inout)只可以由網絡連接驅動,但它本身只能驅動網絡連接。如果信號變量是在過程塊(initial塊或always塊)中被賦值的,必須把它聲明為寄存器類型變量

第五十六頁,共190頁。語法詳細講解

主要的數據類型舉例說明數據類型的選擇moduletop;wirey;rega,b;DUTu1(y,a,b);initialbegina=0;b=0;#10a=1;….endendmodule模塊DUT的邊界輸入口輸出口輸出/入口netnetnet/registernetnet/registernetinoutmoduleDUT(Y,A,B_);outputY;inputA,B:wireY,A,B;and(Y,A,B);endmodule第五十七頁,共190頁。語法詳細講解

主要的數據類型

選擇數據類型時常犯的錯誤在過程塊中對變量賦值時,忘了把它定義為寄存器類型(reg)或已把它定義為連接類型了(wire)把實例的輸出連接出去時,把它定義為寄存器類型了把模塊的輸入信號定義為寄存器類型了。這是經常犯的三個錯誤?。?!第五十八頁,共190頁。語法詳細講解

主要的數據類型

參數(parameters)類型常用參數來聲明運行時的常數??捎米址硎镜娜魏蔚胤?都可以用定義的參數來代替。參數是本地的,其定義只在本模塊內有效。舉例說明:modulemd1(out,in1,in2);…..parametercycle=20,prop_del=3,setup=cycle/2-prop_del,p1=8,x_word=16’bx,file=“/user1/jmdong/design/mem_file.dat”;wire[p1:0]w1;//用參數來說明wire的位寬….

initialbegin$open(file);…….#20000display(“%s”,file);$stopend….endmodule第五十九頁,共190頁。語法詳細講解

主要的數據類型

參數值的改寫(方法之一)舉例說明:modulemod(out,ina,inb);…parametercycle=8,real_constant=2.039,file=“/user1/jmdong/design/mem_file.dat”;…endmodulemoduletest;…modmk(out,ina,inb);defparammk.cycle=6,mk.file=“../my_mem.dat”;…endmodule

第六十頁,共190頁。語法詳細講解

主要的數據類型

參數值的改寫(方法之二)舉例說明:modulemod(out,ina,inb);…parametercycle=8,real_constant=2.039,file=“/user1/jmdong/design/mem_file.dat”;…endmodulemoduletest;…mod#(5,3.20,“../my_mem.dat”)mk(out,ina,inb);…endmodule

第六十一頁,共190頁。語法詳細講解

寄存器陣列

Verilog語言支持寄存器陣列的聲明:舉例說明:integerNUMS[7:0];//8個整型變量的寄存器陣列timet_vals[3:0];//4個時間變量的寄存器陣列數據類型為reg的陣列常稱為存儲器(即memory):reg[15:0]MEM[0:1023];//1Kx16位的存儲器reg[7:0]PREP[‘hfffe:‘hffff];//2x8位的存儲器可以用參數來表示存儲器的大?。簆arameterwordsize=16;parametermemsize=1024;reg[wordsize-1:0]MEM3[memsize-1:0];第六十二頁,共190頁。語法詳細講解

第十一部分用文本接口的調試目的:在本節中我們將學習如何用Verilog-XL提供的TUI(用戶文本接口)來調試所設計的模塊進入交互方式的仿真模式控制和觀察仿真瀏覽設計的各個層次設置仿真的檢查斷點、退出仿真第六十三頁,共190頁。語法詳細講解

第六十四頁,共190頁。語法詳細講解

第六十五頁,共190頁。語法詳細講解

第十四部分Verilog測試模塊的編寫目的:

復習如何編寫較復雜的測試文件,對所做的設計進行完整的測試和驗證。掌握組織模塊測試的常用方法;學會編寫常用的測試代碼。第六十六頁,共190頁。語法詳細講解

用Verilog設計的步驟

注:虛線表示編譯器能檢查輸入文件的可讀性和是否存在以及是否允許生成輸出文件include文件設計文件廠家元件庫文件輸入文件:激勵和期望的輸出信號輸出文件:激勵和實際輸出的信號編譯器仿真器仿真器第六十七頁,共190頁。語法詳細講解

測試平臺的組成

激勵信號需要驗證的設計激勵信號和用于驗證的結果數據需要驗證的設計簡單的測試平臺復雜的測試平臺第六十八頁,共190頁。語法詳細講解

并行塊在測試塊中常用到fork…join塊。用并行塊能表示以同一個時間起點算起的多個事件的運行,并行地執行復雜的過程結構,如循環或任務。舉例說明如下:moduleinline_tb;reg[7:0]data_bus;initialforkdata_bus=8’b00;#10data_bus=8’h45;#20repeat(10)#10data_bus=data_bus+1;#25repeat(5)#20data_bus=data_bus<<1;#140data_bua=8’h0f;joinendmodule//這兩個repeat開始執行時間不同,但能同時運行。第六十九頁,共190頁。語法詳細講解

并行塊時間

data_bus08’b0000_0000108’b0100_0101308’b0100_0110408’b0100_0111458’b1000_1110508’b1000_1111608’b1001_0000658’b0010_0000708’b0010_0001時間

data_bus808’b0010_0010858’b0100_0100908’b0100_01011008’b0010_00011058’b0100_01101108’b1000_11001208’b1000_11101258’b0001_11001408’b0000_1111上面模塊的仿真輸出如下:第七十頁,共190頁。語法詳細講解

第七十一頁,共190頁。語法詳細講解

強制激勵在一個過程塊中,可以用兩種不同的方式對信號變量或表達式進行連續賦值。過程連續賦值往往是不可以綜合的,通常用在測試模塊中。兩種方式都有各自配套的命令來停止賦值過程。兩種不同方式均不允許賦值語句間的時間控制。assign和deassign適用于對寄存器類型的信號(例如:RTL級上的節點或測試模塊中在多個地方被賦值的信號)進行賦值。

initialbegin#10assigntop.dut.fsml.state_reg=`init_state;第七十二頁,共190頁。#20deassigntop.dut.fsml.state_reg;endforce和release用于寄存器類型和網絡連接類型(例如:門級掃描寄存器的輸出)的強制賦值,強制改寫其它地方的賦值。initialbegin#10forcetop.dut.counter.scan_reg.q=0;#20releasetop.dut.counter.scan_reg.q;end在以上兩個例子中,在10到20這個時間段內,網絡或寄存器類型的信號被強制賦值,而別處對該變量的賦值均無效。force的賦值優先級高于assign。如果先使用assign,再使用force對同一信號賦值,則信號的值為force所賦的值,

語法詳細講解

強制激勵語法詳細講解

字符串語法詳細講解

強制激勵

第七十三頁,共190頁。語法詳細講解

強制激勵

當執行release后,則信號的值為assign所賦的值。如果用force對同一個信號賦了幾次值,再執行release,則所有賦的值均不再存在。可以對信號的某(確定)位、某些(確定)位或拼接的信號,使用force和release賦值;但不能對信號的可變位使用force和release來賦值。不能對寄存器類型的信號某位或某些位使用assign和deassign來賦值。 語法詳細講解

強制激勵

第七十四頁,共190頁。語法詳細講解

建立時鐘

雖然有時在設計中會包含時鐘,但時鐘通常用在測試模塊中。下面三個例子分別說明如何在門級和行為級建立不同波形的時鐘模型。[例1]簡單的對稱方波時鐘:語法詳細講解

建立時鐘

regclk;alwaysbegin#period/2clk=0;#period/2clk=1;endreggo;wireclk;nand#(period/2)ul(clk,clk,go);initialbegingo=0;#(period/2)go=1;end注:在有些仿真器中,如果設計所用的時鐘是由與其相同抽象級別的時鐘模型產生的,則仿真器的性能就能得到提高。第七十五頁,共190頁。[例2]簡單的帶延遲的對稱方波時鐘:語法詳細講解

建立時鐘

regclk;initialbeginclk=0;#(period)forever#(period/2)clk=!clkendreggo;wireclk;nand#(period/2)ul(clk,clk,go);initialbegingo=0;#(period)go=1;end注:這兩個時鐘模型有些不同,行為描述的模型延遲期間一直是低電平,而門級描述的模型開始延遲有半個周期是不確定的。第七十六頁,共190頁。語法詳細講解

建立時鐘

[例3].帶延遲、頭一個脈沖不規則的、占空比不為1的時鐘:語法詳細講解

建立時鐘

regclk;initialbegin#(period+1)clk=1;#(period/2-1)foreverbegin#(period/4)clk=0;#(3*period/4)clk=1;endendreggo;wireclk;nand#(3*period/4,period/4)ul(clk,clk,go);initialbegin#(period/4+1)go=0;#(5*period/4-1)go=1;end注:這兩個時鐘模型也有些不同,行為描述的模型一開始就有確定的電平,而門級描述的模型有延遲,開始時電平是不確定的。第七十七頁,共190頁。語法詳細講解

怎樣使用任務舉例說明如何使用任務:modulebus_ctrl_tb;reg[7:0]data;regdata_valid,data_rd;cpuul(data_valid,data,data_rd);initialbegincpu_driver(8’b0000_0000);cpu_driver(8’b1010_1010);cpu_driver(8’b0101_0101);end語法詳細講解

怎樣使用任務

第七十八頁,共190頁。語法詳細講解

怎樣使用任務taskcpu_driver;input[7:0]data_in;begin#30data_valid=1;wait(data_rd==1);#20data=data_in;wait(data_rd==0);#20data=8’hzz;#30data_valid=0;endendtaskendmodule語法詳細講解

怎樣使用任務

第七十九頁,共190頁。語法詳細講解

怎樣使用任務在測試模塊中使用任務可以提高程序代碼的效率,可以用任務把多次重復的操作包裝起來。語法詳細講解

怎樣使用任務

waitwaitwaitwaitdata1data2data3data4cpu_dataclkdata_validdata_rdread_cpu_state第八十頁,共190頁。語法詳細講解

存儲建模目標學會如何用Verilog對存儲器建模。學會如何用Verilog中對雙向(即輸入/輸出)端口,(inout)建模。語法詳細講解

第十五部分存儲器建模

第八十一頁,共190頁。存儲器建模必須注意以下兩個方面的問題:聲明存儲器容量的大小。明確對存儲器訪問操作的權限。例如:指出可以對存儲器做以下哪幾種操作:1)只讀2)讀寫3)同步讀寫4)多次讀,同時進行一次寫5)多次同步讀寫,同時提供一些方法保證一致性語法詳細講解

存儲器建模第八十二頁,共190頁。`timescale1ns/10psmodulemyrom(read_data,addr,read_en_);inputread_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”,mem);always@(addrorread_en_)if(!read_en_)read_data=mem[addr];endmodule語法詳細講解

簡單ROM建模my_rom_data0000010111000011110100100011111110001001100000011101101000011101ROM的數據存儲在另外的一個獨立的文件中第八十三頁,共190頁。語法詳細講解

簡單ROM建模上頁所示的ROM模型說明:如何在Verilog中用二維的寄存器組來定義存儲器。ROM中的數據保存在一個獨立的文件中,如上頁的右邊的虛線方框所示。這是一種保存ROM數據的通用的方法,它可以使數據和ROM模型分開。第八十四頁,共190頁。語法詳細講解

簡單RAM建模`timescale1ns/1nsmodulemymem(data,addr,read,write);inout[3:0]data;inout[3:0]addr;inputread,write;reg[3:0]memory[0:15];//4bits,16words//從存儲器讀出到總線上assigndata=read?memory[addr]:4’bz;//從總線寫入存儲器always@(posedgewrite)memory[addr]=data;endmodule第八十五頁,共190頁。語法詳細講解

簡單RAM建模RAM模型比ROM模型稍微復雜:它必須具有讀寫能力;進行讀寫時通常使用相同的數據總線;需要新技術來處理雙向總線;當讀信號無效時,RAM模型與總線脫離,如果此時寫信號也無效,總線無驅動源,則總線進入高阻狀態,這就避免了RAM中的讀寫競爭。上頁的RAM模塊是可綜合的,但綜合出來是一大堆寄存器,占比較大的面積,經濟上不太合算。第八十六頁,共190頁。例:modulescalable_ROM(mem_word,address);parameteraddr_bits=8;//sizeofaddressbusparameterwordsize=8;//widthofawordparameterwords=(1<<addr_bits);//sizeofmemoutput[wordsize:1]mem_word;//wordofmemoryinput[addr_bits:1]address;//addressbus

reg[wordsize:1]mem[0:words-1];//memdeclaration//outputonewordofmemorywire[wordsize:1]mem_word=mem[address];endmodule語法詳細講解

存儲量可變的只讀存儲器建模第八十七頁,共190頁。語法詳細講解

存儲量可變的只讀存儲器建模上述的例子演示了怎樣通過設置字長和地址位數來編寫只讀存儲器的行為模塊。[注意]!!在上例中,存儲字的范圍從0開始的,而不是從1開始,這是因為存儲單元是直接通過地址線尋址定位的。同樣地,也可以用下面的方法來定義存儲器和尋址:reg[wordsize:1]mem[1:words];//存儲器地址從1開始//地址一個一個地增加直到包含了每個地址對應的存儲器wire[wordsize:1]mem_word=mem[address+1];第八十八頁,共190頁??梢栽诔跏蓟瘔K中用一個循環或系統任務把初始數據存入存儲器的每個單元。

使用循環把值賦給存儲器數組。

for(i=0;i<memsize;i=i+i)//initializememory

mema[i]={wordsize{1’b1}};調用$readmem系統任務。//從文件mem_中,把初始數據存入存儲器(mem)的每個單元$readmemb(“mem_”,mem);注意:上面兩項必須寫在initial塊中,加載這些初始化數據不需要時間。

語法詳細講解

存儲器的加載第八十九頁,共190頁。語法詳細講解

怎樣使用雙向口使用inout關鍵字聲明端口為雙向口。

inout[7:0]databus;使用雙向口必需遵循下面的規則:inout口只能聲明為網絡連接類型,不允許把它聲明為寄存器類型。(所以仿真器能確定多個驅動源的最終值。)在設計中,每次只能從一個方向來驅動inout口。

例如:當使用總線讀RAM中的數據時,如果同時又向RAM模型的雙向數據總線寫數據,就會產生邏輯競爭,導致總線數據無法確定。所以必須為inout口設計控制邏輯,只有這樣才能保證正確的操作。第九十頁,共190頁。語法詳細講解

怎樣使用雙向口[注意]:聲明一個inout口,可以用來輸入或輸出數據。inout口默認為網絡連接類型。不允許在過程塊(initial或always塊)中對網絡連接類型的數據進行過程賦值;但可以在過程塊外把一個寄存器數據類型通過連續賦值語句賦給它(inout口),或者把它與用戶定義的源語(UDP)相連。必須為inout口設計控制邏輯,用來保證正確的操作。當把inout口作為輸入口時,必須通過控制邏輯禁止輸出到inout口。第九十一頁,共190頁。使用Verilog中的基本元件(bufif1)為雙向口建模:語法詳細講解

雙向口建模b2b1en_a_ben_b_abus_abus_bmodulebus_xcvr(bus_a,bus_b,en_a_b,en_b_a);inoutbus_a,bus_b;inputen_a_b,en_b_a;bufiflb1(bus_b,bus_a,en_a_b);bufiflb2(bus_a,bus_b,en_b_a);//結構模塊邏輯endmodule當en_a_b=1時,元器件b1激活,bus_a的值傳到bus_b上當en_b_a=1時,元器件b1激活,bus_b的值傳到bus_a上第九十二頁,共190頁。語法詳細講解

雙向口建模[注意]:

在上頁的例子中,使用en_a_b和en_b_a來控制元器件bufifl,如果控制信號同時有效,則結果無法確定。所以必須把控制信號en_a_b和en_b_a在時間上分開。第九十三頁,共190頁。使用連續賦值為雙向口建模:en_a_ben_b_abus_abus_bmodulebus_xcvr(bus_a,bus_b,en_a_b,en_b_a);inoutbus_a,bus_b;inputen_a_b,en_b_a;assignbus_b=en_a_b?bus_a:’bz;assignbus_a=en_b_a?bus_b:’bz;//結構模塊邏輯endmodule當en_a_b=1時,bus_a的值傳到bus_b上當en_b_a=1時,bus_b的值傳到bus_a上語法詳細講解

雙向口建模b2b1第九十四頁,共190頁。[注意]:在assign語句中,通過en_a_b和en_b_a控制bus_a與bus_b之間的數據交換。如果控制信號同時有效,則結果不能確定。所以必須把控制信號en_a_b和en_b_a在時間上分開。語法詳細講解

雙向口建模第九十五頁,共190頁。存儲器的端口建模:語法詳細講解

雙向口建模moduleram_cell(databus,rd.wr);inoutdatabus;inputrd,wr;regdatareg;assigndatabus=rd?datareg:’bz;always@(negedgewr)datareg<=databus;endmodule當rd等于1時datareg的值被賦給databus當wr的下降沿到達時,databus的值被寫入datareg測試模塊RAM單元數據總線數據寄存器rdwr第九十六頁,共190頁。[注意]:上頁中存儲單元在wr的下降沿到達時存入數據。上頁模塊在wr處于高電平時,通過數據總線寫入數據,但必須保證wr的高電平維持時間長于數據的寫入時間。在rd處于高電平時,上述存儲單元通過數據總線讀出數據。由于此模型為單口存儲模型,因此wr變低電平時,rd不能同時為高電平,否則就無法確定存儲器的讀出/寫入的結果。語法詳細講解

雙向口建模第九十七頁,共190頁。目標:學會怎樣定義或調用任務和函數。學會怎樣使用命名塊。學會怎樣禁止命名塊和任務。理解有限狀態機的作用,學會如何顯式地為有限狀態機建模。語法詳細講解

第十六部分Verilog中的高級結構第九十八頁,共190頁。通過把代碼分成小的模塊或者使用任務和函數,可把一項任務分成許多較小的、易于管理的部分,從而提高代碼的可讀性、可維護性和可重用性。任務一般用于編寫測試模塊,或者行為描述的模塊。其中可以包含時間控制(如:#delays,@,wait);

也可以包含input,output、inout端口定義和參數;也可以調用其他的任務或函數函數一般用于計算,或者用來代替組合邏輯。不能包含任何延遲;函數在零時間執行。函數只有input變量,雖然沒有output變量,但可以通過函數名返回一個值??梢哉{用其他的函數,但不可以調用任務語法詳細講解

Verilog中的高級結構第九十九頁,共190頁。[注意]:只能調用本模塊內的任務和函數。在任務和函數中不能聲明網絡連接類型的變量。所有的輸入和輸出變量實際上都是本地寄存器。只有當任務或函數調用并執行完后,才能有返回值。[舉例說明]:若任務或函數中包含一個forever循環時,永遠無法執行完,就不可能有返回值。語法詳細講解

Verilog中的高級結構第一百頁,共190頁。語法詳細講解

Verilog任務下面模塊中的任務含有定時控制和一個輸入,并且引用了一個本模塊的變量,但是沒有輸出,也沒有雙向總線和內部變量,不顯示任何內容。用于定時控制的信號,例如clk,絕對不能作為任務的輸入,這是因為輸入值只向任務內部傳遞一次。

moduletop;regclk,a,b;DUTu1(out,a,b,clk);always#5clk=!clk;

第一百零一頁,共190頁。語法詳細講解

整數和實常數

taskneg_clocks;input[31:0]number_of_edges;repeat(number_of_edges)@(negedgeclk);endtaskinitialbeginclk=0;a=1;b=1;neg_clocks(3);//任務調用a=0;neg_clocks(5);b=0;endendmodule語法詳細講解

Verilog任務第一百零二頁,共190頁。要點:任務調用是通過在Verilog模塊中寫入任務名來實現的。任務中可以包含input,output和inout端口變量的聲明。傳遞給任務的變量與任務I/O端口變量的聲明次序相同。雖然傳遞給任務的變量名可以和任務內聲明的I/O端口變量名相同,但是為了使任務成為一個獨立的可共用的任務塊,建議不要使用與任務內聲明的I/O端口變量名相同的變量名,最好給傳遞到任務的變量起新的不同的名字。在任務中可以使用時間控制。任務使Verilog有更廣闊的適用范圍。關鍵字disable可以用來禁止任務的執行。語法詳細講解

Verilog任務第一百零三頁,共190頁。[注意]:

不要在程序的不同部分同時調用同一個任務。這是因為任務只有一組本地變量,同一時刻調用兩次相同的任務將會導致錯誤。這種情況常發生在使用定時控制的任務中。

在任務或函數中,引用父模塊中聲明的變量時要特別注意(即注意變量的層次命名規則)。若想在其它模塊中調用任務或函數,該任務和函數中所使用的變量必須全都包含在輸入/輸出口列表中。語法詳細講解

Verilog任務第一百零四頁,共190頁。下面模塊中的任務只含有一個雙向總線(inout)端口和一個內部變量,沒有其它輸入端口、輸出端口和定時控制,沒有引用模塊變量,不顯示任何內容。

在任務調用時,任務的輸入變量(端口)在任務內部被當作寄存器類型變量處理。

parameterMAX_BITS=8;reg[MAX_BITS:1]D;taskreverse_bits;inout[7:0]data;//雙向總線端口被當作寄存器類型

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論