gpt4 book ai didi

hdl - 如何在Chisel中正确定义输出Reg

转载 作者:行者123 更新时间:2023-12-02 02:48:55 26 4
gpt4 key购买 nike

你可能知道 Verilog 中的“output reg”,非常有用的功能。
但在 Chisel 中我找不到如何做类似的事情。当我需要寄存器输出时,我应该这样做:

package filter

import chisel3._

class TestReg extends Module {
val io = IO( new Bundle {
val din = Input(SInt(32.W))
val ena = Input(Bool())
val dout = Output(SInt())
})

val dout = RegInit(0.S(32.W))
when (io.ena) {
dout := io.din + 77.S
}
io.dout <> dout
}

是否有更“简短”的方法来创建输出注册表?
我正在寻找的是在 IO 包中定义 Reg 并将其写入寄存器
像这样的事情:

class TestReg extends Module {
val io = IO( new Bundle {
val din = Input(SInt(32.W))
val ena = Input(Bool())
val dout = Output(RegInit(0.S(32.W)))
})

when (io.ena) {
io.dout := io.din + 77.S
}
}

最佳答案

Bundle 中不允许使用寄存器,以保持其作为接口(interface)的纯粹性。它们比 Verilog 95/2001 端口声明更接近 SystemVerilog 结构。

对于现有的库,执行您想要的操作的最简单方法是使用 RegNext :

io.dout := RegNext(io.din + 77.S, 0.S(32.W))

注意:在 FIRRTL 编译器推断出宽度之前,这不会设置 io.dout 的宽度。如果您尝试获取某些内容的 io.dout 宽度,有时这可能会导致问题。

忽略标准库,您还可以通过定义自己的实用程序来以两种可能的方式之一创建注册连接,从而更手动地执行此操作:

  1. 创建一个函数来执行“注册”连接
object ConnectionUtilities {
def regConnect(lhs: Data, rhs: Data): Unit = {
val rhsReg = Reg(chiselTypeOf(rhs))
rhsReg := rhs
lhs := rhsReg
}
}

这样,您就可以使用此方法进行连接并生成必要的寄存器:

import ConnectionUtilities.regConnect

regConnect(io.out, io.in + 77.S)
  • 创建一个隐式类以将方法添加到Data。这是更高级的,并且有可能使阅读您代码的人感到困惑。但是,它允许您使用您自己的领域特定语言来扩展 Chisel 领域特定语言。
  • object ConnectUtilities2 {
    implicit class DataWithRegConnect(lhs: Data) {
    def `:=r` (rhs: Data): Unit = {
    val rhsReg = Reg(chiselTypeOf(rhs))
    rhsReg := rhs
    lhs := rhsReg
    }
    }
    }

    然后您可以使用这个新方法(请注意,这需要反引号,因为 :=r 本身并不是合法名称)。

    import ConnectUtilities2.DataWithRegConnect

    io.dout `:=r` (io.din + 77.S)

    关于hdl - 如何在Chisel中正确定义输出Reg,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62388061/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com