2

谁能解释为什么当我们使用'<='而不是'='时这个特定模块不起作用的原因

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中使用'<='我们应该确保什么。

4

2 回答 2

2
  1. 在组合逻辑的情况下,有"="赋值,对于顺序块,我们有"<="运算符。

  2. "="是阻塞赋值,"<="是非阻塞赋值。

  3. "="在开始/结束内顺序执行代码,而非阻塞"<="并行执行。

更多的

于 2012-10-26T05:41:24.263 回答
2

正如 Cthulhu 所说 =的阻塞,这意味着在继续下一行代码之前将对语句进行评估。

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

上面的例子是一样的:

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

但是,如果我们切换到使用<=Then 它们在模拟中不再相同,g 将是 OLD a AND OLD b。由于这是一个组合块,即不像触发器那样定期触发或评估,因此您会从模拟中得到奇怪的结果。

正确使用<=非阻塞赋值是在暗示触发器。

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 @基于如果它是基于边缘的语句,它们将使用一种触发器,如果​​它是组合的,它们将放置组合逻辑。使用=or<=仅对模拟有影响。使用错误的类型意味着您的模拟将与合成的硬件不匹配。

于 2012-10-26T08:45:20.120 回答