Verilog 建模JK FF时输出错误:输出为x

Verilog 建模JK FF时输出错误:输出为x,verilog,flip-flop,Verilog,Flip Flop,我正在用Verilog模拟一个JK触发器。在所有情况下,我都将输出q作为x。我对各种jk组合使用了case语句。我几乎没有发现代码有任何问题 设计 module jk_ff ( input j, input k, input clk, output q); reg q; always @ (posedge clk) case ({j,k})

我正在用Verilog模拟一个JK触发器。在所有情况下,我都将输出
q
作为
x
。我对各种jk组合使用了
case
语句。我几乎没有发现代码有任何问题

设计


    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

输出仅显示
x
,而不是0 1和Q。

当我运行您的模拟并查看波形时,我发现
clk
始终未知(
x
)。您将
clk
声明为
reg
,这意味着它默认为
x
。您的赋值(
clk=~clk
)不会更改
clk
的值,因为
~clk
的计算结果为
~x
,仍然是
x

您需要在测试台上将
clk
初始化为已知值。例如,更改:

       reg clk;
致:

这表明:

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