十二 · 2022年06月02日

设计里如何实现UVM寄存器模型?

✎ 编 者 按 

    对于搞验证的同学来讲,UVM里面中关于寄存器的概念自然是耳熟能详,对于搞设计的小伙伴来讲,也许我们对于使用的场景和UVM寄存器模型对照并没有太过关注,而在SpinalHDL中regif库里,其使用也是借鉴基于UVM中寄存器模型概念进行设计的,那么今天不妨从设计的角度一块儿来看下这些寄存器模型

》UVM中支持的寄存器存取方式

  在UVM里,共支持了25种寄存器存取方式:

1654145526751.png
  这里面诸如RO、RW、RC、RS、WRC、WRS、WC、WS、WSRC、WCRS、WO、WOC、WOS、W1、WO1这些实现想必小伙伴们实现起来都比较容易,不再做过多赘述。这里来看下除了这些剩下的寄存器类型的实现方式。为方便描述,这里定义如下几个变量:

  • hitWrite:写命中
  • hitRead:读命中
  • wdata:待写入数据
  • targetReg:目标寄存器

》W1C

  W1C为写1时清零,写0时无影响,则可以表示为:

    when(hitWrite){
        targetReg:=targetReg & (~wdata)
    }

》W1S

  W1S为写1设置所有的位,写0时无影响,读取时无影响。那么可以表示为:

    when(hitWrite){
        targetReg:=targetReg | wdata
    }

》W1T

  W1T为写1入时会翻转,写0时无影响,读取时无影响。那么可以表示为:

    when(hitWrite){
        targetReg:=targetReg  ^  wdata
    }

》W0C

  W0C为写0清零,写1时无影响,读取时无影响。那么可以表示为:

    when(hitWrite){
        targetReg:=targetReg  & wdata
    }

》W0S

  W0S为写0设置所有的位,写1时无影响,读取时无影响。那么可以表示为:

    when(hitWrite){
        targetReg:=targetReg | (~wdata)
    }

》W0T

  W0T为写0入时会翻转,写1时无影响,读取时无影响。那么可以表示为:

when(hitWrite){
        targetReg:=targetReg ^ (~wdata)
    }

》W1SRC

  W1SRC为写1设置所有的位,写0时无影响,读清零。那么可以表示为:

    when(hitWrite) {
       targetReg:= targetReg|wdata
    } elsewhen (hitRead) {
      targetReg.clearAll()
    }

》W1CRS

  W1CRS为写1清零,写0时无影响,读设置所有位。那么可以表示为:

    when(hitWrite) {
       targetReg:= targetReg&(~wdata)
    } elsewhen (hitRead) {
      targetReg.setAll()
    }

》W0SRC

  W0SRC为写0设置所有的位,写1时无影响,读清零。那么可以表示为:

    when(hitWrite) {
       targetReg:= targetReg|(~wdata)
    } elsewhen (hitRead) {
      targetReg.clearAll()
    }

》W0CRS

  W0SRC为写0清零,写1时无影响,读设置所有位。那么可以表示为:

    when(hitWrite) {
       targetReg:= targetReg&wdata
    } elsewhen (hitRead) {
      targetReg.setAll()
    }

》写在最后

  相比于用if判断去实现,这种方式应该更友好些。而这里面用到的最基本的数字电路知识,便是卡诺图了~

作者:玉骐
原文链接:Spinal FPGA
微信公众号:
 title=

推荐阅读

更多SpinalHDL技术干货请关注[Spinal FPGA]
推荐阅读
关注数
1581
内容数
133
用SpinalHDL提升生产力
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息