verilog - 对verilog模块中两个或多个always block 如何工作感到困惑?

标签 verilog

假设我在verilog模块中有两个always block 。这两个 block 同时工作吗?

always @(posedge clk) begin
  //some code
 end

always @(Input1 or Input2) begin
  //some logic
end

我知道它们内部的数据是按顺序执行的。两个 block 如何执行???这就是令人不安的观点的问题。我需要有一个大局观。

最佳答案

Verilog 是一种 HDL(硬件描述语言),硬件可以设计有许多并行电路,因此为此的模拟器必须能够模拟设计的并行性。

Verilog 语言并不像 Scala 和 GO* 等其他并发语言那样使用。

Verilog 在时间步上生成所有并发结果,可以设置为 1 皮秒之类的值。 Delta 周期(时间步之间)用于计算组合部分并解决反馈。

always @(thoughtge clk) block 仅在 clk 出现上升沿时才需要计算。
当右侧参数或 if/case 语句的输入发生变化时,必须评估 always @* 或手动敏感度列表(不再推荐)。

例如

// Block 1
always @* begin //Sensitivity list would be 'Input1, Input2'
  intermediate = Input1 + Input2;
end

// Block 2
always @* begin //Sensitivity list would be 'intermediate'
  output1 = intermediate >> 1; // divide by 2
end

当输入 1 或输入 2 更改时, block 1 将被安排在下一个增量周期中进行评估,这反过来又会导致 block 2 被安排在之后的增量周期中进行评估。 intermediateoutput1 的结果将出现在下一个时间步。

有关此内容的更多信息,请参阅语言引用手册 (LRM) SystemVerilog IEEE 1800-2012第 4 节. 调度语义

当对作为可编程逻辑电路而不是CPU的FPGA进行编程时,它将配置并行的硬件 block 。

*我在这方面都没有经验,它们只是看起来是并行计算的流行语言。如果这是错误的或者有更好的例子,请编辑问题。

关于verilog - 对verilog模块中两个或多个always block 如何工作感到困惑?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24268703/

相关文章:

verilog - 具有不同输入的系统 Verilog 接口(interface)

verilog - 如何实现超过一个时钟周期的时序逻辑?

verilog - 如何在 Verilog 中将寄存器数组传递到具有单位输入和输出的缓冲区?

arrays - Verilog 数组分配

python - 如何在 MyHDL 中接收输入总线?

syntax-error - ModelSim Verilog编译器错误

arrays - 未封装端口中尺寸说明符的顺序

verilog - Verilog/SV中是否有类似casex的ifx-elsex语句?

verilog - 如何在 verilog 中设计 16 位进位前瞻加法器

verilog - 在 Verilog 中使用阻塞分配来推断触发器