通过任务

通过任务

问题描述:

驾驶虚拟接口信号的bitslice我试图创建一个任务是负责设置有点向量的和一个时钟周期之后将其清除。我的驱动程序代码下面附:通过任务

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 

我收到以下错误(奎斯塔10.6):

** Error: path_to_driver.svh(53): LHS in non-blocking assignment may not be an automatic variable

** Error: path_to_driver.svh(55): LHS in non-blocking assignment may not be an automatic variable

这些点到非阻塞赋值在set_then_clear任务“信号”。有没有办法通过ref参数指向虚拟接口的位图?

+0

尝试在这两条线改变到阻断非阻挡分配。我也尝试在EDAplayground代码,并得到了另一个错误“对象‘this.vif.my_if_cmd_a [txn.tid]’不能按引用传递。允许的对象类型包括变量,类属性,解压结构成员,并解压数组元素。” (如果这个错误是一个模拟器问题或SV规则我没有检查。) – Greg

+0

基于Dave的答案,这是一个LRM规则(第13.5.2节)。我选择做非阻塞的原因是因为我希望在所有监控活动(此时不使用CB)后更新该值。 –

的LRM说

Because a variable passed by reference may be an automatic variable, a ref argument shall not be used in any context forbidden for automatic variables.

而且你不能按引用传递一个位选择一个拥挤的变量,只有全局变量。

有没有简单的方法来做到这一点,而无需编写单独的任务,每个CMD,或者选择您要分配的接口变量的信号任务中一个大case语句。

+0

谢谢戴夫!我在LRM看到这个,后来我也看到了这个[主题](https://verificationacademy.com/forums/uvm/lhs-non-blocking-assignment-may-not-be-automatic-variable)这里我解释你的答案,因为这是可能的,所以我很有希望:) 我会去与'大案/ multi-if'路线。 –

+0

我刚纠正那个线程。抱歉。 –