假设我在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 被安排在之后的增量周期中进行评估。 intermediate
和 output1
的结果将出现在下一个时间步。
有关此内容的更多信息,请参阅语言引用手册 (LRM) SystemVerilog IEEE 1800-2012第 4 节. 调度语义。
当对作为可编程逻辑电路而不是CPU的FPGA进行编程时,它将配置并行的硬件 block 。
*我在这方面都没有经验,它们只是看起来是并行计算的流行语言。如果这是错误的或者有更好的例子,请编辑问题。
关于verilog - 对verilog模块中两个或多个always block 如何工作感到困惑?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24268703/