Quindi è finito che il bug che mi aveva tenuto acceso per giorni, era una sezione di codice che avrebbe dovuto valutare False valutando True. Il mio codice iniziale andato qualcosa di simile:Qual è la differenza tra Verilog! e ~?
if(~x && ~y) begin //do stuff end
vale a dire se x non è uno e Y non è uno poi fare cose. Passando attraverso il debugger, mi sono reso conto anche se x era 1 l'espressione nell'istruzione if risultava ancora in TRUE e il codice successivo veniva eseguito.
Tuttavia, quando ho cambiato la dichiarazione:
if(x == 0 && y == 0) begin
//do stuff
end
e anche provato:
if(!x && !y) begin
//do stuff
end
il codice all'interno del se-dichiarazione non è stato valutato che è stato il comportamento previsto. Capisco che ~ è una negazione per bit e! una negazione logica, ma non dovrebbe (~ x & & ~ y) e (! x & &! y) valutare la stessa cosa? Temo che il codebase sia troppo grande, quindi non posso incollarlo qui, ma questa è stata l'unica modifica che ho apportato per far funzionare il codice come volevo. Grazie.
In risposta, ad uno dei commenti qui sotto, ho creato un test-case per verificare questo comportamento:
`scala cronologica 10ns/1ns
modulo 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
e stranamente, "Primo caso eseguito" viene stampato per confermare il comportamento originale ho osservato.
indovinando, ma la negazione bit a bit non sarebbe qualcosa come '~ 0xAA = 0x55', v.s. '! 0xAA' è l'equivalente di" 0xAA non è zero, quindi valuta true ". –
@Marc B Sì, questa è una differenza importante. Tuttavia, in questo caso, sia x che y sono lunghi 1 bit. Se x è "1", mi aspetterei che una negazione bit per bit ~ x sia "0" .. – iab
Un po 'lungo? Che strano. Puoi fare un progetto di prova per visualizzare i valori di 'x','! X', '~ x',' y', '! Y',' ~ y', e '(~ x && ~ y)' e '(! x &&! y)'? –