Chisel实现循环左移组合逻辑时无法生成Verilog问题求助
无法生成Verilog的根因
核心问题是动态移位操作的移位量位宽不符合转换规则:
你待移位的io.a是32位UInt,动态移位的移位量最多只需要5位(2^5=32,刚好覆盖0~31所有合法移位次数),但你代码中用到的两个移位量io.b、32.U(32.W) - io.b都是32位宽,FIRRTL编译转Verilog时会因为移位量位宽非法报错,你贴的日志中[error] at后面是截断的完整报错信息,实际就会指向移位量位宽的问题。
修复方案
方案1:适配现有手写逻辑的修改
手动把移位量截断到低5位(循环移位本身就只需要移位量模32的结果,取低5位完全符合功能需求):
// src/main/scala/ALU.scala package cpu import chisel3._ class ALU extends RawModule { val io = IO(new Bundle { val a = Input(UInt(32.W)) val b = Input(UInt(32.W)) val out = Output(UInt(32.W)) }) // 取移位量低5位,同时把32的位宽改成5位 val shamt = io.b(4, 0) io.out := (io.a << shamt) | (io.a >> (32.U(5.W) - shamt)) }
方案2:使用Chisel内置方法(更简洁稳妥)
Chisel的UInt类型已经原生提供了循环移位接口,不需要手动拼接移位结果,自动处理位宽适配问题:
io.out := io.a.rotateLeft(io.b)
修改后重新执行sbt命令:test:runMain test.testCPU -td generated,即可正常生成Verilog文件。
内容的提问来源于stack exchange,提问作者K.M.T
相关产品推荐
相关产品推荐

