Skip to content

Commit a71e160

Browse files
committed
[SeqToSV] Initialize buried preset registers using XMRs
1 parent 4d3dfb7 commit a71e160

File tree

2 files changed

+35
-1
lines changed

2 files changed

+35
-1
lines changed

lib/Conversion/SeqToSV/FirRegLowering.cpp

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -357,6 +357,8 @@ void FirRegLowering::createRandomInitialization(ImplicitLocOpBuilder &builder) {
357357

358358
void FirRegLowering::createPresetInitialization(ImplicitLocOpBuilder &builder) {
359359
for (auto &svReg : presetInitRegs) {
360+
OpBuilder::InsertionGuard guard(builder);
361+
360362
auto loc = svReg.reg.getLoc();
361363
auto elemTy = svReg.reg.getType().getElementType();
362364
auto cst = getOrCreateConstant(loc, svReg.preset.getValue());
@@ -367,7 +369,13 @@ void FirRegLowering::createPresetInitialization(ImplicitLocOpBuilder &builder) {
367369
else
368370
rhs = hw::BitcastOp::create(builder, loc, elemTy, cst);
369371

370-
sv::BPAssignOp::create(builder, loc, svReg.reg, rhs);
372+
buildRegConditions(builder, svReg.reg);
373+
Value target = svReg.reg;
374+
if (svReg.path)
375+
target = buildXMRTo(builder, svReg.path, svReg.reg.getLoc(),
376+
svReg.reg.getType());
377+
378+
sv::BPAssignOp::create(builder, loc, target, rhs);
371379
}
372380
}
373381

test/Dialect/Seq/firreg.mlir

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1043,3 +1043,29 @@ hw.module @AsyncResetRegUnderIfdef(in %clock : !seq.clock, in %reset : i1, in %v
10431043
// CHECK: }
10441044
hw.output
10451045
}
1046+
1047+
// Test for registers with "preset".
1048+
1049+
// CHECK: hw.hierpath @[[reg_path:.+]] [@PresetRegUnderIfdef::@reg]
1050+
hw.module @PresetRegUnderIfdef(in %clock : !seq.clock, in %value : i1) {
1051+
%c = hw.constant 0 : i1
1052+
1053+
// CHECK: sv.ifdef @MyMacro {
1054+
// CHECK: %reg = sv.reg sym @reg : !hw.inout<i1>
1055+
// CHECK: %0 = sv.read_inout %reg : !hw.inout<i1>
1056+
// CHECK: sv.always posedge %clock {
1057+
// CHECK: sv.passign %reg, %value : i1
1058+
// CHECK: }
1059+
// CHECK: }
1060+
sv.ifdef @MyMacro {
1061+
%reg = seq.firreg %value clock %clock preset 0: i1
1062+
}
1063+
1064+
// CHECK: sv.initial {
1065+
// CHECK: sv.ifdef.procedural @MyMacro {
1066+
// CHECK: %0 = sv.xmr.ref @[[reg_path]] : !hw.inout<i1>
1067+
// CHECK: sv.bpassign %0, %false : i1
1068+
// CHECK: }
1069+
// CHECK: }
1070+
hw.output
1071+
}

0 commit comments

Comments
 (0)