文章目录

  • 前言
  • 正文
    • 语法
    • 示例
    • Testbench文件
  • 往期回顾
  • 参考资料及推荐关注

前言

`ifdef条件编译语句在逻辑设计中还是很常见的,但也常见一些滥用的情况,这应该避免。
应该在什么情况下使用呢?
例如:一部分代码可能有时候用,有时候不用,为了避免全部编译占用资源,可以使用条件编译语句。
下面正式介绍其语法。

正文

语法

// 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之前。

示例

module my_design (input clk, d,
`ifdef INCLUDE_RSTNinput rstn,
`endifoutput reg q);always @ (posedge clk) begin
`ifdef INCLUDE_RSTNif (!rstn) beginq <= 0;end else
`endifbeginq <= d;endend
endmodule

Testbench文件

module tb;reg clk, d, rstn;wire q;reg [3:0] delay;my_design u0 ( .clk(clk), .d(d),
`ifdef INCLUDE_RSTN.rstn(rstn),
`endif.q(q));always #10 clk = ~clk;initial begin{d, rstn, clk} = 0;#20 rstn = 1;for (integer i = 0 ; i < 20; i=i+1) begindelay = $random;#(delay) d = $random;end#20 $finish;endendmodule

请注意, 默认情况下, rstn 不会在编译设计时被包含, 因此它不会出现在 port 列表中。但是, 如果在任何属于编译文件列表的 Verilog 文件中定义了名为 INCLUDE_RSTN 的宏, 或者通过命令行传递给编译器, rstn 就会在编译过程中被包括在内, 设计也将拥有它。

下面我们通过vivado平台编译看下:
默认情况下:

定了了宏INCLUDE_RSTN的情况下:

进一步证明了其用途。

仿真看下:
在默认情况下,没有定义宏INCLUDE_RSTN ,也就没有复位。

可以看到由于没有复位,所以q在初始阶段为X。

往期回顾

Verilog初级教程(19)Verilog中的参数

Verilog初级教程(18)Verilog中的函数与任务

Verilog初级教程(17)Verilog中的case语句

Verilog初级教程(16)Verilog中的控制块

Verilog初级教程(15)Verilog中的阻塞与非阻塞语句

Verilog初级教程(14)Verilog中的赋值语句

Verilog初级教程(13)Verilog中的块语句

Verilog初级教程(12)Verilog中的generate块

Verilog初级教程(11)Verilog中的initial块

Verilog初级教程(10)Verilog的always块

Verilog初级教程(9)Verilog的运算符

Verilog初级教程(8)Verilog中的assign语句

Verilog初级教程(7)Verilog模块例化以及悬空端口的处理

Verilog初级教程(6)Verilog模块与端口

Verilog初级教程(5)Verilog中的多维数组和存储器

Verilog初级教程(4)Verilog中的标量与向量

Verilog初级教程(3)Verilog 数据类型

Verilog初级教程(2)Verilog HDL的初级语法

Verilog初级教程(1)认识 Verilog HDL

芯片设计抽象层及其设计风格

Verilog以及VHDL所倡导的的代码准则

FPGA/ASIC初学者应该学习Verilog还是VHDL?

参考资料及推荐关注

Verilog `ifdef Conditional Compilation

个人微信公众号: FPGA LAB

交个朋友

Verilog初级教程(20)Verilog中的`ifdef 条件编译语句相关推荐

  1. verilog always语法_Verilog初级教程(20)Verilog中的`ifdef 条件编译语句

    前言 `ifdef条件编译语句在逻辑设计中还是很常见的,但也常见一些滥用的情况,这应该避免. 应该在什么情况下使用呢? 例如:一部分代码可能有时候用,有时候不用,为了避免全部编译占用资源,可以使用条件 ...

  2. Verilog初级教程(23)Verilog仿真中的显示任务

    文章目录 前言 正文 Display/Write Tasks Verilog Strobes Verilog Continuous Monitors Verilog Format Specifiers ...

  3. Verilog初级教程(21)Verilog中的延迟控制语句

    文章目录 前言 正文 延迟控制语句 事件控制语句 Named Events Event or operator 往期回顾 参考资料及推荐关注 前言 Verilog中的延迟控制有两种类型–延迟和事件表达 ...

  4. Verilog初级教程(14)Verilog中的赋值语句

    文章目录 前言 正文 合理的左值 过程性赋值(Procedural assignment) 连续赋值 过程连续性赋值 往期回顾 前言 何为赋值语句?即将值放到线网或者变量上,这种操作称为赋值,英文:a ...

  5. Verilog初级教程(15)Verilog中的阻塞与非阻塞语句

    文章目录 前言 正文 阻塞赋值 非阻塞赋值 往期回顾 参考资料以及推荐关注 前言 本文通过仿真的方式,形象的说明阻塞赋值以及非阻塞赋值的区别,希望和其他教程相辅相成,共同辅助理解. 正文 阻塞赋值 阻 ...

  6. Verilog初级教程(12)Verilog中的generate块

    文章目录 前言 正文 generate for generate if generate case 参考资料 本系列博文 前言 verilog中的generate块可以称为生成块,所谓生成,可以理解为 ...

  7. Verilog初级教程(11)Verilog中的initial块

    文章目录 前言 正文 语法格式 initial块是用来干什么的? initial块何时开始又何时结束? 一个模块中允许有多少个initial块? 参考资料 写在最后 前言 仿真中通常会依次执行一组Ve ...

  8. Verilog初级教程(19)Verilog中的参数

    文章目录 前言 正文 模块参数 覆盖参数 例子说明 递增计数器 递减计数器 Specify参数 模块参数与Specify参数的区别 往期回顾 参考资料及推荐关注 前言 Verilog中的参数是使得设计 ...

  9. Verilog初级教程(16)Verilog中的控制块

    文章目录 前言 正文 条件语句if 语法 硬件实现 循环语句 forever repeat while for 往期回顾 参考资料及推荐关注 前言 硬件行为的实现离不开条件语句和其他控制逻辑流的方式. ...

最新文章

  1. linux 服务不支持 chkconfig 的解决方法
  2. 【CV秋季划】图像质量提升与编辑有哪些研究和应用,如何循序渐进地学习好?...
  3. ICCV 2017 EAST:《Learning Policies for Adaptive Tracking with Deep Feature Cascades》论文笔记
  4. undefined reference to `boost::system::generic_category()
  5. 详解@Autowired、@Qualifier和@Required
  6. 解决关闭hbase时stop-hbase.sh报错stopping hbasecat: /tmp/hbase-xxxx-master.pid: No such file or directory
  7. python 基础学习--运算符集合
  8. android 检测网络ftp,Android端与Android端利用WIFI进行FTP通信
  9. Android之WindowManager+OpenGL+EGL绘制(十七)
  10. 你的SQL语句放在了哪里?
  11. qq刷屏代码可复制_QQ小程序「神奇字体」从注册到发布
  12. dumpDex脱壳教程
  13. ImageNet 2012 中文标签(Chinese Labels)
  14. 如何去除win 10右键菜单的“使用skype共享”
  15. 多服务台排队系统仿真基于c语言,带优先级的多服务台排队系统Monte Carlo模拟
  16. 韩顺平java学习day1
  17. 潇洒郎: 凯酷84机械键盘win键被锁解决方法
  18. python将矩阵顺时针旋转90度_在Python中将方形矩阵逆时针旋转90度的程序
  19. 安装EVE-NG模拟器
  20. RK3588 AP6398RS3之WIFI调试(一)

热门文章

  1. IPV6在WINXP、WIN2003、WIN7下的网络配置
  2. 搭建WSS 开发测试环境
  3. 文字加减前后缀lisp_华为笔试题---仿LISP算法
  4. bootstrap 垂直居中 布局_给你一份详细的CSS布局指南,请查收
  5. javascript php 区别,PHP 或者 JavaScript 这些弱类型 的|| 和 | 的区别, 附代码;
  6. php框架升级,【PHP开发框架】thinkphp怎么升级
  7. cameraraw面板大小调整_Camera Raw基础操作面板介绍
  8. c语言50行以内有趣的代码,分享一段有趣的小代码
  9. 魅族的android m l,Android M 外部存储剖析
  10. python识别latex公式_Python代码转Latex公式,这个开源库用一行代码帮你搞定