Skip to content

Commit 218c185

Browse files
authored
[HWMemSimImpl] Avoid generation of 0 bit Value (#8393)
Ensure that 1 bit constant zero is generated instead of zero bit value from a comb.extract. This fixes a bug when the memory data is 1 bit wide.
1 parent 091f5a4 commit 218c185

File tree

2 files changed

+43
-2
lines changed

2 files changed

+43
-2
lines changed

Diff for: lib/Dialect/Seq/Transforms/HWMemSimImpl.cpp

+7-2
Original file line numberDiff line numberDiff line change
@@ -613,8 +613,13 @@ void HWMemSimImpl::generateMemory(HWModuleOp op, FirMemory mem) {
613613
"j", [&](BlockArgument innerIndVar) {
614614
auto rhs = b.create<sv::MacroRefExprSEOp>(
615615
b.getIntegerType(randomWidth), "RANDOM");
616-
auto truncInnerIndVar = b.createOrFold<comb::ExtractOp>(
617-
innerIndVar, 0, llvm::Log2_64_Ceil(mem.dataWidth));
616+
Value truncInnerIndVar;
617+
if (mem.dataWidth <= 1)
618+
truncInnerIndVar =
619+
b.create<hw::ConstantOp>(b.getI1Type(), 0);
620+
else
621+
truncInnerIndVar = b.createOrFold<comb::ExtractOp>(
622+
innerIndVar, 0, llvm::Log2_64_Ceil(mem.dataWidth));
618623
auto lhs = b.create<sv::IndexedPartSelectInOutOp>(
619624
randomMemReg, truncInnerIndVar, randomWidth, false);
620625
b.create<sv::BPAssignOp>(lhs, rhs);

Diff for: test/Dialect/Seq/hw-memsim.mlir

+36
Original file line numberDiff line numberDiff line change
@@ -472,3 +472,39 @@ hw.module.generated @TestFragment, @FIRRTLMem(
472472

473473
// CHECK-LABEL: hw.module private @TestFragment
474474
// CHECK-SAME: emit.fragments = [@Fragment]
475+
476+
// Test an i1 memory.
477+
hw.module.generated @ram_2x1, @FIRRTLMem(
478+
in %R0_addr : i1,
479+
in %R0_en : i1,
480+
in %R0_clk : i1,
481+
out R0_data : i1,
482+
in %W0_addr : i1,
483+
in %W0_en : i1,
484+
in %W0_clk : i1,
485+
in %W0_data : i1
486+
) attributes {
487+
depth = 2 : i64,
488+
initFilename = "",
489+
initIsBinary = false,
490+
initIsInline = false,
491+
maskGran = 1 : ui32,
492+
numReadPorts = 1 : ui32,
493+
numReadWritePorts = 0 : ui32,
494+
numWritePorts = 1 : ui32,
495+
readLatency = 0 : ui32,
496+
readUnderWrite = 0 : i32,
497+
width = 1 : ui32,
498+
writeClockIDs = [0 : i32],
499+
writeLatency = 1 : ui32,
500+
writeUnderWrite = 1 : i32}
501+
502+
// CHECK-LABEL: hw.module private @ram_2x1
503+
// CHECK: %[[c0_i6:.+]] = hw.constant 0 : i6
504+
// CHECK-NEXT: %[[c_32_i6:.+]] = hw.constant -32 : i6
505+
// CHECK-NEXT: %[[c_32_i6_0:.+]] = hw.constant -32 : i6
506+
// CHECK-NEXT: sv.for %[[J:.+]] = %[[c0_i6]] to %[[c_32_i6]] step %[[c_32_i6_0]] : i6 {
507+
// CHECK-NEXT: %[[RANDOM:.+]] = sv.macro.ref.expr.se @RANDOM() : () -> i32
508+
// CHECK-NEXT: %false = hw.constant false
509+
// CHECK-NEXT: %[[V7:.+]] = sv.indexed_part_select_inout %_RANDOM_MEM[%false : 32] : !hw.inout<i32>, i1
510+
// CHECK-NEXT: sv.bpassign %[[V7]], %RANDOM : i32

0 commit comments

Comments
 (0)