SDRAM 周りのACタイミングですが、どうもよくわからないので、適当に回路を組んでその結果を見る事にしました。
FPGA → SDRAM への出力 に関しては、SD_CLK に対して、ばらつかなければ問題はありません。
結果の一部です。
+--------------------------------------------------------------------------------+
; Clock to Output Times ;
+------------------+------------+--------+--------+------------+-----------------+
; Data Port ; Clock Port ; Rise ; Fall ; Clock Edge ; Clock Reference ;
+------------------+------------+--------+--------+------------+-----------------+
; DRAM_CLK ; CLK50M1 ; 2.027 ; ; Rise ; CLK100M ;
; DRAM_A[*] ; CLK50M1 ; 2.617 ; 2.472 ; Fall ; CLK100M ;
; DRAM_A[0] ; CLK50M1 ; 2.598 ; 2.453 ; Fall ; CLK100M ;
; DRAM_A[1] ; CLK50M1 ; 2.617 ; 2.472 ; Fall ; CLK100M ;
; DRAM_A[2] ; CLK50M1 ; 2.617 ; 2.472 ; Fall ; CLK100M ;
; DRAM_A[3] ; CLK50M1 ; 2.597 ; 2.452 ; Fall ; CLK100M ;
; DRAM_A[4] ; CLK50M1 ; 2.617 ; 2.472 ; Fall ; CLK100M ;
; DRAM_A[5] ; CLK50M1 ; 2.587 ; 2.442 ; Fall ; CLK100M ;
; DRAM_A[6] ; CLK50M1 ; 2.606 ; 2.461 ; Fall ; CLK100M ;
; DRAM_A[7] ; CLK50M1 ; 2.616 ; 2.471 ; Fall ; CLK100M ;
; DRAM_A[10] ; CLK50M1 ; 2.617 ; 2.472 ; Fall ; CLK100M ;
; DRAM_CAS_N ; CLK50M1 ; 2.577 ; 2.432 ; Fall ; CLK100M ;
; DRAM_CKE ; CLK50M1 ; 2.943 ; 2.633 ; Fall ; CLK100M ;
; DRAM_CLK ; CLK50M1 ; ; 1.899 ; Fall ; CLK100M ;
; DRAM_CS_N ; CLK50M1 ; 2.568 ; 2.423 ; Fall ; CLK100M ;
; DRAM_D[*] ; CLK50M1 ; 4.599 ; 4.234 ; Fall ; CLK100M ;
; DRAM_D[0] ; CLK50M1 ; 2.579 ; 2.434 ; Fall ; CLK100M ;
; DRAM_D[1] ; CLK50M1 ; 2.577 ; 2.432 ; Fall ; CLK100M ;
; DRAM_D[2] ; CLK50M1 ; 2.587 ; 2.442 ; Fall ; CLK100M ;
; DRAM_D[3] ; CLK50M1 ; 4.599 ; 4.234 ; Fall ; CLK100M ;
; DRAM_D[4] ; CLK50M1 ; 2.577 ; 2.432 ; Fall ; CLK100M ;
; DRAM_D[5] ; CLK50M1 ; 2.577 ; 2.432 ; Fall ; CLK100M ;
; DRAM_D[6] ; CLK50M1 ; 2.597 ; 2.452 ; Fall ; CLK100M ;
; DRAM_D[7] ; CLK50M1 ; 2.577 ; 2.432 ; Fall ; CLK100M ;
; DRAM_D[8] ; CLK50M1 ; 2.598 ; 2.453 ; Fall ; CLK100M ;
; DRAM_D[9] ; CLK50M1 ; 2.598 ; 2.453 ; Fall ; CLK100M ;
; DRAM_D[10] ; CLK50M1 ; 2.599 ; 2.454 ; Fall ; CLK100M ;
; DRAM_D[11] ; CLK50M1 ; 2.588 ; 2.443 ; Fall ; CLK100M ;
; DRAM_D[12] ; CLK50M1 ; 2.589 ; 2.444 ; Fall ; CLK100M ;
; DRAM_D[13] ; CLK50M1 ; 2.599 ; 2.454 ; Fall ; CLK100M ;
; DRAM_D[14] ; CLK50M1 ; 2.579 ; 2.434 ; Fall ; CLK100M ;
; DRAM_D[15] ; CLK50M1 ; 2.577 ; 2.432 ; Fall ; CLK100M ;
; DRAM_LDQM ; CLK50M1 ; 4.195 ; 4.363 ; Fall ; CLK100M ;
; DRAM_RAS_N ; CLK50M1 ; 2.578 ; 2.433 ; Fall ; CLK100M ;
; DRAM_UDQM ; CLK50M1 ; 4.257 ; 4.440 ; Fall ; CLK100M ;
; DRAM_WE_N ; CLK50M1 ; 4.600 ; 4.235 ; Fall ; CLK100M ;
なぜか、DRAM_D のビット3と、DRAM_LDQM、DRAM_WE_N だけが、2ns 程度遅れています。
タイミング制約も与えているのですが、全然効いていないようです。
SDRAM の入力側のセットアップ時間に対してぎりぎりなのですが、一応満たしているのでOKとしました。
問題になりそうなら、全体的に2ns 程度早く出力する事にします。
SDRAM → FPGA の方ですが、
遅延する方向に最悪の値 = FPGA→SDRAMへのクロックの配線遅延(1ns) + SDRAMの出力遅延値(6ns)+ SDRAM → FPGA の配線遅延(1ns)
遅延しない方向の最良の値 = SDRAM のデータホールド値(2.5ns)
上記の遅延を考慮すると、取り込むクロックは、通常のクロックより90度遅れた(2.5ns)クロックで取り込めばよさそうです。
それを考慮して、〜.sdc を直してレイアウトした結果の一部です。
+----------------------------------------------------------------------------------------------------------------+
; Slow 1200mV 85C Model Setup: 'CLK100M_DI' ;
+-------+-----------+----------------------+--------------+-------------+--------------+------------+------------+
; Slack ; From Node ; To Node ; Launch Clock ; Latch Clock ; Relationship ; Clock Skew ; Data Delay ;
+-------+-----------+----------------------+--------------+-------------+--------------+------------+------------+
; 1.041 ; DRAM_D[6] ; SDRAM:U_SDRAM|q_i[6] ; SDRAM_CLK ; CLK100M_DI ; 12.500 ; -2.033 ; 1.138 ;
; 1.051 ; DRAM_D[2] ; SDRAM:U_SDRAM|q_i[2] ; SDRAM_CLK ; CLK100M_DI ; 12.500 ; -2.033 ; 1.128 ;
; 1.060 ; DRAM_D[3] ; SDRAM:U_SDRAM|q_i[3] ; SDRAM_CLK ; CLK100M_DI ; 12.500 ; -2.034 ; 1.118 ;
; 1.061 ; DRAM_D[4] ; SDRAM:U_SDRAM|q_i[4] ; SDRAM_CLK ; CLK100M_DI ; 12.500 ; -2.033 ; 1.118 ;
; 1.061 ; DRAM_D[7] ; SDRAM:U_SDRAM|q_i[7] ; SDRAM_CLK ; CLK100M_DI ; 12.500 ; -2.033 ; 1.118 ;
; 1.061 ; DRAM_D[1] ; SDRAM:U_SDRAM|q_i[1] ; SDRAM_CLK ; CLK100M_DI ; 12.500 ; -2.033 ; 1.118 ;
; 1.061 ; DRAM_D[5] ; SDRAM:U_SDRAM|q_i[5] ; SDRAM_CLK ; CLK100M_DI ; 12.500 ; -2.033 ; 1.118 ;
; 1.063 ; DRAM_D[0] ; SDRAM:U_SDRAM|q_i[0] ; SDRAM_CLK ; CLK100M_DI ; 12.500 ; -2.031 ; 1.118 ;
+-------+-----------+----------------------+--------------+-------------+--------------+------------+------------+
+----------------------------------------------------------------------------------------------------------------+
; Slow 1200mV 85C Model Hold: 'CLK100M_DI' ;
+-------+-----------+----------------------+--------------+-------------+--------------+------------+------------+
; Slack ; From Node ; To Node ; Launch Clock ; Latch Clock ; Relationship ; Clock Skew ; Data Delay ;
+-------+-----------+----------------------+--------------+-------------+--------------+------------+------------+
; 2.353 ; DRAM_D[0] ; SDRAM:U_SDRAM|q_i[0] ; SDRAM_CLK ; CLK100M_DI ; 2.500 ; -1.753 ; 0.852 ;
; 2.355 ; DRAM_D[4] ; SDRAM:U_SDRAM|q_i[4] ; SDRAM_CLK ; CLK100M_DI ; 2.500 ; -1.755 ; 0.852 ;
; 2.355 ; DRAM_D[7] ; SDRAM:U_SDRAM|q_i[7] ; SDRAM_CLK ; CLK100M_DI ; 2.500 ; -1.755 ; 0.852 ;
; 2.355 ; DRAM_D[1] ; SDRAM:U_SDRAM|q_i[1] ; SDRAM_CLK ; CLK100M_DI ; 2.500 ; -1.755 ; 0.852 ;
; 2.355 ; DRAM_D[3] ; SDRAM:U_SDRAM|q_i[3] ; SDRAM_CLK ; CLK100M_DI ; 2.500 ; -1.755 ; 0.852 ;
; 2.355 ; DRAM_D[5] ; SDRAM:U_SDRAM|q_i[5] ; SDRAM_CLK ; CLK100M_DI ; 2.500 ; -1.755 ; 0.852 ;
; 2.365 ; DRAM_D[2] ; SDRAM:U_SDRAM|q_i[2] ; SDRAM_CLK ; CLK100M_DI ; 2.500 ; -1.755 ; 0.862 ;
; 2.375 ; DRAM_D[6] ; SDRAM:U_SDRAM|q_i[6] ; SDRAM_CLK ; CLK100M_DI ; 2.500 ; -1.755 ; 0.872 ;
+-------+-----------+----------------------+--------------+-------------+--------------+------------+------------+
数字的にOKなので、とりあえずこれでよしとしました。
ちなみに使用した〜.sdc はこれです。
sdc ファイル