一、在描述組合邏輯的always塊中用阻塞賦值,則綜合成組合邏輯的電路結構;編程
二、在描述時序邏輯的always塊中用非阻塞賦值,則綜合成時序邏輯的電路結構;佈局
一、語句的排列有時候是決定了語句的執行順序。當幾個語句在同一時刻執行時,可是因爲排列的不一樣就會形成前後執行,就會出現競爭冒險。spa
一、阻塞賦值操做符」=「設計
二、爲何叫阻塞賦值呢?教程
即阻止其餘語句執行的賦值語句。由於在賦值時,先計算等號右邊部分的值,此時賦值語句就不容許任何別的語句的執行,直到如今的賦值完成,即左邊等於右邊的時候,才容許別的語句執行。隊列
三、阻塞賦值缺點舉例說明:事件
1)always@(posedge clk or posedge rst)同步
if(rst) y1=0;it
else y1=y2;變量
2)always@(posedge clk or posedge rst)
if(rst) y2=1;
else y2=y1;
在同一個時鐘沿到來時,咱們二者的兩個always塊在硬件上是不可能同步的,中間會差個幾皮秒的相隔時間。
若是1)先執行,那麼y1和y2都是1。
若是2)先執行,那麼y1和y2都是0。
這說明這個verilog模塊是不穩定的,一定會產生冒險和競爭。
一、爲何叫非阻塞賦值?
由於在整個右邊語句計算和左邊語句被賦值的過程當中,其餘語句依然能夠運行。
二、非阻塞賦值操做過程:
1)在賦值開始時刻,計算非阻塞賦值右邊表達式。
2)在賦值結束時刻,更新非阻塞賦值左邊表達式。
記住如下8點,才能在綜合佈局佈線後的方陣中避免出現冒險競爭現象。
一、時序電路建模時,用非阻塞賦值。
二、鎖存器電路建模時,用非阻塞賦值。
三、用always塊創建組合邏輯模型時,用阻塞賦值。
四、在同一個always塊中,創建時序和組合邏輯電路時,用非阻塞賦值。
五、在同一個always塊中不要即便用非阻塞賦值又使用阻塞賦值。
六、嚴禁在多個always塊中對同一個變量賦值。易產生競爭冒險。
七、用$strobe系統任務來顯示用非阻塞賦值的變量值。
八、在複製時不要使用#0延遲。
這裏我沒有看懂,就是感受有一個點:非阻塞賦值LHS變量的更新是安排在非阻塞賦值更新事件隊列中,而剩餘的其餘隊列是被安排在另外的一個隊列事件中。
initial #10 clk=0;//--------------------------(1)
always@(clk) //-----------------------------(2)
#10 clk=~clk;//------------------------(3)
這裏使用的是阻塞賦值,在(1)中,咱們的clk變化成0,觸發了always塊,延遲10ns,clk變成1
注意在由0->1的過分期間,咱們是不容許任何其餘程序執行的,因此always塊沒有檢測到變化,也就是always塊並無由於第二次的clk變化而被觸發。
initial #10 clk=0;//--------------------------(1)
always@(clk) //-----------------------------(2)
#10 clk<=~clk;//-----------------------(3)
這裏always塊第一次觸發後~clk便被計算出來,並賦值給LHS的事件並被安排在更新事件隊列中。在非阻塞賦值更新事件隊列被激活以前,又遇到@(clk)語句。當clk發生變化時,always塊便被觸發。這裏看來延遲10ns是有必要的。
當阻塞賦值時,在並行的always塊中,咱們雖然說是並行的,當是他們開始的時間是有前後的,這樣就可能形成競爭現象,因此咱們不建議在用阻塞賦值。可是咱們使用非阻塞賦值時,就不會出現競爭現象,由於他不是阻塞的,也不會當即就會變化的。這樣很好,你懂的。。。。
摘自:verilog數字系統設計教程(夏宇聞)