假设我有一个(不可合成的(仅模拟的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