- 
                Notifications
    You must be signed in to change notification settings 
- Fork 384
Open
Labels
Description
Input test case:
module bug (
    input logic wr_clk,
    input logic wr_data,
    output logic [1:0] mem
);
`ifdef CASE_1
  always_ff @(posedge (wr_clk)) begin
      mem[0] <= wr_data;
  end
  always_ff @(posedge (wr_clk)) begin
      mem[1] <= wr_data;
  end
`else
  always_ff @(posedge (wr_clk)) begin
      mem[0] <= wr_data;
      mem[1] <= wr_data;
  end
`endif
endmodulethe two results in different outputs
module {
  hw.module @bug(in %wr_clk : i1 loc(#loc2), in %wr_data : i1 loc(#loc3), out mem : i2) {
    %0 = comb.replicate %wr_data : (i1) -> i2 loc(#loc4)
    %1 = seq.to_clock %wr_clk loc(#loc5)
    %mem = seq.firreg %0 clock %1 : i2 loc(#loc5)
    hw.output %mem : i2 loc(#loc1)
  } loc(#loc1)
} loc(#loc)vs
module {
  hw.module @bug(in %wr_clk : i1 loc(#loc2), in %wr_data : i1 loc(#loc3), out mem : i2) {
    %0 = llhd.constant_time <0ns, 0d, 1e> loc(#loc2)
    %c0_i2 = hw.constant 0 : i2 loc(#loc4)
    %mem = llhd.sig %c0_i2 : i2 loc(#loc4)
    %1 = comb.extract %6 from 1 : (i2) -> i1 loc(#loc5)
    %2 = comb.concat %1, %wr_data : i1, i1 loc(#loc5)
    %3 = seq.to_clock %wr_clk loc(#loc4)
    %mem_0 = seq.firreg %2 clock %3 {name = "mem"} : i2 loc(#loc4)
    llhd.drv %mem, %mem_0 after %0 : !hw.inout<i2> loc(#loc4)
    %4 = comb.extract %6 from 0 : (i2) -> i1 loc(#loc6)
    %5 = comb.concat %wr_data, %4 : i1, i1 loc(#loc6)
    %mem_1 = seq.firreg %5 clock %3 {name = "mem"} : i2 loc(#loc4)
    llhd.drv %mem, %mem_1 after %0 : !hw.inout<i2> loc(#loc4)
    %6 = llhd.prb %mem : !hw.inout<i2> loc(#loc4)
    hw.output %6 : i2 loc(#loc1)
  } loc(#loc1)
} loc(#loc)(splitting the mem output into 2 separate outputs also result in same output with and without def).