你如何测试 RawModules?
How do you test RawModules?
我正在使用凿子 RawModule 作为我正在构建的模块的 AXI 接口(以便我可以使用 axi aclk 和 aresetn。)但是,我无法执行使用 peekpoke 的常规策略测试员。测试具有时钟的原始模块的推荐策略是什么?
PeekPokeTester
目前仅限于处理 MultiIOModule
或其子类型。您可以通过将 RawModule
包装在 MultiIOModule
中并将 IO(包括隐式 clock/reset)从包装 MultiIOModule
桥接到您的 RawModule
来解决这个问题。
Chisel 的新测试和验证库(它取代了 chisel-testers/chisel3.iotesters
)预计将原生支持此功能并具有相关的跟踪问题:ucb-bar/chisel-testers2#14。
编辑:将 RawModule
包装在 MultiIOModule
中的示例:
import chisel3._
import chisel3.stage.ChiselStage
sealed trait CommonIO { this: RawModule =>
val a = IO(Input(Bool()))
val b = IO(Output(Bool()))
}
class Foo extends RawModule with CommonIO {
val clk = IO(Input(Clock()))
val rst = IO(Input(Reset()))
b := withClockAndReset(clk, rst){ RegNext(a, true.B) }
}
class Wrapper extends MultiIOModule with CommonIO {
val foo = Module(new Foo)
foo.a := a
b := foo.b
foo.clk := clock
foo.rst := reset
}
(new ChiselStage)
.execute(Array("-X", "verilog"),
Seq(chisel3.stage.ChiselGeneratorAnnotation(() => new Wrapper)))
这会产生以下 FIRRTL:
circuit Wrapper :
module Foo :
input a : UInt<1>
output b : UInt<1>
input clk : Clock
input rst : Reset
reg _T : UInt<1>, clk with : (reset => (rst, UInt<1>("h01")))
_T <= a
b <= _T
module Wrapper :
input clock : Clock
input reset : UInt<1>
input a : UInt<1>
output b : UInt<1>
inst foo of Foo
foo.a <= a
b <= foo.b
foo.clk <= clock
foo.rst <= reset
注:
- 使用
withClockAndReset
将clk
和rst
用于RegNext
的时钟和复位连接
- 来自隐式
Wrapper.clock
和 Wrapper.reset
的联系必须显式建立。 withClockAndReset
在这里不起作用。
我正在使用凿子 RawModule 作为我正在构建的模块的 AXI 接口(以便我可以使用 axi aclk 和 aresetn。)但是,我无法执行使用 peekpoke 的常规策略测试员。测试具有时钟的原始模块的推荐策略是什么?
PeekPokeTester
目前仅限于处理 MultiIOModule
或其子类型。您可以通过将 RawModule
包装在 MultiIOModule
中并将 IO(包括隐式 clock/reset)从包装 MultiIOModule
桥接到您的 RawModule
来解决这个问题。
Chisel 的新测试和验证库(它取代了 chisel-testers/chisel3.iotesters
)预计将原生支持此功能并具有相关的跟踪问题:ucb-bar/chisel-testers2#14。
编辑:将 RawModule
包装在 MultiIOModule
中的示例:
import chisel3._
import chisel3.stage.ChiselStage
sealed trait CommonIO { this: RawModule =>
val a = IO(Input(Bool()))
val b = IO(Output(Bool()))
}
class Foo extends RawModule with CommonIO {
val clk = IO(Input(Clock()))
val rst = IO(Input(Reset()))
b := withClockAndReset(clk, rst){ RegNext(a, true.B) }
}
class Wrapper extends MultiIOModule with CommonIO {
val foo = Module(new Foo)
foo.a := a
b := foo.b
foo.clk := clock
foo.rst := reset
}
(new ChiselStage)
.execute(Array("-X", "verilog"),
Seq(chisel3.stage.ChiselGeneratorAnnotation(() => new Wrapper)))
这会产生以下 FIRRTL:
circuit Wrapper :
module Foo :
input a : UInt<1>
output b : UInt<1>
input clk : Clock
input rst : Reset
reg _T : UInt<1>, clk with : (reset => (rst, UInt<1>("h01")))
_T <= a
b <= _T
module Wrapper :
input clock : Clock
input reset : UInt<1>
input a : UInt<1>
output b : UInt<1>
inst foo of Foo
foo.a <= a
b <= foo.b
foo.clk <= clock
foo.rst <= reset
注:
- 使用
withClockAndReset
将clk
和rst
用于RegNext
的时钟和复位连接
- 来自隐式
Wrapper.clock
和Wrapper.reset
的联系必须显式建立。withClockAndReset
在这里不起作用。