sv中parameter和`define区别

`define  是一种简单的文本替换宏,只是简单的文本替换,`define 定义的常量没有类型,不会被其它机制覆盖值,`define 一旦声明,作用域就是全局的

parameter 是一种具有类型和范围的常量声明,在SV验证环境中使用更加灵活和可控,parameter 具有作用域,并可以在模块内部和模块之间进行传递,常用于定义模块的输入输出,信号的位宽等常量

`defineparameter
文本替换宏常量
作用域:全局作用域: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有作用域的特性,更加灵活可控,两种方法灵活选用即可

其他

  • 关于本文,您有什么想法均可在评论区留言交流。
  • 自身能力不足,如有错误还请多多指出
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

uvm_1.2

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值