你如何测试 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

注:

  1. 使用withClockAndResetclkrst用于RegNext
  2. 的时钟和复位连接
  3. 来自隐式 Wrapper.clockWrapper.reset 的联系必须显式建立。 withClockAndReset 在这里不起作用。