Можно ли иметь некоторое время l oop в долоте в зависимости от состояния типов данных долота? - PullRequest
3 голосов
/ 23 февраля 2020

Вот что я пытаюсь выполнить sh: У меня есть ускоритель с долотом, который вызывает другой ускоритель с долотом и передает значение. Я хочу, чтобы второй имел некоторое время l oop, где условие частично основано на входном значении. Вот пример кода:

class Module1 extends Module {
    val in = 0.U
    val Module2Module = Module2()
    Module2Module.io.in := in
}

class Module2 extends Module {
    val io = IO(new Bundle {
        val in = Input(Reg(UInt))
    }
    val test = 0.U

    while (test < io.in) {

    }
}

Я получаю сообщение об ошибке, что «test

Как правильно это реализовать? Это из-за того, что сигналы, посылаемые в / из модуля 1 в модуль 2, указывают на то, что ускоритель еще не завершен, и продолжаются только тогда, когда это происходит? Если это так, разве это не станет сложным быстро, если у вас есть несколько функций, каждая в разных модулях?

Ответы [ 2 ]

1 голос
/ 23 февраля 2020

Вам нужно будет использовать регистры, созданные конструкторами семейства Reg, и управлять потоком с помощью when, elsewhen и otherwise. Я думаю, что хороший пример для вас в 2.6_testers2.ipynb из булавочный загрузочный лаг . Схема GCD эквивалентна некоторое время l oop. Цепь продолжается до тех пор, пока регистр y не уменьшится до нуля. Каждый тактовый цикл соответствует одной итерации программного обеспечения, тогда как l oop. Схема использует готовые и действительные поля входных и выходных данных Decoupled для координации приема новых данных и создания отчетов, когда вычисляется значение GCD. Посмотрите на этот пример и посмотрите, есть ли у вас дополнительные вопросы.

0 голосов
/ 26 февраля 2020

Просто чтобы понять, почему вы не можете использовать while l oop с аппаратными значениями, такими как chisel3.Bool, вы можете представить проект chisel3 как программу Scala, которая конструирует аппаратный дизайн как это выполняется. Когда запускается chisel3, он просто запускает программу, вывод которой является вашей схемой (в конечном итоге выводится как Verilog). while - это конструкция Scala, поэтому она доступна только во время выполнения программы, она не существует на реальном оборудовании. Существует аналогичный вопрос и ответ о for петлях в списке рассылки пользователей зубила .

Теперь, чтобы ответить на ваш вопрос, как упоминал Чик, вы можете использовать конструкции chisel3 when, .elsewhen и .otherwise для управления потоком управления в реальном оборудовании:

class Module2 extends Module {
    val io = IO(new Bundle {
        val in = Input(Reg(UInt))
    }
    val test = 0.U

    when (test < io.in) {
      // Logic for that applies when (or while) the condition is true
    } .otherwise {
      // Logic that applies when it isn't
    }
}

Также, как упоминал Чик, вам, вероятно, понадобится некоторое состояние (с использованием Reg с), так как вы можете нужно делать вещи в течение нескольких тактов. Трудно дать совет, кроме этого простого примера, без дополнительной информации, но, пожалуйста, уточните свой вопрос или задайте больше вопросов, если вам нужна дополнительная помощь.

Если это так, не будет ли это быстро усложниться, если вы есть несколько функций, каждая в разных модулях?

Я не уверен, как ответить на этот бит без большего контекста, но вся цель Chisel состоит в том, чтобы упростить создание абстракций, которые позволяют вам справиться со сложностью. Долото позволяет разрабатывать программное обеспечение при проектировании оборудования.

...