2016-11-28 102 views
0

如何比较宏和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 
+0

你真的需要编译时检查,还是可以使用运行时检查,比如'$ value $ plusargs'? – toolic

回答

3

没有`如果在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

0

可以使用产生结构的条件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