2017-08-29 126 views
-4

据我所知,不建议混合阻塞和非阻塞。但如果确实存在,a,b,c的值是什么?a,b,c的值是什么?

module TB; 
reg a, b, c; 
initial begin 
    a = 3; 
    b = 4; 
    $display ("a = %d, b = %d, c=%d\n", a, b, c); 
    c <= a + b; 
    $display ("a = %d, b = %d, c=%d\n", a, b, c); 
    a <= 10; 
    b <= 2; 
    c = a + b; 
    $display ("a = %d, b = %d, c=%d\n", a, b, c); 
end 
endmodule 
+0

当你试图模拟这段代码时,你是否得到意想不到的结果?有一些免费的SystemVerilog在线模拟器,如[EDA游乐场](https://www.edaplayground.com/),您应该可以使用它。 – AndresM

+0

你应该能够从程序的输出中回答你的问题。只是模拟它。 – Serge

回答

1
module TB; 
reg ***[2:0]*** a, b, c; 
initial begin 
    a = 3; 
    b = 4; 
$display ("a = %d, b = %d, c=%d\n", a, b, c); 
c <= a + b; 
$display ("a = %d, b = %d, c=%d\n", a, b, c); 
a <= 10; 
b <= 2; 
c = a + b; 
$display ("a = %d, b = %d, c=%d\n", a, b, c); 
end 
endmodule 

A = 3,B = 4,C = 7

的Verilog定时队列被分成四个部分: 活动区 - >无效 - > NBA - >缓行 阻塞赋值获得评估并在ACTIVE区域中与$ display()一起分配。虽然非阻塞分配在活动区域​​中进行评估并在非阻塞指派(NBA)区域中进行分配。因此,对a,b,c所做的任何更新都不会使用显示语句来打印。您可以使用在延期区域执行的$ monitor。

+0

谢谢'Rottenengg'修复代码和解释! –

相关问题