`define 是一种简单的文本替换宏,只是简单的文本替换,`define 定义的常量没有类型,不会被其它机制覆盖值,`define 一旦声明,作用域就是全局的
parameter 是一种具有类型和范围的常量声明,在SV验证环境中使用更加灵活和可控,parameter 具有作用域,并可以在模块内部和模块之间进行传递,常用于定义模块的输入输出,信号的位宽等常量
`define | parameter |
文本替换宏 | 常量 |
作用域:全局 | 作用域:parameter所在模块 |
不会被其它机制覆盖值 | 可以被覆盖 |
应用场景:
`define 常用来在同一个验证环境中,通过在不同的case中定义不同的宏定义,并在测试平台中通过`ifdef `else `endif的判断语句执行不同代码块,从而实现不同的测试场景
module my_top();
`ifdef ERROR_TEST
执行代码1
...
`else
执行代码2
...
`endif
...
endmodule
在上述代码中,通过在top层判断当前case所定义的宏定义,决定执行哪个代码块,当检测到存在ERROR_TEST 宏定义时,执行代码块1,否则执行代码块2 ,以此可以实现场景区分,执行不同操作
parameter 常用来定义一些特定模块的输入,并可以通过例化时传入不同参数生成指定参数的模块
class my_agent #(int unsigned ADDR_WIDTH=32,
int unsigned DATA_WIDTH =32) extends uvm_agent;
bit[ADDR_WIDTH-1:0] addr;
bit[DATA_WIDTH-1:0] data;
...
endclass
class my_env1 extends uvm_env;
my_agent #(32,32) agent;
...
endclass
class my_env2 extends uvm_env;
my_agent #(16,16) agent;
...
endclass
上述代码中my_agent定义了两个传参ADDR_WIDTH和DATA_WIDTH,当把my_agent当做一个组件例化进入不同的验证环境时,只需要在env创建时传入不同的参数,便可以生成不同参数的模块,不需要再修改内部代码,使得复用性更强
虽然两种方法都可以实现对一些变量位宽等的定义,但由于parameter有作用域的特性,更加灵活可控,两种方法灵活选用即可
其他
- 关于本文,您有什么想法均可在评论区留言交流。
- 自身能力不足,如有错误还请多多指出