Verilog: posedgeに先に1が入る

ckに同期してsignalが来るとして

always @(posedge ck or posedge signal) begin
    ID <= signal ? 1'b1 : 1'b0;
end

このようなコードでは、signalの立ち上がり時にはIDに1がノンブロッキング代入され、しかもsignalの立ち下がり時にもIDに1がノンブロッキング代入される。posedgeの後に来るものは、立ち上がり時に早くも1が代入されていると見ていい。立ち下がり時にIDに0をノンブロッキング代入させたいなら、

always @(posedge ck or signal) begin
    ID <= signal ? 1'b1 : 1'b0;
end

とすることでsignalの変化を常に捉えればよい。

コメント

  1. 確かに論理はあっていると思うが、ckに同期してsignalが来るなら
    普通はこう書くのが定石。
    always @(posedge ck or negedge ck) begin
    ID <= signal ? 1'b1 : 1'b0;
    end

    返信削除
  2. その場合、signalの代入が1クロックずれませんか。

    返信削除

コメントを投稿