SpinalHDL之Flow

本文作为SpinalHDL学习笔记第十九篇,介绍SpinalHDL Flow相关API。

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

SpinalHDL 学习笔记_spinalhdl blackbox-CSDN博客

目录:

1.规范

2.代码示例

3.仿真支持

1.规范

数据流接口是一个简单的有效/负载协议,这意味着从端无法终止总线。它可用于表示来自 UART 控制器的数据、写入片上存储器的请求等。

信号

类型

驱动

描述

何时忽略

valid

Bool

Master

当为高时 => 接口上存在有效负载 (payload)

payload

T

Master

传输任务内容

valid为低

2.代码示例:

case class FlowExample() extends Component {
val io = new Bundle {
val request = slave(Flow(Bits(8 bit)))
val answer = master(Flow(Bits(8 bit)))
}
val storage = Reg(Bits(8 bit))
val fsm = new StateMachine {
io.answer.setIdle()
val idle: State = new State with EntryPoint {
whenIsActive {
when(io.request.valid) {
storage := io.request.payload
goto(sendEcho)
}
}
}
val sendEcho: State = new State {
whenIsActive {
io.answer.push(storage)
goto(idle)
}
}
}
// This StateMachine behaves equivalently to
// io.answer <-< io.request
}

3.仿真支持

用法

FlowMonitor

用于主端和从端,如果数据流传输数据,则调用带有负载的函数。

FlowDriver

Testbench 中主端通过调用函数来应用值(如果可用)以驱动值。如果值可用,则函数必须返回。支持随机的延迟。

ScoreboardInOrder

通常用于比较参考/dut 数据

package spinaldoc.libraries.flow
import spinal.core._
import spinal.core.sim._
import spinal.lib._
import spinal.lib.sim.{FlowDriver, FlowMonitor, ScoreboardInOrder}
import scala.language.postfixOps
case class SomeDUT() extends Component {
val io = new Bundle {
val input = slave(Flow(UInt(8 bit)))
val output = master(Flow(UInt(8 bit)))
}
io.output <-< io.input
}
object Example extends App {
val dut = SimConfig.withWave.compile(SomeDUT())
dut.doSim("simple test") { dut =>
SimTimeout(10000)
val scoreboard = ScoreboardInOrder[Int]()
// drive random data at random intervals, and add inputted data to scoreboard
FlowDriver(dut.io.input, dut.clockDomain) { payload =>
payload.randomize()
true
}
FlowMonitor(dut.io.input, dut.clockDomain) { payload =>
scoreboard.pushRef(payload.toInt)
}
// add all data coming out of DUT to scoreboard
FlowMonitor(dut.io.output, dut.clockDomain) { payload =>
scoreboard.pushDut(payload.toInt)
}
dut.clockDomain.forkStimulus(10)
dut.clockDomain.waitActiveEdgeWhere(scoreboard.matches == 100)
}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

千穹凌帝

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

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

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

打赏作者

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

抵扣说明:

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

余额充值