Skip to main content

Troubleshooting

This page is a starting point for recording common and not so common problems in developing with Chisel3. In particular, those situations where there is a work around that will keep you going.

type mismatch specifying width/value of a UInt/SInt

I have some old code that used to work correctly in chisel2 (and still does if I use the import Chisel._ compatibility layer) but causes a type mismatch error in straight chisel3:

class TestBlock extends Module {
val io = IO(new Bundle {
val output = Output(UInt(width=3))
})
}

produces

type mismatch;
[error] found : Int(3)
[error] required: chisel3.internal.firrtl.Width
[error] val output = Output(UInt(width=3))

The single argument, multi-function object/constructors from chisel2 have been removed from chisel3. It was felt these were too prone to error and made it difficult to diagnose error conditions in chisel3 code.

In chisel3, the single argument to the UInt/SInt object/constructor specifies the width and must be a Width type. Although there are no automatic conversions from Int to Width, an Int may be converted to a Width by applying the W method to an Int. In chisel3, the above code becomes:

import chisel3._

class TestBlock extends Module {
val io = IO(new Bundle {
val output = Output(UInt(3.W))
})
}

UInt/SInt literals may be created from an Int with the application of either the U or S method.

UInt(42)
// error: type mismatch;
// found : Int(42)
// required: chisel3.Width
// UInt(42)
// ^^

in chisel2, becomes

42.U

in chisel3

A literal with a specific width is created by calling the U or S method with a W argument. Use:

1.S(8.W)

to create an 8-bit wide (signed) literal with value 1.