问题描述
我正在使用 Verilog 对 JK FLIP Flop 进行建模。在所有情况下,我都将输出 q
设为 x
。我将 case
语句用于各种 jk 组合。我几乎没有发现代码有任何问题。
设计
module jk_ff ( input j,input k,input clk,output q);
reg q;
always @ (posedge clk)
case ({j,k})
2'b00 : q <= q;
2'b01 : q <= 1'b0;
2'b10 : q <= 1'b1;
2'b11 : q <= ~q;
endcase
endmodule
测试台
module tb_jk;
reg j;
reg k;
reg clk;
always #5 clk = ~clk;
jk_ff jk0 ( .j(j),.k(k),.clk(clk),.q(q));
initial begin
$dumpfile("test.vcd");
$dumpvars;
j <= 0;
k <= 0;
#5 j <= 0;
k <= 1;
#20 j <= 1;
k <= 0;
#20 j <= 1;
k <= 1;
#20 $finish;
end
initial
$monitor ("j=%0d k=%0d q=%0d",j,k,q);
endmodule
日志
vu2swz@PPDP01:~$ iverilog jk_ff.v
vu2swz@PPDP01:~$ ./a.out
VCD info: dumpfile test.vcd opened for output.
j=0 k=0 q=x
j=0 k=1 q=x
j=1 k=0 q=x
j=1 k=1 q=x
解决方法
当我运行您的模拟并查看波形时,我发现 clk
始终未知 (x
)。您将 clk
声明为 reg
,这意味着它默认为 x
。您的赋值 (clk = ~clk
) 不会更改 clk
的值,因为 ~clk
的计算结果为 ~x
,它仍然是 x
。
您需要在测试平台中将 clk
初始化为已知值。例如,更改:
reg clk;
到:
reg clk = 0;
这表明:
j=0 k=0 q=x
j=0 k=1 q=x
j=0 k=1 q=0
j=1 k=0 q=0
j=1 k=0 q=1
j=1 k=1 q=1
j=1 k=1 q=0
有两种方法可以调试此问题。正如我提到的,一种方法是查看波形;您已经创建了 VCD 文件。这是最有效的方法。 iverilog
网站称 GTKWave“是 Icarus Verilog 的首选波形查看器”。
另一种方法是将 clk
信号添加到您的 $monitor
语句中:
$monitor ("j=%0d k=%0d q=%0d clk=%b",j,k,q,clk);
然后你会看到:
j=0 k=0 q=x clk=x
j=0 k=1 q=x clk=x
j=1 k=0 q=x clk=x
j=1 k=1 q=x clk=x