✎ 编 者 按
对于搞验证的同学来讲,UVM里面中关于寄存器的概念自然是耳熟能详,对于搞设计的小伙伴来讲,也许我们对于使用的场景和UVM寄存器模型对照并没有太过关注,而在SpinalHDL中regif库里,其使用也是借鉴基于UVM中寄存器模型概念进行设计的,那么今天不妨从设计的角度一块儿来看下这些寄存器模型。
》UVM中支持的寄存器存取方式
在UVM里,共支持了25种寄存器存取方式:
这里面诸如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
微信公众号:
推荐阅读
更多SpinalHDL技术干货请关注[Spinal FPGA]