Home > Articles > Programming

Basic e Concepts

This chapter is from the book

This chapter is from the book

In this chapter we discuss the basic constructs and conventions in e. These conventions and constructs are used throughout the later chapters. These conventions provide the necessary framework for understanding e. This chapter may seem dry, but understanding these concepts is a necessary foundation for the successive chapters.

Chapter Objectives

  • Understand conventions for code segments, comments, white space, numbers, constants, and macros.

  • Describe how to import other e files.

  • Define the data types such as scalar type and subtypes, enumerated scalar type, list type, and string type.

  • Understand syntax hierarchy of statements, struct members, actions, and expressions.

  • Explain the use of simulator variables in e.

3.1 Conventions

e contains a stream of tokens. Tokens can be comments, delimiters, numbers, constants, identifiers, and keywords. e is a case-sensitive language. All keywords are in lowercase.

3.1.1 Code Segments

A code segment is enclosed with a begin-code marker <' and an end-code marker '>. Both the begin-code and the end-code markers must be placed at the beginning of a line (leftmost), with no other text on that same line (no code and no comments). The example below shows three lines of code that form a code segment.

    import cpu_test_env;

Several code segments can appear in one file. Each code segment consists of one or more statements.

3.1.2 Comments and White Space

e files begin as a comment which ends when the first begin-code marker <' is encountered.

Comments within code segments can be marked with double dashes (--) or double slashes (//).

a = 5;        -- This is an inline comment
b = 7;        // This is also an inline comment

The end-code '> and the begin-code <' markers can be used in the middle of code sections, to write several consecutive lines of comment.

Import the basic test environment for the CPU...
This is a comment

    import cpu_test_env;

This particular test requires the code that bypasses bug#72 as well as the constraints
graphics/ccc.gif that focus on the immediate instructions. This is a comment
   import bypass_bug72;
   import cpu_test0012;

3.1.3 Numbers

There are two types of numbers, sized and unsized. Unsized Numbers

Unsized numbers are always positive and zero-extended unless preceded by a hyphen. Decimal constants are treated as signed integers and have a default size of 32 bits. Binary, hex, and octal constants are treated as unsigned integers, unless preceded by a hyphen to indicate a negative number, and have a default size of 32 bits.

The notations shown in Table 3-1 can be used to represent unsized numbers.

Table 3-1. Representing Unsized Numbers in Expressions


Legal Characters


Decimal integer

Any combination of 0-9 possibly preceded by a hyphen - for negative numbers. An underscore (_) can be added anywhere in the number for readability.

12, 55_32, -764

Binary integer

Any combination of 0-1 preceded by 0b. An underscore (_) can be added anywhere in the number for readability.

0b100111, 0b1100_0101

Hexadecimal integer

Any combination of 0-9 and a-f preceded by 0x. An underscore (_) can be added anywhere in the number for readability.

0xff, 0x99_aa_bb_cc

Octal integer

Any combination of 0-7 preceded by 0o. An underscore (_) can be added anywhere in the number for readability.


K (kilo: multiply by 1024)

A decimal integer followed by a K or k. For example, 32K = 32768.

32K, 32k, 128k

M (mega: multiply by 1024*1024)

A decimal integer followed by an M or m. For example, 2m = 2097152.

1m, 4m, 4M Sized Numbers

A sized number is a notation that defines a literal with a specific size in bits. The syntax is:

width-number ' (b|o|d|h|x) value-number;

The width number is a decimal integer specifying the width of the literal in bits. The value number is the value of the literal and it can be specified in one of four radixes, as shown in Table 3-2.

If the value number is more than the specified size in bits, its most significant bits are ignored. If the value number is less that the specified size, it is padded by zeros.

Table 3-2. Radix Specification Characters


Represented By



A leading 'b or 'B



A leading 'o or 'O



A leading 'd or 'D



A leading 'h or 'H or 'x or 'X


3.1.4 Predefined Constants

A set of constants is predefined in e, as shown in Table 3-3.

Table 3-3. Predefined Constants




For boolean variables and expressions


For boolean variables and expressions


For structs, specifies a NULL pointer; for character strings, specifies an empty string


UNDEF indicates NONE where an index is expected


Represents the largest 32-bit int (231 -1)


Represents the largest negative 32-bit int (-231)


Represents the largest 32-bit uint (232-1) Literal String

A literal string is a sequence of zero or more ASCII characters enclosed by double quotes (“ “). The special escape sequences shown in Table 3-4 are allowed.

Table 3-4. Escape Sequences in Strings

Escape Sequence














This example shows escape sequences used in strings. Although other constructs are introduced here only for the sake of completeness, please focus only on the string syntax.

extend sys {

    m() is {
        var header: string = //Define a string variable
          "Name\tSize in Bytes\n----\t-------------\n";
        var p: packet = new;
        var pn: string = p.type().name;
        var ps: uint = p.type().size_in_bytes;
        outf("%s%s\t%d", header, pn, ps);

The result of running the example above is shown below.

Specman> sys.m()
   Name    Size in Bytes
   ----    -------------
   packet  20

3.1.5 Identifiers and Keywords

The following sections describe the legal syntax for identifiers and keywords. Legal e Identifiers

User-defined identifiers in e code consist of a case-sensitive combination of any length of the characters A-Z, a-z, 0-9, and underscore. They must begin with a letter. Identifiers beginning with an underscore have a special meaning in e and are not recommended for general use. Identifiers beginning with a number are not allowed.

The syntax of an e module name (a file name) is the same as the syntax of UNIX file names, with the following exceptions.

  • '@' and '~' are not allowed as the first character of a file name.

  • '[', ']', '{', '}' are not allowed in file names.

  • Only one '.' is allowed in a file name. e Keywords

The keywords listed in Table 3-5 below are the reserved words of the e language. Some of the terms are keywords only when used together with other terms, such as “key” in “list(key:key)”, “before” in “keep gen x before y”, or “computed” in “define def as computed.

Table 3-5. List of Keywords

all of



as a













c export



check that







cvl call

cvl callback

cvl method







down to













first of






hdl pathname








is a

is also

is c routine

is empty

is first

is inline

is instance

is not a

is not empty

is only

is undefined







list of







not in





















state machine



















verilog code

verilog function

verilog import

verilog simulator

verilog task

verilog time

verilog timescale

verilog trace

verilog variable

vhdl code

vhdl driver

vhdl function

vhdl procedure

vhdl driver

vhdl simulator

vhdl time






3.1.6 Macros

The simplest way to define e macros is with the define statement. An e macro can be defined with or without an initial ` character.

define WORD_WIDTH 16; //Definition of the WORD_WIDTH macro
struct t {
    f: uint (bits: WORD_WIDTH); //Usage of WORD_WIDTH macro

You can also import a file with Verilog 'define macros using the keywords verilog import.

macros.v (Verilog defines file)
   `define BASIC_DELAY   2
   `define WORD_WIDTH 8
   dut_driver.e (e file)
   verilog import macros.v; //Imports all definitions from
   //macros.v file
   //Macros imported from Verilog must be used
   //with a preceding '.
   struct dut_driver {
   ld: list of int(bits: `WORD_WIDTH); //use verilog macro
   keep ld.size() in [1..'TRANS_DELAY];//use verilog macro

3.1.7 Importing e Files

e files are called modules. An e file can import another e file using the import keyword. The import statement loads additional e modules before continuing to load the current file. If no extension is given for the imported file name, a “.e” extension is assumed. The modules are loaded in the order they are imported. The import statements must be before any other statements in the file.

//File Name: pci_transaction_definition.e
type PCICommandType: [ IO_READ=0x2, IO_WRITE=0x3,
                        MEM_READ=0x6, MEM_WRITE=0x7 ];
struct pci_transaction {
    address: uint;
    command: PCICommandType;
    bus_id: uint;
//End File: pci_transaction_definition.e
//File Name: pci_transaction_extension.e
//Import the file defined above. Note that the .e
//extension is assumed in an import statement
import pci_transaction_definition; //.e extension is the default

extend pci_transaction {
    data: list of uint;
//End File: pci_transaction_extension.e

If a specified module has already been loaded or compiled, the statement is ignored. For modules not already loaded or compiled, the search sequence is:

  1. The current directory

  2. Directories specified by the SPECMAN_PATH1 environment variable

  3. The directory in which the importing module resides

InformIT Promotional Mailings & Special Offers

I would like to receive exclusive offers and hear about products from InformIT and its family of brands. I can unsubscribe at any time.


Pearson Education, Inc., 221 River Street, Hoboken, New Jersey 07030, (Pearson) presents this site to provide information about products and services that can be purchased through this site.

This privacy notice provides an overview of our commitment to privacy and describes how we collect, protect, use and share personal information collected through this site. Please note that other Pearson websites and online products and services have their own separate privacy policies.

Collection and Use of Information

To conduct business and deliver products and services, Pearson collects and uses personal information in several ways in connection with this site, including:

Questions and Inquiries

For inquiries and questions, we collect the inquiry or question, together with name, contact details (email address, phone number and mailing address) and any other additional information voluntarily submitted to us through a Contact Us form or an email. We use this information to address the inquiry and respond to the question.

Online Store

For orders and purchases placed through our online store on this site, we collect order details, name, institution name and address (if applicable), email address, phone number, shipping and billing addresses, credit/debit card information, shipping options and any instructions. We use this information to complete transactions, fulfill orders, communicate with individuals placing orders or visiting the online store, and for related purposes.


Pearson may offer opportunities to provide feedback or participate in surveys, including surveys evaluating Pearson products, services or sites. Participation is voluntary. Pearson collects information requested in the survey questions and uses the information to evaluate, support, maintain and improve products, services or sites, develop new products and services, conduct educational research and for other purposes specified in the survey.

Contests and Drawings

Occasionally, we may sponsor a contest or drawing. Participation is optional. Pearson collects name, contact information and other information specified on the entry form for the contest or drawing to conduct the contest or drawing. Pearson may collect additional personal information from the winners of a contest or drawing in order to award the prize and for tax reporting purposes, as required by law.


If you have elected to receive email newsletters or promotional mailings and special offers but want to unsubscribe, simply email information@informit.com.

Service Announcements

On rare occasions it is necessary to send out a strictly service related announcement. For instance, if our service is temporarily suspended for maintenance we might send users an email. Generally, users may not opt-out of these communications, though they can deactivate their account information. However, these communications are not promotional in nature.

Customer Service

We communicate with users on a regular basis to provide requested services and in regard to issues relating to their account we reply via email or phone in accordance with the users' wishes when a user submits their information through our Contact Us form.

Other Collection and Use of Information

Application and System Logs

Pearson automatically collects log data to help ensure the delivery, availability and security of this site. Log data may include technical information about how a user or visitor connected to this site, such as browser type, type of computer/device, operating system, internet service provider and IP address. We use this information for support purposes and to monitor the health of the site, identify problems, improve service, detect unauthorized access and fraudulent activity, prevent and respond to security incidents and appropriately scale computing resources.

Web Analytics

Pearson may use third party web trend analytical services, including Google Analytics, to collect visitor information, such as IP addresses, browser types, referring pages, pages visited and time spent on a particular site. While these analytical services collect and report information on an anonymous basis, they may use cookies to gather web trend information. The information gathered may enable Pearson (but not the third party web trend services) to link information with application and system log data. Pearson uses this information for system administration and to identify problems, improve service, detect unauthorized access and fraudulent activity, prevent and respond to security incidents, appropriately scale computing resources and otherwise support and deliver this site and its services.

Cookies and Related Technologies

This site uses cookies and similar technologies to personalize content, measure traffic patterns, control security, track use and access of information on this site, and provide interest-based messages and advertising. Users can manage and block the use of cookies through their browser. Disabling or blocking certain cookies may limit the functionality of this site.

Do Not Track

This site currently does not respond to Do Not Track signals.


Pearson uses appropriate physical, administrative and technical security measures to protect personal information from unauthorized access, use and disclosure.


This site is not directed to children under the age of 13.


Pearson may send or direct marketing communications to users, provided that

  • Pearson will not use personal information collected or processed as a K-12 school service provider for the purpose of directed or targeted advertising.
  • Such marketing is consistent with applicable law and Pearson's legal obligations.
  • Pearson will not knowingly direct or send marketing communications to an individual who has expressed a preference not to receive marketing.
  • Where required by applicable law, express or implied consent to marketing exists and has not been withdrawn.

Pearson may provide personal information to a third party service provider on a restricted basis to provide marketing solely on behalf of Pearson or an affiliate or customer for whom Pearson is a service provider. Marketing preferences may be changed at any time.

Correcting/Updating Personal Information

If a user's personally identifiable information changes (such as your postal address or email address), we provide a way to correct or update that user's personal data provided to us. This can be done on the Account page. If a user no longer desires our service and desires to delete his or her account, please contact us at customer-service@informit.com and we will process the deletion of a user's account.


Users can always make an informed choice as to whether they should proceed with certain services offered by InformIT. If you choose to remove yourself from our mailing list(s) simply visit the following page and uncheck any communication you no longer want to receive: www.informit.com/u.aspx.

Sale of Personal Information

Pearson does not rent or sell personal information in exchange for any payment of money.

While Pearson does not sell personal information, as defined in Nevada law, Nevada residents may email a request for no sale of their personal information to NevadaDesignatedRequest@pearson.com.

Supplemental Privacy Statement for California Residents

California residents should read our Supplemental privacy statement for California residents in conjunction with this Privacy Notice. The Supplemental privacy statement for California residents explains Pearson's commitment to comply with California law and applies to personal information of California residents collected in connection with this site and the Services.

Sharing and Disclosure

Pearson may disclose personal information, as follows:

  • As required by law.
  • With the consent of the individual (or their parent, if the individual is a minor)
  • In response to a subpoena, court order or legal process, to the extent permitted or required by law
  • To protect the security and safety of individuals, data, assets and systems, consistent with applicable law
  • In connection the sale, joint venture or other transfer of some or all of its company or assets, subject to the provisions of this Privacy Notice
  • To investigate or address actual or suspected fraud or other illegal activities
  • To exercise its legal rights, including enforcement of the Terms of Use for this site or another contract
  • To affiliated Pearson companies and other companies and organizations who perform work for Pearson and are obligated to protect the privacy of personal information consistent with this Privacy Notice
  • To a school, organization, company or government agency, where Pearson collects or processes the personal information in a school setting or on behalf of such organization, company or government agency.


This web site contains links to other sites. Please be aware that we are not responsible for the privacy practices of such other sites. We encourage our users to be aware when they leave our site and to read the privacy statements of each and every web site that collects Personal Information. This privacy statement applies solely to information collected by this web site.

Requests and Contact

Please contact us about this Privacy Notice or if you have any requests or questions relating to the privacy of your personal information.

Changes to this Privacy Notice

We may revise this Privacy Notice through an updated posting. We will identify the effective date of the revision in the posting. Often, updates are made to provide greater clarity or to comply with changes in regulatory requirements. If the updates involve material changes to the collection, protection, use or disclosure of Personal Information, Pearson will provide notice of the change through a conspicuous notice on this site or other appropriate way. Continued use of the site after the effective date of a posted revision evidences acceptance. Please contact us if you have questions or concerns about the Privacy Notice or any objection to any revisions.

Last Update: November 17, 2020