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
上面的代码段中的?
是我不知道的部分,如果可能或什么。
谢谢!
答案 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