Systemverilog Testbench, как бороться с настраиваемым количеством интерфейсов

У меня есть дизайн, чтобы проверить. Дизайн похож на сетевой маршрутизатор. Он имеет несколько входных интерфейсов 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

Я также думаю, что может быть проще передать оболочку верхнего интерфейса в env, поскольку число интерфейсов FIFO параметризовано. Так,

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 в среду testbench.

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 

Я думаю, что мы можем использовать некоторый скрипт для генерации кода тестового стенда, но я пытаюсь найти способ без скриптов. Я открыт для предложений. Как вы справляетесь с этой ситуацией в своем тестовом стенде?

Большое спасибо!

1 ответ

Чтобы избежать присвоения массиву массивов, сверните их внутрь for петли:

function env::new(virtual top_intf top_vif);
    this.top_vif = top_vif;

    foreach (fifo_if_i[i])
      fifo_if_i[i] = top_vif.fifo_if_input[i];

    foreach (fifo_if_o[i])
      fifo_if_o[i] = top_vif.fifo_if_output[i];
endfunction: new
Другие вопросы по тегам