如何比较宏和Verilog中的常量?.下面的代码给出了错误。like #if in c,is there`if in verilog
module top;
`define A 10
`if (`A==10)
initial $display("10");
`else
initial $display("11");
`endif
endmodule
如何比较宏和Verilog中的常量?.下面的代码给出了错误。like #if in c,is there`if in verilog
module top;
`define A 10
`if (`A==10)
initial $display("10");
`else
initial $display("11");
`endif
endmodule
没有`如果在verilog中,所以你不能按照你的建议去做。
虽然你确实有ifdef和ifndef,但它不会给你比较值的机会。一个繁琐的解决方法是让一组预处理比较,结果,比如像:
`ifdef A_EQUALS_10
initial $display("10");
`else
initial $display("11");
`endif
在你询问特定情况下,应更换`如果使用纯如,即不预处理器的版本。你需要把它放在一个单独的初始块中,像这样:
initial
begin
if (`A==10)
$display("10");
else
$display("11");
end
在很多情况下,你应该考虑如果定义语句而应通过参数或localparam声明,这是一个更清洁的方式来代替参数化您的设计。
你也可以阅读关于这个话题在这里:
http://www.veripool.org/papers/Preproc_Good_Evil_SNUGBos10_paper.pdf
可以使用产生结构的条件if
声明。首先在Verilog IEEE 1364-2001中引入(参见§ 12.1.3 生成实例)。您还可以在SystemVerilog的IEEE1800-2012了解IT行业(免费从IEEE下载)在27 §生成结构
module top;
`define A 10
generate
if (`A==10) begin
initial $display("10");
end
else begin
initial $display("11");
end
endgenerate
endmodule
的生成结构的目的是有条件实例模块的实例。您可以将程序块(initial
,always
,final
等)放在生成结构中,但大多数情况下,最好将条件放入程序块中。
initial begin
if (`A==10)
$display("10");
else
$display("11");
end
注意,编译器指令(例如`define
,`ifdef
和其他`
)被编译并通过将文件被编译的顺序首先评估和忽略产生的构建体。因此,您不能有条件地在生成结构中声明`define
。
你真的需要编译时检查,还是可以使用运行时检查,比如'$ value $ plusargs'? – toolic