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!
消息。
我设计了一个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!
消息。