在vcs编译过程中可以通过+define+来进行传递参数或者一些控制操作,具体如下:
module test;
`ifdef A
parameter num = 123;
//XXX
`elsif B
parameter num = 456;
//XXX
`else
parameter num = 789;
//XXX
`endif
initial begin
$display("num is %0d",num);
end
endmodule
在编译命令行中加入+define+A时,num打印值为123,+define+B时为456,定义其他或者不加+define+时打印789,XXX可以为自己的一些代码。通过这种方式,可以实现定义不同参数编译不同代码的功能。
module test;
`ifdef A
parameter num = 123;
//XXX
`elsif B
parameter num = 456;
//XXX
`else
parameter num = 789;
//XXX
`endif
initial begin
$display("num is %0d",num);
$display("A is %0d",`A);
end
endmodule
在编译命令中还可以+define+A=666,实现参数的传递,num打印123,A打印666,如果此时不加=666或者不加+define+,display就会报错,miss or empty argument,因为没有数据。
module test;
`ifndef A
`define A 100
`else
`define A 200
`endif
initial begin
$display("A is %0d",`A);
end
endmodule
如果+define+进行了对A的定义,代码内部又进行了对A的定义,情况会如何呢?
首先是不加+define+的情况,A的打印结果是100(用的是`ifndef,命令行没有定义A的话就进入这一条语句);然后试试+define+A,打印出错,miss or empty argument;再试试+define+A=300,打印结果是300。
这个结果说明,通过+define+定义的参数优先级最高,会覆盖代码内部的同名定义。