Skip to content

Emitted SV uses variable before declaration #7405

Open
@dtzSiFive

Description

Consider:

hw.module @hoist_reg(in %dummy : i32, in %dummy2 : i32, out out : i17) {
  %res_reg = sv.reg : !hw.inout<i17>
  sv.initial {
    %tmp = sv.reg init %dummy : !hw.inout<i32>
    %17 = sv.read_inout %tmp : !hw.inout<i32>
    %29 = comb.xor %dummy2, %17 : i32
    %32 = comb.extract %29 from 3 : (i32) -> i17
    sv.passign %res_reg, %32 : i17
  }

  %res_reg_data = sv.read_inout %res_reg : !hw.inout<i17>
  hw.output %res_reg_data : i17
}

Running through firtool produces:

// Generated by CIRCT firtool-1.79.0g20240729_759ef12
module hoist_reg(	// def-use.mlir:1:1
  input  [31:0] dummy,	// def-use.mlir:1:25
                dummy2,	// def-use.mlir:1:42
  output [16:0] out	// def-use.mlir:1:61
);

  reg [16:0] res_reg;	// def-use.mlir:2:14
  initial begin	// def-use.mlir:3:3
    automatic logic [31:0] _GEN = dummy2 ^ tmp;	// def-use.mlir:5:11, :6:11
    reg             [31:0] tmp = dummy;	// def-use.mlir:4:12
    res_reg <= _GEN[19:3];	// def-use.mlir:6:11, :7:11, :8:5
  end // initial
  assign out = res_reg;	// def-use.mlir:11:19, :12:3
endmodule

Notice _GEN uses tmp before it's declared.
This is treated as an error by default in some tools, such as slang and VCS.

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions