1)该程序块何时执行?
输出a; reg a;
always@(a)
begin
// Do something...
end
在C中,当“ a”的值为非零时将执行此操作。
2)如果此if语句为真?
if(!a)
begin
// Do something...
end
我来自C语言,实际上对Verilog感到困惑。
答案 0 :(得分:1)
verilog是4状态模拟器,这意味着变量中的任何位都可以具有4个值之一:0、1,x和z。 “ x”表示未知值,verilog中的所有变量在开始时都初始化为该值。
现在,如果将a
初始化为x
,则以下语句将始终失败:
if (a) -> because x cannot be true (in verilog)
if (!a) -> false, because !x is also unknown and is x;
您应该检查verilog 4状态模拟和算术规则。
另一方面,始终阻止,直到'a'的值从'x'变为'0'为止。
always @(a) ...
因此,在您将a
的值分配为'1'之前,'if'语句将失败,并且直到您将'a'的值更改为不同于'x'的值时,始终不会执行块。这些变量的初始化通常是在测试台代码中完成的,例如在初始块中。例如
initial #10 a = 1; // initialize 'a' to '1' after 10 time units.
由于您来自“ c”,所以语言概念存在很大差异。 Verilog是一种 parallel 编程语言,这意味着所有 procedural 块均抢先并行执行。 初始块和总是块是程序块。块中的语句顺序执行,但两个不同的块并行执行。事件和延迟会导致抢占。