宏与参数的区别
参数
宏是可替换的参数类似于变量
宏在预编译阶段工作参数在展开阶段工作
语法: `define 宏名 值语法: parameter 参数名=值
我们可以在任何文件中使用 `define我们可以在文件内使用 parameter
我们不能在宏中指定数据类型我们可以在参数中使用和更改数据类型
宏可以有多行多行在这里是不可能的,因为参数就像声明变量
我们可以在命令行中为宏赋值参数值不能在命令行中更改

宏和参数的执行阶段#

Untitled Diagram drawio (44)

在宏中使用参数#

parameter data = 5; // 在展开阶段,data 将被替换为值 5
`define  DATA data // 在预编译阶段,`DATA 将被替换为 data
module tb();
  int a,b;
  initial begin
   
    $display("DATA=%0d",`DATA);
    
     
     b= `DATA + 2;  

    $display("b=%0d",b);
  end 
endmodule

在上面的代码中,参数 data 的值 5 被用在宏 `DATA 中

在参数中使用宏#

`define  DATA 25
parameter data = `DATA;

module tb();
  int a,b;
  initial begin
    $display("data=%0d",data); // 在预编译阶段,`DATA 将被替换为 25。
    $display("DATA=%0d",`DATA); // 在展开阶段,data 将被替换为值 25
    
     a = data +5;
     b= `DATA + 2;
    
    $display("a=%0d b=%0d",a,b);
  end 
endmodule  

在上面的代码中,宏 `DATA 25 的值被用在参数 data 中。

宏(`define)可以在命令行中使用

-timescale 1ns/1ns +define+name=20

`define name 10

module hi;
int a;
initial begin
  $display("[%0t] a = %0d",$time,a);
  #1 a = `name;
  $display("[%0t] a = %0d",$time,a);
end
endmodule

我们可以使用编译选项 -timescale 1ns/1ns +define+name=20 在命令行接口中为宏提供输入。