2016-12-07 4 views
1

Я пытаюсь настроить и использовать исходный файл ALU процессора Sodor/Rocket core в другом проекте с использованием chisel3. Запуск теста sbt дает мне следующую ошибку.Ошибка тестирования долота в sodor/rocket core ALU

[info] - should carry out proper arithmatic and logical operations (with verilator) *** FAILED *** 

[info] chisel3.core.Binding$BindingException: 'this' ([email protected]): Missing IO() wrapper 

[info] at chisel3.core.Binding$.checkSynthesizable(Binding.scala:185) 

[info] at chisel3.core.Bits.do_apply(Bits.scala:97) 

[info] at chisel3.core.Bits.do_apply(Bits.scala:109) 

[info] at RiscvIoT.ALU$.isSub(alu.scala:44) 

[info] at RiscvIoT.ALU.<init>(alu.scala:68) 

[info] at RiscvIoT.ALUTester$$anonfun$2$$anonfun$apply$1$$anonfun$apply$mcV$sp$1.apply(aluTest.scala:41) 

[info] at RiscvIoT.ALUTester$$anonfun$2$$anonfun$apply$1$$anonfun$apply$mcV$sp$1.apply(aluTest.scala:41) 

[info] at chisel3.core.Module$.do_apply(Module.scala:29) 

[info] at chisel3.Driver$$anonfun$elaborate$1.apply(Driver.scala:191) 

[info] at chisel3.Driver$$anonfun$elaborate$1.apply(Driver.scala:191) 

После руководства по долото 3 вики на тестирование и отладку, я считаю, что начальная ошибка в строке 44 (isSub определения функции). Но я не могу понять проблему, и ничто из этого не решает проблему. Для удобства я отправляю полный исходный файл ниже.

import chisel3._ 
import chisel3.util._ 
import Common._ 

object ALU 
{ 
    val SZ_ALU_FN = 4 
    val ALU_X = Bits(0) 
    val ALU_ADD = Bits(0) 
    val ALU_SLL = Bits(1) 
    val ALU_XOR = Bits(4) 
    val ALU_OR = Bits(6) 
    val ALU_AND = Bits(7) 
    val ALU_SRL = Bits(5) 
    val ALU_SUB = Bits(10) 
    val ALU_SRA = Bits(11) 
    val ALU_SLT = Bits(12) 
    val ALU_SLTU = Bits(14) 
    val ALU_COPY1= Bits(8) 

    def isMulFN(fn: Bits, cmp: Bits) = fn(1,0) === cmp(1,0) 
    def isSub(cmd: Bits) = cmd(3) 
    def isSLTU(cmd: Bits) = cmd(0) 
} 
import ALU._ 

class ALUIO extends Bundle { 
    val xprlen = 32 
    val fn = Bits(INPUT, SZ_ALU_FN) 
    val in2 = UInt(INPUT, xprlen) 
    val in1 = UInt(INPUT, xprlen) 
    val out = UInt(OUTPUT, xprlen) 
    val adder_out = UInt(OUTPUT, xprlen) 
} 

class ALU extends Module 
{ 
    val io = new ALUIO 
    val xprlen = 32 
    val msb = xprlen-1 

    // ADD, SUB 
    val sum = io.in1 + Mux(isSub(io.fn), -io.in2, io.in2) 

    // SLT, SLTU 
    val less = Mux(io.in1(msb) === io.in2(msb), sum(msb), 
       Mux(isSLTU(io.fn), io.in2(msb), io.in1(msb))) 

    // SLL, SRL, SRA 
    val shamt = io.in2(4,0).toUInt 
    val shin_r = io.in1(31,0) 
    val shin = Mux(io.fn === ALU_SRL || io.fn === ALU_SRA, shin_r, Reverse(shin_r)) 
    val shout_r = (Cat(isSub(io.fn) & shin(msb), shin).toSInt >> shamt)(msb,0) 
    val shout_l = Reverse(shout_r) 

    val bitwise_logic = 
    Mux(io.fn === ALU_AND, io.in1 & io.in2, 
    Mux(io.fn === ALU_OR, io.in1 | io.in2, 
    Mux(io.fn === ALU_XOR, io.in1^io.in2, 
         io.in1))) // ALU_COPY1 

// val out64 = 
    val out_xpr_length = 
    Mux(io.fn === ALU_ADD || io.fn === ALU_SUB, sum, 
    Mux(io.fn === ALU_SLT || io.fn === ALU_SLTU, less, 
    Mux(io.fn === ALU_SRL || io.fn === ALU_SRA, shout_r, 
    Mux(io.fn === ALU_SLL,      shout_l, 
    bitwise_logic)))) 

    io.out := out_xpr_length(31,0).toUInt 
    io.adder_out := sum 
} 

ответ

3

Исключение брошено: chisel3.core.Binding$BindingException: 'this' ([email protected]): Missing IO() wrapper это связано с тем, что в chisel3, ИО должны быть завернуты в IO (...)

Это, пожалуй, немного скрытой в документации (см https://github.com/ucb-bar/chisel3/wiki/Chisel3-vs-Chisel2#deprecated-usage)

чтобы исправить, изменить Io декларацию в АЛУ для:

val io = IO(new ALUIO) 

Вы также должны изменить ALUIO к:

class ALUIO extends Bundle { 
    val xprlen = 32 
    val fn = Input(Bits(SZ_ALU_FN.W)) 
    val in2 = Input(UInt(xprlen.W)) 
    val in1 = Input(UInt(xprlen.W)) 
    val out = Output(UInt(xprlen.W)) 
    val adder_out = Output(UInt(xprlen.W)) 
} 

Хотя я считаю, что старый способ устарел, а не ошибка.

+0

Thanks jkoenig. И жаль, что задал глупый вопрос. У меня все еще есть проблемы с идентификацией ошибок долота из сообщений об ошибках. – isuru

+0

Это действительно не проблема! Chisel + Scala представляет собой крутую кривую обучения. Чем больше вопросов задает вопрос о переполнении стека, тем больше шансов, что будущие люди быстро найдут решение своей проблемы! – jkoenig

 Смежные вопросы

  • Нет связанных вопросов^_^