1. 電路的延時(shí)
在實(shí)際電路中存在兩種延遲,慣性延遲 (Inertial delay) 和傳導(dǎo)延遲 (Transport delay)
慣性延遲
定義:若元件的輸入信號(hào)的脈沖寬度小于一定值時(shí),元件的輸出沒有響應(yīng),也就是說元件具有一定的慣性。
產(chǎn)生原因:當(dāng)脈沖到達(dá)時(shí),由于脈沖寬度小于元件本身的延遲,當(dāng)脈沖結(jié)束時(shí),元件的新輸出還未建立起來??紤]了電路中存在的大量分布電容。
傳導(dǎo)延遲
定義:輸入信號(hào)變化到對(duì)應(yīng)輸出信號(hào)變化經(jīng)過的時(shí)間,類似于物理傳輸線的延遲。
產(chǎn)生原因:載流子運(yùn)動(dòng)的速度有限,通過導(dǎo)線需要一定的時(shí)間。
2. Verilog 中的時(shí)序模型
在分析 Verilog HDL 的仿真行為前,我們需要了解 Verilog 中時(shí)序模型。
時(shí)序模型分為:門級(jí)時(shí)序模型、過程時(shí)序模型。
門級(jí)時(shí)序模型
適用范圍:所有的連續(xù)賦值語句、過程連續(xù)賦值語句、門原語、用戶自定義原語。
特點(diǎn):
任意時(shí)刻輸入發(fā)生變化,將重新計(jì)算輸出。
當(dāng)之前的的事件未執(zhí)行完畢時(shí)又發(fā)生的新的變化,則會(huì)撤銷之前的事件,開始新的事件。
過程時(shí)序模型
適用范圍:過程語句。
特點(diǎn):
當(dāng)敏感列表發(fā)生變化時(shí)觸發(fā)執(zhí)行。
當(dāng)之前的的事件未執(zhí)行完畢時(shí)又發(fā)生的新的變化,則不撤銷原有事件,同時(shí)開始新的事件,如果同時(shí)有幾個(gè)更新事件,它們的執(zhí)行順序是不確定的。
3. Verilog 中的仿真延遲語句
Verilog 中的仿真延時(shí)語句為 #n,n 表示延時(shí)時(shí)間,將該語句加在語句中,延遲 n 個(gè)時(shí)間單位。
延時(shí)的添加方法有兩種:正規(guī)延遲和內(nèi)定延遲
正規(guī)延遲 (#在外面)
#5 C = A +B
在 T 時(shí)刻執(zhí)行到該語句時(shí),等待 5 個(gè)時(shí)間單位,然后計(jì)算等號(hào)右邊的值賦給 C,此時(shí)使用的 A B 的值是 T+5 時(shí)刻的值。
內(nèi)定延遲 (#在里面)
C = #5 A +B
在 T 時(shí)刻執(zhí)行到該語句時(shí),先計(jì)算 A+B 的值,計(jì)算后等待 5 個(gè)時(shí)間單位將值賦給 C,使用的 A B 的值是 T 時(shí)刻的值。
4. 在 Verilog 建模中增加延時(shí)
兩種延時(shí)的添加方式和三種賦值方式 (連續(xù)賦值、阻塞賦值、非阻塞賦值) 一共形成六中添加延遲的方式。
// 1. 連續(xù)賦值+ 正規(guī)延遲assign#5C = A +B;// 2. 連續(xù)賦值+ 內(nèi)定延遲assign C =#5A +B;// 3. 阻塞賦值 + 正規(guī)延遲always @(*) begin #5 C = A +B; end // 4. 阻塞賦值 + 內(nèi)定延遲 always @(*)begin C =#5A +B;end// 5. 非阻塞賦值 + 正規(guī)延遲always @(*) begin #5 C <= A +B; end ?// 6. 非阻塞賦值 + 內(nèi)定延遲 always @(*)?begin? ? ?C <=?#5?A +B;end
下面對(duì)這六種方式逐一分析:
連續(xù)賦值+ 正規(guī)延遲
在 T 時(shí)刻執(zhí)行到該語句時(shí),等待 5 個(gè)時(shí)間單位,然后計(jì)算等號(hào)右邊的值賦給 C1。
使用的 A B 的值是 T+5 時(shí)刻的值。
若在等待過程中 A B 的值發(fā)生變化再次觸發(fā) assign block,根據(jù) assign block 的門級(jí)時(shí)序模型特點(diǎn),仿真器會(huì)撤銷先前的等待事件,然后重新執(zhí)行語句。
當(dāng)變化脈沖小于 5 個(gè)時(shí)間單位時(shí),等待事件會(huì)被撤銷,該脈沖將不起作用。
仿真結(jié)果:
可以看出在 6ns、8ns、9ns、10ns 時(shí)刻 A 發(fā)生了變化,但皆因持續(xù)時(shí)間小于 5ns,所以都沒有對(duì) C1 產(chǎn)生影響,只有在 12ns 和 18ns 的變化持續(xù)時(shí)間超過 5ns,作用到 C1 上。
連續(xù)賦值+ 內(nèi)定延遲
在 T 時(shí)刻執(zhí)行到該語句時(shí),計(jì)算等號(hào)右邊的值,等待 5 個(gè)時(shí)間單位后賦給 C2。
使用的 A B 的值是 T 時(shí)刻的值。
若在等待過程中 A B 的值發(fā)生變化再次觸發(fā) assign block,根據(jù) assign block 的門級(jí)時(shí)序模型特點(diǎn),仿真器會(huì)撤銷先前的等待事件,然后重新執(zhí)行語句。
當(dāng)變化脈沖小于 5 個(gè)時(shí)間單位時(shí),等待事件會(huì)被撤銷,該脈沖將不起作用。
該種方式有記憶屬性,與連續(xù)賦值原則不符,為非法語句,編譯不能通過。
阻塞賦值 + 正規(guī)延遲
在 T 時(shí)刻執(zhí)行到該語句時(shí),等待 5 個(gè)時(shí)間單位,然后計(jì)算等號(hào)右邊的值阻塞賦給 C3。
使用的 A B 的值是 T+5 時(shí)刻的值。
若在等待過程中 A B 的值發(fā)生變化再次觸發(fā) always block,根據(jù) always block 的過程時(shí)序模型特點(diǎn),此時(shí)還在等待過程,always 語句還未執(zhí)行結(jié)束,不會(huì)開始新一輪的事件,仿真器不會(huì)對(duì)敏感列表反應(yīng)。
仿真器忽略延遲時(shí)間段的數(shù)據(jù)變化。
仿真結(jié)果:
在 6ns 時(shí)刻 A 的值發(fā)生變化,always block 開始執(zhí)行,經(jīng)過 5ns,用 11ns 時(shí)刻的 A B 的值計(jì)算出結(jié)果賦給 C3,而忽略了 8ns 和 10ns 時(shí)刻的變化。
阻塞賦值 + 內(nèi)定延遲
在 T 時(shí)刻執(zhí)行到該語句時(shí),計(jì)算等號(hào)右邊的值,等待 5 個(gè)時(shí)間單位后賦給 C4。
使用的 A B 的值是 T 時(shí)刻的值。
若在等待過程中 A B 的值發(fā)生變化再次觸發(fā) always block,根據(jù) always block 的過程時(shí)序模型特點(diǎn),由于賦值方式為阻塞賦值,此時(shí) always 語句還未執(zhí)行結(jié)束,不會(huì)開始新一輪的事件,仿真器不會(huì)對(duì)敏感列表反應(yīng)。
仿真器忽略延遲時(shí)間段的數(shù)據(jù)變化。
仿真結(jié)果:
在 6ns 時(shí)刻 A 的值發(fā)生變化,always block 開始執(zhí)行,經(jīng)過 5ns,用 6ns 時(shí)刻的 A B 的變化后的值計(jì)算出結(jié)果賦給 C4,而忽略了 8ns 和 10ns 時(shí)刻的變化。
非阻塞賦值 + 正規(guī)延遲
在 T 時(shí)刻執(zhí)行到該語句時(shí),等待 5 個(gè)時(shí)間單位,然后計(jì)算等號(hào)右邊的值非阻塞賦給 C5。
使用的 A B 的值是 T+5 時(shí)刻的值。
若在等待過程中 A B 的值發(fā)生變化再次觸發(fā) always block,根據(jù) always block 的過程時(shí)序模型特點(diǎn),此時(shí)還在等待過程,always 語句還未執(zhí)行結(jié)束,不會(huì)開始新一輪的事件,仿真器不會(huì)對(duì)敏感列表反應(yīng)。
仿真器忽略延遲時(shí)間段的數(shù)據(jù)變化。
仿真結(jié)果:
在 6ns 時(shí)刻 A 的值發(fā)生變化,always block 開始執(zhí)行,經(jīng)過 5ns,用 11ns 時(shí)刻的 A B 的值計(jì)算出結(jié)果賦給 C5,而忽略了 8ns 和 10ns 時(shí)刻的變化。
非阻塞賦值 + 內(nèi)定延遲
在 T 時(shí)刻執(zhí)行到該語句時(shí),計(jì)算等號(hào)右邊的值,等待 5 個(gè)時(shí)間單位后賦給 C6。
使用的 A B 的值是 T 時(shí)刻的值。
若在等待過程中 A B 的值發(fā)生變化再次觸發(fā) always block,根據(jù) always block 的過程時(shí)序模型特點(diǎn),由于賦值方式為非阻塞賦值,將賦值事件放進(jìn)事件隊(duì)列后,always 語句執(zhí)行結(jié)束,等待下一次的觸發(fā),觸發(fā)來到時(shí)開始新一輪的事件。
仿真器接受延遲時(shí)間段的數(shù)據(jù)變化,輸入的變化延遲會(huì)全部反應(yīng)在輸出上。
仿真結(jié)果:
A B 的每一次變化都觸發(fā) always block 的執(zhí)行,每一次變化都延時(shí) 5ns 后反應(yīng)在 C6 上。
下圖為 always block 中的四種延時(shí)方式的仿真流程:
// 仿真源碼`timescale1ns/1ps moduleTestbench;reg A,B;wire C1,C2;reg C3,C4,C5,C6;initialbeginA =0;B =0;C3 =0;C4 =0;C5 =0;C6 =0;#6A =1;#2A =0;#1A =1;#1A =0;#2A =1;#6A =0;end// 1. 連續(xù)賦值+ 正規(guī)延遲assign#5C1 = A +B;// 3. 阻塞賦值 + 正規(guī)延遲always @(*) begin #5 C3 = A +B; end // 4. 阻塞賦值 + 內(nèi)定延遲 always @(*)begin C4 =#5A +B;end// 5. 非阻塞賦值 + 正規(guī)延遲always @(*) begin #5 C5 <= A +B; end ?// 6. 非阻塞賦值 + 內(nèi)定延遲 always @(*)?begin? ? ?C6 <=?#5?A +B;endendmodule
5. 總結(jié)
根據(jù)上述分析,容易看出慣性延時(shí)對(duì)應(yīng)于連續(xù)賦值中的正規(guī)延遲,而傳導(dǎo)延時(shí)對(duì)應(yīng)于非阻塞賦值中的內(nèi)定延遲。
所以仿真中常用 “連續(xù)賦值 + 正規(guī)延遲“ 模擬慣性延遲,用 ”非阻塞賦值 + 內(nèi)定延遲“ 模擬傳導(dǎo)延遲。
-
仿真
+關(guān)注
關(guān)注
51文章
4216瀏覽量
135147 -
Verilog
+關(guān)注
關(guān)注
28文章
1364瀏覽量
111570 -
時(shí)序
+關(guān)注
關(guān)注
5文章
395瀏覽量
37736 -
模型
+關(guān)注
關(guān)注
1文章
3471瀏覽量
49869 -
延時(shí)分析
+關(guān)注
關(guān)注
0文章
2瀏覽量
5639
原文標(biāo)題:Verilog 仿真事件中的延時(shí)分析
文章出處:【微信號(hào):gh_9d70b445f494,微信公眾號(hào):FPGA設(shè)計(jì)論壇】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
北大Verilog課件四百多頁
時(shí)分復(fù)用的verilog
verilog中乘法器延時(shí)問題
北大微電子verilog講義課件

MIMO天線中的延時(shí)失衡性能分析

單片機(jī)的C語言延時(shí)分析實(shí)例說明

Verilog設(shè)計(jì)增加延時(shí)的仿真技術(shù)
如何使用Icarus Verilog+GTKWave來進(jìn)行verilog文件的編譯和仿真

FreeRTOS高級(jí)篇9---FreeRTOS系統(tǒng)延時(shí)分析

評(píng)論