0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

一览pipeline中所出现的五个基本要素

Spinal FPGA 来源:Spinal FPGA 2023-08-12 11:24 次阅读

》Stageable、StageableKey stageable、StageableKey是最整个pipeline中的基本数据类型元素:

object Stageable{
def apply[T <: Data](gen : => T) = new Stageable(gen)
def apply[T <: Data](gen : HardType[T]) = new Stageable(gen.craft())
}

class Stageable[T <: Data](gen : => T) extends HardType(gen) with Nameable {

}
case class StageableOffset(val value : Any)
object StageableOffsetNone extends StageableOffset(null)
case class StageableKey(stageable: Stageable[Data], key : Any){
override def toString = {
var name = stageable.getName()
if(key != null) name = name + "_" + key
name
}
}

对于Stageabel,我们可以传入任何SpinalHDL下面定义的隶属于Data的类型,不同于我们在电路里生命一个电路对象:

vala=UInt(8bits)

此时,电路对象是立即生命存在的,如果我们不对他进行赋值会报错。而:

valb=Stageable(UInt(8bits))

此时b并未真正生成电路对象,即使不对他进行赋值也并不会报错。

对于StageableKey,字如其名,其主要用作Key使用,用于建立Stageable映射时的key使用。

》Stage

借用上一篇文章中的图:

b0b125e2-38b3-11ee-9e74-dac502259ad0.jpg

Stage主要用于实现pipeline的功能实现。那么Stage则定义了这些功能的输入、输出:

val input = new{
val valid = Bool()
varready : Bool = null
}

val output = newArea {
val valid = Bool()
varready : Bool = null
}

以及一些列的内部保存变量:

val arbitration = new{
varisRemoved : Bool = null
varisFlushed : Bool = null
varisThrown : Bool = null
varisForked : Bool = null
varisFlushingNext : Bool = null
varisFlushingRoot : Bool = null
varisHalted : Bool = null
varisHaltedByOthers : Bool = null
varpropagateReady = false
}

val request = new{
val halts = ArrayBuffer[Bool]()
val throws = ArrayBuffer[Bool]()
val throwsRoot = ArrayBuffer[Bool]()
val forks = ArrayBuffer[Bool]()
val spawns = ArrayBuffer[Bool]()
val flush = ArrayBuffer[Bool]()
val flushRoot = ArrayBuffer[Bool]()
val flushNext = ArrayBuffer[Bool]()
}

val stageableToData = mutable.LinkedHashMap[StageableKey, Data]()
val stageableOverloadedToData = mutable.LinkedHashMap[StageableKey, Data]()
val stageableResultingToData = mutable.LinkedHashMap[StageableKey, Data]()
val stageableTerminal = mutable.LinkedHashSet[StageableKey]()

这些变量暂时看不懂也没关系,后续会通过例子逐一进行讲解。通过这些内部变量,pipeline在构建电路时处理Stage之间的依赖关系。

》Connection

顾名思义,Connection用于负责Stage之间的连接关系,即其负责处理上一级Stage的output与下一级Stage的input之间的连接。在Lib中,Connection定义了四种连接关系:

DIRECT:类似一两个Stream直接相连

M2S:类似于Stream中的M2SPipe,对valid、payload进行打拍输出

S2M:类似于Stream中的S2MPipe,对于ready进行打拍输出

乍看其实现你会发现其中有好多参数一时不知用途,无妨,先放一放,回头逐一讲解。

》pipeline

Pipeline中核心是一个build函数。当我们描述完各Stage的功能之后,通过调用Pipeline的build函数即可构建整个的流水线电路,其也是整个pipelines构建的核心,直接上来看可能会略觉麻烦,后面通过例子一点点来理解。

》第一个例子

先有个概念之后,我们再来一个pipeline的第一个例子:

caseclassdemo() extendsComponent{
val io=newBundle{
val data_in=slave Flow(UInt(8bits))
val data_out=master Flow(UInt(8bits))
}
noIoPrefix()
val pip=newPipeline{
val paylaod=Stageable(UInt(8bits))
val stage0=newStage{
importinternals._
input.valid:=io.data_in.valid
this(paylaod):=io.data_in.payload
}
val stage1=newStage(Connection.M2S())
val stage2=newStage(Connection.M2S()){
io.data_out.valid:=internals.output.valid
io.data_out.payload:=this(paylaod)
}
}
pip.build()
}

这个例子的功能是将Flow data_in打两拍输出给data_out,一个最简单的流水线结构,不牵涉到任何halt、flush等相关操作。如果你看不懂,可以先看它生成的RTL代码:

moduledemo (
input data_in_valid,
input [7:0] data_in_payload,
output data_out_valid,
output [7:0] data_out_payload,
input clk,
input reset
);

reg[7:0] pip_stage1_paylaod;
reg[7:0] pip_stage2_paylaod;
wire[7:0] pip_stage0_paylaod;
wirepip_stage0_valid;
regpip_stage1_valid;
regpip_stage2_valid;

assignpip_stage0_valid = data_in_valid;
assignpip_stage0_paylaod = data_in_payload;
assigndata_out_valid = pip_stage2_valid;
assigndata_out_payload = pip_stage2_paylaod;
always@(posedge clk or posedge reset) begin
if(reset) begin
pip_stage1_valid <= 1'b0;
      pip_stage2_valid <= 1'b0;
    end else begin
      pip_stage1_valid <= pip_stage0_valid;
      pip_stage2_valid <= pip_stage1_valid;
    end
  end

  always @(posedge clk) begin
    pip_stage1_paylaod <= pip_stage0_paylaod;
    pip_stage2_paylaod <= pip_stage1_paylaod;
  end


endmodule

一眼看去,可能觉得很怪,有很多疑问。比如说data_in的valid信号是如何从stage0传输到stage1的等等。





审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 处理器
    +关注

    关注

    68

    文章

    18275

    浏览量

    222164
  • RTL
    RTL
    +关注

    关注

    1

    文章

    377

    浏览量

    59068
  • Pipeline
    +关注

    关注

    0

    文章

    27

    浏览量

    9294
  • VaR
    VaR
    +关注

    关注

    0

    文章

    37

    浏览量

    11117
  • HDL语言
    +关注

    关注

    0

    文章

    46

    浏览量

    8869

原文标题:pipeline高端玩法(二)——成员一览

文章出处:【微信号:Spinal FPGA,微信公众号:Spinal FPGA】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    中东展会一览

    水处理、电力、环保产品展(Wetex 2010)---迪拜2010.3.9---2010.3.11---届石油类展会一览表:2010年第届沙特国际石化技术博览会(Saudi P
    发表于 02-25 10:05

    Protel_***_快捷键一览

    Protel_***_快捷键一览
    发表于 07-11 06:58

    元器件封装一览(配图)

    元器件封装一览(配图)
    发表于 08-16 23:13

    PCB设计基本要素

    syj工程编写的PCB设计基本要素
    发表于 12-13 14:05

    labview快捷键一览

    labview快捷键一览
    发表于 08-04 14:28

    资料推荐:gatt的句柄一览

    gatt的句柄一览
    发表于 06-12 13:57

    PCB电路抗干扰的三基本要素

    PCB电路抗干扰在电子系统设计中,为了少走弯路和节省时间,应充分考虑并满足抗干扰性 的要求,避免在设计完成后再去进行抗干扰的补救措施。形成干扰的基本要素有三
    发表于 07-25 07:11

    小天线测试解决方案服务一览

    小天线测试解决方案服务一览
    发表于 09-06 09:51

    PCB设计的电源平面处理基本要素是什么?

    电源平面的处理,在PCB设计中占有很重要的地位。在完整的设计项目中,通常电源的处理决定項目的30%-50%的成功率。本次给大家介绍在PCB设计过程中电源平面处理应该考虑的基本要素
    发表于 09-11 11:52

    松下FP-XH脉冲输出一览

    松下FP-XH plc脉冲输出设置一览
    发表于 01-11 21:37

    形成干扰的基本要素

    形成干扰的基本要素切断干扰传播路径的常用措施提高敏感器件的抗干扰性能
    发表于 02-05 06:26

    DMA通道一览

    DMA通道一览DMA1通道DMA2通道DMA内容详解DMA的定义直接存储器存取(Direct MemoryAccess,DMA)是计算机科学中的种内存访问技术。它允许某些电脑内部的硬体子系统(电脑
    发表于 08-12 07:05

    安川伺服辅助功能参数一览

    辅助功能一览表,监视模式一览表,用户参数一览表,报警显示一览表辅助功能一览表Fn000 显示警报追踪备份数据Fn001 设定在线自动调谐时的
    发表于 09-06 07:10

    E-R图的基本要素有哪些

    E-R图的基本要素是实体型、属性和联系。写出三种脚本语言Python、JAVASCRIPT,ASP,PHP,PERL,Nuva
    发表于 09-09 07:36

    嵌入式系统的三基本要素

    统,后者是设备4.嵌入式系统的三基本要素:嵌入型、专用性、计算机系统若干个嵌入式系统的例子:嵌入式产品三核心要素:功能和性能;处理器芯片;操作系统或者监控程序...
    发表于 12-22 06:48