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

时间:2012-10-26 05:35:15

标签: 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中使用'&lt; ='。

2 个答案:

答案 0 :(得分:2)

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

  2. "="阻止分配,"<="为非阻止分配。

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

答案 1 :(得分:2)

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

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

以上示例与:

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

然而,如果我们切换到使用<=那么它们在模拟中不再相同,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 @之后的语句。如果它是基于边缘的,它们将使用一种触发器,如果​​它是组合的,它们将放置组合逻辑。 =<=的使用仅对模拟有影响。使用错误的类型意味着您的模拟将与合成的硬件不匹配。