可以强制接口模块中任何信号的SystemVerilog任务

时间:2018-10-03 06:00:35

标签: system-verilog

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 :(得分:0)

SystemVerilog中没有任何东西可以让您将对信号的分层引用作为对任务/函数自变量的引用。在界面内部,您需要为需要强制执行的每个信号或一组信号创建一个函数。然后从类中调用该函数。

顺便说一句,对于非耗时的过程,请始终使用函数而不是任务。

答案 1 :(得分:0)

您可以通过引用将信号传递到您的任务中。但是,数据类型必须匹配,并且您不能在任务内使用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