IEEE 1647 2011
$150.42
IEEE Standard for the Functional Verification Language e
Published By | Publication Date | Number of Pages |
IEEE | 2011 | 495 |
Revision Standard – Active. The e functional verification language is an application-specific programming language, aimed at automating the task of verifying a hardware or software design with respect to its specification. Verification environments written in e provide a model of the environment in which the design is expected to function, including the kinds of erroneous conditions the design needs to withstand. A typical verification environment is capable of generating user-controlled test inputs with statistically interesting characteristics. Such an environment can check the validity of the design responses. Functional coverage metrics are used to control the verification effort and gauge the quality of the design. e verification environments can be used throughout the design cycle, from a high-level architectural model to a fully realized system. A definition of the e language syntax and semantics and how tool developers and verification engineers should use them are contained in this standard.
PDF Catalog
PDF Pages | PDF Title |
---|---|
1 | IEEE Std 1647-2011 Front cover |
3 | Title page |
6 | Introduction |
7 | Notice to users Laws and regulations Copyrights Updating of IEEE documents |
8 | Errata Interpretations Patents |
9 | Participants |
11 | Contents |
17 | Important notice 1. Overview 1.1 Scope 1.2 Purpose 1.3 Verification environments |
19 | 1.4 Basic concepts relating to this standard |
24 | 1.5 Conventions used |
26 | 1.6 Use of color in this standard 1.7 Contents of this standard |
29 | 2. Normative references 3. Definitions, acronyms, and abbreviations 3.1 Definitions |
31 | 3.2 Acronyms and abbreviations |
33 | 4. e basics 4.1 Lexical conventions |
40 | 4.2 Syntactic elements |
46 | 4.3 Struct hierarchy and name resolution |
52 | 4.4 Ranges 4.5 Operator precedence |
53 | 4.6 Evaluation order of expressions |
54 | 4.7 Bitwise operators |
56 | 4.8 Boolean operators |
58 | 4.9 Arithmetic operators |
59 | 4.10 Comparison operators |
63 | 4.11 String matching |
65 | 4.12 Extraction and concatenation operators |
69 | 4.13 Scalar modifiers |
70 | 4.14 Parentheses 4.15 list.method() |
71 | 4.16 Special-purpose operators |
75 | 5. Data types 5.1 e data types |
81 | 5.2 Untyped expressions 5.3 Assignment rules |
84 | 5.4 Real data type |
87 | 5.5 Precision rules for numeric operations |
89 | 5.6 Automatic type casting |
90 | 5.7 Defining and extending scalar types |
92 | 5.8 Type-related constructs |
99 | 6. Structs, subtypes, and fields 6.1 Structs overview |
100 | 6.2 Defining structs: struct |
101 | 6.3 Extending structs: extend type 6.4 Restrictions on inheritance |
102 | 6.5 Extending subtypes 6.6 Creating subtypes with when |
104 | 6.7 Extending when subtypes |
105 | 6.8 Defining fields: field |
107 | 6.9 Defining list fields |
109 | 6.10 Projecting list of fields 6.11 Defining attribute fields |
111 | 7. Units 7.1 Overview |
113 | 7.2 Defining units and fields of type unit |
117 | 7.3 Unit attributes |
118 | 7.4 Predefined methods of any_unit |
120 | 7.5 Unit-related predefined methods of any_struct |
122 | 7.6 Unit-related predefined routines |
125 | 8. Template types 8.1 Defining a template type |
127 | 8.2 Instantiating a template type |
128 | 8.3 Template types and reflection |
129 | 8.4 Template errors |
130 | 8.5 Limitations 8.6 Templates versus macros |
133 | 9. e ports 9.1 Introduction to e ports |
134 | 9.2 Using simple ports |
136 | 9.3 Using buffer ports |
137 | 9.4 Using event ports |
138 | 9.5 Using method ports |
140 | 9.6 Defining and referencing ports |
145 | 9.7 Port attributes |
157 | 9.8 Buffer port methods |
159 | 9.9 MVL methods for simple ports |
165 | 9.10 Global MVL routines |
168 | 9.11 Comparative analysis of ports and tick access |
169 | 9.12 e port binding |
171 | 9.13 Transaction level modeling interface ports in e |
181 | 10. Constraints and generation 10.1 Types of constraints 10.2 Generation concepts |
195 | 10.3 Type constraints |
197 | 10.4 Defining constraints |
205 | 10.5 Invoking generation |
207 | 11. Events 11.1 Causes of events 11.2 Scope of events 11.3 Defining and emitting named events |
208 | 11.4 Predefined events |
211 | 12. Temporal expressions 12.1 Overview |
214 | 12.2 Temporal operators and constructs |
229 | 12.3 Success and failure of a temporal expression |
231 | 13. Temporal struct members 13.1 on |
232 | 13.2 expect | assume |
233 | 14. Time-consuming actions 14.1 Synchronization actions |
234 | 14.2 Concurrency actions |
236 | 14.3 State machines |
241 | 15. Coverage constructs 15.1 Defining coverage groups: cover |
243 | 15.2 Defining basic coverage items: item |
247 | 15.3 Defining cross coverage items: cross |
249 | 15.4 Defining transition coverage items: transition |
250 | 15.5 Extending coverage groups: cover … using also … is also |
251 | 15.6 Extending coverage items: item … using also |
252 | 15.7 Coverage API |
258 | 15.8 Coverage methods for the covers struct |
263 | 16. Macros 16.1 Overview |
264 | 16.2 define-as statement 16.3 define-as-computed statement |
265 | 16.4 Match expression structure |
267 | 16.5 Interpretation of match expressions |
268 | 16.6 Macro expansion code |
271 | 17. Print, checks, and error handling 17.1 print 17.2 Handling DUT errors |
276 | 17.3 Handling user errors |
278 | 17.4 Handling programming errors: assert |
279 | 18. Methods 18.1 Rules for defining and extending methods |
287 | 18.2 Invoking methods |
290 | 18.3 Parameter passing |
292 | 18.4 Using the C interface |
295 | 19. Creating and modifying e variables 19.1 About e variables 19.2 var |
296 | 19.3 = 19.4 op= |
297 | 19.5 <= |
299 | 20. Packing and unpacking 20.1 Basic packing |
302 | 20.2 Predefined pack options |
303 | 20.3 Customizing pack options 20.4 Packing and unpacking specific types |
309 | 20.5 Implicit packing and unpacking |
311 | 21. Control flow actions 21.1 Conditional actions |
313 | 21.2 Iterative actions |
317 | 21.3 File iteration actions |
318 | 21.4 Actions for controlling the program flow |
321 | 22. Importing and preprocessor directives 22.1 Importing e modules |
322 | 22.2 #ifdef, #ifndef |
323 | 22.3 #define |
324 | 22.4 #undef |
325 | 23. Encapsulation constructs 23.1 package: package-name 23.2 package: type-declaration |
326 | 23.3 package | protected | private: struct-member |
327 | 23.4 Scope operator (::) |
329 | 24. Simulation-related constructs 24.1 force 24.2 release |
330 | 24.3 Tick access: ‘hdl-pathname’ 24.4 simulator_command() |
331 | 24.5 stop_run() |
333 | 25. Messages 25.1 Overview 25.2 Message model |
334 | 25.3 message and messagef |
336 | 25.4 Message loggers |
337 | 25.5 Configuring message loggers with constraints |
338 | 25.6 Messaging procedural interface (PI) |
346 | 25.7 Examples |
349 | 26. Sequences 26.1 Overview |
351 | 26.2 Sequence statement |
353 | 26.3 do sequence action |
354 | 26.4 Sequence struct types and members |
359 | 26.5 BFM-driver-sequence flow diagrams |
363 | 27. List pseudo-methods library 27.1 Pseudo-methods overview 27.2 Using list pseudo-methods 27.3 Pseudo-methods to modify lists |
372 | 27.4 General list pseudo-methods |
386 | 27.5 Math and logic pseudo-methods |
388 | 27.6 List CRC pseudo-methods |
390 | 27.7 Keyed list pseudo-methods |
393 | 28. Predefined methods library 28.1 Predefined methods of sys 28.2 Predefined methods of any_struct |
396 | 28.3 Methods and predefined attributes of unit any_unit 28.4 Pseudo-methods |
398 | 28.5 Coverage methods |
399 | 29. Predefined routines library 29.1 Deep copy and compare routines |
402 | 29.2 Integer arithmetic routines |
406 | 29.3 Real arithmetic routines |
407 | 29.4 bitwise_op() |
408 | 29.5 get_all_units() 29.6 String routines |
416 | 29.7 Output routines |
418 | 29.8 Operating system interface routines |
422 | 29.9 set_config() 29.10 Random routines |
423 | 30. Predefined file routines library 30.1 File names and search paths 30.2 File handles 30.3 Low-level file methods |
428 | 30.4 General file routines |
434 | 30.5 Reading and writing structs |
437 | 31. Reflection API 31.1 Introduction |
438 | 31.2 Type information |
447 | 31.3 Aspect information |
451 | 31.4 Value query and manipulation |
457 | 32. Predefined resource sharing control structs 32.1 Semaphore methods |
458 | 32.2 How to use the semaphore struct |
463 | 33. Intellectual property protection 33.1 Encryption 33.2 Decryption |
464 | 33.3 Reflection API 33.4 Encryption targets |
465 | Annex A (informative) Bibliography |
467 | B.1 Ordering problem in e Annex B (normative) Source code serialization |
468 | B.2 Within a single module |
469 | B.3 Importing and dependency |
470 | B.4 Concrete load order |
471 | B.5 Visibility scope of preprocessor directives |
475 | C.1 Summary of when versus like Annex C (informative) Comparison of when and like inheritance |
478 | C.2 Advantages of using when inheritance for modeling |
481 | C.3 Advantages of using like inheritance |
482 | C.4 When to use like inheritance |
483 | D.1 The naming problem in e D.2 Resolution overview Annex D (normative) Name spaces |
484 | D.3 Qualified and unqualified names |
485 | D.4 Use relation |
488 | D.5 Built-in APIs |
489 | D.6 Code comparison |
491 | E.1 Type information interface Annex E (informative) Reflection API examples |
492 | E.2 Aspect information interface |
493 | E.3 Value query interface |
495 | F.1 Files F.2 IP Components Annex F (informative) Encryption targets |