Tak więc skończyło się, że błąd, który utrzymywał mnie przez kilka dni, był fragmentem kodu, który powinien być oceniony jako Fałszywy, gdy oceniany jest jako Prawdziwy. Mój początkowy kod poszedł coś takiego:Jaka jest różnica między Verilog! i ~?
if(~x && ~y) begin //do stuff end
tj Jeśli x nie jest jeden, a Y nie jest jednym następnie zrobić rzeczy. Przechodząc przez debugger, zdałem sobie sprawę, mimo że x było 1, wyrażenie w instrukcji if nadal miało wartość TRUE, a kolejny kod został wykonany.
Jednak, kiedy zmienił oświadczenie:
if(x == 0 && y == 0) begin
//do stuff
end
a także próbowałem:
if(!x && !y) begin
//do stuff
end
kod w if-oświadczenie nie zostało ocenione, co było oczekiwane zachowanie. Rozumiem, że ~ to bitowa negacja i! logiczna negacja, ale nie powinna (~ x& ~ y) i (! x & &! y) ocenić na to samo? Obawiam się, że baza kodów jest zbyt duża, więc nie mogę jej tutaj wkleić, ale była to jedyna zmiana, którą wprowadziłem, aby kod zadziałał zgodnie z zamierzeniami. Dzięki.
W odpowiedzi na jeden z poniższych uwag, jakie stworzył przypadek testowy, aby przetestować ten problem:
`10ns skali czasowej/1ns
moduł 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 o dziwo, „Pierwszy przypadek stracony” jest drukowany w celu potwierdzenia oryginalne zachowanie zaobserwowałem.
zgadywanie, ale nie bitowa negacja byłaby podobna do '~ 0xAA = 0x55', v.s. '! 0xAA' będący odpowiednikiem" 0xAA nie jest równe zeru, więc sprawdź na true ". –
@Marc B Tak, to ważna różnica. Jednak w tym przypadku zarówno x, jak i y są 1 bitowe. Jeśli x jest "1", spodziewałbym się, że bitowa negacja ~ x będzie "0" .. – iab
Jeden trochę długo? Jakie dziwne. Czy możesz stworzyć projekt testowy wyświetlający wartości 'x','! X', '~ x',' y', '! Y',' ~ y' i '(~ x && ~ y)' oraz '(! x &&! y)'? –