在新 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
非常相似,除了 clock
和 reset
是隐式推断的(有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 的优势更多地来自于它在复杂系统中的灵活性,而不是小示例,但是理解这些小示例是掌握该语言的关键。
这可能是一个非常基本的问题,但我一直找不到答案。
我有这个现有的逻辑 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
非常相似,除了 clock
和 reset
是隐式推断的(有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 的优势更多地来自于它在复杂系统中的灵活性,而不是小示例,但是理解这些小示例是掌握该语言的关键。