`timescale 1ns/1ns

module data_cal(
input clk,
input rst,
input [15:0]d,
input [1:0]sel,

output reg [4:0]out,
output reg validout
);
//*************code***********//
reg [15:0]datain;
always@(posedge clk or negedge rst)
if(!rst)
    datain <= 16'd0;
else if(sel == 2'd0)
    datain <= d;

always@(*)
if(!rst)
    out = 5'b0;
else case(sel)
2'd0:
out = 5'b0;
2'd1:
out = datain[3:0] + datain[7:4];
2'd2:
out = datain[3:0] + datain[11:8];
3'd3:
out = datain[3:0] + datain[15:12];
default:
out = 5'b0;
endcase
always@(*)
if(!rst)
    validout = 0 ;
else if(sel == 2'b0)
    validout = 0 ;
else 
    validout = 1 ;
//*************code***********//
endmodule

这个题有两个关键地方。

1, sel == 2‘d0 的时候,输入才有效。所以在sel ==2’d0 的时候才锁存输入。

2,从波形上面来看,这里应该用组合逻辑来实现。不应该用时序逻辑。