Environment quartusii8.1
In the logic of combination, the statements that are easy to combine the latches are If and case. In fact, as long as the pair uses if... else; In case, using default can basically avoid latches;
Case1 (with latches ):
Module mux_latch
(
Input [3: 0] data,
Input [1:0] valid,
Input flag,
Output Reg valid_data
);
Always @(*)
Begin
If (valid = 2 'd0) valid_data = data [3];
If (valid = 2 'd1) valid_data = data [2];
If (valid = 2 'd2) valid_data = data [1];
If (valid = 2 'd3) valid_data = data [0];
End
Endmodule
//---------------------------------------------------------
Case 2 solution 1: pairing else with if
Always @(*)
Begin
If (valid = 2 'd0) valid_data = data [3]; else
If (valid = 2 'd1) valid_data = data [2]; else
If (valid = 2 'd2) valid_data = data [1]; else
If (valid = 2 'd3) valid_data = data [0]; else
Valid_data = 1' B0;
End
//-----------------------------------------------------------
Case3 solution 2: assign an initial value
Always @(*)
Begin
Valid_data = 1' B0
If (valid = 2 'd0) valid_data = data [3];
If (valid = 2 'd1) valid_data = data [2];
If (valid = 2 'd2) valid_data = data [1];
If (valid = 2 'd3) valid_data = data [0];
End
//----------------------------------------------------------
Case 4 (with latches)
Always @(*)
Begin
Case (valid)
2 'b00: Begin if (FLAG) valid_data = data [0]; End
2 'b01: Begin if (FLAG) valid_data = data [1]; End
2 'b10: Begin if (FLAG) valid_data = data [2]; End
2 'b11: Begin if (FLAG) valid_data = data [3]; End
Endcase
//-------------------------------------------------------------
Case 5 (with latches)
Always @(*)
Begin
Case (valid)
2 'b00: Begin if (FLAG) valid_data = data [0]; End
2 'b01: Begin if (FLAG) valid_data = data [1]; End
2 'b10: Begin if (FLAG) valid_data = data [2]; End
2 'b11: Begin if (FLAG) valid_data = data [3]; End
Default: valid_data = 1 'b0;
Endcase
End
//--------------------------------------------------------------
Case 6 solution --- assign an initial value
Always @(*)
Begin
Valid_data = 1' B0;
Case (valid)
2 'b00: Begin if (FLAG) valid_data = data [0]; End
2 'b01: Begin if (FLAG) valid_data = data [1]; End
2 'b10: Begin if (FLAG) valid_data = data [2]; End
2 'b11: Begin if (FLAG) valid_data = data [3]; End
Endcase
End
//----------------------------------------------------------------
Case7 solution -- add else
always @ (*)
begin
case (valid)
2 'b00: Begin if (FLAG) valid_data = data [0]; else valid_data = 1' B0; end
2' B01: Begin if (FLAG) valid_data = data [1]; else valid_data = 1' B0; end
2' B10: Begin if (FLAG) valid_data = data [2]; else valid_data = 1' B0; end
2' B11: Begin if (FLAG) valid_data = data [3]; else valid_data = 1' B0; end
endcase
end