2008/09/02(火)[ROBO][HDL] SH7144 I/F回路検証

Verilog検証, SH I/F部

XSTのシミュレーションで holdtime timing violationが出る

検証用Test moduleをつくり,シミュレーションエラー*1が出ていたので,実装ミスかなと思い,放置していました.
放置しっぱなしでほかのことに手を出していたので少し復帰.試行錯誤してみたり,よくよく問題の文を読むと,どうやらtest moduleからの信号を受けて,hold timeが足りないといっているようです.非同期回路なのだから,不定値が乗ってもおかしくないですね・・・.

ということで,外部入力を全てDFF2段で受けた信号を用いることにしました.なんかおきてから直そうと思っていたら早速あたっていたわけですね.
ところが,コレを修正しても変わらない.不定値が伝播してシミュレーション結果が悲惨なことになっています.

検索しても結構ハズレばかりで,XSTのマニュアル(xst.pdf)や制約ガイド(cgd.pdf)もあわせて探しました.これらのマニュアル,非常に有用です.最初から見ておかないと駄目ですね.ボリュームが多くて手を出す気がおきないのも事実ですが.

さておき,制約ガイドのほうに,以下の属性が記載されていました.

ASYNC_REG

 ASYNC_REG は、タイミング制約で、
シミュレーションで非同期クロックをソースとしたデータの
ビヘイビアを向上します。特に、タイミング シミュレーション中に
X が適用されないようにします。
 タイミング違反があった場合、不定値は出力されず、
 それ以前の値が出力で保持されます。

使用例
 ▼Verilog-2001の属性として記述
  (* ASYNC_REG = "{TRUE|FALSE}" *) ; 

 ▼Constraints Fileにて記述
 INST instance_name ASYNC_REG = {TRUE|FALSE};

そのものずばり.該当する初段の DFF相当のreg宣言に対して属性をつけました.

  (* ASYNC_REG = "TRUE" *) reg [15:0] ADR_D ; 

Verilogの attribute宣言については,LRM 2.8のあたりを参照ください.

シミュレーションを実施したところ,不定値はなくなり,DFFがもう一段入ったような挙動になりました.1クロックだけ信号の変化が遅れるためです.実際の回路でも,前の値を保持する側に倒れた場合には,このような動作になるので,これでも動くような設計が必要となりますね...


制御信号全てdelay. WR strobe検出でさらに 1clock必要. → 信号類全てdelayさせて, 立ち上がり検出時にとりこむ.ホスト側が 立ち上がり~ほかの信号変化が1clock未満であることが条件.


IOBのDFFを使う

入力信号をそのまま記憶させれば,IOBのDFFを使うように合成されるようです.入力信号を組み合わせ回路に入れるような場合は,一度IOBから出てしまう模様.外部信号が同期を取って入ってくるようであれば,IOBで同タイミングで受けたほうが気持ちよいでしょう.
2段のDFFを通った後で加工しましょう.

*1 : setpup/hold timing violation