IEEE 1647-2016
$280.04
IEEE Standard for the Functional Verification Language e
Published By | Publication Date | Number of Pages |
IEEE | 2016 | 558 |
Revision Standard – Superseded. 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-2016 Front cover |
2 | Title page |
4 | Important Notices and Disclaimers Concerning IEEE Standards Documents |
7 | Participants |
8 | Introduction |
10 | Contents |
16 | IMPORTANT NOTICE 1. Overview 1.1 Scope 1.2 Purpose 1.3 Verification environments |
17 | 1.4 Basic concepts relating to this standard |
18 | 1.4.1 Fundamental considerations 1.4.2 Organization of e programs 1.4.3 Modes of execution 1.4.3.1 Stand-alone execution 1.4.3.2 Co-execution with a master simulator |
19 | 1.4.4 Execution phases 1.4.5 Major semantic components |
20 | 1.4.5.1 Types 1.4.5.2 Packages, aspects, and information hiding |
21 | 1.4.5.3 Numeric expressions and values 1.4.5.4 Constraints and generation |
22 | 1.4.5.5 Concurrent execution 1.4.5.6 Functional coverage |
23 | 1.4.5.7 Checking, printing, and reporting 1.5 Conventions used 1.5.1 Visual cues (meta-syntax) 1.5.2 Syntax notation within a construct |
24 | 1.5.3 Syntax examples 1.6 Use of color in this standard |
25 | 1.7 Contents of this standard |
27 | 2. Normative references 3. Definitions, acronyms, and abbreviations 3.1 Definitions |
29 | 3.2 Acronyms and abbreviations |
31 | 4. e basics 4.1 Lexical conventions 4.1.1 File structure 4.1.2 Code segments 4.1.3 Comments and white space |
32 | 4.1.4 Literals and constants 4.1.4.1 Unsized numbers |
33 | 4.1.4.2 Sized numbers 4.1.4.3 MVL literals |
34 | 4.1.4.3.1 Syntax rules |
35 | 4.1.4.3.2 Examples 4.1.4.3.3 Considerations 4.1.4.4 Predefined constants |
36 | 4.1.4.5 Literal string 4.1.4.6 Literal character 4.1.5 Names and keywords 4.1.5.1 Legal e names 4.1.5.2 e file names 4.1.5.3 e keywords |
37 | 4.1.5.4 Preprocessor names |
38 | 4.1.5.5 String matching pseudo-variables 4.2 Syntactic elements 4.2.1 Statements |
39 | 4.2.2 Struct members |
40 | 4.2.3 Actions |
41 | 4.2.3.1 Creating or modifying variables 4.2.3.2 Executing actions conditionally 4.2.3.3 Executing actions iteratively |
42 | 4.2.3.4 Controlling program flow 4.2.3.5 Invoking methods and routines 4.2.3.6 Emitting an event 4.2.3.7 Performing time-consuming actions |
43 | 4.2.3.8 Generating data item 4.2.3.9 Detecting and handling errors 4.2.3.10 Printing 4.2.4 Expressions |
44 | 4.3 Struct hierarchy and name resolution 4.3.1 Struct hierarchy 4.3.1.1 Global struct 4.3.1.2 Files struct 4.3.1.3 Packing struct 4.3.1.4 Sys struct |
45 | 4.3.1.5 Session struct 4.3.1.5.1 session.check_ok 4.3.1.5.2 session.events 4.3.2 Referencing e entities 4.3.2.1 Structs and fields |
46 | 4.3.2.2 Naming and referencing methods and routines |
47 | 4.3.2.3 Enumerated type values 4.3.3 Implicit variables 4.3.3.1 it |
48 | 4.3.3.2 me 4.3.3.3 result 4.3.3.4 index 4.3.3.5 prev |
49 | 4.3.4 Name resolution rules 4.3.4.1 Names that include a path 4.3.4.2 Names that do not include a path |
50 | 4.4 Ranges |
51 | 4.5 Operator precedence |
52 | 4.6 Evaluation order of expressions 4.7 Bitwise operators 4.7.1 ~ |
53 | 4.7.2 & | ^ 4.7.3 >> << |
54 | 4.8 Boolean operators 4.8.1 ! (not) 4.8.2 && (and) |
55 | 4.8.3 || (or) 4.8.4 => |
56 | 4.8.5 now 4.9 Arithmetic operators 4.9.1 Unary + ā |
57 | 4.9.2 + ā * / % 4.10 Comparison operators 4.10.1 < >= |
58 | 4.10.2 == != |
59 | 4.10.3 === !== |
60 | 4.10.4 ~ !~ |
61 | 4.10.5 in 4.11 String matching 4.11.1 Native e string matching |
62 | 4.11.2 AWK-style string matching |
63 | 4.12 Extraction and concatenation operators |
64 | 4.12.1 [ ] 4.12.2 [ : ] |
65 | 4.12.2.1 Slice and size of the result 4.12.2.2 Accessing nonexistent bits 4.12.3 [ .. ] |
66 | 4.12.4 {… ; …} |
67 | 4.12.5 %{… , …} 4.13 Scalar modifiers 4.13.1 [ range,…] |
68 | 4.13.2 (bits | bytes : width-exp) 4.14 Parentheses 4.15 list.method() |
69 | 4.16 Special-purpose operators 4.16.1 is [not] a, is [not] an |
70 | 4.16.2 new |
71 | 4.16.3 Dot operator (.) 4.16.4 Apostrophes (‘) |
72 | 4.16.5 Conditional operator (? š |
73 | 5. Data types 5.1 e data types 5.1.1 Scalar types 5.1.2 Scalar subtypes 5.1.2.1 Scalar modifiers |
74 | 5.1.2.2 Named scalar subtypes 5.1.2.3 Unbounded integers |
75 | 5.1.3 Enumerated scalar types |
76 | 5.1.4 Casting of enumerated types in comparisons 5.1.5 Struct types 5.1.6 Struct subtypes |
77 | 5.1.7 Referencing fields in when constructs 5.1.8 List types 5.1.9 Keyed lists |
78 | 5.1.10 The set type 5.1.11 The string type |
79 | 5.1.12 The real type 5.1.13 The external_pointer type 5.1.14 The āuntypedā pseudo type 5.2 Untyped expressions |
80 | 5.3 Assignment rules 5.3.1 What is an assignment? |
81 | 5.3.2 Assignments create identical references 5.3.3 Assignment to different (but compatible) types |
82 | 5.3.3.1 Assignment of numeric types 5.3.3.2 Assignment of Boolean types 5.3.3.3 Assignment of enumerated types 5.3.3.4 Assignment of structs 5.3.3.5 Assignment of strings |
83 | 5.3.3.6 Assignment of lists 5.3.3.7 Assignment of sets 5.4 Real data type 5.4.1 Real data type usage |
84 | 5.4.2 Real literals 5.4.3 Real constants |
85 | 5.4.4 Real type limitations 5.5 Precision rules for numeric operations |
86 | 5.5.1 Determining the context of an expression |
87 | 5.5.2 Deciding precision and performing data conversion and sign extension 5.6 Automatic type casting |
88 | 5.6.1 Conversion between real and integer data types 5.6.2 Real data type precision, data conversion, and sign extension 5.7 Defining and extending scalar types |
89 | 5.7.1 type enumerated scalar 5.7.2 type scalar subtype |
90 | 5.7.3 type sized scalar 5.7.4 extend type |
91 | 5.8 Type-related constructs 5.8.1 as_a() 5.8.2 unsafe() |
92 | 5.8.2.1 Type conversion between scalars and lists of scalars |
93 | 5.8.2.2 Type conversion between strings and scalars or lists of scalars |
94 | 5.8.2.3 Type conversion between structs, struct subtypes, and lists of structs |
95 | 5.8.2.4 Type conversion between simple lists and keyed lists 5.8.2.5 Type conversion between reals and non-numeric scalars |
96 | 5.8.2.6 Type conversion between numeric lists and sets 5.8.3 all_values() |
97 | 5.8.4 set_of_values() 5.8.5 full_set_of_values() |
98 | 6. Structs, subtypes, and fields 6.1 Structs overview |
99 | 6.2 Defining structs: struct |
100 | 6.3 Extending structs: extend type 6.4 Restrictions on inheritance |
101 | 6.5 Extending subtypes 6.6 Creating subtypes with when |
102 | 6.6.1 when |
103 | 6.7 Extending when subtypes 6.7.1 Coverage and when subtypes 6.7.2 Extending methods in when subtypes |
104 | 6.8 Defining fields: field 6.8.1 Constant values 6.8.1.1 Initializing const fields |
105 | 6.8.1.2 Restrictions 6.8.2 Physical fields 6.8.3 Ungenerated fields 6.8.4 Assigning values to fields |
106 | 6.9 Defining list fields 6.9.1 list of |
107 | 6.9.2 list(key) of |
108 | 6.10 Projecting list of fields 6.11 Defining attribute fields |
110 | 7. Units 7.1 Overview |
111 | 7.1.1 Units versus structs 7.1.2 HDL paths and units |
112 | 7.1.3 Methodology limitations and recommendations |
113 | 7.2 Defining units and fields of type unit 7.2.1 unit |
114 | 7.2.2 field: unit-type is instance 7.2.3 field: unit-type |
115 | 7.2.4 field: list of unit instances 7.2.5 field: list of unit-type |
116 | 7.3 Unit attributes 7.3.1 hdl_path() |
117 | 7.3.2 agent() 7.4 Predefined methods of any_unit |
118 | 7.4.1 full_hdl_path() 7.4.2 e_path() 7.4.3 get_parent_unit() |
119 | 7.5 Unit-related predefined methods of any_struct 7.5.1 get_unit() |
120 | 7.5.2 get_enclosing_unit() 7.5.3 try_enclosing_unit() |
121 | 7.5.4 set_unit() 7.6 Unit-related predefined routines |
122 | 7.6.1 set_config_max() 7.6.2 get_all_units() |
123 | 8. Template types 8.1 Defining a template type 8.1.1 Template type parameters and defaults |
124 | 8.1.2 Template parameter type categories 8.1.3 Template base types |
125 | 8.1.4 Template body 8.1.5 Template definition example |
126 | 8.2 Extending a template |
127 | 8.2.1 Template extension example 8.3 Instantiating a template type |
128 | 8.4 Template subtype instances |
130 | 9. e ports 9.1 Introduction to e ports 9.1.1 Creating port instances |
131 | 9.1.2 Using ports 9.1.3 Using port values and attributes in constraints 9.2 Using simple ports |
132 | 9.2.1 Accessing simple ports and their values 9.2.2 MVL on simple ports |
133 | 9.2.3 @sim temporal expressions with external simple ports 9.3 Using buffer ports 9.3.1 Rendezvous-zero size buffer queue |
134 | 9.4 Using event ports 9.4.1 Accessing event ports |
135 | 9.5 Using method ports 9.5.1 Method types 9.5.2 Input method ports |
136 | 9.5.3 Output method ports 9.5.4 Invoking method ports 9.5.5 Binding method ports |
137 | 9.6 Defining and referencing ports 9.6.1 simple_port |
138 | 9.6.2 buffer_port |
139 | 9.6.3 event_port |
140 | 9.6.4 method_port 9.6.5 method_type method-type-name |
141 | 9.6.6 Port reference 9.6.7 Port: $ |
142 | 9.6.8 Port bit slice access 9.6.9 Force simple port |
143 | 9.6.10 Force simple port bit slice 9.6.11 Release simple port |
144 | 9.6.12 Method port reference 9.6.13 Method port: $ |
145 | 9.7 Port attributes 9.7.1 Generic port attributes |
146 | 9.7.2 Port attributes for HDL simulators |
148 | 9.7.2.1 bind() 9.7.2.1.1 Rules 9.7.2.1.2 Checking of ports |
149 | 9.7.2.1.3 Disconnected ports 9.7.2.2 buffer_size() |
150 | 9.7.2.3 declared_range() 9.7.2.4 delayed() |
151 | 9.7.2.5 driver() 9.7.2.6 driver_delay() |
152 | 9.7.2.7 driver_initial_value() 9.7.2.8 edge() |
153 | 9.7.2.9 hdl_path() 9.7.2.10 pack_options() |
154 | 9.7.2.11 pass_by_pointer() 9.7.2.12 verilog_drive() |
155 | 9.7.2.13 verilog_drive_hold() 9.7.2.14 verilog_forcible() |
156 | 9.7.2.15 verilog_strobe() 9.7.2.16 verilog_wire() |
157 | 9.7.2.17 vhdl_delay_mode() 9.8 Buffer port methods 9.8.1 get() |
158 | 9.8.2 put() 9.8.3 is_empty() |
159 | 9.8.4 is_full() 9.9 MVL methods for simple ports 9.9.1 MVL four-value logic |
160 | 9.9.2 MVL string 9.9.3 put_mvl() |
161 | 9.9.4 get_mvl() 9.9.5 put_mvl_list() 9.9.6 fill_mvl_list() |
162 | 9.9.7 get_mvl_list() 9.9.8 put_mvl_string() |
163 | 9.9.9 get_mvl_string() 9.9.10 get_mvl4() 9.9.11 fill_mvl4_list() |
164 | 9.9.12 get_mvl4_list() 9.9.13 get_mvl4_string() |
165 | 9.9.14 put_mvl_to_bit_slice() 9.9.15 force_mvl() |
166 | 9.9.16 force_mvl_list() 9.9.17 force_mvl_string() |
167 | 9.9.18 force_mvl_to_bit_slice() 9.9.19 has_mvl_value() |
168 | 9.9.20 has_x() 9.9.21 has_z() 9.9.22 has_unknown() |
169 | 9.9.23 set_default_value() |
170 | 9.9.24 set_default_mvl_value() 9.10 Global MVL routines 9.10.1 string_to_mvl() |
171 | 9.10.2 mvl_to_string() 9.10.3 mvl_to_int() |
172 | 9.10.4 int_to_mvl() 9.10.5 mvl_to_bits() |
173 | 9.10.6 bits_to_mvl() 9.10.7 mvl_to_mvl4() 9.10.8 convert_mvl_list_to_mvl4_list() |
174 | 9.10.9 mvl_list_to_mvl4_list() 9.10.10 string_to_mvl4() 9.11 Comparative analysis of ports and tick access |
175 | 9.12 e port binding |
176 | 9.12.1 do_bind() 9.13 Transaction level modeling interface ports in e |
177 | 9.13.1 interface_port 9.13.1.1 Special port types 9.13.1.1.1 Export |
178 | 9.13.1.2 Analysis port 9.13.2 Defining input e TLM interface ports 9.13.3 Binding e TLM interface ports 9.13.3.1 Binding rules for TLM interface ports |
179 | 9.13.3.2 Declarative and procedural binding 9.13.3.2.1 connect()ālanguage-neutral binding |
180 | 9.13.4 Supported TLM interfaces 9.13.4.1 tlm_event predefined struct 9.13.4.2 Supported unidirectional TLM interfaces |
181 | 9.13.4.3 Supported bidirectional TLM interfaces |
183 | 9.13.4.4 Supported analysis TLM interface 9.13.4.5 Required semantics of TLM interface methods 9.13.4.5.1 put(value:type) 9.13.4.5.2 try_put(value:type) : bool 9.13.4.5.3 can_put() : bool |
184 | 9.13.4.5.4 ok_to_put() : tlm_event 9.13.4.5.5 get(value:*type) 9.13.4.5.6 try_get(value:*type) : bool 9.13.4.5.7 can_get() : bool 9.13.4.5.8 ok_to_get() : tlm_event 9.13.4.5.9 peek(value:*type) 9.13.4.5.10 try_peek(value:*type) : bool 9.13.4.5.11 can_peek() : bool 9.13.4.5.12 ok_to_peek() : tlm_event 9.13.4.5.13 transport(request: req-type, response: *rsp-type) |
185 | 9.13.4.5.14 write(value : type) 9.14 TLM Sockets in e 9.14.1 tlm_initiator_socket/tlm_target_socket |
186 | 9.14.1.1 nb_transport_bw(trans:tlm_generic_payload, p:*tlm_phase_enum,t:*time):tlm_syn_enum 9.14.1.2 nb_transport_fw(trans:tlm_generic_payload, p:*tlm_phase_enum,t:*time):tlm_syn_enum 9.14.1.3 b_transport(trans:tlm_generic_payload, ,t:*time)@sys.any 9.14.1.4 transport_dbg(trans:tlm_generic_payload):uint 9.14.1.5 set_bus_width (num:uint) 9.14.1.6 get_bus_width ():uint |
187 | 9.14.2 Predefined types related to TLM socket based transactions 9.14.2.1 tlm_command 9.14.2.2 tlm_endianness 9.14.2.3 tlm_extension 9.14.2.4 tlm_generic_payload |
189 | 9.14.2.5 tlm_phase_enum |
190 | 9.14.2.6 tlm_response_status 9.14.2.7 tlm_sync_enum 9.14.3 Binding e TLM sockets 9.14.3.1 Binding rules for TLM sockets |
191 | 9.14.3.1.1 connect()-language-neutral binding |
192 | 10. Constraints and generation 10.1 Types of constraints 10.2 Generation concepts |
193 | 10.2.1 Generation action 10.2.1.1 Pre-run generation actions 10.2.1.2 On-the-fly generation actions 10.2.2 Generatable variable 10.2.3 Connected field sets (CFS) |
194 | 10.2.4 Inputs |
195 | 10.2.5 Unidirectional and bidirectional relations 10.2.6 Inconsistently connected field sets (ICFS) 10.2.7 Order of CFSs |
196 | 10.2.7.1 Structural dependencies 10.2.7.1.1 when subtype dependencies in constraints |
197 | 10.2.7.2 Input dependencies 10.2.7.2.1 Dependencies of method calls 10.2.8 Basic flow of generation |
198 | 10.2.9 Using methods in constraints |
199 | 10.2.9.1 Classification of methods |
200 | 10.2.9.2 Number of calls 10.2.10 Generatable paths and the sampling of inputs |
201 | 10.2.11 Scope of constraints |
202 | 10.2.12 Soft constraints |
203 | 10.2.12.1 keep gen-item.reset_soft() |
204 | 10.2.12.2 keep soft… select 10.2.13 Constraining non-scalar data types |
205 | 10.2.13.1 Constraining structs 10.2.13.1.1 Struct equality |
206 | 10.2.13.1.2 Struct inequality 10.2.13.2 Allocation versus aliasing 10.2.13.3 Constraining lists |
207 | 10.2.13.3.1 List equality and inequality 10.2.13.3.2 List item 10.2.13.3.3 Item in list 10.2.13.3.4 List in list |
208 | 10.2.13.3.5 Permutations 10.2.13.3.6 List attributes |
209 | 10.2.13.3.7 Constraining all list items: keep for each 10.2.13.3.8 All solutions |
210 | 10.3 Type constraints |
211 | 10.3.1 keep type |
212 | 10.3.2 Type constraints and struct fields 10.3.3 Type constraints and list fields 10.3.4 Type constraints and like subtypes |
213 | 10.4 Defining constraints 10.4.1 keep 10.4.1.1 Constraint overriding |
214 | 10.4.2 keep 10.4.3 keep all of {…} |
215 | 10.4.4 keep struct-list.is_all_iterations() 10.4.5 keep soft |
216 | 10.4.6 read_only() 10.4.7 constraint-bool-exp |
218 | 10.4.8 gen-item 10.5 Invoking generation |
219 | 10.5.1 gen 10.5.2 pre_generate() |
220 | 10.5.3 post_generate() |
221 | 11. Temporal struct members 11.1 Events 11.1.1 Causes of events 11.1.2 Scope of events 11.1.3 Defining and emitting named events |
222 | 11.1.3.1 event |
223 | 11.1.3.2 emit 11.1.4 Predefined events 11.1.4.1 General predefined events |
224 | 11.1.4.1.1 sys.any 11.1.4.1.2 sys.tick_start 11.1.4.1.3 sys.tick_end 11.1.4.1.4 session.start_of_test 11.1.4.1.5 session.end_of_test 11.1.4.1.6 struct.quit 11.1.4.1.7 sys.new_time 11.1.4.2 Simulation time and ticks |
225 | 11.2 on |
226 | 11.3 on event-port |
227 | 11.4 expect | assume |
228 | 11.5 Procedural API for temporal operators on event and expect struct members 11.5.1 do_abort_on_event() |
229 | 11.5.2 do_stop_on_event() 11.5.3 do_start_on_event() |
230 | 11.5.4 do_abort_on_expect() 11.5.5 do_stop_on_expect() |
231 | 11.5.6 do_start_on_expect() 11.5.7 do_abort_on_struct() |
232 | 11.5.8 do_stop_on_struct() 11.5.9 do_start_on_struct() |
233 | 11.5.10 apply_abort_on_struct() 11.5.11 apply_stop_on_struct() |
234 | 11.5.12 apply_start_on_struct() 11.5.13 do_abort_on_all_events() |
235 | 11.5.14 do_stop_on_all_events() 11.5.15 do_start_on_all_events() |
236 | 11.5.16 do_abort_on_all_expects() 11.5.17 do_stop_on_all_expects() |
237 | 11.5.18 do_start_on_all_expects() 11.5.19 do_abort_on_subtree() |
238 | 11.5.20 do_stop_on_subtree() 11.5.21 do_start_on_subtree() |
239 | 11.5.22 propagate_abort_on_subtree() 11.5.23 propagate_stop_on_subtree() |
240 | 11.5.24 propagate_start_on_subtree() 11.5.25 do_abort_on_all_instance_fields() |
241 | 11.5.26 do_stop_on_all_instance_fields() 11.5.27 do_start_on_all_instance_fields() |
242 | 12. Temporal expressions 12.1 Overview 12.1.1 Terminology 12.1.1.1 holds 12.1.1.2 holds tightly |
243 | 12.1.1.3 occurs, occurrence 12.1.1.4 path 12.1.1.5 prefix 12.1.1.6 proposition 12.1.1.7 sampling event 12.1.1.8 sampled normal form 12.1.1.9 state 12.1.1.10 strict prefix 12.1.1.11 sub-path 12.1.1.12 success 12.1.1.13 temporal atom 12.1.1.14 tight satisfaction |
244 | 12.1.1.15 top-level temporal expression 12.1.2 Temporal atoms 12.1.3 Sampling event 12.1.4 Sampling propagation and sampled normal form |
245 | 12.2 Temporal operators and constructs |
246 | 12.2.1 Precedence of temporal operators 12.2.2 cycle |
247 | 12.2.3 true(exp) 12.2.4 @ unary event operator |
248 | 12.2.5 @ sampling operator (binary @) 12.2.6 and |
249 | 12.2.7 or 12.2.8 { exp ; exp } |
250 | 12.2.9 [ exp ] |
251 | 12.2.10 ~[ exp..exp ] |
252 | 12.2.11 [ exp..exp ] |
253 | 12.2.12 fail |
254 | 12.2.13 => |
255 | 12.2.14 eventually 12.2.15 detach |
256 | 12.2.16 not |
257 | 12.2.17 change(exp), fall(exp), rise(exp) |
259 | 12.2.18 delay |
260 | 12.2.19 exec 12.3 Success and failure of a temporal expression 12.3.1 Success of a temporal expression |
261 | 12.3.2 Failure of a temporal expression 12.3.3 Start of an evaluation of a temporal expression |
262 | 13. Time-consuming actions 13.1 Synchronization actions 13.1.1 Synchronization semantics |
263 | 13.1.2 sync 13.1.3 wait |
264 | 13.2 Concurrency actions 13.2.1 all of |
265 | 13.2.2 first of 13.3 State machines 13.3.1 Overview |
266 | 13.3.2 state machine action |
267 | 13.3.3 Simple state transition: state => state |
268 | 13.3.4 Wild card state transition: * => state 13.3.5 state action |
270 | 14. Coverage constructs 14.1 Defining coverage groups: cover |
272 | 14.1.1 Using the instance_no_collect option for per unit instance coverage |
273 | 14.2 Defining basic coverage items: item |
276 | 14.2.1 Coverage per instance 14.2.2 per_instance item errors |
277 | 14.2.3 Relationship of type and instance based coverage items |
278 | 14.3 Defining cross coverage items: cross |
280 | 14.4 Defining transition coverage items: transition |
282 | 14.5 Extending coverage groups: cover … using also … is also |
283 | 14.6 Extending coverage items: item … using also 14.7 Coverage API 14.7.1 Methods of user_cover_struct |
284 | 14.7.1.1 scan_cover() 14.7.1.2 start_group() |
285 | 14.7.1.3 start_instance() 14.7.1.4 start_item() |
286 | 14.7.1.5 scan_bucket() 14.7.1.6 end_item() |
287 | 14.7.1.7 end_instance() 14.7.1.8 end_group() 14.7.2 Fields of user_cover_struct |
289 | 14.8 Coverage methods for the covers struct |
290 | 14.8.1 include_tests() 14.8.2 set_weight() |
291 | 14.8.3 set_at_least() 14.8.4 set_cover() |
292 | 14.8.5 get_contributing_runs() 14.8.6 get_unique_buckets() |
293 | 14.8.7 write_cover_file() 14.8.8 get_overall_grade() 14.8.9 get_ecov_name() |
294 | 14.8.10 get_test_name() 14.8.11 get_seed() |
295 | 15. Macros 15.1 Overview 15.1.1 e syntactic structure 15.1.2 Macro definition |
296 | 15.2 define-as statement 15.3 define-as-computed statement |
297 | 15.4 Match expression structure 15.4.1 Match expression terms 15.4.2 Match expression operators |
298 | 15.4.3 Submatches and labels 15.4.4 Meta-grammar of match expression |
299 | 15.4.5 Proto-syntax 15.5 Interpretation of match expressions 15.5.1 Priority on production choices |
300 | 15.5.2 Recursive-decent interpretation 15.6 Macro expansion code |
303 | 16. Print, checks, and error handling 16.1 print 16.2 Handling DUT errors |
304 | 16.2.1 check that 16.2.1.1 Using named check actions |
305 | 16.2.2 dut_error() |
306 | 16.2.3 dut_errorf() |
307 | 16.2.4 dut_error_struct |
308 | 16.2.5 set_check() |
309 | 16.3 Handling user errors 16.3.1 warning() 16.3.2 error() |
310 | 16.3.3 fatal() 16.3.4 try |
311 | 16.4 Handling programming errors: assert |
312 | 17. Methods 17.1 Rules for defining and extending methods |
314 | 17.1.1 method is |
315 | 17.1.2 method @event is |
316 | 17.1.3 method [@event] is (also | first | only) |
319 | 17.1.4 method [@event] is (undefined | empty) 17.2 Invoking methods |
320 | 17.2.1 tcm() |
321 | 17.2.2 start tcm() |
322 | 17.2.3 method() |
323 | 17.2.4 compute method() or tcm() 17.2.5 return |
324 | 17.3 Parameter passing 17.3.1 Scalar parameter passing |
325 | 17.3.2 Compound parameter passing 17.3.3 Passing by reference 17.3.4 Default parameter values |
326 | 17.4 Using the C interface 17.4.1 routine ā¦ is C routine |
327 | 17.4.2 method ā¦ is C routine 17.4.3 C export |
328 | 18. Creating and modifying e variables 18.1 About e variables 18.2 var |
329 | 18.3 = 18.4 op= |
330 | 18.5 <= |
332 | 19. Packing and unpacking 19.1 Basic packing 19.1.1 pack() |
333 | 19.1.2 unpack() |
334 | 19.1.3 swap() |
335 | 19.2 Predefined pack options 19.2.1 pack_options struct 19.2.1.1 reverse_fields 19.2.1.2 reverse_list_items 19.2.1.3 final_reorder 19.2.1.4 scalar_reorder 19.2.2 Predefined settings |
336 | 19.2.3 packing.high 19.2.4 packing.low 19.2.5 packing.global_default 19.3 Customizing pack options 19.4 Packing and unpacking specific types 19.4.1 Packing and unpacking structs |
337 | 19.4.1.1 Customizing packing for a particular struct 19.4.1.1.1 do_pack() |
338 | 19.4.1.1.2 do_unpack() |
339 | 19.4.1.2 A simple example of packing |
340 | 19.4.1.3 A simple example of unpacking |
341 | 19.4.2 Packing and unpacking lists |
342 | 19.4.3 Packing and unpacking scalar expressions 19.4.4 Packing and unpacking strings 19.4.5 Packing values for real types 19.5 Implicit packing and unpacking |
343 | 20. Control flow actions 20.1 Conditional actions 20.1.1 if then else |
344 | 20.1.2 case labeled-case-item |
345 | 20.1.3 case bool-case-item 20.2 Iterative actions |
346 | 20.2.1 while 20.2.2 repeat until |
347 | 20.2.3 for each in |
348 | 20.2.4 for each in set |
349 | 20.2.5 for from to 20.2.6 for |
350 | 20.3 File iteration actions 20.3.1 for each line in file |
351 | 20.3.2 for each file matching 20.4 Actions for controlling the program flow 20.4.1 break |
352 | 20.4.2 continue |
353 | 21. Importing and preprocessor directives 21.1 Importing e modules 21.1.1 import |
354 | 21.1.2 Cyclic referencing and importing 21.2 #ifdef, #ifndef |
355 | 21.3 #define |
356 | 21.4 #undef |
357 | 22. Encapsulation constructs 22.1 package: package-name 22.2 package: type-declaration |
358 | 22.3 package | protected | private: struct-member |
359 | 22.4 Scope operator (::) |
360 | 23. Simulation-related constructs 23.1 force 23.2 release |
361 | 23.3 Tick access: ‘hdl-pathname’ |
362 | 24. Messages 24.1 Overview 24.2 Message model 24.3 Message execution |
363 | 24.4 Structured debug messages |
365 | 24.4.1 msg_started() |
366 | 24.4.2 msg_ended() |
367 | 24.4.3 msg_transformed() 24.4.4 msg_changed() |
368 | 24.4.5 msg_info() |
369 | 24.5 message and messagef 24.6 Tag |
370 | 24.7 Verbosity 24.8 Predefined type sdm_handler 24.8.1 sdm_handler |
371 | 24.8.2 sdm_started_handler 24.8.3 sdm_ended_handler 24.8.4 sdm_transformed_handler |
372 | 24.8.5 sdm_changed_handler 24.8.6 sdm_info_handler 24.9 Messages Interface 24.9.1 Message configuration and customization 24.9.1.1 Initial presupplied default message settings 24.9.1.2 Modifying initial default message settings |
373 | 24.9.2 Predefined types and methods 24.9.2.1 recording_config 24.9.2.1.1 register_all_field_attributes() 24.9.2.1.2 register_callback_attribute() |
374 | 24.9.2.1.3 register_callback_attributes() 24.9.2.1.4 register_callback_state_var() 24.9.2.1.5 register_field_attribute() |
375 | 24.9.2.1.6 register_field_attributes() 24.9.2.1.7 register_field_state_var() |
376 | 24.9.2.1.8 register_method_attribute() |
377 | 24.9.2.1.9 register_method_state_var() 24.9.2.1.10 set_attribute_format() |
378 | 24.9.2.1.11 set_attribute_sampling() 24.9.2.1.12 set_label_attribute() |
379 | 24.9.2.1.13 set_text_attribute() 24.9.2.1.14 set_text_state_var() 24.9.2.2 any_unit Recording Configuration API extensions 24.9.2.2.1 assign_recording_config() |
380 | 24.9.2.2.2 get_recording_config() 24.9.2.2.3 tr_get_state_var_value() 24.9.2.3 any_struct Recording Configuration API extensions |
381 | 24.9.2.3.1 tr_get_attribute_value() |
382 | 24.9.2.4 tr_sampling_point_t 24.9.2.5 message_manager API |
383 | 24.9.2.5.1 set_screen_messages |
384 | 24.9.2.5.2 set_screen_messages_off 24.9.2.5.3 set_transaction_messages |
385 | 24.9.2.5.4 set_transaction_messages_off |
386 | 24.9.2.5.5 set_file_messages 24.9.2.5.6 set_file_messages_off |
387 | 24.9.2.5.7 set_message_format 24.9.2.6 message_format |
388 | 24.9.2.7 message_action 24.9.2.7.1 get_id() 24.9.2.7.2 get_tag() 24.9.2.7.3 get_verbosity() |
389 | 24.9.2.7.4 get_source_method_layer() 24.9.2.7.5 get_source_line_num() 24.9.2.7.6 get_source_struct() 24.9.2.7.7 get_time() |
390 | 24.9.2.7.8 get_format() 24.9.2.7.9 get_sdm_handler() 24.9.2.8 sdm_handler 24.9.2.8.1 Predefined fields 24.9.2.8.2 get_kind_string() |
391 | 24.9.2.8.3 get_attribute_string() 24.9.2.8.4 collect_text_attributes() 24.9.2.9 sdm_started_handler 24.9.2.9.1 Predefined fields 24.9.2.10 sdm_ended_handler 24.9.2.10.1 Predefined fields |
392 | 24.9.2.11 sdm_transformed_handler 24.9.2.11.1 Predefined fields 24.9.2.12 sdm_changed_handler 24.9.2.12.1 Predefined fields 24.9.2.13 sdm_info_handler 24.9.2.13.1 Predefined fields 24.9.2.14 any_unit message API 24.9.2.14.1 create_formatted_messsage() |
394 | 25. Sequences 25.1 Overview |
395 | 25.1.1 Object model 25.1.2 Virtual sequences |
396 | 25.2 Sequence statement 25.2.1 Predefined sequence kinds 25.2.1.1 MAIN |
397 | 25.2.1.2 SIMPLE 25.2.1.3 RANDOM |
398 | 25.2.2 Examples 25.3 do sequence action |
399 | 25.4 Sequence struct types and members |
400 | 25.4.1 Sequence item API 25.4.2 Sequence API |
402 | 25.4.3 Sequence driver API |
404 | 25.5 BFM-driver-sequence flow diagrams 25.5.1 sequence.start_sequence() flow 25.5.2 do subsequence flow |
406 | 25.5.3 do item flow in pull mode using get_next_item() 25.5.4 do item flow in pull mode using try_next_item() |
408 | 26. List pseudo-methods library 26.1 Pseudo-methods overview 26.2 Using list pseudo-methods 26.3 Pseudo-methods to modify lists |
409 | 26.3.1 add(item) 26.3.2 add(list) |
410 | 26.3.3 add0(item) 26.3.4 add0(list) |
411 | 26.3.5 clear() 26.3.6 delete() |
412 | 26.3.7 fast_delete() 26.3.8 insert(index, item) |
413 | 26.3.9 insert(index, list) 26.3.10 pop() |
414 | 26.3.11 pop0() 26.3.12 push() |
415 | 26.3.13 push0() 26.3.14 push(list) |
416 | 26.3.15 push0(list) 26.3.16 resize() |
417 | 26.4 General list pseudo-methods 26.4.1 all_different() |
418 | 26.4.2 apply() |
419 | 26.4.3 copy() 26.4.4 count() |
420 | 26.4.5 exists() 26.4.6 first() |
421 | 26.4.7 first_index() 26.4.8 flatten() |
422 | 26.4.9 get_indices() 26.4.10 has() |
423 | 26.4.11 is_a_permutation() 26.4.12 is_empty() |
424 | 26.4.13 last() 26.4.14 last_index() |
425 | 26.4.15 max() 26.4.16 max_index() |
426 | 26.4.17 max_value() 26.4.18 min() |
427 | 26.4.19 min_index() 26.4.20 min_value() |
428 | 26.4.21 reverse() 26.4.22 size() |
429 | 26.4.23 sort() 26.4.24 sort_by_field() |
430 | 26.4.25 split() 26.4.26 top() |
431 | 26.4.27 top0() 26.4.28 unique() |
432 | 26.4.29 all() 26.4.30 all_indices() 26.5 Math and logic pseudo-methods |
433 | 26.5.1 and_all() 26.5.2 or_all() |
434 | 26.5.3 average() 26.5.4 product() |
435 | 26.5.5 sum() 26.6 List CRC pseudo-methods 26.6.1 crc_8() |
436 | 26.6.2 crc_32() |
437 | 26.6.3 crc_32_flip() 26.7 Keyed list pseudo-methods |
438 | 26.7.1 key() 26.7.2 key_index() |
439 | 26.7.3 key_exists() 26.7.4 Restrictions on keyed lists |
440 | 27. Predefined methods library 27.1 Predefined methods of sys 27.2 Predefined methods of any_struct 27.2.1 Setting unit relationships 27.2.1.1 get_unit() 27.2.1.2 set_unit() 27.2.2 Methods called during execution phases 27.2.2.1 init() method of any_struct |
441 | 27.2.2.2 pre_generate() 27.2.2.3 post_generate() 27.2.2.4 run() method of any_struct |
442 | 27.2.2.5 quit() method of any_struct 27.2.3 Methods called for customizing specific operations 27.2.3.1 do_pack() 27.2.3.2 do_unpack() |
443 | 27.2.3.3 do_print() method of any_struct 27.2.3.4 print_line() method of any_struct 27.3 Methods and predefined attributes of unit any_unit |
444 | 27.4 Set Pseudo-methods 27.4.1 union() 27.4.2 intersect() 27.4.3 diff() |
445 | 27.4.4 size() 27.4.5 uint_size() 27.4.6 size_is_uint() |
446 | 27.4.7 min() 27.4.8 uint_min() 27.4.9 min_is_uint() |
447 | 27.4.10 int_min() 27.4.11 min_is_int() 27.4.12 max() |
448 | 27.4.13 uint_max() 27.4.14 max_is_uint() 27.4.15 int_max() |
449 | 27.4.16 max_is_int() 27.4.17 get_all_ranges() 27.4.18 collect_all_ranges() |
450 | 27.4.19 get_range() 27.4.20 get_range_below() |
451 | 27.4.21 get_range_above() 27.5 Other pseudo-methods |
452 | 27.5.1 copy() method of any_struct 27.5.2 as_a() 27.5.3 get_enclosing_unit() |
453 | 27.5.4 to_string() 27.5.5 try_enclosing_unit() 27.6 Coverage methods |
454 | 28. Predefined routines library 28.1 Deep copy and compare routines 28.1.1 deep_copy() |
455 | 28.1.2 deep_compare() |
457 | 28.1.3 deep_compare_physical() 28.2 Integer arithmetic routines |
458 | 28.2.1 min() 28.2.2 max() 28.2.3 abs() |
459 | 28.2.4 odd() 28.2.5 even() 28.2.6 ilog2() |
460 | 28.2.7 ilog10() 28.2.8 ipow() 28.2.9 isqrt() |
461 | 28.2.10 div_round_up() 28.3 Real arithmetic routines |
462 | 28.4 bitwise_op() |
463 | 28.5 get_all_units() 28.6 String routines 28.6.1 append() |
464 | 28.6.2 appendf() 28.6.3 bin() |
465 | 28.6.4 dec() 28.6.5 hex() 28.6.6 quote() |
466 | 28.6.7 str_chop() 28.6.8 str_empty() 28.6.9 str_exactly() |
467 | 28.6.10 str_insensitive() 28.6.11 str_join() 28.6.12 str_len() |
468 | 28.6.13 str_lower() 28.6.14 str_match() |
469 | 28.6.15 str_pad() 28.6.16 str_replace() |
470 | 28.6.17 str_split() 28.6.18 str_split_all() |
471 | 28.6.19 str_sub() 28.6.20 str_upper() 28.7 Output routines |
472 | 28.7.1 out() 28.7.2 outf() 28.7.3 Format string |
473 | 28.8 Operating system interface routines |
474 | 28.8.1 spawn() 28.8.2 spawn_check() 28.8.3 system() |
475 | 28.8.4 output_from() 28.8.5 output_from_check() 28.8.6 get_symbol() |
476 | 28.8.7 date_time() 28.8.8 getpid() |
477 | 28.9 set_config() 28.10 Random routines 28.11 Simulation-related routines |
478 | 28.11.1 simulator_command() 28.11.2 stop_run() |
479 | 28.11.3 get_timescale() |
480 | 29. Predefined file routines library 29.1 File names and search paths 29.2 File handles 29.3 Low-level file methods 29.3.1 add_file_type() |
481 | 29.3.2 close() 29.3.3 flush() |
482 | 29.3.4 open() 29.3.5 read() |
483 | 29.3.6 read_lob() 29.3.7 write() |
484 | 29.3.8 write_lob() 29.3.9 writef() |
485 | 29.4 General file routines 29.4.1 file_age() 29.4.2 file_append() |
486 | 29.4.3 file_copy() 29.4.4 file_delete() 29.4.5 file_exists() |
487 | 29.4.6 file_extension() 29.4.7 file_is_dir() |
488 | 29.4.8 file_is_link() 29.4.9 file_is_readable() 29.4.10 file_is_regular() |
489 | 29.4.11 file_is_temp() 29.4.12 file_is_text() |
490 | 29.4.13 file_rename() 29.4.14 file_size() 29.4.15 new_temp_file() |
491 | 29.4.16 write_string_list() 29.5 Reading and writing structs 29.5.1 read_ascii_struct() |
492 | 29.5.2 read_binary_struct() 29.5.3 write_ascii_struct() |
493 | 29.5.4 write_binary_struct() |
494 | 30. Reflection API 30.1 Introduction 30.1.1 Representation 30.1.2 Structure 30.1.3 Terminology and conventions |
495 | 30.2 Type information 30.2.1 Named entities 30.2.1.1 rf_named_entity 30.2.1.2 rf_type |
496 | 30.2.2 Struct types: rf_struct |
497 | 30.2.3 Struct members |
498 | 30.2.3.1 rf_struct_member 30.2.3.2 rf_field |
499 | 30.2.3.3 rf_deep_attr 30.2.3.4 rf_method |
500 | 30.2.3.5 rf_parameter 30.2.3.6 rf_event |
501 | 30.2.3.7 rf_expect 30.2.3.8 rf_check 30.2.3.9 rf_constraint 30.2.4 Inheritance and when subtypes |
502 | 30.2.4.1 Canonical names 30.2.4.2 Explicit and significant subtypes 30.2.4.3 Generalized relationships |
503 | 30.2.4.4 rf_like_struct 30.2.4.5 rf_when_subtype |
504 | 30.2.5 List types 30.2.5.1 rf_list 30.2.5.2 rf_keyed_list 30.2.6 Scalar types 30.2.6.1 rf_scalar |
505 | 30.2.6.2 rf_numeric 30.2.6.3 rf_enum 30.2.6.4 rf_enum_item 30.2.6.5 rf_bool |
506 | 30.2.6.6 rf_real 30.2.6.7 rf_set 30.2.6.8 rf_string 30.2.7 Port types 30.2.7.1 rf_port 30.2.7.2 rf_simple_port |
507 | 30.2.7.3 rf_buffer_port 30.2.7.4 rf_event_port 30.2.7.5 rf_method_port 30.2.7.6 rf_interface_port 30.2.7.7 rf_tlm_socket 30.2.8 Sequence types 30.2.8.1 rf_sequence 30.2.8.2 rf_bfm_sequence 30.2.8.3 rf_virtual_sequence |
508 | 30.2.9 Template types 30.2.9.1 rf_template 30.2.9.2 rf_template_instance 30.2.10 Macros: rf_macro |
509 | 30.2.11 Routines: rf_routine 30.2.12 Querying for types: rf_manager |
510 | 30.3 Aspect information 30.3.1 Definition elements 30.3.1.1 Extensible entities and layers |
511 | 30.3.1.2 Anomalies of definition elements 30.3.1.3 rf_definition_element |
512 | 30.3.2 Type layers 30.3.2.1 rf_type_layer 30.3.2.2 rf_enum_layer 30.3.2.3 rf_struct_layer |
513 | 30.3.3 Struct member layers 30.3.3.1 rf_struct_member_layer 30.3.3.2 rf_method_layer |
514 | 30.3.3.3 rf_extension_mode 30.3.3.4 rf_event_layer 30.3.3.5 rf_check_layer 30.3.3.6 rf_expect_layer 30.3.3.7 rf_check_action |
515 | 30.3.3.8 rf_constraint_layer 30.3.4 Modules and packages 30.3.4.1 rf_module |
516 | 30.3.4.2 rf_package 30.3.5 Querying for aspects 30.4 Value query and manipulation |
517 | 30.4.1 Types of objects 30.4.2 Values and value holders |
518 | 30.4.3 Object operators |
519 | 30.4.4 List operators |
521 | 31. Predefined resource sharing control structs 31.1 Semaphore methods |
522 | 31.2 How to use the semaphore struct 31.2.1 up() and down() |
523 | 31.2.2 try_up() and try_down() 31.2.3 set_value() and get_value() |
524 | 31.2.4 set_max_value() and get_max_value() |
525 | 31.2.5 lock() and release() |
526 | 32. Intellectual property protection 32.1 Encryption 32.2 Decryption |
527 | 32.3 Reflection API 32.4 Encryption targets |
528 | Annex A (informative) Bibliography |
529 | Annex B (normative) Source code serialization B.1 Ordering problem in e |
530 | B.2 Within a single module B.2.1 Use scope B.2.2 Definition order |
531 | B.3 Importing and dependency |
532 | B.4 Concrete load order |
533 | B.5 Visibility scope of preprocessor directives B.5.1 Overview |
534 | B.5.2 Cases where order differs B.5.2.1 Case 1 B.5.2.2 Case 2 |
535 | B.5.3 Examples |
537 | Annex C (informative) Comparison of when and like inheritance C.1 Summary of when versus like C.1.1 A simple example of when inheritance |
539 | C.1.2 A simple example of like inheritance |
540 | C.2 Advantages of using when inheritance for modeling C.2.1 Determinant fields can be explicitly referenced |
541 | C.2.2 Multiple orthogonal subtypes can be used |
542 | C.2.3 Lists of objects with varying subtypes can be used |
543 | C.2.4 The struct can be extended later C.2.5 A new type can be created by simple extension C.3 Advantages of using like inheritance |
544 | C.4 When to use like inheritance |
545 | Annex D (normative) Name spaces D.1 The naming problem in e D.2 Resolution overview D.2.1 Packages as name spaces D.2.2 Name spaces for other named entities |
546 | D.2.3 Name resolution D.2.4 The use relation D.2.5 Reserved type names D.3 Qualified and unqualified names D.3.1 Name rules |
547 | D.3.2 Type reference resolution D.3.3 e_core types D.4 Use relation |
548 | D.4.1 Load clusters D.4.2 Examples D.4.2.1 Example 1 |
549 | D.4.2.2 Example 2 D.4.2.3 Example 3 |
550 | D.5 Built-in APIs D.5.1 Reflection and name spaces D.5.2 Coverage callback support |
551 | D.6 Code comparison |
553 | Annex E (informative) Reflection API examples E.1 Type information interface |
554 | E.2 Aspect information interface |
555 | E.3 Value query interface |
557 | Annex F (informative) Encryption targets F.1 Files F.2 IP Components |
IEEE 1647-2016
$280.04
IEEE Standard for the Functional Verification Language e
Published By | Publication Date | Number of Pages |
IEEE | 2016 |
Revision Standard – Superseded. 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 |
---|---|
18 | Part-1 |
402 | Part 2 |