補足 - 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に対して分岐・合流がない回路になるので、ハザードは出ない。