2

以下のモジュールでは、理想的には cnt, width & startを出力ポートではなく、入力ポートにする必要があります。

しかし、これらのポートを出力ポートとして試してみましたが、それでもエラーなしで実行できます。では、Verilog では inout ポートと出力ポートを同じ意味で使用できますか?

いいえの場合、入力ポートを使用する必要がある正確な基準は何ですか (その場合、出力ポートは使用できません)?

module (clk, rst, cnt, start, width, signal);
  input clk, rst, signal;
  output reg [11:0] cnt, width;
  output reg start;

  always @(posedge clk or negedge rst)
  begin
    if(~rst)
    begin
      cnt <= 0;
      start = 0;
      width <= 'h271;
    end
    else
    begin
      if(signal)
      begin

        width <= (start) ? width : 'h271;
        start = 1;
      end
      cnt <= (start) ? (cnt + 1) : cnt;
    end
  end
endmodule

注 - inout ポートの場合、inout ポートは reg タイプにできないため、コードを変更する必要があることはわかっています。しかし、私はここでポートの種類だけについて尋ねています。

4

3 に答える 3

4

シミュレーターはポートの方向を気にしません。シミュレーション ツールは常にモジュール階層を平坦化し、重要なのは 2 つのポート信号を一緒に接続できることだけです。データの流れが実際に指定された方向に進んでいるかどうかはチェックしません。残念ながら、標準で要求されていることとツールに実装されていることは必ずしも一致しません。

場合によっては、あるツールでは「機能する」が、より強力なエラー チェックを備えた別のツールでは機能しないコードをユーザーが持っていることがあります。ユーザーは、戻ってコードを修正するよりも、ツール ベンダーにエラー チェックを削除させる方が簡単であることに気付きます。一部のほとんどのシミュレーターでは、ポートの方向を強制するためのチェックがすべて削除されています。

入出力ポートで使用される変数のデータ型を宣言しないという規則はほとんど変更されていませんが、多くのツールでは定数を入出力ポートに接続できます。

于 2015-12-12T18:31:17.397 に答える
2

ポートの方向は基本的に Verilog では推奨事項であり、これは SystemVerilog でも変更されていません。これは歴史的な問題であり、Verilog XL (最初の Verilog シミュレータ) がどのようにポート コラプスを行ったかに関連しています。基本的に、すべてが inout です。'95 LRM が作成されたとき、この既存の動作は基本的に文書化されました。1364-2005 では、これは 12.3.8 で次のように表示されます。

入力 (output) として宣言されているが、出力 (input) または inout として使用されているポートは、inout に強制される場合があります。inout に強制されない場合は、警告を発行する必要があります。

実際には、すべてが最終的に にinoutなり、警告が表示される場合と表示されない場合があります。したがって、シミュレーターではほとんど何でも実行できますが、リンターまたはシンセサイザーが論理接続エラーを検出する必要があります (そうでない場合は、まったく役に立ちません)。次のセクションには、その他の特定の非方向規則があります。inputまた、inoutポートはnetタイプである必要があります。

于 2015-12-15T09:43:26.620 に答える