在组合逻辑中,容易综合出锁存器的语句是if和case,其实只要配对使用if...else;case用default就基本上可以避免锁存器;
case1(有锁存器):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]; endendmodule//---------------------------------------------------------case 2解决办法1:加else与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解决办法2:赋初始值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(有锁存器)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(有锁存器)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; endcaseend//--------------------------------------------------------------case 6解决办法---赋初始值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 endcaseend//----------------------------------------------------------------case7解决办法-- 加elsealways @ (*)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 endcaseend