Home > Community > Blogs > Functional Verification > my clark kent moment how i discovered aspect oriented programming in e ieee 1647
Login with a Cadence account.
Not a member yet?
Create a permanent login account to make interactions with Cadence more conveniennt.

Register | Membership benefits
Get email delivery of the Functional Verification blog (individual posts).


* Required Fields

Recipients email * (separate multiple addresses with commas)

Your name *

Your email *

Message *

Contact Us

* Required Fields
First Name *

Last Name *

Email *

Company / Institution *

Comments: *

My Clark Kent Moment – How I Discovered Aspect Oriented Programming in e (IEEE 1647)

Comments(0)Filed under: Functional Verification, Testbench simulation, Verification methodology , SoC, eRM, SystemVerilog, IES, Specman, IEEE 1647, hvl, verification, Incisive, uvm, testbench, simulation, coverage, universal verification methodology, YouTube, uvmworld.org, Incisive Enterprise Simulator, video, Axel Scherer, UVM training, test generation, UVC, UVM tutorial, verification tutorial, video tutorial, Stimulus, cowbell

Growing up on VHDL, moving on to Verilog and then to SystemVerilog, I eventually discovered e (IEEE 1647)

Initially I thought: "What is the fuss all about?"

While exploring the language during the development of the cowbell videos, it hit me -- I started to recognize the power of Aspect Oriented Programming (AOP). Indeed, it is the antidote to Verification-Kryptonite!

Let me explain my newfound capabilities. When you verify complex systems you will certainly end up in situations where you have to deal with unanticipated changes to the original requirements, as well unanticipated requirements of your verification environment. These are just two of many areas where AOP can provide enormous flexibility and efficiency.

Using AOP you can take any environment, and with a flip of a finger change the behavior of any component, transaction type, coverage model or the entire system. The best part is, this can all be done without altering your existing code base. Therefore, code maintenance does not need to compete with flexibility any longer.

Consider the following situation. It is summer and the project is well underway. You are writing and running some tests and you encounter a bug. In your team, the roles and responsibilities are clearly separated and you need information that the current verification environment does not provide. However, the person owning the verification environment is on vacation.

This dilemma can have serious consequences on productivity.

Even if a backup resource for the verification environment is available it would still take time and effort to communicate what you need. In addition, you are introducing risk by altering code, and potentially adding bugs. Lastly, you are dependent on another player the team. Altogether you are in a bad place.

With AOP, however, you can mitigate the risk, break the dependencies, and create flexibility. In fact, you can add the required functionality to the verification environment from the outside, without having to bother anyone, and without touching the existing, stable environment.

To be more specific, let's say you need to log the start time when an APB transaction is driven. Traditionally, you would have to add a field to store the value of the transaction in the sequence item file, and then you have to change the method call in the BFM file. Instead, with AOP, you just create a new extension file for your particular debug purpose. For example:

// apb_trans_s.e (abridged file) - sequence item definition - unaltered

struct apb_trans_s like any_sequence_item {

   addr : uint;
   data : uint;



// apb_master_bfm.e (abridged file) - BFM definition - unaltered

unit apb_master_bfm like apb_bfm {


   drive_transaction_address (cur_transaction : apb_trans_s)

   @tf_phase_clock is {


// debug_start_time.e - (entire file) - extension with AOP

extend apb_trans_s {
   start_time: time;


extend apb_master_bfm {

   !history_list: list of

   drive_transaction_address () @clk is first {
cur_trans.start_time = sys.time; history_list.add(cur_trans); }; };

In this example you added a new field, start_time, to the sequence item and you added additional functionally to the beginning of the drive_transaction_address method of the BFM.

After you load this extension file in your next simulation run, you automagically gain new features in your environment using AOP without introducing risk to other users and without depending on another person.

After trying this on some examples I felt as if my inner Superman had been unleashed and I had gained a new superpower.

Unleash your superpower too, with AOP.

Axel Scherer
Incisive Product Expert Team
Twitter, @axelscherer


Leave a Comment

E-mail (will not be published)
 I have read and agree to the Terms of use and Community Guidelines.
Community Guidelines
The Cadence Design Communities support Cadence users and technologists interacting to exchange ideas, news, technical information, and best practices to solve problems and get the most from Cadence technology. The community is open to everyone, and to provide the most value, we require participants to follow our Community Guidelines that facilitate a quality exchange of ideas and information. By accessing, contributing, using or downloading any materials from the site, you agree to be bound by the full Community Guidelines.