gpt4 book ai didi

system-verilog - UVM:驱动程序和程序分配的非法组合警告

转载 作者:行者123 更新时间:2023-12-04 06:46:45 30 4
gpt4 key购买 nike

我的芯片中有一个小块的 UVM 测试台。其中有一个带有驱动程序的代理,该驱动程序在虚拟接口(interface)上驱动数据,如下所示:

interface my_if (input bit clk);

logic [3:0] opcode;

// Clocking block for the driver
clocking drvClk @(posedge clk);
output opcode;
endclocking

// Clocking block for the monitor
clocking monClk @(posedge clk);
input opcode;
endclocking

endinterface

我在我的驱动程序中这样使用这个接口(interface):

class my_driver extends uvm_driver #(my_tr);
my_if vif;
...
virtual task run_phase(uvm_phase phase);
super.run_phase(phase);

forever begin
seq_item_port.get_next_item(req);

// Drive the transaction onto the interface
// and wait for next clock
vif.opcode <= req.opcode;
@(vif.drvClk);

seq_item_port.item_done();
end
endtask
endclass

据我所知,这是推荐的做事方式,而且效果很好。当我将此代理集成到更高级别的测试平台时,就会出现问题。在这种情况下,代理现在是被动的,并且驱动程序未构建。我将操作码值分配给接口(interface),以便监视器可以观察它。这是我的顶级线束的片段:

module my_top();
bit clk = 0;

always #5 clk = !clk;

// instantiate the interface
my_if my_if_inst(.clk(clk));

// instantiate my dut
my_dut dut(...);

// pull out the internal opcode signal and assign it
// to the interface
assign my_if_inst.opcode = dut.submodule.opcode;

// Set the virtual interface inside the agent
initial begin
uvm_config_db#(virtual my_if)::set(uvm_root::get(),"uvm_test_top.tb.env.my_agent", "vif", my_if_inst);
end
endmodule

当我在 NC 中运行它时,我收到一条警告:

ncelab: *W,ICPAVW: Illegal combination of driver and procedural assignment to variable opcode detected (output clockvar found in clocking block)

这是有道理的,因为接口(interface)将此信号定义为 drvClk block 的输出,而我正在顶层进行分配。我可以忽略这个警告(代码工作得很好),但我宁愿以它运行干净的方式对其进行编码。推荐的方法是什么?我摆脱了驱动程序的时钟模块,这很有效,但我认为如果我这样做,我会为比赛条件做好准备。

最佳答案

简单;在您的界面中使操作码成为 wire

像对待双向信号一样对待操作码。见我的DVCon paper关于这个问题。

关于system-verilog - UVM:驱动程序和程序分配的非法组合警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19249860/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com