diff options
| author | mergify[bot] | 2022-01-19 01:41:59 +0000 |
|---|---|---|
| committer | GitHub | 2022-01-19 01:41:59 +0000 |
| commit | 042be4b2d8a846d12c5c5dfd64f10b5caee93125 (patch) | |
| tree | 2382fbd3f514acd90a08470642ef30d5d3c70f9b /integration-tests/src/test | |
| parent | bf0f0d8545747c4aa1e5e2abe4e27e339006f86f (diff) | |
util: add GrayCode (#2353) (#2354)
(cherry picked from commit 91d7baa8e7162d736f46b6d4964b09016d2dd172)
Co-authored-by: Kevin Laeufer <laeufer@cs.berkeley.edu>
Diffstat (limited to 'integration-tests/src/test')
| -rw-r--r-- | integration-tests/src/test/scala/chiselTests/util/GrayCodeTests.scala | 42 |
1 files changed, 42 insertions, 0 deletions
diff --git a/integration-tests/src/test/scala/chiselTests/util/GrayCodeTests.scala b/integration-tests/src/test/scala/chiselTests/util/GrayCodeTests.scala new file mode 100644 index 00000000..9562abb4 --- /dev/null +++ b/integration-tests/src/test/scala/chiselTests/util/GrayCodeTests.scala @@ -0,0 +1,42 @@ +// SPDX-License-Identifier: Apache-2.0 + +package chiselTests.util + +import chisel3._ +import chisel3.util._ +import chiseltest._ +import chiseltest.formal._ +import org.scalatest.flatspec.AnyFlatSpec + +class GrayCodeTests extends AnyFlatSpec with ChiselScalatestTester with Formal { + behavior.of("GrayCode") + + val Widths = Seq(1, 2, 3, 5, 8, 17, 65) + Widths.foreach { w => + it should s"maintain identity (width=$w)" in { + verify(new GrayCodeIdentityCheck(w), Seq(BoundedCheck(1))) + } + + it should s"ensure hamming distance of one (width=$w)" in { + verify(new GrayCodeHammingCheck(w), Seq(BoundedCheck(1))) + } + } +} + +/** Checks that when we go from binary -> gray -> binary the result is always the same as the input. */ +private class GrayCodeIdentityCheck(width: Int) extends Module { + val in = IO(Input(UInt(width.W))) + val gray = BinaryToGray(in) + val out = GrayToBinary(gray) + assert(in === out, "%b -> %b -> %b", in, gray, out) +} + +/** Checks that if we increment the binary number, the gray code equivalent only changes by one bit. */ +private class GrayCodeHammingCheck(width: Int) extends Module { + val a = IO(Input(UInt(width.W))) + val b = a + 1.U + val aGray = BinaryToGray(a) + val bGray = BinaryToGray(b) + val hamming = PopCount(aGray ^ bGray) + assert(hamming === 1.U, "%b ^ %b = %b", aGray, bGray, hamming) +} |
