Стратегия обмена сигналами между предопределенными UVC

Я пытаюсь выяснить, как подключить несколько UVC (компонентов проверки UVM) к одному и тому же тестируемому устройству, где UVC не имеют общего интерфейса, но подключаются к одним и тем же сигналам на тестируемом устройстве.

ИУ, которое может работать с разными протоколами на общих сигналах и может переключаться между протоколами после получения определенной последовательности. Каждый протокол был независимо разработан в собственный UVC; назовем их низкоскоростными и высокоскоростными. Предположим, что интерфейсы и тестируемое устройство следующие:

interface lowspeed_if( input bit clock, reset );
  logic       a;
  logic       b;
  logic       c;
  logic [7:0] io_drv;  wire  [7:0] io = io_drv;
                       wire        ready;
  initial {a,b,c,io_drv} = 'z;
endinterface : lowspeed_if

interface highspeed_if( input bit clock, clk2, reset );
  logic       a;
  logic       b_drv;   wire        b = b_drv;
  logic [7:0] io_drv;  wire  [7:0] io = io_drv;
                       wire        ready;
  initial {a,b_drv,io_drv} = 'z;
endinterface : highspeed_if

module device_to_test(input a, inout b, input c, inout [7:0] io, output ready);
  /* RTL */
endmodule : device

Поскольку UVC не были разработаны с учетом других протоколов, низкоскоростной драйвер/монитор может подключаться только к lowspeed_if, а высокоскоростной драйвер/монитор может подключаться только к highspeed_if. Это означает, что есть два интерфейса, которые должны подключаться к одним и тем же сигналам a, b, io и ready.

Есть ли способ подключить эти UVC к одному и тому же тестируемому устройству без изменения исходных UVC?


person Greg    schedule 07.11.2013    source источник


Ответы (2)


На верхнем уровне определите соединительные сигналы как провода. Используйте операторы assign для сигналов, которые управляют только тестируемым устройством. Используйте tran для двунаправленного. Для сигналов, контролирующих только DUT, используйте операторы assign.

bit clock,clk2,reset;
wire a,b,c;
wire ready;
wire [7:0] io;

lowspeed_if  ls_if(.*);
highspeed_if hs_if(.*);
device dut( .* );

assign {a,b,c} = {ls_if.a, ls_if.b, ls_if.c};
tran link_io_ls[7:0](io, ls_if.io);
assign ls_if.ready = ready;

assign a = hs_if.a;
tran link_b_hs(b,hs_if.b);
tran link_io_hs[7:0](io, hs_if.io);
assign hs_if.ready = ready;

ready мог быть связан с tran, так как он определяется как wire в интерфейсах. Использование оператора assign делает направление явным и гибким, если будущий интерфейс определяет выходные данные как нечто отличное от wire.


Я обнаружил, что assign {a,a} = {ls_if.a,hs_if.a}; также работает для назначения драйверов.

person Greg    schedule 07.11.2013

Хорошо, что у ваших интерфейсов есть wires для работы — это позволяет легко связать их вместе и иметь несколько драйверов. Вы можете создать модуль связывания, который объединяет три провода в один.

module tie(inout .a(w), .b(w), .c(w));
   wire w;
endmodule

Тогда ваш тестовый стенд будет выглядеть так:

module top;

  wire a,b;
  wire [7:0] io;
  wire clk, clk2, reset, ready

  lowspeed_if  ls_if(clk, reset);
  highspeed_if hs_if(clk,clk2,reset);

  tie tie_a(ls_if.a, hs_if.a, a);
  tie tie_b(ls_if.b, hs_if.b, b);
  tie tie_rdy(ls_if.ready, hs_if.ready, ready);
  tie tie_a[7:0](ls_if.io, hs_if.io, io);

  device_to_test DUT(a, b, ls_if.c, io, ready);

endmodule
person dave_59    schedule 07.11.2013
comment
Часть сигналов logic в обоих интерфейсах и поэтому генерирует ошибки при подключении к module tie. Только wire может подключиться к порту inout. - person Greg; 07.11.2013
comment
Тогда вам придется использовать непрерывные присваивания вместо галстука. Например, tie_rdy можно заменить на assign ls_if.ready = ready; assign hs_if.ready = ready;. Это работает, пока есть только один драйвер, в данном случае ваш DUT. - person dave_59; 07.11.2013
comment
Повозившись с ним, я пришел к той же идее использовать assign на сигналах движения. Я также решил использовать примитив Verilog tran для связывания двунаправленных сигналов. Ключевое слово SystemVerilog alias еще не имеет достаточной поддержки инструментов, а те, которые его поддерживают, выдают ошибку, указывающую, что интерфейсный сигнал является иерархической ссылкой. - person Greg; 07.11.2013