補足 - FPGAの合成結果によってハザードが出る例

[] [] []


同じRTL記述でも、FPGAの合成結果によってハザードが出たり出なかったりする例を示す。

次のクリア(c)とイネーブル(e)付きのレジスタを考える。

always @(posedge clk or posedge rst) begin

  if(rst)

    r <= 1'd0;

  else if(c)

    r <= 1'd0;

  else if(e)

    r <= a;

end

◇◇

D端子とCE端子があるFFを使って合成されると次図のようにcに対して分岐・合流する回路になるので、経路間の遅延差によってはハザードが出る。したがってcが非同期だとハザードをサンプリングしてしまう。

具体的に言うと、RTL記述上は、a=1,e=0,r=0のときはcの値に関わらずr=0が保持されるはず。しかし実際の回路では、cの立下りで、CE=(e | c)が立下り、D=(a & ~c)が立ち上がるので、DよりCEが遅れると一瞬CE=D=1(ハザード)が出る。

◇◇◇

D端子しかないFFを使って合成されると、cに対して分岐・合流がない回路になるので、ハザードは出ない。


[] [] []