2015-01-19 5 views
5

के संदर्भ में क्यों पास नहीं कर सकते हैं स्थिर और स्वचालित कार्यों के बीच क्या अंतर है।स्वत: और स्थिर कार्य के बीच क्या अंतर है, हम एक स्थिर कार्य

program class_ref; 
    int index,value; 

class holding_values; 
    int ass_array[*]; 
    task assign_value (int value,int index); 
     ass_array[index] = value; 
    endtask 

    function void disp(int index); 
     $display("%t %M:ASSOSIATIVA VALUE%d ",$time,ass_array[index]); 
    endfunction 

endclass 

initial begin 
    holding_values obc; 
    index =5; 
    value =88; 
    obc = new(); 
    map(obc,value); 
    obc.disp(index); 
end 


task map(ref holding_values obc,ref int value); 
    value +=5; 
    obc.assign_value(value,index); 
    obc =null; 
endtask 

endprogram 

अगर यह कोड निष्पादित होने पर यह त्रुटि

संदर्भ तर्क दे देंगे स्थिर कार्य-समारोह घोषणा

यदि कार्य "मानचित्र" स्वत: कार्यक्रम के लिए किया जाता है के अंदर अवैध है रन।

हमें कार्य को स्वचालित करने की आवश्यकता क्यों है? स्थिर और स्वचालित कार्यों के बीच क्या अंतर है?

उत्तर

9

स्थिर कार्य के लिए, एक ही कार्य के एकाधिक आमंत्रण समान स्थानीय चर का संदर्भ देंगे। स्वचालित कार्य के लिए, स्थानीय चर कार्य के प्रत्येक आमंत्रण के लिए अद्वितीय होंगे।

इसका मतलब यह है कि निम्न कार्य के लिए:

task some_task(); 
    int foo = 5; 
    // ... 
endtask 

अगर हम इसे परिभाषित स्थिर, तो सभी आमंत्रण देखेंगे के लिए एक ही मूल्य foo (यानी foo उन दोनों के बीच साझा किया जाएगा) । इसका मतलब है कि एक धागे में मूल्य बदलने से अन्य सभी भी बदलाव देख सकेंगे।

हम some_task परिभाषित करने के लिए थे, तो() स्वचालित, तो प्रत्येक मंगलाचरण foo, दूसरों के लिए पूरी तरह से स्वतंत्र के अपने खुद के स्थानीय प्रतिलिपि होगा। एक थ्रेड में foo बदलना दूसरों में कोई प्रभाव नहीं पड़ेगा।

+0

यदि कार्य स्थैतिक है तो एक ही कार्य के कई आमंत्रण पहले से बुलाए गए कार्य को मार देंगे, इसलिए कार्यों के बीच चर का कोई साझाकरण नहीं है। @ ट्यूडर –

+0

@ अक्षयपतिल मुझे ऐसा नहीं लगता है। यदि कार्य स्थैतिक है, तो एक ही कार्य के कई आमंत्रण पिछले कॉल को मार नहीं पाएंगे। यहां उदाहरण: http://www.edaplayground.com/x/8VC – AldoT

6

मुझे लगता है कि यह भी ध्यान देने योग्य है कि में सिस्टम-verilog हर काम/समारोह एक मॉड्यूल/कार्यक्रम में परिभाषित या स्टैंडअलोन डिफ़ॉल्ट स्थिर कर रहा है के लायक है, लेकिन अगर एक वर्ग में परिभाषित डिफ़ॉल्ट रूप से स्वचालित है (किसी अन्य के रूप में प्रोग्रामिंग भाषा)। मुझे लगता है कि इसका कारण यह है कि Verilog एक "सामान्य भाषा" नहीं है लेकिन एक मॉड्यूल में always ब्लॉक परिभाषा स्थिर है।

function add(); 
    int i; 
    i++; 
    $display("i=%0d", i); 

endfunction 


module try; 


    initial begin 
     add(); 
     add(); 
     $finish; 
    end 
endmodule 

उत्पादन:

i=1 
i=2 
$finish called from file "try.sv", line 15 
+1

कुछ [कुछ विक्रेताओं] को ध्यान देने योग्य भी है (http://www.xilinx.com/support/answers/51533.html) भाषा विनिर्देश को अनदेखा करते हैं और मान लें कि सबकुछ स्वचालित है। – Chiggs

0

कोई भी संबोधित प्रश्न के "कारण है कि हम एक स्थिर कार्य के संदर्भ द्वारा पारित नहीं हो सकता" भाग। एलआरएम एक 'क्यों' प्रदान नहीं करता है जहां तक ​​मैं कह सकता हूं, लेकिन मैं अनुमान लगा सकता हूं और एक और सवाल पूछ सकता हूं।

अनुमान: कचरा संग्रह जारी है। स्थैतिक कार्यों के संदर्भ पारित करके, आप असल में, उन्हें हमेशा के लिए जीवित रखा है। एलआरएम का कहना है कि यदि कार्य के बाहर एक सरणी हटा दी जाती है, तो यदि सरणी का एक तत्व कार्य के संदर्भ में पारित किया गया था, तो उस तत्व को जीवित रखा जाना चाहिए। सरणी हटा दिए जाने के बाद भी यह शेष सिमुलेशन के लिए दृश्यमान नहीं होगा। आउट-ऑफ-मेमोरी त्रुटियों में तेज़ी से चलाने के लिए यह एक दिलचस्प तरीका होगा।

प्रश्न: क्या यह संभव है कि स्थैतिक कार्यों के तर्कों में स्थिर जीवनकाल हो?यदि ऐसा है, तो किसी ऑब्जेक्ट को संदर्भित हैंडल पॉइंटर के साथ अन्य ऑब्जेक्ट पर ओवरराइट किया जा सकता है यदि कार्य को एक अलग तर्क मान के साथ फिर से बुलाया गया हो?

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