chisel icon indicating copy to clipboard operation
chisel copied to clipboard

OneHotEnum: a ChiselEnum with one-hot encoding

Open kammoh opened this issue 2 months ago • 3 comments

Synthesis tools usually can infer the optimal encoding for a finite state machine (FSM) described in SystemVerilog or VHDL. However, this does not seem to be the case for the SV generated by Chisel/firtool. In certain designs, especially with a larger state, the state equality checks can increase the critical path delay.

This PR adds a new ChiselEnum subclass named OneHotEnum with explicit one-hot encoding and optimized value checks (a new.is and also the existing .isOneOf).

Contributor Checklist

  • [x] Did you add Scaladoc to every public function/method?
  • [x] Did you add at least one test demonstrating the PR?
  • [x] Did you delete any extraneous printlns/debugging code?
  • [x] Did you specify the type of improvement?
  • [ ] Did you add appropriate documentation in docs/src?
  • [x] Did you request a desired merge strategy?
  • [ ] Did you add text to be included in the Release Notes for this change?

Type of Improvement

  • Feature (or new API)

Desired Merge Strategy

  • Squash: The PR will be squashed and merged (choose this if you have no preference).

Release Notes

Reviewer Checklist (only modified by reviewer)

  • [ ] Did you add the appropriate labels? (Select the most appropriate one based on the "Type of Improvement")
  • [ ] Did you mark the proper milestone (Bug fix: 3.6.x, 5.x, or 6.x depending on impact, API modification or big change: 7.0)?
  • [ ] Did you review?
  • [ ] Did you check whether all relevant Contributor checkboxes have been checked?
  • [ ] Did you do one of the following when ready to merge:
    • [ ] Squash: You/ the contributor Enable auto-merge (squash) and clean up the commit message.
    • [ ] Merge: Ensure that contributor has cleaned up their commit history, then merge with Create a merge commit.

kammoh avatar Oct 01 '25 17:10 kammoh

Binary incompatibility is due to the change in isOneOf signature. isOneOf is moved to Type and now expects the same Type as arguments. I think this is definitely better, but I'm open to rolling back to EnumType if that's desired (and also actually solves the issue).

kammoh avatar Oct 01 '25 18:10 kammoh

I've implemented a similar feature here a long time ago: https://github.com/chipsalliance/chisel/pull/2261 Maybe can be useful.

carlosedp avatar Oct 13 '25 17:10 carlosedp

I've implemented a similar feature here a long time ago: #2261 Maybe can be useful.

Hi Carlos, Sorry I should have searched through the PRs before submitting. Your PR looks great. I like the ChiselEnum1H naming too.

This is certainly very useful feature and, from my own experience, it can help with the timing of many designs. I wonder if we can get some feedback from @jackkoenig, @seldridge, and @sequencer.

kammoh avatar Oct 13 '25 19:10 kammoh