Question

I have the following code

module POLY(CLK,RESET_n,IN_VALID,IN,OUT_VALID,OUT);

input         CLK,RESET_n,IN_VALID;
input  [ 3:0] IN;
output        OUT_VALID;
output [12:0] OUT;

reg        OUT_VALID;
reg [12:0] OUT;

reg        OUT_VALID_w;
reg [12:0] OUT_w;

reg [ 1:0] COUNT_IN, COUNT_IN_w;
reg [ 2:0] COUNT_DO, COUNT_DO_w;

always @(posedge CLK or negedge RESET_n)
begin
    if(!RESET_n)
    begin
        COUNT_IN <= 2'd0;
        COUNT_DO <= 3'd0;
    end
    else
    begin
        COUNT_IN <= COUNT_IN_w;
        COUNT_DO <= COUNT_DO_w;
    end
end


always @(*)
begin
    if(IN_VALID == 1'b0)
    begin
        if(COUNT_DO == 3'd7)
        begin
            COUNT_DO_w = COUNT_DO;
        end
        else
        begin
            COUNT_DO_w = COUNT_DO + 1'b1;
        end
    end
    else
    begin
        COUNT_DO_w = 3'd0;
    end
end

I want to ask is that why COUNT_DO doesn't jump to 1 in 14ns?

I think that due to the sensitive list in the second always block is COUNT_DO and IN_VALID, so at start, the reset signal trigger first always block and set the COUNT_DO = 0, which change the COUNT_DO value from high impedence to 0. So, it triggers the second always block COUNT_DO_w = 0 + 1 = 1. And , in the next postive edge clock, which trigger the first always block to do COUNT_DO <= COUNT_DO_w. But it seems to delay one clock to assign it(22ns). I have tried to figure it out but still cannot, why it delay one clock?

Thx in advance.

enter image description here

Was it helpful?

Solution

At time=14ns, reset is asserted (RESET_N=0), which means COUNT_DO=0 in the 1st always block. At time t=20ns, you release reset and COUNT_DO remains at 0. At time=22ns, you have your 1st posedge CLK which assigns COUNT_DO to COUNT_DO_w. The time at which COUNT_DO changes is controlled only by the 1st always block, not the 2nd.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top