如何使用 uint 进行位提取

How to use uint to do bit extraction

我定义了几个varabiales,包括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) << 4.U)-1.U , (addra << 4.U) + 8.U)"

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

如果我没理解错的话,您似乎在尝试 select 位的动态范围。我不认为你可以在 Verilog 中使用普通位提取来做这样的动态 selections(甚至 selected 范围的宽度也是动态的),所以我怀疑方法是相同的(你能用 VHDL 表达这个吗?)。

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

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