强制模块只实例化一次的最简单方法是什么



假设我有一个(不可合成的(仅模拟的Verilog模块。

如果在模拟中的任何地方对其进行了多次阐述,我如何检测/强制执行?

module Singleton();
// I only want one of these...
endmodule
module GOOD_Design();
Singleton singleton();
endmodule
module BAD_Design();
Singleton singleton1();
Singleton singleton2();
endmodule
  • 我的最佳想法是在包中创建一个静态变量,并执行以下操作:
package SingletonPkg();
static bit once = 1'b0;
endpackage
module Singleton();
initial begin: singleton
if (SingletonPkg::once == 1'b1)
$fatal(2);
SingletonPkg::once = 1'b1;
end
...
endmodule: Singleton

看起来工作量很大(我仍然需要将测试/设置转换为原子操作(。我也可以对DPI功能使用相同的方法,并将比特保持在C而不是SV中

然而,还有更好/更简单的方法吗?

并且没有类

int  count = 0;
module Singleton();
initial begin
if (count != 0) 
$error("Multiple instances of %m");
count ++;
end
endmodule
module BAD_Design();
Singleton singleton1();
Singleton singleton2();
endmodule

您可以使用类使其稍微简单一点

package SingletonPkg;
class C;
static bit once = 1'b0;
function new;
if (once++ != 0) $fatal(2);
endfunction
endclass
endpackage
module Singleton();
SingletonPkg::C = new; 
...
endmodule: Singleton

最新更新