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

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

3天内不再提示

SpinalHDL里pipeline的设计思路

冬至子 来源:Spinal FPGA 作者:玉骐 2023-08-16 15:11 次阅读

如果你曾看过VexRSICV的设计,对于从事逻辑设计的你会惊讶从未想过逻辑设计还能这么来做。针对VexRSICV所衍生出的pipeline Lib,该系列会对pipeline进行一次梳理。诚如之前一篇博客曾讲,这是“勇者的游戏”。

虽然并未从事CPU设计,但这里pipeline的库读完还是当浮一大白~

》传统的设计思路

借用博客《The VexRiscV CPU - A New Way to Design》中的观点,在CPU设计里,一条典型的五级流水线:

image.png

在传统的流水线设计里,一条指令切分到不同的Stage中,每增加一条指令,我们可能就需要对各个Stage进行修改,牵一发而动全身。如果对于流水线每个阶段都了然于胸,那么自不是问题,否则那就是噩梦级别的难度了~。

那么,是否有新的方式来做一次流水线设计的创新呢?

来看看SpinalHDL里pipeline的设计思路。

》高端操作

本篇为开篇系列,先从整体架构上看SpinalHDL中pipeline的设计整体框架,暂不牵涉具体的设计细节。

我们先来看一个非常简单的“pipeline”:

image.png

从A到B经历三级流水线,每经一级加一输出至下一级。

回到电路设计的本质。在FPGA里面,除了RAMDSP这些资源,逻辑实现的核心只有LUT喝Reg。LUT负责实现逻辑实现,Reg负责状态保存。在上面的三级流水里,我们要思索的无非两个问题:

  1. 每一级流水线都做了什么
  2. 流水线各级是如何进行连接的
    那么在看看上面的电路。每级流水线里面都是一个加法器和一个寄存器输出。加法器这些功能性的实现才是每一级Stage的功能。而寄存器则用于连接本级Stage与下一级Stage。也就意味着,每一级流水线都是逻辑电路负责实现功能,时序电路寄存器用于Stage连接。为此,对于pipeline我们可以抽象为下面的要素:

image.png

Stage:仅考虑具体的功能实现,它包含了输入、输出以及具体的逻辑实现。

Connection:仅用于实现各级Stage的连接。

在逻辑电路设计里,不要总是想着把功能实现和时序设计给拼到一块儿。将上面的概念与最上面的三级流水对照,那么加法器就是对应的Stage的功能,一个组合电路。而寄存器就对应Connection的功能。

SpinalHDL是基于Scala而设计,其能够帮助我们自动实现很多功能。比如两级Stage之间都有哪些信号是要通过Connection进行连接,对应的流水线功能如flush、halt能功能如何在各级Stage之间进行传播等功能。我们所需要做的,就是通过一定的规则告诉pipeline如何去做这些事情。

接下来,先针对pipeline所涉及的Pipeline、Stage、Connection、Stageable、StageableKey进行一个初步整体了解。


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

    关注

    1

    文章

    114

    浏览量

    21672
  • 加法器
    +关注

    关注

    6

    文章

    183

    浏览量

    30054
  • Pipeline
    +关注

    关注

    0

    文章

    28

    浏览量

    9332
  • FPGA开发板
    +关注

    关注

    10

    文章

    120

    浏览量

    31465
  • HDL语言
    +关注

    关注

    0

    文章

    46

    浏览量

    8905
收藏 人收藏

    评论

    相关推荐

    SpinalHDLpipeline的设计思路

    如果你曾看过VexRSICV的设计,对于从事逻辑设计的你会惊讶从未想过逻辑设计还能这么来做。
    的头像 发表于 08-12 11:22 1195次阅读

    怎样使用SpinalHDL Pipeline组件的resulting及overloaded?

    关于stageableToData,在之前的文章中已有介绍,今天来看下stageableOverloadedToData以及stageableResultingToData的作用。
    的头像 发表于 09-11 09:47 962次阅读
    怎样使用<b class='flag-5'>SpinalHDL</b> <b class='flag-5'>Pipeline</b>组件<b class='flag-5'>里</b>的resulting及overloaded?

    SpinalHDLswitch方法有何用处呢

    ,当我们需要根据tkeep信号来计算这一拍有多少有效数据时这里的代码会是什么样子……这种代码写的手有点儿累(又没啥技术含量)……在SpinalHDL该如何做呢?switchSpinalHDL提供了
    发表于 06-22 14:25

    SpinalHDL实现优雅的添加待跟踪波形信号

    在FPGA的开发过程中,在线抓取波形往往是终极调试大法。而如何抓取信号,相信做逻辑开发的小伙伴都是轻车熟路,张口就来,无非两种方式嘛:待跟踪信号添加原语或者手动例化Ila。而在SpinalHDL
    发表于 06-22 14:37

    聊一聊SpinalHDL 1.6.1引入的blackbox inline功能

    BlackBox在之前的文章中,曾介绍过如何封装兼容别人的RTL代码:SpinalHDL——集成你的RTL代码整体的思路还是简洁明了的,相信读完后照着做很快就能上手。这对于保持设计的兼容性及混合
    发表于 06-29 16:02

    SpinalHDL中关于casez的使用

    Verilog代码时还是很少会直接这么来写的,往往通常采用casez来进行描述:那么在SpinalHDL中,我们是否也可以这么描述呢?SpinalHDL中的don't care像Verilog代码中,casez
    发表于 07-06 10:59

    分享一个在SpinalHDLapply的有趣用法

    SpinalHDL和Chisel都是基于scala来实现的,而在SpinalHDL的example,偶然看到一个apply的有趣用法。“神奇”的逻辑,"奇葩"的写法偶然看到一
    发表于 07-19 15:08

    SpinalHDL是如何让仿真跑起来的

    SpinalHDL,当我们的设计完成后如果说把生成的Verilog/SystemVerilog代码用SystemVerilog来进行仿真验证那真是一件痛苦的事情,而且对于SystemVerilog本身来讲,在
    发表于 07-25 15:09

    如何在SpinalHDL启动一个仿真

    前言在安装完成Verilator、GtkWave后,我们即可在IDEA通过SpinalHDL提供的仿真接口来对我们的设计进行仿真。在《SpinalHDL—仿真环境》一文中已提到SpinalH
    发表于 07-26 16:59

    SpinalHDL有没有什么好的方式实现一个接口位宽转换呢

    下午微信群有个小伙伴问了这么一道题:将一个为UInt(128 bits)的Stream接口连接到一个UInt(32 bits)的StreamFiFo上,在SpinalHDL有没有什么好的方式实现
    发表于 07-27 14:52

    SpinalHDL时钟域中的定制与命名

    聊一聊在SpinalHDL时钟域中时钟的定制与命名。 相较于Verilog,在SpinalHDL,其对时钟域有着更细致的描述,从而也能够更精细的控制和描述。而对于时钟域,我们往往关
    的头像 发表于 03-22 10:14 2094次阅读

    SpinalHDL用于跨时钟域处理的一些手段方法

    每一个做数字逻辑的都绕不开跨时钟域处理,谈一谈SpinalHDL用于跨时钟域处理的一些手段方法。
    的头像 发表于 07-11 10:51 1763次阅读

    SpinalHDL如何实现Sobel边缘检测

    书接上文,趁着今天休假,采用SpinalHDL做一个小的demo,看看在SpinalHDL如何优雅的实现Sobel边缘检测。
    的头像 发表于 08-26 08:59 1241次阅读

    SpinalHDL在顶层一键优化Stream/Flow代码生成

        在SpinalHDL在顶层一键优化代码中Stream/Flow代码生成的payload,fragment。 难看的代码       来看一段代码:   import
    的头像 发表于 12-14 09:05 617次阅读

    浅析SpinalHDLPipeline中的复位定制

    之前有系列文章介绍了SpinalHDLPipeline的使用,最近在一个功能模块中真实的使用了这个lib。
    的头像 发表于 03-17 17:31 962次阅读
    浅析<b class='flag-5'>SpinalHDL</b>中<b class='flag-5'>Pipeline</b>中的复位定制