verilog - 在verilog中使用 '<='运算符

标签 verilog system-verilog hdl

谁能解释一下为什么当我们使用“<=”而不是“=”时这个特定模块不起作用

module TestCell(x0, x1, y0, y1, z);
input x0, x1, y0, y1;
output z;
reg z;
reg a1, a2, a3, a4;
always @(x0 or x1 or y0 or y1) begin
a1 <= ~(x0 & y1);
a2 <= ~(y0 & x1);
a3 <= ~(a2 | a1);
a4 <= a2 & a1;
z <= ~(a4 | a3);
end
endmodule

为了在 verilog 中使用“<=”,我们应该确保什么。

最佳答案

正如克苏鲁所说=是阻塞的,这意味着该语句将在进入下一行代码之前被评估。

always @* begin 
  a = b & c;
  d = e & f;
  g = a & d ;
end

上面的例子与:

always @* begin
  g = b & c & e & f;
end

但是,如果我们改用 <=然后它们在模拟中不再相同,g将是旧的a和旧的b。由于这是一个组合 block ,即不像触发器那样定期触发或评估,因此您将从模拟中得到奇怪的结果。

正确使用<=非阻塞赋值意味着触发器。

always @(posedge clk or negedge rst_n) begin
  if (!rst_n) begin
    a <= 1'b0;
    d <= 1'b0;
    g <= 1'b0;
  end
  else begin
      a <= b & c;
      d <= e & f;
      g <= a & d ;
  end
end

在上面的触发器示例中,g 采用上一个 clk 周期中的 a 和 d 值,而不是当前评估值。

在您的示例中,您使用了 always @(sensitivity list) ,这是一个组合电路和 =将是正确的用法。我还建议切换到 always @*如果你的模拟器允许的话。 *是通配符,无需手动输入敏感度列表。

我认为值得记住的是,综合工具将其结果基于always @之后的语句。如果它是基于边缘的,他们将使用一种触发器,如果​​它是组合的,他们将放置组合逻辑。使用=<=仅在模拟中有效。使用错误的类型意味着您的模拟将与合成的硬件不匹配。

关于verilog - 在verilog中使用 '<='运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13081313/

相关文章:

verilog - 在 vivado 中合成分层名称时出错

Verilog 移位扩展结果?

syntax-error - 我如何查看为什么在vivado的 “syntax error files”中列出了文件

verilog - 是否有系统 verilog 任务返回 reg/logic 的长度?

verilog - 算术移位充当逻辑移位,无论有符号变量如何

Verilog 可能的锁存器

indexing - 在 Verilog 中实例化多个模块

random - 在systemverilog中使用随机随机1位和2位错误

arrays - 如何在Verilog中将二维数组中的所有位设置为0?

verilog - Modelsim 中的参数问题