SpinalHDL之常见错误

本文作为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
...
}

问题解释:
只能从组件内部赋值组件的输出信号,否则会违反层次结构。如果发生此问题,您可能把声明信号的方向弄混了。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

千穹凌帝

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值