0

ある数までカウントするカウンターを設計したいのですが、それが 3 だとしましょ

このカウンターを合成に使いたいので「disable」ステートメントを使わないと……。

私は両方のコードを添付しました-(1)簡単かつ正確に停止する $finish を使用

// Code with $finish   
module counter(input wire  clk);

reg [23:0]N=24'b0000_0000_0000_0000_0000_0000;

always @ (posedge clk)
 begin 

  if (N == 24'b0000_0000_0000_0000_0000_0011)
   begin 
    $display("Inside If N=%d in Time=",N,$time);
    $finish;
   end
   else 
   begin 
    N <= N +1;    
    $display("Inside Else N=%d in Time=",N,$time);
   end 
  end

endmodule

(2) まったく止まらない無効化付き..

// Code with disable that not stop    
module counter(input wire  clk);

reg [23:0]N=24'b0000_0000_0000_0000_0000_0000;

always @ (posedge clk)
 begin :close

  if (N == 24'b0000_0000_0000_0000_0000_0011)
   begin 
    $display("Inside If N=%d in Time=",N,$time);
    disable close; 
  end
  else 
  begin 
    N <= N +1;    
    $display("Inside Else N=%d in Time=",N,$time);
  end 
 end

endmodule
4

2 に答える 2

0

合成RTL$finishではなく、テスト ベンチの最後に配置します。

$finish実行中のすべてのプロセスを停止し、シミュレーションを終了します。disable1 つのプロセスとその子プロセスを停止します。サンプル コードでdisable closeは、always ブロック内でコードを終了しますが、クロックは停止しません。次のポジティブ エッジ クロックと always ブロックが再び実行を試みます。

ステートメントについてはIEEE std 1800-2012 § 20.2 を$finish、Disable ステートメントについては § 9.6.2 を参照してください。

于 2013-10-16T19:06:24.930 に答える
0

toolic と Greg は両方とも、$finish と disable の誤った使用法を示しています。これは、これらの点の両方に追加し、合成可能な RTL からテストを分離して、可能な解決策を示すためのものです。

module counter(input clk);

  reg [23:0] N = 24'b0;

  always @ (posedge clk) begin 
    if (N < 24'd3) begin 
      N <= N +1; 
      $display("Inside If N=%d in Time=",N,$time);
    end
    else begin 
      $display("Inside Else N=%d in Time=",N,$time);
    end 
  end
endmodule

テストするには:

module test;

//Create clk
reg clk;
initial begin
  clk = 0 ;
  forever begin
    #5  clk =   ~clk;
  end
end

//instantiate DUT (Device Under Test)
counter counter_i0(
  .clk( clk )
);

// The test
//  Run for 6 clock cycles then end
initial begin
  repeat (6) begin
    @(posedge clk)
  end
  $finish;
end
endmodule

カウント 3 で停止する場合は、明確な意図が得られるので、定数に 10 進数表記 24'd3 を使用します。

また==、カウンターを停止するために使用すると、グリッチがこれを見逃す可能性があり、これがラップアラウンドするのを待つ必要があります。または、小なりコンパレータを使用することは、正確な値をスキップし==てラップアラウンドするのに非常に長い時間を待たなければならないことを恐れずに、カウントターゲットをその場で調整できることを意味します。

入力は暗黙的にワイヤであり、そのように定義する必要はありませんが、必要に応じて定義できます。

于 2013-10-16T19:28:31.020 に答える