2017-02-20 2 views
1

を使用してブロック常に自己トリガ内部イベントiflag、スケジュールされたdt秒後のいずれか早い方。Iのいずれか</p> <p>a)は外部イベントEFLAG、または、b)はその状態に応じて、によってトリガされるブロック(行動は、合成されるべきではない)を実装する必要が遅延

遅延(#)演算子を使用した私の試行では、ブロック動作が発生しました。長いdtは次のeflagをブロックしました。可能であれば、私は長いdtのためのオーバーヘッドのカウントとしてdtmaxを避けるでしょう。

ワーキングと意図したが、失敗コード:

`timescale 1ns/100fs 
`define tick 1.0e-9 

parameter real dtmax = 1; 

initial iflag=1'b0; 
initial toggle=1'b0; 

always @(eflag, iflag) begin  
    // time step control 

    dt = ...; 
    iticks = dt/`tick; 
    toggle = !toggle; 
end 

//------------------------------------------------------ 
/* 
a) time step counter - working 
always #1 begin 
    iticks = iticks - 1; 
    if (iticks < 1) begin 
     iflag = !iflag; 
     iticks=dtmax/`tick; 
    end 
end 
*/ 

// b) intended 
always @(toggle) begin 
    #(iticks) iflag <= !iflag;   // failing, not changing iflag 
// #(iticks) iflag = !iflag;   // failing, blocking simulation 
end 

あなたは、私はあなたのコードをchanagedしており、この新しいコードは私のために正常に動作しますedaplayground link

Thxを

答えて

0

でそれを試すことができます。動作していないと思われる場合は、Verilogシミュレーションの理解に間違いがあるかもしれません。ノンブロッキング遅延は、信号のイベントをスケジュールします。そのスケジューリングを割り当てる時間の前に別のイベントがスケジューリングされ、別の値が設定されている場合は、最初のイベントが上書きされます。新しいイベントが同じ値を持つ場合、最初のイベントが保持されます。

// Verilog 
// self-triggered always block 
// block should take time steps <= dtmax 


`define tick 1.0e-9 

module dut(eflag); 

    input eflag; 
reg iflag; 
reg toggle; 
    integer iticks; 
    real last_time; 
    real now; 
    real dtlast; 
    real dtmax; 

    always @(eflag, iflag) begin 

    now = $time*`tick; 
    dtlast = now - last_time; 
    dtmax = iticks*`tick; // from last call 

    $display( "dtlast: %g",dtlast); 
    $display( "err:  %d",dtlast > dtmax); // giving wrong value in sim? 
    $display("\nnow:  %g",now); 
    $display( "dtmax: %g",dtmax); 


    // time step control dummy 
    iticks <= 7 + $random % 5; //changed because in previous one eflag and toggle always changed at the same time 
    toggle = !toggle; 

    last_time = now; 
    end 

    initial toggle = 0; 
    initial iflag = 0; 
    always @(toggle) begin 
    #(iticks) iflag <= !iflag; 
    end 

endmodule 
+0

答えていただきありがとうございました。実際には歩行者の減量スタイルを取り除きたいと思っていました。質問の編集コードをご覧ください。 – bardo

+1

iflag <=#(iticks)!iflagに変更するとどうなりますか? – Laleh

+0

あなたの質問をより明確にして全体のコードを投稿して、私がそれをデバッグできるようにすることができます。 – Laleh

関連する問題

 関連する問題