2016-11-10 6 views
2

Я изучаю долото после документации on GithubДолото3. Функциональный модуль Mux4

До сих пор все работало безупречно. Но я застрял в главе 13, "Functional Module Creation"

I не может получить код для работы. Я создал все мои классы .scala в копии проекта-долота-шаблона. Вот что я написал/скопировать, чтобы создать MUX4 с переменной битовой шириной:

/долото-шаблон/SRC/главная/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 я писал:

/долото шаблон/SRC/тест/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 класс (цепи) возвращает 0 в качестве выходного сигнала, в то время как оно должно быть не менее 5, потому что процесс выбора заключается в следующем:

00 -> IO .out = IN3 = 15

01 -> io.out = дюйм2 = 11

10 -> io.out = IN1 = 7

11 -> io.out = in0 = 5

В классе Mux4Test.scala я написал VAL Сель = 3. Битовое представление это и поэтому я ожидал бы in0 = 5.

Где я ошибаюсь?

ответ

5

Благодарим вас за интерес к Chisel!

Я запустил ваш пример, и, почесывая голову на некоторое время, я обнаружил проблему: при создании экземпляра модуля долота вам нужно обязательно обернуть его в Module(...) (EDIT: код на вики пропустил эту оболочку . Это было исправлено). Таким образом, объект 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 
    } 
} 

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

+0

Я также просто понял, что пример фактической вики имеет ту же ошибку. Мои извинения! Я исправлю это сразу. – jkoenig

+0

Благодарим вас за быстрый ответ @jkoenig. Теперь это работает! – mtosch

+0

У меня также было исправлено исправление, чтобы эта ошибка попала в будущее, извините за любое разочарование, которое это вызвало! – jkoenig

0

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

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