0

これは Verilog コードで頻繁に発生することがわかりました。

wire my_module_output_1;
wire my_module_output_2;
wire my_module_output_3;
...

MyModule my_module(
    .output_1(my_module_output_1),
    .output_2(my_module_output_2),
    .output_3(my_module_output_3),
    ...
);

MyOtherModule my_other_module(
    .input_1(my_module_output_1),
    .input_2(my_module_output_2),
    .input_3(my_module_output_3),
    ...
);

私がやりたいことは次のとおりです。

MyModule my_module();
MyOtherModule my_other_module(
    .input_1(my_module.output_1),
    .input_2(my_module.output_2),
    .input_3(my_module.output_3),
    ...
);

同じ効果を達成する方法、つまり、どこかに配線されたモジュールからの出力が必要になるたびに何度も何度も繰り返す必要を避ける方法はありますか?

4

2 に答える 2

4

繰り返しの量を減らすために使用できるいくつかのアプローチを次に示します。

出発点

これは、2 つのサブモジュールを接続する簡単な例です。質問で指摘したように、それらをつなぎ合わせるには多くの繰り返しが必要です。

module source(output A, output B);
  assign A = 0;
  assign B = 1;
endmodule

module sink(input A, input B);
  initial begin
    #1 $display("A=%0d B=%0d", A, B);
  end
endmodule

module top();

  wire A;
  wire B;

  source the_source(
    .A(A),
    .B(B)
  );

  sink the_sink(
    .A(A),
    .B(B)
  );

endmodule

インプリシット ワイヤの使用

Verilog では、ワイヤを暗黙的に宣言できます。したがって、以下に示すように、AandBをワイヤーとして宣言する必要はありません。それらがポート マップに表示される場合、それらは暗黙的に宣言されます。これに関する唯一の問題は、それらが常にシングル ビット ワイヤ/ネットとして宣言されることです。したがって、これはシングルビット信号に対してはうまく機能しますが、バスに対しては相互接続を明示的に宣言する必要があります。

// Verilog, implicit wires
module top();

source the_source(
  .A(A),
  .B(B)
);

sink the_sink(
  .A(A),
  .B(B)
);

endmodule

Verilog モードの AUTO の使用

Verilog-Modeのemacs パッケージは、モジュールをつなぎ合わせるために必要なタイピングの量を大幅に削減するのに役立ちます。上記の AUTO を使用した例を次に示します。

AUTO を展開する前に:

// Verilog, explicit connections using AUTOs
module top();

  /*AUTOWIRE*/

  source the_source (/*AUTOINST*/);

  sink the_sink (/*AUTOINST*/);

endmodule

AUTO を展開した後:

// Verilog, explicit using AUTOs
module top();

  /*AUTOWIRE*/
  // Beginning of automatic wires (for undeclared instantiated-module outputs)
  wire                A;                      // From the_source of source.v
  wire                B;                      // From the_source of source.v
  // End of automatics

  source the_source (/*AUTOINST*/
                     // Outputs
                     .A               (A),
                     .B               (B));

  sink the_sink (/*AUTOINST*/
                 // Inputs
                 .A                   (A),
                 .B                   (B));

endmodule

ブライアンが回答で指摘したように、Verilog-Mode を使用するために emacs を使用する必要はありません。私も Vim を使用しており、この Vim スクリプトを使用して Vim内から Verilog-Mode を有効にしています。


SystemVerilog オプション

SystemVerilog を使用できる場合は、ドット スター表記を使用してポートを名前で接続できます。これは非常に便利ですが、ピア モジュール間の相互接続用のワイヤを宣言する必要があります。

// SystemVerilog, dot-star notation
module top();

  wire A;
  wire B;

  source the_source(.*);
  sink the_sink(.*);

endmodule
于 2013-03-27T04:13:11.510 に答える
2

人々はまだ Verilog AUTO をどこでも使用していないのでしょうか?

http://www.veripool.org/wiki/verilog-mode/Verilog-mode-Help

特に、AUTOINST のセクションに注意してください。これですべての問題が解決するわけではありませんが、AUTO を適切に使用すると、構造的な Verilog を生成する際の退屈な作業が大幅に軽減されます。

Emacs ノードであることは気にしないでください。私自身はvimの男ですが、AUTOを更新する必要がある場合は、このモードをロードしてemacsを介してバッファーをパイプするだけです。

于 2013-03-27T01:08:37.340 に答える