一部分代码可能有时候用,有时候不用,为了避免全部编译占用资源,可以使用条件编译语句。
语法
// 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中起作用,不能参与参数传递。