Долото 3. Функциональный модуль Mux4

Я изучаю Chisel, следуя документации на Github

Пока все работало безупречно. Но я застрял в главе 13, «Создание функционального модуля»

Я не могу заставить код работать. Я создал все свои классы .scala в копии проекта chisel-template-project. Вот что я написал / скопировал для создания Mux4 с переменной разрядностью:

/chisel-template/src/main/scala/<▪Mux4.scala

import Chisel._

class Mux4(w: Int) extends Module {
  val io = IO(new Bundle {
        val sel = UInt(INPUT, 2)
        val in0 = UInt(INPUT, w)
        val in1 = UInt(INPUT, w)
        val in2 = UInt(INPUT, w)
        val in3 = UInt(INPUT, w)
        val out = UInt(OUTPUT, w)
  })

  io.out := Mux2(io.sel(1), 
                    Mux2(io.sel(0), io.in0, io.in1),
                    Mux2(io.sel(0), io.in2, io.in3))
}


class Mux2(w: Int) extends Module {
  val io = IO(new Bundle {
        val sel = Bool(INPUT)
        val in0 = UInt(INPUT, w)
        val in1 = UInt(INPUT, w)
        val out = UInt(OUTPUT, w)
  })

  when(io.sel) {
    io.out := io.in0
  }.otherwise {
    io.out := io.in1
  }
}


object Mux2 {
  def apply(sel: UInt, in0: UInt, in1: UInt): UInt = {
    val m = new Mux2(in0.getWidth) 
    m.io.sel := sel.toBool()
    m.io.in0 := in0
    m.io.in1 := in1
    m.io.out
  }
}

Я написал класс Tester scala:

/chisel-template/src/test/scala/<▪Mux4Test.scala

import Chisel.iotesters.{ChiselFlatSpec, Driver, PeekPokeTester}

class Mux4Test(c: Mux4) extends PeekPokeTester(c) {

      val sel = 3
      val (in0, in1, in2, in3) = (5, 7, 11, 15)

      poke(c.io.sel, sel)
      poke(c.io.in0, in0)
      poke(c.io.in1, in1)
      poke(c.io.in2, in2)
      poke(c.io.in3, in3)
      step(1)
      System.out.println("Circuit: "+peek(c.io.out)
          +"  Expected: "+TestMux4.result(sel, in0, in1, in2, in3))
}

object TestMux4{
  def result(sel: Int, in0: Int, in1: Int, in2: Int, in3: Int): Int = {
    val out = sel match{
      case 0 => in3
      case 1 => in2
      case 2 => in1
      case 3 => in0
    }
    out
  }
}

class Mux4Tester extends ChiselFlatSpec {
  behavior of "Mux4"
  backends foreach {backend =>
    it should s"do Mux4 $backend" in {
      Driver(() => new Mux4(4), backend)(c => new Mux4Test(c)) should be (true)
    }
  }
}

Важная часть из вывода

STEP 0 -> 1
Circuit: 0  Expected: 5

Класс Mux4 (Circuit) возвращает 0 на выходе, тогда как он должен быть 5, потому что процесс выбора выглядит следующим образом:

00 -> io.out = in3 = 15

01 -> io.out = in2 = 11

10 -> io.out = in1 = 7

11 -> io.out = in0 = 5

В классе Mux4Test.scala я написал val sel = 3. Битовое представление этого значения - 11, поэтому я ожидал бы in0 = 5.

Где я не прав?


person mtosch    schedule 10.11.2016    source источник


Ответы (2)


Спасибо за проявленный интерес к Chisel!

Я запустил ваш пример и, немного почесав в затылке, обнаружил проблему: когда вы создаете экземпляр модуля Chisel, вам нужно обязательно заключить его в Module(...) (РЕДАКТИРОВАТЬ: код в вики опускает эту оболочку. Это было фиксированный). Таким образом, вместо этого объект Mux2 должен быть:

object Mux2 {
  def apply(sel: UInt, in0: UInt, in1: UInt): UInt = {
    val m = Module(new Mux2(in0.getWidth)) // <- See Here
    m.io.sel := sel.toBool()
    m.io.in0 := in0
    m.io.in1 := in1
    m.io.out
  }
}

С этим изменением похоже, что код работает!

person Jack Koenig    schedule 10.11.2016
comment
Я также только что понял, что в примере на настоящей вики есть такая же ошибка. Мои извинения! Сразу исправлю. - person Jack Koenig; 11.11.2016
comment
Спасибо за быстрый ответ @jkoenig. Теперь это работает! - person mtosch; 11.11.2016
comment
Я также рекомендовал исправление, чтобы гарантировать, что эта ошибка будет обнаружена в будущем, извините за любое разочарование, которое это вызвало! - person Jack Koenig; 12.11.2016

не читал весь ваш код, но я думаю, что аргументы Mux2 находятся здесь в неправильном порядке:

Mux2 (io.sel (0), io.in0, io.in1)

person Sebastian Bøe    schedule 10.11.2016