2013-03-12 5 views
12

से स्ट्रिंग कैसे बनाएं मेरे पास प्रीप्रोसेसर मैक्रो है जो मेरे डिज़ाइन में पदानुक्रमित पथ का प्रतिनिधित्व करता है।प्री-प्रोसेसर मैक्रो

उदाहरण:

`define HPATH top.chip.block 

मैं एक स्ट्रिंग जो, `HPATH का मूल्य रखता है तो मेरे उदाहरण में स्ट्रिंग top.chip.block के बराबर होना चाहिए का निर्माण करने की जरूरत है।

क्या ऐसी स्ट्रिंग बनाने का कोई तरीका है? निम्नलिखित प्रयासों की

कोई भी काम किया:

string hpath; 
hpath = "`HPATH";  // Results in hpath = "`HPATH" 
hpath = \"``HPATH\"; // Doesn't compile 
hpath = `HPATH;  // Doesn't compile 

मैं hpath इस असाइनमेंट hpath = "top.chip.block" कर के बराबर होना चाहता हूँ, लेकिन `HPATH का उपयोग कर के बजाय पथ फिर से निर्दिष्ट करने के द्वारा।

मैं %m का उपयोग नहीं कर सकता क्योंकि मुझे मॉड्यूल के भीतर नहीं, मेरे शीर्ष-स्तर के यूवीएम वातावरण में स्ट्रिंग की आवश्यकता है।

थोड़ा और पृष्ठभूमि: कारण मैं ऐसा करना चाहता हूं क्योंकि मैं यूवीएम कक्षा पुस्तकालय में बैकडोर रजिस्टर पहुंच का उपयोग कर रहा हूं। बैकडोर एपीआई को एक स्ट्रिंग के रूप में डिज़ाइन के भीतर ब्लॉक में hdl_path सेट करने की आवश्यकता होती है। मेरे पास पहले से ही पदानुक्रमित पथों के लिए परिभाषित किया गया है और hdl_paths निर्दिष्ट करते समय उनको पुन: उपयोग करने का प्रयास कर रहा हूं, इसलिए मेरे पास एक ही पथ को दो बार परिभाषित नहीं किया गया है। मेरा testbench दोनों पदानुक्रमित पथ और स्ट्रिंग पथ का उपयोग करेगा।

+0

क्या आप एक बार तुम्हारे पास है स्ट्रिंग के साथ क्या करना योजना बनाई है? क्या '% एम' विनिर्देशक आपकी मदद करेगा? – toolic

+0

@toolic - मैंने कुछ और विवरण के साथ प्रश्न अपडेट किया।मुझे एक स्ट्रिंग (यूवीएम बैकडोर रेग एक्सेस के लिए) और एक पदानुक्रमित पथ (कुछ अन्य कार्यों के लिए) के रूप में पथ की आवश्यकता है। मॉड्यूल के बाहर एक दायरे में पथ की आवश्यकता होने के बाद से '% m' मदद नहीं करेगा। – dwikle

उत्तर

18

एक स्ट्रिंग अक्षर के भीतर 'परिभाषित मैक्रो' का उपयोग करना संभव नहीं है। सिस्टम वेरिलोग एलआरएम के मुताबिक:

मैक्रो प्रतिस्थापन और तर्क प्रतिस्थापन स्ट्रिंग अक्षर के भीतर नहीं होगा।

हालांकि एक स्ट्रिंग शाब्दिक एक ऐसा मैक्रो तर्क लेता का उपयोग कर और `` का उपयोग कर "` करके मैक्रो का उद्धरण शामिल करके निर्माण किया जा सकता

फिर, LRM से:।

एक "सामान्य शब्दावली अर्थ को ओवरराइड करता है" और इंगित करता है कि विस्तार में चिह्न, वास्तविक तर्कों का प्रतिस्थापन, और एम्बेडेड मैक्रोज़ के विस्तार शामिल होंगे। इससे स्ट्रिंग अक्षर मैक्रो तर्कों से निर्मित हो सकते हैं।

तो यह काम करता है:

`define STRINGIFY(x) `"x`" 
`define HPATH top.chip.block 
string hpath = `STRINGIFY(`HPATH); 
$display(hpath);      // Output: "top.chip.block" 

उदाहरण कोड यहाँ चलाया जा सकता है: http://www.edaplayground.com/s/4/879

1

मुझे लगता है कि यह वही है जो आप खोज रहे हैं।

`define HPATH `"top.chip.block`" 
string hpath = `HPATH; 

रूप toolic ने कहा, एस्केप अनुक्रम% मीटर आप वर्तमान पदानुक्रम जब एक $ प्रदर्शन बयान में प्रयोग किया जाता है, ताकि एक बेहतर विकल्प हो सकता दे देंगे।

+0

बिल्कुल नहीं - मुझे अभी भी कुछ अन्य संदर्भों में पदानुक्रमित संदर्भ के रूप में '\' HPATH' का उपयोग करने की आवश्यकता है, इसलिए बस स्ट्रिंग के रूप में मैक्रोज़ को परिभाषित करना काम नहीं करेगा। – dwikle

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