2016-11-17 8 views
1

Я работаю над Z-Scale RISCV-процессором, где я реализовал новую функциональность и логику в datapath. Мне интересно, существует ли простой способ «отключить» определенные части кода, не используя кучу if-loops? Я хотел бы упростить переход между обычной реализацией процессора Z-scale и расширенной реализации.Использовать общий тип, чтобы отключить логику в datapath (долото)

Новая реализованная логика не заменяет основные компоненты datapath, а расширяет функциональность.

ответ

2

Этот вопрос действительно поражает сердце того, что делает долото мощным. Как DSL, встроенный в Scala, у вас есть доступ к полной мощности объектно-ориентированного и функционального языка программирования.

Хотя я не уверен точно, что вы делаете, это кажется хорошим местом для использования наследования. Вы можете создать новый класс модуля, который расширяет модуль datapath и добавляет дополнительные функции.

Игрушечный пример:

import Chisel._ 

class ParentIO extends Bundle { 
    val foo = UInt(width = 32).asInput 
    val bar = UInt(width = 32).asOutput 
} 

class Parent extends Module { 
    // Note the use of lazy val 
    // Due to Scala initialization order (http://docs.scala-lang.org/tutorials/FAQ/initialization-order.html) 
    // this cannot be a val 
    // Due to quirks of Chisel, this cannot be a def 
    lazy val io = new ParentIO 
    io.bar := io.foo 
} 

class ChildIO extends ParentIO { 
    val isOdd = Bool().asOutput 
} 

class Child extends Parent { 
    override lazy val io = new ChildIO 
    io.isOdd := io.foo(0) 
} 

// Note use of call-by-name for passing gen 
// Chisel Modules must be constructed within a call to the Module(...) function 
class Top(gen: => Parent) extends Module { 
    val dut = Module(gen) 
    val io = dut.io.cloneType 
    io <> dut.io 
} 

Модуль Top параметризируются по типу модуля он создает экземпляр: родитель или ребенок. Таким образом, вы можете условно создать родительский или дочерний объект, а не всю логику, которая их отличает. Если вы хотите, чтобы Ребенок переопределял определенные функции родителя, последняя семантика связывания Chisel позволяет любым соединениям в Ребенке отменять соединения в родительском элементе.

+0

Спасибо за ответ! Я задаюсь вопросом, возможно ли иметь переменную, которая может управлять параметром модуля Top, поэтому он будет создавать экземпляр Child, если переменная установлена ​​в 1, а родитель в противном случае? Я пробовал разные идеи, не получая того, что хочу. – Mrchacha

+0

Я ответил на http://stackoverflow.com/questions/41720320/initialize-class-depending-on-config-value – jkoenig

2

Похоже ваш код выглядит следующим образом:

val a = Wire(UInt()) 
if (extension) 
    a := 1.U 
else 
    a := 2.U 

Что вы могли бы сделать, это создать Z-масштабный класс и Z-Масштабный расширенный класс, который реализует черты, которая содержит различие между две конструкции.

trait RISC_V_Processor { 
    def do_a : UInt 
} 

class Z_Scale with RISC_V_Processor { 
    def do_a : UInt = 2.U 
} 

class Z_Scale_extended with RISC_V_Processor { 
    def do_a : UInt = 1.U 
} 

val processor = new Z_Scale_extended() 
val a = processor.do_a() 

Это по существу заменяет условные обозначения полиморфизмом. https://sourcemaking.com/refactoring/replace-conditional-with-polymorphism

+1

Я просто хотел указать, что первый пример не будет компилироваться из-за переназначения на 'a' вместо соединения, это должно быть' a: = 1.U' и 'a: = 2.U' – jkoenig

+0

Да , это было набросано быстро, чтобы продемонстрировать точку, хотя это исправит. – sebo

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

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