首页 > 其他分享 >SpinalHDL之错误修复(下篇)

SpinalHDL之错误修复(下篇)

时间:2024-07-11 23:28:13浏览次数:18  
标签:下篇 修复 val SpinalHDL UInt result extends bits class

此箫非彼箫,不竹不丝不石。

肉音别自唔咿。

流苏瑟瑟纱垂,辨不出宫商角徵。

一点樱桃欲绽,纤纤十指频移。

课吞添吐两情痴,不觉悟灵犀味美

推荐小说《回到明朝当王爷》,也有动漫,但小说改国漫通病,小说中杀伐果断人设极好的男主,到了动漫里就变成犹犹豫豫优柔寡断的废材,参见《元龙》

本文作为SpinalHDL学习笔记第十二篇,记录使用SpinalHDL一些代码错误的修复方法。

SpinalHDL学习笔记总纲链接如下:

SpinalHDL 学习笔记_spinalhdl blackbox-CSDN博客

 

目录:

11.作用域违例 (Scope violation)

12.Spinal 无法克隆类 (Spinal can’t clone class)

13.未赋值的寄存器 (Unassigned register)

14.无法访问的 is 语句 (Unreachable is statement)

15.位宽不匹配 (Width mismatch)

11.作用域违例 (Scope violation)

SpinalHDL 将会检查有没有信号会在超出其定义的作用域之外被赋值使用。这个错误不容易触发,因为它需要一些特定的元硬件描述技巧。

示例:

class TopLevel extends Component {
val cond = Bool()
var tmp : UInt = null
when(cond) {
tmp = UInt(8 bits)
}
tmp := U"x42"
}

会报错:

SCOPE VIOLATION : (toplevel/tmp : UInt[8 bits]) is assigned outside its␣
,→declaration scope at
***
Source file location of the tmp := U"x42" via the stack trace
***

一个可能的修复方法是:

class TopLevel extends Component {
val cond = Bool()
var tmp : UInt = UInt(8 bits)
when(cond) {
}
tmp := U"x42"
}

12.Spinal 无法克隆类 (Spinal can’t clone class)

当 SpinalHDL 想要通过 cloneOf 函数创建一个新的数据类型实例,但做不到这一点时,就会出现此错误。出现这种情况的原因几乎都是因为它无法检索 Bundle 的构造参数。

示例1:

// cloneOf(this) isn't able to retrieve the width value that was used to construct␣
,→itself
class RGB(width : Int) extends Bundle {
val r, g, b = UInt(width bits)
}
class TopLevel extends Component {
val tmp = Stream(new RGB(8)) // Stream requires the capability to cloneOf(new␣
,→RGB(8))
}

会报错:

*** Spinal can't clone class spinal.tester.PlayDevMessages$RGB datatype
*** You have two way to solve that :
*** In place to declare a "class Bundle(args){}", create a "case class Bundle(args)
,→{}"
*** Or override by your self the bundle clone function
***
Source file location of the RGB class definition via the stack trace
***

一个可能的修复方法是:

case class RGB(width : Int) extends Bundle {
val r, g, b = UInt(width bits)
}
class TopLevel extends Component {
val tmp = Stream(RGB(8))
}

示例2:

case class Xlen(val xlen: Int) {}
case class MemoryAddress()(implicit xlenConfig: Xlen) extends Bundle {
val address = UInt(xlenConfig.xlen bits)
}
class DebugMemory(implicit config: Xlen) extends Component {
val io = new Bundle {
val inputAddress = in(MemoryAddress())
}
val someAddress = RegNext(io.inputAddress) // -> ERROR␣
,→*****************************
}

会报错:

[error] *** Spinal can't clone class debug.MemoryAddress datatype

在这种情况下,一种解决方案是覆盖克隆函数以传递隐式参数:

case class MemoryAddress()(implicit xlenConfig: Xlen) extends Bundle {
val address = UInt(xlenConfig.xlen bits)
override def clone = MemoryAddress()
}

Note:我们需要克隆的是硬件的单元,而不是最终在其中赋值的值。

13.未赋值的寄存器 (Unassigned register)

SpinalHDL 将检查所有影响设计的寄存器是否已在某处被赋值。

示例:

class TopLevel extends Component {
val result = out(UInt(8 bits))
val a = Reg(UInt(8 bits))
result := a
}

会报错:

UNASSIGNED REGISTER (toplevel/a : UInt[8 bits]), defined at
***
Source file location of the toplevel/a definition via the stack trace
***

一个可能的修复方法是:

class TopLevel extends Component {
val result = out(UInt(8 bits))
val a = Reg(UInt(8 bits))
a := 42
result := a
}

只有初始化 (init) 的寄存器

在某些情况下,由于设计参数化,生成一个没有赋值而只有 init 语句的寄存器可能是有意义的。

示例:

class TopLevel extends Component {
val result = out(UInt(8 bits))
val a = Reg(UInt(8 bits)) init(42)
if(something)
a := somethingElse
result := a
}

会报错:

UNASSIGNED REGISTER (toplevel/a : UInt[8 bits]), defined at
***
Source file location of the toplevel/a definition via the stack trace
***

要修复这个问题,如果寄存器有一个 init 语句但没有赋值,你可以让 SpinalHDL 将该未赋值的寄存器转换为组合逻辑:

class TopLevel extends Component {
val result = out(UInt(8 bits))
val a = Reg(UInt(8 bits)).init(42).allowUnsetRegToAvoidLatch
if(something)
a := somethingElse
result := a
}

14.无法访问的 is 语句 (Unreachable is statement)

SpinalHDL 将确保 switch 中的所有 is 语句均可访问。

示例:

class TopLevel extends Component {
val sel = UInt(2 bits)
val result = UInt(4 bits)
switch(sel) {
is(0){ result := 4 }
is(1){ result := 6 }
is(2){ result := 8 }
is(3){ result := 9 }
is(0){ result := 2 } // Duplicated is statement!
}
}

会报错:

UNREACHABLE IS STATEMENT in the switch statement at
***
Source file location of the is statement definition via the stack trace
***

一个可能的修复方法是:

class TopLevel extends Component {
val sel = UInt(2 bits)
val result = UInt(4 bits)
switch(sel) {
is(0){ result := 4 }
is(1){ result := 6 }
is(2){ result := 8 }
is(3){ result := 9 }
}
}

15.位宽不匹配 (Width mismatch)

SpinalHDL 将检查赋值左侧和右侧的运算操作和信号具有相同的位宽。

赋值示例:

class TopLevel extends Component {
val a = UInt(8 bits)
val b = UInt(4 bits)
b := a
}

会报错:

WIDTH MISMATCH on (toplevel/b : UInt[4 bits]) := (toplevel/a : UInt[8 bits]) at
***
Source file location of the OR operator via the stack trace
***

一个可能的修复方法是:

class TopLevel extends Component {
val a = UInt(8 bits)
val b = UInt(4 bits)
b := a.resized
}

运算操作示例:

class TopLevel extends Component {
val a = UInt(8 bits)
val b = UInt(4 bits)
val result = a | b
}

会报错:

WIDTH MISMATCH on (UInt | UInt)[8 bits]
- Left operand : (toplevel/a : UInt[8 bits])
- Right operand : (toplevel/b : UInt[4 bits])
at
***
Source file location of the OR operator via the stack trace
***

一个可能的修复方法是:

class TopLevel extends Component {
val a = UInt(8 bits)
val b = UInt(4 bits)
val result = a | (b.resized)
}

标签:下篇,修复,val,SpinalHDL,UInt,result,extends,bits,class
From: https://blog.csdn.net/m0_59092412/article/details/140334792

相关文章

  • 《尘埃4》游戏启动难题:msvcp100.dll缺失的全方位修复指南
    当您兴致勃勃地准备在《尘埃4》(DiRT4)中驰骋赛道,却突然遭遇“找不到msvcp100.dll文件”的错误提示时,这无疑是对游戏热情的一种打击。msvcp100.dll是MicrosoftVisualC++2010运行库的一部分,许多现代游戏和应用程序依赖于它才能正常运行。本文将详细介绍几种有效的方法来解决这......
  • 老照片修复转视频彻底火了,通过AI绘画+视频技术,只需三步超简单出片
    大家好,我是程序员晓晓最近网上突然爆火的老照片转成视频不知道大家有没有刷到。这些都是通过AI绘画技术+AI视频图生视频技术完成的,先来看一下网上的成片吧。这一内容为什么会突然火起来呢?大概率是抓住了大家心里的一份情怀吧。大家可以将家里面以前的黑白老照片,或者已......
  • linux文件系统损坏如何修复
    修复损坏的Linux文件系统的方法取决于具体的损坏原因和文件系统类型。以下是一些常见的修复方法:使用fsck命令:打开终端并以root用户身份登录。运行fsck命令来检查和修复文件系统。例如,如果文件系统是ext4类型,可以运行fsck.ext4/dev/sda1来检查和修复/dev/sda1分区上的文件系统......
  • linux RAID10磁盘阵列损坏的修复
    在Linux系统中,RAID10磁盘阵列损坏的修复是一个涉及多个步骤的过程。RAID10结合了RAID1的镜像和RAID0的条带化,提供了较高的数据冗余和读写性能。当RAID10磁盘阵列中的某个磁盘损坏时,可以通过以下步骤进行修复:检查磁盘状态首先,使用mdadm命令检查RAID10磁盘阵列的状态,以确认哪些......
  • 服务器硬盘报错修复
    一、初步诊断查看报错信息:首先,需要仔细查看服务器的报错信息,了解硬盘报错的具体类型和代码。这些信息通常可以在服务器的BIOS、操作系统的事件查看器或硬盘的SMART报告中找到。评估硬盘状态:使用硬盘的SMART(自我监测、分析和报告技术)工具来评估硬盘的健康状况。SMART可以检测硬......
  • RAID10磁盘阵列损坏修复操作
    服务器数据恢复是指将物理服务器或虚拟服务器上丢失的数据重现还原的操作。随着信息化的深入,企事业单位大都会配备服务器,方便数据集中存储管理,建立自己的信息系统。服务器上的数据通常是存储在硬盘上,出于数据安全和性能的考虑,这些硬盘会组建RAID磁盘阵列。服务器对用户的重要程度......
  • 硬盘坏道如何修复
    硬盘出现坏道时,修复的方法取决于坏道的类型,即逻辑坏道或物理坏道。一、逻辑坏道的修复逻辑坏道通常是由于文件系统错误、病毒或软件错误等原因导致的,这类坏道可以通过软件手段进行修复。使用系统工具:Windows系统:在Windows操作系统中,可以使用内置的磁盘检查工具(如chkdsk命令)来......
  • VMware虚拟机修复
    一、重启VMware和虚拟机重启VMware:首先尝试重启VMware软件本身,有时软件的小故障或冲突可以通过重启来解决。重启虚拟机:在VMware中重启虚拟机,看是否能够正常启动和运行。二、使用VMware的修复工具如果重启VMware和虚拟机后问题依旧存在,可以尝试使用VMware自带的修复工具来修复......
  • Java虚拟机(JVM)修复
    一、确定问题原因首先,需要明确Java虚拟机出现问题的具体原因。这可以通过以下方式进行:查看错误日志:JVM和Java应用程序会生成日志文件,这些文件记录了运行时的详细信息,包括错误信息和系统警告。通过查看这些日志,可以获得导致JVM故障的线索。使用调试工具:如jstack、jmap、jconsole......
  • 数据库修复数据恢复
    数据库修复和数据恢复是数据库管理中非常重要的环节,它们涉及通过技术手段将损坏或丢失的数据库文件恢复到可正常使用的状态。一、数据库修复数据库修复是指通过技术手段将损坏的数据库文件修复至可正常使用的数据库文件的过程。数据库损坏可能由多种原因引起,如服务器宕机、数据......