インテル® Quartus® Prime プロ・エディションのユーザーガイド: デザインの推奨事項

ID 683082
日付 8/03/2023
Public
ドキュメント目次

1.9. HDLコードでの force ステートメントの使用

SystemVerilogの force ステートメントは、ネットまたは変数における連続的なプロシージャー割り当てです。
force ステートメントをネットまたは変数に適用すると、そのネットまたは変数に対する他のすべてのドライバーがオーバーライドされます。シミュレーションでは、force ステートメントを release ステートメントと組み合わせて使用することができます。ただし、 インテル® Quartus® Prime開発ソフトウェアの合成では、force ステートメントのみを使用して、ネットのドライバー (ゲート出力、モジュール出力、および連続割り当て) および特定のネットまたはネットバスで行われた以前の割り当てのオーバーライドをサポートします。
注: 合成では、force ステートメントの使用は初期ブロック内に限られています。

合成における force ステートメント例

次に、 インテル® Quartus® Prime開発ソフトウェアの合成でサポートする force ステートメントの例をいくつか示します。

force ステートメントを使用してカウンターの enable を0に設定

次の例は、force ステートメントを使用して counter インスタンス u1en ポートをロジック 0 に結び付ける方法を示しています。

module top(clk, rst, enable, dout);
  input clk, rst, enable;
  output [3:0] dout;
  counter u1(.clk(clk), .reset(rst), .en(enable), .q(dout));

  initial  begin
    force u1.en = 1'b0
  end
endmodule 

force ステートメントで en ポート (top モジュールの enable ポート) の他のドライバーをオーバーライドしていることが分かります。

force ステートメントを使用しての接続の変更

次の例は、force ステートメントを使用してデザイン内の接続を変更する方法を示しています。

module top(input [3:0] din, din1, output logic [3:0] dout, dout1, input clk, rst);
  dff i0(.din(din), .dout(dout), .clk(clk), .rst(rst) );
  dff i1(.din(din1), .dout(dout1), .clk(clk), .rst(rst) );
endmodule

module top_modified(input [3:0] din, din1, output logic [3:0] dout, dout1, input clk, rst);
  top i_top(.*);
  initial 
  begin
    force i_top.i1.din = i_top.din;
  end
endmodule

この例では、デザインの top モジュールで dff モジュールの2つのインスタンスをインスタンス化しています。top モジュールの din および din1 ポートでは、i0 および i1 インスタンスの din ポートを駆動します。

top モジュール内のRTLを変更せずに top モジュールの接続を変更するとします。この場合は、force ステートメントをラッパーモジュール (top_modified) 内で使用することができます。また、このモジュールが新しい top モジュールになります。新しい top モジュールで、force ステートメントを使用して top モジュール内の接続を変更し、i0 および i1 の両方のインスタンスの din ポートが top モジュールの同じ din ポートで駆動されるようにします。force ステートメントでは、クロスモジュール参照 (XMR) を使用してその下の階層の信号にアクセスします。XMRの詳細については、HDLコードにおけるクロスモジュール参照 (XMR) を参照してください。

注:

この例の場合は、ラッパーの top_modified を作成して top モジュールをインスタンス化する代わりに、次のように二次上位エンティティーを作成し、その内部で force 割り当てを作成することもできます。

module secondary_top(input [3:0] din, din1, output logic [3:0] dout, dout1, input clk, rst);
initial begin
  force top.i1.din = top.din;
end
endmodule