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

问题描述 投票:0回答:2

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

module top;
  `define A 10

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

endmodule
verilog system-verilog
2个回答
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


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

© www.soinside.com 2019 - 2024. All rights reserved.