Creating UVM Tests Dynamically
Everyone who uses UVM knows that using the library ofter requires large amounts of boilerplate code. Tests are no exception.
Everyone who uses UVM knows that using the library ofter requires large amounts of boilerplate code. Tests are no exception.
Announcement The Verification Gentleman Blog will be moving from Blogger. Why? While Blogger was a great platform to start on, especially considering the fa...
I've talked a lot about constrained random verification on the blog, but now it's time to branch out to formal verification. As a fun first post on the topic...
Simulation is currently the dominant functional verification technique, with constrained random verification the most widely used methodology. While producin...
One trend over the past few years is that the projects I've been working on tend to get bigger and more complicated. Bigger projects come with new challenges...
After a pretty long absence, it’s finally time to complete the series on unit testing interface UVCs. I meant to write this post in October/November 2016. Wh...
In the previous post we looked at how we can emulate sequencer/driver communication using a lightweight stub of uvm_sequencer. Let's also look at some more t...
It's that time again when I've started a new project at work. Since we're going to be using some new proprietary interfaces in this chip, this calls for some...
I've been writing more and more SystemVerilog assertions (SVAs) lately. I find that they are the best way to capture temporal requirements, allowing the rest...
We've already looked at how to interrogate classes about what variables they have and how to set and get the values of these variables in different instances...
In the previous post we saw that it's possible to use the Verilog Programming Interface (VPI) to programmatically get information about classes. For example,...
Reflection is a mechanism that allows "inspection of classes, interfaces, fields and methods at runtime without knowing the names of the interfaces, fields, ...
A lot traffic coming from Google to the blog is from searches about setting the UVM drain time. That's because one of my first posts was about how to set the...
Every now and again I stumble upon a situation where it's natural to use an abstract class. A typical example is when working with parameterized classes and ...
Two weeks ago, Aurelian from AMIQ published a post on how to solve the so-called Einstein's puzzle using e. At the end, he challenged us readers to try and i...
Some time ago I wrote a post that challenged some of the established coding conventions of modern SystemVerilog. In particular, I expressed my displeasure wi...
As I already mentioned, I gave a talk at DVCon Europe this year on how to implement burst accesses to memories modeled using UVM_REG. The motivation for that...
I'll be giving a talk this week at DVCon Europe about how to use the UVM REG classes to verify memory sub-systems. In particular, I'll focus on how to transl...
Let's take a walk down memory lane and remember the fun times we had in college. For a few weeks at the end of the semester, though, things had to get seriou...
Developing verification environments revolves around writing checks. We need to separate the concepts of checking the DUT from checking testbench code. DUT c...
For verifying complex temporal behavior, SystemVerilog assertions (SVAs) are unmatched. They provide a powerful way to specify signal relationships over time...
A state of the art SystemVerilog simulation environment consists of two separate worlds. There is the static world, where interface and modules (including th...
In the previous post we looked at how we can use the factory to direct an existing test by changing the type of sequence items that get created by that test'...
When working with UVM, the phrase "you gotta use the factory!" gets drilled into our heads constantly. This is because in object oriented programming (OOP) e...
In parts one and two of this series we looked at how to use policy classes to implement an extendable coverage model, where ignore bins can be tweaked. The f...
In the previous post, we looked at how to use policy classes as parameters for a highly configurable coverage collector. This allows us to easily implement d...
The biggest advantage of e regarding coverage is, in my opinion, the ability to tweak the definitions of existing coverage groups by extending them from anyw...
In the old days, people had to write all of their tests by hand. With chips getting bigger and bigger, it became clear that this painstaking process couldn't...
For some time now, I've been mulling over the problem of storing register field values as enumerations. Enumerations are a very handy tool to improve code re...
It's time for another installment in the "Fun and Games with CRV" series. I love doing these posts because there's something very engaging in modeling all so...
By now, we're all pretty much convinced that reuse is essential in the semiconductor industry. Gone are the days when we built everything from scratch an re-...
When I first started out I remember reading all of these nice naming conventions for SystemVerilog. For example, when developing a new verification component...
The goal of modern verification techniques is to do as much as possible with as little code as possible. This is best done with a "write once, tweak everywhe...
This week I stumbled on an issue with the UVM base class library (BCL). I was using the register layer to access some memories and some things just didn't ad...
We're not going to be looking at any code in this post. We are, however, going to examine the impact the length of the tests we write has on various aspects ...
It's been quite a while since we've solved the zebra puzzle using SystemVerilog. In this post we'll look at another oldie, but a goldie called the n-queens p...
In their quest to come up with ever more efficient architectures, concept engineers sometimes do crazy things. Twin registers (also called multiview register...
When I started the blog last March I had no idea whether I could clearly express my thoughts in writing. I remember having to do documentation at work and ho...
We've already talked about how to handle flattened register definitions from a modeling point of view in this post. This other post also showed us that acces...
The devices that we verify often have multiple instances of a certain register type. These registers are instantiated in a regular structure inside the desig...
On my current project, I had an issue with my register definitions. Quite a few of my DUT's registers where just instances of the same register type. My vr_a...
I've been working a lot with vr_ad lately. It has a lot of nice features for modeling registers, but unfortunately not all of them are documented. I'm going ...
A well known SystemVerilog limitation is that the same literal cannot appear in more enumerated types within a package (or more precisely within a scope). L...
In the last post I talked about interface classes and how they can be used to separate what an object "can" do from "how" it does it. While using interface c...
While scouring the Web for blogs on verification, I came upon this post on Ankit Gopani's blog. He tries to shed some light on the various types of classes t...
A seemingly simple question that comes up every now and then is "How do I properly handle reserved fields in UVM RAL?". The answer seems straightforward, rig...
Earlier this month I started a new project. I'm using Specman again, so this means you'll probably see more e related posts in the future. In a previous post...
The Zebra Puzzle is a classic logic puzzle, first published by Life International in 1962. Older versions of it exist and it is also sometimes called Einstei...
A few weeks back, during a late evening, I was writing some SystemVerilog code that was declaring constraints on arrays. My brain was already powering down a...
After reading the title, some of you might be asking yourselves "What are constraints from above?". Constraints from above (CFAs) are an e term. As Reuven Na...
Register packages are an awesome tool to easily implement checks on the behavior of our DUT by holding a copy of its state inside a register model. When ever...
It is a well known fact that inside a procedural block variables can only be defined at the very beginning. Say you would have the following code: task some_...
Some time back I, like other people before me, had the realization that doing verification is a lot like doing software programming. Modern hardware verifica...
This week let's mix it up a bit and do something less work-related. Everybody probably knows what Sudoku is, but just in case you don't here's a link to the ...
A feature where SystemVerilog really shines for hardware verification is its assertion language. Making it easy to specify complex requirements in a clear an...
One of the most useful additions of OVM 2.1 was the objection mechanism. You could raise an objection when starting your main traffic sequence and drop it on...
As promised in my last post today we're going to look at how to define a custom field access policy in the UVM register package. Let's use the same access po...
A big part of verifying a design is checking its registers. A register packages is usually used to accomplish this task. It provides an abstract way of descr...
Doing constrained random verification is pretty easy on paper. You know what the transactions look like and what constraints you want to apply to their field...
I want to start things out light with a recent experience I've had using fork...join statements. My intention was to start several parallel threads inside a ...
My name is Tudor Timisescu. I am a Verification Engineer at Infineon Technologies, where I verify cryptographic co-processors and develop in house verificati...