Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/api/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Verilog 何时执行此块?_Verilog - Fatal编程技术网

Verilog 何时执行此块?

Verilog 何时执行此块?,verilog,Verilog,1) 何时执行此程序块 输出a; 注册a 在C中,当“a”的值非零时,将执行此操作 2) 这个if语句什么时候是真的 if(!a) begin // Do something... end 我来自C语言,实际上我对Verilog感到困惑。Verilog是4状态模拟器,这意味着变量中的任何位都可以有4个值中的一个:0、1、x和zx'表示未知值,verilog中的所有变量在开始时都初始化为该值 现在,如果a初始化为x,以下语句将始终失败: if (a) -> because x cannot

1) 何时执行此程序块

输出a; 注册a

在C中,当“a”的值非零时,将执行此操作

2) 这个if语句什么时候是真的

if(!a)
begin
// Do something...
end

我来自C语言,实际上我对Verilog感到困惑。

Verilog是4状态模拟器,这意味着变量中的任何位都可以有4个值中的一个:0、1、x和zx'表示未知值,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状态模拟和算术规则

另一方面,Always块将等待“a”的值更改,例如,从“x”更改为“0”

always @(a) ...
因此,除非您将
的值赋值为'1',否则'if'语句将失败,并且在您将'a'的值更改为与'x'不同的值之前,始终不会执行块。这些变量的初始化通常在测试台代码中完成,比如在初始块中。比如说

 initial #10 a = 1; // initialize 'a' to '1' after 10 time units. 

因为你来自“c”,所以在语言概念上有很大的不同。Verilog是一种并行编程语言,它意味着所有的过程块都是以抢占方式并行执行的。初始块和始终块都是程序块。a侧块中的语句按顺序执行,但两个不同的块并行执行。事件和延迟导致抢占

始终
的可能重复不是程序性陈述。请参见@dave_59 always,初始(和最终)块是程序块。你是什么意思?@Serge,不,它们不是过程块或语句,它们是实例化过程块或语句的构造
begin/end
是一个程序块。@dave_59从技术上讲你是正确的,但lrm(1800)(在1.8中)将它们定义为程序块,并且(1364)在多个地方提到了这个术语。这并不完全正确。程序块确实是并行执行的。但Verilog中没有定义抢占行为。这意味着顺序过程块(在
开始/结束
块中的语句)按顺序执行,但不同并行块中的语句之间没有定义顺序。同意,verilog没有定义抢占行为,尽管其行为类似。i、 e.每个#延迟将允许其他调度块执行,而当前块在当前周期停止执行,并被调度在未来继续。我想这种方式是可以更好地理解一个“c”的人:-)。
 initial #10 a = 1; // initialize 'a' to '1' after 10 time units.