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