為了在仿真階段能夠模擬物理器件的延遲,進行結構模型建模,SystemVerilog/Verilog中提供了兩種類型的延遲用以模擬信號經過模型時的傳輸延遲,這兩種延遲分別是:分布延遲(Distributed Delay)和模塊路徑延遲(Module Path Delay).本文及下面一篇將針對這兩種延遲分別進行示例說明.
1 分布延遲(Distributed Delay)
分布延遲指模塊內信號從邏輯門的輸入到輸出或者線網的延遲,這里我們僅以邏輯門延遲為例進行說明.常見的門延遲主要有三種,如下圖:
【注意】如果信號從0/1/z變化到x,那么此時的門傳輸延遲為上述三種延遲最小的.另外,在進行仿真時,有些邏輯門的輸出不可能會出現高阻態z,所以對于這些邏輯門實際上就不存在關斷延遲了,類似的邏輯門有:and、nand、or、nor、xor、xnor、buf和not等.
1.1 門級延遲的格式
其中delay用于指定延遲,如果不指定,則所有延遲的默認值為0.如果指定,主要有兩種形式:
?基本延遲表達式;
?"最小值:典型值:最大值"形式;
并且這兩種形式結合不同的延遲類型經常會混合使用,下面我們針對兩種形式進行說明:
1.2 基本延遲表達式
針對延遲的類型,基本延遲一般不指定"最小值:典型值:最大值",可以簡單粗暴的認為在簡單延遲中,最小值、典型值和最大值可以認為是相同的,常見的簡單延遲使用格式如下表示例.
延遲類型 | 無延遲 | 1個延遲值(d) | 2個延遲值(d1,d2) | 3個延遲值(d1,d2,d3) |
上升延遲(Rise) | 0 | d | d1 | d1 |
下降延遲(Fall) | 0 | d | d2 | d2 |
輸出為x(To_x) | 0 | d | min(d1,d2) | min(d1,d2,d3) |
關斷延遲(Turn_off) | 0 | d | min(d1,d2) | d3 |
示例 | and u(out,d1,d2) | and #d u(out,d1,d2) | and #(d1,d2) u(out,d1,d2) | and #(d1,d2,d3) u(out,d1,d2) |
1.3 "最小值:典型值:最大值"形式
采用這種方式表示延遲時,延遲中的每一項將都以"最小值:典型值:最大值"形式出現,根據具體指定的延遲的個數,其常見格式如下:
【示例:指定一個延遲】and #(13) u(out,d1,d2);
工況 | 上升延遲 | 下降延遲 | 輸出為x延遲 | 關斷延遲 |
最小 | 1 | 1 | 1 | 1 |
典型 | 2 | 2 | 2 | 2 |
最大 | 3 | 3 | 3 | 3 |
此時的各種延遲在特定工況下的值都是相同的.
【示例:指定二個延遲】and #(13,46) u(out,d1,d2);
工況 | 上升延遲 | 下降延遲 | 輸出為x延遲 | 關斷延遲 |
最小 | 1 | 4 | min(1,4) | min(1,4) |
典型 | 2 | 5 | min(2,5) | min(2,5) |
最大 | 3 | 6 | min(3,6) | min(3,6) |
此時的兩個延遲分別指的是上升延遲和下降延遲,關斷和輸出為x的延遲取決于每種工況下上升延遲和下降延遲的最小值.
【示例:指定三個延遲】and #(13,46,79) u(out,d1,d2);
上升延遲 | 下降延遲 | 輸出為x延遲 | 關斷延遲 | |
最小 | 1 | 4 | min(1,4,7) | 7 |
典型 | 2 | 5 | min(2,5,8) | 8 |
最大 | 3 | 6 | min(3,6,9) | 9 |
此時的三個延遲分別指的是上升延遲、下降延遲和關斷延遲,輸出為x的延遲取決于每種工況下上升延遲、下降延遲和關斷延遲的最小值.
門單元可以指定這么多種的延遲,那么在進行仿真時如何告訴仿真器應該使用哪種工況下指定的延遲呢?目前在使用主流EDA工具進行仿真時可以針對需要使用的延遲在命令參數中指定"+mindelays"(對應最小值,此時所有的延遲取最小值)、"+typdelays"(對應典型值,此時所有的延遲取典型值)、"+maxdelays"(對應最大值,此時所有的延遲取最大值)來實現,但是每次仿真時只能指定一種延遲模式,并且這種選擇在仿真過程中是不能修改的.
2模塊路徑延遲(Module Path Delay)
模塊路徑延遲描述的是模塊中信號從源端到目的端傳輸的延遲,這些路徑以及對應的延遲是在模塊中的specify塊中指定的,其中信號源端一般為input或者inout,而目的端則只能為output或者inout.在specify中指定的模塊路徑,常見的形式主要三種,分別是:簡單路徑(Simple Path),邊沿敏感路徑(Edge Secsitive Path)和條件相關路徑(State-dependent Path).
在這三種路徑中根據源端和目的端之間路徑的可能連接方式又分為兩種:并行連接(Parallel Connection)和全連接(Full Connection),在specify塊中的三種模塊路徑中描述延遲時主要就是通過這兩種連接方式進行描述的.
2.1并行連接(Parallel Connection)
并行連接表示每條延遲路徑只有一個源端和目的端,其語法格式如下:
(
其中delay_value可以為1~3個延遲量表達方式,延遲量也可以采用"最小值:典型值:最大值"的形式,如果延遲量多于兩個,則可以使用小括號將延遲量包括其來,延遲量之間用逗號分隔.
2.2全連接(Full Connection)
全連接中源端中的每一位可以與目的端中的每一位相連接,即使源端位數與目的端位數不一致也可以,其格式如下:
(
其中delay_value的指定方式同并行連接.
下面是上述兩種連接方式的示意圖和注意事項和區別:
不管是并行連接還是全連接,都可以應用于模塊路徑延遲的三種類型中.
2.3模塊路徑
2.3.1簡單路徑
一般只包含*>和=>連接的路徑,在其中僅描述簡單的源端到目的端的延遲,屬于基本模塊路徑延遲表示形式.
2.3.2邊沿敏感路徑
主要用來描述信號在特定邊沿事件發生時數據從源端傳遞到目的端的路徑,其中延遲主要指的是邊沿敏感事件發生時刻到數據信號傳遞到目的端的時間,常用的格式如下:
【示例】
【仿真結果】
示例中,在時刻5ns時,clk發生上升沿事件,經過10ns延遲后信號dat_in的上升變化傳遞到了輸出端dat_out.在時刻15ns時,clk再次發生上升沿事件,經過8ns延遲后信號dat_in的下降變化傳遞到了輸出端dat_out,后續變化與此雷同,不再贅述.可見此時的延遲指的是采樣事件發生到輸出的延遲,并不是數據輸入端到數據輸出端的延遲.這里需要注意的是在dat_out和dat_in之間指定傳輸方向是使用了極性操作符"+",主要表示輸入到輸出是否取反,如果要對數據取反可以將"+"換為"-",但是這里需要注意這個操作符對于仿真來說不會產生任何影響,即在仿真時不會出現取反現象,僅對時序分析工具會產生影響.
【示例】
【仿真結果】
示例中,在5ns時,clk發生上升沿事件,在clk下一次跳變發生前dat_in保持0,dat_in沒有發生變化,dat_out保持不變.在10ns時,clk發生下降沿事件,dat_in的值應該在clk下降沿事件之后10ns后更新至dat_out,但是在clk下一次跳變發生前dat_in變為了1,即dat_in發生了上升變化,所以,此時最終更新至dat_out的值為dat_in的最新值,并且發生在clk下降沿事件發生后的10ns處,即20ns時刻.在20ns時,clk發生下降沿變化,此時dat_in為1,但是在clk下一次跳邊沿之前dat_in變為了0,即dat_in發生了下降沿變化,所以,此時最終更新至dat_out的值為dat_in的最新值0,并且發生在clk下降沿事件發生后的8ns處,即28ns時刻.后續變化分析類似,不再贅述.
2.3.3條件相關路徑(狀態依賴路徑)
在指定條件成立的情況下,才會將延遲作用于模塊路徑,格式如下:
【示例】
【仿真結果】
示例中,在sel不為高時,此時在specify塊中指定的模塊路徑延遲并不會并不會作用到dat_in到dat_out這條路徑上.但是在sel為高后,此時specify塊中指定的模塊路徑延遲會作用到從dat_in傳遞到dat_out的數據.這里需要注意的是,在specify塊中指定條件的if語句塊不能使用else分支結構.
3分布延遲和模塊路徑延遲同時存在情況
一般情況下,一個模塊中不止會包含specify塊,還會包含大量的門單元,在specify塊中會指定模塊路徑延遲,模塊內的路徑上各個基本單元(可以是基本的門級單元、開關級元件或者子模塊)又存在分布延遲,模塊中這兩種延遲經常會共存,那么此時進行仿真時應該使用哪種延遲呢?下面通過下面電路進行示例說明兩種延遲對于信號在模塊中傳遞是如何產生影響的.
【電路結構】電路中存在三個輸入端口in1、in2、in3和一個輸出端out,并且in1到out的模塊路徑延遲為4個時間單位,in2到out的模塊路徑延遲為6個時間單位,in3到out的模塊路徑延遲為1個時間單位,或門產生延遲為2,與非門延遲3.
【示例】
【仿真結果】
示例中針對幾個時間點變化匯總如下:
在10ns時,in1變為1,in2為0,in3為1,此時in1和in2經過或操作輸出wnet,且或門延遲為2,所以wnet延遲2個時間單位后變化,wnet和in3經過與非門后輸出至out,因為此時wnet和in3連接的與非門門延遲為3,所以wnet變化后3個時間單位變化更新至out,此時out變為0,可見此時從端口in1信號的變化到輸出端輸出的延遲時間不是in1和out之間指定的模塊路徑延遲4,而是該路徑經過的所有門單元延遲總和,即是該路徑分布延遲值;
在30ns時,in2從0變為了1,in1為0,in3為1,此時in1和in2經過或操作輸出wnet,且或門延遲為2,所以wnet延遲2個時間單位后變化,wnet和in3經過與非門后輸出至out,雖然此時wnet和in3連接的與非門門延遲為3,但是因為從端口in2信號的變化延遲到輸出端輸出的分布延遲為2+3=5,小于從in2到out的模塊路徑延遲6,所以此時從端口in2信號的變化到輸出端輸出的延遲時間為6;
在60ns時,in3從1變為了0,in1為0,in2為1,此時因為in1和in2都沒有變化,所有wnet保持1,所以此時影響輸出的只有in3,in3在60ns變化后,out發生變化的時間為3ns,即與非門的門延遲值,并不是in3到out的模塊路徑延遲1;
通過上述三個時間點in1、in2、in3的分別變化到out輸出的延遲情況可以看出,模塊端口的最終延遲取決于分布延遲和模塊路徑延遲中的最大者,因此本電路輸入端口到輸出端口的延遲可以表示如下表所示.
選項 | 分布延遲 | 模塊路徑延遲 | 最終延遲 |
in1 -> out | 2+3=5 | 4 | 5 |
in2 -> out | 2+3=5 | 6 | 6 |
in3 -> out | 3 | 1 | 3 |
最后,大家需要注意,上述這些延遲的單位和精度為當前模塊使用的時間單位和時間精度.
審核編輯 :李倩
-
Verilog
+關注
關注
28文章
1351瀏覽量
110398 -
模型
+關注
關注
1文章
3313瀏覽量
49232
原文標題:SystemVerilog/Verilog中的各種延遲模型
文章出處:【微信號:處芯積律,微信公眾號:處芯積律】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
verilog在psoc中延遲
使用SystemVerilog來簡化FPGA中接口的連接方式
循環模型編譯器Verilog和System Verilog語言支持指南
SystemVerilog 3.1a語言參考手冊
SystemC 和SystemVerilog的比較
使用Verilog/SystemVerilog硬件描述語言練習數字硬件設計
從Verilog PLI到SystemVerilog DPI的演變過程
![從<b class='flag-5'>Verilog</b> PLI到<b class='flag-5'>SystemVerilog</b> DPI的演變過程](https://file1.elecfans.com/web2/M00/82/CC/wKgZomRi3GCAdSbaAAAdUFmKTn0241.png)
verilog-2005和systemverilog-2017標準規范
![<b class='flag-5'>verilog</b>-2005和<b class='flag-5'>systemverilog</b>-2017標準規范](https://file1.elecfans.com/web2/M00/A1/78/wKgZomT1PVaAC0eiAAAvat2ryA8842.png)
SystemVerilog在硬件設計部分有哪些優勢
![<b class='flag-5'>SystemVerilog</b>在硬件設計部分有哪些優勢](https://file1.elecfans.com/web2/M00/A9/45/wKgaomUwoFCAH2AVAAIMtBAX5n0432.jpg)
SystemVerilog相比于Verilog的優勢
![<b class='flag-5'>SystemVerilog</b>相比于<b class='flag-5'>Verilog</b>的優勢](https://file1.elecfans.com/web2/M00/AA/6A/wKgaomU5yY6AMOTqAAAJI5VXtSo129.png)
評論