Verilog中的`define与`if的使用

news/2024/11/25 4:42:01/

一部分代码可能有时候用,有时候不用,为了避免全部编译占用资源,可以使用条件编译语句。

语法

// Style #1: Only single `ifdef
`ifdef <FLAG>// Statements
`endif// Style #2: `ifdef with `else part
`ifdef <FLAG>// Statements
`else// Statements
`endif// Style #3: `ifdef with additional ifdefs
`ifdef <FLAG1>// Statements
`elsif <FLAG2>// Statements
`elsif <FLAG3>// Statements
`else// Statements
`endif

         条件编译可以通过Verilog的  `ifdef 和 `ifndef 关键字来实现。 这些关键字可以出现在设计中的任何地方,并且可以相互嵌套。  它通常和预编译指令`define配套使用。 如果使用 `define定义了 称为`FLAG`的宏,那么关键字`ifdef会告诉编译器包含这段代码,直到下一个`else或`endif。
        关键字`ifndef只是告诉编译器,如果给定的名为FLAG的宏没有使用`define指令定义,则将这段代码包含在下一个`else "或`endif之前。

引入`define定义有两种方法:

方法1:直接在.v文件中使用`define定义
首先使用`define flag定义了flag,然后用下一段代码定义不同的parameter参数值,这时period的值为5.
        `ifdef flag 
                   parameter period =5;
          `else
                  parameter period =10;
         `endif

`timescale 1ns / 1ps`define flagmodule tb;`ifdef flag parameter period =5;`elseparameter period =10;
`endifreg clk;
reg rst;
reg [7:0] in;
wire out;initial beginclk=0;rst=0;#100 rst=1;@(posedge clk);in=8'b10101010;repeat(10) @(posedge clk);in=8'b11100110;endalways #period clk=~clk;top inst(
.clk(clk),
.rst(rst),
.in(in),
.out(out)  );endmodule

方法二:在.vh文件中使用`define定义,然后在.v文件中使用#include引用宏定义
步骤一:先在vivado中添加一个.vh头文件,文件名为inc.vh,在该文件中定义如下:

`define flagg

步骤二:在需要引用宏定义的.v文件开始,使用`include "xxx.vh",这样就可以访问.vh的宏定义了

`include "inc.vh"
`timescale 1ns / 1psmodule tb;`ifdef flag parameter period =5;`elseparameter period =10;`endifreg clk;
reg rst;
reg [7:0] in;
wire out;initial beginclk=0;rst=0;#100 rst=1;@(posedge clk);in=8'b10101010;repeat(10) @(posedge clk);in=8'b11100110;endalways #period clk=~clk;

  注意:`define   macro_name   参数    之后不能加任何东西!

补充:

  `define 与localparam和parameter最大的区别就是`define 可以跨文件传递参数;parameter只能在模块间传递参数;而localparam只能在其所在的module中起作用,不能参与参数传递。




 


http://www.ppmy.cn/news/49855.html

相关文章

十、详解Kubernetes存储管理的技术原理

Kubernetes是一种开源的容器编排工具,它可以自动化地部署、扩展和管理容器化应用程序。在Kubernetes中,存储管理是一个重要的组件,它可以帮助管理员管理应用程序的数据。 Kubernetes存储管理技术原理涉及到多个组件,包括Volume、Persistent Volume、Persistent Volume Cla…

基于html+css的图片展示18

准备项目 项目开发工具 Visual Studio Code 1.44.2 版本: 1.44.2 提交: ff915844119ce9485abfe8aa9076ec76b5300ddd 日期: 2020-04-16T16:36:23.138Z Electron: 7.1.11 Chrome: 78.0.3904.130 Node.js: 12.8.1 V8: 7.8.279.23-electron.0 OS: Windows_NT x64 10.0.19044 项目…

IM通讯技术

IM技术 呃&#xff0c;最近也是业务繁忙啊&#xff0c;搞了一波IM放到线上去了。在10年经验大佬的指导下&#xff0c;采用的IM通讯方案为&#xff1a;springboothttpstompvueuniapp来实现了PC端与微信小程序的通讯互通。技术架构选型方面暂未达到分布式集群的模式&#xff0c;…

PyCharm-2023安装教程

访问JetBrains的官方网站&#xff0c;下载PyCharm最新版本的安装程序。 双击下载的安装程序&#xff0c;在弹出的安装向导中点击“下一步”。 阅读许可协议&#xff0c;并同意协议条款。 选择安装路径。默认情况下&#xff0c;PyCharm会安装在C:\Program Files\JetBrain…

ImageJ 用户手册——第四部分(ImageJ用户界面)

ImageJ 用户手册——第四部分&#xff08;ImageJ用户界面&#xff09; ImageJ用户界面工具栏&#xff08;Toolbar&#xff09;状态栏进度条19. 工具19.1 区域选择工具19.1.1 矩形选择工具19.1.2 圆角矩形选择工具19.1.3 圆形选择工具19.1.4 椭圆选择工具19.1.5 笔刷选择工具19.…

逆向思维书籍推荐

《逆向思维》作者&#xff1a;德鲁克 《逆向思维法》作者&#xff1a;艾伦哈勃 《逆向思维&#xff1a;如何解决问题》作者&#xff1a;托尼布赖恩特 《逆向思维的力量》作者&#xff1a;李开复 《逆向思维&#xff1a;掌握创新的关键》作者&#xff1a;李嘉诚 《逆向思维》作…

操作系统原理 —— 进程状态切换具体做了哪些事情?(八)

什么是进程控制&#xff1f; 进程控制的主要功能是&#xff1a;对系统中的所有进程实施有效的管理&#xff0c;它具有创建新进程、撤销已有进程、实现进程状态转换等功能。 简单来说&#xff0c;就是进程控制就是要现实进程状态的转换。 那如何实现进程的控制呢&#xff1f;…

Revit中栏杆扶手、坡道的绘制及插件太多问题

一、在Revit中栏杆与扶手的绘制方法有两种&#xff1a; ①绘制路径 ②放置在主体上 二、执行方式 功能区&#xff1a;“建筑”选项卡“楼梯坡道”面板“栏杆扶手”下拉菜单“绘制路径”。 三、绘制技巧 首先我们一起来看看如何设置栏杆扶手属性。 第一步&#xff1a;设置属…