From 042be4b2d8a846d12c5c5dfd64f10b5caee93125 Mon Sep 17 00:00:00 2001 From: mergify[bot] Date: Wed, 19 Jan 2022 01:41:59 +0000 Subject: util: add GrayCode (#2353) (#2354) (cherry picked from commit 91d7baa8e7162d736f46b6d4964b09016d2dd172) Co-authored-by: Kevin Laeufer --- .../scala/chiselTests/util/GrayCodeTests.scala | 42 ++++++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 integration-tests/src/test/scala/chiselTests/util/GrayCodeTests.scala (limited to 'integration-tests/src') 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) +} -- cgit v1.2.3