Verilog中的`define与`if的使用

文章介绍了Verilog中使用`ifdef`和`ifndef`进行条件编译的方法,以及如何结合`define`定义宏来控制代码块的编译。提供了两种方式定义宏,一种是在.v文件内直接定义,另一种是通过.vh头文件进行引用。条件编译用于优化资源使用,避免不必要的编译。`define`定义的宏可以跨文件传递,而`localparam`和`parameter`的作用范围不同。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一部分代码可能有时候用,有时候不用,为了避免全部编译占用资源,可以使用条件编译语句。

语法

// 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中起作用,不能参与参数传递。




 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值