本文作为SpinalHDL学习笔记第四十八篇,介绍 在使用 SpinalHDL 时可能出现的错误。
目录:
1.“main”线程中异常 java.lang.NullPointerException
2.层次违例 (Hierarchy violation)
1.“main”线程中异常 java.lang.NullPointerException
控制台输出:
Exception in thread "main" java.lang.NullPointerException
代码示例:
val a = b + 1 //b can't be read at that time, because b isn't instantiated yet
val b = UInt(4 bits)
问题解释:
SpinalHDL 不是一种语言,它是一个 Scala 库,这意味着它遵循与 Scala 语言相同的通用规则。当运行SpinalHDL 硬件描述来生成相应的 VHDL/Verilog RTL 时, SpinalHDL 硬件描述将作为 Scala 程序执行,并且执行程序到该行时, b 将是一个 null 空引用,这就是为什么你在这之前不能使用它的原因。
2.层次违例 (Hierarchy violation)
SpinalHDL 编译器从层次结构的角度检查所有赋值是否合法。
Signal X can’ t be assigned by Y
控制台输出:
Hierarchy violation : Signal X can't be assigned by Y
代码示例:
class ComponentX extends Component{
...
val X = Bool()
...
}
class ComponentY extends Component{
...
val componentX = new ComponentX
val Y = Bool()
componentX.X := Y //This assignment is not legal
...
}
class ComponentX extends Component{
val io = new Bundle{
val X = Bool() //Forgot to specify an in/out direction
}
...
}
class ComponentY extends Component{
...
val componentX = new ComponentX
val Y = Bool()
componentX.io.X := Y //This assignment will be detected as not legal
...
}
问题解释:
只能给子组件的输入信号赋值,否则会违反层次结构。如果发生这样的问题,可能是忘记指定 X 信号的方向。
Input signal X can’ t be assigned by Y
控制台输出:
Hierarchy violation : Input signal X can't be assigned by Y
代码示例:
class ComponentXY extends Component{
val io = new Bundle{
val X = in Bool()
}
...
val Y = Bool()
io.X := Y //This assignment is not legal
...
}
问题解释:
只能从父组件对输入信号赋值,否则会违反层次结构。如果发生此问题,可能把声明的信号方向弄
混了。
Output signal X can’ t be assigned by Y
控制台输出:
Hierarchy violation : Output signal X can't be assigned by Y
代码示例:
class ComponentX extends Component{
val io = new Bundle{
val X = out Bool()
}
...
}
class ComponentY extends Component{
...
val componentX = new ComponentX
val Y = Bool()
componentX.X := Y //This assignment is not legal
...
}
问题解释:
只能从组件内部赋值组件的输出信号,否则会违反层次结构。如果发生此问题,您可能把声明信号的方向弄混了。