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

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

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

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

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

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

उदाहरण
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; }; '>

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

उदाहरण
<' struct my_pkt_s { destination_address: uint (bits: 48);  // this field is randomized and is not constrained. data_payload      : list of byte; !parity_field     : uint (bits: 32);   // '!' prevents the parity_field from being randomized. keep soft data_payload.size in [64..1500]; // a soft constraint, used to provide a default randomization keep data_payload.size not in [128..256];  // this is a hard constraint }; '>

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

उदाहरण
<' unit temporal_example_u { event a;  // declaring an event 'a'  event b;   // declaring an event 'b'  event c;   // declaring an event 'c'  // This assertion expects that the next cycle after event a  // has been detected that event b followed by event c occurs. expect @a => {@b;@c} }; '>

कवरेज
ई, उन कवरेज का समर्थन करता है जिन्हें उनके सैंपल ईवेंट के अनुसार समूहीकृत किया जाता है और उन समूहों को आंतरिक रूप से आइटमों के साथ संरचित किया जाता है। आइटम सरल आइटम या कॉम्प्लेक्स आइटम हो सकते हैं जैसे कि क्रॉसड आइटम या ट्रांज़िशनल आइटम।

उदाहरण
unit coverage_example_u { event cov_event_e;  // collecting coverage will be tied to this event

cover cov_event_e is { item a: uint (bits: 4);   // this item has 16 buckets from 0 to 15 item b: bool;            // this item has two buckets: TRUE and FALSE cross a, b;              // this item contains a cross multiplication matrix of a and b    trans b;                  // this item is derived of item b and has four buckets // transitioning each TRUE - FALSE combination }; };

मेसेजींग एवं रिपोर्टिंग
ई के भीतर मैसेजिंग विभिन्न विधियों से की जा सकती है।

उदाहरण
unit message_example_u { example_message_method is { out("This is an unconditional, unformatted output message."); outf("This is an unconditional, formatted output message displaying in HEX %x",15); print "This is an unconditional message."; message( LOW, "This is a conditional message, usually tied to a message logger. ",                 "You can also concatenate strings like this and even add objects like ",me,                  " in this output." ); messagef( LOW, "This conditional output is formatted %x.",15 ); }; };

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

ई का एक उदाहरण <-> वेरिलॉग हुकअप
This code is in a signal_map.e file <' unit signal_map_u { // Define a port named 'a_clk_p' a_clk_p: in simple_port of bit is instance; // Set the port's hdl_path property to point to the 'a_clk' signal in the top-level testbench keep a_clk_p.hdl_path == "~/testbench_top/a_clk"; }; '>

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

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

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

उपप्रकार तंत्र उदाहरण
subtyping_example.e <' // This enum type definition is used to declare the subtypes ODD and EVEN type ctrl_field_type_t: [ODD, EVEN]; unit base_ex_u { // The subtype_field is the determinant field which calculation is being applied subtype_field: ctrl_field_type_t; data_word   : uint (bits: 32); parity_bit  : bit; // Subtyping the ODD type when ODD'subtype_field base_ex_u { // This is a simple constraint that XORs the index bit 0 of data_word and increments that value keep parity_bit == (data_word[0:0] ^ data_word[0:0] + 1); };

// Subtyping the EVEN type when EVEN'subtype_field base_ex_u { // This constraint is the same as above, however the increment is not done keep parity_bit == (data_word[0:0] ^ data_word[0:0]); }; }; '>

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

मेथड इक्स्टेन्शन उदाहरण
This code is in file1.e <' unit aop_example_u { meth_ext is { out("This is the original method implementation."); }; }; '>

This code is in file2.e <' extend aop_example_u { meth_ext is first { out("This method extension is executed before the original method implementation."); };

meth_ext is also { out("This method extension is executed after the original method implementation."); }; }; '>

संदर्भ

 * The e Hardware Verification Language, Sasan Iman and Sunita Joshi, Springer, May 28, 2004
 * Aspect-Oriented Programming with the e Verification Language, David Robinson, 2007

स्रोत

 * ई लैंग्वेज ब्लॉग (टीम स्पेकमैन)
 * http://www.depchip.com/items/0488-05.html (ई लैंग्वेज के साथ उनके अनुभवों पर उपयोगकर्ताओं से अच्छी प्रतिक्रिया)
 * http://www.cadence.com/products/functional_ver/specman_elite/index.aspx
 * http://www.us.design-reuse.com/articles/article5646.html
 * जेनिक बर्जरॉन: राइटिंग टेस्टबेंच: एचडीएल मॉडल्स का कार्यात्मक वेरीफिकेशन, दूसरा संस्करण, क्लूवर एकेडमिक पब्लिशर्स, 2003, ISBN 1-4020-7401-8
 * https://web.archive.org/web/20070405162901/http://amiq.ro/eparser.html
 * http://www.thinkverification.com/
 * http://www.dvteclipse.com/help.html?documentation/e/index.html

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