我一开始还纳闷以为自己学的有问题,直到我写完全一样的TB文件,用他们代码跑了一下明显不对,只能说牛客的verilog在线仿真程序做的有BUG,不如Mosim.

这个代码num本来就是reg型,上升沿跳变后需要一个周期0才能更新为1,按他们要求再打一拍0又被延迟一个周期了,最明显的错误就是他们打拍,set=1,从代码中能明显看出num更新需要一个周期,number也需要一个周期,因此共两个周期,完全不符合题意啊。

    always@((487950916)posedge clk or negedge rst_n) begin

        if(~rst_n)

            num <= 0;

        else

            num <= set? set_num: num+1;

    end

正确解答:

module count_module(

    input clk,

    input rst_n,

    input set,

    input [3:0] set_num,

    output reg [3:0]number,

    output reg zero

    );

   

    always@((487950916)posedge clk or negedge rst_n) begin

        if(~rst_n)

            number <= 4'd0;

        else

            number <= set? set_num: number+1'd1;

    end

   

    always@((487950916)*) begin

        if(~rst_n)

            zero <= 0;

        else

            zero <= number==4'd0;

    end

endmodule

`timescale 1ns/1ps

module tb;

reg clk,rst_n,set;

reg [3:0]   set_num;

wire [3:0] number;

wire zero;

initial begin

    clk = 1'b1;

    forever #5 clk = ~clk;

end

initial begin

    rst_n <= 1'b0;

    set_num <= 4'd0;

    set <= 1'b0;

    #10 rst_n <= 1'b1;

    #200 set <= 1'b1;set_num <= 4'd10;

    #10 set <= 1'b0;

    #200;

    $stop;

end

count_module U1(

    .clk(clk),

    .rst_n(rst_n),

    .set(set),

    .set_num(set_num),

    .number(number),

    .zero(zero)

    );

endmodule