तो यह समाप्त हो गया कि जिस बग ने मुझे दिनों तक रखा था, वह कोड का एक वर्ग था जिसने गलत मूल्यांकन करने के लिए गलत मूल्यांकन किया था। मेरे प्रारंभिक कोड की तरह कुछ चला गया:वेरिलोग के बीच क्या अंतर है! और ~?
if(~x && ~y) begin //do stuff end
अर्थात यदि x एक नहीं है और y एक तो चीजें करते नहीं है। डीबगर के माध्यम से कदम उठाने के बाद, मुझे एहसास हुआ कि एक्स 1 कथन में अभिव्यक्ति 1 था, फिर भी सत्य में परिणाम हुआ और बाद वाला कोड निष्पादित किया गया।
हालांकि, जब मैं करने के लिए बयान बदल दिया है:
if(x == 0 && y == 0) begin
//do stuff
end
और भी करने की कोशिश की:
if(!x && !y) begin
//do stuff
end
अगर-कथन में कोड का मूल्यांकन नहीं किया गया, जिसमें अपेक्षित व्यवहार था। मैं समझता हूं कि ~ थोड़ा सा नकारात्मक है और! एक तार्किक अस्वीकृति, लेकिन नहीं (~ x & & ~ y) और (! x & &! y) एक ही चीज़ का मूल्यांकन? मुझे डर है कि कोडबेस बहुत बड़ा है, इसलिए मैं इसे यहां पेस्ट नहीं कर सकता, लेकिन यह एकमात्र बदलाव था जिसे मैंने कोड बनाने के लिए बनाया था जैसा कि मैंने इरादा किया था। धन्यवाद।
जवाब में, नीचे टिप्पणी से एक के लिए, मैं एक परीक्षण मामला बनाया है इस व्यवहार का परीक्षण करने के:
`timescale 10ns/1ns
मॉड्यूल 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
और अजीब पर्याप्त, "सबसे पहले मामले निष्पादित" मूल व्यवहार मैंने देखा पुष्टि करने के लिए मुद्रित है।
अनुमान लगाना, लेकिन थोड़ा सा अस्वीकरण नहीं होगा '~ 0xAA = 0x55', vs.s. '0xAA' बराबर है" 0xAA शून्य नहीं है, इसलिए सत्य का मूल्यांकन करें "। –
@Marc बी हाँ, यह एक महत्वपूर्ण अंतर है। हालांकि इस मामले में, एक्स और वाई दोनों 1 बिट लंबा हैं। यदि एक्स "1" है, तो मुझे थोड़ा सा नकारात्मकता ~ x "0" होने की उम्मीद होगी .. – iab
एक बिट लंबा? कितना अजीब। क्या आप 'x','! X', '~ x',' y', '! Y',' ~ y', और '(~ x && ~ y)' के मान प्रदर्शित करने के लिए एक परीक्षण प्रोजेक्ट बना सकते हैं। '(! x &&! y)'? –