当前位置: 首页 > news >正文

Verilog Systemverilog define宏定义

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 文章前情预告
  • 一、define是个啥?
  • 二、为什么要使用define
  • 三、怎么使用define
  • 四、define的横向拓展
  • 五、define思想在生活中的体现!
  • 六、结论
  • 七、参考资料
  • 八、交个朋友


文章前情预告

在这里插入图片描述

本篇文章介绍define宏定义,之前也学过,随着最近有更新的了解,记录下来想和大家分享,希望能帮助到大家!博客主要是从以下几个方面介绍,define是什么,用define宏定义的优点是什么,怎么用宏定义,宏定义使用的注意事项,宏定义的思想在其他方面的体现,宏定义的思想在生活中的联系,最后奉上写这篇博客的参考资料!

一、define是个啥?

define宏定义无论是在Verilog中还是Systemverilog中经常被用到,宏定义的格式是:

`define macro_name(formal_argu_list) macro_text

“‘define”是宏定义的标志,通知综合软件这是一个宏定义。请注意有开头符号“’”。

“macro_name”是宏定义的名称。

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

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

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

二、为什么要使用define

define宏定义的本质就是用简短的字符代替一大段字符,可以起到减少代码量的作用,使代码看起来简洁,可以提高代码的移植性。

三、怎么使用define

在这里插入图片描述

说完什么是define与为什么要有这个东西,最重要的就是在实践中使用,不以应用为目的实践就是耍流氓!

例子1.define在Verilog中经常被用来定义变量的位宽:
`define BIT_WIDTH 8
reg [`BIT_WIDTH-1:0] bit_variable;  //reg [7:0] bit_variable

在《SystemVerilog_3.1a》标准中,关于`define宏的描述如下所示:
在这里插入图片描述

例子2.define在Systemverilog中可以实现参数的传递,成为带参数的宏函数:
`define  test_inst (A,B,C) \.A``u_inst  (A``inst), \.B``u_inst  (B``inst), \.C``u_inst  (C``inst).....test_inst(a,b,c);等价于:.au_inst   (ainst),.bu_inst   (binst),.cu_inst   (cinst)

注意事项
1、
define在实现带参数的宏函数时,一定要加上``这个符号,综合软件只有在识别到这个符号时,才会将参数进行传递,这个符号相当于tcl脚本set a;中的set,Perl脚本中的$,只有出现这个关键符号软件才会进行变量替换;
2、
为了避免重复宏定义,可以使用下述方式进行定义:

`ifndef data_wdith`define data_width
`endif

3、重要重要重要!
重要的事情说三遍,关于宏定义的有效范围,宏定义的有效范围从宏定义开始,对后续文件一直有效,直到另一个宏定义改变这个宏定义的值,所以这就要求按照一定的顺序进行文件的编译,例如:Verilog在module关键字之前一般都是include一些宏定义的文件,如果这些文件在endmodule后去包含,编译器就会因为找不到这些宏定义的替换内容而报错!
4、
宏定义本质上就是替换,编译不会对这个宏名称,做语法检查,只有当被替换的内容出错时,编译才会报错,所以在调用宏定义之前一定要告诉编译器宏定义的内容去哪里寻找,Verilog是通过include、incdir这个关键字去寻找,C语言调用子函数通过跳转地址,跳转到实际的子函数中去执行,一句话:如果替换,就得告诉编译器去哪里找!

四、define的横向拓展

define宏定义的本质就是替换,这种替换就是用更少的信息表示更多的信息,与之原理相同的还包括Systemverilog的interface,C语言的子函数;

五、define思想在生活中的体现!

有句话怎么讲的,”艺术来源于生活“,技术与生活也息息相关,define的思想个人感觉在生活中处处可见,比如你去买了苹果,你妈问你买的啥,你回答买的水果,你爸买的西瓜,你妈问你买的啥,你爸回答水果,都是一样的,好比水果这个宏定义在你那里被定义成了苹果,在你爸那里被定义成了西瓜,宏定义的名称不重要,重要的是定义的内容,一千个人眼里有一千个哈姆雷特,一千个人眼里有一千个宏定义内容!

六、结论

前面强调的按一定顺序编译的问题,Makefile可以实现确保编译的顺序问题,关于Makefile的描写下一篇文章见!

七、参考资料

参考资料1 :verilog 宏之define
参考资料2:Systemverilog 宏定义 define

八、交个朋友

在这里插入图片描述

博主写文章有很多不足之处,欢迎各位大佬多多评论留言批评指正!在博文中放置大量图片是因为思考快与慢中介绍了一个启动效应,希望大家在看到这些知识的时候还可以拥有乐趣,拥有视觉的冲击,也希望这个文章能够真正帮助到大家!

相关文章:

Verilog Systemverilog define宏定义

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 文章前情预告一、define是个啥?二、为什么要使用define三、怎么使用define四、define的横向拓展五、define思想在生活中的体现!六、结论七、参考资料八、…...

51单片机应用从零开始(十一)·数组函数、指针函数

51单片机应用从零开始(九)数组-CSDN博客 51单片机应用从零开始(十)指针-CSDN博客 目录 1. 用数组作函数参数控制流水花样 2. 用指针作函数参数控制 P0 口 8 位 LED 流水点亮 1. 用数组作函数参数控制流水花样 要在51单片机中…...

【PostgreSQL】从零开始:(八)PostgreSQL-数据库PSQL元命令

元命令 postgres# \? General\bind [PARAM]... set query parameters\copyright show PostgreSQL usage and distribution terms\crosstabview [COLUMNS] execute query and display result in crosstab\errverbose show most recent error…...

02 使用Vite创建Vue3项目

概述 A Vue project is structured similarly to a lot of modern node-based apps and contains the following: A package.json fileA node_modules folder in the root of your projectVarious other configuration files are usually contained at the root level, such …...

Shell三剑客:sed(简介)

一、前言 Stream EDitor:流编辑 sed 是一种在线的、非交互式的编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后&…...

tp连接数据库

ThinkPHP内置了抽象数据库访问层,把不同的数据库操作封装起来,我们只需要使用公共的Db类进行操作,而无需针对不同的数据库写不同的代码和底层实现,Db类会自动调用相应的数据库驱动来处理。采用PDO方式,目前包含了Mysql…...

jmeter,断言:响应断言、Json断言

一、响应断言 接口A请求正常返回值如下: {"status": 10013, "message": "user sign timeout"} 在该接口下创建【响应断言】元件,配置如下: 若断言成功,则查看结果树的接口显示绿色,若…...

dockerfite创建镜像---INMP+wordpress

搭建dockerfile---lnmp 在192.168.10.201 使用 Docker 构建 LNMP 环境并运行 Wordpress 网站平台 [rootdocker1 opt]# mkdir nginx mysql php [rootdocker1 opt]# ls #分别拖入四个包: nginx-1.22.0.tar.gz mysql-boost-5.7.20.tar.gz php-7.1.10.tar.bz2 wor…...

服务器数据恢复—raid5热备盘未激活崩溃导致上层oracle数据丢失的数据恢复案例

服务器数据恢复环境: 某品牌X系列服务器,4块SAS硬盘组建了一组RAID5阵列,还有1块磁盘作为热备盘使用。服务器上层安装的linux操作系统,操作系统上部署了一个基于oracle数据库的OA(oracle已经不再为该OA系统提供后续服务…...

生产派工自动化:MES系统的关键作用

随着制造业的数字化转型和智能化发展,生产派工自动化成为了提高生产效率、降低成本,并实现优质产品生产的关键要素之一。制造执行系统(MES)在派工自动化中发挥着重要作用,通过实时数据采集和智能调度,优化生…...

netty-daxin-2(netty常用事件讲解)

文章目录 netty常用事件讲解ChannelHandler接口ChannelHandler适配器类ChannelInboundHandler 子接口Channel 的状态调用时机ChannelHandler 生命周期示例NettServer&CustomizeInboundHandlerNettyClient测试分析 ChannelInboundHandlerAdapter适配器类SimpleChannelInboun…...

使用playbook部署k8s集群

1.部署ansible集群 使用python脚本一个简单的搭建ansible集群-CSDN博客 2.ansible命令搭建k8s: 1.主机规划: 节点IP地址操作系统配置server192.168.174.150centos7.92G2核client1192.168.174.151centos7.92G2核client2192.168.174.152centos7.92G2 …...

Python基础入门第四节,第五节课笔记

第四节 第一个条件语句 if 条件: 条件成立执行的代码1 条件成立执行的代码2 ...... else: 条件不成立执行的代码1 条件不成立执行的代码2 …… 代码如下: 身高 float(input("请输入您的身高(米):")) if 身高 >1.3:print(f您的身高是{身高},已经超过1.3米,您需…...

基于Java SSM框架实现智能停车场系统项目【项目源码+论文说明】

基于java的SSM框架实现智能停车场系统演示 摘要 本论文主要论述了如何使用JAVA语言开发一个智能停车场管理系统,本系统将严格按照软件开发流程进行各个阶段的工作,采用B/S架构,面向对象编程思想进行项目开发。在引言中,作者将论述…...

React系列:useEffect的使用

useEffect的使用 useEffect的第二个参数不同,useEffect的加载不同 当第二个参数为没有的时候 只在组件初始渲染和组件更新之后加载当第二个参数为[] 的时候 只在初始渲染之后加载当第二个参数为[有依赖] 的时候 只在初始渲染之后和依赖修改的时候进行加载 functi…...

Ps:形状工具 - 描边选项

在形状工具的工具选项栏或“属性”面板中,单击“设置形状描边类型” Set shape stroke type菜单图标可打开“描边选项” Stroke Options面板。 描边预设 Stroke Type 默认列出了实线、虚线和点线三种类型的描边,单击可应用。 自己创建并存储的描边类型&a…...

C#基础知识 - 变量、常量与数据类型篇

C#基础知识 - 变量、常量与数据类型篇 第3节 变量、常量与数据类型3.1 C#变量3.1.1 变量使用3.1.2 自定义变量3.1.2 接收用户输入 3.2 C#常量3.2.1 常量的使用 3.3 C#数据类型3.3.1 数据类型之值类型3.3.2 数据类型之引用类型 更多C#基础知识详解请查看:C#基础知识 …...

Java面向对象思想以及原理以及内存图解

文章目录 什么是面向对象面向对象和面向过程区别创建一个对象用什么运算符?面向对象实现伪代码面向对象三大特征类和对象的关系。 基础案例代码实现实例化创建car对象时car引用的内存图对象调用方法过程 成员变量和局部变量作用范围在内存中的位置 关于对象的引用关系简介相关…...

Gitbook----基于 Windows 10 系统本地安装配置 Gitbook 编写属于自己的电子书

查看原文 文章目录 一、安装 Nodejs二、安装 Gitbook三、gitbook 的使用方法四、设计电子书的目录结构五、设置 gitbook 常用配置 一、安装 Nodejs 若要在 Windows 10 系统即本地使用 Gitbook,需要安装 gitlab-cli 工具,而 gitbook-cli 工具是基于 Node…...

springMVC-Restful风格

基本介绍 REST:即Representational State Transfer。(资源)表现层状态转化。是目前最流行的一种互联网软件架构。它结构清晰、符合标准、易于理解、扩展方便,所以正得到越来越多网站的采用. 1.HTTP协议里面,四个表示操…...

练习(含atoi的模拟实现,自定义类型等练习)

一、结构体大小的计算及位段 (结构体大小计算及位段 详解请看:自定义类型:结构体进阶-CSDN博客) 1.在32位系统环境,编译选项为4字节对齐,那么sizeof(A)和sizeof(B)是多少? #pragma pack(4)st…...

VTK如何让部分单位不可见

最近遇到一个需求&#xff0c;需要让一个vtkDataSet中的部分单元不可见&#xff0c;查阅了一些资料大概有以下几种方式 1.通过颜色映射表来进行&#xff0c;是最正规的做法 vtkNew<vtkLookupTable> lut; //值为0不显示&#xff0c;主要是最后一个参数&#xff0c;透明度…...

uniapp微信小程序视频实时流+pc端预览方案

方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度​WebSocket图片帧​定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐​RTMP推流​TRTC/即构SDK推流❌ 付费方案 &#xff08;部分有免费额度&#x…...

关于 WASM:1. WASM 基础原理

一、WASM 简介 1.1 WebAssembly 是什么&#xff1f; WebAssembly&#xff08;WASM&#xff09; 是一种能在现代浏览器中高效运行的二进制指令格式&#xff0c;它不是传统的编程语言&#xff0c;而是一种 低级字节码格式&#xff0c;可由高级语言&#xff08;如 C、C、Rust&am…...

JVM暂停(Stop-The-World,STW)的原因分类及对应排查方案

JVM暂停(Stop-The-World,STW)的完整原因分类及对应排查方案,结合JVM运行机制和常见故障场景整理而成: 一、GC相关暂停​​ 1. ​​安全点(Safepoint)阻塞​​ ​​现象​​:JVM暂停但无GC日志,日志显示No GCs detected。​​原因​​:JVM等待所有线程进入安全点(如…...

【Oracle】分区表

个人主页&#xff1a;Guiat 归属专栏&#xff1a;Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...

Unity | AmplifyShaderEditor插件基础(第七集:平面波动shader)

目录 一、&#x1f44b;&#x1f3fb;前言 二、&#x1f608;sinx波动的基本原理 三、&#x1f608;波动起来 1.sinx节点介绍 2.vertexPosition 3.集成Vector3 a.节点Append b.连起来 4.波动起来 a.波动的原理 b.时间节点 c.sinx的处理 四、&#x1f30a;波动优化…...

rnn判断string中第一次出现a的下标

# coding:utf8 import torch import torch.nn as nn import numpy as np import random import json""" 基于pytorch的网络编写 实现一个RNN网络完成多分类任务 判断字符 a 第一次出现在字符串中的位置 """class TorchModel(nn.Module):def __in…...

JAVA后端开发——多租户

数据隔离是多租户系统中的核心概念&#xff0c;确保一个租户&#xff08;在这个系统中可能是一个公司或一个独立的客户&#xff09;的数据对其他租户是不可见的。在 RuoYi 框架&#xff08;您当前项目所使用的基础框架&#xff09;中&#xff0c;这通常是通过在数据表中增加一个…...

代码规范和架构【立芯理论一】(2025.06.08)

1、代码规范的目标 代码简洁精炼、美观&#xff0c;可持续性好高效率高复用&#xff0c;可移植性好高内聚&#xff0c;低耦合没有冗余规范性&#xff0c;代码有规可循&#xff0c;可以看出自己当时的思考过程特殊排版&#xff0c;特殊语法&#xff0c;特殊指令&#xff0c;必须…...