Skip to content

Commit 68bd267

Browse files
[Verif] Always add clock trigger to HasBeenReset process (#9212)
Always add a `posedge clock` trigger to the always process created for `verif.has_been_reset` operations, even if the reset is asynchronous. Until now we would emit an `always @(posedge reset)` process, which some EDA tools do not process properly. With this commit, we produce `always @(posedge clock, posedge reset)` for asynchronous HBR ops, and `always @(posedge clock)` for synchronous HBR ops.
1 parent 91872b2 commit 68bd267

File tree

2 files changed

+15
-13
lines changed

2 files changed

+15
-13
lines changed

lib/Conversion/VerifToSV/VerifToSV.cpp

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -100,17 +100,17 @@ struct HasBeenResetConversion : public OpConversionPattern<HasBeenResetOp> {
100100
// Create the `always` block that sets the register to 1 as soon as the
101101
// reset is initiated. For async resets this happens at the reset's posedge;
102102
// for sync resets this happens on the clock's posedge if the reset is set.
103-
Value triggerOn = op.getAsync() ? reset : clock;
104-
sv::AlwaysOp::create(
105-
rewriter, op.getLoc(), sv::EventControl::AtPosEdge, triggerOn, [&] {
106-
auto assignOne = [&] {
107-
sv::PAssignOp::create(rewriter, op.getLoc(), reg, constOne);
108-
};
109-
if (op.getAsync())
110-
assignOne();
111-
else
112-
sv::IfOp::create(rewriter, op.getLoc(), reset, assignOne);
113-
});
103+
SmallVector<sv::EventControl, 2> eventControl{sv::EventControl::AtPosEdge};
104+
SmallVector<Value, 2> triggerOn{clock};
105+
if (op.getAsync()) {
106+
eventControl.push_back(sv::EventControl::AtPosEdge);
107+
triggerOn.push_back(reset);
108+
}
109+
sv::AlwaysOp::create(rewriter, op.getLoc(), eventControl, triggerOn, [&] {
110+
sv::IfOp::create(rewriter, op.getLoc(), reset, [&] {
111+
sv::PAssignOp::create(rewriter, op.getLoc(), reg, constOne);
112+
});
113+
});
114114

115115
// Derive the actual result value:
116116
// hasBeenReset = (hasBeenResetReg === 1) && (reset === 0);

test/Conversion/VerifToSV/verif-to-sv.mlir

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,10 @@ hw.module @HasBeenResetAsync(in %clock: i1, in %reset: i1, out out: i1) {
1515
// CHECK-NEXT: }
1616
// CHECK-NEXT: }
1717

18-
// CHECK-NEXT: sv.always posedge %reset {
19-
// CHECK-NEXT: sv.passign %hasBeenResetReg, %true : i1
18+
// CHECK-NEXT: sv.always posedge %clock, posedge %reset {
19+
// CHECK-NEXT: sv.if %reset {
20+
// CHECK-NEXT: sv.passign %hasBeenResetReg, %true : i1
21+
// CHECK-NEXT: }
2022
// CHECK-NEXT: }
2123

2224
// CHECK-NEXT: [[REG:%.+]] = sv.read_inout %hasBeenResetReg

0 commit comments

Comments
 (0)