Area

有时,创建一个 Component 组件来定义某些逻辑是多余的,因为:

  • 需要定义所有构造参数和IO(冗长、重复)

  • 拆分您的代码(超出需求)

对于这种情况,您可以使用 Area 来定义一组信号/逻辑:

class UartCtrl extends Component {
  ...
  val timer = new Area {
    val counter = Reg(UInt(8 bits))
    val tick = counter === 0
    counter := counter - 1
    when(tick) {
      counter := 100
    }
  }

  val tickCounter = new Area {
    val value = Reg(UInt(3 bits))
    val reset = False
    when(timer.tick) {          // Refer to the tick from timer area
      value := value + 1
    }
    when(reset) {
      value := 0
    }
  }

  val stateMachine = new Area {
    ...
  }
}

小技巧

在 VHDL 和 Verilog 中,有时使用前缀将变量分隔成逻辑部分。建议您在 SpinalHDL 中使用 Area 代替它。

备注

ClockingArea 是一种特殊的 Area ,它允许您在该硬件块中缺省使用指定的 ClockDomain 时钟域