Verilog JK触发器验证结果不正确

Verilog JK触发器验证结果不正确,verilog,fpga,Verilog,Fpga,我设计了一个JK触发器。现在我想自动化验证。为此,我将输入输出组合记录在一个数组中,并使用For循环对其进行验证。但是,我的一些验证给出了不正确的结果 我已经完成了设计的手动验证,并且得到了所需的结果 这是我的设计 module jkff(clk,j,k,q); input clk,j,k; output q; reg q; always @ (posedge clk) case ({j,k})

我设计了一个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

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

有两个问题

与未知值(
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
任务操作流程;
开始
对于(i=1;i

    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 ------------

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