Verilog初级教程(20)Verilog中的`ifdef 条件编译语句
文章目录
- 前言
- 正文
- 语法
- 示例
- 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 条件编译语句相关推荐
- verilog always语法_Verilog初级教程(20)Verilog中的`ifdef 条件编译语句
前言 `ifdef条件编译语句在逻辑设计中还是很常见的,但也常见一些滥用的情况,这应该避免. 应该在什么情况下使用呢? 例如:一部分代码可能有时候用,有时候不用,为了避免全部编译占用资源,可以使用条件 ...
- Verilog初级教程(23)Verilog仿真中的显示任务
文章目录 前言 正文 Display/Write Tasks Verilog Strobes Verilog Continuous Monitors Verilog Format Specifiers ...
- Verilog初级教程(21)Verilog中的延迟控制语句
文章目录 前言 正文 延迟控制语句 事件控制语句 Named Events Event or operator 往期回顾 参考资料及推荐关注 前言 Verilog中的延迟控制有两种类型–延迟和事件表达 ...
- Verilog初级教程(14)Verilog中的赋值语句
文章目录 前言 正文 合理的左值 过程性赋值(Procedural assignment) 连续赋值 过程连续性赋值 往期回顾 前言 何为赋值语句?即将值放到线网或者变量上,这种操作称为赋值,英文:a ...
- Verilog初级教程(15)Verilog中的阻塞与非阻塞语句
文章目录 前言 正文 阻塞赋值 非阻塞赋值 往期回顾 参考资料以及推荐关注 前言 本文通过仿真的方式,形象的说明阻塞赋值以及非阻塞赋值的区别,希望和其他教程相辅相成,共同辅助理解. 正文 阻塞赋值 阻 ...
- Verilog初级教程(12)Verilog中的generate块
文章目录 前言 正文 generate for generate if generate case 参考资料 本系列博文 前言 verilog中的generate块可以称为生成块,所谓生成,可以理解为 ...
- Verilog初级教程(11)Verilog中的initial块
文章目录 前言 正文 语法格式 initial块是用来干什么的? initial块何时开始又何时结束? 一个模块中允许有多少个initial块? 参考资料 写在最后 前言 仿真中通常会依次执行一组Ve ...
- Verilog初级教程(19)Verilog中的参数
文章目录 前言 正文 模块参数 覆盖参数 例子说明 递增计数器 递减计数器 Specify参数 模块参数与Specify参数的区别 往期回顾 参考资料及推荐关注 前言 Verilog中的参数是使得设计 ...
- Verilog初级教程(16)Verilog中的控制块
文章目录 前言 正文 条件语句if 语法 硬件实现 循环语句 forever repeat while for 往期回顾 参考资料及推荐关注 前言 硬件行为的实现离不开条件语句和其他控制逻辑流的方式. ...
最新文章
- linux 服务不支持 chkconfig 的解决方法
- 【CV秋季划】图像质量提升与编辑有哪些研究和应用,如何循序渐进地学习好?...
- ICCV 2017 EAST:《Learning Policies for Adaptive Tracking with Deep Feature Cascades》论文笔记
- undefined reference to `boost::system::generic_category()
- 详解@Autowired、@Qualifier和@Required
- 解决关闭hbase时stop-hbase.sh报错stopping hbasecat: /tmp/hbase-xxxx-master.pid: No such file or directory
- python 基础学习--运算符集合
- android 检测网络ftp,Android端与Android端利用WIFI进行FTP通信
- Android之WindowManager+OpenGL+EGL绘制(十七)
- 你的SQL语句放在了哪里?
- qq刷屏代码可复制_QQ小程序「神奇字体」从注册到发布
- dumpDex脱壳教程
- ImageNet 2012 中文标签(Chinese Labels)
- 如何去除win 10右键菜单的“使用skype共享”
- 多服务台排队系统仿真基于c语言,带优先级的多服务台排队系统Monte Carlo模拟
- 韩顺平java学习day1
- 潇洒郎: 凯酷84机械键盘win键被锁解决方法
- python将矩阵顺时针旋转90度_在Python中将方形矩阵逆时针旋转90度的程序
- 安装EVE-NG模拟器
- RK3588 AP6398RS3之WIFI调试(一)
热门文章
- IPV6在WINXP、WIN2003、WIN7下的网络配置
- 搭建WSS 开发测试环境
- 文字加减前后缀lisp_华为笔试题---仿LISP算法
- bootstrap 垂直居中 布局_给你一份详细的CSS布局指南,请查收
- javascript php 区别,PHP 或者 JavaScript 这些弱类型 的|| 和 | 的区别, 附代码;
- php框架升级,【PHP开发框架】thinkphp怎么升级
- cameraraw面板大小调整_Camera Raw基础操作面板介绍
- c语言50行以内有趣的代码,分享一段有趣的小代码
- 魅族的android m l,Android M 外部存储剖析
- python识别latex公式_Python代码转Latex公式,这个开源库用一行代码帮你搞定