如果它被包含在内,则绑定忽略if

时间:2015-04-08 19:14:23

标签: system-verilog

很简单的例子:

`ifdef the_define
  bind(....);
`endif

尝试bind()是否定义了the_define。 为什么?如果它是正确的行为,如何绑定是有条件的?

1 个答案:

答案 0 :(得分:0)

似乎按预期工作:

`timescasle 1ns/1ns
module tb;
  initial #10 $finish;
endmodule
module binder();
  initial $display("%m @ %2t",$time);
  final   $display("%m @ %2t", $time);
endmodule
`ifdef the_define
bind tb binder ibind();
`endif

使用+define+the_define结果进行编译:

tb.ibind @  0
tb.ibind @ 10

编译时没有+define+the_define结果:

binder @  0
binder @ 10

没有示例是有道理的,因为binder现在被认为是顶级模块。一些模拟器可以选择指定单个顶部,将其他顶部模块视为未使用。阻止binder成为顶级模块的另一种方法是将其移动到库文件/控制器(通常通过-v / -y包含)。从历史上看,我已经看到一些模拟器给出了这种方法的错误,因为它在考虑bind之前优化了未使用的模块;所以用你自己的工具集进行实验。另一种方法是`ifdef模块本身;如果你有很多配置,很容易做但不是很灵活。

必须在编译/详细时间知道

bind。它不是模拟运行时选项。

其他可能性是:

  • 你没有做一个干净的重新编译(也就是之前编译的神器)
  • 您环境中的其他内容正在设置定义the_define(暂时可用性)