【问题标题】:How to dynamically index into a register using another register in Chisel如何使用 Chisel 中的另一个寄存器动态索引到寄存器
【发布时间】:2021-05-22 14:21:00
【问题描述】:

我正在为我被告知的一种漏斗移位器编写 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) ^编译失败

谢谢

【问题讨论】:

    标签: scala queue fifo chisel


    【解决方案1】:

    Jack Koening 给了我一个response 类似问题some years ago

    您可以动态移位和位提取结果:

               io.data_out := (buffer >> buffer_rp)(out_word_size - 1, 0)
    

    【讨论】:

    • 感谢上述解决方案可以从缓冲区读取而无需环绕。我还有两个需要处理的案例。我还需要处理环绕,缓冲区一端/来自另一端的一些位和另一端/来自另一端的剩余位。此外,我需要在不同位置动态写入缓冲区。你知道处理这些的正确方法是什么吗?谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-19
    • 1970-01-01
    • 2016-10-28
    • 1970-01-01
    相关资源
    最近更新 更多