我是系统verilog的新手,我坚持使用基本概念,请提供以下行为背后的理由:
2.为什么,即使静态变量被赋予非阻塞语句,该静态变量的变化也不会立即可见($ display),在延迟说#1后可用。
示例:
class A ;
static int i;
endclass
program main ;
A obj;
initial
begin
obj.i = 123; // Not Allowed, can only be done using <= ... WHY ??
$display(obj.i);
#1 $display(obj.i);
end
endprogram
答案 0 :(得分:1)
IEEE 1800-2012 LRM早期版本的SystemVerilog中没有这样的规则对允许的分配类型有更多限制,但这些都已被删除。我不建议任何人再使用程序块。有很多不必要的混淆。见http://go.mentor.com/programblocks
答案 1 :(得分:-1)
SystemVerilog中“program”块的目的是保证如果用户将其测试平台封装在程序块中并且将DUT保持在DUT之外,则测试平台和DUT之间不会出现任何竞争条件。程序块。避免竞争条件的另一种方法是通过将DUT / testbench交互限制到接口/时钟块来实现。另请注意:
a)阻止分配(因为它们是立即执行的,因此执行的结果可能随着线程的执行顺序而变化)会导致竞争条件
b)硬件(RTL)变量只能是静态的
鉴于整个场景,编译器发现阻塞语句可能导致DUT和测试平台之间的竞争条件。因而错误。
使用非阻塞分配时,分配已安排,不会立即执行。一旦调度程序有机会执行它,它就会被执行。而这只会在当前线程产生后才会发生,因为阻塞表达式涉及时间增量。在给定的代码片段中,一旦执行的线程遇到#1就会发生; #1之后的$ display会看到非阻塞分配的结果,而之前的那个没有。