【SpinalHDL】结构语句

您所在的位置:网站首页 递归的要素包括 【SpinalHDL】结构语句

【SpinalHDL】结构语句

2023-05-21 17:06| 来源: 网络整理| 查看: 265

简单介绍在SpinalHDL编程中使用到的结构语句,主要包括赋值语句、选择语句,由于SpinalHDL中没有循环语句,这里在不介绍。

1. 赋值语句

SpinalHDL中有多个赋值运算:

:=标准赋值, 等价于Verilog中的结果FalseFalse1FasleTrue1TrueFalse2TrueTrue3 1.3 位宽检查

SpinalHDL会检查赋值的左右两侧bit宽度是否一致。有多种方式能够去适应给定的Bit向量(Bits, UInt, SInt):

改变尺寸的方法描述x:=y.resized用y的改变大小后的复制赋值给x, 改变的值会根据匹配的x自适应x:=y.resize(newWidth)用y的改变大小后的复制赋值给x, 尺寸是手工计算的 2. 选择语句when/switch/mux 2.1 when语句

when 语句是一种条件语句,可以根据条件执行不同的操作。基本语法如下:

when(cond1) { //当cond1真时执行操作 }.elsewhen(cond2) { //当cond1假但cond2真时执行操作 }.otherwise { //cond1和cond2同假时执行操作 }

 在 when 语句中,你可以根据条件执行相应的代码块,并且还可以使用 .otherwise 块指定当条件不满足时的默认操作。

注意:如果otherwise关键字和花括号的后半部分}在同一行, .可以省略;但如果.otherwise在另一行, 需要.

//省略.标识 when(cond1) { //当cond1真时执行操作 } otherwise { //cond1和cond2同假时执行操作 } //不能省略.标识 when(cond1) { //当cond1真时执行操作 } .otherwise { //cond1和cond2同假时执行操作 } 2.2 switch语句

switch 语句允许根据不同的选择值执行不同的操作。它的基本语法如下:

switch(x) { is(value1) { //当x===value1执行 } is(value2) { //当x===value2执行 } default { //当之前的条件都没有符合执行 } }

在 switch 语句中,你可以使用多个 is(value) 块来指定不同选择值时执行的代码块,并且可以使用 default 块指定当选择值不匹配任何已定义值时的默认操作。同时is语句块可以用is(value1, value2)这种逗号分割的方式书写,代表多种条件下执行相同语句块。

switch(aluop) { is(ALUOp.add) { immediate := instruction.immI.signExtend } is(ALUOp.slt) { immediate := instruction.immI.signExtend } is(ALUOp.sltu) { immediate := instruction.immI.signExtend } is(ALUOp.sll) { immediate := instruction.shamt } is(ALUOp.sra) { immediate := instruction.shamt } }

等价于

switch(aluop) { is(ALU0p.add, ALU0p.slt, ALU0p.sltu) { immediate := instruction.immI.signExtend } is(ALU0p.sll, ALU0p.sra) { immediate := instruction.shamt } } 2.3 Mux语句

在 SpinalHDL中,可以使用 Mux(多路复用)语句来实现多路选择逻辑。Mux 语句可以根据一个选择信号选择其中一个输入,并输出所选输入的值。Mux 语句的基本语法如下:

val result = Mux(select, inputTrue, inputFalse)

其中:

select 是一个布尔型选择信号,用于选择要输出的输入之一。inputTrue 是当 select 为真时要输出的输入值。inputFalse 是当 select 为假时要输出的输入值。

以下是一个示例,演示如何使用 Mux 语句来实现多路选择:

val select = Bool() // 假设有一个布尔型选择信号 select val inputTrue = UInt(8 bits) // 假设有一个8位无符号整数输入 inputTrue val inputFalse = UInt(8 bits) // 假设有一个8位无符号整数输入 inputFalse val result = Mux(select, inputTrue, inputFalse)

在上面的示例中,根据 select 的值,Mux 语句将选择输出 inputTrue 或 inputFalse 中的一个值作为 result。

通过使用 Mux 语句,你可以在 SpinalHDL 中实现多路选择逻辑,根据选择信号选择不同的输入。这对于构建选择器、多路开关和其他需要选择输入的硬件电路非常有用。

3.循环语句when/for

在 SpinalHDL 中,虽然没有直接的循环语句(例如 Verilog 中的 for 循环),但你可以使用递归和生成器来实现类似的功能。

3.1 when递归

你可以使用递归来实现一系列相似的操作。通过定义一个递归函数,每次调用函数时传递不同的参数,从而模拟循环的效果。以下是一个简单的示例,演示如何使用递归在 SpinalHDL 中实现类似于 for 循环的功能:

def generateLogic(index: UInt): Unit = { when(index < N) { // 在每次迭代中执行的逻辑 generateLogic(index + 1) // 递归调用 } } val index = Reg(UInt(log2Up(N) bits)) // 假设有一个用于迭代的计数器 index generateLogic(index)

在上面的示例中,generateLogic 是一个递归函数,它根据 index 的值执行一系列逻辑,并在每次迭代中递增 index 的值。通过递归调用 generateLogic,可以实现类似于 for 循环的迭代效果。

3.2 for生成器

SpinalHDL 还提供了一种强大的机制,即使用生成器来生成硬件电路。生成器允许你在编译时生成多个相似的硬件模块,从而实现类似于循环的效果。你可以使用 for 循环语句或迭代器来生成多个硬件实例。以下是一个简单的示例,演示如何使用生成器在 SpinalHDL 中生成多个硬件模块:

import spinal.core._ class MyModule extends Component { val inputs = Vec(5, UInt(8 bits)) // 假设有一个包含 5 个 8 位无符号整数的输入向量 // 生成多个硬件模块 for (i


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3