2013-01-21 11 views
5

क्या किसी फ़ंक्शन या कार्य में इंटरफ़ेस पास करने का कोई संश्लेषित तरीका है? मेरा उपयोग केस निम्न है: मेरे पास कई फ़ंक्शंस वाला पैकेज है (हालांकि मैं उन्हें कार्यों में परिवर्तित कर सकता हूं, अगर इससे मदद मिलती है :)), जिनमें से सभी मॉड्यूल में उपयोग किए जा सकते हैं और मॉड्यूल के बंदरगाहों तक पहुंचने की आवश्यकता हो सकती है। अब, आमतौर पर मैं सभी पोर्ट्स को interface में समूहित करता हूं, इसे मॉड्यूल में जोड़ता हूं, और इसे virtual फ़ंक्शन में पास करता हूं। हालांकि, मेरे संश्लेषण उपकरण के मैनुअल का उल्लेख है कि virtual समर्थित नहीं है।सिस्टम वेरिलोग: कार्यों/कार्यों (संश्लेषण के लिए) में इंटरफेस पास करना

क्या मुझे कुछ याद आ रही है? संश्लेषण के लिए कार्यों को बंदरगाहों को प्रदान करने का एक तरीका होना चाहिए, वीएचडीएल के signal तर्कों के समान?

कुछ उदाहरण कोड:

module mymod (
    input logic clk, 
    input logic rst, 
    input uint16_t adr, 
    input bit cyc, 
    input uint32_t dat_m, 
    input bit stb, 
    input bit we, 
    output bit ack, 
    output uint32_t dat_s 
    ); 

    always_comb begin 
     mypack::do_something(a, b, c, adr, cyc, dat_m, stb, we, ack, dat_s); 
endmodule 

आदर्श रूप में, काम mypack::do_something, बंदरगाहों के रूप में पोर्ट का उपयोग करने के लिए अर्थात उन पर परिवर्तन के लिए प्रतीक्षा करें, उन्हें मान लिखते हैं, आदि में सक्षम हो जाएगा; मूल रूप से, वही है जिसे आप signal तर्कों के रूप में पास करके VHDL में प्राप्त करेंगे (variable या constant तर्कों के विपरीत)।

+0

क्या आप कुछ कोड पोस्ट कर सकते हैं? –

उत्तर

2

आम तौर पर आप इंटरफ़ेस परिभाषा में किसी इंटरफ़ेस-विशिष्ट फ़ंक्शंस की घोषणा करेंगे। इस तरह किसी भी कार्य या फ़ंक्शन घोषणाओं में पहले से ही इंटरफ़ेस पोर्ट्स का दायरा है।

interface int1(ports...); 
    function func1(args...); 
    // Do stuff with ports and args 
    endfunction 
endinterface 

module mod1(input wire clk,interface intf); 
... 
    always @(posedge clk) 
    intf.func1(module_specific_data); 
... 
endmodule 
+0

विचार के लिए धन्यवाद। हालांकि, मेरे मामले में यह कार्य मॉड्यूल-विशिष्ट व्यवहार लागू करता है जो मॉड्यूल के कुछ बंदरगाहों का उपयोग करने के लिए होता है। यह अजीब संकेत इस तथ्य के कारण है कि कोड स्वचालित रूप से जेनरेट किया गया है और इस प्रश्न के बाहर कारणों के लिए कार्यों/संकुल का उपयोग करता है;)। – rainer

2

दुर्भाग्यवश ऐसा लगता है कि एक इंटरफ़ेस वर्चुअल होना चाहिए, हालांकि कोई कार्य या कार्य पोर्ट सूची हो।

सिस्टम वेरिलोग आईईईई स्टडी 1800-2009 का कहना है कि एक फ़ंक्शन पोर्ट सूची डेटा_टाइप होना चाहिए। फ़ंक्शन घोषित करने के वाक्यविन्यास के लिए खंड 13.4, अनुलग्नक ए.2.6, और सिंटेक्स 13-2 देखें। और डेटा_ टाइप को परिभाषित करने के लिए ए.2.2.1 देखें। मैंने आईईईई स्टडी 1800-2005 को भी चेक किया है और ऐसा लगता है कि यह भी एक ही प्रतिबंध है, बस स्पष्ट रूप से वर्तनी नहीं है। 1800-2005 की धारा 12.3 और अनुलग्नक ए देखें।

आप एक इंटरफेस का उपयोग करना चाहते हैं, इंटरफ़ेस में एक अनुवाद समारोह का उपयोग कर एक struct (packed आवश्यकता हो सकती है, को देखने के IEEE Std 1800-2009 धारा 13.4, # 12 फुटनोट) बनाने की कोशिश:

interface myif (/* ... */); 
/* signal list */ 
function mypack::var_list_s toStruct(); 
    /* make translation */ 
endfunction : toStruct 
endinterface : myif 

module mymod(myif my_if); 
always_comb 
    mypack::do_something(my_if.toStruct(), my_if.ack, my_if.dat_s); 
endmodule : mymod 

वैकल्पिक रूप से आप हमेशा क्लासिक `include "myports" कर सकते हैं जहां कभी भी आवश्यक विधि हो।

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