Vì vậy, nó đã kết thúc rằng các lỗi đã giữ tôi trong nhiều ngày, là một phần của mã nên đánh giá để đánh giá sai để True. mã ban đầu của tôi đã đi một cái gì đó như:Sự khác biệt giữa Verilog! và ~?
if(~x && ~y) begin //do stuff end
ví dụ: Nếu x là KHÔNG MỘT và y là KHÔNG MỘT sau đó làm công cụ. Bước qua trình gỡ lỗi, tôi nhận ra ngay cả khi x là 1 biểu thức trong câu lệnh if vẫn dẫn đến TRUE và mã tiếp theo được thực thi.
Tuy nhiên, khi tôi thay đổi tuyên bố:
if(x == 0 && y == 0) begin
//do stuff
end
và cũng đã cố gắng:
if(!x && !y) begin
//do stuff
end
mã trong if-tuyên bố không được đánh giá đó là hành vi mong đợi. Tôi hiểu rằng ~ là một sự phủ nhận bitwise và! một phủ định hợp lý, nhưng không nên (~ x & & ~ y) và (! x & &! y) đánh giá điều tương tự? Tôi sợ codebase quá lớn, vì vậy tôi không thể dán nó ở đây, nhưng đây là thay đổi duy nhất tôi thực hiện để làm cho mã hoạt động như tôi dự định. Cảm ơn.
Để đáp lại, với một trong các ý kiến dưới đây, tôi đã tạo ra một thử nghiệm hợp cụ thể để kiểm tra hành vi này:
'10ns khoảng thời gian/1ns
mô-đun 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
Điều lạ lùng là, "Trường hợp đầu tiên thực hiện" được in để xác nhận hành vi ban đầu tôi quan sát.
đoán, nhưng không phủ định bitwise sẽ giống như '~ 0xAA = 0x55', v.s. '! 0xAA' là tương đương với" 0xAA không phải là 0, do đó đánh giá là đúng ". –
@Marc B Vâng, đó là một sự khác biệt quan trọng. Tuy nhiên trong trường hợp này, cả x và y dài 1 bit. Nếu x là "1", tôi mong đợi một sự phủ định bitwise ~ x là "0" .. – iab
Một chút dài? Thật lạ lùng. Bạn có thể thực hiện một dự án thử nghiệm để hiển thị các giá trị của 'x','! X', '~ x',' y', '! Y',' ~ y', và '(~ x && ~ y)' và '(! x &&! y)'? –