【SpinalHDL快速入门】6.1、SpinalHDL语法之赋值语句

文章详细介绍了SpinalHDL中的赋值机制,包括复用时的赋值规则和赋值重叠问题。此外,讨论了宽度检查的重要性,以及如何在不匹配时调整BitVector的宽度。文章还强调了SpinalHDL对组合逻辑环路的检查,指出环路会导致错误并提供诊断信息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.1、赋值

有多个赋值运算符:

在这里插入图片描述

当进行复用时(例如使用 when),最后一个有效的标准分配将获胜。否则,向同一受让人分配两次会导致分配重叠(overlap )。

val a, b, c = UInt(4 bits)
a := 0
b := a
//a := 1 // assignment overlap with a := 0
c := a

var x = UInt(4 bits)
val y, z = UInt(4 bits)
x := 0
y := x      // y read x with the value 0
x \= x + 1
z := x      // z read x with the value 1

// Automatic connection between two UART interfaces.
uartCtrl.io.uart <> io.uart

它还支持Bundle赋值。使用()将多个信号捆绑在一起进行赋值。

val a, b, c = UInt(4 bits)
val d       = UInt(12 bits)
val e       = Bits(10 bits)
val f       = SInt(2  bits)
val g       = Bits()

(a, b, c) := B(0, 12 bits)
(a, b, c) := d.asBits
(a, b, c) := (e, f).asBits
g         := (a, b, c, e, f).asBits

在SpinalHDL中,理解一个信号的本质(组合/时序)是通过其声明来定义的,而不是通过它被赋值的方式。所有数据类型实例都将定义一个组合信号,而使用Reg(…)包装的数据类型实例将定义一个时序(寄存器)信号。

val a = UInt(4 bits) // Define a combinational signal
val b = Reg(UInt(4 bits)) // Define a registered signal
val c = Reg(UInt(4 bits)) init(0) // Define a registered signal which is set to 0 when a reset occurs

1.2、宽度检查

SpinalHDL 检查赋值语句左右两侧的位数是否匹配。有多种方法可以调整给定 BitVector(Bits、UInt、SInt)的宽度:

在这里插入图片描述
有一种情况,Spinal会自动调整值的大小:

在这里插入图片描述

1.3、组合逻辑环路

SpinalHDL 检查您的设计中是否存在组合逻辑环路(锁存器)。如果检测到其中一个,它会引发错误并且 SpinalHDL 将打印出该环路的路径。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

ReCclay

如果觉得不错,不妨请我喝杯咖啡

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

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

打赏作者

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

抵扣说明:

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

余额充值