我正在为我被告知的一种漏斗移位器编写 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(使用前将#替换为@)