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

举报
李锐博恩 发表于 2021/07/15 00:13:14 2021/07/15
【摘要】 文章目录 前言正文语法示例Testbench文件 往期回顾参考资料及推荐关注 前言 `ifdef条件编译语句在逻辑设计中还是很常见的,但也常见一些滥用的情况,这应该避免。 应该在什么情况下使用呢? 例如:一部分代码可能有时候用,有时候不用,为了避免全部编译占用资源,可以使用条件编译语句。 下面正式介绍其语法。 正文 语法 // Style #1...

前言

`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

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
 条件编译可以通过Verilog的  `ifdef 和 `ifndef 关键字来实现。
 这些关键字可以出现在设计中的任何地方,并且可以相互嵌套。 
 它通常和预编译指令`define配套使用。 如果使用 `define定义了
 称为`FLAG`的宏,那么关键字`ifdef会告诉编译器包含这段代码,
 直到下一个`else或`endif。

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
关键字`ifndef只是告诉编译器,如果给定的名为FLAG的宏没有使用
`define指令定义,则将这段代码包含在下一个`else "或`endif之前。

  
 
  • 1
  • 2

示例

module my_design (input clk, d,
`ifdef INCLUDE_RSTN input rstn,
`endif output reg q); always @ (posedge clk) begin
`ifdef INCLUDE_RSTN if (!rstn) begin q <= 0; end else
`endif begin q <= d; end
  end
endmodule

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

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) begin delay = $random; #(delay) d = $random; end #20 $finish;
  end

endmodule

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28

请注意, 默认情况下, 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

交个朋友

文章来源: reborn.blog.csdn.net,作者:李锐博恩,版权归原作者所有,如需转载,请联系作者。

原文链接:reborn.blog.csdn.net/article/details/107746871

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。