找不到为什么价值不会在合适的时间跳到期望

时间:2013-03-16 18:33:52

标签: verilog hdl

我有以下代码

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

我想问一下,为什么COUNT_DO没有在14ns中跳转到1?

我认为由于第二个始终阻止的敏感列表是COUNT_DOIN_VALID, 所以在开始时,复位信号触发器首先始终阻塞并设置COUNT_DO = 0,这会将COUNT_DO值从高阻抗变为0.因此,它会触发第二个始终阻塞COUNT_DO_w = 0 + 1 = 1。并且,在下一个正边沿时钟中,触发第一个始终阻塞进行COUNT_DO <= COUNT_DO_w。但它似乎延迟了一个时钟来分配它(22ns)。我试图弄清楚但仍然不能,为什么它延迟一个时钟?

提前谢谢。

enter image description here

1 个答案:

答案 0 :(得分:4)

在时间= 14ns时,复位被置位(RESET_N = 0),这意味着在第一个始终块中COUNT_DO = 0。在时间t = 20ns时,您释放重置并且COUNT_DO保持为0.在时间= 22ns时,您有第一个CLK并将COUNT_DO分配给COUNT_DO_wCOUNT_DO更改的时间仅由第1个始终阻止,而不是第2个。