そのため、何日も私を悩ませていたバグは、False に評価されて True に評価されるはずだったコードのセクションであることが判明しました。私の最初のコードは次のようになりました:
if(~x && ~y) begin
//do stuff
end
つまり、x が NOT ONE で y が NOT ONE の場合は処理を行います。デバッガーをステップ実行すると、x が 1 であるにもかかわらず、if ステートメントの式が TRUE になり、後続のコードが実行されることに気付きました。
ただし、ステートメントを次のように変更すると:
if(x == 0 && y == 0) begin
//do stuff
end
また、試しました:
if(!x && !y) begin
//do stuff
end
if ステートメント内のコードは評価されませんでしたが、これは予期された動作でした。~ はビットごとの否定であり、 ! 論理否定ですが、(~x && ~y) と (!x && !y) は同じものに評価されるべきではありませんか? 残念ながら、コードベースが大きすぎるため、ここに貼り付けることはできませんが、コードを意図したとおりに動作させるために行った変更はこれだけです。ありがとう。
以下のコメントの 1 つに対応して、この動作をテストするテスト ケースを作成しました。
`timescale 10ns/1ns
module test_negation();
integer x, y;
initial begin
x = 1; y = 0;
if(~x && ~y) begin
$display("%s", "First case executed");
end
if(!x && !y) begin
$display("%s", "Second case executed");
end
if(x == 0 && y == 0) begin
$display("%s", "Third case executed");
end
end endmodule
そして不思議なことに、私が観察した元の動作を確認するために、「最初に実行されたケース」が出力されます。