首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何测试Chisel3 BlackBox?

如何测试Chisel3 BlackBox?
EN

Stack Overflow用户
提问于 2022-02-14 11:25:23
回答 1查看 159关注 0票数 0

对于Verilog中定义的模块,我有以下测试工具:

代码语言:javascript
复制
class TestMCQDiv extends FlatSpec with ChiselScalatestTester with Matchers {
    behavior of "MCQDiv"

    // Dependent Variables for Testing
    val integerWidth = 50
    val rationalWidth = 10
    val bitWidth = integerWidth + rationalWidth

    // Module and Test Dependencies
    val fepar = new UFSMulticycleConstraints(integerWidth, rationalWidth)

    //val scale = 124.0
    val scale = 1.0
    val i = 36.0
    val n = 2.0

    it should "Test the MCQDiv Module" in {
        test(new mc_qdiv(fepar)) { dut =>
            // iterate through each test value
            for (t <- -7 to -7) {
                // Initialize each value
                dut.io.i_dividend.poke(1.S(15.W))
                dut.io.i_divisor.poke(1.S(15.W))
                dut.io.i_start.poke(1.B)

                while(dut.io.o_complete.peek().litValue().toDouble == 0) {
                    dut.io.i_clk.step(1)
                }
                println("Test( " + t + " / " + 1 + " ) = " + dut.io.o_quotient_out.peek())

            }
        }
    }
}

在这里定义了MCQDiv的实现:

代码语言:javascript
复制
class qdiv(fepar: UFSMulticycleConstraints) extends BlackBox with HasBlackBoxResource {
    val io = IO(new Bundle{
        val i_dividend: SInt = Input(SInt(fepar.bit_width.W))
        val i_divisor: SInt = Input(SInt(fepar.bit_width.W))
        val i_start: Bool = Input(Bool())
        val i_clk: Clock = Input(Clock())
        val o_quotient_out: SInt = Output(SInt(fepar.bit_width.W))
        val o_complete: Bool = Output(Bool())
        val o_overflow: Bool = Output(Bool())
    })

    addResource("/mc_qdiv.v")
}

class mc_qdiv(fepar: UFSMulticycleConstraints) extends Module {
    val io = IO(new Bundle {
        val i_dividend: SInt = Input(SInt(fepar.bit_width.W))
        val i_divisor: SInt = Input(SInt(fepar.bit_width.W))
        val i_start: Bool = Input(Bool())
        val i_clk: Clock = Input(Clock())
        val o_quotient_out: SInt = Output(SInt(fepar.bit_width.W))
        val o_complete: Bool = Output(Bool())
        val o_overflow: Bool = Output(Bool())
    })

    val bb_qdiv: qdiv = Module(new qdiv(fepar))

    bb_qdiv.io.i_dividend := io.i_dividend
    bb_qdiv.io.i_divisor := io.i_divisor
    bb_qdiv.io.i_start := io.i_start
    bb_qdiv.io.i_clk := io.i_clk
    io.o_quotient_out := bb_qdiv.io.o_quotient_out
    io.o_complete := bb_qdiv.io.o_complete
    io.o_overflow := bb_qdiv.io.o_overflow

}

最初,我面临一个无法找到Verilog模块的问题:

WARNING: external module "qdiv"(:qdiv)was not matched with an implementation

下面的站点使我意识到后端编译器需要更改为Verilator。按照在那里发布的说明,我可以通过在编译器命令中添加以下标志来消除先前的警告:-z verilator。完整的命令如下所示:sbt 'testOnly Exp.TestMCQDiv -- -z verilator'现在编译(不正确)在没有执行任何测试的情况下完成。我确实尝试过在Github上查看一个示例Github实现,但是没有使用peek-poke测试的例子,我非常想使用它。吉塞尔有什么基本的东西,我可能会忘记(我对吉塞来说是新手)?还是有人知道我做错了什么?

附加信息:我确实安装了Verilator : Verilator 4.106 2020-12-02 rev 4.104-91-gb350b6a0f。我也在使用Chisel3。

EN

回答 1

Stack Overflow用户

发布于 2022-02-14 17:40:18

-z是筛选要运行的测试的最有规模的开关。如果您没有任何匹配该名称的测试,则不会运行任何测试。(您可以查看scalatest docs:跑步者中最可缩放的命令行参数的完整列表),您可以使用VerilatorBackendAnnotation选择chiseltest Verilator后端。参见这里的一个示例:https://github.com/ucb-bar/chiseltest/blob/master/src/test/scala/chiseltest/iotesters/examples/GCDSpec.scala

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71111063

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档