ई (सत्यापन भाषा)

From Vigyanwiki
e
ParadigmAspect-oriented
द्वारा डिज़ाइन किया गयाYoav Hollander
पहली प्रस्तुति1992 (1992)
Stable release
IEEE 1647-2016 / January 6, 2017; 7 years ago (2017-01-06)
फ़ाइल नाम एक्सटेंशनएस.e
वेबसाइटTWiki @ eda.org

ई, एक हार्डवेयर वेरीफिकेशन लैंग्वेज है जिसे अत्यधिक फ्लेक्सिबल और री-यूजेबल वेरीफिकेशन टेस्टबेंच को लागू करने के लिए तैयार किया गया है।

इतिहास

ई को पहली बार 1992 में इज़राइल में योव हॉलैंडर द्वारा अपने स्पेकमैन सॉफ़्टवेयर के लिए विकसित किया गया था। 1995 में उन्होंने सॉफ्टवेयर का व्यावसायीकरण करने के लिए एक कंपनी, इनस्पेक (बाद में इसका नाम परिवर्तन करके वेरिसीटी रखा गया) की स्थापना की। उत्पाद को 1996 डिज़ाइन ऑटोमेशन सम्मेलन में प्रस्तुत किया गया था।[1] वेरिसिटी को तब से कैडन्स डिजाइन सिस्टम द्वारा अधिग्रहित कर लिया गया है।

विशेषताएँ

ई की मुख्य विशेषताएं निम्नलिखित हैं:

  • रैन्डम और कन्स्ट्रैन्ड रैन्डम स्टिमुलस जनरेशन
  • फंक्शनल कवरेज मीट्रिक डेफनिशन और कवरेज
  • टेंपोरल लैंग्वेज जिसका उपयोग असर्शन लिखने के लिए किया जा सकता है।
  • रिफ्लेक्शन कैपबिलटी के साथ ऐस्पेक्ट-ऑरिएन्टेड प्रोग्रामिंग लैंग्वेज
  • लैंग्वेज डीयूटी-न्यूट्रल है जिसमें आप सिस्टमसी/सी++ मॉडल, आरटीएल मॉडल, गेट लेवल मॉडल, या यहां तक ​​कि हार्डवेयर ऐक्सेलरैशन बॉक्स में स्थित डीयूटी को सत्यापित करने के लिए सिंगल ई टेस्टबेंच का उपयोग कर सकते हैं। ई मेथडालजी के लिए यूवीएम एक्सेलेरेशन का उपयोग करता है।
  • अत्यधिक री-यूजेबल कोड बनाता हैं, विशेषतः जब टेस्टबेंच यूनिवर्सल वेरीफिकेशन मेथडालजी (यूवीएम) का पालन करते हुए लिखा गया हो
    • पूर्व में इसे ई री-यूजेबल मेथडालजी (ईआरएम) के रूप में जाना जाता था
    • यूवीएम ई लाइब्रेरी और डाक्यूमेन्टैशन यहां से डाउनलोड किया जा सकता है: यूवीएम वर्ल्ड

लैंग्वेज विशेषताएँ

ई लैंग्वेज एक ऐस्पेक्ट-ऑरिएन्टेड प्रोग्रामिंग (एओपी) उपागम का उपयोग करती है, जो फंक्शनल वेरीफिकेशन में आवश्यक आवश्यकताओं को विशेष रूप से संबोधित करने के लिए ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग उपागम का एक विस्तार है। एओपी उपयोगकर्ताओं को गैर-आक्रामक विधि से उपलब्ध कोड में अतिरिक्त फंगक्शनैलिटी को सरलता से जोड़ने की अनुमति देने वाली एक प्रमुख विशेषता है। यह सरल री-यूजेबल और कोड मैनटेनेंस की अनुमति देता है जो हार्डवेयर दुनिया में एक बड़ा लाभ है, जहां परियोजना जीवनचक्र के समय बाजार की मांगों को पूरा करने के लिए डिजाइनों में लगातार परिवर्तन किया जा रहा है। एओपी उपयोगकर्ताओं को फंगक्शनैलिटी जोड़ने के लिए किसी विशेष संरचना के विशिष्ट या सभी उदाहरणों का विस्तार करने की अनुमति देकर क्रॉस कटिंग चिंताओं को सरलता से संबोधित करता है। उपयोगकर्ता किसी विशेष सुविधा से संबंधित फंगक्शनैलिटी जोड़ने के लिए कई संरचनाओं का विस्तार कर सकते हैं और यदि चाहें तो एक्सटेंशन को एक फ़ाइल में बंडल कर सकते हैं, जिससे अधिक ऑर्गनाइज़्ड फ़ाइल पार्टिशनिंग प्रदान किया जा सकता है।

कमेन्ट

निष्पादन योग्य ई कोड, कोड-सेगमेंट मार्कर '<' तथा '>' के भीतर संलग्न होता है:

उदाहरण

Anything outside the markers is a comment
<'
extend sys {
  // This is a comment Verilog style
  -- This is a comment in VHDL style
  post_generate() is also {
    out("... and everything else within the markers is executable code.");
  };
};
'>

क्लासेस

ई के भी दो प्रकार के क्लास हैं:

  • डाइनैमिक क्लासेस को 'struct' (स्ट्रक्ट) कीवर्ड के साथ लेबल किया जाता है। "स्ट्रक्ट" का उपयोग डेटा निर्मित करने के लिए किया जाता है जो केवल अस्थायी रूप से उपलब्ध होता है और गारबेज कलेक्टर द्वारा क्लीन किया जा सकता है।
  • स्टेटिक क्लासेस को कीवर्ड 'unit' (यूनिट) के साथ लेबल किया जाता है। इकाइयों का उपयोग स्थायी टेस्टबेंच स्ट्रक्चर बनाने के लिए किया जाता है।

एक क्लास में, फ़ील्ड, मेथड, पोर्ट और कन्स्ट्रैन्ट हो सकते हैं। फ़ील्ड, इन्टिजर, रियल, एनम, स्ट्रिंग और यहां तक ​​कि कॉम्प्लेक्स ऑब्जेक्ट प्रकार के हो सकते हैं। कोड सेगमेंट ई रूट 'sys' के भीतर 'environment_u' नामक यूनिट को इनिशियलाइज़ करता हुआ दिखाता है। इस 'environment_u' क्लास में 5 packet_s ऑब्जेक्ट की एक सूची है और इस packet_s क्लास में दो फ़ील्ड और एक मेथड होता है।

उदाहरण

<'
// This is a dynamic class with two fields
struct packet_s {
  field0: uint (bits: 32);   // This field is called 'field0' and is a 
                            // 32 bit wide unsigned integer.
  field1: byte;             // This field is called 'field1' and is a byte.
  
  // This method is called once a packet_s object has been generated
  post_generate() is also { 
    out(field0);            // Printing the value of 'field0'
  };
};

// This is a static class with a list of five packet struct
unit environment_u {
  my_pkt[5]: list of packet_s;
};

// sys is the root for every e environment and instantiates the 'test_env' object
extend sys {
  test_env: environment_u is instance;
};
'>

रैंडमाइजेशन

ई में प्रत्येक फ़ील्ड डिफ़ॉल्ट रूप से रैन्डम होती है। फ़ील्ड रैंडमाइजेशन को हार्ड कन्स्ट्रैन्ट, सॉफ्ट कन्स्ट्रैन्ट द्वारा नियंत्रित किया जा सकता है या यहां तक ​​कि पूरी तरह से बंद भी किया जा सकता है। सॉफ्ट कन्स्ट्रैन्ट को डिफ़ॉल्ट कन्स्ट्रैन्ट के रूप में उपयोग किया जाता है, और यदि कोई कान्फ्लिक्ट होता है तो टेस्ट लेयर द्वारा स्वचालित रूप से ओवरराइड किया जा सकता है। अन्यथा यह एक रेगुलर कन्स्ट्रैन्ट की तरह व्यवहार करता है।

उदाहरण

<पूर्व> <' संरचना my_pkt_s {

 गंतव्य_पता: यूइंट (बिट्स: 48); // यह फ़ील्ड रैन्डम है और प्रतिबंधित नहीं है।
 data_payloadd: बाइट की सूची;
 !parity_fieldl: uint (बिट्स: 32); // '!' समता_फ़ील्ड को रैन्डम होने से रोकता है।
 
 [64..1500] में सॉफ्ट data_payload.size() रखें; // एक नरम बाधा, डिफ़ॉल्ट रैंडमाइजेशन प्रदान करने के लिए उपयोग किया जाता है
 data_payload.size() को [128..256] में नहीं रखें; // यह एक कठिन बाधा है

}; '> </पूर्व>

दावा

ई लौकिक अभिव्यक्तियों के साथ दावे का समर्थन करता है। एक अस्थायी अभिव्यक्ति का उपयोग फ़ील्ड और विधियों के समान वाक्यविन्यास स्तर पर किया जाता है और इस प्रकार प्रकृति द्वारा घोषणात्मक होता है। एक अस्थायी अभिव्यक्ति समयबद्ध व्यवहार का वर्णन करती है।

उदाहरण

<पूर्व> <' यूनिट टेम्पोरल_उदाहरण_यू {

 घटना ए; // एक घटना 'ए' घोषित करना
 घटना बी; // एक घटना 'बी' घोषित करना
 घटना सी; // एक घटना 'सी' घोषित करना
 
 // यह दावा उम्मीद करता है कि घटना के बाद अगला चक्र a
 // पता चला है कि इवेंट बी के बाद इवेंट सी होता है।
 उम्मीद है @a => {@b;@c}

}; '> </पूर्व>

कवरेज

ई उन कवरेज का समर्थन करता है जिन्हें उनके नमूना घटना के अनुसार समूहीकृत किया जाता है और उन समूहों को आंतरिक रूप से वस्तुओं के साथ संरचित किया जाता है। आइटम सरल आइटम या जटिल आइटम हो सकते हैं जैसे कि पार किए गए आइटम या संक्रमणकालीन आइटम।

उदाहरण

<पूर्व> यूनिट कवरेज_उदाहरण_यू {

 घटना cov_event_e; //कवरेज एकत्रित करना इस घटना से जुड़ा होगा
 कवर cov_event_e { है
   आइटम ए: यूइंट (बिट्स: 4); // इस आइटम में 0 से 15 तक 16 बकेट हैं
   आइटम बी: बूल; // इस आइटम में दो बकेट हैं: सत्य और असत्य
   क्रॉस ए, बी; // इस आइटम में ए और बी का क्रॉस गुणन मैट्रिक्स है
   ट्रांस बी; // यह आइटम आइटम बी से लिया गया है और इसमें चार बकेट हैं
                             // प्रत्येक सत्य-असत्य संयोजन को परिवर्तित करना
 };

}; </पूर्व>

संदेश एवं रिपोर्टिंग

ई के अंदर मैसेजिंग विभिन्न तरीकों से की जा सकती है।

उदाहरण

<पूर्व> इकाई संदेश_उदाहरण_यू {

 example_message_method() है {
   आउट (यह एक बिना शर्त, बिना स्वरूपित आउटपुट संदेश है। );
   आउटफ़ (यह HEX %x,15 में प्रदर्शित होने वाला एक बिना शर्त, स्वरूपित आउटपुट संदेश है);
   प्रिंट करें यह एक बिना शर्त संदेश है. ;
   संदेश (कम, यह एक सशर्त संदेश है, जो आमतौर पर एक संदेश लॉगर से जुड़ा होता है।)
                  आप इस तरह से स्ट्रिंग्स को भी जोड़ सकते हैं और यहां तक ​​कि ,me, जैसे ऑब्जेक्ट भी जोड़ सकते हैं।
                   इस आउटपुट में. );
   संदेशएफ (कम, यह सशर्त आउटपुट %x स्वरूपित है।,15);
 };

}; </पूर्व>

अन्य लैंग्वेजओं के साथ इंटरफेसिंग

एक ई टेस्टबेंच को आरटीएल या उच्च-स्तरीय मॉडल के साथ चलाए जाने की संभावना है। इसे ध्यान में रखते हुए, e VHDL, Verilog, C (प्रोग्रामिंग लैंग्वेज), C++ और SystemVerilog के साथ इंटरफेस करने में सक्षम है।

एक ई का उदाहरण <-> वेरिलॉग हुकअप

// This code is in a Verilog file tb_top.v
module testbench_top;
  reg a_clk;   
  always #5 a_clk = ~a_clk;
  initial begin
    a_clk = 0;
  end
endmodule

<पूर्व> यह कोड सिग्नल_मैप.ई फ़ाइल में है <' यूनिट सिग्नल_मैप_यू {

 // 'a_clk_p' नामक पोर्ट को परिभाषित करें
 a_clk_p: सरल_पोर्ट में बिट का उदाहरण है;
 // शीर्ष-स्तरीय टेस्टबेंच में 'a_clk' सिग्नल को इंगित करने के लिए पोर्ट की hdl_path प्रॉपर्टी सेट करें
 a_clk_p.hdl_path() == ~/testbench_top/a_clk रखें;

}; '> </पूर्व>

ई में पहलू-उन्मुख प्रोग्रामिंग समर्थन

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

उपप्रकार तंत्र

सबटाइपिंग इस बात का प्रमुख उदाहरण है कि पहलू-उन्मुख सुविधाओं के बिना ऑब्जेक्ट-ओरिएंटेड लैंग्वेजएं क्या हासिल नहीं कर सकती हैं। सबटाइपिंग एक वेरीफिकेशन इंजीनियर को आधार वर्ग से प्राप्त किए बिना पहले से परिभाषित/कार्यान्वित वर्ग में कार्यक्षमता जोड़ने की अनुमति देता है। निम्नलिखित कोड बेस-क्लास के मूल कार्यान्वयन को दिखाता है और इसे कैसे बढ़ाया जाता है। एक बार एक्सटेंशन हो जाने के बाद, सभी बेस-क्लास ऑब्जेक्ट में एक्सटेंशन भी शामिल हो जाते हैं। दो अलग-अलग उपप्रकारों में दी गई बाधाएं आमतौर पर विरोधाभास का कारण बनती हैं, हालांकि दोनों उपप्रकारों को अलग-अलग संभाला जाता है और इस प्रकार प्रत्येक उपप्रकार एक अलग बाधा गणना उत्पन्न करता है।

उपप्रकार तंत्र उदाहरण

<पूर्व> उपप्रकार_example.e <' // इस एनम प्रकार की परिलैंग्वेज का उपयोग उपप्रकार ODD और EVEN घोषित करने के लिए किया जाता है ctrl_field_type_t टाइप करें: [ODD, EVEN]; यूनिट बेस_एक्स_यू {

 // उपप्रकार_फ़ील्ड वह निर्धारक फ़ील्ड है जिस पर गणना लागू की जा रही है
 उपप्रकार_फ़ील्ड: ctrl_field_type_t;
 डेटा_वर्ड: यूइंट (बिट्स: 32);
 समता_बिट : बिट;
 
 // ODD प्रकार को उपटाइप करना
 जब ODD'subtype_field Base_ex_u {
   // यह एक साधारण बाधा है कि XOR डेटा_वर्ड के इंडेक्स बिट 0 को बढ़ाता है और उस मान को बढ़ाता है
   समता_बिट रखें == (डेटा_वर्ड[0:0] ^ डेटा_वर्ड[0:0] + 1);
 };
 //EVEN प्रकार को उपटाइप करना
 जब EVEN'subtype_field Base_ex_u {
   // यह बाधा उपरोक्त के समान है, हालाँकि वृद्धि नहीं की गई है
   समता_बिट रखें == (डेटा_वर्ड[0:0] ^ डेटा_वर्ड[0:0]);
 };

}; '> </पूर्व>

विस्तार के तरीके

मूल इकाई परिलैंग्वेज फ़ाइल1.ई. में दी गई है। इस उदाहरण में प्रयुक्त पहलू-उन्मुख तंत्र दिखाता है कि पहले से लागू विधि से पहले और बाद में कोड को कैसे निष्पादित किया जाए।

विधि विस्तार उदाहरण

<पूर्व> यह कोड file1.e में है <' इकाई aop_example_u {

 meth_ext() है {
   आउट (यह मूल विधि कार्यान्वयन है। );
 };

}; '> </पूर्व>

<पूर्व> यह कोड file2.e में है <' aop_example_u का विस्तार करें {

 meth_ext() पहला है {
   आउट (यह विधि विस्तार मूल विधि कार्यान्वयन से पहले निष्पादित किया जाता है। );
 };
 meth_ext() भी { है
   आउट (यह विधि विस्तार मूल विधि कार्यान्वयन के बाद निष्पादित किया जाता है। );
 };

}; '> </पूर्व>

संदर्भ

  1. Samir Palnitkar: Design verification with e, Prentice Hall PTR. October 5, 2003. ISBN 978-0-13-141309-2


स्रोत

श्रेणी:हार्डवेयर वेरीफिकेशन लैंग्वेजएँ