#chisel #rocket-chip
#chisel #rocket-чип
Вопрос:
Я пытаюсь синхронизировать пакет сигналов между 2 модулями в разных тактовых доменах. Я могу сделать это, вручную создав экземпляр AsyncQueue между ними, а также позаботиться о подключении часов и сбросе для каждой стороны. Похоже, что есть простой способ сделать это с AsyncBundle
, и мне нужны некоторые рекомендации по пониманию того, как это сделать. на стороне источника (в clkA) У меня есть :
val ioA = IO(Decoupled(UInt(32.W))
На стороне приемника (в clkB) У меня есть:
val ioB = IO(Decoupled(UInt(32.W).flip)
Поэтому имеет смысл (я не уверен, что приведенный ниже код правильный) сделать что-то вроде этого:
// in module A
val ioA = IO(new AsyncBundle(Decoupled(UInt(32.W))))
// in module B
val ioB = IO (new AsyncBundle(Decoupled(UInt(32.W)).flip)
// and somewhere in a module that contains both modules
b.io <> FromAsyncBundle(a.io)
имеет ли смысл вышесказанное? также я заметил, что FromAsyncBundle
создает DecoupledIO
заменяет ли он тот, который я определил в пакете, или это просто для пересечения?
если он заменяет, как мне управлять им, например, отправлять данные и действительны из некоторой логики.
Как насчет часов, которые получит каждая сторона пересечения?
Комментарии:
1.
AsyncBundle
на самом деле является частьюrocket-chip
репозитория, поэтому вы можете получить лучшие результаты, добавив этот тег.