今天在参考大佬的RS232 Receiver的时候,用到了`ifdef指令,我虽知道它是条件编译指令,但是内容已经忘了差不多了,也不敢胡乱猜测。今天趁此机会总结一下:
一般情况下,Verilog HDL源程序中所有的行都参加编译。但是有时候希望对其中的一部份内容只有在条件满足的时候才进行编译,也就是对一部分内容指定编译的条件,这就是“条件编译”。有时,希望当满足条件时对一组语句进行编译,当条件不满足时则对另外一组语句进行编译。
条件编译命令的几种形式:
(1)`ifdef 宏名(标识符)
程序段1
`else
程序段2
`endif
它的作用是当宏名已经被定义过(此处需要采用`define命令定义),则对程序段1进行编译,程序段2将被忽略;否则编译程序段2,程序段1将被忽落。其中`else部分可以没有,即:
(2)`ifdef宏名(标识符)
程序段1
`endif
这里的“宏名”是一个Verilog HDL 的标识符,“程序段”可以是Verilog HDL语句组,也可以是命令行。这些命令可以出现在源程序的任何地方。
例如:
`ifdef SIMULATION
wire BitTick = 1'b1; // output one bit per clock cycle
`else
wire BitTick;
BaudTickGen #(ClkFrequency, Baud) tickgen(.clk(clk), .enable(TxD_busy), .tick(BitTick));
`endif
注意:被忽略掉不进行编译的程序段部分也要符合Verilog HDL程序的语言规则。
通常在Verilog HDL程序中用到`ifdef、`else、`endif编译命令的情况有以下几种:
(1)选择一个模板的不同代表部分。
(2)选择不同的时序或结构信息。
(3)对不同的EDA工具,选择不同的激励。
最常用的情况是:Verilog HDL代码中的一部分可能适用于某个编译环境,但不使用于另一个环境,如果设计者不想为两个环境创建两个不同版本的Verilog 设计,还有一种方法就是所谓的条件编译,即设计者在代码中指定其中某一部分只有在设置了特定的标志后,这一段代码才能被编译,即设计者在代码中指定其中某一部分只有在设置了特定的标识后,这一段代码才能编译。
设计者也可能希望在程序的运行中,只有当设置了某个标志后,才能执行Verilog 设计的某些部分,这就是所谓的条件执行。
条件编译可以用编译指令`ifdef、`else、`elsif和`endif实现。
`ifdef和`ifndef指令可以出现在设计的任何地方。设计者可以有条件地编译语句、模块、语句块、声明和其他编译指令。`else指令时可选的。一个`else指令最多可以匹配一个`ifdef或者`ifndef。一个`ifdef或者`ifndef可以匹配任意数量的`elsif命令。`ifdef或`ifndef总是用相应的`endif来结束。
Verilog文件中,条件编译标志可以用`define语句设置。如果没有设置条件编译标志,那么Verilog编译器会简单地跳过该部分。`ifdef语句中不允许使用布尔表带式,例如使用TEST && ADD_B2来表示编译条件是不允许的。
最后还有一些相关的:
一、宏定义'define语句
包括宏定义指令包括:'define和'undef。
声明语法格式:'define
在代码中的应用格式:'macro_name
和parameter的区别:
作用域不同:parameter作用于声明的那个文件。而'define的作用范围从编译器读到define语句开始,到'undef语句结束。可以超过单个文件的边界时仍然有效。
parameter可以作为模块例化时的参数传递,实现参数化调用,而'define无此功能。
'define语句可以定义表达式,而parameter只能定义变量。
二、文件包含'include语句
'include编译器指令用于嵌入文件的内容。如果文件A包含了文件B和文件C,则文件C可以直接使用文件B的内容,同样文件B也可以使用文件C的内容。
四、时间尺度'timescale语句
该指令用于定义时延的单位和精度。
语法格式:'timescale time_unit / time_precision
参考链接:
Verilog中条件编译命令 `ifdef、`else、`endif
https://blog.csdn.net/formerman/article/details/4543678