## 定义为组件输入的寄存器(Register defined as component input) ### 一、简介 在SpinalHDL中, 用户不被允许定义一个将寄存器作为输入的组件。原因是为了预防可能发生的意外, 如用户会尝试着将寄存器信号作为子组件的输入驱动。如果确实需要一个寄存器输入, 用户可以在`io`包中先定义一个非寄存器输入, 随后在组件内部对其添加寄存器。 ### 二、例子 下述代码: ```Scala class TopLevel extends Component { val io = new Bundle { val a = in(Reg(UInt(8 bits))) } } ``` 会产生如下报错: ``` REGISTER DEFINED AS COMPONENT INPUT : (toplevel/io_a : in UInt[8 bits]) is defined as a registered input of the toplevel component, but isn't allowed. *** Source file location of the toplevel/io_a definition via the stack trace *** ``` 修复为: ```Scala class TopLevel extends Component { val io = new Bundle { val a = in UInt(8 bits) } } ``` 如果需要一个寄存器信号`a`, 可以按照如下方式使用: ```Scala class TopLevel extends Component { val io = new Bundle { val a = in UInt(8 bits) } val a = RegNext(io.a) } ```