层次违例(Hierarchy violation)
简介
SpinalHDL将会检查当前层次设计的信号不会访问到该组件的外部区域。
以下信号可以在组件内部读取:
当前组件中定义的所有无方向信号
当前组件的所有in/out/inout信号
子组件的所有in/out/inout信号
同时,以下信号可以在组件内部赋值:
当前组件中定义的所有无方向信号
当前组件的所有out/inout信号
子组件的所有in/inout信号
如果出现 HIERARCHY VIOLATION
错误,则意味着违反了上述规则之一。
示例
下面的代码:
class TopLevel extends Component {
val io = new Bundle {
// This is an 'in' signal of the current component 'Toplevel'
val a = in UInt(8 bits)
}
val tmp = U"x42"
io.a := tmp // ERROR: attempting to assign to an input of current component
}
会报错:
HIERARCHY VIOLATION : (toplevel/io_a : in UInt[8 bits]) is driven by (toplevel/tmp : UInt[8 bits]), but isn't accessible in the toplevel component.
***
Source file location of the `io.a := tmp` via the stack trace
***
一个可能的修复方法是:
class TopLevel extends Component {
val io = new Bundle {
val a = out UInt(8 bits) // changed from in to out
}
val tmp = U"x42"
io.a := tmp // now we are assigning to an output
}