例子:
reg [DATA_WIDTH-1:0] data_dly [SHIFT_NUM-1:0];
reg [SHIFT_NUM-1:0] data_dly_v;
always @(posedge clk) begin : l
integer i;
if(~rst_n)
for(i=0; i<SHIFT_NUM; i=i+1) begin
data_dly[i] <= 'd0;
data_dly_v[i] <= 1'b0;
end
else if(idata_v) begin // this line has problem
// else begin
data_dly[0] <= idata;
data_dly_v[0] <= idata_v;
for(i=0; i<SHIFT_NUM-1; i=i+1) begin
data_dly[i+1] <= data_dly[i];
data_dly_v[i+1] <= data_dly_v[i];
end
end
如上代码,想要的效果为做输入idata的delay,输出为idata/idata_v做相应的delay后的结果。
而实际上由于注释有问题一行的valid使能,使得输入idata_v的下降沿无法传递给data_dly_v,因而实际效果是:data_dly_v能捕捉到idata_v的上升沿并做delay,但下降沿无法捕捉,从而data_dly_v在idata_v下降后仍然一直为高。
正确写法为下一行注释的代码,正确的行为是既要捕捉到idata_v的上升沿又要捕捉到下降沿,所以在else的分支上的data_dly_v的代码无条件执行,而不需要idata_v有效。