深刻理解阻塞和非阻塞的不一樣

記住:阻塞賦值就是它運行時,別人就不能運行,而且直接賦值到底

     非阻塞賦值就是它運行時,不阻礙別人的運行,這裏說不清(你懂的就OK)

   num<=num+1;//是表明只有在時鐘結束的時候右邊的數據才賦值給左邊的寄存器。

  

1、設計原則

  一、在描述組合邏輯的always塊中用阻塞賦值,則綜合成組合邏輯的電路結構;編程

  二、在描述時序邏輯的always塊中用非阻塞賦值,則綜合成時序邏輯的電路結構;佈局

2、語句排列前後的缺點

  一、語句的排列有時候是決定了語句的執行順序。當幾個語句在同一時刻執行時,可是因爲排列的不一樣就會形成前後執行,就會出現競爭冒險。spa

3、什麼叫阻塞賦值?

  一、阻塞賦值操做符」=「設計

  二、爲何叫阻塞賦值呢?教程

    即阻止其餘語句執行的賦值語句。由於在賦值時,先計算等號右邊部分的值,此時賦值語句就不容許任何別的語句的執行,直到如今的賦值完成,即左邊等於右邊的時候,才容許別的語句執行。隊列

  三、阻塞賦值缺點舉例說明:事件

    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模塊是不穩定的,一定會產生冒險和競爭。

4、非阻塞賦值

  一、爲何叫非阻塞賦值?

    由於在整個右邊語句計算和左邊語句被賦值的過程當中,其餘語句依然能夠運行。

  二、非阻塞賦值操做過程:

    1)在賦值開始時刻,計算非阻塞賦值右邊表達式。

    2)在賦值結束時刻,更新非阻塞賦值左邊表達式。

5、verilog模塊編程要點

  記住如下8點,才能在綜合佈局佈線後的方陣中避免出現冒險競爭現象。

  一、時序電路建模時,用非阻塞賦值。

  二、鎖存器電路建模時,用非阻塞賦值。

  三、用always塊創建組合邏輯模型時,用阻塞賦值。

  四、在同一個always塊中,創建時序和組合邏輯電路時,用非阻塞賦值。

  五、在同一個always塊中不要即便用非阻塞賦值又使用阻塞賦值。

  六、嚴禁在多個always塊中對同一個變量賦值。易產生競爭冒險。

  七、用$strobe系統任務來顯示用非阻塞賦值的變量值。

  八、在複製時不要使用#0延遲。

6、verilog的層次化事件隊列

  這裏我沒有看懂,就是感受有一個點:非阻塞賦值LHS變量的更新是安排在非阻塞賦值更新事件隊列中,而剩餘的其餘隊列是被安排在另外的一個隊列事件中。

7、實例講解

  一、使用阻塞賦值,不能自行觸發的振盪器,不建議

    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數字系統設計教程(夏宇聞)

相關文章
相關標籤/搜索