这两天调试程序时,宏定义时遇到了点问题,发现这里有个小坑,记录一下。。。
话不多说,上程序:
`timescale 1ns/1ps
`define MACRO_TEST \
begin \
#10; \
$display("#10 time goes by..."); \
end
program testcase();
initial begin
$display("******************************************************************");
$display("Initializing...");
$display("******************************************************************");
$display("testcase running...");
repeat(10) `MACRO_TEST
$display("******************************************************************");
$display("testcase finished.");
$finish();
$display("******************************************************************");
end
endprogram
此时程序是可以正常运行且符合预期的。然后我们在宏定义的地方加上一个分号:
`timescale 1ns/1ps
`define MACRO_TEST; \
begin \
#10; \
$display("#10 time goes by..."); \
end
program testcase();
initial begin
$display("******************************************************************");
$display("Initializing...");
$display("******************************************************************");
$display("testcase running...");
repeat(10) `MACRO_TEST;
$display("******************************************************************");
$display("testcase finished.");
$finish();
$display("******************************************************************");
end
endprogram
再运行时,发现我们定义的宏只执行了一次:
ucli% run
******************************************************************
Initializing...
******************************************************************
testcase running...
#10 time goes by...
******************************************************************
testcase finished.
【分析】:这是由于宏名被识别为了"MACRO_TEST",而不是"MACRO_TEST;",所以发生替换后,空语句“;”被执行了10此,而打印只被执行了一次。
*********************************************************************************************************************************************
【验证】为了验证以上猜测,用例如下:
`timescale 1ns/1ps
`define MACRO_TEST;
program testcase();
initial begin
$display("******************************************************************");
$display("Initializing...");
$display("******************************************************************");
$display("testcase running...");
$display("macro test")`MACRO_TEST
$display("******************************************************************");
$display("testcase finished.");
$finish();
$display("******************************************************************");
end
endprogram
运行用例,可以正确编译且结果符合预期:
ucli% run
******************************************************************
Initializing...
******************************************************************
testcase running...
macro test
******************************************************************
testcase finished.
*********************************************************************************************************************************************
【总结】宏定义时不需要也不应该加分号,这种错误在有参数的宏定义时很容易犯,因为看见括号就会很顺手地敲上一个分号。