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

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

3天内不再提示

在SpinalHDL中的对应关系及声明形式

FPGA之家 来源:似猿非猿的FPGA 作者:似猿非猿的FPGA 2022-07-03 11:02 次阅读

针对SpinalHDL中的两大类型Reg、Wire,来梳理下在SpinalHDL中的对应关系及声明形式。

Wire

在编写Verilog时,reg、wire是我们经常用到的变量声明类型。wire类型变量常用于描述组合逻辑。而Reg则用于描述时序逻辑。在SpinalHDL中,其定义了Bool、Bits、UInt、SInt、Vec等数据类型。当我们声明一个数据类型变量时其默认均为线网类型:

aeee314c-f678-11ec-ba43-dac502259ad0.png

在上面的代码中,我们声明了端口dataIn、dataOut、其默认均对应着RTL中的Wire类型:

af0096a2-f678-11ec-ba43-dac502259ad0.png

Reg

Reg类型变量常用于时序逻辑,在SpinalHDL中,将数据类型声明为Reg类型的方式有:

af0d5ca2-f678-11ec-ba43-dac502259ad0.png

SpinalHDL提供了四种类型声明寄存器的方式,根据不同的场景需求,我们可以四选一选择最合适的(都是基于Reg一步步封装的)。 除此之外,由于SpinalHDL中默认为Wire类型,而SpinalHDL为其都提供了setAsReg()方法来标注为寄存器类型,同时提供Init(resetValue)方法来做初始化。因此想上面的那个例子我们想寄存器打一拍我们可以这么来写:

case class regDemo() extends Component{  val io=new Bundle{    val dataIn=in UInt(8 bits)    val dataOut=out UInt(8 bits)  }  val regTemp=Reg(UInt(8 bits)) init(0)  regTemp:=io.dataIn  io.dataOut:=regTemp}
也可以这么来写:

case class regDemo() extends Component{  val io=new Bundle{    val dataIn=in UInt(8 bits)    val dataOut=out UInt(8 bits)  }  val regTemp=RegInit(U(0,8 bits))  regTemp:=io.dataIn  io.dataOut:=regTemp}
还可以这么写:

case class regDemo() extends Component{  val io=new Bundle{    val dataIn=in UInt(8 bits)    val dataOut=out UInt(8 bits)  }  io.dataOut:=RegNext(io.dataIn).init(0)}
甚至可以这么写:

case class regDemo() extends Component{  val io=new Bundle{    val dataIn=in UInt(8 bits)    val dataOut=out UInt(8 bits) setAsReg() init(0)  }  io.dataOut:=io.dataIn} 

时序调整很容易

在我们编写RTL代码时,当时序存在问题时需要我们调整时序时是很痛苦的,因为无论是Verilog还是SystemVerilog代码,在较长组合逻辑之间添加一级寄存器往往需要改动较多的点,还需要仔细的评估。稍不注意就是时序没调整好,功能先出问题了(主要在于代码太长,更改需慎之又慎)。 而在SpinalHDL里,时序调整可以做到简洁而优雅。 在我们之前用SpinalHDL做Sobel图像处理算法时有这么一段代码:

af1f1ec4-f678-11ec-ba43-dac502259ad0.png

在卷积核计算处理时这里存在较多的组合逻辑延迟,会成为系统时序瓶颈点。当我们想向更高的频率去跑时这里便需要插入寄存器。想想看这里如果是用Verilog来写时我们插入寄存器不仅要计算清楚中间寄存器的位宽,同时也需要改多行代码,还要小心翼翼的改写。 而在SpinalHDL里,我们这里插入寄存器调整时序很容易!我们可以通过调用regNext很容易地插入一级寄存器:

af3cc118-f678-11ec-ba43-dac502259ad0.png

如此我们便可以轻松地优化时序,谁还说时序调整是个体力活儿呢??? 而针对带握手信号的时序打拍优化,SpinalHDL也有相关的Lib供调用可以快捷地优化处理。

原文标题:SpinalHDL—Reg&Wire

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

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

    关注

    30

    文章

    5042

    浏览量

    117814
  • Reg
    Reg
    +关注

    关注

    0

    文章

    20

    浏览量

    11430
  • 代码
    +关注

    关注

    30

    文章

    4557

    浏览量

    66884
  • 时序逻辑
    +关注

    关注

    0

    文章

    37

    浏览量

    9102

原文标题:SpinalHDL—Reg&Wire

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

收藏 人收藏

    评论

    相关推荐

    SpinalHDL里switch方法有何用处呢

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

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

    时会同时生成用于生成相应ILa IP的tcl脚本,从而能够轻松的SpinalHDL实现对待跟踪波形信号的抓取实现。下面一段代码展示了如何在SpinalHDL里添加ILA:在上述代码
    发表于 06-22 14:37

    SpinalHDL的设计中集成现有RTL设计(IP)的渠道——BlackBox

    接口及parameter参数(这也是我们RTL里例化IP时常用的)。我们来看SpinalHDL-doc给出的example:整个代码里做了三件事:参数声明、端口声明,时钟域映射。参数
    发表于 06-22 14:59

    SpinalHDL定义各种各样的复合数据类型

    通过继承Bundle,SpinalHDL我们可以定义各种各样的复合数据类型。今天,关于Bundle的几个容易被忽略的点,一同来看下。》Bundle个人在使用SpinalHDL来描
    发表于 06-28 15:21

    谈谈SpinalHDLStreamCCByToggle组件设计不足的地方

    到ack为低电平即可处理新的任务。  写在最后  关于跨时钟域处理处理上相对来讲还是一个易错点,其处理也是新学者需要好好把握的。SpinalHDL的源代码还是很值得一读的。一方面
    发表于 06-30 15:11

    聊聊SpinalHDL的FIFO

    DFX添加所有FIFO的这两个信号。而一旦真的出现了拉高,那不管你的设计经验多么丰富,也得老老实实去review代码和构建测试case。一定要这样么为什么经常碰到有人讲FPGA这些不好
    发表于 06-30 15:28

    SpinalHDL关于casez的使用

    SpinalHDL的switch之前的文章中曾提到过SpinalHDLswitch的使用:通常情况下,switch
    发表于 07-06 10:59

    分享一个SpinalHDL里apply的有趣用法

    接口相关的时序操作均封装在flushRx并将接口的赋值封装成函数的形式供其他人调用,从而将算法设计与接口时序分离。这里看一个简单的例子:代码本身意义不大,这里我们将对接口c的时序操作均放置
    发表于 07-19 15:08

    SpinalHDL的代码组织结构如何实现Component参数化设计呢

    SpinalHDL在生成RTL时,会检测Bundle的所有元素是否都声明了端口方向。有一点是像上面的MyAdder将端口声明放在Bun
    发表于 07-21 14:20

    请问SpinalHDL的Area到底是什么意思

    (仅限于纯组合逻辑)。AreaSpinalHDKL里,与Verilog、SystemVerilog对应的概念是Component,当我们的类继承了Component后,与之相应的我们就要定义端口
    发表于 07-22 14:22

    SpinalHDL仿真信号的驱动实现

    梳理基本完毕,下文将以一个小的例子为demo构建一个完整的个人觉得不错的SpinalHDL仿真环境书写方式。原作者:玉骐
    发表于 07-27 14:37

    记录一个使用BlackBoxparameter踩到的坑

    》踩到的坑很早之前,曾写过如何在SpinalHDL例化之前用Verilog/SystemVerilog所写的代码,可参照文章《[SpinalHDL——集成你的RTL代码]》一文。
    发表于 08-31 14:58

    SpinalHDLBundle与普通数据类型之间的连接赋值转换

    SpinalHDLBundle与SystemVerilog的packed struct很像,某些场景下,与普通数据类型之间的连接赋值可以通过asBits,assignFromBi
    发表于 10-18 14:22

    SpinalHDL设计错误总结相关资料分享

    设计。以下是SpinalHDL检查的简要概括:  重复赋值  时钟域交叉  层次化违例  组合逻辑环路  Latch  未驱动的信号  位宽不匹配  得不到的switch生命  每个SpinalHDL
    发表于 10-24 15:37

    看下在SpinalHDL中常见的位拼接符的使用

    信号的不同bit赋值给不同的信号,这种拼接方式可以SpinalHDL按照如下的形式进行书写:case class demo() extends Component{val
    发表于 11-18 15:21