4

インターフェイスを VHDL モジュールにバインドしようとしています。バインドしたいシグナルは、モジュールで次のように定義されています。

TYPE dut_fsm_type is (
                           IDLE_STATE,
                           WAIT_STATE,
                           IDENTIFY_STATE,
                           LATCH_STATE,
                           DONE_STATE,
                           ERROR_STATE
                          );
signal dut_fsm_state       : dut_fsm_type;
signal prev_dut_fsm_state  : dut_fsm_type;

インターフェイス モジュールとバインド ステートメントのインスタンス化は次のようになります。

bind my_dut my_intf my_intf_0 (.*,
                               .fsm_state     (tb.u_dut.dut_fsm_state),
                               .prev_fsm_state(tb.u_dut.prev_dut_fsm_state)
                              );

入力信号 fsm_state の長さがわからなかったので、32 ビットに設定しました。

interface my_intf (
  input bit[31:0] fsm_state,
  input bit[31:0] prev_fsm_state
);

questasim 10.4 でコンパイルしようとすると、次のメッセージが表示されます。

(vopt-2245) bind ステートメントで実際の式として使用される VHDL 階層参照のタイプ ('dut_fsm_type') は、パッケージで定義する必要があります。

これを処理する方法はありますか?

4

3 に答える 3

3

エラー メッセージに基づいて、SystemVerilog 側で同等の型を定義する必要があり、パッケージで定義する必要があるようです。したがって、次のパッケージを追加してインターフェイス ポートを変更すると機能するはずです。

package typdef_pkg;
  typedef enum  {
    IDLE_STATE,
    WAIT_STATE,
    IDENTIFY_STATE,
    LATCH_STATE,
    DONE_STATE,
    ERROR_STATE
  } dut_fsm_type;
endpackage : typdef_pkg

interface my_intf (
  input typdef_pkg::dut_fsm_type fsm_state,
  input typdef_pkg::dut_fsm_type prev_fsm_state
);
...
endinterface

混合言語のシミュレーションは、扱いにくい傾向があります。これがうまくいくと100%確信しているわけではありませんが、正しい方向に進むはずです。

于 2016-11-24T00:39:59.233 に答える
2

シミュレータ Questasim 10.4a で動作させることができました。

1) VHDL コードの TYPE 定義を別のパッケージに移動します。

// File: types_pkg.vhd
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
use ieee.numeric_std.all;

package types_pkg is
    TYPE dut_fsm_type is (
                          IDLE_STATE,
                          WAIT_STATE,
                          IDENTIFY_STATE,
                          LATCH_STATE,
                          DONE_STATE,
                          ERROR_STATE
                         );
end types_pkg;

2)enum my_fsm_statesystemVerilogパッケージで独自に定義しました:

//my_pkg.sv
typedef enum {
             IDLE_STATE,
             WAIT_STATE,
             IDENTIFY_STATE,
             LATCH_STATE,
             DONE_STATE,
             ERROR_STATE        
             } my_fsm_states;

3) インターフェイス モジュールのポート定義には、FSM の 6 つの状態に対応するための 4 ビットの入力ポートがありました。

interface my_intf (
  input          clk,
  input [4:0]    fsm_state,
  input [4:0]    prev_fsm_state
);

4) 私の bind ステートメントは以前と同じでした:

bind my_dut my_intf my_intf_0 (.*,
                               .fsm_state     (tb.u_dut.dut_fsm_state),
                               .prev_fsm_state(tb.u_dut.prev_dut_fsm_state)
                              );

5) さて、私のインターフェイス モジュールでは、静的キャストを使用してキャストしfsm_state、変数prev_fsm_statem_fsm_states列挙します。

interface my_intf (
  input          clk,
  input [4:0]    fsm_state,
  input [4:0]    prev_fsm_state
);

always @(posedge clk)
begin
  if (my_fsm_states'(fsm_state) == WAIT_STATE) begin
    // Do something
  end
  else if (my_fsm_states'(fsm_state) == IDLE_STATE) begin
    // Do something
  end
  else if .... // So on..

end

ちょっと粘着性がありますが、うまくいきます。

これを実現するために、こちらのホワイトペーパーを使用しました 。 515bf2c08abc

これは正確には機能しませんでしたが。彼らはassignstatic_cast の代わりにを使用していますが、それは私にとってはうまくいきませんでした。エラーメッセージでは、代入ではなくキャストするように求められました。

于 2016-11-24T18:37:13.637 に答える