21,verilog之宏define介绍

2023-11-20

注:学习、交流就在博主的个人weixin公众号 “FPGA动力联盟” 留言或直接+博主weixin “fpga_start” 私信~

宏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编程艺术 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

21,verilog之宏define介绍 的相关文章

  • 在 Verilog 中生成 For 循环中实例化模块

    我正在尝试使用 Verilog 实例化一些模块generate块 因为我将实例化可变数量的它们 genvar i generate for i 1 i lt 10 i i 1 begin status whatever status clk
  • 如何在 Verilog 中将长语句分成行

    例如 我有一个很长的声明 display input data x output data x result x input data output data result 如何在 Verilog 中将其变成单语句和多行 您需要分解引用的字
  • Spartan-3E 上的随机数生成

    我需要在 Spartan 3E FPGA 上为我的遗传算法生成伪随机数 并且我想在 verilog 中实现它 您能给我任何关于此的指示吗 当然 Adam 的随机生成器是不可合成的 您必须显式创建一个LFSR 以下示例可能会有所帮助 它是一个
  • 为什么我的输出没有被赋值?

    我正在为一个更大项目的一部分开发解码器 我有两个计数器充当该模块的输入 其中一个计数器计数 0 15 另一个计数器在第一个计数器达到 15 时递增一次 根据计数器的值 解码器输出不同的值 通常它是 0 1 或 1 但有时它必须是 0 707
  • 计算数组中的个数

    我试图在 Verilog 中计算 4 位二进制数中 1 的数量 但我的输出是意外的 我尝试了几种方法 这是我认为应该有效的方法 但事实并非如此 module ones one in input 3 0 in output 1 0 one a
  • 带有always_comb结构的Systemverilog问题

    我对这个 SystemVerilog 代码有疑问 这是代码 module mult multiplicand multiplier Product clk clear Startm endm input 31 0 multiplicand
  • 使用多路复用器进行双向移位

    编辑 仅通过屏幕截图 http prntscr com lv3uqw http prntscr com lv3yhf 和我下面的代码 您仍然可以在这里理解我的目标 以防万一您不想阅读文本 我正在尝试为通用移位寄存器编写 Verilog 代码
  • Verilog HDL ?操作员

    什么是 用 Verilog 做什么 例如 以下命令是什么意思 input first din input 7 0 din output 127 0 parity reg 127 0 parity wire 7 0 feedback assi
  • EDAplayground 中不显示时钟波形

    当尝试在 EDA Playground 中显示时钟波形时 出现错误 执行中断或达到最大运行时间 如何显示波形 EDA Playground 上的代码 module test reg clk initial begin dumpfile du
  • 如何在RTL中使用时钟门控?

    我正在对一些时钟进行门控latch以及我设计中的逻辑 我在综合和布局布线方面没有太多经验 在 RTL 中实现时钟门控的正确方法是什么 示例1 always comb begin gated clk clk latch update en e
  • verilog 中的“<<”运算符

    我有一个verilog代码 其中有一行如下 parameter ADDR WIDTH 8 parameter RAM DEPTH 1 lt lt ADDR WIDTH 这里将存储什么RAM DEPTH以及什么是 lt lt 操作员在这里做
  • 如何获取值数组作为 plusargs?

    如何获取值数组作为参数 我需要从命令行获取一组未定义大小的命令 如何将这些参数放入数组或队列中 Eg CMDS READ WRITE READ N WRITE 它应该被带到一个数组中 value plusargs不支持数组 但支持字符串 看
  • 从测试台访问 uvm_config_db 的最佳方式?

    我想在我的顶级测试平台中创建一个时钟 其周期可以通过测试进行控制 我所做的是将周期设置到 uvm config db 中并将其返回到测试台中 我必须输入 1 以确保构建阶段已完成 否则 get 返回错误值 module testbench
  • 在verilog中将wire值转换为整数

    我想将电线中的数据转换为整数 例如 wire 2 0 w 3 b101 我想要一个将其转换为 5 并将其存储在整数中的方法 我怎样才能以比这更好的方式做到这一点 j 1 for i 0 i lt 2 i i 1 begin a a w i
  • 如何将时钟门映射到技术库单元

    我的设计中有以下时钟门 module my clkgate clko clki ena Clock gating latch triggered on the rising clki edge input clki input ena ou
  • 始终块中的 Veriloggenerate/genvar

    我试图让一个模块通过 ISE 12 4 中的语法检查 但它给了我一个我不明白的错误 首先是代码片段 parameter ROWBITS 4 reg ROWBITS 1 0 temp genvar c generate always pose
  • 向左旋转 verilog 大小写

    我的任务是用verilog编写一个16位ALU 当我做需要旋转操作数和进行2的补码加法和减法的部分时 我发现了困难 我知道如何用纸和铅笔解决这个问题 但我无法弄清楚如何在 Verilog 中做到这一点 例如 A表示为a15 a14 a13
  • 开始后跟冒号和变量是什么意思?

    什么是data mux意思是这里 它只是块的名称吗 if PORT CONFIG 32 P0 1 b1 begin data mux end 这些是块名称 它们特别适用于generate块 例如 您可以定义一个generate块如 genv
  • 如何在Verilog中将二维数组中的所有位设置为0?

    我构建了一个 8 2bits 数组来表示 Verilog 中的一块内存 reg 1 0 m 0 7 该存储器有一个复位信号 如果复位为1 则该存储器中的所有位都应重置为0 但是我不知道如何以简洁的方式设置m的所有位 因为如果有数百个内存中有
  • 具有内部赋值延迟的阻塞和非阻塞语句之间的区别

    以下 2 个 verilog 代码片段有什么区别 1 always in out 5 in AND 2 always in out lt 5 in 考虑到always块中不存在其他行 输出会有什么不同吗 问题参考幻灯片 16 参见 o5 和

随机推荐

  • 安装tensorflow version `CXXABI_1.3.7' not found

    现象 ImportError usr lib64 libstdc so 6 version CXXABI 1 3 7 not found required by root anaconda3 lib python3 6 site ntern
  • mybatis+oracle+map入参,并获取主键ID的返回值

    insert id insert parameterType map useGeneratedKeys true keyProperty id gt insert into person name pswd values name pswd
  • 第五章 Gateway--服务网关

    接上一篇文章开始网关之旅 首先告诉大家网关是什么 Gateway简介 怎么配置 怎么入门 执行流程等等相关介绍 第一章 微服务的架构介绍发展第二章 微服务环境搭建第三章 Nacos Discovery 服务治理第四章 Sentinel 服务
  • 基于深度学习的关系抽取综述

    论文 https arxiv org pdf 1705 03645 pdf 一 介绍 信息抽取是NLP的一个基本任务 从非结构化文本中抽取机器或程序能够理解的结构化知识 信息抽取包括以下子任务 NER 关系抽取 事件抽取等等 本文中 我们着
  • Java list判空

    if null list list size 0 list isEmpty 和list size 0 没有区别 isEmpty 判断有没有元素 而size 返回有几个元素 如果判断一个集合有无元素 建议用isEmpty 方法 这清晰 简明
  • 0基础,自学3个月转行软件测试,从月薪3k到12k我整理的超全学习指南

    大家好我是小娜 现在是一名软件测试测试工程师 工资在1w2阶段还需努力 我大学期间学的是电气工程及其自动化专业 可以说是一事无成哈哈 大学三天打鱼 两天筛网导致专业水平学的不怎么样 毕业后从事了一份销售 买房子 的工作 但是 销售工作压力大
  • GIT代码仓库迁移

    GIT代码仓库迁移 保留原有的提交记录 查看原有提交路径 git remote v 变更为新的提交路径 git remote set url origin 新路径 拉取新路径下的内容 允许不相关历史提交 并强制合并 git pull ori
  • 亲密关系沟通-【正向情绪】创造一场愉快的沟通体验

    为什么有的时候聊天越聊越开心 有时候却让你意兴阑珊 正向情绪体验 积极议题 充分发挥 谁都喜欢被看见 让他不断得到关注 得到你持续的关注 你知道吗 我这个月业绩第一 哇 你超棒的 哪里哪里 话题聊不下去 你给他夸奖 他只能谦虚 天哪你怎么做
  • [转]使用Midjourney命令输出稳定的漫画角色

    转载自 用对Midjourney命令你也可以输出稳定的漫画角色 qq com 昨天的文章已经教会了大家如何成为15分钟快速制作一幅小漫画 有兴趣的可以翻阅上一篇文章 但是不少同学会发现 Midjourney的随机性比较强 即使输入相同的命令
  • 转载:《七周成为数据分析师》

    百日计划第一周总结 1 计划 1 彻底结束之前预定暑假完成的天善学院课程 七周数据分析师 2 总结 七周数据分析师 2 完成情况 1 完成 七周成为数据分析师 任务 2 周总结与 七周数据分析师 一起完成 七周数据分析师 总结 第一周 数据
  • 【Python零基础入门篇 · 17】:模块、模块的使用、过滤执行代码写法、包的使用

    文章目录 模块 内置模块 第三方模块 自定义模块 模块的使用 import 模块名 导入自定义模块 from import 模块起别名 as 导入多模块 模块 模块 就是 py文件 里面定义了一些函数和变量 需要的时候就可以导入这些模块 执
  • 零基础Java详细的jdk的下载以及安装配置

    文章目录 一 下载jdk 二 配置jdk 三 查看配置是否成功 一 下载jdk 1 登录oracle官网 2 3 4 点进去往下拉 会有jdk新版本 接受许可协议 直接下载 zip压缩文档就行 也可以直接下载 exe安装版本 5 找到压缩包
  • FPGA实现VGA显示图片

    利用FPGA在带有VGA接口的液晶显示器上显示图片 电路原理图 端口说明 VGA R2 VGAB0的8个端口位VGA的RGB数据位 VGA HS为行同步信号 VGA VS为场同步信号 以分辨率为640x480为例 刷新速率为60Hz 每幅图
  • [Python学习] 专题六.局部变量、全局变量global、导入模块变量

    定义在函数内的变量有局部作用域 在一个模块中最高级别的变量有全局作用域 本文主要讲述全局变量 局部变量和导入模块变量的方法 参考 Python核心编程 第二版 一 局部变量 声明适用的程序的范围被称为了声明的作用域 在一个过程中 如果名字在
  • 基于芯科Ember SDK开发的ZigBee ota client验证固件时崩溃(Reset info: 0x0A (FLT)), SDK Bug导致!

    现象 ZigBee子设备新固件下载完成后 准备校验其合法性 代码运行至检验部分 MCU崩溃重启 日志如下 RECV ASCII gt Processing message len 33 profile 0104 cluster 0019 T
  • IOS presentViewController没办法全屏的问题

    需要弹出的视图控制器的属性设置为0即可 mImagePick modalPresentationStyle 0
  • sklearn包MLPClassifier的使用详解+例子

    MLPClassifier 参数说明 hidden layer sizes 元组形式 长度n layers 2 默认 100 第i元素表示第i个神经元的个数 activation identity logistic tanh relu 默认
  • Vue3中的pinia使用(收藏版)

    1 pinia介绍 个人网站 紫陌 笔记分享网 想寻找共同学习交流 共同成长的伙伴 请点击 前端学习交流群 pinia 是 Vue 的存储库 它允许您跨组件 页面共享状态 就是和vuex一样的实现数据共享 依据Pinia官方文档 Pinia
  • 【Python】Python 模式匹配与正则表达式

    Python 模式匹配与正则表达式 1 模式匹配与正则表达式 你可能熟悉文本查找 即按下Ctrl F 输入你要查找的词 正则表达式 更进一步 它们让你指定要查找的 模式 你也许不知道一家公司的准确电话号码 但如果你住在美国或加拿大 你就知道
  • 21,verilog之宏define介绍

    注 学习 交流就在博主的个人weixin公众号 FPGA动力联盟 留言或直接 博主weixin fpga start 私信 宏define提供用一个相对简单的文字来表示一大段真正有意义的文字作用 换句话说 就是综合软件见到定义的宏 就用这个