Как синхронизировать пакет между 2 тактовыми доменами в chisel

#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 репозитория, поэтому вы можете получить лучшие результаты, добавив этот тег.