Verilog编译预处理

news2025/3/12 1:00:18

文章目录

  • 一、简介
  • 二、宏定义`define
  • 三、文件包含`include
  • 四、时间尺度`timescale
  • 五、条件编译`ifdef
  • 参考

一、简介

编译预处理是Verilog HDL编译系统的一个组成部分。
Verilog HDL编译系统通常先对这些特殊的命令进行预处理,然后将预处理的结果和源程序一起在进行通常的编译处理。
为了和一般的语句相区别,这些预处理命令以符号 ` 开头
这些预处理命令的有效作用范围为定义命令之后到本文件结束或到其它命令定义替代该命令之处。

宏定义与parameter的区别
在这里插入图片描述

二、宏定义`define

一般形式

// 宏定义
`define 宏名 宏内容
// 使用宏
`宏名

宏名的有效范围为定义命令之后到原文件结束。
宏定义是用宏名代替一个字符串,也就是作简单的置换,不作语法检查,预处理时照样代入,不管含义是否正确。只有在编译已被宏展开后的源程序时才报错。
在进行宏定义时,可以引用已经定义的宏名,进行层层替换。

三、文件包含`include

文件包含处理是一个源文件可以将另一个源文件的全部内容包含进来,即将另外的文件包含到本文件之中。
Verilog语言提供了include命令用来实现文件包含的操作。

`include "文件名"

在这里插入图片描述
预处理时,会将file2.v中的全部内容复制插入到include “file1.v” 命令出现的地方。
在后面的编译中,会将包含以后的file1.v作为一个源文件单位进行编译。
文件包含可以将一些常用的宏定义命令或者任务task组成一个文件,然后用include命令将这些宏定义包含到源文件中。
此外一个源文件可能经常要用到另外几个源文件中的模块,可以使用include命令将所需模块源文件包含进来。
文件包含的说明:

  1. 一个include命令只能指定一个被包含的文件,如果要包含n个文件,需要用n个include
  2. include命令可以出现在Verilog源程序的任何地方,被包含文件名可以是相对路径,也可以是绝对路径。
  3. 如果文件1包含文件2,而文件2要用到文件3的内容,则可以在文件1中用两个include命令分别包含文件2和文件3,并且文件3应出现在文件2之前。(此时文件2中可以不用包含文件3)
  4. 在一个被包含文件中又可以包含另一个文件,即文件包含是可以嵌套的。

四、时间尺度`timescale

timescale命令用来说明跟在该命令后的模块的时间单位和时间精度。
使用timescale命令可以在同一个设计里包含采用不同时间单位的模块。
timescale命令格式:

`timescale 时间单位/时间精度

时间单位参数用来定义模块中仿真时间和延迟时间的基准单位,时间精度参数用来声明该模块的仿真时间的精确程度,即决定模块中的延迟时间可以带几位小数。
如果在同一个程序中,存在多个timescale命令,则用最小的时间精度值来决定仿真的时间单位。
时间精度至少要和时间单位一样精确,时间精度不能大于时间单位值。
用于说明时间单位和时间精度值的数字必须是整数,其有效数字为1、10、100,单位为: s、ms、us、ns、ps、fs。
可以使用系统任务$printtimescale来输出显示一个模块的时间单位和时间精度。
可以使用系统函数$timerealtime%t格式声明来输出显示EDA工具记录的时间信息。

五、条件编译`ifdef

一般情况下,Verilog源程序的每一行都参与编译,但是有时希望对其中的一部分内容只有在满足条件才进行编译,就需要使用条件编译。
条件编译形式

///
`ifdef 宏名
    // xxx
`else
    // xxx
`endif
///
`ifdef 宏名
    // xxx
`endif
///
`ifdef 宏名
    // xxx
`elsif 宏名
    // xxx
`else
    // xxx
`endif

被忽略的不进行编译的部分也要符合Verilog程序的语法规则
通常在Verilog中使用条件编译的情况有以下几种:

  1. 选择一个模块的不同代表部分。
  2. 选择不同的时序或者结构信息。
  3. 对不同的EDA工具,选择不同的激励。

ifdefgenerate的对比
在这里插入图片描述

参考

  1. https://zhuanlan.zhihu.com/p/72091202
  2. https://zhuanlan.zhihu.com/p/359329515

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1101923.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python —— hou.Node class

Houdini内所有节点(Object、SOP、COP等)的基类,该类的实例对应houdini内的节点; 每个节点都有一个唯一的路径(定义其在节点树内的位置);节点路径层次结构类似于文件系统中的文件和文件夹的层次结…

ant design DatePicker禁用之前的时间

1、代码 <DatePicker fieldProps{disabledDate: (current: any) > {return current < moment().startOf(day);}}/>2、效果

正点原子嵌入式linux驱动开发——Linux设备树

在前面系统移植的过程中多次提到“设备树”这个概念和创建自己的设备树。但是并没有在TF-A和uboot里说设备树的原理&#xff0c;因为相对比较复杂。 本章就来详细的谈一谈设备树。掌握设备树是Linux驱动开发人员必备的技能&#xff01;因为在新版本的Linux中&#xff0c;ARM相…

icg模块clock gating解析

// 两种形式&#xff1a; 与门形式 或门形式 三个用途&#xff1a; 用于关断时钟&#xff0c;降低功耗用于动态时钟切换是防止毛刺的产生用于时钟分频 解析&#xff1a;与门形式 解析&#xff1a;或门形式

Mybatis对数据库进行增删查改以及单元测试

这篇写的草率了&#xff0c;是好几天前学到&#xff0c;以后用来自己复习 UserInfo import lombok.Data;Data public class UserInfo {private int id;private String name;private int age;private String email;//LocalDateTime可用于接收 时间}Mapper UserMapper pack…

如何获取方法上声明的注解

开发过程当中部分场景需要获取到方法或类上的注解&#xff0c;但是经常会有无法渠道注解的情况&#xff0c;这种情况很可能是该注解所在的类是一个代理类&#xff0c;比如被AOP动态代理【注意&#xff1a;通过】。本文以CGLIB为例&#xff0c;说明为什么无法取到方法或类上的注…

读《中国省级移动政务服务报告2023》

报告地址&#xff1a; 中国省级移动政务服务报告2022 https://www.digitalelite.cn/h-nd-7846.html 中国省级移动政务服务报告2023 中国省级移动政务服务报告2023 报告分为 引言、评估方法、概貌、指数、标杆、建言 六个部分。 一些思考 移动政务服务应用针对各省的常驻人口…

vueday02——使用NTableData

1.下载naivueui 2.按需导入&#xff0c;不要全局导入 注意不要导入错误组件或者写错组件名称 import { NDataTable } from naive-ui 3.定义表头和数据&#xff01;&#xff01;&#xff01; n-data-table标签必须要使用数据和数据 少一个都不能正确渲染&#xff01;&#xf…

在 Android 上恢复已删除音乐的 5 种简单方法

人们经常将重要的音乐文件保存在智能手机上&#xff0c;以方便随时随地收听自己喜欢的曲目。但是&#xff0c;如果这些珍贵的音乐文件因软件故障或硬件故障而被意外删除或丢失怎么办&#xff1f;这将是许多音乐爱好者的噩梦&#xff01; 如果您也是这些人中的一员&#xff0c;…

8月PMP出成绩了,意味着什么?

之前胖圆给大家分享过&#xff0c;10月16号PMI官网将发布8.19的PMP考试成绩&#xff0c;这两天已经有学员陆陆续续收到考试通过的邮件&#xff0c;还没有收到成绩通知的学员耐心等待&#xff0c;相信努力备考的学员一定都能够顺利通过~ 还没查询成绩的宝子可以移步胖圆上一篇笔…

C/C++面试常见问题——static关键字的主要用法

首先我们要明确一下C/C的内存区域划分 在C/C中内存主要被划分为四大块&#xff0c;堆&#xff0c;栈&#xff0c;全局/静态存储区&#xff0c;代码区 而全局/静态存储区又被细分为常量区(静态常量区&#xff0c;const关键字修饰)&#xff0c;全局区(全局变量区)和静态变量区(…

LiveGBS流媒体平台GB/T28181常见问题-安全控制HTTP接口鉴权勾选流地址鉴权后401Unauthorized如何播放调用接口

LiveGBS流媒体平台GB/T28181常见问题-安全控制HTTP接口鉴权勾选流地址鉴权后401 Unauthorized如何播放调用接口&#xff1f; 1、安全控制1.1、HTTP接口鉴权1.2、流地址鉴权 2、401 Unauthorized2.1、携带token调用接口2.1.1、获取鉴权token2.1.2、调用其它接口2.1.2.1、携带 Co…

微盟盈利困局难解

又是一年“双11”临近&#xff0c;微盟(2013.HK)、有赞等国内电商SaaS头部企业之间的战斗已经悄然打响。 作为从微信生态里生长出来的第三方服务商&#xff0c;根据微盟此前公布2023年半年报&#xff0c;其营收增长背后仍难掩亏损困局。 「不二研究」据微盟财报发现&#xff…

新产品发布新闻稿推广文案怎么写?纯干货

一篇优质的新闻稿传播速度是非常快的&#xff0c;可以让产品获得大量曝光和展现&#xff0c;提高产品的知名度和口碑&#xff0c;这样的稿件撰写起来是需要掌握一定的技巧的&#xff0c;新产品发布新闻稿推广文案怎么写&#xff1f;伯乐网络传媒十多年文案撰写经验&#xff0c;…

Windows10系统开启SNMP服务

Windows10系统开启SNMP服务 1、打开控制面板&#xff0c;选择卸载程序2、点击启用或关闭Windows功能3、将SNMP协议开启&#xff08;如果有该内容请直接跳至步骤7&#xff0c;如找不到该协议请继续看步骤4&#xff09;4、找不到步骤3中内容原因&#xff1a;Windwos10 1809后更新…

Flow深入浅出系列之更聪明的分享 Kotlin Flows

Flow深入浅出系列之在ViewModels中使用Kotlin FlowsFlow深入浅出系列之更聪明的分享 Kotlin FlowsFlow深入浅出系列之使用Kotlin Flow自动刷新Android数据的策略 Flow深入浅出系列之更聪明的分享 Kotlin Flows 使生命周期对上游流有效&#xff0c;以跳过不必要的工作。这是一…

vue2打包优化-小白也可快速上手的一套

需求&#xff1a;项目过大可以使用打包优化&#xff0c;减少项目体积&#xff0c;加速页面加载&#xff0c;增强用户体验&#xff0c;跟着步骤来即可实现&#xff0c;主要是vue2的打包优化&#xff0c;不是vue3&#xff0c;文章可能有点长&#xff0c;但是很实用哈哈&#xff0…

openGauss学习笔记-102 openGauss 数据库管理-管理数据库安全-客户端接入之查看数据库连接数

文章目录 openGauss学习笔记-102 openGauss 数据库管理-管理数据库安全-客户端接入之查看数据库连接数102.1 背景信息102.2 操作步骤 openGauss学习笔记-102 openGauss 数据库管理-管理数据库安全-客户端接入之查看数据库连接数 102.1 背景信息 当用户连接数达到上限后&#…

单片机入门后该怎么学习进一步提升?

单片机入门后该怎么学习进一步提升&#xff1f; 可以将你目前会的单片机基础先整理一下&#xff0c;你看看运用这些基本的外设或者一些入门知识能做个什么东西&#xff0c;最近很多小伙伴找我&#xff0c;说想要一些单片机资料&#xff0c;然后我根据自己从业十年经验&#xff…

Redis主从复制流程

前言 Redis 支持部署多节点&#xff0c;然后按照 1:n 的方式构建主从集群&#xff0c;即一个主库、n 个从库。主从库之间会自动进行数据同步&#xff0c;但是只有主库同时允许读写&#xff0c;从库只允许读。 搭建主从复制集群的目的&#xff1a; 从库可用于容灾备份从库可以…