【问题标题】:How to use uint to do bit extraction如何使用 uint 进行位提取
【发布时间】:2025-11-28 03:15:01
【问题描述】:

我定义了几个变量,包括 post_addra、h_rdata 和 addra。

val post_addra=RegInit(0.U)
val addra=RegInit(0.U)
val h_rdata=RegInit(0.U)

因为 post_addra 是由 h_rdata 和 addra 决定的。所以我写了这段代码。

post_addra := h_rdata(((addra+1.U) << 4.U)-1.U , (addra << 4.U) + 8.U)

但是我得到了一个错误。

"[错误] (x: BigInt,y: BigInt)chisel3.core.UInt

[错误] (x: Int,y: Int)chisel3.core.UInt

[错误] 不能应用于 (chisel3.core.UInt, chisel3.core.UInt)

[错误] post_addra := h_rdata(((addra+1.U)

Chisel 不支持使用 uint 提取。我该怎么办。

【问题讨论】:

    标签: scala chisel


    【解决方案1】:

    如果我理解正确,您似乎正在尝试选择动态范围的位。我不认为你可以使用 Verilog 中的普通位提取来进行这样的动态选择(即使所选范围的宽度也是动态的),所以我怀疑方法是一样的(你能用 VHDL 表达吗?)。

    无论如何,位提取与右移和掩码同构,因此这是解决此问题的一种方法。您可以通过下限动态右移,然后根据上下限之间的差异构造正确宽度的掩码:

    val lower = (addra << 4.U) + 8.U
    val upper = ((addra + 1.U) << 4.U) - 1.U
    val mask = (1.U << (upper - lower)) - 1.U
    post_addra := (h_rdata >> lower) & mask
    

    【讨论】: