JK Flip Flop 的验证显示不正确的结果

Verification of JK Flip Flop shows incorrect results

我设计了一个JK触发器。现在我想自动化验证。为此,我将输入输出组合记录在一个数组中,并使用 for 循环对其进行验证。但是,我的一些验证给出了错误的结果。

我已经完成了设计的人工验证,我得到了要求。

这是我的设计


    module jkff(clk,j,k,q);
    
    input clk,j,k;
    output  q;
    reg q;
    
    always @ (posedge clk)  
        case ({j,k})  
            2'b00 :  q <= q;  
            2'b01 :  q <= 0;  
            2'b10 :  q <= 1;  
            2'b11 :  q <= ~q;  
        endcase  
        endmodule

 

这是我的测试台


    module tb_jk;  
        reg j;  
        reg k;  
        reg clk; 
        wire q;
        reg j_array[1:8];
        reg k_array[1:8];
        reg q_array[1:8];
        integer i;
    
        initial begin  
            j_array[1] =1'b0;
            j_array[2] =1'b0;
            j_array[3] =1'b0;
            j_array[4] =1'b1;
            j_array[5] =1'b1;
            j_array[6] =1'b1;
            j_array[7] =1'b1;
            j_array[8] =1'b1;
    
            k_array[1] =1'b0;
            k_array[2] =1'b1;
            k_array[3] =1'b1;
            k_array[4] =1'b0;
            k_array[5] =1'b0;
            k_array[6] =1'b1;
            k_array[7] =1'b1;
            k_array[8] =1'b1;
    
            q_array[1] =1'bx;
            q_array[2] =1'bx;
            q_array[3] =1'b0;
            q_array[4] =1'b0;
            q_array[5] =1'b1;
            q_array[6] =1'b1;
            q_array[7] =1'b0;
            q_array[8] =1'b1;
        end
    
        jkff    jk0 ( .j(j),  
            .k(k),  
            .clk(clk),  
            .q(q));  
    
        initial begin  
            clk = 1'b0;
            j = 1'b0;
            k = 1'b0;
        end
        initial begin
            main;
        end
        task main; 
            fork
                clock_gen;
                operation_flow;
                debug_output;
                endsimulation;
            join
        endtask
        task clock_gen;
            forever #5 clk = ~clk;  
        endtask
        task operation_flow;
            begin
                for(i =1;i<=8;i= i+1)
                begin
                    j<=j_array[i];
                    k<=k_array[i];
                    #(10);
                    if(q == q_array[i]) begin
                        $display("Correct!..");
                        $display("q_array[%d] = %d",i,q_array[i]);
                        $display("j = %d k= %d q =%d",j,k,q);
                    end
                    else begin
                        $display("Wrong!...");
                        $display("q_array[%d] = %d",i,q_array[i]);
                        $display("j = %d k= %d q =%d",j,k,q);
    
                    end
                end
                    $display("Verification Finished!..");
            end
        endtask
        task debug_output;
            begin
                $dumpfile("jk_ff.vcd");
                $dumpvars;
            end
        endtask
        task endsimulation;
            begin
                #200
                $display("-------------- THE SIMUALTION END ------------");
                $finish;
            end
        endtask
        endmodule

日志


    VCD info: dumpfile jk_ff.vcd opened for output.
    Wrong!...
    q_array[          1] = x
    j = 0 k= 0 q =x
    Wrong!...
    q_array[          2] = x
    j = 0 k= 1 q =0
    Correct!..
    q_array[          3] = 0
    j = 0 k= 1 q =0
    Wrong!...
    q_array[          4] = 0
    j = 1 k= 0 q =1
    Correct!..
    q_array[          5] = 1
    j = 1 k= 0 q =1
    Wrong!...
    q_array[          6] = 1
    j = 1 k= 1 q =0
    Wrong!...
    q_array[          7] = 0
    j = 1 k= 1 q =1
    Wrong!...
    q_array[          8] = 1
    j = 1 k= 1 q =0
    Verification Finished!..
    -------------- THE SIMUALTION END ------------

我无法找到验证设计的自动化问题。

有2个问题。

与未知值 (x) 进行比较时,必须使用大小写相等运算符 (===)。

您还在错误的时间对输出数据进行采样。解决此问题的一种方法是在与输出驱动方式相反的时钟边缘进行采样。

参考////评论看我修改了哪些行:

task operation_flow;
    begin
        for(i =1;i<=8;i= i+1)
        begin
            j<=j_array[i];
            k<=k_array[i];
            @(negedge clk); ////
            if(q === q_array[i]) begin ////
                $display($time, " Correct!..");
                $display("q_array[%d] = %d",i,q_array[i]);
                $display("j = %d k= %d q =%d",j,k,q);
            end
            else begin
                $display($time, " Wrong!...");
                $display("q_array[%d] = %d",i,q_array[i]);
                $display("j = %d k= %d q =%d",j,k,q);

            end
            @(posedge clk); ////
        end
            $display("Verification Finished!..");
    end
endtask

我还在 $display 语句中添加了 $time,以便在日志文件中为您提供更多调试信息。

当我现在运行模拟时,我没有看到Wrong!消息。