三種情況:

  • valid先發起請求

systemverilog ready握手採樣_存儲體

  • ready先發起請求

systemverilog ready握手採樣_數據_02

  • 同時發起請求

systemverilog ready握手採樣_數據_03

 

 

 

 

 

仔細觀察上述3幅時序圖,我們瞭解valid-ready握手機制需要注意三件事:

  1. valid與ready不可過度依賴,比如valid不可以等待ready到達再拉高(為了防止死鎖TODO: 有沒有具體點的例子?説明後果),但是在axi協議中的握手信號,ready是可以等待valid拉高再拉高的,valid不可依賴ready的原因是防止死鎖(deadlock),本文的代碼他倆彼此可以互相獨立發出請求拉高;
  2. valid拉高時與有效數據同步,時鐘要對齊;(valid與有效數據拉高的時鐘要對齊,提高效率)
  3. 當數據計算好後,valid可以拉高等待ready拉高,但是每當握手成功之後,數據需要更新,如果此時沒有新的有效數據,valid要拉低。

 

通過一個Ready信號告訴自己前面的模塊暫停數據傳輸的方法被稱之為‘反壓’。

 

握手與反壓

當入口流量大於出口流量,這時候就需要反壓,或者,當後級未準備好時,如果本級進行數據傳遞,那麼它就需要反壓前級,所以此時前級需要將數據保持不動,直到握手成功才能更新數據。而反壓在多級流水線中就變得稍顯複雜,原因在於,比如我們採用三級流水設計,如果我們收到後級反壓信號,我們理所當然想反壓本級輸出信號的寄存器,但是如果只反壓最後一級寄存器,那麼會面臨一個問題,就是最後一級寄存器數據會被前兩級流水沖毀,導致數據丟失,引出數據安全問題,所以我們此時需要考慮反壓設計。

 

反壓

常用的反壓方法有三種:

  • 不帶存儲體的反壓

也就是後級反壓信號對本級模塊中所有流水寄存器都進行控制,由於不包含存儲體,為了保證數據安全性,後級反壓信號可以同時反壓本模塊中所有流水寄存器。

優點:節省面積資源

缺點:寄存器端口控制複雜

適用情況:流水線深度較大時

  • 帶存儲體的逐級反壓

如果流水級數不深,可以在每一需要握手交互模塊增加存儲體,原理上相當於,如果後級發出反壓信號,可以直接對本級流水線數據源頭進行反壓,其餘中間級不需控制,但後級需要包含RAM或FIFO等存儲體,可以接收流水,並需設置水線(water line),確定反壓時間,防止數據溢出,保證數據安全性。

優點:各級流水寄存器端口控制簡單

缺點:需要額外存儲體

適用情況:流水線深度較小,每一模塊都包含存儲體時

  • 帶存儲體的跨級反壓

很多時候在具體設計過程中,顆粒度劃分不精細,反壓這時候是對模塊而言,而不是説模塊內部有多少級流水。此外,並不是每一模塊都帶有存儲體。比如,其中可能a模塊沒有存儲體,b模塊沒有存儲體,但ab模塊內部還有多級流水,如果c模塊有存儲體,並且需要反壓前級模塊,這時候可以選擇反壓a模塊的源頭輸入數據,然後將ab的流水都存儲到帶有存儲體的c模塊,但是如果ab不是都沒有存儲體的話,就不應該跨級反壓,而應該逐級反壓,具體原因後續會講。

優點:控制簡單方便

缺點:需要額外存儲體,模塊間耦合度高

適用情況:某些模塊帶存儲體,某些模塊不帶存儲體時