比如c中的#if,如果在verilog中那么

时间:2016-11-28 12:40:27

标签: verilog system-verilog

如何将宏与Verilog中的常量进行比较?下面的代码给出错误。

module top;
  `define A 10

  `if (`A==10)
    initial $display("10");
  `else
    initial $display("11");
  `endif

endmodule

2 个答案:

答案 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生成构造

中的SystemVerilog IEEE1800-2012(可从IEEE免费下载)中阅读相关内容。
module top;
  `define A 10

  generate
  if (`A==10) begin
    initial $display("10");
  end
  else begin
    initial $display("11");
  end
  endgenerate

endmodule

generate构造旨在有条件地实例化模块的实例。您可以将过程块(initialalwaysfinal等)放在generate构造中,但大多数情况下,最好将条件放在过程块中

initial begin
  if (`A==10)
    $display("10");
  else
    $display("11");
end

请注意编译器指令(例如`define`ifdef和其他`)首先按编译文件的顺序进行编译和评估,然后忽略生成结构。因此,您无法有条件地在生成构造中声明`define