risc-v中文社区

 找回密码
 立即注册
查看: 1121|回复: 0

[原创] RegInit类型寄存器

[复制链接]

347

主题

564

帖子

2237

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
2237
发表于 2021-8-19 10:31:56 | 显示全部楼层 |阅读模式
RegInit类型寄存器,主要特点就是有初值参数
初值赋值,是指隐式的复位信号high时,也就是Module
的默认复位信号(同步复位 上拉有效)有效时,初始参数值将会
被赋值给RegInit寄存器(如果用withReset等with...,可以在这些
with范围之内进行RegInit ???)。
RegInit有二个apply方法,
def apply[T <: Data](t: T, init: T)...
def apply[T <: Data](init: T)...
apply(init:T)也是调用apply(t:T,init:T),在源码中可以发现有binging
动作,所以RegInit可以接受chisel类型参数,也可以接受硬件类型参数,
最终都是构建Reg寄存器,其实可以用伪代码解释如下:
def RegInit[T<ata](t:T,init:T):T = {
  val x = Reg(t)
  x := init
  x
}
从apply的源码中可以看到二个参数的apply,第一个参数t必须要是chisel类型,
一个参数的apply的init可以是chisel类型也可以是硬件类型,举例:
1)BITS类型 宽度与BITS一样
val r1 = RegInit(1.U) // 1 Bits类型的参数,则RegInit宽度自动推断出来与BITS相同
val r2 = RegInit(1.U(8.W))// 8 因为BITS是8.W
2)Element类型  自动推断(也就是说有可能有固定值有可能需要推断)
val x = Wire(UInt())
val y = Wire(UInt(8.W))
val r1 = RegInit(x) //宽度不定,需要自动推断
val r2 = RegInit(y) //8 自动推断为8
3)Aggregate类型 与Aggregate宽度一样(有可能有固定宽度有可能需要推断),
class MyBundle extends Bundle {
  val unknown = UInt()
  val known = UInt(8.W)
}
val r3 = Reg(new MyBundle)
val r4 = RegInt(r3) //r4.unknown宽度将自动推断,r4.known宽度是8


其实从使用RegInit的角度来说,目的就是想定义一个寄存器,这个寄存器
需要用初值,那么这个初值有可能是一个chisel类型的参数传过来的,也有
可能是一个硬件类型传过来的,比如说寄存器/Wire线网传给寄存器,难道
chisel只能允许用UInt,SInt,Bundle,Vec[T]这类chisel类型定义这个RegInit
寄存器,就不允许这个RegInit连到另一个Reg或Wire或Module的某个端口吗?


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



Archiver|手机版|小黑屋|risc-v中文社区

GMT+8, 2024-5-4 16:59 , Processed in 0.017539 second(s), 17 queries .

risc-v中文社区论坛 官方网站

Copyright © 2018-2021, risc-v open source

快速回复 返回顶部 返回列表