非同期確認
動くかどうかは別として、非同期によるLEのロスを確認する。
現在は以下のクロックドメイン間でAvalonインターコネクトが接続されている。
- プロセッサ・オンチップメモリ(160MHz)⇔SDRAMコントローラ(120MHz)
- プロセッサ・オンチップメモリ⇔IOペリフェラル(10MHz)
- プロセッサ・オンチップメモリ⇔terasic製IP(50MHz)
今回はSDRAMとプロセッサ間の接続を変化させてP&Rを行ってみる。
SDRAMコントローラをプロセッサクロックにつなぐか、SDRAMクロックにつなぐかで制御する。
実際にはSDRAMの動作限界を超えるので動作しないが、切り替えるポイントが1点なのでこちらを繋ぎかえることにした。
プロセッサとSDRAMコントローラが別クロック(Clock Crossing Adapter Type:Auto)
- Total logic elements 5,079 / 22,320 ( 23 % )
- Total combinational functions 3,684 / 22,320 ( 17 % )
- Dedicated logic registers 3,641 / 22,320 ( 16 % )
- Total registers 3710
- Total memory bits 412,672 / 608,256 ( 68 % )
プロセッサとSDRAMコントローラが別クロック(Clock Crossing Adapter Type:Handshake)
- Total logic elements 5,078 / 22,320 ( 23 % )
- Total combinational functions 3,693 / 22,320 ( 17 % )
- Dedicated logic registers 3,643 / 22,320 ( 16 % )
- Total registers 3712
- Total memory bits 412,672 / 608,256 ( 68 % )
プロセッサとSDRAMコントローラが別クロック(Clock Crossing Adapter Type:FIFO)
- Total logic elements 9,813 / 22,320 ( 44 % )
- Total combinational functions 6,590 / 22,320 ( 30 % )
- Dedicated logic registers 7,800 / 22,320 ( 35 % )
- Total registers 7869
- Total memory bits 412,672 / 608,256 ( 68 % )
プロセッサとSDRAMコントローラが同じクロック(Clock Crossing Adapter Type:Auto)
- Total logic elements 4,644 / 22,320 ( 21 % )
- Total combinational functions 3,551 / 22,320 ( 16 % )
- Dedicated logic registers 3,118 / 22,320 ( 14 % )
- Total registers 3187
- Total memory bits 412,672 / 608,256 ( 68 % )
プロセッサとSDRAMコントローラが同じクロック(Clock Crossing Adapter Type:Handshake)
- Total logic elements 4,670 / 22,320 ( 21 % )
- Total combinational functions 3,548 / 22,320 ( 16 % )
- Dedicated logic registers 3,126 / 22,320 ( 14 % )
- Total registers 3195
- Total memory bits 412,672 / 608,256 ( 68 % )
プロセッサとSDRAMコントローラが同じクロック(Clock Crossing Adapter Type:FIFO)
- Total logic elements 7,996 / 22,320 ( 36 % )
- Total combinational functions 5,624 / 22,320 ( 25 % )
- Dedicated logic registers 5,995 / 22,320 ( 27 % )
- Total registers 6064
- Total memory bits 412,672 / 608,256 ( 68 % )
P&Rはヒューリスティックな方式で行っているようで、Total memory bits以外のリソース数は同じ条件でも±10個ぐらいの変動があった。
アルゴリズムのシード値を固定して、同じ入力なら同じ結果になるような方法がXilinxではあった気がするが、Alteraは不明。
わかったことは、以下の通り。
- Autoは負荷に応じてアルゴリズムを決める設定らしい、今回は全部Handshakeと判断された様子(FIFOが要るようなバースト転送するマスタが居ないから?)
- FIFOのメモリはメモリブロックではなくLEのFFで行っている様子
- Handshakeタイプは概算で400LE程度消費
- FIFOタイプは概算で1800LE程度消費
- FIFOは明らかに実装として重い
これを踏まえて、以下の改変を行う。
以下は追加で確認が必要。