進(jìn)程運(yùn)行時(shí)不會(huì)發(fā)生任何事件!
當(dāng)一個(gè)進(jìn)程被事件喚醒時(shí),它會(huì)運(yùn)行到完成(“結(jié)束進(jìn)程”)或顯式的“等待”語句,然后進(jìn)入休眠狀態(tài)。從理論上講,這需要零時(shí)間。這意味著,如果您在流程中有循環(huán),它們實(shí)際上是完全展開的,當(dāng)您進(jìn)行綜合時(shí),您將生成足夠多的硬件來并行運(yùn)行每一個(gè)迭代。此外,任何過程、函數(shù)等都不需要任何時(shí)間-除非它們包含一個(gè)顯式的“等待”語句(在這種情況下,進(jìn)程在“等待”處掛起,就好像該過程是內(nèi)聯(lián)的)。
在整個(gè)過程中,所有信號(hào)都具有它們在進(jìn)程醒來時(shí)的原始值,并且任何信號(hào)分配都會(huì)被存儲(chǔ)起來,以后才會(huì)發(fā)生。(變量立即更新;流程中稍后的語句見新值)。
當(dāng)進(jìn)程掛起(在“等待”或“結(jié)束進(jìn)程”)時(shí),在所有其他進(jìn)程也暫停之前什么都不會(huì)發(fā)生。(但請記住,他們都不需要任何時(shí)間!)如果一個(gè)進(jìn)程在“結(jié)束進(jìn)程”處掛起,當(dāng)它的敏感性列表喚醒它時(shí),它將從一開始就重新啟動(dòng)。如果它在顯式“等待”處掛起,則“等待”將指定一個(gè)事件或未來時(shí)間,該事件或時(shí)間將在“等待”之后重新啟動(dòng)。(注意:1:不要將敏感列表和等待樣式混合在同一個(gè)進(jìn)程中!2:等待某個(gè)事件可以合成(盡管有些工具可能反對);等待一段時(shí)間才是模擬)
然后執(zhí)行所有的信號(hào)分配。由于所有進(jìn)程都處于休眠狀態(tài),這消除了所有競賽條件和計(jì)時(shí)風(fēng)險(xiǎn)。其中一些分配(比如“1”到一個(gè)時(shí)鐘)將導(dǎo)致事件被安排在對它們敏感的進(jìn)程上。
在完成所有信號(hào)分配之后,時(shí)間向前邁進(jìn)一個(gè)無限短的滴答(稱為增量周期),然后所有計(jì)劃事件的進(jìn)程都會(huì)被喚醒。
這種情況一直持續(xù)到增量周期發(fā)生,在這種循環(huán)中沒有新事件被調(diào)度,最后模擬可以一個(gè)實(shí)時(shí)步驟向前推進(jìn)。
因此
process(clk)beginif rising_edge(clk) then
A <= B;
B <= A;end if;end process;
在VHDL中是無危害的。
如果您需要使用Verilog,請注意,在那里發(fā)生的某些事情是不同的,而且您不能在仿真結(jié)果中依賴相同級(jí)別的可預(yù)測性。
在綜合中,當(dāng)然,我們生成硬件,這將需要一些時(shí)間來執(zhí)行這個(gè)過程。然而,綜合和后端工具(地點(diǎn)和路線)保證要么忠實(shí)地遵守這個(gè)模型,要么失敗并報(bào)告失敗的原因。例如,它們將所有實(shí)際延遲加在一起,并驗(yàn)證該總和小于指定的時(shí)鐘周期。(除非你把時(shí)鐘速度調(diào)得太高了!)
因此,結(jié)果是,只要工具報(bào)告成功(并且您正在正確設(shè)置時(shí)鐘速度等定時(shí)約束),您就可以假裝上述“零時(shí)間”模型是正確的,并且真實(shí)的硬件行為將與仿真相匹配。保證,禁止工具錯(cuò)誤!