1

在系统 verilog 设计中,我有一个顶级模块、子模块和一个子子模块。sub-sub 模块在 sub-sub 模块中实例化 在 sub-sub 模块中实例化在 top 模块中。top 模块也有 sub-sub 模块的实例。层次树如下图

在此处输入图像描述

子子模块定义有一些代码写在像这样的'ifndef块中

module sub_sub()
{
...........
`ifndef OFF
<code to avoid>
`endif
...........
}

如何在编译期间禁用代码以避免仅在子模块 instance1 中?我在子模块实例中使用了`define OFF,但它禁用了代码以避免所有实例。

4

3 回答 3

2

更简洁的解决方案是传递一个参数并使用 generate-if/case 语句。例子:

module sub_sub #(parameter OFF=0) ( ... );
  generate
    if (OFF) begin
      <code to avoid>
    end
  endgenerate
endmodule

module sub ( ... );
  ...
  sub_sub #( .OFF(1'b1) ) inst ( ... );
endmodule

module top ( ... );
  ...
  sub inst0 ( ... );
  sub_sub #( .OFF(1'b0) ) inst1 ( ... );
endmodule

从技术上讲, theif (OFF)不需要显式的generate- endgenerate;否则推断。推荐用于人类可读性。

有关生成块的完整详细信息,请参阅IEEE Std 1800-2012 § 27。生成构造

于 2016-11-10T17:16:46.340 回答
1

`define 宏和大多数其他编译器指令的范围是一个编译单元。编译单元是编译器解析的源文本流。宏在它出现在编译单元中的位置被定义,并且从该位置开始可见。

由模块和其他命名空间定义的范围是无关紧要的,因为宏在任何 Verilog 或 SystemVerilog 语法被识别之前已经过预处理。这意味着您永远无法对宏定义进行特定于实例的控制。

如果您希望对代码进行特定于实例的控制,则需要使用特定于实例的覆盖来定义参数。然后你可以使用 generate-if/case 结构来控制你想要执行的代码。如果 generate 结构对您来说过于严格,您可以使用procedural-if/case 语句,优化将删除由于常量参数而未采用的分支。

于 2016-11-10T17:05:40.700 回答
0

sub_sub最好的方法是使用其他答案中建议的参数来修改您的模块。但是,如果您无法编辑/修改sub_sub模块,这可能不实用,例如,它可能是加密 IP。

在这种情况下,一种解决方案是为每个模块创建包装器嵌套sub_sub模块。您可以执行以下操作:

// Wrapper for sub_sub with OFF defined
module sub_sub_wrapper1;
  `define OFF
    `include "sub_sub.v"
  `undef OFF
endmodule

// Wrapper for sub_sub without OFF defined
module sub_sub_wrapper2;
  `include "sub_sub.v"
endmodule

////////////////

module sub;
  sub_sub_wrapper1 subsub1();
endmodule

module top;
  sub sub1();
  sub_sub_wrapper2 subsub2();
endmodule

快速样品

在这种情况下,我当然假设您能够编辑您的topsub模块。请注意,嵌套模块仅在system-verilog.

于 2016-11-12T12:58:37.253 回答