0

検証するデザインがあります。設計はネットワーク ルーターに似ています。複数の FIFO 入力インターフェイスと複数の FIFO 出力インターフェイスがあります。したがって、同じインターフェイスのグループが何度も繰り返されます。DUT の例:

module router(
    input logic [0:NUM_IN] sop_i,
    input logic [0:NUM_IN] eop_i,
    input logic [0:NUM_IN][128:0] data_i,

    output logic [0:NUM_OUT] sop_o,
    output logic [0:NUM_OUT] eop_o,
    output logic [0:NUM_OUT][128:0] data_o,
)
......
endmodule

したがって、テストベンチでは、各 FIFO インターフェイスを個別に駆動したいので、ドライバーの数も構成可能である必要があると思います。

interface fifo_intf;
    logic sop;
    logic eop;
    logic [128:0] data
endinterface

したがって、最初の問題は、このインターフェイスを DUT に接続する方法です。私は次のようなものを見ています

module tb_top;
...
top_intf top_if();

router dut (.sop_i(top_if.connect_if.sop)
            .eop_i(top_if.connect_if.eop),
            .data_i(top_if.connect_if.data))
endmodule

interface connect_intf #(NUM);
    logic [0:NUM-1] sop;
    logic [0:NUM-1] eop;
    logic [0:NUM-1][128:0] data;
endinterface

また、FIFO インターフェイスの数がパラメータ化されているため、トップ インターフェイス ラッパーを env に渡す方が簡単かもしれないと思います。そう、

interface top_intf:
    fifo_intf fifo_if_input[`NUM_IN]();
    fifo_intf fifo_if_output[`NUM_OUT]();
    connect_intf #(`NUM_IN)connect_if();
endinterface

次に、接続インターフェイスから fifo インターフェイスへのルーティングを行う必要があります

   genvar i;
    generate
        for (i = 0; i < NUM_IN; i++) begin
            assign connect_if.sop[i]   = fifo_if_i[i].sop;
    endgenerate

しかし、top_intf をテストベンチ環境に渡すと、いくつかの問題が発生します。

class env;
// local interfaces to avoid hierarchical reference??
virtual fifo_intf fifo_if_i[`NUM_IN];
virtual fifo_intf fifo_if_o[`NUM_OUT];

function env::new(virtual top_intf top_vif);
    this.top_vif = top_vif;
    fifo_if_i[0:`NUM_IN-1] = top_vif.fifo_if_input[0:`NUM_IN-1];
    fifo_if_o[0:`NUM_OUT-1] = top_vif.fifo_if_output[0:`NUM_OUT-1];
endfunction: new
endclass;

これはNUM_In andNUM_OUT が 1 より大きい場合に問題なく動作します。ただし、NUM が 1 の場合に問題が発生します。エラーは次のとおりです。

  Incompatible complex type assignment
  Type of source expression is incompatible with type of target expression. 
  Mismatching types cannot be used in assignments, initializations and 
  instantiations. The type of the target is 'virtual interface 
  fifo_intf$[0:0]', while the type of the source is 'interface fifo_intf'.
  Source Expression: this.top_vif.fifo_if_input[0]

私が今行っていることは、たとえば、NUM_IN 値が何であるかを示すためにいくつかの定義を設定することです。

`ifdef PROJ_A
    `define NUM_IN_IS_1
`elsif PROJ_B
    `define NUM_IN_IS_2
`endif

それから

別のインクルードファイルで

`ifdef NUM_IN_IS_1
    fifo_if_i[0] = top_vif.fifo_if_input[0];
`elsif NUM_IN_IS_2
    fifo_if_i[0] = top_vif.fifo_if_input[0];
    fifo_if_i[1] = top_vif.fifo_if_input[1];  
`endif 

スクリプトを使用してテストベンチ コードを生成できると思いますが、スクリプトを使用しない方法を探しています。私は提案を受け入れます。テストベンチでこの設計状況にどのように対処しますか?

どうもありがとう!

4

1 に答える 1