Chisel:如何实现高效的单热多路复用器?
Chisel: how to implement a one-hot mux that is efficient?
我有一个 table,其中 table 的每一行都包含状态(寄存器)。有选择一个特定行的逻辑。只有一行接收到 "selected" 信号。然后访问所选行的状态。要么将状态的一部分作为输出连接到模块的 IO,要么将 IO 的一部分用作输入以更新状态。
如果我用电路实现它,我会使用传输门。 selected 信号将打开一组传输门,它将行的寄存器连接到总线。然后总线将连接到 IO 束。这是快速、小面积和低能量。
在 Chisel 中有一种直接的实现方法。它将 selected 行编码为二进制数,然后将该数字应用于传统多路复用器的 select 输入。不幸的是,对于具有 20 到 50 行和数百位状态的 table,此实现可能非常缓慢,并且浪费空间和能量。
问题分为两部分:
1) 有没有办法在 Chisel 中指定总线,这样你的通行门或传统的三态驱动程序都挂在总线上?
2) 如果做不到这一点,在 Chisel 中是否有快速、小面积、低能量的方法?
谢谢
1) Chisel 不完全支持双向线,但通过实验性模拟类型 (see example),您至少可以通过您的 Chisel 代码在 Verilog 黑盒之间缝合总线。
2) 您是否尝试过 Mux1H in chisel3.util? It emits essentially a sum of products of the inputs and their corresponding select bits. I'm not sure how this compares to your proposed implementation. I would love to see a QOR comparison. If this construct is not sufficient and you cannot express precisely what you want in chisel, you can use a parameterized BlackBox 实现您的 one-hot mux 并根据需要实例化它。
我有一个 table,其中 table 的每一行都包含状态(寄存器)。有选择一个特定行的逻辑。只有一行接收到 "selected" 信号。然后访问所选行的状态。要么将状态的一部分作为输出连接到模块的 IO,要么将 IO 的一部分用作输入以更新状态。
如果我用电路实现它,我会使用传输门。 selected 信号将打开一组传输门,它将行的寄存器连接到总线。然后总线将连接到 IO 束。这是快速、小面积和低能量。
在 Chisel 中有一种直接的实现方法。它将 selected 行编码为二进制数,然后将该数字应用于传统多路复用器的 select 输入。不幸的是,对于具有 20 到 50 行和数百位状态的 table,此实现可能非常缓慢,并且浪费空间和能量。
问题分为两部分: 1) 有没有办法在 Chisel 中指定总线,这样你的通行门或传统的三态驱动程序都挂在总线上?
2) 如果做不到这一点,在 Chisel 中是否有快速、小面积、低能量的方法?
谢谢
1) Chisel 不完全支持双向线,但通过实验性模拟类型 (see example),您至少可以通过您的 Chisel 代码在 Verilog 黑盒之间缝合总线。
2) 您是否尝试过 Mux1H in chisel3.util? It emits essentially a sum of products of the inputs and their corresponding select bits. I'm not sure how this compares to your proposed implementation. I would love to see a QOR comparison. If this construct is not sufficient and you cannot express precisely what you want in chisel, you can use a parameterized BlackBox 实现您的 one-hot mux 并根据需要实例化它。