System verilog 系统verilog在特定实例中禁用` ifndef块

System verilog 系统verilog在特定实例中禁用` ifndef块,system-verilog,hdl,compiler-directives,System Verilog,Hdl,Compiler Directives,在一个系统的verilog设计中,我有一个顶层模块、一个子模块和一个子模块。在顶层模块实例化的子模块中实例化的子模块。顶层模块还有一个子模块的实例。层次结构树如下所示 子模块定义中有一些代码写在“ifndef”块中,如下所示 module sub_sub() { ........... `ifndef OFF <code to avoid> `endif ........... } module sub_sub() { ........... `ifndef关闭 `恩迪夫 ..

在一个系统的verilog设计中,我有一个顶层模块、一个子模块和一个子模块。在顶层模块实例化的子模块中实例化的子模块。顶层模块还有一个子模块的实例。层次结构树如下所示

子模块定义中有一些代码写在“ifndef”块中,如下所示

module sub_sub()
{
...........
`ifndef OFF
<code to avoid>
`endif
...........
}
module sub_sub()
{
...........
`ifndef关闭
<要避免的代码>
`恩迪夫
...........
}
如何在编译期间禁用代码以避免仅在子模块实例1中使用
我在子模块实例中使用了“define OFF”,但它禁用了代码,以避免所有实例中出现

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

模块和其他名称空间定义的作用域是不相关的,因为宏是在识别任何Verilog或SystemVerilog语法之前预处理的。这意味着您永远无法对宏定义进行特定于实例的控制


如果希望对代码进行特定于实例的控制,则需要使用特定于实例的重写定义参数。然后,您可以使用generateif/case构造来控制要执行的代码。如果generate构造对您的限制太大,您可以使用过程性的If/case语句,并且优化将删除由于常量参数而未执行的分支。

更干净的解决方案是传递参数并使用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
module sub#u sub#(参数OFF=0)(…);
生成
如果(关闭)开始
<要避免的代码>
结束
最终生成
端模
模块子(…);
...
分接头(1'b1)安装(…);
端模
模块顶部(…);
...
副研训所(……);
sub#sub#(.OFF(1'b0))inst1(…);
端模
从技术上讲,
if(OFF)
不需要显式的
generate
-
endgenerate
;这是另一种推断。建议为人类可读性


有关生成块的详细信息,请参阅§27。生成结构

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

在这种情况下,一种解决方案是为每个
sub\u 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

当然,在这种情况下,我假设您能够编辑
top
sub
模块。请注意,嵌套模块仅在
系统verilog
中受支持