Особенность BlackBox в chisel3 - PullRequest
       8

Особенность BlackBox в chisel3

0 голосов
/ 17 сентября 2018

Я хочу попробовать функцию BlackBox в долоте, но я получил предупреждение ниже и не могу пройти тест пик / пик:

Total FIRRTL Compile Time: 237.8 ms
WARNING: external module "BlackBoxSwap"(swap:BlackBoxSwap)was not matched with an implementation
WARNING: external module "BlackBoxSwap"(:BlackBoxSwap)was not matched with an implementation
WARNING: external module "BlackBoxSwap"(:BlackBoxSwap)was not matched with an implementation
WARNING: external module "BlackBoxSwap"(:BlackBoxSwap)was not matched with an implementation
file loaded in 0.398085417 seconds, 25 symbols, 15 statements

Исходный код, как показано ниже: package gcd

import chisel3._
import chisel3.util._

class BlackBoxSwap extends BlackBox with HasBlackBoxInline  {
//class BlackBoxRealSwap extends BlackBox with HasBlackBoxResource {
  val io = IO(new Bundle() {
    //val clk = Input(Clock())
      //val reset = Input(Bool())
    val out2 = Output(UInt(16.W))
    val out1 = Output(UInt(16.W))
    val in2 = Input(UInt(16.W))
    val in1 = Input(UInt(16.W))
  })


  //setResource("/real_swap.v")

  setInline("BlackBoxSwap.v",
    s"""
       |module BlackBoxSwap (
       |  input  [15:0] in1,
       |  input  [15:0] in2,
       |  output [15:0] out1,
       |  output [15:0] out2
       |);
       |
       |assign out1 = in2;
       |assign out2 = in1;
       |
       |endmodule
    """.stripMargin)

}

/**
  * Compute GCD using subtraction method.
  * Subtracts the smaller from the larger until register y is zero.
  * value in register x is then the GCD
  */
class GCD extends Module {
  val io = IO(new Bundle {
    val value1        = Input(UInt(16.W))
    val value2        = Input(UInt(16.W))
    val loadingValues = Input(Bool())
    val outputGCD     = Output(UInt(16.W))
    val outputValid   = Output(Bool())
  })

  val x  = Reg(UInt())
  val y  = Reg(UInt())

  val swap = Module(new BlackBoxSwap)

  when(x > y) { x := x - y }
    .otherwise { y := y - x }

  when(io.loadingValues) {
    //x := io.value1
    //y := io.value2
    swap.io.in1 := io.value1
    swap.io.in2 := io.value2

    x := swap.io.out1
    y := swap.io.out2
  }

  io.outputGCD := x
  io.outputValid := y === 0.U
}

И я проверил сгенерированный RTL, кажется, это правильно.не могли бы вы помочь в этом?Большое спасибо!

Ответы [ 2 ]

0 голосов
/ 19 сентября 2018

Chisel3 имеет несколько бэкэндов, каждый из которых генерирует собственный вывод. У долота 3.1 есть бэкэнд по умолчанию treadle , поэтому, если вам нужно включить Verilog, сделайте следующее:

sbt "test: runMain gcd.GCDMain --is-verbose - backend-name verilator"

0 голосов
/ 17 сентября 2018

Мне кажется, что вы пытаетесь использовать бэкэнд интерпретатора firrtl с черным ящиком verilog.Черный ящик verilog можно использовать только с бэкэндом на основе verilog, таким как verilator или VCS.Если вам не ясно, как настроить бэкэнд, посмотрите примеры в chisel-template .

Существует способ использовать имитацию черного ящика с бэкэндом интерпретатора firrtl, но для этого потребуется написать реализацию черного ящика в scala.

...