在新 Class [Scala Chisel] 中使用现有的 Scala Class

Using existing Scala Class in new Class [Scala Chisel]

这可能是一个非常基本的问题,但我一直找不到答案。

我有这个现有的逻辑 AND class:

    class DelayedAND(val n:Int = 2) extends Module{
    val io = IO(new Bundle{
        val a = Input(UInt(1.W))
        val b = Input(UInt(1.W))
        val out = Output(UInt(1.W))
    })
     val delay = 2 
     val dand =io.a&io.b
     io.out := ShiftRegister(dand, delay)
    }

我需要在此 Class 中包括而不是常规的“和”

    class HalfAdder extends Module {
     val io = IO(new Bundle{
     val a    = Input(UInt(1.W))
     val b    = Input(UInt(1.W))
     val sum  = Output(UInt(1.W))
     val cout = Output(UInt(1.W))
     })
  
     val a_xor_b = io.a ^ io.b
     io.sum := a_xor_b

     val a_and_b = io.a & io.b  //previous Class needs to be used here
     io.cout := a_and_b
     }

我对 Scala 和 Chisel 完全陌生,我已经尝试解决它几个小时了!请帮帮我,谢谢!

val a_and_b = Module(new DelayedAND(2))
a_and_b.io.a  := io.a
a_and_b.io.b  := io.b
io.cout       := a_and_b.io.out

这里有一个很好的解释

https://www.chisel-lang.org/chisel3/docs/explanations/modules.html

编辑:

为了提供更多细节,Module 的行为与典型的 Verilog module 非常相似,除了 clockreset 是隐式推断的(有link 和其他一些中列出的例外情况,但更深入,超出了这个问题的范围)。然而在 Chisel 中,Module 代表 在 Chisel 到 FIRRTL compilation/elaboration 之后成为 Verilog module 的东西。

在 Verilog module 中,我们将列出端口并通过模块实例化中的端口列表连接端口。在这种情况下,“端口”是通过连接的。 := 运算符。这是分配一些逻辑 to/from 我们的 Module “端口”。如果来自 Verilog 背景,这可能看起来很奇怪。首先,您可以连接到代码中任何位置的端口!有效地将您的“模块实例化”扩展到各处。如果您习惯于在 verilog 中跟踪信号连接以进行调试,这似乎有点令人生畏,但它有一些好处。您可以根据某些 parameter/variable 修改连接到特定端口的内容。漂亮,吸它generate.

如果您不连接一个或多个 Input,FIRRTL 会抱怨。 Output 连接到 float/not 没问题,尽管您可能会发现您的某些逻辑已根据创建的内容进行了优化。

因此,当第一次启动 Chisel 时,采用这种编码方法 Module 就像使用 Verilog module 一样。当您尝试找出如何执行特定硬件生成时,Chisel 的更有趣的功能将开始浮出水面。

Chisel 的优势更多地来自于它在复杂系统中的灵活性,而不是小示例,但是理解这些小示例是掌握该语言的关键。