如何将宏与Verilog中的常量进行比较?下面的代码给出错误。
module top;
`define A 10
`if (`A==10)
initial $display("10");
`else
initial $display("11");
`endif
endmodule
答案 0 :(得分:4)
没有`如果在verilog中,所以你不能像你建议的那样做。
但你确实有ifdef和ifndef,但它没有给你机会来比较值。一个繁琐的解决方法是使用一组预处理的比较结果,例如:
`ifdef A_EQUALS_10
initial $display("10");
`else
initial $display("11");
`endif
在您要求的特定情况下,您应该替换`if with plain if,即不是预处理器版本。你需要将它放在一个单独的初始块中,如下所示:
initial
begin
if (`A==10)
$display("10");
else
$display("11");
end
在许多情况下,您应该考虑是否应该使用参数或localparam语句替换define-statements,这是一种更清晰的参数化设计方法。
您可能还会在此处阅读此主题:
http://www.veripool.org/papers/Preproc_Good_Evil_SNUGBos10_paper.pdf
答案 1 :(得分:0)
您可以使用generate构造的条件if
语句。首先在Verilog IEEE1364-2001中引入(参见§12.1.3生成的实例化)。您还可以在§27生成构造
module top;
`define A 10
generate
if (`A==10) begin
initial $display("10");
end
else begin
initial $display("11");
end
endgenerate
endmodule
generate构造旨在有条件地实例化模块的实例。您可以将过程块(initial
,always
,final
等)放在generate构造中,但大多数情况下,最好将条件放在过程块中
initial begin
if (`A==10)
$display("10");
else
$display("11");
end
请注意编译器指令(例如`define
,`ifdef
和其他`
)首先按编译文件的顺序进行编译和评估,然后忽略生成结构。因此,您无法有条件地在生成构造中声明`define
。