如何在凿子2.0中制作黑盒子?

时间:2017-09-09 13:30:53

标签: scala verilog chisel

我写了这段代码: verilog代码只是门:

import Chisel._

class BB_tb extends Bundle {

    val a = Bits(INPUT,  1)
    val b = Bits(INPUT,  1)
    val c = Bits(OUTPUT, 1)
  }



class BlackBox_tb extends BlackBox { 
  val io = new BB_tb() 
}

但是在尝试运行时遇到这些错误: 我不知道这意味着什么

  

运行BlackBox_tb --backend c --targetDir ../emulator --compile       [info]将1个Scala源编译为/home/essam/intensivate-developer_resources-a25f02d3592d/chisel-tutorial/problems/target/scala-2.11/classes ...       [info]运行TutorialProblems.TutorialProblems BlackBox_tb --backend c --targetDir ../emulator --compile       [error](run-main-0)scala.MatchError:BlackBox_tb(类java.lang.String)       scala.MatchError:BlackBox_tb(类java.lang.String)           at TutorialProblems.TutorialProblems $ .main(problems.scala:9)           在TutorialProblems.TutorialProblems.main(problems.scala)           at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)           at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)           at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)           at java.lang.reflect.Method.invoke(Method.java:498)       [trace]抑制堆栈跟踪:运行最后一次编译:运行完整输出。       java.lang.RuntimeException:非零退出代码:1           在scala.sys.package $ .error(package.scala:27)       [trace]抑制堆栈跟踪:运行最后一次编译:运行完整输出。       [错误](编译:运行)非零退出代码:1       [错误]总时间:18秒,完成于2017年9月9日下午2:30:45

1 个答案:

答案 0 :(得分:0)

在Chisel2中完成这项工作有多重要? Chisel3现在是标准版本,其中很多东西都更容易,更好地支持它。 在chisel3中,以下内容适用于我。

// See LICENSE for license details.

package essan

import chisel3._
import chisel3.iotesters.PeekPokeTester
import chisel3.util.HasBlackBoxResource

class BBAnd extends BlackBox with HasBlackBoxResource {
  val io = IO(new Bundle {
    val a = Input(Bool())
    val b=  Input(Bool())
    val result = Output(Bool())
  })
  val blackBoxFloatVerilog = "/essan/BBAnd.v"
  setResource(blackBoxFloatVerilog)
}

class BBWrapper extends Module {
  val io = IO(new Bundle {
    val a = Input(Bool())
    val b=  Input(Bool())
    val result = Output(Bool())
  })

  val tb = Module(new BBAnd)
  tb.io.a := io.a
  tb.io.b := io.b
  io.result := tb.io.result
}

class BlackBox_tbTests(c: BBWrapper) extends PeekPokeTester(c) {
  // FILL THIS IN HERE
  poke(c.io.a, 1)
  poke(c.io.b, 1)
  // FILL THIS IN HERE
  step(1)
  expect(c.io.result, 1)
}

object BlackBox_tbTests {
  def main(args: Array[String]): Unit = {
    iotesters.Driver(() => new BBWrapper, "verilator") { c =>
      new BlackBox_tbTests(c)
    }
  }
}

我使用以下作为底层的verilog实现

module BBAnd(
    input  [63:0] a,
    input  [63:0] b,
    output reg [63:0] result
);
  always @* begin
  result = a & b;
  end
endmodule

唯一真正的诀窍是弄清楚verilog实现的位置。 文件树看起来像。

src
src/main
src/main/resources
src/main/resources/essan
src/main/resources/essan/BBAnd.v
src/main/scala
src/main/scala/essan
src/main/scala/essan/BlackBoxAnd.scala

我使用

从命令行运行测试
sbt 'runMain essan.BlackBox_tbTests'