一部分代码可能有时候用,有时候不用,为了避免全部编译占用资源,可以使用条件编译语句。
语法
// 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 flag
module tb;
`ifdef flag
parameter period =5;
`else
parameter period =10;
`endif
reg clk;
reg rst;
reg [7:0] in;
wire out;
initial
begin
clk=0;
rst=0;
#100 rst=1;
@(posedge clk);
in=8'b10101010;
repeat(10) @(posedge clk);
in=8'b11100110;
end
always #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 / 1ps
module tb;
`ifdef flag
parameter period =5;
`else
parameter period =10;
`endif
reg clk;
reg rst;
reg [7:0] in;
wire out;
initial
begin
clk=0;
rst=0;
#100 rst=1;
@(posedge clk);
in=8'b10101010;
repeat(10) @(posedge clk);
in=8'b11100110;
end
always #period clk=~clk;
注意:`define macro_name 参数 之后不能加任何东西!
补充:
`define 与localparam和parameter最大的区别就是`define 可以跨文件传递参数;parameter只能在模块间传递参数;而localparam只能在其所在的module中起作用,不能参与参数传递。文章来源:https://www.toymoban.com/news/detail-563807.html
文章来源地址https://www.toymoban.com/news/detail-563807.html
到了这里,关于Verilog中的`define与`if的使用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!