Chisel中Cat拼接操作能否用于赋值左侧?报错咨询
Chisel中Cat操作的使用限制及加法功能的正确实现
核心结论
Chisel里的Cat操作只能放在赋值符号右侧,绝对不能像Verilog那样把它当左值用。这是因为Cat返回的是一个只读的硬件节点(也就是报错里的OpResult),没法被重新赋值,这就是你触发错误的直接原因。
对应Verilog加法的正确Chisel实现
针对你要实现的{Carry,Result} = A + t_no_Cin + Cin逻辑,有两种常用的正确写法:
写法1:直接拆分加法结果的高低位
假设参与运算的信号位宽为N,加法结果会是N+1位,直接提取最高位作为进位,剩余低位作为运算结果:
val sum = io.din1 + t_no_cin + op_ctrl1 io.carry := sum.head(1) // 取最高位作为进位输出 result_temp := sum.tail(sum.getWidth - 1) // 取剩余低位作为运算结果
写法2:通过Wire暂存后索引取值
先把加法结果存到一个Wire中,再通过位索引分别赋值给进位和结果信号:
// 定义位宽为输入位宽+1的Wire来存带进位的加法结果 val sumWire = Wire(UInt((io.din1.getWidth + 1).W)) sumWire := io.din1 + t_no_cin + op_ctrl1 io.carry := sumWire(io.din1.getWidth) // 直接取最高位作为进位 result_temp := sumWire(io.din1.getWidth - 1, 0) // 取低位区间作为运算结果
报错原因细节
你写的Cat(io.carry, result_temp) := ...本质上是试图对io.carry和result_temp拼接出来的只读硬件节点赋值,而Chisel的硬件模型里,这种拼接出来的节点是只读的,不允许被重新赋值,所以才会抛出Cannot reassign to read-only的异常。这和Verilog中直接把位拼接作为左值的语法逻辑完全不同。
内容的提问来源于stack exchange,提问作者T.H Zhao
相关产品推荐
相关产品推荐

