如何在 Chisel 中使用另一个寄存器动态索引到一个寄存器

2024-07-04

我正在为我被告知的一种漏斗移位器编写 Chisel 代码。 基本上,它获取大小为 m 位的输入并发送大小为 n 位的输出,其中 m 和 n 可以有任何关系,也可以没有关系。

我将 m 位字保存在缓冲区中,然后需要动态索引到缓冲区中以获取 n 位。同样,对于写入,我必须在 n 而不是 m 的边界处写入,以免出现碎片。为此,我使用 read_pointer 和 write_pointer 寄存器。并且需要使用指针作为索引从缓冲区中选择位。

但是 Chisel 不允许我使用一个寄存器作为另一个寄存器的索引值。我怎样才能做到这一点 ?代码如下 -

   when (io.pull && !(io.empty))
   {
       when ((buffer_rp +& out_word_size.U) <= (buffer_size-1).U ) // No wraparound
       {
           io.data_out := buffer (buffer_rp + (out_word_size - 1).U, buffer_rp)
       }
       .otherwise // Wraparound
       {
        
       }
   }

我收到的错误消息是 -

cmd24.sc:87:重载方法值适用于替代方案: (x: BigInt,y: BigInt)chisel3.UInt (x: Int,y: Int)chisel3.UInt 不能应用于(chisel3.UInt、chisel3.UInt) io.data_out := 缓冲区 (buffer_rp + (out_word_size - 1).U, buffer_rp) ^编译失败

Thanks


杰克·科尼格 https://stackoverflow.com/users/2483329/jack-koenig给了我一个response https://stackoverflow.com/a/59001903/4422957对于类似的问题几年前 https://stackoverflow.com/questions/58995390/how-to-split-an-uint-into-a-vec-of-uint-to-do-subword-extraction-and-assignmen.

您可以动态移位并对结果进行位提取:

           io.data_out := (buffer >> buffer_rp)(out_word_size - 1, 0)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 Chisel 中使用另一个寄存器动态索引到一个寄存器 的相关文章

随机推荐