2

VHDL の多次元ユーザー定義型を UVM 環境の SystemVerilog に接続しようとすると、Cadence ツール チェーン シミュレーションでこの問題が発生します。これは、VHDL 出力タイプの定義です。

TYPE loop_reg_ty IS RECORD
      loop_index_value    : std_logic_vector(REG_BITWIDTH-1 DOWNTO 0);
      loop_counter : std_logic_vector(REG_BITWIDTH-1 DOWNTO 0);
      loop_end_flag : std_logic;
END RECORD;

TYPE loop_array_ty is array (MAX_NO_OF_LOOPS-1 downto 0) of loop_reg_ty;

DUT の VHDL 出力ポートの 1 つはタイプloop_array_tyです。

SystemVerilog に相当するものを次のように定義しようとしています。

typedef struct packed {
                            bit [REG_BITWIDTH-1:0] loop_index_value;
                            bit [REG_BITWIDTH-1:0] loop_counter;
                            bit loop_end_flag;
                          } raccu_loop_reg_ty;

typedef raccu_loop_reg_ty [MAX_NO_OF_RACCU_LOOPS-1:0] loop_array_ty;

を使用するirunと、次のエラーが表示されます。

VHDL ポート タイプは Verilog と互換性がありません。

可能な回避策を提案してください。

4

1 に答える 1

1

まず、あなたの問題は、 をloop_array_ty正しく定義していないことです。である必要がありますtypedef raccu_loop_reg_ty loop_array_ty[MAX_NO_OF_RACCU_LOOPS-1:0]

ここで2つのことを提案します:

まず、定義packedから修飾子を削除してみてください。structSV 構造体を VHDL レコードに接続することは、新しい Incisive バージョンでのみ利用できるものです。使用しているバージョンがこれをサポートしていることを確認してください。

古いバージョンの Incisive を使用している場合 (私が 1 年前のように)、唯一の選択肢は$nc_mirror(テストされたコードではありませんが、開始するには十分です)を使用して個々のレコード メンバーをマッピングすることです。

// struct definition...
// ...

module top;
  // intermediate signal we'll mirror onto
  loop_array_ty loop_s;

  // no output connected
  my_dut dut_inst();

  // make the connection between SV and VHDL using nc_mirror
  initial begin
    for (int i = 0; i < MAX_NO_OF_RACCU_LOOPS; i++) begin
      $nc_mirror($sformatf("loop_s[%0d].loop_index_value", i),
        $sformatf("dut_inst.loop_o[%0d].loop_index_value", i);

      // $nc_mirror for loop_counter
      // $nc_mirror for loop_end_flag
    end
  end
endmodule

また、両方の言語で定数を適切に設定していることを確認してください。REG_BITWIDTHそうしないと、型の不一致も発生します。

于 2014-12-05T19:33:57.320 に答える