-
Notifications
You must be signed in to change notification settings - Fork 382
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
endmodule
the 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).