首页 > 其他分享 >SpinalHDL之实用工具(上篇)

SpinalHDL之实用工具(上篇)

时间:2024-07-11 23:28:29浏览次数:12  
标签:val SpinalHDL 实用工具 数据类型 Cat 硬件 BigInt

本文作为SpinalHDL学习笔记第十三篇,记录使用SpinalHDL的一些实用性语法工具。

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

SpinalHDL 学习笔记_spinalhdl blackbox-CSDN博客

SpinalHDL的核心定义了许多功能性语法:

• 类型/字面量

• 寄存器/时钟域

• 组件/逻辑区

• 随机访问/只读存储器

• When / Switch / Mux

• BlackBox(在 Spinal 内部集成 VHDL 或 Verilog IP)

• SpinalHDL 到 VHDL 的转换器

然后,通过使用这些功能可以定义数字硬件,并构建强大的库和抽象。这也是 SpinalHDL 相对于其他常用 HDL 的主要优势之一,因为无需了解编译器内部原理即可扩展该语言。

一个很好的例子是SpinalHDL lib,它添加了许多实用程序、工具、总线和方法。

许多工具和实用程序都存在于spinal.lib 中,但有些工具和实用程序已经存在于 SpinalHDL Core 中。

语法

返回类型

描述

widthOf(x : BitVector)

Int

返回 Bits/UInt/SInt 信号的位宽

log2Up(x : BigInt)

Int

返回表示 x 状态所需的位数

isPow2(x:BigInt)

Boolean

如果 x 是 2 的幂,则返回 true

roundUp(that : BigInt, by: BigInt)

BigInt

返回第一个 by 乘以“that“(包含)的值

Cat(x: Data*)

连接所有参数,从 MSB 到 LSB,请参阅Cat

Cat(x: Iterable[Data])

连接参数, 从 LSB 到 MSB, 参见Cat

目录:

1.Cat

2.克隆硬件数据类型

3.将数据类型作为构造函数参数传递

4.频率和时间

5.二进制前缀

Cat

如上所述, Cat 有两个版本。两个版本都连接了它们包含的信号,但有细微的差别:

• Cat(x: Data*) 使用任意数量的硬件信号作为参数。它模拟了其他 HDL 且 MSB 变成了结果Bits 最左端的参数,最右端是 LSB . 换种说法:输入按照参数顺序拼接.

• Cat(x: Iterable[Data]) 接受包含硬件信号的单个 Scala 可迭代集合(Seq / Set / List / …)。此版本将列表的第一个元素放入 LSB,最后一个元素放入 MSB。

差异主要在于这样的约定: Bits 是从最高索引到最低索引写入的,而列表是从索引 0 开始写入到最高索引的。所有约定中, Cat 将索引 0 放置在 LSB 处。

val bit0, bit1, bit2 = Bool()
val first = Cat(bit2, bit1, bit0)
// is equivalent to
val signals = List(bit0, bit1, bit2)
val second = Cat(signals)

2.克隆硬件数据类型

你可以使用 cloneOf(x) 函数克隆给定的硬件数据类型。它将返回相同 Scala 类型和参数的新实例。

例如:

def plusOne(value : UInt) : UInt = {
// Will provide new instance of a UInt with the same width as ``value``
val temp = cloneOf(value)
temp := value + 1
return temp
}
// treePlusOne will become a 8 bits value
val treePlusOne = plusOne(U(3, 8 bits))

Note:如果你在 Bundle 上使用 cloneOf 函数,这个 Bundle 应该是一个 case class ,否则应该在内部重写 clone 函数。

// An example of a regular 'class' with 'override def clone()' function
class MyBundle(ppp : Int) extends Bundle {
val a = UInt(ppp bits)
override def clone = new MyBundle(ppp)
}
val x = new MyBundle(3)
val typeDef = HardType(new MyBundle(3))
val y = typeDef()
cloneOf(x) // Need clone method, else it errors
cloneOf(y) // Is ok

3.将数据类型作为构造函数参数传递

许多可重用硬件需要通过数据类型进行参数化。例如,如果想定义 FIFO 或移位寄存器,则需要一个参数来指定组件所需的有效负载类型。

有两种类似的方法可以做到这一点。

老办法

老方法的一个很好的例子是 ShiftRegister 组件的定义:

case class ShiftRegister[T <: Data](dataType: T, depth: Int) extends Component {
val io = new Bundle {
val input = in (cloneOf(dataType))
val output = out(cloneOf(dataType))
}
// ...
}

以下是实例化该组件的方法:

val shiftReg = ShiftRegister(Bits(32 bits), depth = 8)

如你所见,原始硬件类型直接作为构造参数传递。每次你想创建这种硬件数据类型的新实例时,你需要使用 cloneOf(...) 函数。以这种方式做事并不是超级安全,因为很容易忘记使用 cloneOf。

安全的方法

安全的传递数据类型参数方法,示例如下:

case class ShiftRegister[T <: Data](dataType: HardType[T], depth: Int) extends Component {
val io = new Bundle {
val input = in (dataType())
val output = out(dataType())
}
// ...
}

以下是实例化组件的方法(与之前完全相同):

val shiftReg = ShiftRegister(Bits(32 bits), depth = 8)

请注意,上述示例中使用了一个 HardType 包装器,它包装了原始数据类型 T,这种做法比“旧方法”更容易使用。因为要创建硬件数据类型的新实例,只需调用 HardType 的 apply 函数(或者换句话说,在类型名后添加括号)。此外,从用户的角度来看,这种机制是完全透明的,因为硬件数据类型可以隐式转换为 HardType。

4.频率和时间

SpinalHDL 有专用语法来定义频率和时间值:

val frequency = 100 MHz // infers type TimeNumber
val timeoutLimit = 3 ms // infers type HertzNumber
val period = 100 us // infers type TimeNumber
val periodCycles = frequency * period // infers type BigDecimal
val timeoutCycles = frequency * timeoutLimit // infers type BigDecimal

对于时间定义,可以使用以下后缀来获取 TimeNumber:

fs、 ps、ns、us、ms、sec、mn、hr

对于时间定义,可以使用以下后缀来获取 HertzNumber:

Hz, KHz, MHz, GHz, THz

TimeNumber 和 HertzNumber 是基于 PhysicalNumber 类,它使用 scala BigDecimal 来存储数字。

5.二进制前缀

SpinalHDL 允许根据 IEC 使用二进制前缀表示法定义整数。

val memSize = 512 MiB // infers type BigInt
val dpRamSize = 4 KiB // infers type BigInt

可以使用以下二进制前缀表示法:

二进制前缀

Byte, Bytes

1

KiB

1024 == 1 « 10

MiB

10242 == 1 « 20

GiB

10243 == 1 « 30

TiB

10244 == 1 « 40

PiB

10245 == 1 « 50

EiB

10246 == 1 « 60

ZiB

10247 == 1 « 70

YiB

10248 == 1 « 80

当然, BigInt 可以以字节为单位进行打印。例如, BigInt(1024).byteUnit.

val memSize = 512 MiB
println(memSize)
>> 536870912
println(memSize.byteUnit)
>> 512MiB
val dpRamSize = BigInt("123456789", 16)
println(dpRamSize.byteUnit())
>> 4GiB+564MiB+345KiB+905Byte

println((32.MiB + 12.KiB + 223).byteUnit())
>> 32MiB+12KiB+223Byte
println((32.MiB + 12.KiB + 223).byteUnit(ceil = true))
>> 33~MiB

标签:val,SpinalHDL,实用工具,数据类型,Cat,硬件,BigInt
From: https://blog.csdn.net/m0_59092412/article/details/140364174

相关文章

  • SpinalHDL之错误修复(下篇)
    此箫非彼箫,不竹不丝不石。肉音别自唔咿。流苏瑟瑟纱垂,辨不出宫商角徵。一点樱桃欲绽,纤纤十指频移。课吞添吐两情痴,不觉悟灵犀味美推荐小说《回到明朝当王爷》,也有动漫,但小说改国漫通病,小说中杀伐果断人设极好的男主,到了动漫里就变成犹犹豫豫优柔寡断的废材,参见《元龙》。......
  • 作为程序员的他,大学四年一直自学,全靠这些实用工具和学习网站!
    鸡腿哥,你好,马上6月份就要毕业了。非常感谢这些年来鸡腿哥的鼓励,你的那些文章我基本上都看了,尤其是程序人生方面的文章给我启迪很大。大学四年,我没有白过,虽然专业不是程序员,但我喜欢这个行业,一直在自学,并且收集了不少实用工具和学习网站,希望借助二哥的影响力传播给更多新......
  • 程序员的加油站,各类技术文章,可视化技术,在线源码资源,在线实用工具,数据爬虫接口持续集成
    先挂网址:https://wheart.cn可视化大屏模板与设计,在线预览上百例可视化模板技术文章、资源下载等各类资源导航页echart在线实用demo各种在线工具提升开发效率echart在线代码模板......
  • SpinalHDL 学习笔记
    SpinalHDL是一种基于Scala的硬件构筑语言(ConstructingHardwareInScalaEmbeddedLanguage),通过比Verilog/VHDL更好层次的行为级描述,拥有更加高层次视角以及抽象编码能力,作为一种Verilog/VHDL代码的生成器,在Verilog/VHDL绝对统治芯片设计语言的情况下,宛如一泓清泉带来不一样......
  • PowerToys使用教程 的基本情况,并开始使用其中的实用工具;PowerToys 的功能和使用方法,提
    PowerToys的初级使用教程大纲:介绍PowerToys什么是PowerToysPowerToys是由微软推出的一组实用工具集合,旨在为Windows用户提供增强功能和工作效率。PowerToys的初衷是为开发人员、技术爱好者和高级用户提供更多的定制化选项和工具,以改善其在Windows操作系统上的......
  • ​谁用谁知道,教师实用工具分享​
    老师们面临着日益增长的教学和管理任务。为了有效提升工作效率,一些实用的工具成为了老师们不可或缺的助手。给大家分享几款教师必备的工具,帮助教师们在教学和管理工作中更加得心应手。1.知乎:知识的海洋知乎是一个中文问答社区,汇聚了各行各业的专业人士。老师们可以在这里......
  • Linux上的SQL Server使用bcp实用工具将数据批量复制到数据库表中
    Linux上的SQLServer使用bcp实用工具将数据批量复制到数据库表中。参考官方文档如下https://learn.microsoft.com/en-us/sql/linux/sql-server-linux-migrate-bcp?view=sql-server-ver161、本文内容安装SQLServer命令行工具使用bcp导入数据使用bcp导出数据相关内......
  • Python中的tqdm库:简化进度条的实用工具
    介绍在Python编程中,经常会遇到需要显示长时间运行任务的进度的情况,这时候使用进度条工具可以让用户清晰了解任务的完成进度。tqdm是一个Python的进度条库,它的全称是"taqaddum",这个词来自阿拉伯语,意为"进步"。tqdm库提供了一种在Python中显示进度条的简单而灵活的方式......
  • Cleanmgr,也称为磁盘清理器(Disk Cleanup),是Windows操作系统中的实用工具,用于删除计算机
    cleanmgr|MicrosoftLearnCleanmgr,也称为磁盘清理器(DiskCleanup),是Windows操作系统中的实用工具,用于删除计算机上不需要的临时文件、回收站文件、下载文件以及其他可以安全删除的文件,以释放磁盘空间。功能特点:释放磁盘空间:Cleanmgr可以帮助用户识别并删除不再需要的......
  • reg2inf.exe 是一个 Windows 实用工具,用于将 Windows 注册表文件 (.reg) 转换为 Windo
    reg2inf.exe是一个Windows实用工具,用于将Windows注册表文件(.reg)转换为WindowsINF文件(.inf)。INF文件是一种文本文件,通常用于在Windows操作系统中安装设备驱动程序和配置设置。使用reg2inf.exe工具可以将注册表中的配置转换为INF格式,从而可以在Windows......