Verilog 阻塞与非阻塞

2024 年 8 月 29 日 | 阅读 3 分钟

Verilog 支持在 always 块中使用阻塞和非阻塞赋值语句,它们具有不同的行为。

阻塞赋值类似于大多数流行编程语言中找到的软件赋值语句。非阻塞赋值是描述许多硬件系统(尤其是用于综合)的更自然的赋值语句。

阻塞赋值只能在少数情况下使用,例如对组合逻辑建模、定义函数或实现测试平台算法。所有符合 IEEE P1364.1 的综合工具都必须支持显式样式代码中的阻塞和非阻塞赋值,但有一个限制,即每个变量和每个块只能使用一种或另一种类型的赋值。

阻塞赋值

阻塞赋值语句使用 (=) 运算符赋值,并在程序块中一个接一个地执行。但是,它不会阻止在并行块中运行的语句的执行。

有两个在并行执行的initial块。语句在每个块中顺序执行,并且两个块都在时间 0ns 处完成。

更具体地说,首先分配变量,然后是显示语句,然后是所有其他语句。

这在输出中可见,其中变量 bc 在第一个显示语句中是 8'hxx。这是因为在调用第一个 $display 时,变量 bc 的赋值尚未执行。

在下面的示例中,我们将在同一组语句中添加一些延迟以查看其反应和行为。

执行后,它给出以下数据。

非阻塞赋值

非阻塞赋值语句允许在不阻塞后续语句执行的情况下进行调度,并由 (<=) 符号指定。

相同的符号用作表达式中的关系运算符,并在非阻塞赋值的上下文中用作赋值运算符。

采用与上面相同的示例,将所有 (=) 符号替换为非阻塞赋值运算符 (<=),我们将看到输出的差异。

现在,所有 $display 语句都打印了 'h'x。 这种行为的原因是非阻塞赋值语句的执行。

在特定时间步的每个非阻塞语句的 RHS 都被捕获,并移动到下一个语句。

捕获的 RHS 值仅在时间步结束时分配给 LHS 变量。


下一主题Verilog 控制块