注:更多、更详细的相关博文请在博主的个人公众号中查看。公众号:FPGA动力联盟

宏define提供用一个相对简单的文字来表示一大段真正有意义的文字作用。换句话说,就是综合软件见到定义的宏,就用这个宏代表的文字替代这个宏的位置,这就是一个文字替代的工作。之后,综合软件再按照替代之后的代码来综合出电路。

简单而言,宏定义就是起到一个速记员的作用。它不会使代码优化,但会使得代码的规模变小。

宏定义的格式是:

'define macro_name(formal_argu_list) macro_text

其中:

“'define”是宏定义的标志,告诉综合软件这是一个宏定义。请注意有开头符号“'”。

“macro_name”是代码设计人员给这个宏定义起的名字,只要符合verilog的起名规则即可。

“macro_text”是宏定义被综合软件重新替代的内容。

“formal_argu_list”是宏定义可能的输入参数,里面可以有多个输入。在综合软件处理宏时,这些变量可以取代“macro_text”里对应的内容。当不需要参数时,可以省略这一项。

定义宏语句的最后是没有分号“;”的,这点我们要特别注意。如果不小心加了分号,那么这个分号会被综合软件视为“macro_text”的一部分参与替代工作。

宏定义在代码里被调用的格式是:

'macro_name(formal_argu_list)

注意前面也有符号“'”。

例子1:利用宏定义变量的位宽

'define BIT_WIDTH 8  ……reg['BIT_WIDTH-1:0] bit_variable;//reg [7:0] bit_variable

例子2:利用宏定义仿真时延

'define DELAY(delay_time) #(delay_time)  …… assign 'DELAY(10) a=b; //#(10) a= b

下面总结一下define用法的细节:

1,宏名建议用大写字母表示,以与变量名区分;

2,'define定义既可以在模块定义内部,也可以出现在模块定义外部。其定义的有效范围为定义命令之后到本文件结束。通常,'define命令写在模块定义的外面,作为程序的一部分,在此代码内有效;

3,在引用已定义的宏名时,必须在宏名前面加上符号“'”,表示该名字是一个经过宏定义的名字;

4,使用宏名替代一个字符串,可以减少代码中重复书写某些字符串的工作量。当代码需要改变某一个变量时,可以只改变'define命令行,一改全改,提高代码的可移植和可读性;

5,宏定义只是用宏名替代一个字符串,也就是简单的置换,不做语法检查,不管含义是否正确,综合器照样代入。只有在编译已被宏替代后的源代码时才报错;

6,宏定义不是verilog语句,不必在行末加分号;

7,进行宏定义时,可以引用已定义的宏名;

8,宏名和宏内容必须在同一行中进行声明。如果宏内容中包括注释行,注释行不会被置换;

9,只对那些确实需要全局定义的而且不会被其它设计更改的标识符才使用宏定义;

10,尽量不要对那些只在模块内使用的常量使用宏定义,应该用localparam定义;

11,如有可能,就把所有的宏定义放到一个宏定义文件(例如global_define.h),而且在编译时要先用 ’include ” global_define.h”读这个文件,这样保证了在需要这些宏定义的时候,它们就已经存在;

12,可以使用c语言中宏定义的技巧(打开stdio.h看看)来编写verilog宏定义文件,使得宏定义只被定义一次,不会出现重复定义的情况,即使这个文件被多个文件’include,例如:

'ifndef _abcnco   'define _abcnco 8   ……'endif

另外还有非常重要一点:组成宏内容的字符串不能被以下语句记号隔离:注释行、数字、字符串、确认符、关键字、双目和三目运算符。比如下面这个例子3:

例子3:宏定义被错误隔离

'define WRONG_NUM 8 …… assign a = 'WRONG_NUM4;

//错误!综合器不会认为是84,会认为WRONG_NUM4是一个宏变量!

最后再强调一点:宏定义的作用范围由宏定义开始,对后续读入的文件始终保持有效,直到另一个宏定义改变这个宏定义的值,或者使用’undef取消这个宏定义。由于宏定义对后续读入的文件保持有效,所以通常要求按一定的顺序编译文件。

参考文献:

1,verilog传奇——从电路出发的HDL代码设计

2,verilog编程艺术

21,verilog之宏define介绍相关推荐

  1. (15)Verilog HDL宏定义:define

    (15)Verilog HDL宏定义:define 1.1 目录 1)目录 2)FPGA简介 3)Verilog HDL简介 4)Verilog HDL宏定义:define 5)结语 1.2 FPGA ...

  2. linux c程序加args,C/C++可变参数,“## __VA_ARGS__”宏的介绍和使用

    在阅读代码的时候,在一个宏定义语句中,发现了个之前未曾见过的编译器预定义宏:"__VA_ARGS__".当时,从代码语句中推测它代表宏参数:"-"(本文称之为省 ...

  3. VC中的宏 (#define) 与预处理 (#if/#ifdef/#pragma) 的使用方法总结。

    C/C++ 预定义宏 例子:C/C++ 预定义宏的取值 C/C++ 预定义宏用途:诊断与调试输出 CRT 的诊断与调试输出:assert, _ASSERT/_ASSERTE, _RPTn/_RPTFn ...

  4. SolidWorks宏工具介绍——初识宏工具

    SolidWorks宏工具介绍--初识宏工具 Hello,大家好,我是"京扬三维"的团宠小京.在我们做开发项目的过程中,经常收到小伙伴的反馈,希望学习下SolidWorks二次开发 ...

  5. 优秀的 Verilog/FPGA开源项目介绍(七)- CAN通信

    优秀的 Verilog/FPGA开源项目介绍(七)- CAN 0.CAN总线介绍 <[科普]CAN总线介绍及FPGA实现方案简介> 1.CAN权威文档 CAN总线有两个ISO国际标准:IS ...

  6. 优秀的 Verilog/FPGA开源项目介绍(十二)- 玩FPGA不乏味

    优秀的 Verilog/FPGA开源项目介绍(十二)- 玩FPGA不乏味 Hello,大家好,之前给大家分享了大约一百多个关于FPGA的开源项目,涉及PCIe.网络.RISC-V.视频编码等等,这次给 ...

  7. 优秀的 Verilog/FPGA开源项目介绍(一)-PCIe通信

    优秀的 Verilog/FPGA开源项目介绍(一)-PCIe通信 今天开始会陆续介绍一些优秀的开源项目,项目基本都是和FPGA或HDL相关的.对于一些找工作或者急需项目经验的人来说,这些项目都有一定的 ...

  8. 优秀的 Verilog/FPGA开源项目介绍(二)-RISC-V

    优秀的 Verilog/FPGA开源项目介绍(二)-RISC-V 关于RISC-V的二三事 risc-v官网 ❝ https://riscv.org/ RISC-V(跟我读:"risk--- ...

  9. 优秀的 Verilog/FPGA开源项目介绍(二十八)- DSP(Digital Signal Processing)

    优秀的 Verilog/FPGA开源项目介绍(二十八)- DSP(Digital Signal Processing) 介绍 FPGA在数字信号处理领域一直有着比通用CPU得天独厚的优势,所以一直都受 ...

最新文章

  1. 使用Spring MVC HandlerExceptionResolver处理异常
  2. Git cherry-pick 使用总结
  3. 多径信道理论的直观感受与MATLAB仿真
  4. java 可用内存_总可用内存java
  5. 记录安装php与apache不兼容的过程
  6. 微服务的正确理解方式
  7. 【Web】JavaWeb项目为什么我们要放弃jsp?为什么要前后端解耦?为什么要前后端分离?2.0版,为分布式架构打基础。 - CSDN博客
  8. 《手机测试Robotium实战教程》——导读
  9. 服务器性能估算参考(硬件-应用服务器)
  10. 笔记本电脑投屏到电视_电脑怎么投屏到电视?掌握这3个方法就够了
  11. 制造跨度 makespan是什么
  12. 牛腩新闻发布系统-真假分页
  13. 安装 | MATLAB2018a (64位) 安装教程及安装包下载链接
  14. html5用本地存储做留言板,带有本地存储功能的留言板js代码
  15. 深度学习——分类网络的总结(持续更新ing~)
  16. 开机黑屏显示html,开机黑屏显示“This Product is covered by”解决方法
  17. 【视频演示】B站视频演示
  18. 在anaconda中安装tensorflow
  19. 多元正态分布的性质和定理
  20. matlab基础05

热门文章

  1. 2023健身俱乐部会员管理系统的 设计与实现(论文+开题报告+运行)
  2. tkinter库绘图实例14:利用鼠标控制图形放大和缩小效果
  3. C语言自学记录-Class4-流程控制(重点)
  4. dom4j java_DOM4J
  5. 《视觉SLAM十四讲精品总结》Viz教程
  6. 论文综述的重要性及写作
  7. android10比9,十年巨变 Android 1.0对比Android 9
  8. 如何使用smb共享文件(win10),可多人同时下载
  9. ueditor编辑器只上传视频video时,获取内容为空
  10. bigpipe nodejs实现