2013-05-07 37 views
10

तो यह समाप्त हो गया कि जिस बग ने मुझे दिनों तक रखा था, वह कोड का एक वर्ग था जिसने गलत मूल्यांकन करने के लिए गलत मूल्यांकन किया था। मेरे प्रारंभिक कोड की तरह कुछ चला गया:वेरिलोग के बीच क्या अंतर है! और ~?

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 

और अजीब पर्याप्त, "सबसे पहले मामले निष्पादित" मूल व्यवहार मैंने देखा पुष्टि करने के लिए मुद्रित है।

+0

अनुमान लगाना, लेकिन थोड़ा सा अस्वीकरण नहीं होगा '~ 0xAA = 0x55', vs.s. '0xAA' बराबर है" 0xAA शून्य नहीं है, इसलिए सत्य का मूल्यांकन करें "। –

+0

@Marc बी हाँ, यह एक महत्वपूर्ण अंतर है। हालांकि इस मामले में, एक्स और वाई दोनों 1 बिट लंबा हैं। यदि एक्स "1" है, तो मुझे थोड़ा सा नकारात्मकता ~ x "0" होने की उम्मीद होगी .. – iab

+0

एक बिट लंबा? कितना अजीब। क्या आप 'x','! X', '~ x',' y', '! Y',' ~ y', और '(~ x && ~ y)' के मान प्रदर्शित करने के लिए एक परीक्षण प्रोजेक्ट बना सकते हैं। '(! x &&! y)'? –

उत्तर

13

! प्रतीक बूलियन या तार्किक अस्वीकृति का प्रतिनिधित्व करता है। शून्य के अलावा x के किसी भी मूल्य के लिए, !x शून्य या गलत का मूल्यांकन करता है, और जब x शून्य है, !x एक या सत्य का मूल्यांकन करता है।

~ प्रतीक बिटवाईयर अस्वीकृति का प्रतिनिधित्व करता है। मान में प्रत्येक बिट टॉगल किया जाता है, इसलिए 16-बिट x == 0xA5A5, ~x के लिए 0x5A5A का मूल्यांकन किया जाएगा।

if() सशर्त उम्मीद है कि एक अभिव्यक्ति जो वास्तविक या गलत का मूल्यांकन करती है, जहां कुछ भी nonzero (सकारात्मक या नकारात्मक) सत्य है, और शून्य गलत है।

&& एक तार्किक और है। यह दो अभिव्यक्तियों को लेता है, एक या सत्य का मूल्यांकन करता है यदि केवल और दोनों अभिव्यक्ति सत्य हैं। दोबारा, "सत्य" का मतलब nonzero, सकारात्मक या नकारात्मक है।

यह सब देखते हुए, हम देख सकते हैं कि केवल समय ~x और !x एक ही मूल्य का मूल्यांकन जब x == -1 है, या, यदि x, अहस्ताक्षरित है जब x == MAX_UNSIGNED

+0

मैंने मूल पोस्ट में एक टेस्ट प्रोजेक्ट जोड़ा है। वही व्यवहार मनाया जाता है! – iab

+0

डिफ़ॉल्ट पूर्णांक कितने बिट्स चौड़ा है? ~ 1 == 0xFFFE, और ~ 0 == 0xFFFF, ताकि उदाहरण समझ में आता है। –

+1

दुर्भाग्य से यह इससे कहीं अधिक जटिल है (मुझे लगता है कि किसी ने अभी आपके उत्तर पर क्लिक किया है)। '!' की आपकी व्याख्या गलत है - परिणाम 3-राज्य ('1',' 0', 'x') है, और'! X' भी 'x' है। पैरा 2 में, यह तय करना अक्सर मुश्किल होता है कि एक चर कितना व्यापक है, जिससे आश्चर्य हो सकता है। पैरा 3 के लिए, आपको 'x' खाते को ध्यान में रखना होगा। पैरा 4 के लिए, 'सत्य' की आपकी परिभाषा गलत है - इसे गैर-शून्य और ज्ञात होना चाहिए। और इसी तरह। – EML

2

~ एक बिट-वार ऑपरेटर है और तर्क की उलटा लौटाता है।

! एक लॉजिकल ऑपरेटर है और एक बिट देता है।

उदाहरण:

reg [7:0] bit_wise, logic_op; 
initial begin 
    bit_wise = ~8'hA1; // bit_wise == 8'h6E 
    logic_op = !8'hA1; // logic_op == 8'b00 
    $display("bit_wise:%h logic_op:%h", bit_wise, logic_op); // bit_wise:5e logic_op:00 
end 

अपने उदाहरण के लिए:

if(~x && ~y) begin 
    //do stuff 
end 

प्रभावी रूप से एक ही है के रूप में:

if(x!='1 && y!='1) begin // '1 means the with of x all 1s and the with of y all 1s 
    //do stuff 
end 

आम तौर पर सबसे अच्छा कोडन शैली बयान करता है, तो अंदर तार्किक ऑपरेटरों का उपयोग करने के लिए है । डेटा असाइनमेंट मैनिपुलेशन के साथ केवल बिट-वार ऑपरेटरों का उपयोग करें।

+0

एफवाईआई - '1' वाक्यविन्यास वैध Verilog वाक्यविन्यास मान्य नहीं है। यह निर्माण SystemVerilog में पेश किया गया था। – dwikle

+0

'x' और' y' की चौड़ाई को नहीं जानते, मैंने SystemVeilog वाक्यविन्यास का उपयोग करने का निर्णय लिया और एक नोट रखा कि '1' का उद्देश्य क्या है। आईईईई स्टडी 1800-2009 की रिहाई के बाद, वेरिलोग और सिस्टम वेरिलोग एक और एक ही हैं । (सार में उल्लेख किया गया है, शायद कोई और बेहतर उद्धरण पा सकता है।) – Greg

+0

यदि कथन में ~ का उपयोग बहुत स्पष्ट नहीं है। मैं हमेशा तुलना के साथ ~ उपयोग करेंगे। इसके अलावा मेरे सिम्युलेटर को नहीं लगता कि वेरिलोग और सिस्टम वेरिलोग एक ही बात है। सिस्टमिलिलोग से पहले वेरिलोग का उपयोग अक्सर 1995 या 2001 के चश्मे के संदर्भ में किया जाता है, यह पुराने उपकरणों का उपयोग करने वालों के लिए एक बड़ा अंतर बनाता है। – Morgan

4

मैं देखता हूं। उपरोक्त कोड में चर "x" एक Verilog पूर्णांक था (integer x;)। हालांकि, पूर्णांक चर का प्रतिनिधित्व Verilog द्वारा 32-बिट पूर्णांक संख्या के रूप में किया जाता है। तो हालांकि एक्स मैंने "1" जैसा देखा था, ~ x का परिणाम "0" नहीं होगा, लेकिन "11111111111111111111111111111110" में! और इसलिए यह कोई आश्चर्य की बात नहीं है कि पहला मामला निष्पादित किया गया था। मेरी गलती। सारे सवालों के जवाब देने के लिए धन्यवाद।

+0

अच्छा सवाल है, और आप स्वयं को सही जवाब प्राप्त करने में कामयाब रहे। – EML

+0

खुशी है कि आपने इसे काम किया है। सबक क्लासिक वेरिलोग में 'रेग' और 'वायर' प्रकारों का उपयोग करना है, या आधुनिक वेरिलोग में 'बिट' और 'लॉजिक' प्रकारों का उपयोग करना है, और अपने संकेतों को उचित रूप से आकार देना है। (चेतावनी दी, उन प्रकार के बराबर नहीं हैं) –

संबंधित मुद्दे