DAG

DAG ( Data Address Generator )はDSPのオペランド・アドレスを生成するハードウェアです。連続的に畳み込み演算を行うDSPは、1サイクルで2オペランドのロードができなければ性能を発揮できません。したがって、DAGは二つのデータ・ストリームを高速にロードできるよう設計されています。

ADSP-2191は二つのDAGを持っています。それぞれのDAGはDAG1、DAG2と名づけられ、1サイクル毎にデータ・アドレスを生成することができます。DAG1、DAG2は専用のレジスタ・セットを持っています(下図)。DAGはPM/DMいずれのバスに対してもアドレスを供給することができます。しかし、これは単一データの転送に限った話であり、デュアル・ロードあるいはデュアル・ストア命令を実行するときにはDAG1はDM、DAG2はPMバスに対してしかアドレスを供給できません。

DAG関連レジスタ

デュアル・ロードにせよ、デュアル・ストアにせよDAGが1サイクルに二つアドレスを生成できるという事実と、実際に二つのデータを1サイクルで転送できるかどうかは別の話であることに気をつけてください。ADSP-2191にはデュアル・データ転送をストールさせる二つの種類の衝突があります。

ブロック衝突( Block Conflict )は、二つのバスが同じメモリー・ブロックにアクセスする場合に生じます。例えば、PM/DMの両バスを使ってブロック2からデータをロードすると、二つのアクセスは直列化されるため、必ず2サイクルかかるようになります。ブロック衝突の解決は簡単でデュアル・データ転送の対象となる変数を異なるブロックになるよう配置してやります。

シーケンサーの命令フェッチと同時にPMバスによる転送を行うと必ずバス衝突( Bus Conflict )がおきます。バス衝突が起きると命令フェッチは待たされ、データ転送が優先されます。この衝突は必ず起きるためにハードウェア側に解決策が用意されています。バス衝突を避けるためにはCACTLレジスタのCPEビットを1にしてキャッシュをオンにしてください。ADSP-2191のシーケンサーはバス衝突が起きたアドレスの命令をキャッシュしておき、次回衝突時には命令フェッチを待たす代わりにキャッシュから供給します。従って、ループの中でバス衝突によるストールが発生するのは1度だけです。

ブロック衝突は、デュアル・データ転送だけでなくDMデータ転送を命令フェッチと同じブロックから行っても生じます。この場合もCACTLレジスタのCDEビットを1にしてキャッシュをオンにしてくださいおくことで、次回同じ衝突が起きた場合にキャッシュが問題を解決してくれます。

2191空挺団 | プログラム | EZ-KIT | こぼれ話 | アーキテクチャー | 命令 | レジスタ | DSP掲示板 | FAQ |