2017-03-22 14 views
1

私は、以下の例に本質的に煮詰めることのできるテストベンチに遭遇しました。クロックとシグナルは、ブロック割当と同​​じタイムステップで変更されます。私は、これがクロックと2つのctrlX信号の間の競合状態を引き起こすと信じていますが、私はEDAの遊び場では証明できませんでした。競合状態があることを修正していますか? (EDA遊び場リンク:https://www.edaplayground.com/x/5yDX#&togetherjs=gkG5xewfNNシグナル間の競合状態

module tb_example; 


    reg clk = 1; 
    reg [3:0] dff1,dff2; 
    reg [3:0] ctrl1 = 'd0; 
    reg [3:0] ctrl2 = 'd0; 

    initial begin 
    #10 ctrl1 = 'd1; 
    #20 ctrl1 = 'd2; 
    #10 ctrl1 = 'd3; 
    #100 $finish; 
    end 

    always begin 
    #5 clk = !clk; 
    end 

    initial begin 
    $dumpfile("dump.vcd"); 
    $dumpvars(0,tb_example); 
    end 

    initial begin 
    #10 ctrl2 = 'd1; 
    #20 ctrl2 = 'd2; 
    #10 ctrl2 = 'd3; 
    #100 $finish; 
    end 

    always @ (posedge(clk)) begin 
    dff1 <= ctrl1; 
    end 

    always @ (posedge(clk)) begin 
    dff2 <= ctrl2; 
    end 

endmodule 

答えて

1

あなたがctrlxブロッキング割り当てを使用していて、彼らはposedge clkと同時に変化しているので、はい、これは競合状態です。したがって、dffxに割り当てられた値は不定であり、シミュレータごとに異なる可能性があります。これを回避する

一つの方法は、CLKのnegedgeにctrlx変更することです:

reg clk = 0;