DDR*_*kar 2 hdl register-transfer-level chisel
您可能知道 Verilog 中的“输出 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
}
Run Code Online (Sandbox Code Playgroud)
是否有更“短”的方式来创建输出 reg?
我正在寻找的是在 IO 包中定义 Reg 并将其写入 register
类似这样的东西:
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
}
}
Run Code Online (Sandbox Code Playgroud)
不允许寄存器进入Bundle以保持其作为接口的纯度。它们比 Verilog 95/2001 端口声明更接近 SystemVerilog 结构。
使用现有的库,做你想做的最简单的方法是使用RegNext:
io.dout := RegNext(io.din + 77.S, 0.S(32.W))
Run Code Online (Sandbox Code Playgroud)
注意:io.dout在 FIRRTL 编译器推断宽度之前,这不会设置宽度。如果您尝试获取io.dout某物的宽度,这有时会导致问题。
忽略标准库,您还可以通过定义您自己的实用程序来以两种可能的方式之一创建注册连接,从而更加手动地执行此操作:
object ConnectionUtilities {
def regConnect(lhs: Data, rhs: Data): Unit = {
val rhsReg = Reg(chiselTypeOf(rhs))
rhsReg := rhs
lhs := rhsReg
}
}
Run Code Online (Sandbox Code Playgroud)
有了这个,您就可以使用此方法进行连接并生成必要的寄存器:
import ConnectionUtilities.regConnect
regConnect(io.out, io.in + 77.S)
Run Code Online (Sandbox Code Playgroud)
Data. 这是更高级的,并且有可能使阅读您的代码的人感到困惑。但是,它允许您使用自己的领域特定语言扩展 Chisel 领域特定语言。object ConnectUtilities2 {
implicit class DataWithRegConnect(lhs: Data) {
def `:=r` (rhs: Data): Unit = {
val rhsReg = Reg(chiselTypeOf(rhs))
rhsReg := rhs
lhs := rhsReg
}
}
}
Run Code Online (Sandbox Code Playgroud)
然后你可以使用这个新方法(注意这需要反引号,因为:=r它本身不是一个合法的名称)。
import ConnectUtilities2.DataWithRegConnect
io.dout `:=r` (io.din + 77.S)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
183 次 |
| 最近记录: |