Задача SystemVerilog, которая может заставить любой сигнал в интерфейсном модуле - PullRequest
0 голосов
/ 03 октября 2018
interface dut_if();
    logic       sig_a_i;
    logic [1:0] sig_b_i;
endinterface

module tb();
    dut_top dut(
        .sig_a_i  (vif.sig_a_i);
        .sig_b_i  (vif.sig_b_i);
    );

    dut_if vif();
endmodule

Как создать метод task() внутри класса interface, чтобы я мог легко вызывать его в своем классе test для force / release любого сигнала DUT, который мне нравится?

class dut_testA_vseq extends dut_base_vseq;
    ...

    virtual task body();
        p_sequencer.vif.force_dut_signal(0);
    endtask
endclass

Я новичок в SV и не знаю, как написать force_dut_signal(), который может обслуживать любой сигнал (один бит или шина).

task force_dut_signal(logic? port_name, bit? force_val) begin
    force port_name? = force_val;
endtask

? в приведенном выше фрагменте кода есть части, которые я не знаю, если это возможно или что.

Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 30 июля 2019

Вы можете передать сигнал по ссылке в вашу задачу.Однако типы данных должны совпадать, и вы не можете использовать fork, join_any, join_none внутри своей задачи.Это работает только для sig_a_i:

interface dut_if();
  logic       sig_a_i;
  logic [1:0] sig_b_i;
endinterface

module dut_top(
  input logic sig_a_i, 
  input logic [1:0] sig_b_i);
endmodule

module tb();
  dut_top dut(
      .sig_a_i  (vif.sig_a_i),
      .sig_b_i  (vif.sig_b_i)
  );

  dut_if vif();

  function automatic force_1bit_logic(ref logic signal, input bit value);
      signal = value;
  endfunction    

  initial begin
      #1;
      force_1bit_logic(vif.sig_a_i, 0);
      #10;
      force_1bit_logic(vif.sig_a_i, 1);
  end
endmodule
0 голосов
/ 04 октября 2018

В SystemVerilog нет ничего, что позволяло бы передавать иерархическую ссылку на сигнал в качестве ссылки на аргумент задачи / функции.Внутри вашего интерфейса вам нужно будет создать функцию для каждого сигнала или группы сигналов, которые нужно форсировать.Затем вызовите эту функцию из класса.

Кстати, всегда используйте функции вместо задач для не трудоемких процедур.

...