第七张行为模型BehavoralModeling_第1页
第七张行为模型BehavoralModeling_第2页
第七张行为模型BehavoralModeling_第3页
第七张行为模型BehavoralModeling_第4页
第七张行为模型BehavoralModeling_第5页
已阅读5页,还剩36页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第七张行为模型BehavoralModeling7.1結構化程序(StructuredProcedures)在verilog中有兩個結構化程序:always和initial兩個敘述,這是最基本的敘述,verilog是並行程式語言,執行流也是並行執行的,而且不能有巢狀結構。7.1.1initial要把將執行的敘述放在initiial敘述,行程initiial區塊,一個區塊啟動程式啟動模擬時間零,且執行一次多個區塊,就要同時啟動模擬時間零,但各自執行。2modulestimulues;regx,y,a,b,m;initialm=1’b0;//單一敘述,不需要被群聚。initialbegin#5a=1’b1;//多個敘述,需要被群聚。

#25b=1’b0;end範例7-1

initial敘述3initialbegin#10x=1’b0;#25y=1’b1;endinitial#50$finish;endmudule範例7-1

initial敘述(續)47.2程式指定(ProceduralAssignments)程式指定可用來更新暫存器(reg)、整數(integer)、實數(real)或時間(time)變數的值,變數上的值會一直保持到被更新為止。範例簡單的程式指定assignment::=variable_lvalue=[delay_or_event_control]expression等號右手邊可以是任何一個可求出值的運算式,在行為模式中的運算子,皆能用來當行為模式的運算式。程式指定有兩種型態:阻礙指定(Blocking)與無阻礙指定(Nonblocking)。57.2.1阻礙指定(BlockingAssignments)阻礙指定的運算符號是“=”。範例7-6阻礙指定regx,y,z;reg[15:0]reg_a,reg_b;integercount;//所有行為模式敘述,必須在initial或always區塊內。initialbeginx=0;y=1;z=1;//純量指定count=0;//指定變數至整數變數6reg_a=16’b0;reg_b=reg_a;//設定向量初始#15reg_a[2]=1’b1://在延遲後選擇位元指定#10reg_b[15:13]={x,y,z}//指定連結的結果至向量部分指定count=count+1;//指定至一個整數(遞增)end77.2.2無阻礙指定(NonblockingAssignments)無阻礙指定的運算符號是“<=”

。regx,y,z;reg[15:0]reg_a,reg_b;integercount;//所有行為模式敘述,必須在initial或always區塊內。initialbeginx=0;y=1;z=1;//純量指定count=0;//指定變數至整數變數範例7-7無限定指定8reg_a=16’b0;reg_b=reg_a;//設定向量初始reg_a[2]<=#151’b1;//在延遲後選擇位元指定reg_b[15:13]

<=#10{x,y,z};//指定連結的結果,至向量部分指定。count<=count+1;//指定至一個整數(遞增)end97.3時序控制(TimingControls)7.3.1延遲基礎時間控制(Delay-BasedTimingControl)delay3::=#delay_value│#(delay_value[,delay_value[,delay_value]])delay2::=#delay_value│#(delay_value[,delay_value[,delay_value])delay_value::=unsigned_number│parameter_identifier│specparam_identifier│mintypmax_expression延遲基礎時序控制是用來指定遇到某個運算式,到實際執行它之間所需的時間。延遲是以符號“#”來表示,其語法如下:10正規延遲控制(RegularDelayControl)正規延遲控制是在延遲時間非零的時候,使用在程序指定敘述的左邊。//定義參數parameterlatency=20;parameterdelta=2;//定義暫存器變數regx,y,z,p,q;initialbeginx=0;//無延遲

#10y=1;//使用數值控制延遲,延遲執行y=1,10個時間單位。範例7-10正規延遲控制11#latencyz=0;//使用識別字控制延遲,延遲20個時間單位。#(latency+delta)p=1;//使用一個運算式控制延遲。#yx=x+1;//使用識別字控制延遲,從變數y取得延遲值。#(4:5:6)q=0;//最大、典型、最小延遲值。

//這在邏輯閘層次模型的章節裡討論過了。end

12指定內部延遲控制(Intra-AssignmentDalayControl)不同於正規延遲控制,指定內部延遲控制是用在指定程序中,指定運算子(AssignmentOperator)右邊的延遲時間。在範例7-11中將正規控制,和指定內部延遲控制作一個比較。//定義暫存器變數regx,y,z;//指定內部延遲initialbeginx=0;z=0;y=#5x+z;//在time=0讀取x和z的值並執行x+z,直到時間單位5再指定//至y。end範例7-11指定內部延遲13//使用暫時變數與正規延遲得到相同的結果initialbegin

x=0;z=0;temp_xz=x+z;#5y=temp_xz;//在目前的時間讀取x+z的值,並儲存至暫時變數。即

//使時間0至5間x和z的值改變了,也不影響單位時間

//5被指定至y的值。end147.3.2事件基礎時序控制(Event-BasedTimingControl)事件控制的符號是@,當信號產生正緣、負緣的轉換,或者數值的改變時,敘述會被執行。表示正緣轉換的關鍵字是posedge,如範例7-13所示。@(clock)q=d;//當clock的值改變,q=d被執行。@(posedgeclock)q=d;//當clock正緣觸發(0to1,xorz,//xto1,zto1),q=d被執行。@(negedgeclock)q=d;//當clock負緣觸發(1to0,xorz,//xto0,zto0),q=d被執行。q=@(posedgeclock)d;//d立刻被執行,等到clock正緣觸發

//再指定至q。

正規事件控制範例7-13正規事件控制15Verilog可以宣告一個事件,然後觸發和識別這個事件(範例7-14),事件並不會包含任何資料。一個被命名的事件是用關鍵字event來宣告,並使用符號“->”來觸發,一個觸發的事件是用“@”來識別。//當最後的封裝packet資料被接收時,儲存四個封裝資料至資//料緩衝器。eventrecieved_data;//定義一個事件recieved_dataalways@(posedgeclock)//在正緣觸發時做檢查beginif(last_data_packet)//如果是最後的封裝資料

->recieved_data;//觸發事件recieved_data

命名事件控制範例7-14命名事件控制16endalways@(recieved_data)//直到recieved_data事件被觸

//發,儲存四個封裝資料至資料

//緩衝器。

data_buf={data_pkt[0],data_pkt[1],data_pkt[2],data_pkt[3]};17當有多個訊號或事件中,任一個都能觸發某個敘述或多敘述區塊執行,就好像這些訊號或事件做或(OR)的邏輯運算。這些事件或訊號的列表,也稱為感測列表(SensitivityList),這多個觸發是用關鍵字or來區隔(範例7-15)。

事件或控制//非同步重設位準感測閂always@(resetorclockord)//等待reset、clock或d的數值改變。beginif(reset)//如果reset是高電位,設定q為0。

q=1’b0;elseif(clock)//如果clock是高電位,鎖住輸入資料。

q=d;end範例7-15事件或控制187.3.3位準感測時序控制(Level-SensitiveTimingControl)Verilog也允許位準感測時序控制,亦即等到某一個條件變成真(true)值,才執行某個敘述或區塊。位準感測時序控制用關鍵字wait做指定。alwayswait(count_enable)#20count=count+1;範例中,count_enable的值是一直被監控的。如果count_enable是0,這個敘述將不會被執行。如果是1,敘述將在20個時間單位後執行。如果count_enable停在1的位準,則每隔20個間,單位count都會加1。197.4條件敘述(ConditionStatements)條件敘述依照條件成立與否,決定是否執行某敘述或執行其他敘述,其關鍵字為if和else。//型1條件敘述,無else敘述,敘述可能被執行,或不被執行。if(<expression),true_statement;//型2條件敘述,一個else敘述,//true_statement或false_statement其中一個會被執行。If(<expression),true_statement;elsefalse_statement;//型3條件敘述,巢狀if-else-if。//多個敘述擇一,僅有一個敘述被執行。if(<expression1)true_statement1;elseif(<expression2>),true_statement2;elseif(<expression3>),true_statement3;elsedefault_statement;207.5多路徑分支(MultiwayBranching)這種巢狀結構的if-else-if,在過多的選擇時會變的很難處理。此時可以用case敘述來完成相同的結果。7.5.1case敘述(caseStatements)其關鍵字為case、endcase和default。case(expression)alternative1:statement1;alternative2:statement2;alternative3:statement3;

….

….default:default_statement;endcase217.6迴圈(Loops)在Verilng中有四種迴圈敘述:while、for、repeat和forever。迴圈的語法是與C程式語言相當類似的,而所有的迴圈敘述皆僅能在initial或always的區塊中,其能包含延遲的敘述。7.6.1while迴圈關鍵字為while,while迴圈會一直執行到while條件運算式(WhileExpression)成假的時候。若一進入while迴圈時,其條件運算式即是假時,這迴圈就不會執行。每一個條件運算式包含之運算子(Operators),若有多個敘述要在迴圈中執行,它們必須被群聚起來,通常上是使用關鍵字begin和end。227.6.2for迴圈其關鍵字為for。for迴圈包含了三個部份:初始條件。判斷終止條件是否為真。一個可改變控制變數的程序指定。初始狀態和累增程序指定,是包含在for迴圈之中,不需另外去定義它們,所以for迴圈要比while迴圈簡潔。但while迴圈有較廣的用途,for迴圈並不能取代所有的while迴圈。for迴圈一般使用在有固定起始和結束的迴圈,如果迴圈是在某一條件下的簡單迴圈,最好使用while迴圈。237.6.4forever迴圈其關鍵字為forever,forever迴圈並未包含任何條件運算式(Expression),會一直執行到遇到$finish,就好像while迴圈的條件運算式永遠為真,例:while(1)。forever迴圈亦可用disable敘述跳出。一般forever迴圈會與時序控制合用,若沒有使用時序控制,則會一直執行迴圈中的敘述,而其他的敘述將都不會被執行到。7.6.3Repeat迴圈關鍵字式repeat,其功用為指定一個固定次數的迴圈。repeat迴圈必須帶一個數值,可以是一個常數、變數或訊號值,而不能是一個邏輯表示式。若其為變數或訊號值時,僅在迴圈剛開始時才被讀取,在迴圈執行期間並不會再去讀取。247.7循序和平行區塊(SequentialandParallelBlocks)區塊是為了群眾多個敘述使其一起動作。在前面幾個範例中,我們使用關鍵字begin和end。來群聚多個敘述,這樣所得的是循序區塊,其內部的敘述將會一個接一個執行。在這一節中我們將討論到循序和並行兩種區塊,和三種特殊區塊:命名區塊、關閉命名區塊和巢狀區塊。區塊型態有兩種型態的區塊:循序區塊和平行區塊。循序區塊其關鍵字為begin和end,其有下列特性:每一個敘述會依照其順序執行,且要等到前一個敘述執行完才能開始執行(除了包含指定內部延遲控制的無阻礙指定)。每一個相對延遲控制或事件控制的敘述,其需等到前一個敘述執行完成,再依相對延遲時間或事件執行。25//說明1:不含延遲的循序區塊regx,y;reg[1:0]z,w;initialbeginx=1’b0;y=1’b1;z={x,y};w={y,x};end//說明2:含延遲的循序區塊範例7-26循序區塊26regx,y;rge[1:0]z,w;initialbeginx=1’b0;//完成執行在模擬時間0#5y=1’b1;//完成執行在模擬時間5#10z={x,y};//完成執行在模擬時間15#20w={y,x};//完成執行在模擬時間35end範例7-26循序區塊(續)27平行區塊其關鍵字為fork和join,在用特殊的模擬功能,其有以下之特性:在平行區塊中的所有敘述會同時執行。在平行區塊中,敘述的執行順序是依照延遲控制與事件控制。所有時序控制與事件驅動的時間,都相對進入區塊的模擬時間。循序區塊與平行區塊最大的不同是,所有在平行區塊中的敘述皆執行於區塊啟動時,因此順序是不重要的,除了每一個敘述皆起始模擬時間0之外,結果皆相同,所以區塊結束會在模擬時間20而非35。28//範例1:包含延遲的平行區塊regx,y;reg[1:0]z,w;initialforkx=1’b0;//完成執行在模擬時間0#5y=1’b1;//完成執行在模擬時間5#10z={x,y};//完成執行在模擬時間10#20w={y,x};//完成執行在模擬時間20join範例7-27平行區塊29//會產生競爭情況的平行區塊regx,y;reg[1:0]z,w;initialforkx=1’b0;y=1’b1;z={x,y};w={y,x};join30區塊的特殊特性(SpecialFeaturesofBlocks)我們討論三種區塊敘述的特殊功能:巢狀區塊(NastedBlocks)、命名區塊(NamedBlocks)與禁能命名區塊(DisablingofNamedBlocks)。巢狀區塊(NastedBlocks)區塊可以巢狀使用,循序區塊和並行區塊是可以混合在一起的。31

//巢狀區塊initialbeginx=1’b0;fork#5y=1’b1;#10z={x,y};join#20w={y,x};end範例7-28巢狀區塊32命名區塊(NamedBlocks)區塊是可以命名的:命名區塊中可宣告區域變數。命名區塊是設計階層的一部份,在命名區塊中的變數可用階層化命名參照存取。可以禁能一個命名區塊,也就是停止這區塊的執行。33

//命名區塊moduletop;initialbegin:block1//循序區塊命名為block1integeri;//整數i是區塊block1的靜態區塊區域變數

//可以用以下的階層化命名來取得

……end範例7-29命名區塊34initialfork:block2//平行區塊命名為block2regi;//暫存器i是block2的靜態區域變數

//可以用以下的階層化命名來取得,

……join範例7-29命名區塊(續)35禁能命名區塊(DisablingofNamedBlocks)關鍵字disable提供一個方法來結束一個命名區塊的執行。//說明:尋找flag(向量變數)中第一個1的位元reg[15:0]flag;integeri;//整數持續計數initialbeginflag=16’b0010_0000_0000_0000;i=0;begin:block1//將while迴圈內的主要區控命名為

//block1。範例7-30禁止命名區塊36while(i<16)beginif(flag[i])begin$display(“EncounteredaTRUEbitatelementnumber%d”,i);disableblock1;//因發現“1”位元所以禁能block1。

endi=i+1;endendend範例7-30禁止命名區塊(續)377.8

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论