9.3 DDR SDRAM 接口
DDR SDRAM 接口可以看作是上一節(jié)中所介紹的 SRAM 接口的一種擴(kuò)展。就像 SRAM 接口一樣,有兩條主要的總線,圖 9-9 說明了 DUA 和 SDRAM 之間的總線及其方向。由命令、地址和控制引腳(通常稱為 CAC)組成的第一條總線將使用以下標(biāo)準(zhǔn)方案:在存儲器時鐘的一個時鐘沿(或每個時鐘周期一次)處發(fā)送信息。雙向總線由 DQ(數(shù)據(jù)總線)和 DQS(數(shù)據(jù)選通脈沖)組成,DDR 接口的不同之處就在于雙向數(shù)據(jù)選通 DQS。DQS 選通脈沖可用于一組數(shù)據(jù)信號,這使得數(shù)據(jù)信號(每字節(jié)一個或每半字節(jié)一個)與選通脈沖的時序緊密匹配。如果時鐘是整個數(shù)據(jù)總線共用的時鐘,那么使用時鐘信號進(jìn)行這種緊密匹配可能不可行。雙向選通信號 DQS 可用于讀操作和寫操作,并且在選通脈沖的兩個邊沿(下降沿和上升沿,或稱雙倍數(shù)據(jù)速率)上都可捕獲數(shù)據(jù)。在 SDRAM 的讀模式期間,DQ 總線與數(shù)據(jù)選通引腳 DQS(而不是存儲器的時鐘引腳)同步,即 DQ 和 DQS 從 SDRAM 中被輸出時彼此是對齊的。而對于另一個方向,即當(dāng) DUA 發(fā)送數(shù)據(jù)時,DQS 將相移 90 度。請注意,數(shù)據(jù) DQ 和選通 DQS 的沿均來自 DUA 內(nèi)部的存儲器時鐘。
圖 9-9
如上所述,對于一組 DQ 信號(4 個或 8 個 bit)存在一個數(shù)據(jù)選通 DQS。這樣做是為了使 DQS 和 DQ 的所有 bit 之間的偏斜平衡(skew balancing)要求更容易滿足。例如,如果對于一個字節(jié)使用一個 DQS,則一組中只需平衡 9 個信號(8 個 DQ 和 1 個 DQS),這比平衡 72 位的數(shù)據(jù)總線和時鐘要容易得多。
上面的描述并不是對 DDR SDRAM 接口的完整說明,但足以說明這種接口的時序要求。
圖 9-10 顯示了典型 DDR SDRAM 接口中 CAC 總線(在 DUA 處)的 AC 特性。
圖 9-10
上述建立時間和保持時間的要求對應(yīng)到 CAC 總線上的接口約束如下所示:
create_generated_clock -name DDRCLK -source [get_pins UPLL0/CLKOUT] -divide_by 1 [get_ports DDRCLK]
set_output_delay -max 0.75 -clock DDRCLK [get_ports CAC]
set_output_delay -min -0.75 -clock DDRCLK [get_ports CAC]
在某些情況下,尤其是與無緩沖(unbuffered)存儲器模塊接口時,地址總線可能會比時鐘驅(qū)動更大的負(fù)載。在這種情況下,地址信號對存儲器的延遲要比時鐘信號大,并且這種延遲差異可能會導(dǎo)致 AC 特性不同于圖 9-10 中所示。
DQS 和 DQ 的對齊方式在讀周期和寫周期中有所不同,以下小節(jié)將對此進(jìn)行進(jìn)一步探討。
9.3.1 讀周期
在讀周期中,存儲器輸出的數(shù)據(jù)與 DQS 是邊沿對齊(edge-aligned)的,如圖 9-11 中波形所示。圖中的 DQ 和 DQS 代表存儲器引腳上的信號。數(shù)據(jù)(DQ)由存儲器在 DQS 的每個沿上發(fā)出,并且 DQ 改變數(shù)據(jù)的時刻也與 DQS 的下降沿和上升沿對齊。
圖 9-11
由于 DQS 選通信號和 DQ 數(shù)據(jù)信號彼此對齊,因此 DUA 內(nèi)部的存儲控制器(memory controller)通常使用 DLL(或其它替代方法來實現(xiàn)四分之一周期延遲)來延遲 DQS,從而使 DQS 的邊沿對齊于數(shù)據(jù)有效窗口的中心。
即使 DQ 和 DQS 在存儲器中彼此對齊,但 DQ 和 DQS 選通信號也可能無法再在 DUA 內(nèi)部的存儲控制器上對齊,這可能是由于 IO 緩沖器之間的延遲差以及 PCB 互連走線等因素所導(dǎo)致的。
圖 9-12 中為基本的數(shù)據(jù)讀取原理圖。上升沿觸發(fā)的觸發(fā)器在 DQS_DLL 的上升沿捕獲數(shù)據(jù) DQ,而下降沿觸發(fā)的觸發(fā)器在 DQS_DLL 的下降沿捕獲數(shù)據(jù) DQ。雖然圖中的 DQ 路徑上沒有 DLL,但某些設(shè)計可能在數(shù)據(jù)路徑上也會放置一個 DLL。這樣可以用來延遲信號(以解決由于 PVT 或互連走線長度或其它差異引起的變化),以便可以在數(shù)據(jù)有效窗口的中間準(zhǔn)確地采樣數(shù)據(jù)。
圖 9-12
為了對存儲控制器上的讀接口進(jìn)行約束,我們在 DQS 上定義了一個時鐘,并相對于該時鐘在數(shù)據(jù)上指定了輸入延遲。
- create_clock -period 5 -name DQS [get_ports DQS]
假定存儲器讀接口以 200MHz(當(dāng)在兩個時鐘沿上都傳輸數(shù)據(jù)時相當(dāng)于 400Mbps)的頻率進(jìn)行工作,這對應(yīng)于每 2.5ns 采樣一次 DQ 數(shù)據(jù)信號。由于數(shù)據(jù)是在兩個邊沿上捕獲的,因此需要為每個邊沿分別指定輸入約束。
set_input_delay 0.4 -max -clock DQS [get_ports DQ]
set_input_delay -0.4 -min -clock DQS [get_ports DQ]
set_input_delay 0.35 -max -clock DQS -clock_fall [get_ports DQ]
set_input_delay -0.35 -min -clock DQS -clock_fall [get_ports DQ]
set_multicycle_path 0 -setup -to UFF0/D
set_multicycle_path 0 -setup -to UFF5/D
輸入延遲命令指定了 DUA 引腳上 DQ 和 DQS 沿之間的延遲差,即使這兩個信號通常是從存儲器中同時輸出的,但由于不同存儲器的規(guī)格,在時序上仍會存在偏差。因此,DUA 內(nèi)的控制器設(shè)計應(yīng)考慮到兩個信號之間可能存在偏斜(skew)。以下是兩個觸發(fā)器建立時間檢查的路徑報告。假設(shè)捕獲觸發(fā)器的建立時間要求為 0.05ns、保持時間要求為 0.03ns,且 DLL 延遲設(shè)置為 1.25ns,即四分之一周期。
以下是保持時間檢查的路徑報告:
9.3.2 寫周期
在寫周期中,DQS 沿會與從 DUA 內(nèi)存儲控制器輸出的 DQ 信號相差四分之一周期,因此存儲器可以直接使用 DQS 選通脈沖去捕獲數(shù)據(jù)。
圖 9-13 顯示了存儲器引腳上所需的波形,在存儲器引腳處,DQS 信號必須與 DQ 數(shù)據(jù)窗口的中心對齊。請注意,仍然是由于 IO 緩沖器延遲不匹配或者 PCB 互連走線的變化,僅在存儲控制器(DUA 內(nèi)部)中對齊 DQ 和 DQS 還不足以使這些信號在 SDRAM 存儲器引腳處真正的對齊。因此,DUA 通常在寫周期中使用額外的 DLL 去進(jìn)行控制,以實現(xiàn) DQS 和 DQ 信號之間所需的四分之一周期偏移(offset)。
圖 9-13
如何約束此模式的輸出取決于控制器中時鐘的生成方式,接下去我們考慮兩種不同情況。
情況 1:內(nèi)部二倍頻時鐘
如果內(nèi)部時鐘是 DDR 時鐘頻率的兩倍,則輸出邏輯可以類似于圖 9-14 中所示。DLL 提供了一種必要時使 DQS 時鐘偏斜的機(jī)制,從而滿足存儲器引腳上的建立時間和保持時間要求。在某些情況下,可以不使用 DLL,而是使用負(fù)沿觸發(fā)的觸發(fā)器來獲得 90 度的偏移。
圖 9-14
對于圖 9-14 中所示情況,可以進(jìn)行如下輸出延遲約束:
create_clock -period 3 [get_ports CLK2X]
create_generated_clock -name pre_DQS -source CLK2X -divide_by 2 [get_pins UFF1/Q]
create_generated_clock -name DQS -source UFF1/Q -edges {1 2 3} -edge_shift {1.5 1.5 1.5} [get_ports DQS]
DQ 輸出引腳上的時序必須相對于衍生時鐘 DQS 進(jìn)行約束。
假設(shè) DDR SDRAM 的 DQ 和 DQS 引腳之間建立時間要求分別為 DQ 上升沿的 0.25ns 和下降沿的 0.4ns。類似地,假設(shè) DQ 引腳上升沿和下降沿的保持時間要求分別為 0.15ns 和 0.2ns。DQS 輸出上的 DLL 延遲已設(shè)置為四分之一周期,即 1.5ns,所有波形如下圖 9-15 所示:
圖 9-15
set_output_delay -clock DQS -max 0.25 -rise [get_ports DQ]
set_output_delay -clock DQS -max 0.4 -fall [get_ports DQ]
set_output_delay -clock DQS -min -0.15 -rise [get_ports DQ]
set_output_delay -clock DQS -min -0.2 -fall [get_ports DQ]
以下是通過輸出 DQ 路徑的建立時間檢查報告。建立時間檢查從 0ns 處發(fā)起 DQ 的 CLK2X 上升沿到 1.5ns 處的 DQS 上升沿進(jìn)行。
請注意,上述報告中的四分之一周期延遲出現(xiàn)在了時鐘 DQS 上升沿的第一行中,而不是在 DLL 實例 UDLL0 的那行中。這是因為 DLL 延遲已被建模為了衍生時鐘 DQS 定義的一部分,而不是 DLL 時序弧中的一部分。
以下是通過輸出 DQ 路徑的保持時間檢查報告。保持時間檢查從 3ns 處發(fā)起 DQ 的時鐘 CLK2X 上升沿到 1.5ns 處的 DQS 前一個上升沿。
情況 2:內(nèi)部一倍頻時鐘
當(dāng)內(nèi)部只有一倍頻時鐘可用時,輸出電路通??赡茴愃朴趫D 9-16 所示的電路。
圖 9-16
有兩個觸發(fā)器用于生成 DQ 數(shù)據(jù):第一個觸發(fā)器 NEGEDGE_REG 由時鐘 CLK1X 的負(fù)沿觸發(fā),而第二個觸發(fā)器 POSEDGE_REG 由時鐘 CLK1X 的正沿觸發(fā)。每個觸發(fā)器會鎖存適當(dāng)?shù)倪呇財?shù)據(jù),然后使用 CLK1X 作為多路復(fù)用器的選擇信號來多路復(fù)用該數(shù)據(jù):CLK1X 為高電平時,觸發(fā)器 NEGEDGE_REG 的輸出發(fā)送到 DQ;而當(dāng) CLK1X 為低電平時,觸發(fā)器 POSEDGE_REG 的輸出發(fā)送到 DQ。因此,數(shù)據(jù)會在時鐘 CLK1X 的兩個邊沿都到達(dá)輸出 DQ。請注意,每個觸發(fā)器都有半個周期將數(shù)據(jù)傳播到多路復(fù)用器的輸入端,以確保在由 CLK1X 邊沿選擇輸入數(shù)據(jù)之前,已在多路復(fù)用器的輸入端口上準(zhǔn)備好了輸入數(shù)據(jù)。相關(guān)波形如圖 9-17 所示。
圖 9-17
這種情況的輸出延遲約束如下:
create_clock -name CLK1X -period 6 [get_ports CLK1X]
create_generated_clock -name DQS -source CLK1X -edges {1 2 3} -edge_shift {1.5 1.5 1.5} [get_ports DQS]
set_output_delay -max 0.25 -clock DQS [get_ports DQ]
set_output_delay -max 0.3 -clock DQS -clock_fall [get_ports DQ]
set_output_delay -min -0.2 -clock DQS [get_ports DQ]
set_output_delay -min -0.27 -clock DQS -clock_fall [get_ports DQ]
建立時間和保持時間檢查可驗證從多路復(fù)用器到輸出的時序。建立時間檢查之一是從多路復(fù)用器輸入處的 CLK1X 上升沿(發(fā)起 NEGEDGE_REG 數(shù)據(jù))到 DQS 的上升沿。另一個建立時間檢查是從多路復(fù)用器輸入處的 CLK1X 下降沿(發(fā)起 POSEDGE_REG 數(shù)據(jù))到 DQS 的下降沿。同樣,保持時間檢查是從(與建立時間檢查)相同的 CLK1X 邊沿到 DQS 的前一個下降沿或上升沿。
以下是通過 DQ 端口的建立時間檢查報告,該檢查在(選擇輸出 NEGEDGE_REG 的)CLK1X 的上升沿和 DQS 的上升沿之間進(jìn)行。
這是通過 DQ 端口的另一個建立時間檢查報告,該檢查在(選擇輸出 POSEDGE_REG 的)CLK1X 的下降沿和 DQS 的下降沿之間進(jìn)行。
這是通過 DQ 端口的保持時間檢查報告,該檢查在 CLK1X 的上升沿和 DQS 的前一個下降沿之間進(jìn)行。
這是另一個通過 DQ 端口的保持時間檢查報告,該檢查在 CLK1X 的下降沿和 DQS 的前一個上升沿之間進(jìn)行。
盡管以上接口時序分析已忽略了任何負(fù)載對輸出的影響,但我們也可以指定額外的負(fù)載(使用 set_load 命令)來提高準(zhǔn)確性。STA 同樣可以通過電路仿真來補充,以實現(xiàn)可靠的 DRAM 時序。
DDR 接口的 DQ 和 DQS 信號通常在讀模式和寫模式下使用終端電阻 ODT(On-Die Termination),以減少由于 DRAM 和 DUA 處的阻抗不匹配而引起的任何反射(reflection)。在使用 ODT 的情況下,用于 STA 的時序模型將無法提供足夠的精度。設(shè)計人員可以使用另一種機(jī)制,例如詳盡的電路級仿真,來驗證信號完整性和 DRAM 接口的時序。
9.4 DAC 接口
考慮下圖 9-18 的一個典型 DAC 接口,其中高速時鐘將數(shù)據(jù)傳輸到 DAC 的低速時鐘接口。
圖 9-18
時鐘 DAC_CLK 是時鐘 XPLL_CLK 的 2 分頻,DAC 建立時間和保持時間檢查針對的是 DAC_CLK 的下降沿。
在這種情況下,即使可以根據(jù)需要將從快時鐘域到慢時鐘域的接口指定為多周期路徑,但也可以將建立時間視作單周期(XPLL_CLK)路徑。如圖 9-18 所示,XPLL_CLK 的上升沿發(fā)起數(shù)據(jù),而 DAC_CLK 的下降沿捕獲數(shù)據(jù)。以下是建立時間檢查的路徑報告:
請注意,該接口是從較快的時鐘域到較慢的時鐘域,因此如有必要,完全可以將其設(shè)置為兩周期路徑。
以下是保持時間檢查的路徑報告:
保持時間檢查是在建立時間捕獲沿之前一個周期完成的。在這種接口情況下,最關(guān)鍵的保持時間檢查是在發(fā)起沿和捕獲沿重合處執(zhí)行的,這在以上保持時間檢查的報告中可以看出。