后端验证器:黑盒模块无法实例化 Chisel 模块使用emitVerilog 生成

问题描述

本地 verilog 模块:“my_module”。 my_module_blackBox 是这个模块对应的凿子黑盒。

原生 verilog 模块“my_module”实例化了一个用 chisel 编码的 RAM(main_ram)。模块名称为 main_ram。

使用的后端是verilator。即代码使用chisel peek poke tester,带有verilator后端。本机 verilog 模块无法定位模块 main_ram。发出的 verilog 模块(main_ram)存在于我执行 sbt run 的目录中。另一方面,黑盒包装是在 test_run_dir// 中生成的。 Verilator 抱怨它无法找到 main_ram。 (请参阅下面突出显示错误消息)。

我应该让emitVerilog在test_run_dir//..中生成,如果是的话怎么做? 如何获得正确的“目录”/验证器搜索路径?

本机(手工编码)verilog 模块想要在同一个项目中使用凿子生成的 verilog 模块,反之亦然。是否支持这样的用例?有人可以指出一些例子吗?

更多细节:-

main_ram 使用以下代码生成:-

    ```
        (new chisel3.stage.ChiselStage).execute(
        Array("-X","verilog"),Seq(ChiselGeneratorAnnotation(() => new main_ram(data_width,addr_width ))))
    ```

BlackBox 模块“my_module.v”尝试实例化生成的 main_ram。 Verilator 遇到以下错误

       Error:-( replaced real directory names / file names with .../<>):
       cd .../test_run_dir/blackBox920936627 && verilator --cc <>_wrap.v --assert -Wno-fatal -Wno-WIDTH -Wno-STMTDLY -O1 --top-module my_module_blackBox_wrap +define+TOP_TYPE=V<>_wrap +define+PRINTF_COND=!<>_wrap.reset +define+STOP_COND=!<>.reset -CFLAGS "-Wno-undefined-bool-conversion -O1 -DTOP_TYPE=V<>_wrap -DVL_USER_FINISH -include V<>_wrap.h" -Mdir .../ctb/test_run_dir/blackBox920936627 -f .../test_run_dir/blackBox920936627/firrtl_black_Box_resource_files.f --exe .../test_run_dir/blackBox920936627/<>_wrap-harness.cpp --trace
       **%Error: .../test_run_dir/blackBox920936627/my_module.v:79: Cannot find file containing module: 'main_ram'**
       main_ram i_ram(clk,rst,write,addr,din,dout,ena);

以下是驱动程序/测试人员代码:-

       val works = chisel3.iotesters.Driver ( () => new my_module_blackBox_wrap(parameters),"verilator") {
            c=> new my_module_blackBox_tester(c,parameter)
        }
        assert(works)

感谢您的帮助

解决方法

跑步时

(new chisel3.stage.ChiselStage).emitVerilog(new my_module,Array("--help"))

它会在您的终端上显示可用选项。我想如果您想在特定文件夹中为 RAM 生成 verilog,您可以使用 --target-dir 选项。尝试运行上述命令,您将能够看到所有其他可用选项。

在我看来,您正在生成两个单独的验证模块(如果我错了,请纠正我),一个用于 RAM 模块,另一个用于 my_module 模块。如果是这样,两个经过验证的模块都将在经过验证的 cpp 文件中拥有自己的主程序。要组合这 2 个模块,您必须从 main 中删除大量代码并重命名许多类等。基本上是 API 大修,以组合 verilated.cpp 文件中的 2 个模块。但是当然,如​​果您想通过 verilog testbench 测试生成的 verilog 模块,您可以使用上面的命令并在您希望的地方生成 verilog,然后在 verilog 中编写一个 testbench 进行测试。