通过任务驱动虚拟接口信号的位片

时间:2017-02-10 17:13:08

标签: system-verilog uvm

我正在尝试创建一个任务,负责设置一个向量并在一个时钟周期后清除它。我的驱动程序代码附在下面:

class my_if_driver extends uvm_driver;
  `uvm_component_utils(my_if_driver)

  // Members
  // UVM stuff
  virtual my_if_interface vif;

  function new(string name="my_if_driver", uvm_component parent);
    super.new(name, parent);
  endfunction

  extern function void build_phase(uvm_phase phase);
  extern function void connect_phase(uvm_phase phase);
  extern task          run_phase(uvm_phase phase);

  extern task drive_my_if(my_if_transaction txn);
  extern task set_then_clear(ref logic signal);
endclass

function void my_if_driver::build_phase(uvm_phase phase);
endfunction

function void my_if_driver::connect_phase(uvm_phase phase);
endfunction

task my_if_driver::run_phase(uvm_phase phase);
  @(posedge vif.resetn);
  forever begin
    seq_item_port.get_next_item(req);
    fork
      drive_my_if(req);
    join_none
    seq_item_port.item_done(req);
  end
endtask

// NOTE: each 'command-signal' has bit for each tid (transaction ID)
task my_if_driver::drive_my_if(my_if_transaction txn);
  // Wait for delay
  repeat (txn.cycle_delay) @(posedge vif.clk);
  // Then drive appropriate signal
  if (txn.my_if_cmd == my_if_transaction::CMDA) begin
    set_then_clear(vif.my_if_cmd_a[txn.tid]);
  end
  else if (txn.my_if_cmd == my_if_transaction::CMDB) begin
    set_then_clear(vif.my_if_cmd_b[txn.tid]);
  end
  else if (txn.my_if_cmd == my_if_transaction::CMDC) begin
    set_then_clear(vif.my_if_cmd_c[txn.tid]);
  end
endtask

task my_if_driver::set_then_clear(ref logic signal);
  signal <= 1'b1;
  @(posedge vif.clk);
  signal <= 1'b0;
endtask

我收到以下错误(Questa 10.6):

  

**错误:path_to_driver.svh(53):非阻塞分配中的LHS可能不是自动变量

     

**错误:path_to_driver.svh(55):非阻塞分配中的LHS可能不是自动变量

这些指向set_then_clear任务中对'signal'的非阻塞赋值。有没有办法通过ref参数指向虚拟接口的位片?

1 个答案:

答案 0 :(得分:2)

LRM说

  

因为通过引用传递的变量可能是自动变量,a   ref参数不得用于禁止自动的任何上下文中   变量

并且你不能通过引用传递一个压缩变量的位选择,只传递整个变量。

如果不为每个cmd编写单独的任务,或者在选择要分配的接口变量的信号任务中使用大型case语句,则没有简单的方法。