SV中宏的用法总结(System Verilog Macro: A Powerful Feature for Design Verification Projects)

本文主要是介绍SV中宏的用法总结(System Verilog Macro: A Powerful Feature for Design Verification Projects),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

原文链接:https://www.design-reuse.com/articles/45979/system-verilog-macro-a-powerful-feature-for-design-verification-projects.html

System Verilog Macro: A Powerful Feature for Design Verification Projects

By Ronak Bhatt, Verification Engineer, eInfochips
System Verilog Macro: A Powerful Feature for Design Verification Projects
By Ronak Bhatt, Verification Engineer, eInfochips

For any design verification (DV) project, following best coding practices make life easier for the teammates. On the other hand, bad coding style leads to a lot of issues when the code is reused, or when it is handed over from one owner to another for any future enhancements. At times, it leads to a lot of rework and patches in the code, and makes the code really difficult to maintain in later stages of the project or for the future projects where it needs to be reused.

Quite often, while working on a design verification project, a need arises to divide a larger piece of code into a smaller chunks to make the code easier to read and debug (and also for the reusability purpose). Such smaller pieces of codes can be used at varied locations in the DV environment for multiple components/modules, etc.

Tasks and functions can be used to break the large, complex code into smaller and much simpler pieces of code which is easy to read and understand. Functions and tasks are mainly used to execute common functionality at several places in verification environment, but their usage is limited to the module or class access boundary in which they are defined. For some piece of code which is common and frequently used in different and completely isolated modules, the function/task can’t be directly reused due to their access boundary limitations.

To take a simple example, if a task-function has common code for two different monitors and for two different interfaces, a DV engineer mostly adds duplicate code in both the monitors. There are many other cases where we see code duplication. “System Verilog Macro” is one of the many solutions to address such duplication.

Such macro is very efficient and can help save a lot of time if used properly in the SV environment. This paper talks about such SV Macro and their syntaxes and also offers a few examples of where it can be used to save time during design verification.

What is a macro?

The term ‘macro’ refers to the substitution of a line or a few lines of text code. The directive “`define” creates a macro for substitution code. Once the macro is defined, it can be used anywhere in a compilation unit scope, wherever required.

It can be called by (`) character followed by the macro name. A macro can be defined with argument(s). Argument(s) are useful to customize the macro to use widely, like a function-task. Such macro argument(s) can be defined with default values so that if an DV engineer won’t pass any specific value, the macro substitutes the default value.

Macro Examples

Single line macro:在这里插入图片描述

As shown in the sample code above, macro “val” and “addition” are single line macros.

Multiline macro:
在这里插入图片描述

The above code is an example of a multiline macro. As shown above, for the multiline macro, the new line is preceded by a backslash “”. If the backslash is not present for a line, it is considered as the last line of the macro. The backslash will not be present in actual code where the macro is used and where the actual macro code is substituted.

Note: There should be no space or character after the backslash “” at the end of a line –otherwise the compiler shouts an error.

Possible syntaxes used to define a macro based on the usage of the below three special characters (quotations) along with the arguments, the actual code that it replaces has a different meaning. All possible macros can be formed using these three quotes:

  1. “``” (Double tick)

The “``” quotation can be used to form a signal/variable name by using given argument.
在这里插入图片描述

Example:

Macro definition:

在这里插入图片描述

Macro usage:

在这里插入图片描述

Actual code the macro replaces:

在这里插入图片描述

We can see the ARG1 = 3 is used to form the variable’s name. (I.e. m_mst_3 and mst_3_lcl)

  1. “`” “(Tick followed by a double quote)

The “`” “ quotation can be used to interpret the argument as a string. Example:

Macro Definition:

在这里插入图片描述

Macro usage:

在这里插入图片描述

Actual code the macro replaces:

在这里插入图片描述

We can see the ARG1 is replaced with string name “a” in the $display statement.

  1. \” “(Tick followed by backslash followed by a double quote)

The “ `\” “ quotation is used to replace the argument with an escape sequence.

Example:

Macro definition:

在这里插入图片描述

Macro usage:
在这里插入图片描述

Actual code the macro replaces:
在这里插入图片描述

We can see that the argument is replaced with “ ”reg_a” “ in the $display line which prints as “Reg name : “reg_a”, value : ‘hXYZ” when it is executed.

The below section shows basic examples of use case scenarios where the macros can be used based on the DV needs. The usages of such macro can be extended to many more use cases.

Macro usage for coverpoint(s)

If the DV engineer wants to cover walk0/walk1 pattern bins of multiple variables of same width, then he/she can create and use the macro for all such signals for which walk1/walk0 cover bins are required.

Example:

Macro definition:

在这里插入图片描述

Macro usage:
在这里插入图片描述

Macro usage for a covergroup

Many times in a verification project, there is a need to write the same coverage at different places, for example, same code in master and slave components. We can define common macro for covergroup, which can be used in all such components.

Example:

Macro definition:

在这里插入图片描述

Macro usage:

在这里插入图片描述

“STRING” is an argument to the “bus_cg_macro” macro. Covergroup, coverpoints and their bins are substituted considering the “STRING” argument wherever the macro is used.

Macro usage in SV Assertion

As with coverage, many times in DV projects, we have some common assertions which can be used at multiple places and different components.

For example, there is a need to check that in master and slave, a signal value keeps changing at every clock cycle if the reset is not present. We can define a macro and use it for both master and slave.

Macro definition:

在这里插入图片描述

Macro usage:

在这里插入图片描述

Macro usage in Test Case Code

In a self-checking register write/read test, after each read, the read value is checked against expected read data. Considering design complexity, we may have multiple blocks and for each block we may have corresponding register test. For each such test we can have a common macro for self-check.

Self-check macro:

在这里插入图片描述

Macro usage:

在这里插入图片描述

Macro usage in Procedural block

Macro to cover procedural block code which is common across multiple places.

Macro for procedural block:

在这里插入图片描述

Macro usage:

在这里插入图片描述

This paper covers a few example macros, but DV engineers can create and use similar macros as per their project requirement and for reusability purpose.

Conclusion

Using SV macro, with the proper syntaxes explained in this paper, the DV engineer can break up the larger complex code in smaller chunk and can reuse it at many places. A macro can be used anywhere in the compilation unit after it is defined. The engineer can form identifier names using macro through input arguments.

Also, he/she can reuse names which are being used by ordinary identifiers/names. For example, ‘signal_name’ and ‘`signal_name’ are treated differently. He/she can define the macro multiple times and at the time of macro call, the latest definition is read by the compiler and is considered for that call.

SV macro is one of the most powerful features out there and if used properly with a thorough understanding and applied wisely in a DV project, it can help to save a lot of time and can make the code more readable and efficient.

About the author

Ronak Bhatt is a Verification Engineer at eInfochips. He has an
industry experience of 1.8 years in ASIC Design Verification and has
working experience in IP level and Chip level functional verification.
He has hands-on experience in Functional and SVA-based verification.

这篇关于SV中宏的用法总结(System Verilog Macro: A Powerful Feature for Design Verification Projects)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/154185

相关文章

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;

git使用的说明总结

Git使用说明 下载安装(下载地址) macOS: Git - Downloading macOS Windows: Git - Downloading Windows Linux/Unix: Git (git-scm.com) 创建新仓库 本地创建新仓库:创建新文件夹,进入文件夹目录,执行指令 git init ,用以创建新的git 克隆仓库 执行指令用以创建一个本地仓库的

二分最大匹配总结

HDU 2444  黑白染色 ,二分图判定 const int maxn = 208 ;vector<int> g[maxn] ;int n ;bool vis[maxn] ;int match[maxn] ;;int color[maxn] ;int setcolor(int u , int c){color[u] = c ;for(vector<int>::iter

整数Hash散列总结

方法:    step1  :线性探测  step2 散列   当 h(k)位置已经存储有元素的时候,依次探查(h(k)+i) mod S, i=1,2,3…,直到找到空的存储单元为止。其中,S为 数组长度。 HDU 1496   a*x1^2+b*x2^2+c*x3^2+d*x4^2=0 。 x在 [-100,100] 解的个数  const int MaxN = 3000

状态dp总结

zoj 3631  N 个数中选若干数和(只能选一次)<=M 的最大值 const int Max_N = 38 ;int a[1<<16] , b[1<<16] , x[Max_N] , e[Max_N] ;void GetNum(int g[] , int n , int s[] , int &m){ int i , j , t ;m = 0 ;for(i = 0 ;

bytes.split的用法和注意事项

当然,我很乐意详细介绍 bytes.Split 的用法和注意事项。这个函数是 Go 标准库中 bytes 包的一个重要组成部分,用于分割字节切片。 基本用法 bytes.Split 的函数签名如下: func Split(s, sep []byte) [][]byte s 是要分割的字节切片sep 是用作分隔符的字节切片返回值是一个二维字节切片,包含分割后的结果 基本使用示例: pa

go基础知识归纳总结

无缓冲的 channel 和有缓冲的 channel 的区别? 在 Go 语言中,channel 是用来在 goroutines 之间传递数据的主要机制。它们有两种类型:无缓冲的 channel 和有缓冲的 channel。 无缓冲的 channel 行为:无缓冲的 channel 是一种同步的通信方式,发送和接收必须同时发生。如果一个 goroutine 试图通过无缓冲 channel

9.8javaweb项目总结

1.主界面用户信息显示 登录成功后,将用户信息存储在记录在 localStorage中,然后进入界面之前通过js来渲染主界面 存储用户信息 将用户信息渲染在主界面上,并且头像设置跳转,到个人资料界面 这里数据库中还没有设置相关信息 2.模糊查找 检测输入框是否有变更,有的话调用方法,进行查找 发送检测请求,然后接收的时候设置最多显示四个类似的搜索结果

java面试常见问题之Hibernate总结

1  Hibernate的检索方式 Ø  导航对象图检索(根据已经加载的对象,导航到其他对象。) Ø  OID检索(按照对象的OID来检索对象。) Ø  HQL检索(使用面向对象的HQL查询语言。) Ø  QBC检索(使用QBC(Qurey By Criteria)API来检索对象。 QBC/QBE离线/在线) Ø  本地SQL检索(使用本地数据库的SQL查询语句。) 包括Hibern